mdk-1.2.9/0000755000175000017500000000000012636571406007311 500000000000000mdk-1.2.9/m4/0000755000175000017500000000000012636571404007627 500000000000000mdk-1.2.9/m4/lib-ld.m40000644000175000017500000000675612110326462011157 00000000000000# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) mdk-1.2.9/m4/glibc21.m40000644000175000017500000000172712110326462011230 00000000000000# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([jm_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) mdk-1.2.9/m4/longlong.m40000644000175000017500000000164312110326462011621 00000000000000# longlong.m4 serial 4 dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_LONG_LONG if 'long long' works. AC_DEFUN([jm_AC_TYPE_LONG_LONG], [ AC_CACHE_CHECK([for long long], ac_cv_type_long_long, [AC_TRY_LINK([long long ll = 1LL; int i = 63;], [long long llmax = (long long) -1; return ll << i | ll >> i | llmax / ll | llmax % ll;], ac_cv_type_long_long=yes, ac_cv_type_long_long=no)]) if test $ac_cv_type_long_long = yes; then AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have the 'long long' type.]) fi ]) mdk-1.2.9/m4/ulonglong.m40000644000175000017500000000204212110326462012000 00000000000000# ulonglong.m4 serial 3 dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works. AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG], [ AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long, [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;], [unsigned long long ullmax = (unsigned long long) -1; return ull << i | ull >> i | ullmax / ull | ullmax % ull;], ac_cv_type_unsigned_long_long=yes, ac_cv_type_unsigned_long_long=no)]) if test $ac_cv_type_unsigned_long_long = yes; then AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1, [Define if you have the 'unsigned long long' type.]) fi ]) mdk-1.2.9/m4/xsize.m40000644000175000017500000000103112110326462011133 00000000000000# xsize.m4 serial 2 dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. AC_DEFUN([gl_XSIZE], [ dnl Prerequisites of lib/xsize.h. AC_REQUIRE([gl_SIZE_MAX]) AC_CHECK_HEADERS(stdint.h) ]) mdk-1.2.9/m4/inttypes.m40000644000175000017500000000171712110326462011663 00000000000000# inttypes.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H if exists and doesn't clash with # . AC_DEFUN([gt_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h, [ AC_TRY_COMPILE( [#include #include ], [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no) ]) if test $gt_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1, [Define if exists and doesn't clash with .]) fi ]) mdk-1.2.9/m4/codeset.m40000644000175000017500000000157612110326462011435 00000000000000# codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) mdk-1.2.9/m4/signed.m40000644000175000017500000000140112110326462011243 00000000000000# signed.m4 serial 1 (gettext-0.10.40) dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([bh_C_SIGNED], [ AC_CACHE_CHECK([for signed], bh_cv_c_signed, [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) if test $bh_cv_c_signed = no; then AC_DEFINE(signed, , [Define to empty if the C compiler doesn't support this keyword.]) fi ]) mdk-1.2.9/m4/lib-link.m40000644000175000017500000005534312110326462011511 00000000000000# lib-link.m4 serial 4 (gettext-0.12) dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) mdk-1.2.9/m4/wint_t.m40000644000175000017500000000153112110326462011302 00000000000000# wint_t.m4 serial 1 (gettext-0.12) dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether has the 'wint_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WINT_T], [ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, [AC_TRY_COMPILE([#include wint_t foo = (wchar_t)'\0';], , gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) if test $gt_cv_c_wint_t = yes; then AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) fi ]) mdk-1.2.9/m4/nls.m40000644000175000017500000000350512110326462010575 00000000000000# nls.m4 serial 1 (gettext-0.12) dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate it. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then case "$ac_aux_dir" in /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; esac fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) mdk-1.2.9/m4/inttypes-pri.m40000644000175000017500000000222712110326462012450 00000000000000# inttypes-pri.m4 serial 1 (gettext-0.11.4) dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. # Define PRI_MACROS_BROKEN if exists and defines the PRI* # macros to non-string values. This is the case on AIX 4.3.3. AC_DEFUN([gt_INTTYPES_PRI], [ AC_REQUIRE([gt_HEADER_INTTYPES_H]) if test $gt_cv_header_inttypes_h = yes; then AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], gt_cv_inttypes_pri_broken, [ AC_TRY_COMPILE([#include #ifdef PRId32 char *p = PRId32; #endif ], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) ]) fi if test "$gt_cv_inttypes_pri_broken" = yes; then AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, [Define if exists and defines unusable PRI* macros.]) fi ]) mdk-1.2.9/m4/lcmessage.m40000644000175000017500000000261612110326462011746 00000000000000# lcmessage.m4 serial 3 (gettext-0.11.3) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([AM_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) mdk-1.2.9/m4/intmax.m40000644000175000017500000000217212110326462011300 00000000000000# intmax.m4 serial 1 (gettext-0.12) dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether the system has the 'intmax_t' type, but don't attempt to dnl find a replacement if it is lacking. AC_DEFUN([gt_TYPE_INTMAX_T], [ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, [AC_TRY_COMPILE([ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif ], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) if test $gt_cv_c_intmax_t = yes; then AC_DEFINE(HAVE_INTMAX_T, 1, [Define if you have the 'intmax_t' type in or .]) fi ]) mdk-1.2.9/m4/stdint_h.m40000644000175000017500000000205312110326462011612 00000000000000# stdint_h.m4 serial 3 (gettext-0.12) dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_STDINT_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_STDINT_H], [ AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_stdint_h=yes, jm_ac_cv_header_stdint_h=no)]) if test $jm_ac_cv_header_stdint_h = yes; then AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) mdk-1.2.9/m4/inttypes_h.m40000644000175000017500000000210312110326462012160 00000000000000# inttypes_h.m4 serial 5 (gettext-0.12) dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. # Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, # doesn't clash with , and declares uintmax_t. AC_DEFUN([jm_AC_HEADER_INTTYPES_H], [ AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, [AC_TRY_COMPILE( [#include #include ], [uintmax_t i = (uintmax_t) -1;], jm_ac_cv_header_inttypes_h=yes, jm_ac_cv_header_inttypes_h=no)]) if test $jm_ac_cv_header_inttypes_h = yes; then AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, [Define if exists, doesn't clash with , and declares uintmax_t. ]) fi ]) mdk-1.2.9/m4/iconv.m40000644000175000017500000000665312110326462011126 00000000000000# iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) mdk-1.2.9/m4/wchar_t.m40000644000175000017500000000155312110326462011431 00000000000000# wchar_t.m4 serial 1 (gettext-0.12) dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether has the 'wchar_t' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_WCHAR_T], [ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, [AC_TRY_COMPILE([#include wchar_t foo = (wchar_t)'\0';], , gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) if test $gt_cv_c_wchar_t = yes; then AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) fi ]) mdk-1.2.9/m4/intdiv0.m40000644000175000017500000000356512110326462011364 00000000000000# intdiv0.m4 serial 1 (gettext-0.11.3) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ AC_TRY_RUN([ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, [ # Guess based on the CPU. case "$host_cpu" in alpha* | i[34567]86 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac ]) ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, [Define if integer division by zero raises signal SIGFPE.]) ]) mdk-1.2.9/m4/isc-posix.m40000644000175000017500000000213312110326462011713 00000000000000# isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) mdk-1.2.9/m4/progtest.m40000644000175000017500000000563412110326462011655 00000000000000# progtest.m4 serial 3 (gettext-0.12) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) mdk-1.2.9/m4/gettext.m40000644000175000017500000004513012110326462011465 00000000000000# gettext.m4 serial 28 (gettext-0.13) dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define(gt_included_intl, ifelse([$1], [external], [no], [yes])) define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Set USE_NLS. AM_NLS ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], gt_cv_func_gnugettext_libintl, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext_libintl=yes ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([bh_C_SIGNED])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([jm_AC_TYPE_LONG_LONG])dnl AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl AC_REQUIRE([gt_TYPE_WCHAR_T])dnl AC_REQUIRE([gt_TYPE_WINT_T])dnl AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) AC_REQUIRE([gt_TYPE_INTMAX_T]) AC_REQUIRE([gt_PRINTF_POSIX]) AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([jm_GLIBC21])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_REQUIRE([gl_XSIZE])dnl AC_CHECK_TYPE([ptrdiff_t], , [AC_DEFINE([ptrdiff_t], [long], [Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) ]) AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \ mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ __fsetlocking]) dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl is defined as a weak alias of snprintf; we prefer to use the latter). gt_CHECK_DECL(_snprintf, [#include ]) gt_CHECK_DECL(_snwprintf, [#include ]) dnl Use the *_unlocked functions only if they are declared. dnl (because some of them were defined without being declared in Solaris dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl on Solaris 2.5.1 to run on Solaris 2.6). dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. gt_CHECK_DECL(feof_unlocked, [#include ]) gt_CHECK_DECL(fgets_unlocked, [#include ]) gt_CHECK_DECL(getc_unlocked, [#include ]) case $gt_cv_func_printf_posix in *yes) HAVE_POSIX_PRINTF=1 ;; *) HAVE_POSIX_PRINTF=0 ;; esac AC_SUBST([HAVE_POSIX_PRINTF]) if test "$ac_cv_func_asprintf" = yes; then HAVE_ASPRINTF=1 else HAVE_ASPRINTF=0 fi AC_SUBST([HAVE_ASPRINTF]) if test "$ac_cv_func_snprintf" = yes; then HAVE_SNPRINTF=1 else HAVE_SNPRINTF=0 fi AC_SUBST([HAVE_SNPRINTF]) if test "$ac_cv_func_wprintf" = yes; then HAVE_WPRINTF=1 else HAVE_WPRINTF=0 fi AC_SUBST([HAVE_WPRINTF]) AM_ICONV AM_LANGINFO_CODESET if test $ac_cv_header_locale_h = yes; then AM_LC_MESSAGES fi dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) dnl gt_CHECK_DECL(FUNC, INCLUDES) dnl Check whether a function is declared. AC_DEFUN([gt_CHECK_DECL], [ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, [AC_TRY_COMPILE([$2], [ #ifndef $1 char *p = (char *) $1; #endif ], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) if test $ac_cv_have_decl_$1 = yes; then gt_value=1 else gt_value=0 fi AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) mdk-1.2.9/m4/printf-posix.m40000644000175000017500000000310612110326462012440 00000000000000# printf-posix.m4 serial 2 (gettext-0.13.1) dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl Test whether the printf() function supports POSIX/XSI format strings with dnl positions. AC_DEFUN([gt_PRINTF_POSIX], [ AC_REQUIRE([AC_PROG_CC]) AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings], gt_cv_func_printf_posix, [ AC_TRY_RUN([ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); }], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, [ AC_EGREP_CPP(notposix, [ #if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ notposix #endif ], gt_cv_func_printf_posix="guessing no", gt_cv_func_printf_posix="guessing yes") ]) ]) case $gt_cv_func_printf_posix in *yes) AC_DEFINE(HAVE_POSIX_PRINTF, 1, [Define if your printf() function supports format strings with positions.]) ;; esac ]) mdk-1.2.9/m4/size_max.m40000644000175000017500000000407212110326462011620 00000000000000# size_max.m4 serial 2 dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([gl_SIZE_MAX], [ AC_CHECK_HEADERS(stdint.h) dnl First test whether the system already has SIZE_MAX. AC_MSG_CHECKING([for SIZE_MAX]) result= AC_EGREP_CPP([Found it], [ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif ], result=yes) if test -z "$result"; then dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl than the type 'unsigned long'. dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr', dnl which is guaranteed to work from LONG_MIN to LONG_MAX. _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi, [#include ], result=?) _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo, [#include ], result=?) _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, [#include ], result=?) if test "$fits_in_uint" = 1; then dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'. AC_TRY_COMPILE([#include extern size_t foo; extern unsigned long foo; ], [], fits_in_uint=0) fi if test -z "$result"; then if test "$fits_in_uint" = 1; then result="$res_hi$res_lo"U else result="$res_hi$res_lo"UL fi else dnl Shouldn't happen, but who knows... result='~(size_t)0' fi fi AC_MSG_RESULT([$result]) if test "$result" != yes; then AC_DEFINE_UNQUOTED([SIZE_MAX], [$result], [Define as the maximum value of type 'size_t', if the system doesn't define it.]) fi ]) mdk-1.2.9/m4/lib-prefix.m40000644000175000017500000001250712110326462012044 00000000000000# lib-prefix.m4 serial 3 (gettext-0.13) dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/lib"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) mdk-1.2.9/m4/po.m40000644000175000017500000004265212110326462010425 00000000000000# po.m4 serial 3 (gettext-0.14) dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AM_NLS])dnl dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <= sizeof(double)) - 1]; ], , gt_cv_c_long_double=yes, gt_cv_c_long_double=no) fi]) if test $gt_cv_c_long_double = yes; then AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) fi ]) mdk-1.2.9/m4/uintmax_t.m40000644000175000017500000000235012110326462012006 00000000000000# uintmax_t.m4 serial 7 (gettext-0.12) dnl Copyright (C) 1997-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Paul Eggert. AC_PREREQ(2.13) # Define uintmax_t to 'unsigned long' or 'unsigned long long' # if it is not already defined in or . AC_DEFUN([jm_AC_TYPE_UINTMAX_T], [ AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) AC_REQUIRE([jm_AC_HEADER_STDINT_H]) if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG]) test $ac_cv_type_unsigned_long_long = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, [Define to unsigned long or unsigned long long if and don't define.]) else AC_DEFINE(HAVE_UINTMAX_T, 1, [Define if you have the 'uintmax_t' type in or .]) fi ]) mdk-1.2.9/depcomp0000755000175000017500000005601612563613157010615 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mdk-1.2.9/README0000644000175000017500000000271612112755472010113 00000000000000Welcome to GNU MDK. GNU MDK is part of the GNU project [0]. MDK stands for MIX Development Kit, and provides tools for developing and executing, in a MIX virtual machine, MIXAL programs. The MIX is Donald Knuth's mythical computer, described in the first volume of The Art of Computer Programming, which is programmed using MIXAL, the MIX assembly language. MDK includes a MIXAL assembler (mixasm) and a MIX virtual machine (mixvm) with a command line interface. In addition, a GTK+ GUI to mixvm, called gmixvm, is provided; and, in case you are an Emacs guy, you can try misc/mixvm.el, which allows running mixvm inside an Emacs GUD buffer. Using these interfaces, you can debug your MIXAL programs at source code level, and read/modify the contents of all the components of the MIX computer (including block devices, which are simulated using the file system). Project homepage: http://www.gnu.org/software/mdk/mdk.html GNU MDK is free software. Please see the file COPYING for details. For documentation, please see the files in the doc subdirectory. For building and installation instructions please see the INSTALL file. For sample MIXAL programs, please see the samples subdirectory. For translations (MDK uses GNU's gettext), please see the po subdirectory[1]. -- [0] To learn more about GNU, the FSF and its goals, please visit http://www.gnu.org. [1] New translations are welcome. If you'd like to contribute one, please contact the author, jao@gnu.org. mdk-1.2.9/mkinstalldirs0000755000175000017500000000370412110326462012026 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here mdk-1.2.9/test-driver0000755000175000017500000001104012563613157011422 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mdk-1.2.9/misc/0000755000175000017500000000000012636571405010243 500000000000000mdk-1.2.9/misc/mixal-mode.el0000644000175000017500000013114512622454575012551 00000000000000;;; mixal-mode.el --- Major mode for the mix asm language. ;; Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3 of ;; the License, or (at your option) any later version. ;; This program is distributed in the hope that it will be ;; useful, but WITHOUT ANY WARRANTY; without even the implied ;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ;; PURPOSE. See the GNU General Public License for more details. ;; You should have received a copy of the GNU General Public ;; License along with this program; if not, write to the Free ;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ;; MA 02110-1301 USA ;; Author: Pieter E.J. Pareit ;; Maintainer: Pieter E.J. Pareit ;; Created: 09 Nov 2002 ;; Version: 0.1 ;; Keywords: Knuth mix mixal asm mixvm "The Art Of Computer Programming" ;;; Commentary: ;; Major mode for the mix asm language. ;; The mix asm language is described in "The Art Of Computer Programming". ;; ;; For optimal use, also use GNU MDK. Compiling needs mixasm, running ;; and debugging needs mixvm and mixvm.el from GNU MDK. You can get ;; GNU MDK from `https://savannah.gnu.org/projects/mdk/' and ;; `ftp://ftp.gnu.org/pub/gnu/mdk'. ;; ;; To use this mode, place the following in your .emacs file: ;; `(load-file "/PATH-TO-FILE/mixal-mode.el")'. ;; When you load a file with the extension .mixal the mode will be started ;; automatic. If you want to start the mode manual, use `M-x mixal-mode'. ;; Font locking will work, the behavior of tabs is the same as emacs ;; default behavior. You can compile a source file with `C-c c' you can ;; run a compiled file with `C-c r' or run it in debug mode with `C-c d'. ;; You can get more information about a particular operation code by using ;; mixal-describe-operation-code or `C-h o'. ;; ;; Have fun. ;;; History: ;; Version 0.3: ;; 08/10/05: sync mdk and emacs cvs ;; from emacs: compile-command and require-final-newline ;; from mdk: see version 0.2 ;; correct my email address ;; Version 0.2: ;; 06/04/05: mixasm no longer needs -g option ;; fontlocking of comments works in all? cases now ;; added some more mixal-operation-codes ;; Version 0.1: ;; Version 0.1.1: ;; 22/11/02: bugfix in fontlocking, needed to add a '-' to the regex. ;; 19/11/02: completed implementing mixal-describe-operation-code. ;; 13/11/02: implemented compile, mixal-run and mixal-debug. ;; 10/11/02: implemented font-locking and syntax table. ;; 09/11/02: started mixal-mode. ;;; Code: (defvar compile-command) ;;; Key map (defvar mixal-mode-map (let ((map (make-sparse-keymap))) (define-key map "\C-cc" 'compile) (define-key map "\C-cr" 'mixal-run) (define-key map "\C-cd" 'mixal-debug) (define-key map "\C-ho" 'mixal-describe-operation-code) map) "Keymap for `mixal-mode'.") ; (makunbound 'mixal-mode-map) ;;; Syntax table (defvar mixal-mode-syntax-table (let ((st (make-syntax-table))) ; (modify-syntax-entry ?* "<" st) we need to do a bit more to make ; (modify-syntax-entry ?\n ">" st) fontlocking for comments work st) "Syntax table for `dot-mode'.") (defvar mixal-font-lock-label-face 'font-lock-variable-name-face "Face name to use for label names. Default value is that of `font-lock-variable-name-face', but you can modify its value.") (defvar mixal-font-lock-operation-code-face 'font-lock-keyword-face "Face name to use for operation code names. Default value is that of `font-lock-keyword-face', but you can modify its value.") (defvar mixal-font-lock-assembly-pseudoinstruction-face 'font-lock-builtin-face "Face name to use for assembly pseudoinstruction names. Default value is that of `font-lock-builtin-face', but you can modify its value.") (defvar mixal-operation-codes '("NOP" "ADD" "FADD" "SUB" "FSUB" "MUL" "FMUL" "DIV" "FDIV" "NUM" "CHAR" "HLT" "SLA" "SRA" "SLAX" "SRAX" "SLC" "SRC" "SLB" "SRB" "MOVE" "LDA" "LD1" "LD2" "LD3" "LD4" "LD5" "LD6" "LDX" "LDAN" "LD1N" "LD2N" "LD3N" "LD4N" "LD5N" "LD6N" "LDXN" "STA" "ST1" "ST2" "ST3" "ST4" "ST5" "ST6" "STX" "STJ" "STZ" "JBUS" "IOC" "IN" "OUT" "JRAD" "JMP" "JSJ" "JOV" "JNOV" "JL" "JE" "JG" "JGE" "JNE" "JLE" "JAN" "J1N" "J2N" "J3N" "J4N" "J5N" "J6N" "JXN" "JAZ" "J1Z" "J2Z" "J3Z" "J4Z" "J5Z" "J6Z" "JXZ" "JAP" "J1P" "J2P" "J3P" "J4P" "J5P" "J6P" "JXP" "JANN" "J1NN" "J2NN" "J3NN" "J4NN" "J5NN" "J6NN" "JXNN" "JANZ" "J1NZ" "J2NZ" "J3NZ" "J4NZ" "J5NZ" "J6NZ" "JXNZ" "JANP" "J1NP" "J2NP" "J3NP" "J4NP" "J5NP" "J6NP" "JXNP" "JAE" "JXE" "JAO" "JXO" "INCA" "DECA" "ENTA" "ENNA" "INC1" "DEC1" "ENT1" "ENN1" "INC2" "DEC2" "ENT2" "ENN2" "INC3" "DEC3" "ENT3" "ENN3" "INC4" "DEC4" "ENT4" "ENN4" "INC5" "DEC5" "ENT5" "ENN5" "INC6" "DEC6" "ENT6" "ENN6" "INCX" "DECX" "ENTX" "ENNX" "CMPA" "FCMP" "CMP1" "CMP2" "CMP3" "CMP4" "CMP5" "CMP6" "CMPX") "List of possible operation codes as strings.") ; (makunbound 'mixal-operation-codes) (defvar mixal-assembly-pseudoinstructions '("ORIG" "EQU" "CON" "ALF" "END") "List of possible assembly pseudoinstructions") ;;; Font-locking: (defvar mixal-font-lock-keywords `(("^\\([A-Z0-9a-z]+\\).*$" (1 mixal-font-lock-label-face)) (,(regexp-opt mixal-operation-codes 'words) . mixal-font-lock-operation-code-face) (,(regexp-opt mixal-assembly-pseudoinstructions 'words) . mixal-font-lock-assembly-pseudoinstruction-face) ("^[A-Z0-9a-z]*[ \t]+[A-ZO-9a-z]+[ \t]+\\(=.*=\\).*$" (1 font-lock-constant-face)) ("^[A-Z0-9a-z]*[ \t]+[A-Z0-9a-z]+[ \t]+[A-Z0-9a-z,():+-\\*=\" ]*[\t]+\\(.*\\)$" (1 font-lock-comment-face)) ("^\\*.*$" . font-lock-comment-face)) "Keyword highlighting specification for `mixal-mode'.") ; (makunbound 'mixal-font-lock-keywords) ;;;; Compilation ;; Output from mixasm is compatible with default behavior of emacs, ;; I just added a key (C-cc) and modified the make-command. ;;;; Indentation ;; Tabs works well by default. ;;;; Describe (defvar mixal-operation-codes-alist '() "Alist that contains all the possible operation codes for mix. Each elt has the form (OP-CODE GROUP FULL-NAME C-BYTE F-BYTE DESCRIPTION EXECUTION-TIME) Where OP-CODE is the text of the opcode as an symbol, FULL-NAME is the human readable name as a string, C-BYTE is the operation code telling what operation is to be performed, F-BYTE holds an modification of the operation code which can be a symbol or a number, DESCRIPTION contains an string with a description about the operation code and EXECUTION-TIME holds info about the time it takes, number or string.") ; (makunbound 'mixal-operation-codes-alist) (defun mixal-add-operation-code (op-code group full-name C-byte F-byte description execution-time) "Add an operation code to the list that contains information about possible op code's." (setq mixal-operation-codes-alist (cons (list op-code group full-name C-byte F-byte description execution-time) mixal-operation-codes-alist ))) ;; now add each operation code (mixal-add-operation-code 'LDA 'loading "load A" 8 'field "Put in rA the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word." 2) (mixal-add-operation-code 'LDX 'loading "load X" 15 'field "Put in rX the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word." 2) (mixal-add-operation-code 'LD1 'loading "load I1" (+ 8 1) 'field "Put in rI1 the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD2 'loading "load I2" (+ 8 2) 'field "Put in rI2 the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD3 'loading "load I3" (+ 8 3) 'field "Put in rI3 the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD4 'loading "load I4" (+ 8 4) 'field "Put in rI4 the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD5 'loading "load I5" (+ 8 5) 'field "Put in rI5 the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD6 'loading "load I6" (+ 8 6) 'field "Put in rI6 the contents of cell no. M. Uses a + when there is no sign in subfield. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LDAN 'loading "load A negative" 16 'field "Put in rA the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word." 2) (mixal-add-operation-code 'LDXN 'loading "load X negative" 23 'field "Put in rX the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word." 2) (mixal-add-operation-code 'LD1N 'loading "load I1 negative" (+ 16 1) 'field "Put in rI1 the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD2N 'loading "load I2 negative" (+ 16 2) 'field "Put in rI2 the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD3N 'loading "load I3 negative" (+ 16 3) 'field "Put in rI3 the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD4N 'loading "load I4 negative" (+ 16 4) 'field "Put in rI4 the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD5N 'loading "load I5 negative" (+ 16 5) 'field "Put in rI5 the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'LD6N 'loading "load I6 negative" (+ 16 6) 'field "Put in rI6 the contents of cell no. M, with opposite sign. Uses a + when there is no sign in subfield, otherwise use the opposite sign. Subfield is left padded with zeros to make a word. Index registers only have 2 bytes and a sign, Trying to set anything more that that will result in undefined behavior." 2) (mixal-add-operation-code 'STA 'storing "store A" 24 'field "Store in cell Nr. M the contents of rA. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield." 2) (mixal-add-operation-code 'STX 'storing "store X" 31 'field "Store in cell Nr. M the contents of rX. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield." 2) (mixal-add-operation-code 'ST1 'storing "store I1" (+ 24 1) 'field "Store in cell Nr. M the contents of rI1. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield. Because index registers only have 2 bytes and a sign, the rest of the bytes are assumed to be 0." 2) (mixal-add-operation-code 'ST2 'storing "store I2" (+ 24 2) 'field "Store in cell Nr. M the contents of rI2. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield. Because index registers only have 2 bytes and a sign, the rest of the bytes are assumed to be 0." 2) (mixal-add-operation-code 'ST3 'storing "store I3" (+ 24 3) 'field "Store in cell Nr. M the contents of rI3. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield. Because index registers only have 2 bytes and a sign, the rest of the bytes are assumed to be 0." 2) (mixal-add-operation-code 'ST4 'storing "store I4" (+ 24 4) 'field "Store in cell Nr. M the contents of rI4. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield. Because index registers only have 2 bytes and a sign, the rest of the bytes are assumed to be 0." 2) (mixal-add-operation-code 'ST5 'storing "store I5" (+ 24 5) 'field "Store in cell Nr. M the contents of rI5. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield. Because index registers only have 2 bytes and a sign, the rest of the bytes are assumed to be 0." 2) (mixal-add-operation-code 'ST6 'storing "store I6" (+ 24 6) 'field "Store in cell Nr. M the contents of rI6. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of the memory cell is not changed, unless it is part of the subfield. Because index registers only have 2 bytes and a sign, the rest of the bytes are assumed to be 0." 2) (mixal-add-operation-code 'STJ 'storing "store J" 32 'field "Store in cell Nr. M the contents of rJ. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. The sign of rJ is always +, sign of the memory cell is not changed, unless it is part of the subfield. The default field for STJ is (0:2)." 2) (mixal-add-operation-code 'STZ 'storing "store zero" 33 'field "Store in cell Nr. M '+ 0'. The modification of the operation code represents the subfield of the memory cell that is to be overwritten with zeros." 2) (mixal-add-operation-code 'ADD 'arithmetic "add" 1 'field "Add to A the contents of cell Nr. M. Subfield is padded with zero to make a word. If the result is to large, the operation result modulo 1,073,741,823 (the maximum value storable in a MIX word) is stored in `rA', and the overflow toggle is set to TRUE." 2) (mixal-add-operation-code 'SUB 'arithmetic "subtract" 2 'field "Subtract to A the contents of cell Nr. M. Subfield is padded with zero to make a word. If the result is to large, the operation result modulo 1,073,741,823 (the maximum value storable in a MIX word) is stored in `rA', and the overflow toggle is set to TRUE." 2) (mixal-add-operation-code 'MUL 'arithmetic "multiply" 3 'field "Multiplies the contents of cell Nr. M with A, result is 10 bytes and stored in rA and rX. The sign is + if the sign of rA and cell M where the same, otherwise, it is -" 10) (mixal-add-operation-code 'DIV 'arithmetic "divide" 4 'field "Both rA and rX are taken together and divided by cell Nr. M, quotient is placed in rA, remainder in rX. The sign is taken from rA, and after the divide the sign of rA is set to + when both the sign of rA and M where the same. Divide by zero and overflow of rA result in undefined behavior." 12) (mixal-add-operation-code 'ENTA 'address-transfer "enter A" 48 2 "Literal value is stored in rA. Indexed, stores value of index in rA." 1) (mixal-add-operation-code 'ENTX 'address-transfer "enter X" 55 2 "Literal value is stored in rX. Indexed, stores value of index in rX." 1) (mixal-add-operation-code 'ENT1 'address-transfer "Enter rI1" (+ 48 1) 2 "Literal value is stored in rI1. Indexed, stores value of index in rI1." 1) (mixal-add-operation-code 'ENT2 'address-transfer "Enter rI2" (+ 48 2) 2 "Literal value is stored in rI2. Indexed, stores value of index in rI2." 1) (mixal-add-operation-code 'ENT3 'address-transfer "Enter rI3" (+ 48 3) 2 "Literal value is stored in rI3. Indexed, stores value of index in rI3." 1) (mixal-add-operation-code 'ENT4 'address-transfer "Enter rI4" (+ 48 4) 2 "Literal value is stored in rI4. Indexed, stores value of index in rI4." 1) (mixal-add-operation-code 'ENT5 'address-transfer "Enter rI5" (+ 48 5) 2 "Literal value is stored in rI5. Indexed, stores value of index in rI5." 1) (mixal-add-operation-code 'ENT6 'address-transfer "Enter rI6" (+ 48 6) 2 "Literal value is stored in rI6. Indexed, stores value of index in rI6." 1) (mixal-add-operation-code 'ENNA 'address-transfer "enter negative A" 48 3 "Literal value is stored in rA with opposite sign. Indexed, stores value of index in rA with opposite sign." 1) (mixal-add-operation-code 'ENNX 'address-transfer "enter negative X" 55 3 "Literal value is stored in rX with opposite sign. Indexed, stores value of index in rX with opposite sign." 1) (mixal-add-operation-code 'ENN1 'address-transfer "Enter negative rI1" (+ 48 1) 3 "Literal value is stored in rI1 with opposite sign. Indexed, stores value of index in rI1 with opposite sign." 1) (mixal-add-operation-code 'ENN2 'address-transfer "Enter negative rI2" (+ 48 2) 3 "Literal value is stored in rI2 with opposite sign. Indexed, stores value of index in rI2 with opposite sign." 1) (mixal-add-operation-code 'ENN3 'address-transfer "Enter negative rI3" (+ 48 3) 3 "Literal value is stored in rI3 with opposite sign. Indexed, stores value of index in rI3 with opposite sign." 1) (mixal-add-operation-code 'ENN4 'address-transfer "Enter negative rI4" (+ 48 4) 3 "Literal value is stored in rI4 with opposite sign. Indexed, stores value of index in rI4 with opposite sign." 1) (mixal-add-operation-code 'ENN5 'address-transfer "Enter negative rI5" (+ 48 5) 3 "Literal value is stored in rI5 with opposite sign. Indexed, stores value of index in rI5 with opposite sign." 1) (mixal-add-operation-code 'ENN6 'address-transfer "Enter negative rI6" (+ 48 6) 3 "Literal value is stored in rI6 with opposite sign. Indexed, stores value of index in rI6 with opposite sign." 1) (mixal-add-operation-code 'INCA 'address-transfer "increase A" 48 0 "Increase register A with the literal value of M. On overflow the overflow toggle is set." 1) (mixal-add-operation-code 'INCX 'address-transfer "increase X" 55 0 "Increase register X with the literal value of M. On overflow the overflow toggle is set." 1) (mixal-add-operation-code 'INC1 'address-transfer "increase I1" (+ 48 1) 0 "Increase register I1 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'INC2 'address-transfer "increase I2" (+ 48 2) 0 "Increase register I2 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'INC3 'address-transfer "increase I3" (+ 48 3) 0 "Increase register I3 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'INC4 'address-transfer "increase I4" (+ 48 4) 0 "Increase register I4 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'INC5 'address-transfer "increase I5" (+ 48 5) 0 "Increase register I5 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'INC6 'address-transfer "increase I6" (+ 48 6) 0 "Increase register I6 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'DECA 'address-transfer "decrease A" 48 1 "Decrease register A with the literal value of M. On overflow the overflow toggle is set." 1) (mixal-add-operation-code 'DECX 'address-transfer "decrease X" 55 1 "Decrease register X with the literal value of M. On overflow the overflow toggle is set." 1) (mixal-add-operation-code 'DEC1 'address-transfer "decrease I1" (+ 48 1) 1 "Decrease register I1 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'DEC2 'address-transfer "decrease I2" (+ 48 2) 1 "Decrease register I2 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'DEC3 'address-transfer "decrease I3" (+ 48 3) 1 "Decrease register I3 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'DEC4 'address-transfer "decrease I4" (+ 48 4) 1 "Decrease register I4 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'DEC5 'address-transfer "decrease I5" (+ 48 5) 1 "Decrease register I5 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'DEC6 'address-transfer "decrease I6" (+ 48 6) 1 "Decrease register I6 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (mixal-add-operation-code 'CMPA 'comparison "compare A" 56 'field "Compare contents of A with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome." 2) (mixal-add-operation-code 'CMPX 'comparison "compare X" 63 'field "Compare contents of rX with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome." 2) (mixal-add-operation-code 'CMP1 'comparison "compare I1" (+ 56 1) 'field "Compare contents of rI1 with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3 have a value of 0." 2) (mixal-add-operation-code 'CMP2 'comparison "compare I2" (+ 56 2) 'field "Compare contents of rI2 with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3 have a value of 0." 2) (mixal-add-operation-code 'CMP3 'comparison "compare I3" (+ 56 3) 'field "Compare contents of rI3 with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3 have a value of 0." 2) (mixal-add-operation-code 'CMP4 'comparison "compare I4" (+ 56 4) 'field "Compare contents of rI4 with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3 have a value of 0." 2) (mixal-add-operation-code 'CMP5 'comparison "compare I5" (+ 56 5) 'field "Compare contents of rI5 with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3 have a value of 0." 2) (mixal-add-operation-code 'CMP6 'comparison "compare I6" (+ 56 6) 'field "Compare contents of rI6 with contents of M. The field specifier works on both fields. The comparison indicator is set to LESS, EQUAL or GREATER depending on the outcome. Bit 1,2 and 3 have a value of 0." 2) (mixal-add-operation-code 'JMP 'jump "jump" 39 0 "Unconditional jump. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JSJ 'jump "jump, save J" 39 1 "Unconditional jump, but rJ is not modified." 1) (mixal-add-operation-code 'JOV 'jump "jump on overflow" 39 2 "Jump if OV is set (and turn it off). Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JNOV 'jump "Jump on no overflow" 39 3 "Jump if OV is not set (and turn it off). Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JL 'jump "Jump on less" 39 4 "Jump if '[CM] = L'. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JE 'jump "Jump on equal" 39 5 "Jump if '[CM] = E'. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JG 'jump "Jump on greater" 39 6 "Jump if '[CM] = G'. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JGE 'jump "Jump on not less" 39 7 "Jump if '[CM]' does not equal 'L'. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JNE 'jump "Jump on not equal" 39 8 "Jump if '[CM]' does not equal 'E'. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JLE 'jump "Jump on not greater" 39 9 "Jump if '[CM]' does not equal 'G'. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JAN 'jump "jump A negative" 40 0 "Jump if the content of rA is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JAZ 'jump "jump A zero" 40 1 "Jump if the content of rA is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JAP 'jump "jump A positive" 40 2 "Jump if the content of rA is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JANN 'jump "jump A non-negative" 40 3 "Jump if the content of rA is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JANZ 'jump "jump A non-zero" 40 4 "Jump if the content of rA is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JANP 'jump "jump A non-positive" 40 5 "Jump if the content of rA is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JAE 'jump "jump A even" 40 6 "Jump if the content of rA is even. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JAO 'jump "jump A odd" 40 7 "Jump if the content of rA is odd. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXN 'jump "jump X negative" 47 0 "Jump if the content of rX is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXZ 'jump "jump X zero" 47 1 "Jump if the content of rX is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXP 'jump "jump X positive" 47 2 "Jump if the content of rX is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXNN 'jump "jump X non-negative" 47 3 "Jump if the content of rX is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXNZ 'jump "jump X non-zero" 47 4 "Jump if the content of rX is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXNP 'jump "jump X non-positive" 47 5 "Jump if the content of rX is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXE 'jump "jump X even" 47 6 "Jump if the content of rX is even. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'JXO 'jump "jump X odd" 47 7 "Jump if the content of rX is odd. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J1N 'jump "jump I1 negative" (+ 40 1) 0 "Jump if the content of rI1 is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J1Z 'jump "jump I1 zero" (+ 40 1) 1 "Jump if the content of rI1 is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J1P 'jump "jump I1 positive" (+ 40 1) 2 "Jump if the content of rI1 is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J1NN 'jump "jump I1 non-negative" (+ 40 1) 3 "Jump if the content of rI1 is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J1NZ 'jump "jump I1 non-zero" (+ 40 1) 4 "Jump if the content of rI1 is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J1NP 'jump "jump I1 non-positive" (+ 40 1) 5 "Jump if the content of rI1 is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J2N 'jump "jump I2 negative" (+ 40 1) 0 "Jump if the content of rI2 is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J2Z 'jump "jump I2 zero" (+ 40 1) 1 "Jump if the content of rI2 is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J2P 'jump "jump I2 positive" (+ 40 1) 2 "Jump if the content of rI2 is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J2NN 'jump "jump I2 non-negative" (+ 40 1) 3 "Jump if the content of rI2 is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J2NZ 'jump "jump I2 non-zero" (+ 40 1) 4 "Jump if the content of rI2 is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J2NP 'jump "jump I2 non-positive" (+ 40 1) 5 "Jump if the content of rI2 is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J3N 'jump "jump I3 negative" (+ 40 1) 0 "Jump if the content of rI3 is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J3Z 'jump "jump I3 zero" (+ 40 1) 1 "Jump if the content of rI3 is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J3P 'jump "jump I3 positive" (+ 40 1) 2 "Jump if the content of rI3 is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J3NN 'jump "jump I3 non-negative" (+ 40 1) 3 "Jump if the content of rI3 is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J3NZ 'jump "jump I3 non-zero" (+ 40 1) 4 "Jump if the content of rI3 is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J3NP 'jump "jump I3 non-positive" (+ 40 1) 5 "Jump if the content of rI3 is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J4N 'jump "jump I4 negative" (+ 40 1) 0 "Jump if the content of rI4 is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J4Z 'jump "jump I4 zero" (+ 40 1) 1 "Jump if the content of rI4 is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J4P 'jump "jump I4 positive" (+ 40 1) 2 "Jump if the content of rI4 is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J4NN 'jump "jump I4 non-negative" (+ 40 1) 3 "Jump if the content of rI4 is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J4NZ 'jump "jump I4 non-zero" (+ 40 1) 4 "Jump if the content of rI4 is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J4NP 'jump "jump I4 non-positive" (+ 40 1) 5 "Jump if the content of rI4 is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J5N 'jump "jump I5 negative" (+ 40 1) 0 "Jump if the content of rI5 is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J5Z 'jump "jump I5 zero" (+ 40 1) 1 "Jump if the content of rI5 is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J5P 'jump "jump I5 positive" (+ 40 1) 2 "Jump if the content of rI5 is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J5NN 'jump "jump I5 non-negative" (+ 40 1) 3 "Jump if the content of rI5 is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J5NZ 'jump "jump I5 non-zero" (+ 40 1) 4 "Jump if the content of rI5 is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J5NP 'jump "jump I5 non-positive" (+ 40 1) 5 "Jump if the content of rI5 is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J6N 'jump "jump I6 negative" (+ 40 1) 0 "Jump if the content of rI6 is negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J6Z 'jump "jump I6 zero" (+ 40 1) 1 "Jump if the content of rI6 is zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J6P 'jump "jump I6 positive" (+ 40 1) 2 "Jump if the content of rI6 is positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J6NN 'jump "jump I6 non-negative" (+ 40 1) 3 "Jump if the content of rI6 is non-negative. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J6NZ 'jump "jump I6 non-zero" (+ 40 1) 4 "Jump if the content of rI6 is non-zero. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'J6NP 'jump "jump I6 non-positive" (+ 40 1) 5 "Jump if the content of rI6 is non-positive. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (mixal-add-operation-code 'SLA 'miscellaneous "shift left A" 6 0 "Shift to A, M bytes left. Hero's will be added to the right." 2) (mixal-add-operation-code 'SRA 'miscellaneous "shift right A" 6 1 "Shift to A, M bytes right. Zeros will be added to the left." 2) (mixal-add-operation-code 'SLAX 'miscellaneous "shift left AX" 6 2 "Shift AX, M bytes left. Zeros will be added to the right." 2) (mixal-add-operation-code 'SRAX 'miscellaneous "shift right AX" 6 3 "Shift AX, M bytes right. Zeros will be added to the left." 2) (mixal-add-operation-code 'SLC 'miscellaneous "shift left AX circularly" 6 4 "Shift AX, M bytes left circularly. The bytes that fall off to the left will be added to the right." 2) (mixal-add-operation-code 'SRC 'miscellaneous "shift right AX circularly" 6 4 "Shift AX, M bytes right circularly. The bytes that fall off to the right will be added to the left." 2) (mixal-add-operation-code 'SLB 'miscellaneous "shift left AX binary" 6 6 "Shift AX, M binary places left." 2) (mixal-add-operation-code 'SRB 'miscellaneous "shift right AX binary" 6 7 "Shift AX, M binary places right." 2) (mixal-add-operation-code 'MOVE 'miscellaneous "move" 7 'number "Move MOD words from M to the location stored in rI1." '(+ 1 (* 2 number))) (mixal-add-operation-code 'NOP 'miscellaneous "no operation" 0 'ignored "No operation, M and F are not used by the machine." 1) (mixal-add-operation-code 'HLT 'miscellaneous "halt" 5 2 "Halt. Stop instruction fetching." 1) (mixal-add-operation-code 'IN 'input-output "input" 36 'unit "Transfer a block of words from the specified unit to memory. The transfer starts at address M." 1) (mixal-add-operation-code 'OUT 'input-output "output" 37 'unit "Transfer a block of words from memory. The transfer starts at address M to the specified unit." 1) (mixal-add-operation-code 'IOC 'input-output "input-output control" 35 'unit "Perform a control operation. The control operation is given by M on the specified unit." 1) (mixal-add-operation-code 'JRED 'input-output "jump ready" 38 'unit "Jump to M if the specified unit is ready." 1) (mixal-add-operation-code 'JBUS 'input-output "jump busy" 34 'unit "Jump to M if the specified unit is busy." 1) (mixal-add-operation-code 'NUM 'conversion "convert to numeric" 5 0 "Convert rAX to its numerical value and store it in rA. the register rAX is assumed to contain a character representation of a number." 10) (mixal-add-operation-code 'CHAR 'conversion "convert to characters" 5 1 "Convert the number stored in rA to a character representation. The converted character representation is stored in rAX." 10) (defvar mixal-describe-operation-code-history nil "History list for describe operation code.") (defun mixal-describe-operation-code (&optional op-code) "Display the full documentation of OP-CODE." (interactive) ;; we like to provide completition and history, so do it ourself (interactive "?bla")? (unless op-code (let* ((completion-ignore-case t) ;; we already have a list, but it is not in the right format ;; transform it to a valid table so completition can use it (table (mapcar '(lambda (elm) (cons (symbol-name (car elm)) nil)) mixal-operation-codes-alist)) ;; prompt is different depending on we are close to a valid op-code (have-default (member (current-word) mixal-operation-codes)) (prompt (concat "Describe operation code " (if have-default (concat "(default " (current-word) "): ") ": ")))) ;; as the operation code to the user (setq op-code (completing-read prompt table nil t nil 'mixal-describe-operation-code-history (current-word))))) ;; get the info on the op-code and output it to the help buffer (let ((op-code-help (assq (intern-soft op-code) mixal-operation-codes-alist))) (when op-code-help (with-output-to-temp-buffer (buffer-name (get-buffer-create "*Help*")) (princ op-code) (princ " is an mix operation code\n\n") (princ (nth 5 op-code-help)) (terpri) (terpri) (princ " group: ") (princ (nth 1 op-code-help)) (terpri) (princ " nice name: ") (princ (nth 2 op-code-help)) (terpri) (princ " OPCODE / C: ") (princ (nth 3 op-code-help)) (terpri) (princ " MOD / F: ") (princ (nth 4 op-code-help)) (terpri) (princ " time: ") (princ (nth 6 op-code-help)) (terpri))))) ;;;; Running (defun mixal-run () "Run's mixal file in current buffer, assumes that file has been compiled" (interactive) (mixvm (concat "mixvm -r -t -d " (file-name-sans-extension (buffer-file-name))))) (defun mixal-debug () "Starts mixvm for debugging, assumes that file has been compiled with debugging support" (interactive) (mixvm (concat "mixvm " (file-name-sans-extension (buffer-file-name))))) ;;;###autoload (define-derived-mode mixal-mode fundamental-mode "mixal" "Major mode for the mixal asm language. \\{mixal-mode-map}" (set (make-local-variable 'comment-start) "*") (set (make-local-variable 'comment-start-skip) "*") (set (make-local-variable 'font-lock-defaults) '(mixal-font-lock-keywords)) ; might add an indent function in the future ; (set (make-local-variable 'indent-line-function) 'mixal-indent-line) (set (make-local-variable 'compile-command) (concat "mixasm " buffer-file-name)) ;; mixasm will do strange when there is no final newline, ;; so let Emacs ensure that it is always there (set (make-local-variable 'require-final-newline) mode-require-final-newline)) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.mixal\\'" . mixal-mode)) (provide 'mixal-mode) ;;; mixal-mode.el ends here mdk-1.2.9/misc/mixvm.el0000644000175000017500000001421310770465100011635 00000000000000;;; mixvm.el --- mdk's mixvm / Emacs gud interaction ;; Copyright (C) 2001 Free Software Foundation, Inc. ;; Author: Philip Ellis King ;; Maintainer: Philip Ellis King ;; Created: 12 Feb 2001 ;; Version: 0.2 ;; Keywords: tools ;;; Commentary: ;; mixvm.el provides an interface between mdk's mixvm and Emacs, ;; via gud. Place this file in your load-path, optionally adding ;; the following line to your .emacs file: ;; (autoload 'mixvm "mixvm" "mixvm/gud interaction" t) ;; Initiate a mdk/gud session with the command mixvm, gud will ;; reflect the current line in the source file buffer. ;; (mixvm.el is based on a study of gdb, perldb, and pdb as found ;; in gud.el, and rubydb3x.el distributed with the source code to ;; the Ruby language. ;;; Change Log: ;; Version 0.2 ;; Initial release ;;; Code: (require 'gud) (provide 'mixvm) ;;; History of argument lists passed to mixvm. (defvar gud-mixvm-history nil) ;; rubydb3x provided good examples of xemacs/emacs ;; compatibility (not interested at the moment) (defun gud-mixvm-massage-args (file args) (cons "--emacs" args)) ;; There's no guarantee that Emacs will hand the filter the entire ;; marker at once; it could be broken up across several strings. We ;; might even receive a big chunk with several markers in it. If we ;; receive a chunk of text which looks like it might contain the ;; beginning of a marker, we save it here between calls to the ;; filter. (defvar gud-mixvm-marker-acc "") (make-variable-buffer-local 'gud-mixvm-marker-acc) (defun gud-mixvm-marker-filter (string) (setq gud-mixvm-marker-acc (concat gud-mixvm-marker-acc string)) (let ((output "")) ;; Process all the complete markers in this chunk. (while (string-match "\032\032mixvm:\\([^:]+\\):\\([0-9]+\\)" gud-mixvm-marker-acc) (setq ;; Extract the frame position from the marker. gud-last-frame (cons (substring gud-mixvm-marker-acc (match-beginning 1) (match-end 1)) (string-to-int (substring gud-mixvm-marker-acc (match-beginning 2) (match-end 2)))) ;; Append any text before the marker to the output we're going ;; to return - we don't include the marker in this text. output (concat output (substring gud-mixvm-marker-acc 0 (match-beginning 0))) ;; Set the accumulator to the remaining text. gud-mixvm-marker-acc (substring gud-mixvm-marker-acc (match-end 0)))) ;; Does the remaining text look like it might end with the ;; beginning of another marker? If it does, then keep it in ;; gud-mixvm-marker-acc until we receive the rest of it. Since we ;; know the full marker regexp above failed, it's pretty simple to ;; test for marker starts. ;; (note: \\' matches the end of the string (Perl's '$')) (if (string-match "\032.*\\'" gud-mixvm-marker-acc) (progn ;; Everything before the potential marker start can be output. (setq output (concat output (substring gud-mixvm-marker-acc 0 (match-beginning 0)))) ;; Everything after, we save, to combine with later input. (setq gud-mixvm-marker-acc (substring gud-mixvm-marker-acc (match-beginning 0)))) (setq output (concat output gud-mixvm-marker-acc) gud-mixvm-marker-acc "")) output)) ;; See gdb for more comprehensive example ;; pek: it bugs me that this is run for EVERY interactive ;; mixvm command, should we cache some info somewhere? (defun gud-mixvm-find-file (file) (save-excursion (let* ((buf (find-file-noselect file))) (set-buffer buf) (when (boundp 'gud-make-debug-menu) (gud-make-debug-menu)) buf))) (defvar mixvm-minibuffer-local-map nil "Keymap for minibuffer prompting of mixvm startup command.") (if mixvm-minibuffer-local-map () (setq mixvm-minibuffer-local-map (copy-keymap minibuffer-local-map)) (define-key mixvm-minibuffer-local-map "\C-i" 'comint-dynamic-complete-filename)) (defcustom gud-mixvm-command-name "mixvm" "File name for executing the mixvm debugger. This should be an executable on your path, or an absolute file name." :type 'string :group 'gud) ;;;###autoload (defun mixvm (command-line) "Run mixvm on program FILE in buffer `*gud-FILE*'. The directory containing FILE becomes the initial working directory and source-file directory for your debugger." (interactive (list (read-from-minibuffer "Run mixvm (like this): " (if (consp gud-mixvm-history) (car gud-mixvm-history) (concat gud-mixvm-command-name " ")) mixvm-minibuffer-local-map nil '(gud-mixvm-history . 1)))) (gud-common-init command-line 'gud-mixvm-massage-args 'gud-mixvm-marker-filter 'gud-mixvm-find-file) (gud-def gud-break "sbp %l" "\C-b" "Set breakpoint at current line.") (gud-def gud-remove "cbp %l" "\C-d" "Remove breakpoint at current line") (gud-def gud-step "next" "\C-s" "Step one source line with display.") (gud-def gud-next "next" "\C-n" "Step one line.") (gud-def gud-stepi "next" "\C-i" "Step one line.") (gud-def gud-cont "run" "\C-r" "Continue with display.") (gud-def gud-finish "run" "\C-f" "Finish executing current function.") (gud-def gud-print "weval %e" "\C-p" "Evaluate expression at point.") ; (gud-def gud-up "up" "<" "Up one stack frame.") ; (gud-def gud-down "down" ">" "Down one stack frame.") ; ;; Is this right? ; (gud-def gud-statement "! %e" "\C-e" "Execute Python statement at point.") ; (local-set-key [menu-bar debug finish] '("Finish Function" . gud-finish)) ; (local-set-key [menu-bar debug up] '("Up Stack" . gud-up)) ; (local-set-key [menu-bar debug down] '("Down Stack" . gud-down)) (setq comint-prompt-regexp "^MIX > ") (set (make-local-variable 'paragraph-start) comint-prompt-regexp) (run-hooks 'mixvm-mode-hook)) ;;; mixvm.el ends here mdk-1.2.9/misc/Makefile.am0000644000175000017500000000114110770465100012203 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EXTRA_DIST = mixvm.el mixal-mode.el pkgdata_DATA = mixvm.el mixal-mode.el mdk-1.2.9/misc/Makefile.in0000644000175000017500000004030712636565536012244 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = misc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgdatadir)" DATA = $(pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = mixvm.el mixal-mode.el pkgdata_DATA = mixvm.el mixal-mode.el all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu misc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu misc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgdataDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-pkgdataDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-pkgdataDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/intl/0000755000175000017500000000000012636571404010255 500000000000000mdk-1.2.9/intl/vasnprintf.h0000644000175000017500000000436012110326462012530 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _VASNPRINTF_H #define _VASNPRINTF_H /* Get va_list. */ #include /* Get size_t. */ #include #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) # define __format__ format # define __printf__ printf # endif #endif #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. */ extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) __attribute__ ((__format__ (__printf__, 3, 0))); #ifdef __cplusplus } #endif #endif /* _VASNPRINTF_H */ mdk-1.2.9/intl/gettextP.h0000644000175000017500000001453012110326462012142 00000000000000/* Header describing internals of libintl library. Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXTP_H #define _GETTEXTP_H #include /* Get size_t. */ #ifdef _LIBC # include "../iconv/gconv_int.h" #else # if HAVE_ICONV # include # endif #endif #include "loadinfo.h" #include "gmo.h" /* Get nls_uint32. */ /* @@ end of prolog @@ */ #ifndef internal_function # define internal_function #endif #ifndef attribute_hidden # define attribute_hidden #endif /* Tell the compiler when a conditional or integer expression is almost always true or almost always false. */ #ifndef HAVE_BUILTIN_EXPECT # define __builtin_expect(expr, val) (expr) #endif #ifndef W # define W(flag, data) ((flag) ? SWAP (data) : (data)) #endif #ifdef _LIBC # include # define SWAP(i) bswap_32 (i) #else static inline nls_uint32 SWAP (i) nls_uint32 i; { return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); } #endif /* In-memory representation of system dependent string. */ struct sysdep_string_desc { /* Length of addressed string, including the trailing NUL. */ size_t length; /* Pointer to addressed string. */ const char *pointer; }; /* The representation of an opened message catalog. */ struct loaded_domain { /* Pointer to memory containing the .mo file. */ const char *data; /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ int use_mmap; /* Size of mmap()ed memory. */ size_t mmap_size; /* 1 if the .mo file uses a different endianness than this machine. */ int must_swap; /* Pointer to additional malloc()ed memory. */ void *malloced; /* Number of static strings pairs. */ nls_uint32 nstrings; /* Pointer to descriptors of original strings in the file. */ const struct string_desc *orig_tab; /* Pointer to descriptors of translated strings in the file. */ const struct string_desc *trans_tab; /* Number of system dependent strings pairs. */ nls_uint32 n_sysdep_strings; /* Pointer to descriptors of original sysdep strings. */ const struct sysdep_string_desc *orig_sysdep_tab; /* Pointer to descriptors of translated sysdep strings. */ const struct sysdep_string_desc *trans_sysdep_tab; /* Size of hash table. */ nls_uint32 hash_size; /* Pointer to hash table. */ const nls_uint32 *hash_tab; /* 1 if the hash table uses a different endianness than this machine. */ int must_swap_hash_tab; int codeset_cntr; #ifdef _LIBC __gconv_t conv; #else # if HAVE_ICONV iconv_t conv; # endif #endif char **conv_tab; struct expression *plural; unsigned long int nplurals; }; /* We want to allocate a string at the end of the struct. But ISO C doesn't allow zero sized arrays. */ #ifdef __GNUC__ # define ZERO 0 #else # define ZERO 1 #endif /* A set of settings bound to a message domain. Used to store settings from bindtextdomain() and bind_textdomain_codeset(). */ struct binding { struct binding *next; char *dirname; int codeset_cntr; /* Incremented each time codeset changes. */ char *codeset; char domainname[ZERO]; }; /* A counter which is incremented each time some previous translations become invalid. This variable is part of the external ABI of the GNU libintl. */ extern int _nl_msg_cat_cntr; #ifndef _LIBC const char *_nl_locale_name (int category, const char *categoryname); #endif struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale, const char *__domainname, struct binding *__domainbinding) internal_function; void _nl_load_domain (struct loaded_l10nfile *__domain, struct binding *__domainbinding) internal_function; void _nl_unload_domain (struct loaded_domain *__domain) internal_function; const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file, struct loaded_domain *__domain, struct binding *__domainbinding) internal_function; void _nl_free_domain_conv (struct loaded_domain *__domain) internal_function; char *_nl_find_msg (struct loaded_l10nfile *domain_file, struct binding *domainbinding, const char *msgid, size_t *lengthp) internal_function; #ifdef _LIBC extern char *__gettext (const char *__msgid); extern char *__dgettext (const char *__domainname, const char *__msgid); extern char *__dcgettext (const char *__domainname, const char *__msgid, int __category); extern char *__ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n); extern char *__dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int n); extern char *__dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category); extern char *__dcigettext (const char *__domainname, const char *__msgid1, const char *__msgid2, int __plural, unsigned long int __n, int __category); extern char *__textdomain (const char *__domainname); extern char *__bindtextdomain (const char *__domainname, const char *__dirname); extern char *__bind_textdomain_codeset (const char *__domainname, const char *__codeset); #else /* Declare the exported libintl_* functions, in a way that allows us to call them under their real name. */ # undef _INTL_REDIRECT_INLINE # undef _INTL_REDIRECT_MACROS # define _INTL_REDIRECT_MACROS # include "libgnuintl.h" extern char *libintl_dcigettext (const char *__domainname, const char *__msgid1, const char *__msgid2, int __plural, unsigned long int __n, int __category); #endif /* @@ begin of epilog @@ */ #endif /* gettextP.h */ mdk-1.2.9/intl/ref-del.sin0000644000175000017500000000202412110326462012211 00000000000000# Remove this package from a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// s/ @PACKAGE@ / / s/^/# Packages using this file:/ } mdk-1.2.9/intl/dcgettext.c0000644000175000017500000000341512110326462012324 00000000000000/* Implementation of the dcgettext(3) function. Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCGETTEXT __dcgettext # define DCIGETTEXT __dcigettext #else # define DCGETTEXT libintl_dcgettext # define DCIGETTEXT libintl_dcigettext #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCGETTEXT (const char *domainname, const char *msgid, int category) { return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ INTDEF(__dcgettext) weak_alias (__dcgettext, dcgettext); #endif mdk-1.2.9/intl/dcigettext.c0000644000175000017500000010125312110326462012474 00000000000000/* Implementation of the internal dcigettext function. Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #ifndef errno extern int errno; #endif #ifndef __set_errno # define __set_errno(val) errno = (val) #endif #include #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include #ifdef _LIBC /* Guess whether integer division by zero raises signal SIGFPE. Set to 1 only if you know for sure. In case of doubt, set to 0. */ # if defined __alpha__ || defined __arm__ || defined __i386__ \ || defined __m68k__ || defined __s390__ # define INTDIV0_RAISES_SIGFPE 1 # else # define INTDIV0_RAISES_SIGFPE 0 # endif #endif #if !INTDIV0_RAISES_SIGFPE # include #endif #if defined HAVE_SYS_PARAM_H || defined _LIBC # include #endif #include "gettextP.h" #include "plural-exp.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "hash-string.h" /* Thread safetyness. */ #ifdef _LIBC # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_lock_define_initialized(CLASS, NAME) # define __libc_lock_lock(NAME) # define __libc_lock_unlock(NAME) # define __libc_rwlock_define_initialized(CLASS, NAME) # define __libc_rwlock_rdlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* Alignment of types. */ #if defined __GNUC__ && __GNUC__ >= 2 # define alignof(TYPE) __alignof__ (TYPE) #else # define alignof(TYPE) \ ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_default_domain libintl_nl_default_default_domain # define _nl_current_default_domain libintl_nl_current_default_domain # define _nl_default_dirname libintl_nl_default_dirname # define _nl_domain_bindings libintl_nl_domain_bindings #endif /* Some compilers, like SunOS4 cc, don't have offsetof in . */ #ifndef offsetof # define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define getcwd __getcwd # ifndef stpcpy # define stpcpy __stpcpy # endif # define tfind __tfind #else # if !defined HAVE_GETCWD char *getwd (); # define getcwd(buf, max) getwd (buf) # else # if VMS # define getcwd(buf, max) (getcwd) (buf, max, 0) # else char *getcwd (); # endif # endif # ifndef HAVE_STPCPY static char *stpcpy (char *dest, const char *src); # endif # ifndef HAVE_MEMPCPY static void *mempcpy (void *dest, const void *src, size_t n); # endif #endif /* Amount to increase buffer size by in each try. */ #define PATH_INCR 32 /* The following is from pathmax.h. */ /* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define PATH_MAX but might cause redefinition warnings when sys/param.h is later included (as on MORE/BSD 4.3). */ #if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__) # include #endif #ifndef _POSIX_PATH_MAX # define _POSIX_PATH_MAX 255 #endif #if !defined PATH_MAX && defined _PC_PATH_MAX # define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) #endif /* Don't include sys/param.h if it already has been. */ #if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN # include #endif #if !defined PATH_MAX && defined MAXPATHLEN # define PATH_MAX MAXPATHLEN #endif #ifndef PATH_MAX # define PATH_MAX _POSIX_PATH_MAX #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, it may be concatenated to a directory pathname. IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) # define IS_PATH_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) # define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) #endif /* This is the type used for the search tree where known translations are stored. */ struct known_translation_t { /* Domain in which to search. */ char *domainname; /* The category. */ int category; /* State of the catalog counter at the point the string was found. */ int counter; /* Catalog where the string was found. */ struct loaded_l10nfile *domain; /* And finally the translation. */ const char *translation; size_t translation_length; /* Pointer to the string in question. */ char msgid[ZERO]; }; /* Root of the search tree with known translations. We can use this only if the system provides the `tsearch' function family. */ #if defined HAVE_TSEARCH || defined _LIBC # include static void *root; # ifdef _LIBC # define tsearch __tsearch # endif /* Function to compare two entries in the table of known translations. */ static int transcmp (const void *p1, const void *p2) { const struct known_translation_t *s1; const struct known_translation_t *s2; int result; s1 = (const struct known_translation_t *) p1; s2 = (const struct known_translation_t *) p2; result = strcmp (s1->msgid, s2->msgid); if (result == 0) { result = strcmp (s1->domainname, s2->domainname); if (result == 0) /* We compare the category last (though this is the cheapest operation) since it is hopefully always the same (namely LC_MESSAGES). */ result = s1->category - s2->category; } return result; } #endif #ifndef INTVARDEF # define INTVARDEF(name) #endif #ifndef INTUSE # define INTUSE(name) name #endif /* Name of the default domain used for gettext(3) prior any call to textdomain(3). The default value for this is "messages". */ const char _nl_default_default_domain[] attribute_hidden = "messages"; /* Value used as the default domain for gettext(3). */ const char *_nl_current_default_domain attribute_hidden = _nl_default_default_domain; /* Contains the default location of the message catalogs. */ #if defined __EMX__ extern const char _nl_default_dirname[]; #else const char _nl_default_dirname[] = LOCALEDIR; INTVARDEF (_nl_default_dirname) #endif /* List with bindings of specific domains created by bindtextdomain() calls. */ struct binding *_nl_domain_bindings; /* Prototypes for local functions. */ static char *plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, const char *translation, size_t translation_len) internal_function; static const char *guess_category_value (int category, const char *categoryname) internal_function; #ifdef _LIBC # include "../locale/localeinfo.h" # define category_to_name(category) _nl_category_names[category] #else static const char *category_to_name (int category) internal_function; #endif /* For those loosing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA /* Nothing has to be done. */ # define freea(p) /* nothing */ # define ADD_BLOCK(list, address) /* nothing */ # define FREE_BLOCKS(list) /* nothing */ #else struct block_list { void *address; struct block_list *next; }; # define ADD_BLOCK(list, addr) \ do { \ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \ /* If we cannot get a free block we cannot add the new element to \ the list. */ \ if (newp != NULL) { \ newp->address = (addr); \ newp->next = (list); \ (list) = newp; \ } \ } while (0) # define FREE_BLOCKS(list) \ do { \ while (list != NULL) { \ struct block_list *old = list; \ list = list->next; \ free (old->address); \ free (old); \ } \ } while (0) # undef alloca # define alloca(size) (malloc (size)) # define freea(p) free (p) #endif /* have alloca */ #ifdef _LIBC /* List of blocks allocated for translations. */ typedef struct transmem_list { struct transmem_list *next; char data[ZERO]; } transmem_block_t; static struct transmem_list *transmem_list; #else typedef unsigned char transmem_block_t; #endif /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCIGETTEXT __dcigettext #else # define DCIGETTEXT libintl_dcigettext #endif /* Lock variable to protect the global data in the gettext implementation. */ #ifdef _LIBC __libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden) #endif /* Checking whether the binaries runs SUID must be done and glibc provides easier methods therefore we make a difference here. */ #ifdef _LIBC # define ENABLE_SECURE __libc_enable_secure # define DETERMINE_SECURE #else # ifndef HAVE_GETUID # define getuid() 0 # endif # ifndef HAVE_GETGID # define getgid() 0 # endif # ifndef HAVE_GETEUID # define geteuid() getuid() # endif # ifndef HAVE_GETEGID # define getegid() getgid() # endif static int enable_secure; # define ENABLE_SECURE (enable_secure == 1) # define DETERMINE_SECURE \ if (enable_secure == 0) \ { \ if (getuid () != geteuid () || getgid () != getegid ()) \ enable_secure = 1; \ else \ enable_secure = -1; \ } #endif /* Get the function to evaluate the plural expression. */ #include "eval-plural.h" /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale and, if PLURAL is nonzero, search over string depending on the plural form determined by N. */ char * DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, int plural, unsigned long int n, int category) { #ifndef HAVE_ALLOCA struct block_list *block_list = NULL; #endif struct loaded_l10nfile *domain; struct binding *binding; const char *categoryname; const char *categoryvalue; char *dirname, *xdomainname; char *single_locale; char *retval; size_t retlen; int saved_errno; #if defined HAVE_TSEARCH || defined _LIBC struct known_translation_t *search; struct known_translation_t **foundp = NULL; size_t msgid_len; #endif size_t domainname_len; /* If no real MSGID is given return NULL. */ if (msgid1 == NULL) return NULL; #ifdef _LIBC if (category < 0 || category >= __LC_LAST || category == LC_ALL) /* Bogus. */ return (plural == 0 ? (char *) msgid1 /* Use the Germanic plural rule. */ : n == 1 ? (char *) msgid1 : (char *) msgid2); #endif __libc_rwlock_rdlock (_nl_state_lock); /* If DOMAINNAME is NULL, we are interested in the default domain. If CATEGORY is not LC_MESSAGES this might not make much sense but the definition left this undefined. */ if (domainname == NULL) domainname = _nl_current_default_domain; /* OS/2 specific: backward compatibility with older libintl versions */ #ifdef LC_MESSAGES_COMPAT if (category == LC_MESSAGES_COMPAT) category = LC_MESSAGES; #endif #if defined HAVE_TSEARCH || defined _LIBC msgid_len = strlen (msgid1) + 1; /* Try to find the translation among those which we found at some time. */ search = (struct known_translation_t *) alloca (offsetof (struct known_translation_t, msgid) + msgid_len); memcpy (search->msgid, msgid1, msgid_len); search->domainname = (char *) domainname; search->category = category; foundp = (struct known_translation_t **) tfind (search, &root, transcmp); freea (search); if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) { /* Now deal with plural. */ if (plural) retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation, (*foundp)->translation_length); else retval = (char *) (*foundp)->translation; __libc_rwlock_unlock (_nl_state_lock); return retval; } #endif /* Preserve the `errno' value. */ saved_errno = errno; /* See whether this is a SUID binary or not. */ DETERMINE_SECURE; /* First find matching binding. */ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding == NULL) dirname = (char *) INTUSE(_nl_default_dirname); else if (IS_ABSOLUTE_PATH (binding->dirname)) dirname = binding->dirname; else { /* We have a relative path. Make it absolute now. */ size_t dirname_len = strlen (binding->dirname) + 1; size_t path_max; char *ret; path_max = (unsigned int) PATH_MAX; path_max += 2; /* The getcwd docs say to do this. */ for (;;) { dirname = (char *) alloca (path_max + dirname_len); ADD_BLOCK (block_list, dirname); __set_errno (0); ret = getcwd (dirname, path_max); if (ret != NULL || errno != ERANGE) break; path_max += path_max / 2; path_max += PATH_INCR; } if (ret == NULL) /* We cannot get the current working directory. Don't signal an error but simply return the default string. */ goto return_untranslated; stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); } /* Now determine the symbolic name of CATEGORY and its value. */ categoryname = category_to_name (category); categoryvalue = guess_category_value (category, categoryname); domainname_len = strlen (domainname); xdomainname = (char *) alloca (strlen (categoryname) + domainname_len + 5); ADD_BLOCK (block_list, xdomainname); stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), domainname, domainname_len), ".mo"); /* Creating working area. */ single_locale = (char *) alloca (strlen (categoryvalue) + 1); ADD_BLOCK (block_list, single_locale); /* Search for the given string. This is a loop because we perhaps got an ordered list of languages to consider for the translation. */ while (1) { /* Make CATEGORYVALUE point to the next element of the list. */ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') ++categoryvalue; if (categoryvalue[0] == '\0') { /* The whole contents of CATEGORYVALUE has been searched but no valid entry has been found. We solve this situation by implicitly appending a "C" entry, i.e. no translation will take place. */ single_locale[0] = 'C'; single_locale[1] = '\0'; } else { char *cp = single_locale; while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') *cp++ = *categoryvalue++; *cp = '\0'; /* When this is a SUID binary we must not allow accessing files outside the dedicated directories. */ if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale)) /* Ingore this entry. */ continue; } /* If the current locale value is C (or POSIX) we don't load a domain. Return the MSGID. */ if (strcmp (single_locale, "C") == 0 || strcmp (single_locale, "POSIX") == 0) break; /* Find structure describing the message catalog matching the DOMAINNAME and CATEGORY. */ domain = _nl_find_domain (dirname, single_locale, xdomainname, binding); if (domain != NULL) { retval = _nl_find_msg (domain, binding, msgid1, &retlen); if (retval == NULL) { int cnt; for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) { retval = _nl_find_msg (domain->successor[cnt], binding, msgid1, &retlen); if (retval != NULL) { domain = domain->successor[cnt]; break; } } } if (retval != NULL) { /* Found the translation of MSGID1 in domain DOMAIN: starting at RETVAL, RETLEN bytes. */ FREE_BLOCKS (block_list); #if defined HAVE_TSEARCH || defined _LIBC if (foundp == NULL) { /* Create a new entry and add it to the search tree. */ struct known_translation_t *newp; newp = (struct known_translation_t *) malloc (offsetof (struct known_translation_t, msgid) + msgid_len + domainname_len + 1); if (newp != NULL) { newp->domainname = mempcpy (newp->msgid, msgid1, msgid_len); memcpy (newp->domainname, domainname, domainname_len + 1); newp->category = category; newp->counter = _nl_msg_cat_cntr; newp->domain = domain; newp->translation = retval; newp->translation_length = retlen; /* Insert the entry in the search tree. */ foundp = (struct known_translation_t **) tsearch (newp, &root, transcmp); if (foundp == NULL || __builtin_expect (*foundp != newp, 0)) /* The insert failed. */ free (newp); } } else { /* We can update the existing entry. */ (*foundp)->counter = _nl_msg_cat_cntr; (*foundp)->domain = domain; (*foundp)->translation = retval; (*foundp)->translation_length = retlen; } #endif __set_errno (saved_errno); /* Now deal with plural. */ if (plural) retval = plural_lookup (domain, n, retval, retlen); __libc_rwlock_unlock (_nl_state_lock); return retval; } } } return_untranslated: /* Return the untranslated MSGID. */ FREE_BLOCKS (block_list); __libc_rwlock_unlock (_nl_state_lock); #ifndef _LIBC if (!ENABLE_SECURE) { extern void _nl_log_untranslated (const char *logfilename, const char *domainname, const char *msgid1, const char *msgid2, int plural); const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED"); if (logfilename != NULL && logfilename[0] != '\0') _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural); } #endif __set_errno (saved_errno); return (plural == 0 ? (char *) msgid1 /* Use the Germanic plural rule. */ : n == 1 ? (char *) msgid1 : (char *) msgid2); } char * internal_function _nl_find_msg (struct loaded_l10nfile *domain_file, struct binding *domainbinding, const char *msgid, size_t *lengthp) { struct loaded_domain *domain; nls_uint32 nstrings; size_t act; char *result; size_t resultlen; if (domain_file->decided == 0) _nl_load_domain (domain_file, domainbinding); if (domain_file->data == NULL) return NULL; domain = (struct loaded_domain *) domain_file->data; nstrings = domain->nstrings; /* Locate the MSGID and its translation. */ if (domain->hash_tab != NULL) { /* Use the hashing table. */ nls_uint32 len = strlen (msgid); nls_uint32 hash_val = hash_string (msgid); nls_uint32 idx = hash_val % domain->hash_size; nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); while (1) { nls_uint32 nstr = W (domain->must_swap_hash_tab, domain->hash_tab[idx]); if (nstr == 0) /* Hash table entry is empty. */ return NULL; nstr--; /* Compare msgid with the original string at index nstr. We compare the lengths with >=, not ==, because plural entries are represented by strings with an embedded NUL. */ if (nstr < nstrings ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len && (strcmp (msgid, domain->data + W (domain->must_swap, domain->orig_tab[nstr].offset)) == 0) : domain->orig_sysdep_tab[nstr - nstrings].length > len && (strcmp (msgid, domain->orig_sysdep_tab[nstr - nstrings].pointer) == 0)) { act = nstr; goto found; } if (idx >= domain->hash_size - incr) idx -= domain->hash_size - incr; else idx += incr; } /* NOTREACHED */ } else { /* Try the default method: binary search in the sorted array of messages. */ size_t top, bottom; bottom = 0; top = nstrings; while (bottom < top) { int cmp_val; act = (bottom + top) / 2; cmp_val = strcmp (msgid, (domain->data + W (domain->must_swap, domain->orig_tab[act].offset))); if (cmp_val < 0) top = act; else if (cmp_val > 0) bottom = act + 1; else goto found; } /* No translation was found. */ return NULL; } found: /* The translation was found at index ACT. If we have to convert the string to use a different character set, this is the time. */ if (act < nstrings) { result = (char *) (domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; } else { result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer; resultlen = domain->trans_sysdep_tab[act - nstrings].length; } #if defined _LIBC || HAVE_ICONV if (domain->codeset_cntr != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) { /* The domain's codeset has changed through bind_textdomain_codeset() since the message catalog was initialized or last accessed. We have to reinitialize the converter. */ _nl_free_domain_conv (domain); _nl_init_domain_conv (domain_file, domain, domainbinding); } if ( # ifdef _LIBC domain->conv != (__gconv_t) -1 # else # if HAVE_ICONV domain->conv != (iconv_t) -1 # endif # endif ) { /* We are supposed to do a conversion. First allocate an appropriate table with the same structure as the table of translations in the file, where we can put the pointers to the converted strings in. There is a slight complication with plural entries. They are represented by consecutive NUL terminated strings. We handle this case by converting RESULTLEN bytes, including NULs. */ if (domain->conv_tab == NULL && ((domain->conv_tab = (char **) calloc (nstrings + domain->n_sysdep_strings, sizeof (char *))) == NULL)) /* Mark that we didn't succeed allocating a table. */ domain->conv_tab = (char **) -1; if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) /* Nothing we can do, no more memory. */ goto converted; if (domain->conv_tab[act] == NULL) { /* We haven't used this string so far, so it is not translated yet. Do this now. */ /* We use a bit more efficient memory handling. We allocate always larger blocks which get used over time. This is faster than many small allocations. */ __libc_lock_define_initialized (static, lock) # define INITIAL_BLOCK_SIZE 4080 static unsigned char *freemem; static size_t freemem_size; const unsigned char *inbuf; unsigned char *outbuf; int malloc_count; # ifndef _LIBC transmem_block_t *transmem_list = NULL; # endif __libc_lock_lock (lock); inbuf = (const unsigned char *) result; outbuf = freemem + sizeof (size_t); malloc_count = 0; while (1) { transmem_block_t *newmem; # ifdef _LIBC size_t non_reversible; int res; if (freemem_size < sizeof (size_t)) goto resize_freemem; res = __gconv (domain->conv, &inbuf, inbuf + resultlen, &outbuf, outbuf + freemem_size - sizeof (size_t), &non_reversible); if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) break; if (res != __GCONV_FULL_OUTPUT) { __libc_lock_unlock (lock); goto converted; } inbuf = result; # else # if HAVE_ICONV const char *inptr = (const char *) inbuf; size_t inleft = resultlen; char *outptr = (char *) outbuf; size_t outleft; if (freemem_size < sizeof (size_t)) goto resize_freemem; outleft = freemem_size - sizeof (size_t); if (iconv (domain->conv, (ICONV_CONST char **) &inptr, &inleft, &outptr, &outleft) != (size_t) (-1)) { outbuf = (unsigned char *) outptr; break; } if (errno != E2BIG) { __libc_lock_unlock (lock); goto converted; } # endif # endif resize_freemem: /* We must allocate a new buffer or resize the old one. */ if (malloc_count > 0) { ++malloc_count; freemem_size = malloc_count * INITIAL_BLOCK_SIZE; newmem = (transmem_block_t *) realloc (transmem_list, freemem_size); # ifdef _LIBC if (newmem != NULL) transmem_list = transmem_list->next; else { struct transmem_list *old = transmem_list; transmem_list = transmem_list->next; free (old); } # endif } else { malloc_count = 1; freemem_size = INITIAL_BLOCK_SIZE; newmem = (transmem_block_t *) malloc (freemem_size); } if (__builtin_expect (newmem == NULL, 0)) { freemem = NULL; freemem_size = 0; __libc_lock_unlock (lock); goto converted; } # ifdef _LIBC /* Add the block to the list of blocks we have to free at some point. */ newmem->next = transmem_list; transmem_list = newmem; freemem = newmem->data; freemem_size -= offsetof (struct transmem_list, data); # else transmem_list = newmem; freemem = newmem; # endif outbuf = freemem + sizeof (size_t); } /* We have now in our buffer a converted string. Put this into the table of conversions. */ *(size_t *) freemem = outbuf - freemem - sizeof (size_t); domain->conv_tab[act] = (char *) freemem; /* Shrink freemem, but keep it aligned. */ freemem_size -= outbuf - freemem; freemem = outbuf; freemem += freemem_size & (alignof (size_t) - 1); freemem_size = freemem_size & ~ (alignof (size_t) - 1); __libc_lock_unlock (lock); } /* Now domain->conv_tab[act] contains the translation of all the plural variants. */ result = domain->conv_tab[act] + sizeof (size_t); resultlen = *(size_t *) domain->conv_tab[act]; } converted: /* The result string is converted. */ #endif /* _LIBC || HAVE_ICONV */ *lengthp = resultlen; return result; } /* Look up a plural variant. */ static char * internal_function plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, const char *translation, size_t translation_len) { struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; unsigned long int index; const char *p; index = plural_eval (domaindata->plural, n); if (index >= domaindata->nplurals) /* This should never happen. It means the plural expression and the given maximum value do not match. */ index = 0; /* Skip INDEX strings at TRANSLATION. */ p = translation; while (index-- > 0) { #ifdef _LIBC p = __rawmemchr (p, '\0'); #else p = strchr (p, '\0'); #endif /* And skip over the NUL byte. */ p++; if (p >= translation + translation_len) /* This should never happen. It means the plural expression evaluated to a value larger than the number of variants available for MSGID1. */ return (char *) translation; } return (char *) p; } #ifndef _LIBC /* Return string representation of locale CATEGORY. */ static const char * internal_function category_to_name (int category) { const char *retval; switch (category) { #ifdef LC_COLLATE case LC_COLLATE: retval = "LC_COLLATE"; break; #endif #ifdef LC_CTYPE case LC_CTYPE: retval = "LC_CTYPE"; break; #endif #ifdef LC_MONETARY case LC_MONETARY: retval = "LC_MONETARY"; break; #endif #ifdef LC_NUMERIC case LC_NUMERIC: retval = "LC_NUMERIC"; break; #endif #ifdef LC_TIME case LC_TIME: retval = "LC_TIME"; break; #endif #ifdef LC_MESSAGES case LC_MESSAGES: retval = "LC_MESSAGES"; break; #endif #ifdef LC_RESPONSE case LC_RESPONSE: retval = "LC_RESPONSE"; break; #endif #ifdef LC_ALL case LC_ALL: /* This might not make sense but is perhaps better than any other value. */ retval = "LC_ALL"; break; #endif default: /* If you have a better idea for a default value let me know. */ retval = "LC_XXX"; } return retval; } #endif /* Guess value of current locale from value of the environment variables. */ static const char * internal_function guess_category_value (int category, const char *categoryname) { const char *language; const char *retval; /* The highest priority value is the `LANGUAGE' environment variable. But we don't use the value if the currently selected locale is the C locale. This is a GNU extension. */ language = getenv ("LANGUAGE"); if (language != NULL && language[0] == '\0') language = NULL; /* We have to proceed with the POSIX methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some systems this can be done by the `setlocale' function itself. */ #ifdef _LIBC retval = __current_locale_name (category); #else retval = _nl_locale_name (category, categoryname); #endif /* Ignore LANGUAGE if the locale is set to "C" because 1. "C" locale usually uses the ASCII encoding, and most international messages use non-ASCII characters. These characters get displayed as question marks (if using glibc's iconv()) or as invalid 8-bit characters (because other iconv()s refuse to convert most non-ASCII characters to ASCII). In any case, the output is ugly. 2. The precise output of some programs in the "C" locale is specified by POSIX and should not depend on environment variables like "LANGUAGE". We allow such programs to use gettext(). */ return language != NULL && strcmp (retval, "C") != 0 ? language : retval; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (char *dest, const char *src) { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif #if !_LIBC && !HAVE_MEMPCPY static void * mempcpy (void *dest, const void *src, size_t n) { return (void *) ((char *) memcpy (dest, src, n) + n); } #endif #ifdef _LIBC /* If we want to free all resources we have to do some work at program's end. */ libc_freeres_fn (free_mem) { void *old; while (_nl_domain_bindings != NULL) { struct binding *oldp = _nl_domain_bindings; _nl_domain_bindings = _nl_domain_bindings->next; if (oldp->dirname != INTUSE(_nl_default_dirname)) /* Yes, this is a pointer comparison. */ free (oldp->dirname); free (oldp->codeset); free (oldp); } if (_nl_current_default_domain != _nl_default_default_domain) /* Yes, again a pointer comparison. */ free ((char *) _nl_current_default_domain); /* Remove the search tree with the known translations. */ __tdestroy (root, free); root = NULL; while (transmem_list != NULL) { old = transmem_list; transmem_list = transmem_list->next; free (old); } } #endif mdk-1.2.9/intl/loadmsgcat.c0000644000175000017500000010723712110326462012456 00000000000000/* Load needed message catalogs. Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #ifdef __GNUC__ # undef alloca # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #ifdef _LIBC # include # include #endif #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || (defined _LIBC && defined _POSIX_MAPPED_FILES) # include # undef HAVE_MMAP # define HAVE_MMAP 1 #else # undef HAVE_MMAP #endif #if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC # include #endif #if defined HAVE_INTTYPES_H || defined _LIBC # include #endif #include "gmo.h" #include "gettextP.h" #include "hash-string.h" #include "plural-exp.h" #ifdef _LIBC # include "../locale/localeinfo.h" #endif /* Provide fallback values for macros that ought to be defined in . Note that our fallback values need not be literal strings, because we don't use them with preprocessor string concatenation. */ #if !defined PRId8 || PRI_MACROS_BROKEN # undef PRId8 # define PRId8 "d" #endif #if !defined PRIi8 || PRI_MACROS_BROKEN # undef PRIi8 # define PRIi8 "i" #endif #if !defined PRIo8 || PRI_MACROS_BROKEN # undef PRIo8 # define PRIo8 "o" #endif #if !defined PRIu8 || PRI_MACROS_BROKEN # undef PRIu8 # define PRIu8 "u" #endif #if !defined PRIx8 || PRI_MACROS_BROKEN # undef PRIx8 # define PRIx8 "x" #endif #if !defined PRIX8 || PRI_MACROS_BROKEN # undef PRIX8 # define PRIX8 "X" #endif #if !defined PRId16 || PRI_MACROS_BROKEN # undef PRId16 # define PRId16 "d" #endif #if !defined PRIi16 || PRI_MACROS_BROKEN # undef PRIi16 # define PRIi16 "i" #endif #if !defined PRIo16 || PRI_MACROS_BROKEN # undef PRIo16 # define PRIo16 "o" #endif #if !defined PRIu16 || PRI_MACROS_BROKEN # undef PRIu16 # define PRIu16 "u" #endif #if !defined PRIx16 || PRI_MACROS_BROKEN # undef PRIx16 # define PRIx16 "x" #endif #if !defined PRIX16 || PRI_MACROS_BROKEN # undef PRIX16 # define PRIX16 "X" #endif #if !defined PRId32 || PRI_MACROS_BROKEN # undef PRId32 # define PRId32 "d" #endif #if !defined PRIi32 || PRI_MACROS_BROKEN # undef PRIi32 # define PRIi32 "i" #endif #if !defined PRIo32 || PRI_MACROS_BROKEN # undef PRIo32 # define PRIo32 "o" #endif #if !defined PRIu32 || PRI_MACROS_BROKEN # undef PRIu32 # define PRIu32 "u" #endif #if !defined PRIx32 || PRI_MACROS_BROKEN # undef PRIx32 # define PRIx32 "x" #endif #if !defined PRIX32 || PRI_MACROS_BROKEN # undef PRIX32 # define PRIX32 "X" #endif #if !defined PRId64 || PRI_MACROS_BROKEN # undef PRId64 # define PRId64 (sizeof (long) == 8 ? "ld" : "lld") #endif #if !defined PRIi64 || PRI_MACROS_BROKEN # undef PRIi64 # define PRIi64 (sizeof (long) == 8 ? "li" : "lli") #endif #if !defined PRIo64 || PRI_MACROS_BROKEN # undef PRIo64 # define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") #endif #if !defined PRIu64 || PRI_MACROS_BROKEN # undef PRIu64 # define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") #endif #if !defined PRIx64 || PRI_MACROS_BROKEN # undef PRIx64 # define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") #endif #if !defined PRIX64 || PRI_MACROS_BROKEN # undef PRIX64 # define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") #endif #if !defined PRIdLEAST8 || PRI_MACROS_BROKEN # undef PRIdLEAST8 # define PRIdLEAST8 "d" #endif #if !defined PRIiLEAST8 || PRI_MACROS_BROKEN # undef PRIiLEAST8 # define PRIiLEAST8 "i" #endif #if !defined PRIoLEAST8 || PRI_MACROS_BROKEN # undef PRIoLEAST8 # define PRIoLEAST8 "o" #endif #if !defined PRIuLEAST8 || PRI_MACROS_BROKEN # undef PRIuLEAST8 # define PRIuLEAST8 "u" #endif #if !defined PRIxLEAST8 || PRI_MACROS_BROKEN # undef PRIxLEAST8 # define PRIxLEAST8 "x" #endif #if !defined PRIXLEAST8 || PRI_MACROS_BROKEN # undef PRIXLEAST8 # define PRIXLEAST8 "X" #endif #if !defined PRIdLEAST16 || PRI_MACROS_BROKEN # undef PRIdLEAST16 # define PRIdLEAST16 "d" #endif #if !defined PRIiLEAST16 || PRI_MACROS_BROKEN # undef PRIiLEAST16 # define PRIiLEAST16 "i" #endif #if !defined PRIoLEAST16 || PRI_MACROS_BROKEN # undef PRIoLEAST16 # define PRIoLEAST16 "o" #endif #if !defined PRIuLEAST16 || PRI_MACROS_BROKEN # undef PRIuLEAST16 # define PRIuLEAST16 "u" #endif #if !defined PRIxLEAST16 || PRI_MACROS_BROKEN # undef PRIxLEAST16 # define PRIxLEAST16 "x" #endif #if !defined PRIXLEAST16 || PRI_MACROS_BROKEN # undef PRIXLEAST16 # define PRIXLEAST16 "X" #endif #if !defined PRIdLEAST32 || PRI_MACROS_BROKEN # undef PRIdLEAST32 # define PRIdLEAST32 "d" #endif #if !defined PRIiLEAST32 || PRI_MACROS_BROKEN # undef PRIiLEAST32 # define PRIiLEAST32 "i" #endif #if !defined PRIoLEAST32 || PRI_MACROS_BROKEN # undef PRIoLEAST32 # define PRIoLEAST32 "o" #endif #if !defined PRIuLEAST32 || PRI_MACROS_BROKEN # undef PRIuLEAST32 # define PRIuLEAST32 "u" #endif #if !defined PRIxLEAST32 || PRI_MACROS_BROKEN # undef PRIxLEAST32 # define PRIxLEAST32 "x" #endif #if !defined PRIXLEAST32 || PRI_MACROS_BROKEN # undef PRIXLEAST32 # define PRIXLEAST32 "X" #endif #if !defined PRIdLEAST64 || PRI_MACROS_BROKEN # undef PRIdLEAST64 # define PRIdLEAST64 PRId64 #endif #if !defined PRIiLEAST64 || PRI_MACROS_BROKEN # undef PRIiLEAST64 # define PRIiLEAST64 PRIi64 #endif #if !defined PRIoLEAST64 || PRI_MACROS_BROKEN # undef PRIoLEAST64 # define PRIoLEAST64 PRIo64 #endif #if !defined PRIuLEAST64 || PRI_MACROS_BROKEN # undef PRIuLEAST64 # define PRIuLEAST64 PRIu64 #endif #if !defined PRIxLEAST64 || PRI_MACROS_BROKEN # undef PRIxLEAST64 # define PRIxLEAST64 PRIx64 #endif #if !defined PRIXLEAST64 || PRI_MACROS_BROKEN # undef PRIXLEAST64 # define PRIXLEAST64 PRIX64 #endif #if !defined PRIdFAST8 || PRI_MACROS_BROKEN # undef PRIdFAST8 # define PRIdFAST8 "d" #endif #if !defined PRIiFAST8 || PRI_MACROS_BROKEN # undef PRIiFAST8 # define PRIiFAST8 "i" #endif #if !defined PRIoFAST8 || PRI_MACROS_BROKEN # undef PRIoFAST8 # define PRIoFAST8 "o" #endif #if !defined PRIuFAST8 || PRI_MACROS_BROKEN # undef PRIuFAST8 # define PRIuFAST8 "u" #endif #if !defined PRIxFAST8 || PRI_MACROS_BROKEN # undef PRIxFAST8 # define PRIxFAST8 "x" #endif #if !defined PRIXFAST8 || PRI_MACROS_BROKEN # undef PRIXFAST8 # define PRIXFAST8 "X" #endif #if !defined PRIdFAST16 || PRI_MACROS_BROKEN # undef PRIdFAST16 # define PRIdFAST16 "d" #endif #if !defined PRIiFAST16 || PRI_MACROS_BROKEN # undef PRIiFAST16 # define PRIiFAST16 "i" #endif #if !defined PRIoFAST16 || PRI_MACROS_BROKEN # undef PRIoFAST16 # define PRIoFAST16 "o" #endif #if !defined PRIuFAST16 || PRI_MACROS_BROKEN # undef PRIuFAST16 # define PRIuFAST16 "u" #endif #if !defined PRIxFAST16 || PRI_MACROS_BROKEN # undef PRIxFAST16 # define PRIxFAST16 "x" #endif #if !defined PRIXFAST16 || PRI_MACROS_BROKEN # undef PRIXFAST16 # define PRIXFAST16 "X" #endif #if !defined PRIdFAST32 || PRI_MACROS_BROKEN # undef PRIdFAST32 # define PRIdFAST32 "d" #endif #if !defined PRIiFAST32 || PRI_MACROS_BROKEN # undef PRIiFAST32 # define PRIiFAST32 "i" #endif #if !defined PRIoFAST32 || PRI_MACROS_BROKEN # undef PRIoFAST32 # define PRIoFAST32 "o" #endif #if !defined PRIuFAST32 || PRI_MACROS_BROKEN # undef PRIuFAST32 # define PRIuFAST32 "u" #endif #if !defined PRIxFAST32 || PRI_MACROS_BROKEN # undef PRIxFAST32 # define PRIxFAST32 "x" #endif #if !defined PRIXFAST32 || PRI_MACROS_BROKEN # undef PRIXFAST32 # define PRIXFAST32 "X" #endif #if !defined PRIdFAST64 || PRI_MACROS_BROKEN # undef PRIdFAST64 # define PRIdFAST64 PRId64 #endif #if !defined PRIiFAST64 || PRI_MACROS_BROKEN # undef PRIiFAST64 # define PRIiFAST64 PRIi64 #endif #if !defined PRIoFAST64 || PRI_MACROS_BROKEN # undef PRIoFAST64 # define PRIoFAST64 PRIo64 #endif #if !defined PRIuFAST64 || PRI_MACROS_BROKEN # undef PRIuFAST64 # define PRIuFAST64 PRIu64 #endif #if !defined PRIxFAST64 || PRI_MACROS_BROKEN # undef PRIxFAST64 # define PRIxFAST64 PRIx64 #endif #if !defined PRIXFAST64 || PRI_MACROS_BROKEN # undef PRIXFAST64 # define PRIXFAST64 PRIX64 #endif #if !defined PRIdMAX || PRI_MACROS_BROKEN # undef PRIdMAX # define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") #endif #if !defined PRIiMAX || PRI_MACROS_BROKEN # undef PRIiMAX # define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") #endif #if !defined PRIoMAX || PRI_MACROS_BROKEN # undef PRIoMAX # define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") #endif #if !defined PRIuMAX || PRI_MACROS_BROKEN # undef PRIuMAX # define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") #endif #if !defined PRIxMAX || PRI_MACROS_BROKEN # undef PRIxMAX # define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") #endif #if !defined PRIXMAX || PRI_MACROS_BROKEN # undef PRIXMAX # define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") #endif #if !defined PRIdPTR || PRI_MACROS_BROKEN # undef PRIdPTR # define PRIdPTR \ (sizeof (void *) == sizeof (long) ? "ld" : \ sizeof (void *) == sizeof (int) ? "d" : \ "lld") #endif #if !defined PRIiPTR || PRI_MACROS_BROKEN # undef PRIiPTR # define PRIiPTR \ (sizeof (void *) == sizeof (long) ? "li" : \ sizeof (void *) == sizeof (int) ? "i" : \ "lli") #endif #if !defined PRIoPTR || PRI_MACROS_BROKEN # undef PRIoPTR # define PRIoPTR \ (sizeof (void *) == sizeof (long) ? "lo" : \ sizeof (void *) == sizeof (int) ? "o" : \ "llo") #endif #if !defined PRIuPTR || PRI_MACROS_BROKEN # undef PRIuPTR # define PRIuPTR \ (sizeof (void *) == sizeof (long) ? "lu" : \ sizeof (void *) == sizeof (int) ? "u" : \ "llu") #endif #if !defined PRIxPTR || PRI_MACROS_BROKEN # undef PRIxPTR # define PRIxPTR \ (sizeof (void *) == sizeof (long) ? "lx" : \ sizeof (void *) == sizeof (int) ? "x" : \ "llx") #endif #if !defined PRIXPTR || PRI_MACROS_BROKEN # undef PRIXPTR # define PRIXPTR \ (sizeof (void *) == sizeof (long) ? "lX" : \ sizeof (void *) == sizeof (int) ? "X" : \ "llX") #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ISO C functions. This is required by the standard because some ISO C functions will require linking with this object file and the name space must not be polluted. */ # define open __open # define close __close # define read __read # define mmap __mmap # define munmap __munmap #endif /* For those losing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif /* For systems that distinguish between text and binary I/O. O_BINARY is usually declared in . */ #if !defined O_BINARY && defined _O_BINARY /* For MSC-compatible compilers. */ # define O_BINARY _O_BINARY # define O_TEXT _O_TEXT #endif #ifdef __BEOS__ /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ # undef O_BINARY # undef O_TEXT #endif /* On reasonable systems, binary I/O is the default. */ #ifndef O_BINARY # define O_BINARY 0 #endif /* We need a sign, whether a new catalog was loaded, which can be associated with all translations. This is important if the translations are cached by one of GCC's features. */ int _nl_msg_cat_cntr; /* Expand a system dependent string segment. Return NULL if unsupported. */ static const char * get_sysdep_segment_value (const char *name) { /* Test for an ISO C 99 section 7.8.1 format string directive. Syntax: P R I { d | i | o | u | x | X } { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ /* We don't use a table of 14 times 6 'const char *' strings here, because data relocations cost startup time. */ if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') { if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' || name[3] == 'x' || name[3] == 'X') { if (name[4] == '8' && name[5] == '\0') { if (name[3] == 'd') return PRId8; if (name[3] == 'i') return PRIi8; if (name[3] == 'o') return PRIo8; if (name[3] == 'u') return PRIu8; if (name[3] == 'x') return PRIx8; if (name[3] == 'X') return PRIX8; abort (); } if (name[4] == '1' && name[5] == '6' && name[6] == '\0') { if (name[3] == 'd') return PRId16; if (name[3] == 'i') return PRIi16; if (name[3] == 'o') return PRIo16; if (name[3] == 'u') return PRIu16; if (name[3] == 'x') return PRIx16; if (name[3] == 'X') return PRIX16; abort (); } if (name[4] == '3' && name[5] == '2' && name[6] == '\0') { if (name[3] == 'd') return PRId32; if (name[3] == 'i') return PRIi32; if (name[3] == 'o') return PRIo32; if (name[3] == 'u') return PRIu32; if (name[3] == 'x') return PRIx32; if (name[3] == 'X') return PRIX32; abort (); } if (name[4] == '6' && name[5] == '4' && name[6] == '\0') { if (name[3] == 'd') return PRId64; if (name[3] == 'i') return PRIi64; if (name[3] == 'o') return PRIo64; if (name[3] == 'u') return PRIu64; if (name[3] == 'x') return PRIx64; if (name[3] == 'X') return PRIX64; abort (); } if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' && name[7] == 'S' && name[8] == 'T') { if (name[9] == '8' && name[10] == '\0') { if (name[3] == 'd') return PRIdLEAST8; if (name[3] == 'i') return PRIiLEAST8; if (name[3] == 'o') return PRIoLEAST8; if (name[3] == 'u') return PRIuLEAST8; if (name[3] == 'x') return PRIxLEAST8; if (name[3] == 'X') return PRIXLEAST8; abort (); } if (name[9] == '1' && name[10] == '6' && name[11] == '\0') { if (name[3] == 'd') return PRIdLEAST16; if (name[3] == 'i') return PRIiLEAST16; if (name[3] == 'o') return PRIoLEAST16; if (name[3] == 'u') return PRIuLEAST16; if (name[3] == 'x') return PRIxLEAST16; if (name[3] == 'X') return PRIXLEAST16; abort (); } if (name[9] == '3' && name[10] == '2' && name[11] == '\0') { if (name[3] == 'd') return PRIdLEAST32; if (name[3] == 'i') return PRIiLEAST32; if (name[3] == 'o') return PRIoLEAST32; if (name[3] == 'u') return PRIuLEAST32; if (name[3] == 'x') return PRIxLEAST32; if (name[3] == 'X') return PRIXLEAST32; abort (); } if (name[9] == '6' && name[10] == '4' && name[11] == '\0') { if (name[3] == 'd') return PRIdLEAST64; if (name[3] == 'i') return PRIiLEAST64; if (name[3] == 'o') return PRIoLEAST64; if (name[3] == 'u') return PRIuLEAST64; if (name[3] == 'x') return PRIxLEAST64; if (name[3] == 'X') return PRIXLEAST64; abort (); } } if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' && name[7] == 'T') { if (name[8] == '8' && name[9] == '\0') { if (name[3] == 'd') return PRIdFAST8; if (name[3] == 'i') return PRIiFAST8; if (name[3] == 'o') return PRIoFAST8; if (name[3] == 'u') return PRIuFAST8; if (name[3] == 'x') return PRIxFAST8; if (name[3] == 'X') return PRIXFAST8; abort (); } if (name[8] == '1' && name[9] == '6' && name[10] == '\0') { if (name[3] == 'd') return PRIdFAST16; if (name[3] == 'i') return PRIiFAST16; if (name[3] == 'o') return PRIoFAST16; if (name[3] == 'u') return PRIuFAST16; if (name[3] == 'x') return PRIxFAST16; if (name[3] == 'X') return PRIXFAST16; abort (); } if (name[8] == '3' && name[9] == '2' && name[10] == '\0') { if (name[3] == 'd') return PRIdFAST32; if (name[3] == 'i') return PRIiFAST32; if (name[3] == 'o') return PRIoFAST32; if (name[3] == 'u') return PRIuFAST32; if (name[3] == 'x') return PRIxFAST32; if (name[3] == 'X') return PRIXFAST32; abort (); } if (name[8] == '6' && name[9] == '4' && name[10] == '\0') { if (name[3] == 'd') return PRIdFAST64; if (name[3] == 'i') return PRIiFAST64; if (name[3] == 'o') return PRIoFAST64; if (name[3] == 'u') return PRIuFAST64; if (name[3] == 'x') return PRIxFAST64; if (name[3] == 'X') return PRIXFAST64; abort (); } } if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' && name[7] == '\0') { if (name[3] == 'd') return PRIdMAX; if (name[3] == 'i') return PRIiMAX; if (name[3] == 'o') return PRIoMAX; if (name[3] == 'u') return PRIuMAX; if (name[3] == 'x') return PRIxMAX; if (name[3] == 'X') return PRIXMAX; abort (); } if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' && name[7] == '\0') { if (name[3] == 'd') return PRIdPTR; if (name[3] == 'i') return PRIiPTR; if (name[3] == 'o') return PRIoPTR; if (name[3] == 'u') return PRIuPTR; if (name[3] == 'x') return PRIxPTR; if (name[3] == 'X') return PRIXPTR; abort (); } } } /* Test for a glibc specific printf() format directive flag. */ if (name[0] == 'I' && name[1] == '\0') { #if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) /* The 'I' flag, in numeric format directives, replaces ASCII digits with the 'outdigits' defined in the LC_CTYPE locale facet. This is used for Farsi (Persian) and maybe Arabic. */ return "I"; #else return ""; #endif } /* Other system dependent strings are not valid. */ return NULL; } /* Initialize the codeset dependent parts of an opened message catalog. Return the header entry. */ const char * internal_function _nl_init_domain_conv (struct loaded_l10nfile *domain_file, struct loaded_domain *domain, struct binding *domainbinding) { /* Find out about the character set the file is encoded with. This can be found (in textual form) in the entry "". If this entry does not exist or if this does not contain the `charset=' information, we will assume the charset matches the one the current locale and we don't have to perform any conversion. */ char *nullentry; size_t nullentrylen; /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ domain->codeset_cntr = (domainbinding != NULL ? domainbinding->codeset_cntr : 0); #ifdef _LIBC domain->conv = (__gconv_t) -1; #else # if HAVE_ICONV domain->conv = (iconv_t) -1; # endif #endif domain->conv_tab = NULL; /* Get the header entry. */ nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); if (nullentry != NULL) { #if defined _LIBC || HAVE_ICONV const char *charsetstr; charsetstr = strstr (nullentry, "charset="); if (charsetstr != NULL) { size_t len; char *charset; const char *outcharset; charsetstr += strlen ("charset="); len = strcspn (charsetstr, " \t\n"); charset = (char *) alloca (len + 1); # if defined _LIBC || HAVE_MEMPCPY *((char *) mempcpy (charset, charsetstr, len)) = '\0'; # else memcpy (charset, charsetstr, len); charset[len] = '\0'; # endif /* The output charset should normally be determined by the locale. But sometimes the locale is not used or not correctly set up, so we provide a possibility for the user to override this. Moreover, the value specified through bind_textdomain_codeset overrides both. */ if (domainbinding != NULL && domainbinding->codeset != NULL) outcharset = domainbinding->codeset; else { outcharset = getenv ("OUTPUT_CHARSET"); if (outcharset == NULL || outcharset[0] == '\0') { # ifdef _LIBC outcharset = _NL_CURRENT (LC_CTYPE, CODESET); # else # if HAVE_ICONV extern const char *locale_charset (void); outcharset = locale_charset (); # endif # endif } } # ifdef _LIBC /* We always want to use transliteration. */ outcharset = norm_add_slashes (outcharset, "TRANSLIT"); charset = norm_add_slashes (charset, NULL); if (__gconv_open (outcharset, charset, &domain->conv, GCONV_AVOID_NOCONV) != __GCONV_OK) domain->conv = (__gconv_t) -1; # else # if HAVE_ICONV /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, we want to use transliteration. */ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ || _LIBICONV_VERSION >= 0x0105 if (strchr (outcharset, '/') == NULL) { char *tmp; len = strlen (outcharset); tmp = (char *) alloca (len + 10 + 1); memcpy (tmp, outcharset, len); memcpy (tmp + len, "//TRANSLIT", 10 + 1); outcharset = tmp; domain->conv = iconv_open (outcharset, charset); freea (outcharset); } else # endif domain->conv = iconv_open (outcharset, charset); # endif # endif freea (charset); } #endif /* _LIBC || HAVE_ICONV */ } return nullentry; } /* Frees the codeset dependent parts of an opened message catalog. */ void internal_function _nl_free_domain_conv (struct loaded_domain *domain) { if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) free (domain->conv_tab); #ifdef _LIBC if (domain->conv != (__gconv_t) -1) __gconv_close (domain->conv); #else # if HAVE_ICONV if (domain->conv != (iconv_t) -1) iconv_close (domain->conv); # endif #endif } /* Load the message catalogs specified by FILENAME. If it is no valid message catalog do nothing. */ void internal_function _nl_load_domain (struct loaded_l10nfile *domain_file, struct binding *domainbinding) { int fd; size_t size; #ifdef _LIBC struct stat64 st; #else struct stat st; #endif struct mo_file_header *data = (struct mo_file_header *) -1; int use_mmap = 0; struct loaded_domain *domain; int revision; const char *nullentry; domain_file->decided = 1; domain_file->data = NULL; /* Note that it would be useless to store domainbinding in domain_file because domainbinding might be == NULL now but != NULL later (after a call to bind_textdomain_codeset). */ /* If the record does not represent a valid locale the FILENAME might be NULL. This can happen when according to the given specification the locale file name is different for XPG and CEN syntax. */ if (domain_file->filename == NULL) return; /* Try to open the addressed file. */ fd = open (domain_file->filename, O_RDONLY | O_BINARY); if (fd == -1) return; /* We must know about the size of the file. */ if ( #ifdef _LIBC __builtin_expect (fstat64 (fd, &st) != 0, 0) #else __builtin_expect (fstat (fd, &st) != 0, 0) #endif || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) || __builtin_expect (size < sizeof (struct mo_file_header), 0)) { /* Something went wrong. */ close (fd); return; } #ifdef HAVE_MMAP /* Now we are ready to load the file. If mmap() is available we try this first. If not available or it failed we try to load it. */ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (__builtin_expect (data != (struct mo_file_header *) -1, 1)) { /* mmap() call was successful. */ close (fd); use_mmap = 1; } #endif /* If the data is not yet available (i.e. mmap'ed) we try to load it manually. */ if (data == (struct mo_file_header *) -1) { size_t to_read; char *read_ptr; data = (struct mo_file_header *) malloc (size); if (data == NULL) return; to_read = size; read_ptr = (char *) data; do { long int nb = (long int) read (fd, read_ptr, to_read); if (nb <= 0) { #ifdef EINTR if (nb == -1 && errno == EINTR) continue; #endif close (fd); return; } read_ptr += nb; to_read -= nb; } while (to_read > 0); close (fd); } /* Using the magic number we can test whether it really is a message catalog file. */ if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED, 0)) { /* The magic number is wrong: not a message catalog file. */ #ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); return; } domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); if (domain == NULL) return; domain_file->data = domain; domain->data = (char *) data; domain->use_mmap = use_mmap; domain->mmap_size = size; domain->must_swap = data->magic != _MAGIC; domain->malloced = NULL; /* Fill in the information about the available tables. */ revision = W (domain->must_swap, data->revision); /* We support only the major revisions 0 and 1. */ switch (revision >> 16) { case 0: case 1: domain->nstrings = W (domain->must_swap, data->nstrings); domain->orig_tab = (const struct string_desc *) ((char *) data + W (domain->must_swap, data->orig_tab_offset)); domain->trans_tab = (const struct string_desc *) ((char *) data + W (domain->must_swap, data->trans_tab_offset)); domain->hash_size = W (domain->must_swap, data->hash_tab_size); domain->hash_tab = (domain->hash_size > 2 ? (const nls_uint32 *) ((char *) data + W (domain->must_swap, data->hash_tab_offset)) : NULL); domain->must_swap_hash_tab = domain->must_swap; /* Now dispatch on the minor revision. */ switch (revision & 0xffff) { case 0: domain->n_sysdep_strings = 0; domain->orig_sysdep_tab = NULL; domain->trans_sysdep_tab = NULL; break; case 1: default: { nls_uint32 n_sysdep_strings; if (domain->hash_tab == NULL) /* This is invalid. These minor revisions need a hash table. */ goto invalid; n_sysdep_strings = W (domain->must_swap, data->n_sysdep_strings); if (n_sysdep_strings > 0) { nls_uint32 n_sysdep_segments; const struct sysdep_segment *sysdep_segments; const char **sysdep_segment_values; const nls_uint32 *orig_sysdep_tab; const nls_uint32 *trans_sysdep_tab; nls_uint32 n_inmem_sysdep_strings; size_t memneed; char *mem; struct sysdep_string_desc *inmem_orig_sysdep_tab; struct sysdep_string_desc *inmem_trans_sysdep_tab; nls_uint32 *inmem_hash_tab; unsigned int i, j; /* Get the values of the system dependent segments. */ n_sysdep_segments = W (domain->must_swap, data->n_sysdep_segments); sysdep_segments = (const struct sysdep_segment *) ((char *) data + W (domain->must_swap, data->sysdep_segments_offset)); sysdep_segment_values = alloca (n_sysdep_segments * sizeof (const char *)); for (i = 0; i < n_sysdep_segments; i++) { const char *name = (char *) data + W (domain->must_swap, sysdep_segments[i].offset); nls_uint32 namelen = W (domain->must_swap, sysdep_segments[i].length); if (!(namelen > 0 && name[namelen - 1] == '\0')) { freea (sysdep_segment_values); goto invalid; } sysdep_segment_values[i] = get_sysdep_segment_value (name); } orig_sysdep_tab = (const nls_uint32 *) ((char *) data + W (domain->must_swap, data->orig_sysdep_tab_offset)); trans_sysdep_tab = (const nls_uint32 *) ((char *) data + W (domain->must_swap, data->trans_sysdep_tab_offset)); /* Compute the amount of additional memory needed for the system dependent strings and the augmented hash table. At the same time, also drop string pairs which refer to an undefined system dependent segment. */ n_inmem_sysdep_strings = 0; memneed = domain->hash_size * sizeof (nls_uint32); for (i = 0; i < n_sysdep_strings; i++) { int valid = 1; size_t needs[2]; for (j = 0; j < 2; j++) { const struct sysdep_string *sysdep_string = (const struct sysdep_string *) ((char *) data + W (domain->must_swap, j == 0 ? orig_sysdep_tab[i] : trans_sysdep_tab[i])); size_t need = 0; const struct segment_pair *p = sysdep_string->segments; if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) for (p = sysdep_string->segments;; p++) { nls_uint32 sysdepref; need += W (domain->must_swap, p->segsize); sysdepref = W (domain->must_swap, p->sysdepref); if (sysdepref == SEGMENTS_END) break; if (sysdepref >= n_sysdep_segments) { /* Invalid. */ freea (sysdep_segment_values); goto invalid; } if (sysdep_segment_values[sysdepref] == NULL) { /* This particular string pair is invalid. */ valid = 0; break; } need += strlen (sysdep_segment_values[sysdepref]); } needs[j] = need; if (!valid) break; } if (valid) { n_inmem_sysdep_strings++; memneed += needs[0] + needs[1]; } } memneed += 2 * n_inmem_sysdep_strings * sizeof (struct sysdep_string_desc); if (n_inmem_sysdep_strings > 0) { unsigned int k; /* Allocate additional memory. */ mem = (char *) malloc (memneed); if (mem == NULL) goto invalid; domain->malloced = mem; inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; mem += n_inmem_sysdep_strings * sizeof (struct sysdep_string_desc); inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; mem += n_inmem_sysdep_strings * sizeof (struct sysdep_string_desc); inmem_hash_tab = (nls_uint32 *) mem; mem += domain->hash_size * sizeof (nls_uint32); /* Compute the system dependent strings. */ k = 0; for (i = 0; i < n_sysdep_strings; i++) { int valid = 1; for (j = 0; j < 2; j++) { const struct sysdep_string *sysdep_string = (const struct sysdep_string *) ((char *) data + W (domain->must_swap, j == 0 ? orig_sysdep_tab[i] : trans_sysdep_tab[i])); const struct segment_pair *p = sysdep_string->segments; if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END) for (p = sysdep_string->segments;; p++) { nls_uint32 sysdepref; sysdepref = W (domain->must_swap, p->sysdepref); if (sysdepref == SEGMENTS_END) break; if (sysdep_segment_values[sysdepref] == NULL) { /* This particular string pair is invalid. */ valid = 0; break; } } if (!valid) break; } if (valid) { for (j = 0; j < 2; j++) { const struct sysdep_string *sysdep_string = (const struct sysdep_string *) ((char *) data + W (domain->must_swap, j == 0 ? orig_sysdep_tab[i] : trans_sysdep_tab[i])); const char *static_segments = (char *) data + W (domain->must_swap, sysdep_string->offset); const struct segment_pair *p = sysdep_string->segments; /* Concatenate the segments, and fill inmem_orig_sysdep_tab[k] (for j == 0) and inmem_trans_sysdep_tab[k] (for j == 1). */ struct sysdep_string_desc *inmem_tab_entry = (j == 0 ? inmem_orig_sysdep_tab : inmem_trans_sysdep_tab) + k; if (W (domain->must_swap, p->sysdepref) == SEGMENTS_END) { /* Only one static segment. */ inmem_tab_entry->length = W (domain->must_swap, p->segsize); inmem_tab_entry->pointer = static_segments; } else { inmem_tab_entry->pointer = mem; for (p = sysdep_string->segments;; p++) { nls_uint32 segsize = W (domain->must_swap, p->segsize); nls_uint32 sysdepref = W (domain->must_swap, p->sysdepref); size_t n; if (segsize > 0) { memcpy (mem, static_segments, segsize); mem += segsize; static_segments += segsize; } if (sysdepref == SEGMENTS_END) break; n = strlen (sysdep_segment_values[sysdepref]); memcpy (mem, sysdep_segment_values[sysdepref], n); mem += n; } inmem_tab_entry->length = mem - inmem_tab_entry->pointer; } } k++; } } if (k != n_inmem_sysdep_strings) abort (); /* Compute the augmented hash table. */ for (i = 0; i < domain->hash_size; i++) inmem_hash_tab[i] = W (domain->must_swap_hash_tab, domain->hash_tab[i]); for (i = 0; i < n_inmem_sysdep_strings; i++) { const char *msgid = inmem_orig_sysdep_tab[i].pointer; nls_uint32 hash_val = hash_string (msgid); nls_uint32 idx = hash_val % domain->hash_size; nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); for (;;) { if (inmem_hash_tab[idx] == 0) { /* Hash table entry is empty. Use it. */ inmem_hash_tab[idx] = 1 + domain->nstrings + i; break; } if (idx >= domain->hash_size - incr) idx -= domain->hash_size - incr; else idx += incr; } } domain->n_sysdep_strings = n_inmem_sysdep_strings; domain->orig_sysdep_tab = inmem_orig_sysdep_tab; domain->trans_sysdep_tab = inmem_trans_sysdep_tab; domain->hash_tab = inmem_hash_tab; domain->must_swap_hash_tab = 0; } else { domain->n_sysdep_strings = 0; domain->orig_sysdep_tab = NULL; domain->trans_sysdep_tab = NULL; } freea (sysdep_segment_values); } else { domain->n_sysdep_strings = 0; domain->orig_sysdep_tab = NULL; domain->trans_sysdep_tab = NULL; } } break; } break; default: /* This is an invalid revision. */ invalid: /* This is an invalid .mo file. */ if (domain->malloced) free (domain->malloced); #ifdef HAVE_MMAP if (use_mmap) munmap ((caddr_t) data, size); else #endif free (data); free (domain); domain_file->data = NULL; return; } /* Now initialize the character set converter from the character set the file is encoded with (found in the header entry) to the domain's specified character set or the locale's character set. */ nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); /* Also look for a plural specification. */ EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); } #ifdef _LIBC void internal_function _nl_unload_domain (struct loaded_domain *domain) { if (domain->plural != &__gettext_germanic_plural) __gettext_free_exp (domain->plural); _nl_free_domain_conv (domain); if (domain->malloced) free (domain->malloced); # ifdef _POSIX_MAPPED_FILES if (domain->use_mmap) munmap ((caddr_t) domain->data, domain->mmap_size); else # endif /* _POSIX_MAPPED_FILES */ free ((void *) domain->data); free (domain); } #endif mdk-1.2.9/intl/localcharset.c0000644000175000017500000002435712110326462013005 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include "localcharset.h" #if HAVE_STDDEF_H # include #endif #include #if HAVE_STRING_H # include #else # include #endif #if HAVE_STDLIB_H # include #endif #if defined _WIN32 || defined __WIN32__ # undef WIN32 /* avoid warning on mingw32 */ # define WIN32 #endif #if defined __EMX__ /* Assume EMX program runs on OS/2, even if compiled under DOS. */ # define OS2 #endif #if !defined WIN32 # if HAVE_LANGINFO_CODESET # include # else # if HAVE_SETLOCALE # include # endif # endif #elif defined WIN32 # define WIN32_LEAN_AND_MEAN # include #endif #if defined OS2 # define INCL_DOS # include #endif #if ENABLE_RELOCATABLE # include "relocatable.h" #else # define relocate(pathname) (pathname) #endif #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') #endif #ifndef DIRECTORY_SEPARATOR # define DIRECTORY_SEPARATOR '/' #endif #ifndef ISSLASH # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif #if HAVE_DECL_GETC_UNLOCKED # undef getc # define getc getc_unlocked #endif /* The following static variable is declared 'volatile' to avoid a possible multithread problem in the function get_charset_aliases. If we are running in a threaded environment, and if two threads initialize 'charset_aliases' simultaneously, both will produce the same value, and everything will be ok if the two assignments to 'charset_aliases' are atomic. But I don't know what will happen if the two assignments mix. */ #if __STDC__ != 1 # define volatile /* empty */ #endif /* Pointer to the contents of the charset.alias file, if it has already been read, else NULL. Its format is: ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ static const char * volatile charset_aliases; /* Return a pointer to the contents of the charset.alias file. */ static const char * get_charset_aliases () { const char *cp; cp = charset_aliases; if (cp == NULL) { #if !(defined VMS || defined WIN32) FILE *fp; const char *dir = relocate (LIBDIR); const char *base = "charset.alias"; char *file_name; /* Concatenate dir and base into freshly allocated file_name. */ { size_t dir_len = strlen (dir); size_t base_len = strlen (base); int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); file_name = (char *) malloc (dir_len + add_slash + base_len + 1); if (file_name != NULL) { memcpy (file_name, dir, dir_len); if (add_slash) file_name[dir_len] = DIRECTORY_SEPARATOR; memcpy (file_name + dir_len + add_slash, base, base_len + 1); } } if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) /* Out of memory or file not found, treat it as empty. */ cp = ""; else { /* Parse the file's contents. */ int c; char buf1[50+1]; char buf2[50+1]; char *res_ptr = NULL; size_t res_size = 0; size_t l1, l2; for (;;) { c = getc (fp); if (c == EOF) break; if (c == '\n' || c == ' ' || c == '\t') continue; if (c == '#') { /* Skip comment, to end of line. */ do c = getc (fp); while (!(c == EOF || c == '\n')); if (c == EOF) break; continue; } ungetc (c, fp); if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) break; l1 = strlen (buf1); l2 = strlen (buf2); if (res_size == 0) { res_size = l1 + 1 + l2 + 1; res_ptr = (char *) malloc (res_size + 1); } else { res_size += l1 + 1 + l2 + 1; res_ptr = (char *) realloc (res_ptr, res_size + 1); } if (res_ptr == NULL) { /* Out of memory. */ res_size = 0; break; } strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); strcpy (res_ptr + res_size - (l2 + 1), buf2); } fclose (fp); if (res_size == 0) cp = ""; else { *(res_ptr + res_size) = '\0'; cp = res_ptr; } } if (file_name != NULL) free (file_name); #else # if defined VMS /* To avoid the troubles of an extra file charset.alias_vms in the sources of many GNU packages, simply inline the aliases here. */ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation "Compaq C Run-Time Library Reference Manual for OpenVMS systems" section 10.7 "Handling Different Character Sets". */ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" "ISO8859-2" "\0" "ISO-8859-2" "\0" "ISO8859-5" "\0" "ISO-8859-5" "\0" "ISO8859-7" "\0" "ISO-8859-7" "\0" "ISO8859-8" "\0" "ISO-8859-8" "\0" "ISO8859-9" "\0" "ISO-8859-9" "\0" /* Japanese */ "eucJP" "\0" "EUC-JP" "\0" "SJIS" "\0" "SHIFT_JIS" "\0" "DECKANJI" "\0" "DEC-KANJI" "\0" "SDECKANJI" "\0" "EUC-JP" "\0" /* Chinese */ "eucTW" "\0" "EUC-TW" "\0" "DECHANYU" "\0" "DEC-HANYU" "\0" "DECHANZI" "\0" "GB2312" "\0" /* Korean */ "DECKOREAN" "\0" "EUC-KR" "\0"; # endif # if defined WIN32 /* To avoid the troubles of installing a separate file in the same directory as the DLL and of retrieving the DLL's directory at runtime, simply inline the aliases here. */ cp = "CP936" "\0" "GBK" "\0" "CP1361" "\0" "JOHAB" "\0" "CP20127" "\0" "ASCII" "\0" "CP20866" "\0" "KOI8-R" "\0" "CP21866" "\0" "KOI8-RU" "\0" "CP28591" "\0" "ISO-8859-1" "\0" "CP28592" "\0" "ISO-8859-2" "\0" "CP28593" "\0" "ISO-8859-3" "\0" "CP28594" "\0" "ISO-8859-4" "\0" "CP28595" "\0" "ISO-8859-5" "\0" "CP28596" "\0" "ISO-8859-6" "\0" "CP28597" "\0" "ISO-8859-7" "\0" "CP28598" "\0" "ISO-8859-8" "\0" "CP28599" "\0" "ISO-8859-9" "\0" "CP28605" "\0" "ISO-8859-15" "\0"; # endif #endif charset_aliases = cp; } return cp; } /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ #ifdef STATIC STATIC #endif const char * locale_charset () { const char *codeset; const char *aliases; #if !(defined WIN32 || defined OS2) # if HAVE_LANGINFO_CODESET /* Most systems support nl_langinfo (CODESET) nowadays. */ codeset = nl_langinfo (CODESET); # else /* On old systems which lack it, use setlocale or getenv. */ const char *locale = NULL; /* But most old systems don't have a complete set of locales. Some (like SunOS 4 or DJGPP) have only the C locale. Therefore we don't use setlocale here; it would return "C" when it doesn't support the locale name the user has set. */ # if HAVE_SETLOCALE && 0 locale = setlocale (LC_CTYPE, NULL); # endif if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } } /* On some old systems, one used to set locale = "iso8859_1". On others, you set it to "language_COUNTRY.charset". In any case, we resolve it through the charset.alias file. */ codeset = locale; # endif #elif defined WIN32 static char buf[2 + 10 + 1]; /* Woe32 has a function returning the locale's codepage as a number. */ sprintf (buf, "CP%u", GetACP ()); codeset = buf; #elif defined OS2 const char *locale; static char buf[2 + 10 + 1]; ULONG cp[3]; ULONG cplen; /* Allow user to override the codeset, as set in the operating system, with standard language environment variables. */ locale = getenv ("LC_ALL"); if (locale == NULL || locale[0] == '\0') { locale = getenv ("LC_CTYPE"); if (locale == NULL || locale[0] == '\0') locale = getenv ("LANG"); } if (locale != NULL && locale[0] != '\0') { /* If the locale name contains an encoding after the dot, return it. */ const char *dot = strchr (locale, '.'); if (dot != NULL) { const char *modifier; dot++; /* Look for the possible @... trailer and remove it, if any. */ modifier = strchr (dot, '@'); if (modifier == NULL) return dot; if (modifier - dot < sizeof (buf)) { memcpy (buf, dot, modifier - dot); buf [modifier - dot] = '\0'; return buf; } } /* Resolve through the charset.alias file. */ codeset = locale; } else { /* OS/2 has a function returning the locale's codepage as a number. */ if (DosQueryCp (sizeof (cp), cp, &cplen)) codeset = ""; else { sprintf (buf, "CP%u", cp[0]); codeset = buf; } } #endif if (codeset == NULL) /* The canonical name cannot be determined. */ codeset = ""; /* Resolve alias. */ for (aliases = get_charset_aliases (); *aliases != '\0'; aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) if (strcmp (codeset, aliases) == 0 || (aliases[0] == '*' && aliases[1] == '\0')) { codeset = aliases + strlen (aliases) + 1; break; } /* Don't return an empty string. GNU libc and GNU libiconv interpret the empty string as denoting "the locale's character encoding", thus GNU libiconv would call this function a second time. */ if (codeset[0] == '\0') codeset = "ASCII"; return codeset; } mdk-1.2.9/intl/osdep.c0000644000175000017500000000164312110326462011444 00000000000000/* OS dependent parts of libintl. Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if defined __EMX__ # include "os2compat.c" #else /* Avoid AIX compiler warning. */ typedef int dummy; #endif mdk-1.2.9/intl/printf-parse.c0000644000175000017500000002733312110326462012750 00000000000000/* Formatted output to strings. Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #if WIDE_CHAR_VERSION # include "wprintf-parse.h" #else # include "printf-parse.h" #endif /* Get size_t, NULL. */ #include /* Get intmax_t. */ #if HAVE_STDINT_H_WITH_UINTMAX # include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX # include #endif /* malloc(), realloc(), free(). */ #include /* Checked size_t computations. */ #include "xsize.h" #if WIDE_CHAR_VERSION # define PRINTF_PARSE wprintf_parse # define CHAR_T wchar_t # define DIRECTIVE wchar_t_directive # define DIRECTIVES wchar_t_directives #else # define PRINTF_PARSE printf_parse # define CHAR_T char # define DIRECTIVE char_directive # define DIRECTIVES char_directives #endif #ifdef STATIC STATIC #endif int PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a) { const CHAR_T *cp = format; /* pointer into format */ size_t arg_posn = 0; /* number of regular arguments consumed */ size_t d_allocated; /* allocated elements of d->dir */ size_t a_allocated; /* allocated elements of a->arg */ size_t max_width_length = 0; size_t max_precision_length = 0; d->count = 0; d_allocated = 1; d->dir = malloc (d_allocated * sizeof (DIRECTIVE)); if (d->dir == NULL) /* Out of memory. */ return -1; a->count = 0; a_allocated = 0; a->arg = NULL; #define REGISTER_ARG(_index_,_type_) \ { \ size_t n = (_index_); \ if (n >= a_allocated) \ { \ size_t memory_size; \ argument *memory; \ \ a_allocated = xtimes (a_allocated, 2); \ if (a_allocated <= n) \ a_allocated = xsum (n, 1); \ memory_size = xtimes (a_allocated, sizeof (argument)); \ if (size_overflow_p (memory_size)) \ /* Overflow, would lead to out of memory. */ \ goto error; \ memory = (a->arg \ ? realloc (a->arg, memory_size) \ : malloc (memory_size)); \ if (memory == NULL) \ /* Out of memory. */ \ goto error; \ a->arg = memory; \ } \ while (a->count <= n) \ a->arg[a->count++].type = TYPE_NONE; \ if (a->arg[n].type == TYPE_NONE) \ a->arg[n].type = (_type_); \ else if (a->arg[n].type != (_type_)) \ /* Ambiguous type for positional argument. */ \ goto error; \ } while (*cp != '\0') { CHAR_T c = *cp++; if (c == '%') { size_t arg_index = ARG_NONE; DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */ /* Initialize the next directive. */ dp->dir_start = cp - 1; dp->flags = 0; dp->width_start = NULL; dp->width_end = NULL; dp->width_arg_index = ARG_NONE; dp->precision_start = NULL; dp->precision_end = NULL; dp->precision_arg_index = ARG_NONE; dp->arg_index = ARG_NONE; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; arg_index = n - 1; cp = np + 1; } } /* Read the flags. */ for (;;) { if (*cp == '\'') { dp->flags |= FLAG_GROUP; cp++; } else if (*cp == '-') { dp->flags |= FLAG_LEFT; cp++; } else if (*cp == '+') { dp->flags |= FLAG_SHOWSIGN; cp++; } else if (*cp == ' ') { dp->flags |= FLAG_SPACE; cp++; } else if (*cp == '#') { dp->flags |= FLAG_ALT; cp++; } else if (*cp == '0') { dp->flags |= FLAG_ZERO; cp++; } else break; } /* Parse the field width. */ if (*cp == '*') { dp->width_start = cp; cp++; dp->width_end = cp; if (max_width_length < 1) max_width_length = 1; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->width_arg_index = n - 1; cp = np + 1; } } if (dp->width_arg_index == ARG_NONE) { dp->width_arg_index = arg_posn++; if (dp->width_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->width_arg_index, TYPE_INT); } else if (*cp >= '0' && *cp <= '9') { size_t width_length; dp->width_start = cp; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->width_end = cp; width_length = dp->width_end - dp->width_start; if (max_width_length < width_length) max_width_length = width_length; } /* Parse the precision. */ if (*cp == '.') { cp++; if (*cp == '*') { dp->precision_start = cp - 1; cp++; dp->precision_end = cp; if (max_precision_length < 2) max_precision_length = 2; /* Test for positional argument. */ if (*cp >= '0' && *cp <= '9') { const CHAR_T *np; for (np = cp; *np >= '0' && *np <= '9'; np++) ; if (*np == '$') { size_t n = 0; for (np = cp; *np >= '0' && *np <= '9'; np++) n = xsum (xtimes (n, 10), *np - '0'); if (n == 0) /* Positional argument 0. */ goto error; if (size_overflow_p (n)) /* n too large, would lead to out of memory later. */ goto error; dp->precision_arg_index = n - 1; cp = np + 1; } } if (dp->precision_arg_index == ARG_NONE) { dp->precision_arg_index = arg_posn++; if (dp->precision_arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->precision_arg_index, TYPE_INT); } else { size_t precision_length; dp->precision_start = cp - 1; for (; *cp >= '0' && *cp <= '9'; cp++) ; dp->precision_end = cp; precision_length = dp->precision_end - dp->precision_start; if (max_precision_length < precision_length) max_precision_length = precision_length; } } { arg_type type; /* Parse argument type/size specifiers. */ { int flags = 0; for (;;) { if (*cp == 'h') { flags |= (1 << (flags & 1)); cp++; } else if (*cp == 'L') { flags |= 4; cp++; } else if (*cp == 'l') { flags += 8; cp++; } #ifdef HAVE_INTMAX_T else if (*cp == 'j') { if (sizeof (intmax_t) > sizeof (long)) { /* intmax_t = long long */ flags += 16; } else if (sizeof (intmax_t) > sizeof (int)) { /* intmax_t = long */ flags += 8; } cp++; } #endif else if (*cp == 'z' || *cp == 'Z') { /* 'z' is standardized in ISO C 99, but glibc uses 'Z' because the warning facility in gcc-2.95.2 understands only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */ if (sizeof (size_t) > sizeof (long)) { /* size_t = long long */ flags += 16; } else if (sizeof (size_t) > sizeof (int)) { /* size_t = long */ flags += 8; } cp++; } else if (*cp == 't') { if (sizeof (ptrdiff_t) > sizeof (long)) { /* ptrdiff_t = long long */ flags += 16; } else if (sizeof (ptrdiff_t) > sizeof (int)) { /* ptrdiff_t = long */ flags += 8; } cp++; } else break; } /* Read the conversion character. */ c = *cp++; switch (c) { case 'd': case 'i': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_LONGLONGINT; else #endif if (flags >= 8) type = TYPE_LONGINT; else if (flags & 2) type = TYPE_SCHAR; else if (flags & 1) type = TYPE_SHORT; else type = TYPE_INT; break; case 'o': case 'u': case 'x': case 'X': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_ULONGLONGINT; else #endif if (flags >= 8) type = TYPE_ULONGINT; else if (flags & 2) type = TYPE_UCHAR; else if (flags & 1) type = TYPE_USHORT; else type = TYPE_UINT; break; case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': #ifdef HAVE_LONG_DOUBLE if (flags >= 16 || (flags & 4)) type = TYPE_LONGDOUBLE; else #endif type = TYPE_DOUBLE; break; case 'c': if (flags >= 8) #ifdef HAVE_WINT_T type = TYPE_WIDE_CHAR; #else goto error; #endif else type = TYPE_CHAR; break; #ifdef HAVE_WINT_T case 'C': type = TYPE_WIDE_CHAR; c = 'c'; break; #endif case 's': if (flags >= 8) #ifdef HAVE_WCHAR_T type = TYPE_WIDE_STRING; #else goto error; #endif else type = TYPE_STRING; break; #ifdef HAVE_WCHAR_T case 'S': type = TYPE_WIDE_STRING; c = 's'; break; #endif case 'p': type = TYPE_POINTER; break; case 'n': #ifdef HAVE_LONG_LONG if (flags >= 16 || (flags & 4)) type = TYPE_COUNT_LONGLONGINT_POINTER; else #endif if (flags >= 8) type = TYPE_COUNT_LONGINT_POINTER; else if (flags & 2) type = TYPE_COUNT_SCHAR_POINTER; else if (flags & 1) type = TYPE_COUNT_SHORT_POINTER; else type = TYPE_COUNT_INT_POINTER; break; case '%': type = TYPE_NONE; break; default: /* Unknown conversion character. */ goto error; } } if (type != TYPE_NONE) { dp->arg_index = arg_index; if (dp->arg_index == ARG_NONE) { dp->arg_index = arg_posn++; if (dp->arg_index == ARG_NONE) /* arg_posn wrapped around. */ goto error; } REGISTER_ARG (dp->arg_index, type); } dp->conversion = c; dp->dir_end = cp; } d->count++; if (d->count >= d_allocated) { size_t memory_size; DIRECTIVE *memory; d_allocated = xtimes (d_allocated, 2); memory_size = xtimes (d_allocated, sizeof (DIRECTIVE)); if (size_overflow_p (memory_size)) /* Overflow, would lead to out of memory. */ goto error; memory = realloc (d->dir, memory_size); if (memory == NULL) /* Out of memory. */ goto error; d->dir = memory; } } } d->dir[d->count].dir_start = cp; d->max_width_length = max_width_length; d->max_precision_length = max_precision_length; return 0; error: if (a->arg) free (a->arg); if (d->dir) free (d->dir); return -1; } #undef DIRECTIVES #undef DIRECTIVE #undef CHAR_T #undef PRINTF_PARSE mdk-1.2.9/intl/dngettext.c0000644000175000017500000000354212110326462012340 00000000000000/* Implementation of the dngettext(3) function. Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DNGETTEXT __dngettext # define DCNGETTEXT __dcngettext #else # define DNGETTEXT libintl_dngettext # define DCNGETTEXT libintl_dcngettext #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale and skip message according to the plural form. */ char * DNGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n) { return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dngettext, dngettext); #endif mdk-1.2.9/intl/gettext.c0000644000175000017500000000355012110326462012015 00000000000000/* Implementation of gettext(3) function. Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # include /* Just for NULL. */ #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define GETTEXT __gettext # define DCGETTEXT INTUSE(__dcgettext) #else # define GETTEXT libintl_gettext # define DCGETTEXT libintl_dcgettext #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * GETTEXT (const char *msgid) { return DCGETTEXT (NULL, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__gettext, gettext); #endif mdk-1.2.9/intl/libgnuintl.h.in0000644000175000017500000003114612110326462013114 00000000000000/* Message catalogs for internationalization. Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LIBINTL_H #define _LIBINTL_H 1 #include /* The LC_MESSAGES locale category is the category used by the functions gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. On systems that don't define it, use an arbitrary value instead. On Solaris, defines __LOCALE_H (or _LOCALE_H in Solaris 2.5) then includes (i.e. this file!) and then only defines LC_MESSAGES. To avoid a redefinition warning, don't define LC_MESSAGES in this case. */ #if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun)) # define LC_MESSAGES 1729 #endif /* We define an additional symbol to signal that we use the GNU implementation of gettext. */ #define __USE_GNU_GETTEXT 1 /* Provide information about the supported file formats. Returns the maximum minor revision number supported for a given major revision. */ #define __GNU_GETTEXT_SUPPORTED_REVISION(major) \ ((major) == 0 ? 1 : -1) /* Resolve a platform specific conflict on DJGPP. GNU gettext takes precedence over _conio_gettext. */ #ifdef __DJGPP__ # undef gettext #endif #ifdef __cplusplus extern "C" { #endif /* We redirect the functions to those prefixed with "libintl_". This is necessary, because some systems define gettext/textdomain/... in the C library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer). If we used the unprefixed names, there would be cases where the definition in the C library would override the one in the libintl.so shared library. Recall that on ELF systems, the symbols are looked up in the following order: 1. in the executable, 2. in the shared libraries specified on the link command line, in order, 3. in the dependencies of the shared libraries specified on the link command line, 4. in the dlopen()ed shared libraries, in the order in which they were dlopen()ed. The definition in the C library would override the one in libintl.so if either * -lc is given on the link command line and -lintl isn't, or * -lc is given on the link command line before -lintl, or * libintl.so is a dependency of a dlopen()ed shared library but not linked to the executable at link time. Since Solaris gettext() behaves differently than GNU gettext(), this would be unacceptable. The redirection happens by default through macros in C, so that &gettext is independent of the compilation unit, but through inline functions in C++, in order not to interfere with the name mangling of class fields or class methods called 'gettext'. */ /* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS. If he doesn't, we choose the method. A third possible method is _INTL_REDIRECT_ASM, supported only by GCC. */ #if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) # if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus) # define _INTL_REDIRECT_ASM # else # ifdef __cplusplus # define _INTL_REDIRECT_INLINE # else # define _INTL_REDIRECT_MACROS # endif # endif #endif /* Auxiliary macros. */ #ifdef _INTL_REDIRECT_ASM # define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname)) # define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring # define _INTL_STRINGIFY(prefix) #prefix #else # define _INTL_ASM(cname) #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_gettext (const char *__msgid); static inline char *gettext (const char *__msgid) { return libintl_gettext (__msgid); } #else #ifdef _INTL_REDIRECT_MACROS # define gettext libintl_gettext #endif extern char *gettext (const char *__msgid) _INTL_ASM (libintl_gettext); #endif /* Look up MSGID in the DOMAINNAME message catalog for the current LC_MESSAGES locale. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dgettext (const char *__domainname, const char *__msgid); static inline char *dgettext (const char *__domainname, const char *__msgid) { return libintl_dgettext (__domainname, __msgid); } #else #ifdef _INTL_REDIRECT_MACROS # define dgettext libintl_dgettext #endif extern char *dgettext (const char *__domainname, const char *__msgid) _INTL_ASM (libintl_dgettext); #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, int __category); static inline char *dcgettext (const char *__domainname, const char *__msgid, int __category) { return libintl_dcgettext (__domainname, __msgid, __category); } #else #ifdef _INTL_REDIRECT_MACROS # define dcgettext libintl_dcgettext #endif extern char *dcgettext (const char *__domainname, const char *__msgid, int __category) _INTL_ASM (libintl_dcgettext); #endif /* Similar to `gettext' but select the plural form corresponding to the number N. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n); static inline char *ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n) { return libintl_ngettext (__msgid1, __msgid2, __n); } #else #ifdef _INTL_REDIRECT_MACROS # define ngettext libintl_ngettext #endif extern char *ngettext (const char *__msgid1, const char *__msgid2, unsigned long int __n) _INTL_ASM (libintl_ngettext); #endif /* Similar to `dgettext' but select the plural form corresponding to the number N. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n); static inline char *dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n) { return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); } #else #ifdef _INTL_REDIRECT_MACROS # define dngettext libintl_dngettext #endif extern char *dngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n) _INTL_ASM (libintl_dngettext); #endif /* Similar to `dcgettext' but select the plural form corresponding to the number N. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category); static inline char *dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category) { return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); } #else #ifdef _INTL_REDIRECT_MACROS # define dcngettext libintl_dcngettext #endif extern char *dcngettext (const char *__domainname, const char *__msgid1, const char *__msgid2, unsigned long int __n, int __category) _INTL_ASM (libintl_dcngettext); #endif /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_textdomain (const char *__domainname); static inline char *textdomain (const char *__domainname) { return libintl_textdomain (__domainname); } #else #ifdef _INTL_REDIRECT_MACROS # define textdomain libintl_textdomain #endif extern char *textdomain (const char *__domainname) _INTL_ASM (libintl_textdomain); #endif /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_bindtextdomain (const char *__domainname, const char *__dirname); static inline char *bindtextdomain (const char *__domainname, const char *__dirname) { return libintl_bindtextdomain (__domainname, __dirname); } #else #ifdef _INTL_REDIRECT_MACROS # define bindtextdomain libintl_bindtextdomain #endif extern char *bindtextdomain (const char *__domainname, const char *__dirname) _INTL_ASM (libintl_bindtextdomain); #endif /* Specify the character encoding in which the messages from the DOMAINNAME message catalog will be returned. */ #ifdef _INTL_REDIRECT_INLINE extern char *libintl_bind_textdomain_codeset (const char *__domainname, const char *__codeset); static inline char *bind_textdomain_codeset (const char *__domainname, const char *__codeset) { return libintl_bind_textdomain_codeset (__domainname, __codeset); } #else #ifdef _INTL_REDIRECT_MACROS # define bind_textdomain_codeset libintl_bind_textdomain_codeset #endif extern char *bind_textdomain_codeset (const char *__domainname, const char *__codeset) _INTL_ASM (libintl_bind_textdomain_codeset); #endif /* Support for format strings with positions in *printf(), following the POSIX/XSI specification. Note: These replacements for the *printf() functions are visible only in source files that #include or #include "gettext.h". Packages that use *printf() in source files that don't refer to _() or gettext() but for which the format string could be the return value of _() or gettext() need to add this #include. Oh well. */ #if !@HAVE_POSIX_PRINTF@ #include #include /* Get va_list. */ #if __STDC__ || defined __cplusplus || defined _MSC_VER # include #else # include #endif #undef fprintf #define fprintf libintl_fprintf extern int fprintf (FILE *, const char *, ...); #undef vfprintf #define vfprintf libintl_vfprintf extern int vfprintf (FILE *, const char *, va_list); #undef printf #define printf libintl_printf extern int printf (const char *, ...); #undef vprintf #define vprintf libintl_vprintf extern int vprintf (const char *, va_list); #undef sprintf #define sprintf libintl_sprintf extern int sprintf (char *, const char *, ...); #undef vsprintf #define vsprintf libintl_vsprintf extern int vsprintf (char *, const char *, va_list); #if @HAVE_SNPRINTF@ #undef snprintf #define snprintf libintl_snprintf extern int snprintf (char *, size_t, const char *, ...); #undef vsnprintf #define vsnprintf libintl_vsnprintf extern int vsnprintf (char *, size_t, const char *, va_list); #endif #if @HAVE_ASPRINTF@ #undef asprintf #define asprintf libintl_asprintf extern int asprintf (char **, const char *, ...); #undef vasprintf #define vasprintf libintl_vasprintf extern int vasprintf (char **, const char *, va_list); #endif #if @HAVE_WPRINTF@ #undef fwprintf #define fwprintf libintl_fwprintf extern int fwprintf (FILE *, const wchar_t *, ...); #undef vfwprintf #define vfwprintf libintl_vfwprintf extern int vfwprintf (FILE *, const wchar_t *, va_list); #undef wprintf #define wprintf libintl_wprintf extern int wprintf (const wchar_t *, ...); #undef vwprintf #define vwprintf libintl_vwprintf extern int vwprintf (const wchar_t *, va_list); #undef swprintf #define swprintf libintl_swprintf extern int swprintf (wchar_t *, size_t, const wchar_t *, ...); #undef vswprintf #define vswprintf libintl_vswprintf extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list); #endif #endif /* Support for relocatable packages. */ /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ #define libintl_set_relocation_prefix libintl_set_relocation_prefix extern void libintl_set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); #ifdef __cplusplus } #endif #endif /* libintl.h */ mdk-1.2.9/intl/ChangeLog0000644000175000017500000000010712110326462011732 000000000000002004-01-28 GNU * Version 0.14 released. mdk-1.2.9/intl/plural.c0000644000175000017500000011065112110336222011624 00000000000000/* A Bison parser, made from plural.y by GNU bison 1.35. */ #define YYBISON 1 /* Identify Bison output. */ #define yyparse __gettextparse #define yylex __gettextlex #define yyerror __gettexterror #define yylval __gettextlval #define yychar __gettextchar #define yydebug __gettextdebug #define yynerrs __gettextnerrs # define EQUOP2 257 # define CMPOP2 258 # define ADDOP2 259 # define MULOP2 260 # define NUMBER 261 #line 1 "plural.y" /* Expression parsing for plural form selection. Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ #if defined _AIX && !defined __GNUC__ #pragma alloca #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include "plural-exp.h" /* The main function generated by the parser is called __gettextparse, but we want it to be called PLURAL_PARSE. */ #ifndef _LIBC # define __gettextparse PLURAL_PARSE #endif #define YYLEX_PARAM &((struct parse_args *) arg)->cp #define YYPARSE_PARAM arg #line 49 "plural.y" #ifndef YYSTYPE typedef union { unsigned long int num; enum operator op; struct expression *exp; } yystype; # define YYSTYPE yystype # define YYSTYPE_IS_TRIVIAL 1 #endif #line 55 "plural.y" /* Prototypes for local functions. */ static int yylex (YYSTYPE *lval, const char **pexp); static void yyerror (const char *str); /* Allocation of expressions. */ static struct expression * new_exp (int nargs, enum operator op, struct expression * const *args) { int i; struct expression *newp; /* If any of the argument could not be malloc'ed, just return NULL. */ for (i = nargs - 1; i >= 0; i--) if (args[i] == NULL) goto fail; /* Allocate a new expression. */ newp = (struct expression *) malloc (sizeof (*newp)); if (newp != NULL) { newp->nargs = nargs; newp->operation = op; for (i = nargs - 1; i >= 0; i--) newp->val.args[i] = args[i]; return newp; } fail: for (i = nargs - 1; i >= 0; i--) FREE_EXPRESSION (args[i]); return NULL; } static inline struct expression * new_exp_0 (enum operator op) { return new_exp (0, op, NULL); } static inline struct expression * new_exp_1 (enum operator op, struct expression *right) { struct expression *args[1]; args[0] = right; return new_exp (1, op, args); } static struct expression * new_exp_2 (enum operator op, struct expression *left, struct expression *right) { struct expression *args[2]; args[0] = left; args[1] = right; return new_exp (2, op, args); } static inline struct expression * new_exp_3 (enum operator op, struct expression *bexp, struct expression *tbranch, struct expression *fbranch) { struct expression *args[3]; args[0] = bexp; args[1] = tbranch; args[2] = fbranch; return new_exp (3, op, args); } #ifndef YYDEBUG # define YYDEBUG 0 #endif #define YYFINAL 27 #define YYFLAG -32768 #define YYNTBASE 16 /* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */ #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18) /* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */ static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 5, 2, 14, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 6, 7, 8, 9, 11 }; #if YYDEBUG static const short yyprhs[] = { 0, 0, 2, 8, 12, 16, 20, 24, 28, 32, 35, 37, 39 }; static const short yyrhs[] = { 17, 0, 17, 3, 17, 12, 17, 0, 17, 4, 17, 0, 17, 5, 17, 0, 17, 6, 17, 0, 17, 7, 17, 0, 17, 8, 17, 0, 17, 9, 17, 0, 10, 17, 0, 13, 0, 11, 0, 14, 17, 15, 0 }; #endif #if YYDEBUG /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const short yyrline[] = { 0, 150, 158, 162, 166, 170, 174, 178, 182, 186, 190, 194, 199 }; #endif #if (YYDEBUG) || defined YYERROR_VERBOSE /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */ static const char *const yytname[] = { "$", "error", "$undefined.", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2", "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'", "start", "exp", 0 }; #endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const short yyr1[] = { 0, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const short yyr2[] = { 0, 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, 1, 3 }; /* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const short yydefact[] = { 0, 0, 11, 10, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 3, 4, 5, 6, 7, 8, 0, 2, 0, 0, 0 }; static const short yydefgoto[] = { 25, 5 }; static const short yypact[] = { -9, -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9, -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26, -3,-32768, -9, 34, 21, 53,-32768 }; static const short yypgoto[] = { -32768, -1 }; #define YYLAST 53 static const short yytable[] = { 6, 1, 2, 7, 3, 4, 14, 16, 17, 18, 19, 20, 21, 22, 8, 9, 10, 11, 12, 13, 14, 26, 24, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 13, 14, 23, 8, 9, 10, 11, 12, 13, 14, 10, 11, 12, 13, 14, 11, 12, 13, 14, 27 }; static const short yycheck[] = { 1, 10, 11, 4, 13, 14, 9, 8, 9, 10, 11, 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, 0, 23, 7, 8, 9, 15, 3, 4, 5, 6, 7, 8, 9, 8, 9, 12, 3, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, 8, 9, 0 }; #define YYPURE 1 /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/local/share/bison/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ #if ! defined (yyoverflow) || defined (YYERROR_VERBOSE) /* The parser invokes alloca or malloc; define the necessary symbols. */ # if YYSTACK_USE_ALLOCA # define YYSTACK_ALLOC alloca # else # ifndef YYSTACK_USE_ALLOCA # if defined (alloca) || defined (_ALLOCA_H) # define YYSTACK_ALLOC alloca # else # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # else # if defined (__STDC__) || defined (__cplusplus) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # endif # define YYSTACK_ALLOC malloc # define YYSTACK_FREE free # endif #endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */ #if (! defined (yyoverflow) \ && (! defined (__cplusplus) \ || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { short yyss; YYSTYPE yyvs; # if YYLSP_NEEDED YYLTYPE yyls; # endif }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # if YYLSP_NEEDED # define YYSTACK_BYTES(N) \ ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + 2 * YYSTACK_GAP_MAX) # else # define YYSTACK_BYTES(N) \ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAX) # endif /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ register YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (0) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) # define YYSIZE_T __SIZE_TYPE__ #endif #if ! defined (YYSIZE_T) && defined (size_t) # define YYSIZE_T size_t #endif #if ! defined (YYSIZE_T) # if defined (__STDC__) || defined (__cplusplus) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # endif #endif #if ! defined (YYSIZE_T) # define YYSIZE_T unsigned int #endif #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ { \ yyerror ("syntax error: cannot back up"); \ YYERROR; \ } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Compute the default location (before the actions are run). When YYLLOC_DEFAULT is run, CURRENT is set the location of the first token. By default, to implement support for ranges, extend its range to the last symbol. */ #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ Current.last_line = Rhs[N].last_line; \ Current.last_column = Rhs[N].last_column; #endif /* YYLEX -- calling `yylex' with the right arguments. */ #if YYPURE # if YYLSP_NEEDED # ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) # else # define YYLEX yylex (&yylval, &yylloc) # endif # else /* !YYLSP_NEEDED */ # ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) # else # define YYLEX yylex (&yylval) # endif # endif /* !YYLSP_NEEDED */ #else /* !YYPURE */ # define YYLEX yylex () #endif /* !YYPURE */ /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #if YYMAXDEPTH == 0 # undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #ifdef YYERROR_VERBOSE # ifndef yystrlen # if defined (__GLIBC__) && defined (_STRING_H) # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T # if defined (__STDC__) || defined (__cplusplus) yystrlen (const char *yystr) # else yystrlen (yystr) const char *yystr; # endif { register const char *yys = yystr; while (*yys++ != '\0') continue; return yys - yystr - 1; } # endif # endif # ifndef yystpcpy # if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * # if defined (__STDC__) || defined (__cplusplus) yystpcpy (char *yydest, const char *yysrc) # else yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; # endif { register char *yyd = yydest; register const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif #endif #line 315 "/usr/local/share/bison/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM # if defined (__STDC__) || defined (__cplusplus) # define YYPARSE_PARAM_ARG void *YYPARSE_PARAM # define YYPARSE_PARAM_DECL # else # define YYPARSE_PARAM_ARG YYPARSE_PARAM # define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; # endif #else /* !YYPARSE_PARAM */ # define YYPARSE_PARAM_ARG # define YYPARSE_PARAM_DECL #endif /* !YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ # ifdef YYPARSE_PARAM int yyparse (void *); # else int yyparse (void); # endif #endif /* YY_DECL_VARIABLES -- depending whether we use a pure parser, variables are global, or local to YYPARSE. */ #define YY_DECL_NON_LSP_VARIABLES \ /* The lookahead symbol. */ \ int yychar; \ \ /* The semantic value of the lookahead symbol. */ \ YYSTYPE yylval; \ \ /* Number of parse errors so far. */ \ int yynerrs; #if YYLSP_NEEDED # define YY_DECL_VARIABLES \ YY_DECL_NON_LSP_VARIABLES \ \ /* Location data for the lookahead symbol. */ \ YYLTYPE yylloc; #else # define YY_DECL_VARIABLES \ YY_DECL_NON_LSP_VARIABLES #endif /* If nonreentrant, generate the variables here. */ #if !YYPURE YY_DECL_VARIABLES #endif /* !YYPURE */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { /* If reentrant, generate the variables here. */ #if YYPURE YY_DECL_VARIABLES #endif /* !YYPURE */ register int yystate; register int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Lookahead token as an internal (translated) token number. */ int yychar1 = 0; /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ short yyssa[YYINITDEPTH]; short *yyss = yyssa; register short *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; register YYSTYPE *yyvsp; #if YYLSP_NEEDED /* The location stack. */ YYLTYPE yylsa[YYINITDEPTH]; YYLTYPE *yyls = yylsa; YYLTYPE *yylsp; #endif #if YYLSP_NEEDED # define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else # define YYPOPSTACK (yyvsp--, yyssp--) #endif YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYLSP_NEEDED YYLTYPE yyloc; #endif /* When reducing, the number of symbols on the RHS of the reduced rule. */ int yylen; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; #if YYLSP_NEEDED yylsp = yyls; #endif goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; short *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ # if YYLSP_NEEDED YYLTYPE *yyls1 = yyls; /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow ("parser stack overflow", &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yyls1, yysize * sizeof (*yylsp), &yystacksize); yyls = yyls1; # else yyoverflow ("parser stack overflow", &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); # endif yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyoverflowlab; # else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) goto yyoverflowlab; yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; { short *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyoverflowlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # if YYLSP_NEEDED YYSTACK_RELOCATE (yyls); # endif # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; #if YYLSP_NEEDED yylsp = yyls + yysize - 1; #endif YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyssp >= yyss + yystacksize - 1) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* yyresume: */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; yychar = YYEOF; /* Don't call YYLEX any more */ YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yychar1 = YYTRANSLATE (yychar); #if YYDEBUG /* We have to keep this `#if YYDEBUG', since we use variables which are defined only if `YYDEBUG' is set. */ if (yydebug) { YYFPRINTF (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ # ifdef YYPRINT YYPRINT (stderr, yychar, yylval); # endif YYFPRINTF (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ YYDPRINTF ((stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; #if YYLSP_NEEDED *++yylsp = yylloc; #endif /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to the semantic value of the lookahead token. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; #if YYLSP_NEEDED /* Similarly for the default location. Let the user run additional commands if for instance locations are ranges. */ yyloc = yylsp[1-yylen]; YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); #endif #if YYDEBUG /* We have to keep this `#if YYDEBUG', since we use variables which are defined only if `YYDEBUG' is set. */ if (yydebug) { int yyi; YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++) YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif switch (yyn) { case 1: #line 151 "plural.y" { if (yyvsp[0].exp == NULL) YYABORT; ((struct parse_args *) arg)->res = yyvsp[0].exp; } break; case 2: #line 159 "plural.y" { yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp); } break; case 3: #line 163 "plural.y" { yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp); } break; case 4: #line 167 "plural.y" { yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp); } break; case 5: #line 171 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 6: #line 175 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 7: #line 179 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 8: #line 183 "plural.y" { yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); } break; case 9: #line 187 "plural.y" { yyval.exp = new_exp_1 (lnot, yyvsp[0].exp); } break; case 10: #line 191 "plural.y" { yyval.exp = new_exp_0 (var); } break; case 11: #line 195 "plural.y" { if ((yyval.exp = new_exp_0 (num)) != NULL) yyval.exp->val.num = yyvsp[0].num; } break; case 12: #line 200 "plural.y" { yyval.exp = yyvsp[-1].exp; } break; } #line 705 "/usr/local/share/bison/bison.simple" yyvsp -= yylen; yyssp -= yylen; #if YYLSP_NEEDED yylsp -= yylen; #endif #if YYDEBUG if (yydebug) { short *yyssp1 = yyss - 1; YYFPRINTF (stderr, "state stack now"); while (yyssp1 != yyssp) YYFPRINTF (stderr, " %d", *++yyssp1); YYFPRINTF (stderr, "\n"); } #endif *++yyvsp = yyval; #if YYLSP_NEEDED *++yylsp = yyloc; #endif /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #ifdef YYERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { YYSIZE_T yysize = 0; char *yymsg; int yyx, yycount; yycount = 0; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ for (yyx = yyn < 0 ? -yyn : 0; yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) if (yycheck[yyx + yyn] == yyx) yysize += yystrlen (yytname[yyx]) + 15, yycount++; yysize += yystrlen ("parse error, unexpected ") + 1; yysize += yystrlen (yytname[YYTRANSLATE (yychar)]); yymsg = (char *) YYSTACK_ALLOC (yysize); if (yymsg != 0) { char *yyp = yystpcpy (yymsg, "parse error, unexpected "); yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]); if (yycount < 5) { yycount = 0; for (yyx = yyn < 0 ? -yyn : 0; yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) if (yycheck[yyx + yyn] == yyx) { const char *yyq = ! yycount ? ", expecting " : " or "; yyp = yystpcpy (yyp, yyq); yyp = yystpcpy (yyp, yytname[yyx]); yycount++; } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else yyerror ("parse error; also virtual memory exhausted"); } else #endif /* defined (YYERROR_VERBOSE) */ yyerror ("parse error"); } goto yyerrlab1; /*--------------------------------------------------. | yyerrlab1 -- error raised explicitly by an action | `--------------------------------------------------*/ yyerrlab1: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (yychar == YYEOF) YYABORT; YYDPRINTF ((stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1])); yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ goto yyerrhandle; /*-------------------------------------------------------------------. | yyerrdefault -- current state does not do anything special for the | | error token. | `-------------------------------------------------------------------*/ yyerrdefault: #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ /* If its default is to accept any token, ok. Otherwise pop it. */ yyn = yydefact[yystate]; if (yyn) goto yydefault; #endif /*---------------------------------------------------------------. | yyerrpop -- pop the current state because it cannot handle the | | error token | `---------------------------------------------------------------*/ yyerrpop: if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #if YYLSP_NEEDED yylsp--; #endif #if YYDEBUG if (yydebug) { short *yyssp1 = yyss - 1; YYFPRINTF (stderr, "Error: state stack now"); while (yyssp1 != yyssp) YYFPRINTF (stderr, " %d", *++yyssp1); YYFPRINTF (stderr, "\n"); } #endif /*--------------. | yyerrhandle. | `--------------*/ yyerrhandle: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yyerrdefault; yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) goto yyerrdefault; yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) goto yyerrpop; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; #if YYLSP_NEEDED *++yylsp = yylloc; #endif yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; /*---------------------------------------------. | yyoverflowab -- parser overflow comes here. | `---------------------------------------------*/ yyoverflowlab: yyerror ("parser stack overflow"); yyresult = 2; /* Fall through. */ yyreturn: #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif return yyresult; } #line 205 "plural.y" void internal_function FREE_EXPRESSION (struct expression *exp) { if (exp == NULL) return; /* Handle the recursive case. */ switch (exp->nargs) { case 3: FREE_EXPRESSION (exp->val.args[2]); /* FALLTHROUGH */ case 2: FREE_EXPRESSION (exp->val.args[1]); /* FALLTHROUGH */ case 1: FREE_EXPRESSION (exp->val.args[0]); /* FALLTHROUGH */ default: break; } free (exp); } static int yylex (YYSTYPE *lval, const char **pexp) { const char *exp = *pexp; int result; while (1) { if (exp[0] == '\0') { *pexp = exp; return YYEOF; } if (exp[0] != ' ' && exp[0] != '\t') break; ++exp; } result = *exp++; switch (result) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { unsigned long int n = result - '0'; while (exp[0] >= '0' && exp[0] <= '9') { n *= 10; n += exp[0] - '0'; ++exp; } lval->num = n; result = NUMBER; } break; case '=': if (exp[0] == '=') { ++exp; lval->op = equal; result = EQUOP2; } else result = YYERRCODE; break; case '!': if (exp[0] == '=') { ++exp; lval->op = not_equal; result = EQUOP2; } break; case '&': case '|': if (exp[0] == result) ++exp; else result = YYERRCODE; break; case '<': if (exp[0] == '=') { ++exp; lval->op = less_or_equal; } else lval->op = less_than; result = CMPOP2; break; case '>': if (exp[0] == '=') { ++exp; lval->op = greater_or_equal; } else lval->op = greater_than; result = CMPOP2; break; case '*': lval->op = mult; result = MULOP2; break; case '/': lval->op = divide; result = MULOP2; break; case '%': lval->op = module; result = MULOP2; break; case '+': lval->op = plus; result = ADDOP2; break; case '-': lval->op = minus; result = ADDOP2; break; case 'n': case '?': case ':': case '(': case ')': /* Nothing, just return the character. */ break; case ';': case '\n': case '\0': /* Be safe and let the user call this function again. */ --exp; result = YYEOF; break; default: result = YYERRCODE; #if YYDEBUG != 0 --exp; #endif break; } *pexp = exp; return result; } static void yyerror (const char *str) { /* Do nothing. We don't print error messages here. */ } mdk-1.2.9/intl/ngettext.c0000644000175000017500000000367012110326462012176 00000000000000/* Implementation of ngettext(3) function. Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef _LIBC # define __need_NULL # include #else # include /* Just for NULL. */ #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define NGETTEXT __ngettext # define DCNGETTEXT __dcngettext #else # define NGETTEXT libintl_ngettext # define DCNGETTEXT libintl_dcngettext #endif /* Look up MSGID in the current default message catalog for the current LC_MESSAGES locale. If not found, returns MSGID itself (the default text). */ char * NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n) { return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__ngettext, ngettext); #endif mdk-1.2.9/intl/loadinfo.h0000644000175000017500000001332212110326462012127 00000000000000/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LOADINFO_H #define _LOADINFO_H 1 /* Declarations of locale dependent catalog lookup functions. Implemented in localealias.c Possibly replace a locale name by another. explodename.c Split a locale name into its various fields. l10nflist.c Generate a list of filenames of possible message catalogs. finddomain.c Find and open the relevant message catalogs. The main function _nl_find_domain() in finddomain.c is declared in gettextP.h. */ #ifndef internal_function # define internal_function #endif /* Tell the compiler when a conditional or integer expression is almost always true or almost always false. */ #ifndef HAVE_BUILTIN_EXPECT # define __builtin_expect(expr, val) (expr) #endif /* Separator in PATH like lists of pathnames. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define PATH_SEPARATOR ';' #else /* Unix */ # define PATH_SEPARATOR ':' #endif /* Encoding of locale name parts. */ #define CEN_REVISION 1 #define CEN_SPONSOR 2 #define CEN_SPECIAL 4 #define XPG_NORM_CODESET 8 #define XPG_CODESET 16 #define TERRITORY 32 #define CEN_AUDIENCE 64 #define XPG_MODIFIER 128 #define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE) #define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER) struct loaded_l10nfile { const char *filename; int decided; const void *data; struct loaded_l10nfile *next; struct loaded_l10nfile *successor[1]; }; /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. The return value is dynamically allocated and has to be freed by the caller. */ extern const char *_nl_normalize_codeset (const char *codeset, size_t name_len); /* Lookup a locale dependent file. *L10NFILE_LIST denotes a pool of lookup results of locale dependent files of the same kind, sorted in decreasing order of ->filename. DIRLIST and DIRLIST_LEN are an argz list of directories in which to look, containing at least one directory (i.e. DIRLIST_LEN > 0). MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER, SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as produced by _nl_explode_name(). FILENAME is the filename suffix. The return value is the lookup result, either found in *L10NFILE_LIST, or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. If the return value is non-NULL, it is added to *L10NFILE_LIST, and its ->next field denotes the chaining inside *L10NFILE_LIST, and furthermore its ->successor[] field contains a list of other lookup results from which this lookup result inherits. */ extern struct loaded_l10nfile * _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, const char *dirlist, size_t dirlist_len, int mask, const char *language, const char *territory, const char *codeset, const char *normalized_codeset, const char *modifier, const char *special, const char *sponsor, const char *revision, const char *filename, int do_allocate); /* Lookup the real locale name for a locale alias NAME, or NULL if NAME is not a locale alias (but possibly a real locale name). The return value is statically allocated and must not be freed. */ extern const char *_nl_expand_alias (const char *name); /* Split a locale name NAME into its pieces: language, modifier, territory, codeset, special, sponsor, revision. NAME gets destructively modified: NUL bytes are inserted here and there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a pointer into the old NAME string, or NULL. *NORMALIZED_CODESET gets assigned the expanded *CODESET, if it is different from *CODESET; this one is dynamically allocated and has to be freed by the caller. The return value is a bitmask, where each bit corresponds to one filled-in value: XPG_MODIFIER, CEN_AUDIENCE for *MODIFIER, TERRITORY for *TERRITORY, XPG_CODESET for *CODESET, XPG_NORM_CODESET for *NORMALIZED_CODESET, CEN_SPECIAL for *SPECIAL, CEN_SPONSOR for *SPONSOR, CEN_REVISION for *REVISION. */ extern int _nl_explode_name (char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision); /* Split a locale name NAME into a leading language part and all the rest. Return a pointer to the first character after the language, i.e. to the first byte of the rest. */ extern char *_nl_find_language (const char *name); #endif /* loadinfo.h */ mdk-1.2.9/intl/textdomain.c0000644000175000017500000001066012110326462012505 00000000000000/* Implementation of the textdomain(3) function. Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "gettextP.h" #ifdef _LIBC /* We have to handle multi-threaded applications. */ # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_rwlock_define(CLASS, NAME) # define __libc_rwlock_wrlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_default_domain libintl_nl_default_default_domain # define _nl_current_default_domain libintl_nl_current_default_domain #endif /* @@ end of prolog @@ */ /* Name of the default text domain. */ extern const char _nl_default_default_domain[] attribute_hidden; /* Default text domain in which entries for gettext(3) are to be found. */ extern const char *_nl_current_default_domain attribute_hidden; /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define TEXTDOMAIN __textdomain # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define TEXTDOMAIN libintl_textdomain #endif /* Lock variable to protect the global data in the gettext implementation. */ __libc_rwlock_define (extern, _nl_state_lock attribute_hidden) /* Set the current default message catalog to DOMAINNAME. If DOMAINNAME is null, return the current default. If DOMAINNAME is "", reset to the default of "messages". */ char * TEXTDOMAIN (const char *domainname) { char *new_domain; char *old_domain; /* A NULL pointer requests the current setting. */ if (domainname == NULL) return (char *) _nl_current_default_domain; __libc_rwlock_wrlock (_nl_state_lock); old_domain = (char *) _nl_current_default_domain; /* If domain name is the null string set to default domain "messages". */ if (domainname[0] == '\0' || strcmp (domainname, _nl_default_default_domain) == 0) { _nl_current_default_domain = _nl_default_default_domain; new_domain = (char *) _nl_current_default_domain; } else if (strcmp (domainname, old_domain) == 0) /* This can happen and people will use it to signal that some environment variable changed. */ new_domain = old_domain; else { /* If the following malloc fails `_nl_current_default_domain' will be NULL. This value will be returned and so signals we are out of core. */ #if defined _LIBC || defined HAVE_STRDUP new_domain = strdup (domainname); #else size_t len = strlen (domainname) + 1; new_domain = (char *) malloc (len); if (new_domain != NULL) memcpy (new_domain, domainname, len); #endif if (new_domain != NULL) _nl_current_default_domain = new_domain; } /* We use this possibility to signal a change of the loaded catalogs since this is most likely the case and there is no other easy we to do it. Do it only when the call was successful. */ if (new_domain != NULL) { ++_nl_msg_cat_cntr; if (old_domain != new_domain && old_domain != _nl_default_default_domain) free (old_domain); } __libc_rwlock_unlock (_nl_state_lock); return new_domain; } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__textdomain, textdomain); #endif mdk-1.2.9/intl/vasnwprintf.h0000644000175000017500000000330212110326462012712 00000000000000/* vswprintf with automatic memory allocation. Copyright (C) 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _VASNWPRINTF_H #define _VASNWPRINTF_H /* Get va_list. */ #include /* Get wchar_t, size_t. */ #include #ifdef __cplusplus extern "C" { #endif /* Write formatted output to a string dynamically allocated with malloc(). You can pass a preallocated buffer for the result in RESULTBUF and its size in *LENGTHP; otherwise you pass RESULTBUF = NULL. If successful, return the address of the string (this may be = RESULTBUF if no dynamic memory allocation was necessary) and set *LENGTHP to the number of resulting bytes, excluding the trailing NUL. Upon error, set errno and return NULL. */ extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...); extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args); #ifdef __cplusplus } #endif #endif /* _VASNWPRINTF_H */ mdk-1.2.9/intl/finddomain.c0000644000175000017500000001274312110326462012445 00000000000000/* Handle list of needed message catalogs Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #if defined HAVE_UNISTD_H || defined _LIBC # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* List of already loaded domains. */ static struct loaded_l10nfile *_nl_loaded_domains; /* Return a data structure describing the message catalog described by the DOMAINNAME and CATEGORY parameters with respect to the currently established bindings. */ struct loaded_l10nfile * internal_function _nl_find_domain (const char *dirname, char *locale, const char *domainname, struct binding *domainbinding) { struct loaded_l10nfile *retval; const char *language; const char *modifier; const char *territory; const char *codeset; const char *normalized_codeset; const char *special; const char *sponsor; const char *revision; const char *alias_value; int mask; /* LOCALE can consist of up to four recognized parts for the XPG syntax: language[_territory[.codeset]][@modifier] and six parts for the CEN syntax: language[_territory][+audience][+special][,[sponsor][_revision]] Beside the first part all of them are allowed to be missing. If the full specified locale is not found, the less specific one are looked for. The various parts will be stripped off according to the following order: (1) revision (2) sponsor (3) special (4) codeset (5) normalized codeset (6) territory (7) audience/modifier */ /* If we have already tested for this locale entry there has to be one data set in the list of loaded domains. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, 0, locale, NULL, NULL, NULL, NULL, NULL, NULL, NULL, domainname, 0); if (retval != NULL) { /* We know something about this locale. */ int cnt; if (retval->decided == 0) _nl_load_domain (retval, domainbinding); if (retval->data != NULL) return retval; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt], domainbinding); if (retval->successor[cnt]->data != NULL) break; } return cnt >= 0 ? retval : NULL; /* NOTREACHED */ } /* See whether the locale value is an alias. If yes its value *overwrites* the alias name. No test for the original value is done. */ alias_value = _nl_expand_alias (locale); if (alias_value != NULL) { #if defined _LIBC || defined HAVE_STRDUP locale = strdup (alias_value); if (locale == NULL) return NULL; #else size_t len = strlen (alias_value) + 1; locale = (char *) malloc (len); if (locale == NULL) return NULL; memcpy (locale, alias_value, len); #endif } /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = _nl_explode_name (locale, &language, &modifier, &territory, &codeset, &normalized_codeset, &special, &sponsor, &revision); /* Create all possible locale entries which might be interested in generalization. */ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, strlen (dirname) + 1, mask, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, domainname, 1); if (retval == NULL) /* This means we are out of core. */ return NULL; if (retval->decided == 0) _nl_load_domain (retval, domainbinding); if (retval->data == NULL) { int cnt; for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) { if (retval->successor[cnt]->decided == 0) _nl_load_domain (retval->successor[cnt], domainbinding); if (retval->successor[cnt]->data != NULL) break; } } /* The room for an alias was dynamically allocated. Free it now. */ if (alias_value != NULL) free (locale); /* The space for normalized_codeset is dynamically allocated. Free it. */ if (mask & XPG_NORM_CODESET) free ((void *) normalized_codeset); return retval; } #ifdef _LIBC libc_freeres_fn (free_mem) { struct loaded_l10nfile *runp = _nl_loaded_domains; while (runp != NULL) { struct loaded_l10nfile *here = runp; if (runp->data != NULL) _nl_unload_domain ((struct loaded_domain *) runp->data); runp = runp->next; free ((char *) here->filename); free (here); } } #endif mdk-1.2.9/intl/bindtextdom.c0000644000175000017500000002312012110326462012645 00000000000000/* Implementation of the bindtextdomain(3) function Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif #include "gettextP.h" #ifdef _LIBC /* We have to handle multi-threaded applications. */ # include #else /* Provide dummy implementation if this is outside glibc. */ # define __libc_rwlock_define(CLASS, NAME) # define __libc_rwlock_wrlock(NAME) # define __libc_rwlock_unlock(NAME) #endif /* The internal variables in the standalone libintl.a must have different names than the internal variables in GNU libc, otherwise programs using libintl.a cannot be linked statically. */ #if !defined _LIBC # define _nl_default_dirname libintl_nl_default_dirname # define _nl_domain_bindings libintl_nl_domain_bindings #endif /* Some compilers, like SunOS4 cc, don't have offsetof in . */ #ifndef offsetof # define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) #endif /* @@ end of prolog @@ */ /* Contains the default location of the message catalogs. */ extern const char _nl_default_dirname[]; #ifdef _LIBC extern const char _nl_default_dirname_internal[] attribute_hidden; #else # define INTUSE(name) name #endif /* List with bindings of specific domains. */ extern struct binding *_nl_domain_bindings; /* Lock variable to protect the global data in the gettext implementation. */ __libc_rwlock_define (extern, _nl_state_lock attribute_hidden) /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define BINDTEXTDOMAIN __bindtextdomain # define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset # ifndef strdup # define strdup(str) __strdup (str) # endif #else # define BINDTEXTDOMAIN libintl_bindtextdomain # define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset #endif /* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP to be used for the DOMAINNAME message catalog. If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not modified, only the current value is returned. If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither modified nor returned. */ static void set_binding_values (const char *domainname, const char **dirnamep, const char **codesetp) { struct binding *binding; int modified; /* Some sanity checks. */ if (domainname == NULL || domainname[0] == '\0') { if (dirnamep) *dirnamep = NULL; if (codesetp) *codesetp = NULL; return; } __libc_rwlock_wrlock (_nl_state_lock); modified = 0; for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) { int compare = strcmp (domainname, binding->domainname); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It is not in the list. */ binding = NULL; break; } } if (binding != NULL) { if (dirnamep) { const char *dirname = *dirnamep; if (dirname == NULL) /* The current binding has be to returned. */ *dirnamep = binding->dirname; else { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ char *result = binding->dirname; if (strcmp (dirname, result) != 0) { if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) result = (char *) INTUSE(_nl_default_dirname); else { #if defined _LIBC || defined HAVE_STRDUP result = strdup (dirname); #else size_t len = strlen (dirname) + 1; result = (char *) malloc (len); if (__builtin_expect (result != NULL, 1)) memcpy (result, dirname, len); #endif } if (__builtin_expect (result != NULL, 1)) { if (binding->dirname != INTUSE(_nl_default_dirname)) free (binding->dirname); binding->dirname = result; modified = 1; } } *dirnamep = result; } } if (codesetp) { const char *codeset = *codesetp; if (codeset == NULL) /* The current binding has be to returned. */ *codesetp = binding->codeset; else { /* The domain is already bound. If the new value and the old one are equal we simply do nothing. Otherwise replace the old binding. */ char *result = binding->codeset; if (result == NULL || strcmp (codeset, result) != 0) { #if defined _LIBC || defined HAVE_STRDUP result = strdup (codeset); #else size_t len = strlen (codeset) + 1; result = (char *) malloc (len); if (__builtin_expect (result != NULL, 1)) memcpy (result, codeset, len); #endif if (__builtin_expect (result != NULL, 1)) { if (binding->codeset != NULL) free (binding->codeset); binding->codeset = result; binding->codeset_cntr++; modified = 1; } } *codesetp = result; } } } else if ((dirnamep == NULL || *dirnamep == NULL) && (codesetp == NULL || *codesetp == NULL)) { /* Simply return the default values. */ if (dirnamep) *dirnamep = INTUSE(_nl_default_dirname); if (codesetp) *codesetp = NULL; } else { /* We have to create a new binding. */ size_t len = strlen (domainname) + 1; struct binding *new_binding = (struct binding *) malloc (offsetof (struct binding, domainname) + len); if (__builtin_expect (new_binding == NULL, 0)) goto failed; memcpy (new_binding->domainname, domainname, len); if (dirnamep) { const char *dirname = *dirnamep; if (dirname == NULL) /* The default value. */ dirname = INTUSE(_nl_default_dirname); else { if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0) dirname = INTUSE(_nl_default_dirname); else { char *result; #if defined _LIBC || defined HAVE_STRDUP result = strdup (dirname); if (__builtin_expect (result == NULL, 0)) goto failed_dirname; #else size_t len = strlen (dirname) + 1; result = (char *) malloc (len); if (__builtin_expect (result == NULL, 0)) goto failed_dirname; memcpy (result, dirname, len); #endif dirname = result; } } *dirnamep = dirname; new_binding->dirname = (char *) dirname; } else /* The default value. */ new_binding->dirname = (char *) INTUSE(_nl_default_dirname); new_binding->codeset_cntr = 0; if (codesetp) { const char *codeset = *codesetp; if (codeset != NULL) { char *result; #if defined _LIBC || defined HAVE_STRDUP result = strdup (codeset); if (__builtin_expect (result == NULL, 0)) goto failed_codeset; #else size_t len = strlen (codeset) + 1; result = (char *) malloc (len); if (__builtin_expect (result == NULL, 0)) goto failed_codeset; memcpy (result, codeset, len); #endif codeset = result; new_binding->codeset_cntr++; } *codesetp = codeset; new_binding->codeset = (char *) codeset; } else new_binding->codeset = NULL; /* Now enqueue it. */ if (_nl_domain_bindings == NULL || strcmp (domainname, _nl_domain_bindings->domainname) < 0) { new_binding->next = _nl_domain_bindings; _nl_domain_bindings = new_binding; } else { binding = _nl_domain_bindings; while (binding->next != NULL && strcmp (domainname, binding->next->domainname) > 0) binding = binding->next; new_binding->next = binding->next; binding->next = new_binding; } modified = 1; /* Here we deal with memory allocation failures. */ if (0) { failed_codeset: if (new_binding->dirname != INTUSE(_nl_default_dirname)) free (new_binding->dirname); failed_dirname: free (new_binding); failed: if (dirnamep) *dirnamep = NULL; if (codesetp) *codesetp = NULL; } } /* If we modified any binding, we flush the caches. */ if (modified) ++_nl_msg_cat_cntr; __libc_rwlock_unlock (_nl_state_lock); } /* Specify that the DOMAINNAME message catalog will be found in DIRNAME rather than in the system locale data base. */ char * BINDTEXTDOMAIN (const char *domainname, const char *dirname) { set_binding_values (domainname, &dirname, NULL); return (char *) dirname; } /* Specify the character encoding in which the messages from the DOMAINNAME message catalog will be returned. */ char * BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset) { set_binding_values (domainname, NULL, &codeset); return (char *) codeset; } #ifdef _LIBC /* Aliases for function names in GNU C Library. */ weak_alias (__bindtextdomain, bindtextdomain); weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset); #endif mdk-1.2.9/intl/explodename.c0000644000175000017500000001064312110326462012633 00000000000000/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ char * _nl_find_language (const char *name) { while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '+' && name[0] != ',') ++name; return (char *) name; } int _nl_explode_name (char *name, const char **language, const char **modifier, const char **territory, const char **codeset, const char **normalized_codeset, const char **special, const char **sponsor, const char **revision) { enum { undecided, xpg, cen } syntax; char *cp; int mask; *modifier = NULL; *territory = NULL; *codeset = NULL; *normalized_codeset = NULL; *special = NULL; *sponsor = NULL; *revision = NULL; /* Now we determine the single parts of the locale name. First look for the language. Termination symbols are `_' and `@' if we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */ mask = 0; syntax = undecided; *language = cp = name; cp = _nl_find_language (*language); if (*language == cp) /* This does not make sense: language has to be specified. Use this entry as it is without exploding. Perhaps it is an alias. */ cp = strchr (*language, '\0'); else if (cp[0] == '_') { /* Next is the territory. */ cp[0] = '\0'; *territory = ++cp; while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= TERRITORY; if (cp[0] == '.') { /* Next is the codeset. */ syntax = xpg; cp[0] = '\0'; *codeset = ++cp; while (cp[0] != '\0' && cp[0] != '@') ++cp; mask |= XPG_CODESET; if (*codeset != cp && (*codeset)[0] != '\0') { *normalized_codeset = _nl_normalize_codeset (*codeset, cp - *codeset); if (strcmp (*codeset, *normalized_codeset) == 0) free ((char *) *normalized_codeset); else mask |= XPG_NORM_CODESET; } } } if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) { /* Next is the modifier. */ syntax = cp[0] == '@' ? xpg : cen; cp[0] = '\0'; *modifier = ++cp; while (syntax == cen && cp[0] != '\0' && cp[0] != '+' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= XPG_MODIFIER | CEN_AUDIENCE; } if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_')) { syntax = cen; if (cp[0] == '+') { /* Next is special application (CEN syntax). */ cp[0] = '\0'; *special = ++cp; while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_') ++cp; mask |= CEN_SPECIAL; } if (cp[0] == ',') { /* Next is sponsor (CEN syntax). */ cp[0] = '\0'; *sponsor = ++cp; while (cp[0] != '\0' && cp[0] != '_') ++cp; mask |= CEN_SPONSOR; } if (cp[0] == '_') { /* Next is revision (CEN syntax). */ cp[0] = '\0'; *revision = ++cp; mask |= CEN_REVISION; } } /* For CEN syntax values it might be important to have the separator character in the file name, not for XPG syntax. */ if (syntax == xpg) { if (*territory != NULL && (*territory)[0] == '\0') mask &= ~TERRITORY; if (*codeset != NULL && (*codeset)[0] == '\0') mask &= ~XPG_CODESET; if (*modifier != NULL && (*modifier)[0] == '\0') mask &= ~XPG_MODIFIER; } return mask; } mdk-1.2.9/intl/localename.c0000644000175000017500000007413512110326462012440 00000000000000/* Determine the current selected locale. Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Ulrich Drepper , 1995. */ /* Win32 code written by Tor Lillqvist . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #if defined _WIN32 || defined __WIN32__ # undef WIN32 /* avoid warning on mingw32 */ # define WIN32 #endif #ifdef WIN32 # define WIN32_LEAN_AND_MEAN # include /* List of language codes, sorted by value: 0x01 LANG_ARABIC 0x02 LANG_BULGARIAN 0x03 LANG_CATALAN 0x04 LANG_CHINESE 0x05 LANG_CZECH 0x06 LANG_DANISH 0x07 LANG_GERMAN 0x08 LANG_GREEK 0x09 LANG_ENGLISH 0x0a LANG_SPANISH 0x0b LANG_FINNISH 0x0c LANG_FRENCH 0x0d LANG_HEBREW 0x0e LANG_HUNGARIAN 0x0f LANG_ICELANDIC 0x10 LANG_ITALIAN 0x11 LANG_JAPANESE 0x12 LANG_KOREAN 0x13 LANG_DUTCH 0x14 LANG_NORWEGIAN 0x15 LANG_POLISH 0x16 LANG_PORTUGUESE 0x17 LANG_RHAETO_ROMANCE 0x18 LANG_ROMANIAN 0x19 LANG_RUSSIAN 0x1a LANG_CROATIAN == LANG_SERBIAN 0x1b LANG_SLOVAK 0x1c LANG_ALBANIAN 0x1d LANG_SWEDISH 0x1e LANG_THAI 0x1f LANG_TURKISH 0x20 LANG_URDU 0x21 LANG_INDONESIAN 0x22 LANG_UKRAINIAN 0x23 LANG_BELARUSIAN 0x24 LANG_SLOVENIAN 0x25 LANG_ESTONIAN 0x26 LANG_LATVIAN 0x27 LANG_LITHUANIAN 0x28 LANG_TAJIK 0x29 LANG_FARSI 0x2a LANG_VIETNAMESE 0x2b LANG_ARMENIAN 0x2c LANG_AZERI 0x2d LANG_BASQUE 0x2e LANG_SORBIAN 0x2f LANG_MACEDONIAN 0x30 LANG_SUTU 0x31 LANG_TSONGA 0x32 LANG_TSWANA 0x33 LANG_VENDA 0x34 LANG_XHOSA 0x35 LANG_ZULU 0x36 LANG_AFRIKAANS 0x37 LANG_GEORGIAN 0x38 LANG_FAEROESE 0x39 LANG_HINDI 0x3a LANG_MALTESE 0x3b LANG_SAAMI 0x3c LANG_GAELIC 0x3d LANG_YIDDISH 0x3e LANG_MALAY 0x3f LANG_KAZAK 0x40 LANG_KYRGYZ 0x41 LANG_SWAHILI 0x42 LANG_TURKMEN 0x43 LANG_UZBEK 0x44 LANG_TATAR 0x45 LANG_BENGALI 0x46 LANG_PUNJABI 0x47 LANG_GUJARATI 0x48 LANG_ORIYA 0x49 LANG_TAMIL 0x4a LANG_TELUGU 0x4b LANG_KANNADA 0x4c LANG_MALAYALAM 0x4d LANG_ASSAMESE 0x4e LANG_MARATHI 0x4f LANG_SANSKRIT 0x50 LANG_MONGOLIAN 0x51 LANG_TIBETAN 0x52 LANG_WELSH 0x53 LANG_CAMBODIAN 0x54 LANG_LAO 0x55 LANG_BURMESE 0x56 LANG_GALICIAN 0x57 LANG_KONKANI 0x58 LANG_MANIPURI 0x59 LANG_SINDHI 0x5a LANG_SYRIAC 0x5b LANG_SINHALESE 0x5c LANG_CHEROKEE 0x5d LANG_INUKTITUT 0x5e LANG_AMHARIC 0x5f LANG_TAMAZIGHT 0x60 LANG_KASHMIRI 0x61 LANG_NEPALI 0x62 LANG_FRISIAN 0x63 LANG_PASHTO 0x64 LANG_TAGALOG 0x65 LANG_DIVEHI 0x66 LANG_EDO 0x67 LANG_FULFULDE 0x68 LANG_HAUSA 0x69 LANG_IBIBIO 0x6a LANG_YORUBA 0x70 LANG_IGBO 0x71 LANG_KANURI 0x72 LANG_OROMO 0x73 LANG_TIGRINYA 0x74 LANG_GUARANI 0x75 LANG_HAWAIIAN 0x76 LANG_LATIN 0x77 LANG_SOMALI 0x78 LANG_YI 0x79 LANG_PAPIAMENTU */ /* Mingw headers don't have latest language and sublanguage codes. */ # ifndef LANG_AFRIKAANS # define LANG_AFRIKAANS 0x36 # endif # ifndef LANG_ALBANIAN # define LANG_ALBANIAN 0x1c # endif # ifndef LANG_AMHARIC # define LANG_AMHARIC 0x5e # endif # ifndef LANG_ARABIC # define LANG_ARABIC 0x01 # endif # ifndef LANG_ARMENIAN # define LANG_ARMENIAN 0x2b # endif # ifndef LANG_ASSAMESE # define LANG_ASSAMESE 0x4d # endif # ifndef LANG_AZERI # define LANG_AZERI 0x2c # endif # ifndef LANG_BASQUE # define LANG_BASQUE 0x2d # endif # ifndef LANG_BELARUSIAN # define LANG_BELARUSIAN 0x23 # endif # ifndef LANG_BENGALI # define LANG_BENGALI 0x45 # endif # ifndef LANG_BURMESE # define LANG_BURMESE 0x55 # endif # ifndef LANG_CAMBODIAN # define LANG_CAMBODIAN 0x53 # endif # ifndef LANG_CATALAN # define LANG_CATALAN 0x03 # endif # ifndef LANG_CHEROKEE # define LANG_CHEROKEE 0x5c # endif # ifndef LANG_DIVEHI # define LANG_DIVEHI 0x65 # endif # ifndef LANG_EDO # define LANG_EDO 0x66 # endif # ifndef LANG_ESTONIAN # define LANG_ESTONIAN 0x25 # endif # ifndef LANG_FAEROESE # define LANG_FAEROESE 0x38 # endif # ifndef LANG_FARSI # define LANG_FARSI 0x29 # endif # ifndef LANG_FRISIAN # define LANG_FRISIAN 0x62 # endif # ifndef LANG_FULFULDE # define LANG_FULFULDE 0x67 # endif # ifndef LANG_GAELIC # define LANG_GAELIC 0x3c # endif # ifndef LANG_GALICIAN # define LANG_GALICIAN 0x56 # endif # ifndef LANG_GEORGIAN # define LANG_GEORGIAN 0x37 # endif # ifndef LANG_GUARANI # define LANG_GUARANI 0x74 # endif # ifndef LANG_GUJARATI # define LANG_GUJARATI 0x47 # endif # ifndef LANG_HAUSA # define LANG_HAUSA 0x68 # endif # ifndef LANG_HAWAIIAN # define LANG_HAWAIIAN 0x75 # endif # ifndef LANG_HEBREW # define LANG_HEBREW 0x0d # endif # ifndef LANG_HINDI # define LANG_HINDI 0x39 # endif # ifndef LANG_IBIBIO # define LANG_IBIBIO 0x69 # endif # ifndef LANG_IGBO # define LANG_IGBO 0x70 # endif # ifndef LANG_INDONESIAN # define LANG_INDONESIAN 0x21 # endif # ifndef LANG_INUKTITUT # define LANG_INUKTITUT 0x5d # endif # ifndef LANG_KANNADA # define LANG_KANNADA 0x4b # endif # ifndef LANG_KANURI # define LANG_KANURI 0x71 # endif # ifndef LANG_KASHMIRI # define LANG_KASHMIRI 0x60 # endif # ifndef LANG_KAZAK # define LANG_KAZAK 0x3f # endif # ifndef LANG_KONKANI # define LANG_KONKANI 0x57 # endif # ifndef LANG_KYRGYZ # define LANG_KYRGYZ 0x40 # endif # ifndef LANG_LAO # define LANG_LAO 0x54 # endif # ifndef LANG_LATIN # define LANG_LATIN 0x76 # endif # ifndef LANG_LATVIAN # define LANG_LATVIAN 0x26 # endif # ifndef LANG_LITHUANIAN # define LANG_LITHUANIAN 0x27 # endif # ifndef LANG_MACEDONIAN # define LANG_MACEDONIAN 0x2f # endif # ifndef LANG_MALAY # define LANG_MALAY 0x3e # endif # ifndef LANG_MALAYALAM # define LANG_MALAYALAM 0x4c # endif # ifndef LANG_MALTESE # define LANG_MALTESE 0x3a # endif # ifndef LANG_MANIPURI # define LANG_MANIPURI 0x58 # endif # ifndef LANG_MARATHI # define LANG_MARATHI 0x4e # endif # ifndef LANG_MONGOLIAN # define LANG_MONGOLIAN 0x50 # endif # ifndef LANG_NEPALI # define LANG_NEPALI 0x61 # endif # ifndef LANG_ORIYA # define LANG_ORIYA 0x48 # endif # ifndef LANG_OROMO # define LANG_OROMO 0x72 # endif # ifndef LANG_PAPIAMENTU # define LANG_PAPIAMENTU 0x79 # endif # ifndef LANG_PASHTO # define LANG_PASHTO 0x63 # endif # ifndef LANG_PUNJABI # define LANG_PUNJABI 0x46 # endif # ifndef LANG_RHAETO_ROMANCE # define LANG_RHAETO_ROMANCE 0x17 # endif # ifndef LANG_SAAMI # define LANG_SAAMI 0x3b # endif # ifndef LANG_SANSKRIT # define LANG_SANSKRIT 0x4f # endif # ifndef LANG_SERBIAN # define LANG_SERBIAN 0x1a # endif # ifndef LANG_SINDHI # define LANG_SINDHI 0x59 # endif # ifndef LANG_SINHALESE # define LANG_SINHALESE 0x5b # endif # ifndef LANG_SLOVAK # define LANG_SLOVAK 0x1b # endif # ifndef LANG_SOMALI # define LANG_SOMALI 0x77 # endif # ifndef LANG_SORBIAN # define LANG_SORBIAN 0x2e # endif # ifndef LANG_SUTU # define LANG_SUTU 0x30 # endif # ifndef LANG_SWAHILI # define LANG_SWAHILI 0x41 # endif # ifndef LANG_SYRIAC # define LANG_SYRIAC 0x5a # endif # ifndef LANG_TAGALOG # define LANG_TAGALOG 0x64 # endif # ifndef LANG_TAJIK # define LANG_TAJIK 0x28 # endif # ifndef LANG_TAMAZIGHT # define LANG_TAMAZIGHT 0x5f # endif # ifndef LANG_TAMIL # define LANG_TAMIL 0x49 # endif # ifndef LANG_TATAR # define LANG_TATAR 0x44 # endif # ifndef LANG_TELUGU # define LANG_TELUGU 0x4a # endif # ifndef LANG_THAI # define LANG_THAI 0x1e # endif # ifndef LANG_TIBETAN # define LANG_TIBETAN 0x51 # endif # ifndef LANG_TIGRINYA # define LANG_TIGRINYA 0x73 # endif # ifndef LANG_TSONGA # define LANG_TSONGA 0x31 # endif # ifndef LANG_TSWANA # define LANG_TSWANA 0x32 # endif # ifndef LANG_TURKMEN # define LANG_TURKMEN 0x42 # endif # ifndef LANG_UKRAINIAN # define LANG_UKRAINIAN 0x22 # endif # ifndef LANG_URDU # define LANG_URDU 0x20 # endif # ifndef LANG_UZBEK # define LANG_UZBEK 0x43 # endif # ifndef LANG_VENDA # define LANG_VENDA 0x33 # endif # ifndef LANG_VIETNAMESE # define LANG_VIETNAMESE 0x2a # endif # ifndef LANG_WELSH # define LANG_WELSH 0x52 # endif # ifndef LANG_XHOSA # define LANG_XHOSA 0x34 # endif # ifndef LANG_YI # define LANG_YI 0x78 # endif # ifndef LANG_YIDDISH # define LANG_YIDDISH 0x3d # endif # ifndef LANG_YORUBA # define LANG_YORUBA 0x6a # endif # ifndef LANG_ZULU # define LANG_ZULU 0x35 # endif # ifndef SUBLANG_ARABIC_SAUDI_ARABIA # define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 # endif # ifndef SUBLANG_ARABIC_IRAQ # define SUBLANG_ARABIC_IRAQ 0x02 # endif # ifndef SUBLANG_ARABIC_EGYPT # define SUBLANG_ARABIC_EGYPT 0x03 # endif # ifndef SUBLANG_ARABIC_LIBYA # define SUBLANG_ARABIC_LIBYA 0x04 # endif # ifndef SUBLANG_ARABIC_ALGERIA # define SUBLANG_ARABIC_ALGERIA 0x05 # endif # ifndef SUBLANG_ARABIC_MOROCCO # define SUBLANG_ARABIC_MOROCCO 0x06 # endif # ifndef SUBLANG_ARABIC_TUNISIA # define SUBLANG_ARABIC_TUNISIA 0x07 # endif # ifndef SUBLANG_ARABIC_OMAN # define SUBLANG_ARABIC_OMAN 0x08 # endif # ifndef SUBLANG_ARABIC_YEMEN # define SUBLANG_ARABIC_YEMEN 0x09 # endif # ifndef SUBLANG_ARABIC_SYRIA # define SUBLANG_ARABIC_SYRIA 0x0a # endif # ifndef SUBLANG_ARABIC_JORDAN # define SUBLANG_ARABIC_JORDAN 0x0b # endif # ifndef SUBLANG_ARABIC_LEBANON # define SUBLANG_ARABIC_LEBANON 0x0c # endif # ifndef SUBLANG_ARABIC_KUWAIT # define SUBLANG_ARABIC_KUWAIT 0x0d # endif # ifndef SUBLANG_ARABIC_UAE # define SUBLANG_ARABIC_UAE 0x0e # endif # ifndef SUBLANG_ARABIC_BAHRAIN # define SUBLANG_ARABIC_BAHRAIN 0x0f # endif # ifndef SUBLANG_ARABIC_QATAR # define SUBLANG_ARABIC_QATAR 0x10 # endif # ifndef SUBLANG_AZERI_LATIN # define SUBLANG_AZERI_LATIN 0x01 # endif # ifndef SUBLANG_AZERI_CYRILLIC # define SUBLANG_AZERI_CYRILLIC 0x02 # endif # ifndef SUBLANG_BENGALI_INDIA # define SUBLANG_BENGALI_INDIA 0x00 # endif # ifndef SUBLANG_BENGALI_BANGLADESH # define SUBLANG_BENGALI_BANGLADESH 0x01 # endif # ifndef SUBLANG_CHINESE_MACAU # define SUBLANG_CHINESE_MACAU 0x05 # endif # ifndef SUBLANG_ENGLISH_SOUTH_AFRICA # define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 # endif # ifndef SUBLANG_ENGLISH_JAMAICA # define SUBLANG_ENGLISH_JAMAICA 0x08 # endif # ifndef SUBLANG_ENGLISH_CARIBBEAN # define SUBLANG_ENGLISH_CARIBBEAN 0x09 # endif # ifndef SUBLANG_ENGLISH_BELIZE # define SUBLANG_ENGLISH_BELIZE 0x0a # endif # ifndef SUBLANG_ENGLISH_TRINIDAD # define SUBLANG_ENGLISH_TRINIDAD 0x0b # endif # ifndef SUBLANG_ENGLISH_ZIMBABWE # define SUBLANG_ENGLISH_ZIMBABWE 0x0c # endif # ifndef SUBLANG_ENGLISH_PHILIPPINES # define SUBLANG_ENGLISH_PHILIPPINES 0x0d # endif # ifndef SUBLANG_ENGLISH_INDONESIA # define SUBLANG_ENGLISH_INDONESIA 0x0e # endif # ifndef SUBLANG_ENGLISH_HONGKONG # define SUBLANG_ENGLISH_HONGKONG 0x0f # endif # ifndef SUBLANG_ENGLISH_INDIA # define SUBLANG_ENGLISH_INDIA 0x10 # endif # ifndef SUBLANG_ENGLISH_MALAYSIA # define SUBLANG_ENGLISH_MALAYSIA 0x11 # endif # ifndef SUBLANG_ENGLISH_SINGAPORE # define SUBLANG_ENGLISH_SINGAPORE 0x12 # endif # ifndef SUBLANG_FRENCH_LUXEMBOURG # define SUBLANG_FRENCH_LUXEMBOURG 0x05 # endif # ifndef SUBLANG_FRENCH_MONACO # define SUBLANG_FRENCH_MONACO 0x06 # endif # ifndef SUBLANG_FRENCH_WESTINDIES # define SUBLANG_FRENCH_WESTINDIES 0x07 # endif # ifndef SUBLANG_FRENCH_REUNION # define SUBLANG_FRENCH_REUNION 0x08 # endif # ifndef SUBLANG_FRENCH_CONGO # define SUBLANG_FRENCH_CONGO 0x09 # endif # ifndef SUBLANG_FRENCH_SENEGAL # define SUBLANG_FRENCH_SENEGAL 0x0a # endif # ifndef SUBLANG_FRENCH_CAMEROON # define SUBLANG_FRENCH_CAMEROON 0x0b # endif # ifndef SUBLANG_FRENCH_COTEDIVOIRE # define SUBLANG_FRENCH_COTEDIVOIRE 0x0c # endif # ifndef SUBLANG_FRENCH_MALI # define SUBLANG_FRENCH_MALI 0x0d # endif # ifndef SUBLANG_FRENCH_MOROCCO # define SUBLANG_FRENCH_MOROCCO 0x0e # endif # ifndef SUBLANG_FRENCH_HAITI # define SUBLANG_FRENCH_HAITI 0x0f # endif # ifndef SUBLANG_GERMAN_LUXEMBOURG # define SUBLANG_GERMAN_LUXEMBOURG 0x04 # endif # ifndef SUBLANG_GERMAN_LIECHTENSTEIN # define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 # endif # ifndef SUBLANG_KASHMIRI_INDIA # define SUBLANG_KASHMIRI_INDIA 0x02 # endif # ifndef SUBLANG_MALAY_MALAYSIA # define SUBLANG_MALAY_MALAYSIA 0x01 # endif # ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM # define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 # endif # ifndef SUBLANG_NEPALI_INDIA # define SUBLANG_NEPALI_INDIA 0x02 # endif # ifndef SUBLANG_PUNJABI_INDIA # define SUBLANG_PUNJABI_INDIA 0x00 # endif # ifndef SUBLANG_PUNJABI_PAKISTAN # define SUBLANG_PUNJABI_PAKISTAN 0x01 # endif # ifndef SUBLANG_ROMANIAN_ROMANIA # define SUBLANG_ROMANIAN_ROMANIA 0x00 # endif # ifndef SUBLANG_ROMANIAN_MOLDOVA # define SUBLANG_ROMANIAN_MOLDOVA 0x01 # endif # ifndef SUBLANG_SERBIAN_LATIN # define SUBLANG_SERBIAN_LATIN 0x02 # endif # ifndef SUBLANG_SERBIAN_CYRILLIC # define SUBLANG_SERBIAN_CYRILLIC 0x03 # endif # ifndef SUBLANG_SINDHI_INDIA # define SUBLANG_SINDHI_INDIA 0x00 # endif # ifndef SUBLANG_SINDHI_PAKISTAN # define SUBLANG_SINDHI_PAKISTAN 0x01 # endif # ifndef SUBLANG_SPANISH_GUATEMALA # define SUBLANG_SPANISH_GUATEMALA 0x04 # endif # ifndef SUBLANG_SPANISH_COSTA_RICA # define SUBLANG_SPANISH_COSTA_RICA 0x05 # endif # ifndef SUBLANG_SPANISH_PANAMA # define SUBLANG_SPANISH_PANAMA 0x06 # endif # ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC # define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 # endif # ifndef SUBLANG_SPANISH_VENEZUELA # define SUBLANG_SPANISH_VENEZUELA 0x08 # endif # ifndef SUBLANG_SPANISH_COLOMBIA # define SUBLANG_SPANISH_COLOMBIA 0x09 # endif # ifndef SUBLANG_SPANISH_PERU # define SUBLANG_SPANISH_PERU 0x0a # endif # ifndef SUBLANG_SPANISH_ARGENTINA # define SUBLANG_SPANISH_ARGENTINA 0x0b # endif # ifndef SUBLANG_SPANISH_ECUADOR # define SUBLANG_SPANISH_ECUADOR 0x0c # endif # ifndef SUBLANG_SPANISH_CHILE # define SUBLANG_SPANISH_CHILE 0x0d # endif # ifndef SUBLANG_SPANISH_URUGUAY # define SUBLANG_SPANISH_URUGUAY 0x0e # endif # ifndef SUBLANG_SPANISH_PARAGUAY # define SUBLANG_SPANISH_PARAGUAY 0x0f # endif # ifndef SUBLANG_SPANISH_BOLIVIA # define SUBLANG_SPANISH_BOLIVIA 0x10 # endif # ifndef SUBLANG_SPANISH_EL_SALVADOR # define SUBLANG_SPANISH_EL_SALVADOR 0x11 # endif # ifndef SUBLANG_SPANISH_HONDURAS # define SUBLANG_SPANISH_HONDURAS 0x12 # endif # ifndef SUBLANG_SPANISH_NICARAGUA # define SUBLANG_SPANISH_NICARAGUA 0x13 # endif # ifndef SUBLANG_SPANISH_PUERTO_RICO # define SUBLANG_SPANISH_PUERTO_RICO 0x14 # endif # ifndef SUBLANG_SWEDISH_FINLAND # define SUBLANG_SWEDISH_FINLAND 0x02 # endif # ifndef SUBLANG_TAMAZIGHT_ARABIC # define SUBLANG_TAMAZIGHT_ARABIC 0x01 # endif # ifndef SUBLANG_TAMAZIGHT_LATIN # define SUBLANG_TAMAZIGHT_LATIN 0x02 # endif # ifndef SUBLANG_TIGRINYA_ETHIOPIA # define SUBLANG_TIGRINYA_ETHIOPIA 0x00 # endif # ifndef SUBLANG_TIGRINYA_ERITREA # define SUBLANG_TIGRINYA_ERITREA 0x01 # endif # ifndef SUBLANG_URDU_PAKISTAN # define SUBLANG_URDU_PAKISTAN 0x01 # endif # ifndef SUBLANG_URDU_INDIA # define SUBLANG_URDU_INDIA 0x02 # endif # ifndef SUBLANG_UZBEK_LATIN # define SUBLANG_UZBEK_LATIN 0x01 # endif # ifndef SUBLANG_UZBEK_CYRILLIC # define SUBLANG_UZBEK_CYRILLIC 0x02 # endif #endif /* XPG3 defines the result of 'setlocale (category, NULL)' as: "Directs 'setlocale()' to query 'category' and return the current setting of 'local'." However it does not specify the exact format. Neither do SUSV2 and ISO C 99. So we can use this feature only on selected systems (e.g. those using GNU C Library). */ #if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) # define HAVE_LOCALE_NULL #endif /* Determine the current locale's name, and canonicalize it into XPG syntax language[_territory[.codeset]][@modifier] The codeset part in the result is not reliable; the locale_charset() should be used for codeset information instead. The result must not be freed; it is statically allocated. */ const char * _nl_locale_name (int category, const char *categoryname) { const char *retval; #ifndef WIN32 /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'. On some systems this can be done by the 'setlocale' function itself. */ # if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL retval = setlocale (category, NULL); # else /* Setting of LC_ALL overwrites all other. */ retval = getenv ("LC_ALL"); if (retval == NULL || retval[0] == '\0') { /* Next comes the name of the desired category. */ retval = getenv (categoryname); if (retval == NULL || retval[0] == '\0') { /* Last possibility is the LANG environment variable. */ retval = getenv ("LANG"); if (retval == NULL || retval[0] == '\0') /* We use C as the default domain. POSIX says this is implementation defined. */ retval = "C"; } } # endif return retval; #else /* WIN32 */ /* Return an XPG style locale name language[_territory][@modifier]. Don't even bother determining the codeset; it's not useful in this context, because message catalogs are not specific to a single codeset. */ LCID lcid; LANGID langid; int primary, sub; /* Let the user override the system settings through environment variables, as on POSIX systems. */ retval = getenv ("LC_ALL"); if (retval != NULL && retval[0] != '\0') return retval; retval = getenv (categoryname); if (retval != NULL && retval[0] != '\0') return retval; retval = getenv ("LANG"); if (retval != NULL && retval[0] != '\0') return retval; /* Use native Win32 API locale ID. */ lcid = GetThreadLocale (); /* Strip off the sorting rules, keep only the language part. */ langid = LANGIDFROMLCID (lcid); /* Split into language and territory part. */ primary = PRIMARYLANGID (langid); sub = SUBLANGID (langid); /* Dispatch on language. See also http://www.unicode.org/unicode/onlinedat/languages.html . For details about languages, see http://www.ethnologue.com/ . */ switch (primary) { case LANG_AFRIKAANS: return "af_ZA"; case LANG_ALBANIAN: return "sq_AL"; case LANG_AMHARIC: return "am_ET"; case LANG_ARABIC: switch (sub) { case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA"; case SUBLANG_ARABIC_IRAQ: return "ar_IQ"; case SUBLANG_ARABIC_EGYPT: return "ar_EG"; case SUBLANG_ARABIC_LIBYA: return "ar_LY"; case SUBLANG_ARABIC_ALGERIA: return "ar_DZ"; case SUBLANG_ARABIC_MOROCCO: return "ar_MA"; case SUBLANG_ARABIC_TUNISIA: return "ar_TN"; case SUBLANG_ARABIC_OMAN: return "ar_OM"; case SUBLANG_ARABIC_YEMEN: return "ar_YE"; case SUBLANG_ARABIC_SYRIA: return "ar_SY"; case SUBLANG_ARABIC_JORDAN: return "ar_JO"; case SUBLANG_ARABIC_LEBANON: return "ar_LB"; case SUBLANG_ARABIC_KUWAIT: return "ar_KW"; case SUBLANG_ARABIC_UAE: return "ar_AE"; case SUBLANG_ARABIC_BAHRAIN: return "ar_BH"; case SUBLANG_ARABIC_QATAR: return "ar_QA"; } return "ar"; case LANG_ARMENIAN: return "hy_AM"; case LANG_ASSAMESE: return "as_IN"; case LANG_AZERI: switch (sub) { /* FIXME: Adjust this when Azerbaijani locales appear on Unix. */ case SUBLANG_AZERI_LATIN: return "az_AZ@latin"; case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic"; } return "az"; case LANG_BASQUE: return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR". */ case LANG_BELARUSIAN: return "be_BY"; case LANG_BENGALI: switch (sub) { case SUBLANG_BENGALI_INDIA: return "bn_IN"; case SUBLANG_BENGALI_BANGLADESH: return "bn_BD"; } return "bn"; case LANG_BULGARIAN: return "bg_BG"; case LANG_BURMESE: return "my_MM"; case LANG_CAMBODIAN: return "km_KH"; case LANG_CATALAN: return "ca_ES"; case LANG_CHEROKEE: return "chr_US"; case LANG_CHINESE: switch (sub) { case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW"; case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN"; case SUBLANG_CHINESE_HONGKONG: return "zh_HK"; case SUBLANG_CHINESE_SINGAPORE: return "zh_SG"; case SUBLANG_CHINESE_MACAU: return "zh_MO"; } return "zh"; case LANG_CROATIAN: /* LANG_CROATIAN == LANG_SERBIAN * What used to be called Serbo-Croatian * should really now be two separate * languages because of political reasons. * (Says tml, who knows nothing about Serbian * or Croatian.) * (I can feel those flames coming already.) */ switch (sub) { case SUBLANG_DEFAULT: return "hr_HR"; case SUBLANG_SERBIAN_LATIN: return "sr_CS"; case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic"; } return "hr"; case LANG_CZECH: return "cs_CZ"; case LANG_DANISH: return "da_DK"; case LANG_DIVEHI: return "dv_MV"; case LANG_DUTCH: switch (sub) { case SUBLANG_DUTCH: return "nl_NL"; case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE"; } return "nl"; case LANG_EDO: return "bin_NG"; case LANG_ENGLISH: switch (sub) { /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought * English was the language spoken in England. * Oh well. */ case SUBLANG_ENGLISH_US: return "en_US"; case SUBLANG_ENGLISH_UK: return "en_GB"; case SUBLANG_ENGLISH_AUS: return "en_AU"; case SUBLANG_ENGLISH_CAN: return "en_CA"; case SUBLANG_ENGLISH_NZ: return "en_NZ"; case SUBLANG_ENGLISH_EIRE: return "en_IE"; case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA"; case SUBLANG_ENGLISH_JAMAICA: return "en_JM"; case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */ case SUBLANG_ENGLISH_BELIZE: return "en_BZ"; case SUBLANG_ENGLISH_TRINIDAD: return "en_TT"; case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW"; case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH"; case SUBLANG_ENGLISH_INDONESIA: return "en_ID"; case SUBLANG_ENGLISH_HONGKONG: return "en_HK"; case SUBLANG_ENGLISH_INDIA: return "en_IN"; case SUBLANG_ENGLISH_MALAYSIA: return "en_MY"; case SUBLANG_ENGLISH_SINGAPORE: return "en_SG"; } return "en"; case LANG_ESTONIAN: return "et_EE"; case LANG_FAEROESE: return "fo_FO"; case LANG_FARSI: return "fa_IR"; case LANG_FINNISH: return "fi_FI"; case LANG_FRENCH: switch (sub) { case SUBLANG_FRENCH: return "fr_FR"; case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE"; case SUBLANG_FRENCH_CANADIAN: return "fr_CA"; case SUBLANG_FRENCH_SWISS: return "fr_CH"; case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU"; case SUBLANG_FRENCH_MONACO: return "fr_MC"; case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */ case SUBLANG_FRENCH_REUNION: return "fr_RE"; case SUBLANG_FRENCH_CONGO: return "fr_CG"; case SUBLANG_FRENCH_SENEGAL: return "fr_SN"; case SUBLANG_FRENCH_CAMEROON: return "fr_CM"; case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI"; case SUBLANG_FRENCH_MALI: return "fr_ML"; case SUBLANG_FRENCH_MOROCCO: return "fr_MA"; case SUBLANG_FRENCH_HAITI: return "fr_HT"; } return "fr"; case LANG_FRISIAN: return "fy_NL"; case LANG_FULFULDE: /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */ return "ff_NG"; case LANG_GAELIC: switch (sub) { case 0x01: /* SCOTTISH */ return "gd_GB"; case 0x02: /* IRISH */ return "ga_IE"; } return "C"; case LANG_GALICIAN: return "gl_ES"; case LANG_GEORGIAN: return "ka_GE"; case LANG_GERMAN: switch (sub) { case SUBLANG_GERMAN: return "de_DE"; case SUBLANG_GERMAN_SWISS: return "de_CH"; case SUBLANG_GERMAN_AUSTRIAN: return "de_AT"; case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU"; case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI"; } return "de"; case LANG_GREEK: return "el_GR"; case LANG_GUARANI: return "gn_PY"; case LANG_GUJARATI: return "gu_IN"; case LANG_HAUSA: return "ha_NG"; case LANG_HAWAIIAN: /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers) or Hawaii Creole English ("cpe_US", 600000 speakers)? */ return "cpe_US"; case LANG_HEBREW: return "he_IL"; case LANG_HINDI: return "hi_IN"; case LANG_HUNGARIAN: return "hu_HU"; case LANG_IBIBIO: return "nic_NG"; case LANG_ICELANDIC: return "is_IS"; case LANG_IGBO: return "ig_NG"; case LANG_INDONESIAN: return "id_ID"; case LANG_INUKTITUT: return "iu_CA"; case LANG_ITALIAN: switch (sub) { case SUBLANG_ITALIAN: return "it_IT"; case SUBLANG_ITALIAN_SWISS: return "it_CH"; } return "it"; case LANG_JAPANESE: return "ja_JP"; case LANG_KANNADA: return "kn_IN"; case LANG_KANURI: return "kr_NG"; case LANG_KASHMIRI: switch (sub) { case SUBLANG_DEFAULT: return "ks_PK"; case SUBLANG_KASHMIRI_INDIA: return "ks_IN"; } return "ks"; case LANG_KAZAK: return "kk_KZ"; case LANG_KONKANI: /* FIXME: Adjust this when such locales appear on Unix. */ return "kok_IN"; case LANG_KOREAN: return "ko_KR"; case LANG_KYRGYZ: return "ky_KG"; case LANG_LAO: return "lo_LA"; case LANG_LATIN: return "la_VA"; case LANG_LATVIAN: return "lv_LV"; case LANG_LITHUANIAN: return "lt_LT"; case LANG_MACEDONIAN: return "mk_MK"; case LANG_MALAY: switch (sub) { case SUBLANG_MALAY_MALAYSIA: return "ms_MY"; case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN"; } return "ms"; case LANG_MALAYALAM: return "ml_IN"; case LANG_MALTESE: return "mt_MT"; case LANG_MANIPURI: /* FIXME: Adjust this when such locales appear on Unix. */ return "mni_IN"; case LANG_MARATHI: return "mr_IN"; case LANG_MONGOLIAN: return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN". */ case LANG_NEPALI: switch (sub) { case SUBLANG_DEFAULT: return "ne_NP"; case SUBLANG_NEPALI_INDIA: return "ne_IN"; } return "ne"; case LANG_NORWEGIAN: switch (sub) { case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO"; case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO"; } return "no"; case LANG_ORIYA: return "or_IN"; case LANG_OROMO: return "om_ET"; case LANG_PAPIAMENTU: return "pap_AN"; case LANG_PASHTO: return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF". */ case LANG_POLISH: return "pl_PL"; case LANG_PORTUGUESE: switch (sub) { case SUBLANG_PORTUGUESE: return "pt_PT"; /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT. Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */ case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR"; } return "pt"; case LANG_PUNJABI: switch (sub) { case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */ case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */ } return "pa"; case LANG_RHAETO_ROMANCE: return "rm_CH"; case LANG_ROMANIAN: switch (sub) { case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO"; case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD"; } return "ro"; case LANG_RUSSIAN: return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD". */ case LANG_SAAMI: /* actually Northern Sami */ return "se_NO"; case LANG_SANSKRIT: return "sa_IN"; case LANG_SINDHI: switch (sub) { case SUBLANG_SINDHI_INDIA: return "sd_IN"; case SUBLANG_SINDHI_PAKISTAN: return "sd_PK"; } return "sd"; case LANG_SINHALESE: return "si_LK"; case LANG_SLOVAK: return "sk_SK"; case LANG_SLOVENIAN: return "sl_SI"; case LANG_SOMALI: return "so_SO"; case LANG_SORBIAN: /* FIXME: Adjust this when such locales appear on Unix. */ return "wen_DE"; case LANG_SPANISH: switch (sub) { case SUBLANG_SPANISH: return "es_ES"; case SUBLANG_SPANISH_MEXICAN: return "es_MX"; case SUBLANG_SPANISH_MODERN: return "es_ES@modern"; /* not seen on Unix */ case SUBLANG_SPANISH_GUATEMALA: return "es_GT"; case SUBLANG_SPANISH_COSTA_RICA: return "es_CR"; case SUBLANG_SPANISH_PANAMA: return "es_PA"; case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO"; case SUBLANG_SPANISH_VENEZUELA: return "es_VE"; case SUBLANG_SPANISH_COLOMBIA: return "es_CO"; case SUBLANG_SPANISH_PERU: return "es_PE"; case SUBLANG_SPANISH_ARGENTINA: return "es_AR"; case SUBLANG_SPANISH_ECUADOR: return "es_EC"; case SUBLANG_SPANISH_CHILE: return "es_CL"; case SUBLANG_SPANISH_URUGUAY: return "es_UY"; case SUBLANG_SPANISH_PARAGUAY: return "es_PY"; case SUBLANG_SPANISH_BOLIVIA: return "es_BO"; case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV"; case SUBLANG_SPANISH_HONDURAS: return "es_HN"; case SUBLANG_SPANISH_NICARAGUA: return "es_NI"; case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR"; } return "es"; case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */ case LANG_SWAHILI: return "sw_KE"; case LANG_SWEDISH: switch (sub) { case SUBLANG_DEFAULT: return "sv_SE"; case SUBLANG_SWEDISH_FINLAND: return "sv_FI"; } return "sv"; case LANG_SYRIAC: return "syr_TR"; /* An extinct language. */ case LANG_TAGALOG: return "tl_PH"; case LANG_TAJIK: return "tg_TJ"; case LANG_TAMAZIGHT: switch (sub) { /* FIXME: Adjust this when Tamazight locales appear on Unix. */ case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic"; case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA@latin"; } return "ber_MA"; case LANG_TAMIL: return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG". */ case LANG_TATAR: return "tt_RU"; case LANG_TELUGU: return "te_IN"; case LANG_THAI: return "th_TH"; case LANG_TIBETAN: return "bo_CN"; case LANG_TIGRINYA: switch (sub) { case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET"; case SUBLANG_TIGRINYA_ERITREA: return "ti_ER"; } return "ti"; case LANG_TSONGA: return "ts_ZA"; case LANG_TSWANA: return "tn_BW"; case LANG_TURKISH: return "tr_TR"; case LANG_TURKMEN: return "tk_TM"; case LANG_UKRAINIAN: return "uk_UA"; case LANG_URDU: switch (sub) { case SUBLANG_URDU_PAKISTAN: return "ur_PK"; case SUBLANG_URDU_INDIA: return "ur_IN"; } return "ur"; case LANG_UZBEK: switch (sub) { case SUBLANG_UZBEK_LATIN: return "uz_UZ"; case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic"; } return "uz"; case LANG_VENDA: return "ve_ZA"; case LANG_VIETNAMESE: return "vi_VN"; case LANG_WELSH: return "cy_GB"; case LANG_XHOSA: return "xh_ZA"; case LANG_YI: return "sit_CN"; case LANG_YIDDISH: return "yi_IL"; case LANG_YORUBA: return "yo_NG"; case LANG_ZULU: return "zu_ZA"; default: return "C"; } #endif } mdk-1.2.9/intl/dgettext.c0000644000175000017500000000336512110326462012165 00000000000000/* Implementation of the dgettext(3) function. Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #include #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DGETTEXT __dgettext # define DCGETTEXT INTUSE(__dcgettext) #else # define DGETTEXT libintl_dgettext # define DCGETTEXT libintl_dcgettext #endif /* Look up MSGID in the DOMAINNAME message catalog of the current LC_MESSAGES locale. */ char * DGETTEXT (const char *domainname, const char *msgid) { return DCGETTEXT (domainname, msgid, LC_MESSAGES); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dgettext, dgettext); #endif mdk-1.2.9/intl/intl-compat.c0000644000175000017500000000644312110326462012564 00000000000000/* intl-compat.c - Stub functions to call gettext functions from GNU gettext Library. Copyright (C) 1995, 2000-2003 Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" /* @@ end of prolog @@ */ /* This file redirects the gettext functions (without prefix) to those defined in the included GNU libintl library (with "libintl_" prefix). It is compiled into libintl in order to make the AM_GNU_GETTEXT test of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which has the redirections primarily in the include file. It is also compiled into libgnuintl so that libgnuintl.so can be used as LD_PRELOADable library on glibc systems, to provide the extra features that the functions in the libc don't have (namely, logging). */ #undef gettext #undef dgettext #undef dcgettext #undef ngettext #undef dngettext #undef dcngettext #undef textdomain #undef bindtextdomain #undef bind_textdomain_codeset /* When building a DLL, we must export some functions. Note that because the functions are only defined for binary backward compatibility, we don't need to use __declspec(dllimport) in any case. */ #if defined _MSC_VER && BUILDING_DLL # define DLL_EXPORTED __declspec(dllexport) #else # define DLL_EXPORTED #endif DLL_EXPORTED char * gettext (const char *msgid) { return libintl_gettext (msgid); } DLL_EXPORTED char * dgettext (const char *domainname, const char *msgid) { return libintl_dgettext (domainname, msgid); } DLL_EXPORTED char * dcgettext (const char *domainname, const char *msgid, int category) { return libintl_dcgettext (domainname, msgid, category); } DLL_EXPORTED char * ngettext (const char *msgid1, const char *msgid2, unsigned long int n) { return libintl_ngettext (msgid1, msgid2, n); } DLL_EXPORTED char * dngettext (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n) { return libintl_dngettext (domainname, msgid1, msgid2, n); } DLL_EXPORTED char * dcngettext (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n, int category) { return libintl_dcngettext (domainname, msgid1, msgid2, n, category); } DLL_EXPORTED char * textdomain (const char *domainname) { return libintl_textdomain (domainname); } DLL_EXPORTED char * bindtextdomain (const char *domainname, const char *dirname) { return libintl_bindtextdomain (domainname, dirname); } DLL_EXPORTED char * bind_textdomain_codeset (const char *domainname, const char *codeset) { return libintl_bind_textdomain_codeset (domainname, codeset); } mdk-1.2.9/intl/printf-args.c0000644000175000017500000000625312110326462012570 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif /* Specification. */ #include "printf-args.h" #ifdef STATIC STATIC #endif int printf_fetchargs (va_list args, arguments *a) { size_t i; argument *ap; for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++) switch (ap->type) { case TYPE_SCHAR: ap->a.a_schar = va_arg (args, /*signed char*/ int); break; case TYPE_UCHAR: ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); break; case TYPE_SHORT: ap->a.a_short = va_arg (args, /*short*/ int); break; case TYPE_USHORT: ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); break; case TYPE_INT: ap->a.a_int = va_arg (args, int); break; case TYPE_UINT: ap->a.a_uint = va_arg (args, unsigned int); break; case TYPE_LONGINT: ap->a.a_longint = va_arg (args, long int); break; case TYPE_ULONGINT: ap->a.a_ulongint = va_arg (args, unsigned long int); break; #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: ap->a.a_longlongint = va_arg (args, long long int); break; case TYPE_ULONGLONGINT: ap->a.a_ulonglongint = va_arg (args, unsigned long long int); break; #endif case TYPE_DOUBLE: ap->a.a_double = va_arg (args, double); break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: ap->a.a_longdouble = va_arg (args, long double); break; #endif case TYPE_CHAR: ap->a.a_char = va_arg (args, int); break; #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: ap->a.a_wide_char = va_arg (args, wint_t); break; #endif case TYPE_STRING: ap->a.a_string = va_arg (args, const char *); break; #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: ap->a.a_wide_string = va_arg (args, const wchar_t *); break; #endif case TYPE_POINTER: ap->a.a_pointer = va_arg (args, void *); break; case TYPE_COUNT_SCHAR_POINTER: ap->a.a_count_schar_pointer = va_arg (args, signed char *); break; case TYPE_COUNT_SHORT_POINTER: ap->a.a_count_short_pointer = va_arg (args, short *); break; case TYPE_COUNT_INT_POINTER: ap->a.a_count_int_pointer = va_arg (args, int *); break; case TYPE_COUNT_LONGINT_POINTER: ap->a.a_count_longint_pointer = va_arg (args, long int *); break; #ifdef HAVE_LONG_LONG case TYPE_COUNT_LONGLONGINT_POINTER: ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); break; #endif default: /* Unknown type. */ return -1; } return 0; } mdk-1.2.9/intl/plural-exp.c0000644000175000017500000000765112110326462012430 00000000000000/* Expression parsing for plural form selection. Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "plural-exp.h" #if (defined __GNUC__ && !defined __APPLE_CC__) \ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) /* These structs are the constant expression for the germanic plural form determination. It represents the expression "n != 1". */ static const struct expression plvar = { .nargs = 0, .operation = var, }; static const struct expression plone = { .nargs = 0, .operation = num, .val = { .num = 1 } }; struct expression GERMANIC_PLURAL = { .nargs = 2, .operation = not_equal, .val = { .args = { [0] = (struct expression *) &plvar, [1] = (struct expression *) &plone } } }; # define INIT_GERMANIC_PLURAL() #else /* For compilers without support for ISO C 99 struct/union initializers: Initialization at run-time. */ static struct expression plvar; static struct expression plone; struct expression GERMANIC_PLURAL; static void init_germanic_plural () { if (plone.val.num == 0) { plvar.nargs = 0; plvar.operation = var; plone.nargs = 0; plone.operation = num; plone.val.num = 1; GERMANIC_PLURAL.nargs = 2; GERMANIC_PLURAL.operation = not_equal; GERMANIC_PLURAL.val.args[0] = &plvar; GERMANIC_PLURAL.val.args[1] = &plone; } } # define INIT_GERMANIC_PLURAL() init_germanic_plural () #endif void internal_function EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, unsigned long int *npluralsp) { if (nullentry != NULL) { const char *plural; const char *nplurals; plural = strstr (nullentry, "plural="); nplurals = strstr (nullentry, "nplurals="); if (plural == NULL || nplurals == NULL) goto no_plural; else { char *endp; unsigned long int n; struct parse_args args; /* First get the number. */ nplurals += 9; while (*nplurals != '\0' && isspace ((unsigned char) *nplurals)) ++nplurals; if (!(*nplurals >= '0' && *nplurals <= '9')) goto no_plural; #if defined HAVE_STRTOUL || defined _LIBC n = strtoul (nplurals, &endp, 10); #else for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) n = n * 10 + (*endp - '0'); #endif if (nplurals == endp) goto no_plural; *npluralsp = n; /* Due to the restrictions bison imposes onto the interface of the scanner function we have to put the input string and the result passed up from the parser into the same structure which address is passed down to the parser. */ plural += 7; args.cp = plural; if (PLURAL_PARSE (&args) != 0) goto no_plural; *pluralp = args.res; } } else { /* By default we are using the Germanic form: singular form only for `one', the plural form otherwise. Yes, this is also what English is using since English is a Germanic language. */ no_plural: INIT_GERMANIC_PLURAL (); *pluralp = &GERMANIC_PLURAL; *npluralsp = 2; } } mdk-1.2.9/intl/log.c0000644000175000017500000000530312110326462011110 00000000000000/* Log file output. Copyright (C) 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Bruno Haible . */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include /* Print an ASCII string with quotes and escape sequences where needed. */ static void print_escaped (FILE *stream, const char *str) { putc ('"', stream); for (; *str != '\0'; str++) if (*str == '\n') { fputs ("\\n\"", stream); if (str[1] == '\0') return; fputs ("\n\"", stream); } else { if (*str == '"' || *str == '\\') putc ('\\', stream); putc (*str, stream); } putc ('"', stream); } /* Add to the log file an entry denoting a failed translation. */ void _nl_log_untranslated (const char *logfilename, const char *domainname, const char *msgid1, const char *msgid2, int plural) { static char *last_logfilename = NULL; static FILE *last_logfile = NULL; FILE *logfile; /* Can we reuse the last opened logfile? */ if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0) { /* Close the last used logfile. */ if (last_logfilename != NULL) { if (last_logfile != NULL) { fclose (last_logfile); last_logfile = NULL; } free (last_logfilename); last_logfilename = NULL; } /* Open the logfile. */ last_logfilename = (char *) malloc (strlen (logfilename) + 1); if (last_logfilename == NULL) return; strcpy (last_logfilename, logfilename); last_logfile = fopen (logfilename, "a"); if (last_logfile == NULL) return; } logfile = last_logfile; fprintf (logfile, "domain "); print_escaped (logfile, domainname); fprintf (logfile, "\nmsgid "); print_escaped (logfile, msgid1); if (plural) { fprintf (logfile, "\nmsgid_plural "); print_escaped (logfile, msgid2); fprintf (logfile, "\nmsgstr[0] \"\"\n"); } else fprintf (logfile, "\nmsgstr \"\"\n"); putc ('\n', logfile); } mdk-1.2.9/intl/gmo.h0000644000175000017500000001134512110326462011121 00000000000000/* Description of GNU message catalog format: general file layout. Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETTEXT_H #define _GETTEXT_H 1 #include /* @@ end of prolog @@ */ /* The magic number of the GNU message catalog format. */ #define _MAGIC 0x950412de #define _MAGIC_SWAPPED 0xde120495 /* Revision number of the currently used .mo (binary) file format. */ #define MO_REVISION_NUMBER 0 #define MO_REVISION_NUMBER_WITH_SYSDEP_I 1 /* The following contortions are an attempt to use the C preprocessor to determine an unsigned integral type that is 32 bits wide. An alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work when cross-compiling. */ #if __STDC__ # define UINT_MAX_32_BITS 4294967295U #else # define UINT_MAX_32_BITS 0xFFFFFFFF #endif /* If UINT_MAX isn't defined, assume it's a 32-bit type. This should be valid for all systems GNU cares about because that doesn't include 16-bit systems, and only modern systems (that certainly have ) have 64+-bit integral types. */ #ifndef UINT_MAX # define UINT_MAX UINT_MAX_32_BITS #endif #if UINT_MAX == UINT_MAX_32_BITS typedef unsigned nls_uint32; #else # if USHRT_MAX == UINT_MAX_32_BITS typedef unsigned short nls_uint32; # else # if ULONG_MAX == UINT_MAX_32_BITS typedef unsigned long nls_uint32; # else /* The following line is intended to throw an error. Using #error is not portable enough. */ "Cannot determine unsigned 32-bit data type." # endif # endif #endif /* Header for binary .mo file format. */ struct mo_file_header { /* The magic number. */ nls_uint32 magic; /* The revision number of the file format. */ nls_uint32 revision; /* The following are only used in .mo files with major revision 0 or 1. */ /* The number of strings pairs. */ nls_uint32 nstrings; /* Offset of table with start offsets of original strings. */ nls_uint32 orig_tab_offset; /* Offset of table with start offsets of translated strings. */ nls_uint32 trans_tab_offset; /* Size of hash table. */ nls_uint32 hash_tab_size; /* Offset of first hash table entry. */ nls_uint32 hash_tab_offset; /* The following are only used in .mo files with minor revision >= 1. */ /* The number of system dependent segments. */ nls_uint32 n_sysdep_segments; /* Offset of table describing system dependent segments. */ nls_uint32 sysdep_segments_offset; /* The number of system dependent strings pairs. */ nls_uint32 n_sysdep_strings; /* Offset of table with start offsets of original sysdep strings. */ nls_uint32 orig_sysdep_tab_offset; /* Offset of table with start offsets of translated sysdep strings. */ nls_uint32 trans_sysdep_tab_offset; }; /* Descriptor for static string contained in the binary .mo file. */ struct string_desc { /* Length of addressed string, not including the trailing NUL. */ nls_uint32 length; /* Offset of string in file. */ nls_uint32 offset; }; /* The following are only used in .mo files with minor revision >= 1. */ /* Descriptor for system dependent string segment. */ struct sysdep_segment { /* Length of addressed string, including the trailing NUL. */ nls_uint32 length; /* Offset of string in file. */ nls_uint32 offset; }; /* Descriptor for system dependent string. */ struct sysdep_string { /* Offset of static string segments in file. */ nls_uint32 offset; /* Alternating sequence of static and system dependent segments. The last segment is a static segment, including the trailing NUL. */ struct segment_pair { /* Size of static segment. */ nls_uint32 segsize; /* Reference to system dependent string segment, or ~0 at the end. */ nls_uint32 sysdepref; } segments[1]; }; /* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, regardless whether 'int' is 16 bit, 32 bit, or 64 bit. */ #define SEGMENTS_END ((nls_uint32) ~0) /* @@ begin of epilog @@ */ #endif /* gettext.h */ mdk-1.2.9/intl/relocatable.c0000644000175000017500000003136012110326462012606 00000000000000/* Provide relocatable packages. Copyright (C) 2003 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for getline(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif /* Specification. */ #include "relocatable.h" #if ENABLE_RELOCATABLE #include #include #include #include #ifdef NO_XMALLOC # define xmalloc malloc #else # include "xalloc.h" #endif #if defined _WIN32 || defined __WIN32__ # define WIN32_LEAN_AND_MEAN # include #endif #if DEPENDS_ON_LIBCHARSET # include #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV # include #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS # include #endif /* Faked cheap 'bool'. */ #undef bool #undef false #undef true #define bool int #define false 0 #define true 1 /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_PATH_WITH_DIR(P) \ (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P)) # define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) # define FILESYSTEM_PREFIX_LEN(P) 0 #endif /* Original installation prefix. */ static char *orig_prefix; static size_t orig_prefix_len; /* Current installation prefix. */ static char *curr_prefix; static size_t curr_prefix_len; /* These prefixes do not end in a slash. Anything that will be concatenated to them must start with a slash. */ /* Sets the original and the current installation prefix of this module. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ static void set_this_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { if (orig_prefix_arg != NULL && curr_prefix_arg != NULL /* Optimization: if orig_prefix and curr_prefix are equal, the relocation is a nop. */ && strcmp (orig_prefix_arg, curr_prefix_arg) != 0) { /* Duplicate the argument strings. */ char *memory; orig_prefix_len = strlen (orig_prefix_arg); curr_prefix_len = strlen (curr_prefix_arg); memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1); #ifdef NO_XMALLOC if (memory != NULL) #endif { memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); orig_prefix = memory; memory += orig_prefix_len + 1; memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); curr_prefix = memory; return; } } orig_prefix = NULL; curr_prefix = NULL; /* Don't worry about wasted memory here - this function is usually only called once. */ } /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ void set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg) { set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg); /* Now notify all dependent libraries. */ #if DEPENDS_ON_LIBCHARSET libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109 libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif #if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg); #endif } #if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR) /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns NULL upon failure. */ #ifdef IN_LIBRARY #define compute_curr_prefix local_compute_curr_prefix static #endif const char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname) { const char *curr_installdir; const char *rel_installdir; if (curr_pathname == NULL) return NULL; /* Determine the relative installation directory, relative to the prefix. This is simply the difference between orig_installprefix and orig_installdir. */ if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix)) != 0) /* Shouldn't happen - nothing should be installed outside $(prefix). */ return NULL; rel_installdir = orig_installdir + strlen (orig_installprefix); /* Determine the current installation directory. */ { const char *p_base = curr_pathname + FILESYSTEM_PREFIX_LEN (curr_pathname); const char *p = curr_pathname + strlen (curr_pathname); char *q; while (p > p_base) { p--; if (ISSLASH (*p)) break; } q = (char *) xmalloc (p - curr_pathname + 1); #ifdef NO_XMALLOC if (q == NULL) return NULL; #endif memcpy (q, curr_pathname, p - curr_pathname); q[p - curr_pathname] = '\0'; curr_installdir = q; } /* Compute the current installation prefix by removing the trailing rel_installdir from it. */ { const char *rp = rel_installdir + strlen (rel_installdir); const char *cp = curr_installdir + strlen (curr_installdir); const char *cp_base = curr_installdir + FILESYSTEM_PREFIX_LEN (curr_installdir); while (rp > rel_installdir && cp > cp_base) { bool same = false; const char *rpi = rp; const char *cpi = cp; while (rpi > rel_installdir && cpi > cp_base) { rpi--; cpi--; if (ISSLASH (*rpi) || ISSLASH (*cpi)) { if (ISSLASH (*rpi) && ISSLASH (*cpi)) same = true; break; } #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS - case insignificant filesystem */ if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) break; #else if (*rpi != *cpi) break; #endif } if (!same) break; /* The last pathname component was the same. opi and cpi now point to the slash before it. */ rp = rpi; cp = cpi; } if (rp > rel_installdir) /* Unexpected: The curr_installdir does not end with rel_installdir. */ return NULL; { size_t curr_prefix_len = cp - curr_installdir; char *curr_prefix; curr_prefix = (char *) xmalloc (curr_prefix_len + 1); #ifdef NO_XMALLOC if (curr_prefix == NULL) return NULL; #endif memcpy (curr_prefix, curr_installdir, curr_prefix_len); curr_prefix[curr_prefix_len] = '\0'; return curr_prefix; } } } #endif /* !IN_LIBRARY || PIC */ #if defined PIC && defined INSTALLDIR /* Full pathname of shared library, or NULL. */ static char *shared_library_fullname; #if defined _WIN32 || defined __WIN32__ /* Determine the full pathname of the shared library when it is loaded. */ BOOL WINAPI DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved) { (void) reserved; if (event == DLL_PROCESS_ATTACH) { /* The DLL is being loaded into an application's address range. */ static char location[MAX_PATH]; if (!GetModuleFileName (module_handle, location, sizeof (location))) /* Shouldn't happen. */ return FALSE; if (!IS_PATH_WITH_DIR (location)) /* Shouldn't happen. */ return FALSE; shared_library_fullname = strdup (location); } return TRUE; } #else /* Unix */ static void find_shared_library_fullname () { #if defined __linux__ && __GLIBC__ >= 2 /* Linux has /proc/self/maps. glibc 2 has the getline() function. */ FILE *fp; /* Open the current process' maps file. It describes one VMA per line. */ fp = fopen ("/proc/self/maps", "r"); if (fp) { unsigned long address = (unsigned long) &find_shared_library_fullname; for (;;) { unsigned long start, end; int c; if (fscanf (fp, "%lx-%lx", &start, &end) != 2) break; if (address >= start && address <= end - 1) { /* Found it. Now see if this line contains a filename. */ while (c = getc (fp), c != EOF && c != '\n' && c != '/') continue; if (c == '/') { size_t size; int len; ungetc (c, fp); shared_library_fullname = NULL; size = 0; len = getline (&shared_library_fullname, &size, fp); if (len >= 0) { /* Success: filled shared_library_fullname. */ if (len > 0 && shared_library_fullname[len - 1] == '\n') shared_library_fullname[len - 1] = '\0'; } } break; } while (c = getc (fp), c != EOF && c != '\n') continue; } fclose (fp); } #endif } #endif /* WIN32 / Unix */ /* Return the full pathname of the current shared library. Return NULL if unknown. Guaranteed to work only on Linux and Woe32. */ static char * get_shared_library_fullname () { #if !(defined _WIN32 || defined __WIN32__) static bool tried_find_shared_library_fullname; if (!tried_find_shared_library_fullname) { find_shared_library_fullname (); tried_find_shared_library_fullname = true; } #endif return shared_library_fullname; } #endif /* PIC */ /* Returns the pathname, relocated according to the current installation directory. */ const char * relocate (const char *pathname) { #if defined PIC && defined INSTALLDIR static int initialized; /* Initialization code for a shared library. */ if (!initialized) { /* At this point, orig_prefix and curr_prefix likely have already been set through the main program's set_program_name_and_installdir function. This is sufficient in the case that the library has initially been installed in the same orig_prefix. But we can do better, to also cover the cases that 1. it has been installed in a different prefix before being moved to orig_prefix and (later) to curr_prefix, 2. unlike the program, it has not moved away from orig_prefix. */ const char *orig_installprefix = INSTALLPREFIX; const char *orig_installdir = INSTALLDIR; const char *curr_prefix_better; curr_prefix_better = compute_curr_prefix (orig_installprefix, orig_installdir, get_shared_library_fullname ()); if (curr_prefix_better == NULL) curr_prefix_better = curr_prefix; set_relocation_prefix (orig_installprefix, curr_prefix_better); initialized = 1; } #endif /* Note: It is not necessary to perform case insensitive comparison here, even for DOS-like filesystems, because the pathname argument was typically created from the same Makefile variable as orig_prefix came from. */ if (orig_prefix != NULL && curr_prefix != NULL && strncmp (pathname, orig_prefix, orig_prefix_len) == 0) { if (pathname[orig_prefix_len] == '\0') /* pathname equals orig_prefix. */ return curr_prefix; if (ISSLASH (pathname[orig_prefix_len])) { /* pathname starts with orig_prefix. */ const char *pathname_tail = &pathname[orig_prefix_len]; char *result = (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1); #ifdef NO_XMALLOC if (result != NULL) #endif { memcpy (result, curr_prefix, curr_prefix_len); strcpy (result + curr_prefix_len, pathname_tail); return result; } } } /* Nothing to relocate. */ return pathname; } #endif mdk-1.2.9/intl/plural-exp.h0000644000175000017500000000773312110326462012436 00000000000000/* Expression parsing and evaluation for plural form selection. Copyright (C) 2000-2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PLURAL_EXP_H #define _PLURAL_EXP_H #ifndef internal_function # define internal_function #endif #ifndef attribute_hidden # define attribute_hidden #endif /* This is the representation of the expressions to determine the plural form. */ struct expression { int nargs; /* Number of arguments. */ enum operator { /* Without arguments: */ var, /* The variable "n". */ num, /* Decimal number. */ /* Unary operators: */ lnot, /* Logical NOT. */ /* Binary operators: */ mult, /* Multiplication. */ divide, /* Division. */ module, /* Modulo operation. */ plus, /* Addition. */ minus, /* Subtraction. */ less_than, /* Comparison. */ greater_than, /* Comparison. */ less_or_equal, /* Comparison. */ greater_or_equal, /* Comparison. */ equal, /* Comparison for equality. */ not_equal, /* Comparison for inequality. */ land, /* Logical AND. */ lor, /* Logical OR. */ /* Ternary operators: */ qmop /* Question mark operator. */ } operation; union { unsigned long int num; /* Number value for `num'. */ struct expression *args[3]; /* Up to three arguments. */ } val; }; /* This is the data structure to pass information to the parser and get the result in a thread-safe way. */ struct parse_args { const char *cp; struct expression *res; }; /* Names for the libintl functions are a problem. This source code is used 1. in the GNU C Library library, 2. in the GNU libintl library, 3. in the GNU gettext tools. The function names in each situation must be different, to allow for binary incompatible changes in 'struct expression'. Furthermore, 1. in the GNU C Library library, the names have a __ prefix, 2.+3. in the GNU libintl library and in the GNU gettext tools, the names must follow ANSI C and not start with __. So we have to distinguish the three cases. */ #ifdef _LIBC # define FREE_EXPRESSION __gettext_free_exp # define PLURAL_PARSE __gettextparse # define GERMANIC_PLURAL __gettext_germanic_plural # define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural #elif defined (IN_LIBINTL) # define FREE_EXPRESSION libintl_gettext_free_exp # define PLURAL_PARSE libintl_gettextparse # define GERMANIC_PLURAL libintl_gettext_germanic_plural # define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural #else # define FREE_EXPRESSION free_plural_expression # define PLURAL_PARSE parse_plural_expression # define GERMANIC_PLURAL germanic_plural # define EXTRACT_PLURAL_EXPRESSION extract_plural_expression #endif extern void FREE_EXPRESSION (struct expression *exp) internal_function; extern int PLURAL_PARSE (void *arg); extern struct expression GERMANIC_PLURAL attribute_hidden; extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, unsigned long int *npluralsp) internal_function; #if !defined (_LIBC) && !defined (IN_LIBINTL) extern unsigned long int plural_eval (struct expression *pexp, unsigned long int n); #endif #endif /* _PLURAL_EXP_H */ mdk-1.2.9/intl/config.charset0000755000175000017500000004340612110326462013014 00000000000000#! /bin/sh # Output a system dependent table of character encoding aliases. # # Copyright (C) 2000-2004 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # The table consists of lines of the form # ALIAS CANONICAL # # ALIAS is the (system dependent) result of "nl_langinfo (CODESET)". # ALIAS is compared in a case sensitive way. # # CANONICAL is the GNU canonical name for this character encoding. # It must be an encoding supported by libiconv. Support by GNU libc is # also desirable. CANONICAL is case insensitive. Usually an upper case # MIME charset name is preferred. # The current list of GNU canonical charset names is as follows. # # name MIME? used by which systems # ASCII, ANSI_X3.4-1968 glibc solaris freebsd darwin # ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd darwin # ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd darwin # ISO-8859-3 Y glibc solaris # ISO-8859-4 Y osf solaris freebsd darwin # ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd darwin # ISO-8859-6 Y glibc aix hpux solaris # ISO-8859-7 Y glibc aix hpux irix osf solaris # ISO-8859-8 Y glibc aix hpux osf solaris # ISO-8859-9 Y glibc aix hpux irix osf solaris # ISO-8859-13 glibc # ISO-8859-14 glibc # ISO-8859-15 glibc aix osf solaris freebsd # KOI8-R Y glibc solaris freebsd darwin # KOI8-U Y glibc freebsd darwin # KOI8-T glibc # CP437 dos # CP775 dos # CP850 aix osf dos # CP852 dos # CP855 dos # CP856 aix # CP857 dos # CP861 dos # CP862 dos # CP864 dos # CP865 dos # CP866 freebsd darwin dos # CP869 dos # CP874 woe32 dos # CP922 aix # CP932 aix woe32 dos # CP943 aix # CP949 osf woe32 dos # CP950 woe32 dos # CP1046 aix # CP1124 aix # CP1125 dos # CP1129 aix # CP1250 woe32 # CP1251 glibc solaris darwin woe32 # CP1252 aix woe32 # CP1253 woe32 # CP1254 woe32 # CP1255 glibc woe32 # CP1256 woe32 # CP1257 woe32 # GB2312 Y glibc aix hpux irix solaris freebsd darwin # EUC-JP Y glibc aix hpux irix osf solaris freebsd darwin # EUC-KR Y glibc aix hpux irix osf solaris freebsd darwin # EUC-TW glibc aix hpux irix osf solaris # BIG5 Y glibc aix hpux osf solaris freebsd darwin # BIG5-HKSCS glibc solaris # GBK glibc aix osf solaris woe32 dos # GB18030 glibc solaris # SHIFT_JIS Y hpux osf solaris freebsd darwin # JOHAB glibc solaris woe32 # TIS-620 glibc aix hpux osf solaris # VISCII Y glibc # TCVN5712-1 glibc # GEORGIAN-PS glibc # HP-ROMAN8 hpux # HP-ARABIC8 hpux # HP-GREEK8 hpux # HP-HEBREW8 hpux # HP-TURKISH8 hpux # HP-KANA8 hpux # DEC-KANJI osf # DEC-HANYU osf # UTF-8 Y glibc aix hpux osf solaris # # Note: Names which are not marked as being a MIME name should not be used in # Internet protocols for information interchange (mail, news, etc.). # # Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications # must understand both names and treat them as equivalent. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM host="$1" os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'` echo "# This file contains a table of character encoding aliases," echo "# suitable for operating system '${os}'." echo "# It was automatically generated from config.charset." # List of references, updated during installation: echo "# Packages using this file: " case "$os" in linux-gnulibc1*) # Linux libc5 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "C ASCII" echo "POSIX ASCII" for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ sv_FI sv_SE; do echo "$l ISO-8859-1" echo "$l.iso-8859-1 ISO-8859-1" echo "$l.iso-8859-15 ISO-8859-15" echo "$l.iso-8859-15@euro ISO-8859-15" echo "$l@euro ISO-8859-15" echo "$l.cp-437 CP437" echo "$l.cp-850 CP850" echo "$l.cp-1252 CP1252" echo "$l.cp-1252@euro CP1252" #echo "$l.atari-st ATARI-ST" # not a commonly used encoding echo "$l.utf-8 UTF-8" echo "$l.utf-8@euro UTF-8" done for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ sl_SI sr sr_CS sr_YU; do echo "$l ISO-8859-2" echo "$l.iso-8859-2 ISO-8859-2" echo "$l.cp-852 CP852" echo "$l.cp-1250 CP1250" echo "$l.utf-8 UTF-8" done for l in mk mk_MK ru ru_RU; do echo "$l ISO-8859-5" echo "$l.iso-8859-5 ISO-8859-5" echo "$l.koi8-r KOI8-R" echo "$l.cp-866 CP866" echo "$l.cp-1251 CP1251" echo "$l.utf-8 UTF-8" done for l in ar ar_SA; do echo "$l ISO-8859-6" echo "$l.iso-8859-6 ISO-8859-6" echo "$l.cp-864 CP864" #echo "$l.cp-868 CP868" # not a commonly used encoding echo "$l.cp-1256 CP1256" echo "$l.utf-8 UTF-8" done for l in el el_GR gr gr_GR; do echo "$l ISO-8859-7" echo "$l.iso-8859-7 ISO-8859-7" echo "$l.cp-869 CP869" echo "$l.cp-1253 CP1253" echo "$l.cp-1253@euro CP1253" echo "$l.utf-8 UTF-8" echo "$l.utf-8@euro UTF-8" done for l in he he_IL iw iw_IL; do echo "$l ISO-8859-8" echo "$l.iso-8859-8 ISO-8859-8" echo "$l.cp-862 CP862" echo "$l.cp-1255 CP1255" echo "$l.utf-8 UTF-8" done for l in tr tr_TR; do echo "$l ISO-8859-9" echo "$l.iso-8859-9 ISO-8859-9" echo "$l.cp-857 CP857" echo "$l.cp-1254 CP1254" echo "$l.utf-8 UTF-8" done for l in lt lt_LT lv lv_LV; do #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name echo "$l ISO-8859-13" done for l in ru_UA uk uk_UA; do echo "$l KOI8-U" done for l in zh zh_CN; do #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name echo "$l GB2312" done for l in ja ja_JP ja_JP.EUC; do echo "$l EUC-JP" done for l in ko ko_KR; do echo "$l EUC-KR" done for l in th th_TH; do echo "$l TIS-620" done for l in fa fa_IR; do #echo "$l ISIRI-3342" # a broken encoding echo "$l.utf-8 UTF-8" done ;; linux* | *-gnu*) # With glibc-2.1 or newer, we don't need any canonicalization, # because glibc has iconv and both glibc and libiconv support all # GNU canonical names directly. Therefore, the Makefile does not # need to install the alias file at all. # The following applies only to glibc-2.0.x and older libcs. echo "ISO_646.IRV:1983 ASCII" ;; aix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "IBM-850 CP850" echo "IBM-856 CP856" echo "IBM-921 ISO-8859-13" echo "IBM-922 CP922" echo "IBM-932 CP932" echo "IBM-943 CP943" echo "IBM-1046 CP1046" echo "IBM-1124 CP1124" echo "IBM-1129 CP1129" echo "IBM-1252 CP1252" echo "IBM-eucCN GB2312" echo "IBM-eucJP EUC-JP" echo "IBM-eucKR EUC-KR" echo "IBM-eucTW EUC-TW" echo "big5 BIG5" echo "GBK GBK" echo "TIS-620 TIS-620" echo "UTF-8 UTF-8" ;; hpux*) echo "iso88591 ISO-8859-1" echo "iso88592 ISO-8859-2" echo "iso88595 ISO-8859-5" echo "iso88596 ISO-8859-6" echo "iso88597 ISO-8859-7" echo "iso88598 ISO-8859-8" echo "iso88599 ISO-8859-9" echo "iso885915 ISO-8859-15" echo "roman8 HP-ROMAN8" echo "arabic8 HP-ARABIC8" echo "greek8 HP-GREEK8" echo "hebrew8 HP-HEBREW8" echo "turkish8 HP-TURKISH8" echo "kana8 HP-KANA8" echo "tis620 TIS-620" echo "big5 BIG5" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "hp15CN GB2312" #echo "ccdc ?" # what is this? echo "SJIS SHIFT_JIS" echo "utf8 UTF-8" ;; irix*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-9 ISO-8859-9" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" ;; osf*) echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "cp850 CP850" echo "big5 BIG5" echo "dechanyu DEC-HANYU" echo "dechanzi GB2312" echo "deckanji DEC-KANJI" echo "deckorean EUC-KR" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "GBK GBK" echo "KSC5601 CP949" echo "sdeckanji EUC-JP" echo "SJIS SHIFT_JIS" echo "TACTIS TIS-620" echo "UTF-8 UTF-8" ;; solaris*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-3 ISO-8859-3" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-6 ISO-8859-6" echo "ISO8859-7 ISO-8859-7" echo "ISO8859-8 ISO-8859-8" echo "ISO8859-9 ISO-8859-9" echo "ISO8859-15 ISO-8859-15" echo "koi8-r KOI8-R" echo "ansi-1251 CP1251" echo "BIG5 BIG5" echo "Big5-HKSCS BIG5-HKSCS" echo "gb2312 GB2312" echo "GBK GBK" echo "GB18030 GB18030" echo "cns11643 EUC-TW" echo "5601 EUC-KR" echo "ko_KR.johap92 JOHAB" echo "eucJP EUC-JP" echo "PCK SHIFT_JIS" echo "TIS620.2533 TIS-620" #echo "sun_eu_greek ?" # what is this? echo "UTF-8 UTF-8" ;; freebsd* | os2*) # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just # reuse FreeBSD's locale data for OS/2. echo "C ASCII" echo "US-ASCII ASCII" for l in la_LN lt_LN; do echo "$l.ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do echo "$l.ISO_8859-1 ISO-8859-1" echo "$l.DIS_8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do echo "$l.ISO_8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO_8859-4 ISO-8859-4" done for l in ru_RU ru_SU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO_8859-5 ISO-8859-5" echo "$l.CP866 CP866" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ja_JP.Shift_JIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; netbsd*) echo "646 ASCII" echo "ISO8859-1 ISO-8859-1" echo "ISO8859-2 ISO-8859-2" echo "ISO8859-4 ISO-8859-4" echo "ISO8859-5 ISO-8859-5" echo "ISO8859-15 ISO-8859-15" echo "eucCN GB2312" echo "eucJP EUC-JP" echo "eucKR EUC-KR" echo "eucTW EUC-TW" echo "BIG5 BIG5" echo "SJIS SHIFT_JIS" ;; darwin*) # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "C ASCII" for l in en_AU en_CA en_GB en_US la_LN; do echo "$l.US-ASCII ASCII" done for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ nl_NL no_NO pt_PT sv_SE; do echo "$l ISO-8859-1" echo "$l.ISO8859-1 ISO-8859-1" echo "$l.ISO8859-15 ISO-8859-15" done for l in la_LN; do echo "$l.ISO8859-1 ISO-8859-1" echo "$l.ISO8859-15 ISO-8859-15" done for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do echo "$l.ISO8859-2 ISO-8859-2" done for l in la_LN lt_LT; do echo "$l.ISO8859-4 ISO-8859-4" done for l in ru_RU; do echo "$l.KOI8-R KOI8-R" echo "$l.ISO8859-5 ISO-8859-5" echo "$l.CP866 CP866" done for l in bg_BG; do echo "$l.CP1251 CP1251" done echo "uk_UA.KOI8-U KOI8-U" echo "zh_TW.BIG5 BIG5" echo "zh_TW.Big5 BIG5" echo "zh_CN.EUC GB2312" echo "ja_JP.EUC EUC-JP" echo "ja_JP.SJIS SHIFT_JIS" echo "ko_KR.EUC EUC-KR" ;; beos*) # BeOS has a single locale, and it has UTF-8 encoding. echo "* UTF-8" ;; msdosdjgpp*) # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore # localcharset.c falls back to using the full locale name # from the environment variables. echo "#" echo "# The encodings given here may not all be correct." echo "# If you find that the encoding given for your language and" echo "# country is not the one your DOS machine actually uses, just" echo "# correct it in this file, and send a mail to" echo "# Juan Manuel Guerrero " echo "# and Bruno Haible ." echo "#" echo "C ASCII" # ISO-8859-1 languages echo "ca CP850" echo "ca_ES CP850" echo "da CP865" # not CP850 ?? echo "da_DK CP865" # not CP850 ?? echo "de CP850" echo "de_AT CP850" echo "de_CH CP850" echo "de_DE CP850" echo "en CP850" echo "en_AU CP850" # not CP437 ?? echo "en_CA CP850" echo "en_GB CP850" echo "en_NZ CP437" echo "en_US CP437" echo "en_ZA CP850" # not CP437 ?? echo "es CP850" echo "es_AR CP850" echo "es_BO CP850" echo "es_CL CP850" echo "es_CO CP850" echo "es_CR CP850" echo "es_CU CP850" echo "es_DO CP850" echo "es_EC CP850" echo "es_ES CP850" echo "es_GT CP850" echo "es_HN CP850" echo "es_MX CP850" echo "es_NI CP850" echo "es_PA CP850" echo "es_PY CP850" echo "es_PE CP850" echo "es_SV CP850" echo "es_UY CP850" echo "es_VE CP850" echo "et CP850" echo "et_EE CP850" echo "eu CP850" echo "eu_ES CP850" echo "fi CP850" echo "fi_FI CP850" echo "fr CP850" echo "fr_BE CP850" echo "fr_CA CP850" echo "fr_CH CP850" echo "fr_FR CP850" echo "ga CP850" echo "ga_IE CP850" echo "gd CP850" echo "gd_GB CP850" echo "gl CP850" echo "gl_ES CP850" echo "id CP850" # not CP437 ?? echo "id_ID CP850" # not CP437 ?? echo "is CP861" # not CP850 ?? echo "is_IS CP861" # not CP850 ?? echo "it CP850" echo "it_CH CP850" echo "it_IT CP850" echo "lt CP775" echo "lt_LT CP775" echo "lv CP775" echo "lv_LV CP775" echo "nb CP865" # not CP850 ?? echo "nb_NO CP865" # not CP850 ?? echo "nl CP850" echo "nl_BE CP850" echo "nl_NL CP850" echo "nn CP865" # not CP850 ?? echo "nn_NO CP865" # not CP850 ?? echo "no CP865" # not CP850 ?? echo "no_NO CP865" # not CP850 ?? echo "pt CP850" echo "pt_BR CP850" echo "pt_PT CP850" echo "sv CP850" echo "sv_SE CP850" # ISO-8859-2 languages echo "cs CP852" echo "cs_CZ CP852" echo "hr CP852" echo "hr_HR CP852" echo "hu CP852" echo "hu_HU CP852" echo "pl CP852" echo "pl_PL CP852" echo "ro CP852" echo "ro_RO CP852" echo "sk CP852" echo "sk_SK CP852" echo "sl CP852" echo "sl_SI CP852" echo "sq CP852" echo "sq_AL CP852" echo "sr CP852" # CP852 or CP866 or CP855 ?? echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? # ISO-8859-3 languages echo "mt CP850" echo "mt_MT CP850" # ISO-8859-5 languages echo "be CP866" echo "be_BE CP866" echo "bg CP866" # not CP855 ?? echo "bg_BG CP866" # not CP855 ?? echo "mk CP866" # not CP855 ?? echo "mk_MK CP866" # not CP855 ?? echo "ru CP866" echo "ru_RU CP866" echo "uk CP1125" echo "uk_UA CP1125" # ISO-8859-6 languages echo "ar CP864" echo "ar_AE CP864" echo "ar_DZ CP864" echo "ar_EG CP864" echo "ar_IQ CP864" echo "ar_IR CP864" echo "ar_JO CP864" echo "ar_KW CP864" echo "ar_MA CP864" echo "ar_OM CP864" echo "ar_QA CP864" echo "ar_SA CP864" echo "ar_SY CP864" # ISO-8859-7 languages echo "el CP869" echo "el_GR CP869" # ISO-8859-8 languages echo "he CP862" echo "he_IL CP862" # ISO-8859-9 languages echo "tr CP857" echo "tr_TR CP857" # Japanese echo "ja CP932" echo "ja_JP CP932" # Chinese echo "zh_CN GBK" echo "zh_TW CP950" # not CP938 ?? # Korean echo "kr CP949" # not CP934 ?? echo "kr_KR CP949" # not CP934 ?? # Thai echo "th CP874" echo "th_TH CP874" # Other echo "eo CP850" echo "eo_EO CP850" ;; esac mdk-1.2.9/intl/localealias.c0000644000175000017500000002334012110326462012601 00000000000000/* Handle aliases for locale names. Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for mempcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #if defined _LIBC || defined HAVE___FSETLOCKING # include #endif #include #ifdef __GNUC__ # undef alloca # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #include #include "gettextP.h" #if ENABLE_RELOCATABLE # include "relocatable.h" #else # define relocate(pathname) (pathname) #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # define strcasecmp __strcasecmp # ifndef mempcpy # define mempcpy __mempcpy # endif # define HAVE_MEMPCPY 1 # define HAVE___FSETLOCKING 1 /* We need locking here since we can be called from different places. */ # include __libc_lock_define_initialized (static, lock); #endif #ifndef internal_function # define internal_function #endif /* Some optimizations for glibc. */ #ifdef _LIBC # define FEOF(fp) feof_unlocked (fp) # define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) #else # define FEOF(fp) feof (fp) # define FGETS(buf, n, fp) fgets (buf, n, fp) #endif /* For those losing systems which don't have `alloca' we have to add some additional code emulating it. */ #ifdef HAVE_ALLOCA # define freea(p) /* nothing */ #else # define alloca(n) malloc (n) # define freea(p) free (p) #endif #if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED # undef fgets # define fgets(buf, len, s) fgets_unlocked (buf, len, s) #endif #if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED # undef feof # define feof(s) feof_unlocked (s) #endif struct alias_map { const char *alias; const char *value; }; #ifndef _LIBC # define libc_freeres_ptr(decl) decl #endif libc_freeres_ptr (static char *string_space); static size_t string_space_act; static size_t string_space_max; libc_freeres_ptr (static struct alias_map *map); static size_t nmap; static size_t maxmap; /* Prototypes for local functions. */ static size_t read_alias_file (const char *fname, int fname_len) internal_function; static int extend_alias_table (void); static int alias_compare (const struct alias_map *map1, const struct alias_map *map2); const char * _nl_expand_alias (const char *name) { static const char *locale_alias_path; struct alias_map *retval; const char *result = NULL; size_t added; #ifdef _LIBC __libc_lock_lock (lock); #endif if (locale_alias_path == NULL) locale_alias_path = LOCALE_ALIAS_PATH; do { struct alias_map item; item.alias = name; if (nmap > 0) retval = (struct alias_map *) bsearch (&item, map, nmap, sizeof (struct alias_map), (int (*) (const void *, const void *) ) alias_compare); else retval = NULL; /* We really found an alias. Return the value. */ if (retval != NULL) { result = retval->value; break; } /* Perhaps we can find another alias file. */ added = 0; while (added == 0 && locale_alias_path[0] != '\0') { const char *start; while (locale_alias_path[0] == PATH_SEPARATOR) ++locale_alias_path; start = locale_alias_path; while (locale_alias_path[0] != '\0' && locale_alias_path[0] != PATH_SEPARATOR) ++locale_alias_path; if (start < locale_alias_path) added = read_alias_file (start, locale_alias_path - start); } } while (added != 0); #ifdef _LIBC __libc_lock_unlock (lock); #endif return result; } static size_t internal_function read_alias_file (const char *fname, int fname_len) { FILE *fp; char *full_fname; size_t added; static const char aliasfile[] = "/locale.alias"; full_fname = (char *) alloca (fname_len + sizeof aliasfile); #ifdef HAVE_MEMPCPY mempcpy (mempcpy (full_fname, fname, fname_len), aliasfile, sizeof aliasfile); #else memcpy (full_fname, fname, fname_len); memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); #endif fp = fopen (relocate (full_fname), "r"); freea (full_fname); if (fp == NULL) return 0; #ifdef HAVE___FSETLOCKING /* No threads present. */ __fsetlocking (fp, FSETLOCKING_BYCALLER); #endif added = 0; while (!FEOF (fp)) { /* It is a reasonable approach to use a fix buffer here because a) we are only interested in the first two fields b) these fields must be usable as file names and so must not be that long We avoid a multi-kilobyte buffer here since this would use up stack space which we might not have if the program ran out of memory. */ char buf[400]; char *alias; char *value; char *cp; if (FGETS (buf, sizeof buf, fp) == NULL) /* EOF reached. */ break; cp = buf; /* Ignore leading white space. */ while (isspace ((unsigned char) cp[0])) ++cp; /* A leading '#' signals a comment line. */ if (cp[0] != '\0' && cp[0] != '#') { alias = cp++; while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) ++cp; /* Terminate alias name. */ if (cp[0] != '\0') *cp++ = '\0'; /* Now look for the beginning of the value. */ while (isspace ((unsigned char) cp[0])) ++cp; if (cp[0] != '\0') { size_t alias_len; size_t value_len; value = cp++; while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) ++cp; /* Terminate value. */ if (cp[0] == '\n') { /* This has to be done to make the following test for the end of line possible. We are looking for the terminating '\n' which do not overwrite here. */ *cp++ = '\0'; *cp = '\n'; } else if (cp[0] != '\0') *cp++ = '\0'; if (nmap >= maxmap) if (__builtin_expect (extend_alias_table (), 0)) return added; alias_len = strlen (alias) + 1; value_len = strlen (value) + 1; if (string_space_act + alias_len + value_len > string_space_max) { /* Increase size of memory pool. */ size_t new_size = (string_space_max + (alias_len + value_len > 1024 ? alias_len + value_len : 1024)); char *new_pool = (char *) realloc (string_space, new_size); if (new_pool == NULL) return added; if (__builtin_expect (string_space != new_pool, 0)) { size_t i; for (i = 0; i < nmap; i++) { map[i].alias += new_pool - string_space; map[i].value += new_pool - string_space; } } string_space = new_pool; string_space_max = new_size; } map[nmap].alias = memcpy (&string_space[string_space_act], alias, alias_len); string_space_act += alias_len; map[nmap].value = memcpy (&string_space[string_space_act], value, value_len); string_space_act += value_len; ++nmap; ++added; } } /* Possibly not the whole line fits into the buffer. Ignore the rest of the line. */ while (strchr (buf, '\n') == NULL) if (FGETS (buf, sizeof buf, fp) == NULL) /* Make sure the inner loop will be left. The outer loop will exit at the `feof' test. */ break; } /* Should we test for ferror()? I think we have to silently ignore errors. --drepper */ fclose (fp); if (added > 0) qsort (map, nmap, sizeof (struct alias_map), (int (*) (const void *, const void *)) alias_compare); return added; } static int extend_alias_table () { size_t new_size; struct alias_map *new_map; new_size = maxmap == 0 ? 100 : 2 * maxmap; new_map = (struct alias_map *) realloc (map, (new_size * sizeof (struct alias_map))); if (new_map == NULL) /* Simply don't extend: we don't have any more core. */ return -1; map = new_map; maxmap = new_size; return 0; } static int alias_compare (const struct alias_map *map1, const struct alias_map *map2) { #if defined _LIBC || defined HAVE_STRCASECMP return strcasecmp (map1->alias, map2->alias); #else const unsigned char *p1 = (const unsigned char *) map1->alias; const unsigned char *p2 = (const unsigned char *) map2->alias; unsigned char c1, c2; if (p1 == p2) return 0; do { /* I know this seems to be odd but the tolower() function in some systems libc cannot handle nonalpha characters. */ c1 = isupper (*p1) ? tolower (*p1) : *p1; c2 = isupper (*p2) ? tolower (*p2) : *p2; if (c1 == '\0') break; ++p1; ++p2; } while (c1 == c2); return c1 - c2; #endif } mdk-1.2.9/intl/l10nflist.c0000644000175000017500000002733012110326462012147 00000000000000/* Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. Contributed by Ulrich Drepper , 1995. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for stpcpy(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #include #if defined _LIBC || defined HAVE_ARGZ_H # include #endif #include #include #include #include "loadinfo.h" /* On some strange systems still no definition of NULL is found. Sigh! */ #ifndef NULL # if defined __STDC__ && __STDC__ # define NULL ((void *) 0) # else # define NULL 0 # endif #endif /* @@ end of prolog @@ */ #ifdef _LIBC /* Rename the non ANSI C functions. This is required by the standard because some ANSI C functions will require linking with this object file and the name space must not be polluted. */ # ifndef stpcpy # define stpcpy(dest, src) __stpcpy(dest, src) # endif #else # ifndef HAVE_STPCPY static char *stpcpy (char *dest, const char *src); # endif #endif /* Pathname support. ISSLASH(C) tests whether C is a directory separator character. IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, it may be concatenated to a directory pathname. */ #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ /* Win32, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') # define HAS_DEVICE(P) \ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ && (P)[1] == ':') # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) #endif /* Define function which are usually not available. */ #if !defined _LIBC && !defined HAVE___ARGZ_COUNT /* Returns the number of strings in ARGZ. */ static size_t argz_count__ (const char *argz, size_t len) { size_t count = 0; while (len > 0) { size_t part_len = strlen (argz); argz += part_len + 1; len -= part_len + 1; count++; } return count; } # undef __argz_count # define __argz_count(argz, len) argz_count__ (argz, len) #else # ifdef _LIBC # define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) # endif #endif /* !_LIBC && !HAVE___ARGZ_COUNT */ #if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's except the last into the character SEP. */ static void argz_stringify__ (char *argz, size_t len, int sep) { while (len > 0) { size_t part_len = strlen (argz); argz += part_len; len -= part_len + 1; if (len > 0) *argz++ = sep; } } # undef __argz_stringify # define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep) #else # ifdef _LIBC # define __argz_stringify(argz, len, sep) \ INTUSE(__argz_stringify) (argz, len, sep) # endif #endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */ #if !defined _LIBC && !defined HAVE___ARGZ_NEXT static char * argz_next__ (char *argz, size_t argz_len, const char *entry) { if (entry) { if (entry < argz + argz_len) entry = strchr (entry, '\0') + 1; return entry >= argz + argz_len ? NULL : (char *) entry; } else if (argz_len > 0) return argz; else return 0; } # undef __argz_next # define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) #endif /* !_LIBC && !HAVE___ARGZ_NEXT */ /* Return number of bits set in X. */ static inline int pop (int x) { /* We assume that no more than 16 bits are used. */ x = ((x & ~0x5555) >> 1) + (x & 0x5555); x = ((x & ~0x3333) >> 2) + (x & 0x3333); x = ((x >> 4) + x) & 0x0f0f; x = ((x >> 8) + x) & 0xff; return x; } struct loaded_l10nfile * _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list, const char *dirlist, size_t dirlist_len, int mask, const char *language, const char *territory, const char *codeset, const char *normalized_codeset, const char *modifier, const char *special, const char *sponsor, const char *revision, const char *filename, int do_allocate) { char *abs_filename; struct loaded_l10nfile **lastp; struct loaded_l10nfile *retval; char *cp; size_t dirlist_count; size_t entries; int cnt; /* If LANGUAGE contains an absolute directory specification, we ignore DIRLIST. */ if (IS_ABSOLUTE_PATH (language)) dirlist_len = 0; /* Allocate room for the full file name. */ abs_filename = (char *) malloc (dirlist_len + strlen (language) + ((mask & TERRITORY) != 0 ? strlen (territory) + 1 : 0) + ((mask & XPG_CODESET) != 0 ? strlen (codeset) + 1 : 0) + ((mask & XPG_NORM_CODESET) != 0 ? strlen (normalized_codeset) + 1 : 0) + (((mask & XPG_MODIFIER) != 0 || (mask & CEN_AUDIENCE) != 0) ? strlen (modifier) + 1 : 0) + ((mask & CEN_SPECIAL) != 0 ? strlen (special) + 1 : 0) + (((mask & CEN_SPONSOR) != 0 || (mask & CEN_REVISION) != 0) ? (1 + ((mask & CEN_SPONSOR) != 0 ? strlen (sponsor) : 0) + ((mask & CEN_REVISION) != 0 ? strlen (revision) + 1 : 0)) : 0) + 1 + strlen (filename) + 1); if (abs_filename == NULL) return NULL; /* Construct file name. */ cp = abs_filename; if (dirlist_len > 0) { memcpy (cp, dirlist, dirlist_len); __argz_stringify (cp, dirlist_len, PATH_SEPARATOR); cp += dirlist_len; cp[-1] = '/'; } cp = stpcpy (cp, language); if ((mask & TERRITORY) != 0) { *cp++ = '_'; cp = stpcpy (cp, territory); } if ((mask & XPG_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, codeset); } if ((mask & XPG_NORM_CODESET) != 0) { *cp++ = '.'; cp = stpcpy (cp, normalized_codeset); } if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) { /* This component can be part of both syntaces but has different leading characters. For CEN we use `+', else `@'. */ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@'; cp = stpcpy (cp, modifier); } if ((mask & CEN_SPECIAL) != 0) { *cp++ = '+'; cp = stpcpy (cp, special); } if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0) { *cp++ = ','; if ((mask & CEN_SPONSOR) != 0) cp = stpcpy (cp, sponsor); if ((mask & CEN_REVISION) != 0) { *cp++ = '_'; cp = stpcpy (cp, revision); } } *cp++ = '/'; stpcpy (cp, filename); /* Look in list of already loaded domains whether it is already available. */ lastp = l10nfile_list; for (retval = *l10nfile_list; retval != NULL; retval = retval->next) if (retval->filename != NULL) { int compare = strcmp (retval->filename, abs_filename); if (compare == 0) /* We found it! */ break; if (compare < 0) { /* It's not in the list. */ retval = NULL; break; } lastp = &retval->next; } if (retval != NULL || do_allocate == 0) { free (abs_filename); return retval; } dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); /* Allocate a new loaded_l10nfile. */ retval = (struct loaded_l10nfile *) malloc (sizeof (*retval) + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) * sizeof (struct loaded_l10nfile *))); if (retval == NULL) return NULL; retval->filename = abs_filename; /* We set retval->data to NULL here; it is filled in later. Setting retval->decided to 1 here means that retval does not correspond to a real file (dirlist_count > 1) or is not worth looking up (if an unnormalized codeset was specified). */ retval->decided = (dirlist_count > 1 || ((mask & XPG_CODESET) != 0 && (mask & XPG_NORM_CODESET) != 0)); retval->data = NULL; retval->next = *lastp; *lastp = retval; entries = 0; /* Recurse to fill the inheritance list of RETVAL. If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL entry does not correspond to a real file; retval->filename contains colons. In this case we loop across all elements of DIRLIST and across all bit patterns dominated by MASK. If the DIRLIST is a single directory or entirely redundant (i.e. DIRLIST_COUNT == 1), we loop across all bit patterns dominated by MASK, excluding MASK itself. In either case, we loop down from MASK to 0. This has the effect that the extra bits in the locale name are dropped in this order: first the modifier, then the territory, then the codeset, then the normalized_codeset. */ for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) if ((cnt & ~mask) == 0 && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0)) { if (dirlist_count > 1) { /* Iterate over all elements of the DIRLIST. */ char *dir = NULL; while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir)) != NULL) retval->successor[entries++] = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, 1); } else retval->successor[entries++] = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, cnt, language, territory, codeset, normalized_codeset, modifier, special, sponsor, revision, filename, 1); } retval->successor[entries] = NULL; return retval; } /* Normalize codeset name. There is no standard for the codeset names. Normalization allows the user to use any of the common names. The return value is dynamically allocated and has to be freed by the caller. */ const char * _nl_normalize_codeset (const char *codeset, size_t name_len) { int len = 0; int only_digit = 1; char *retval; char *wp; size_t cnt; for (cnt = 0; cnt < name_len; ++cnt) if (isalnum ((unsigned char) codeset[cnt])) { ++len; if (isalpha ((unsigned char) codeset[cnt])) only_digit = 0; } retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1); if (retval != NULL) { if (only_digit) wp = stpcpy (retval, "iso"); else wp = retval; for (cnt = 0; cnt < name_len; ++cnt) if (isalpha ((unsigned char) codeset[cnt])) *wp++ = tolower ((unsigned char) codeset[cnt]); else if (isdigit ((unsigned char) codeset[cnt])) *wp++ = codeset[cnt]; *wp = '\0'; } return (const char *) retval; } /* @@ begin of epilog @@ */ /* We don't want libintl.a to depend on any other library. So we avoid the non-standard function stpcpy. In GNU C Library this function is available, though. Also allow the symbol HAVE_STPCPY to be defined. */ #if !_LIBC && !HAVE_STPCPY static char * stpcpy (char *dest, const char *src) { while ((*dest++ = *src++) != '\0') /* Do nothing. */ ; return dest - 1; } #endif mdk-1.2.9/intl/printf-args.h0000644000175000017500000000550212110326462012571 00000000000000/* Decomposed printf argument list. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PRINTF_ARGS_H #define _PRINTF_ARGS_H /* Get size_t. */ #include /* Get wchar_t. */ #ifdef HAVE_WCHAR_T # include #endif /* Get wint_t. */ #ifdef HAVE_WINT_T # include #endif /* Get va_list. */ #include /* Argument types */ typedef enum { TYPE_NONE, TYPE_SCHAR, TYPE_UCHAR, TYPE_SHORT, TYPE_USHORT, TYPE_INT, TYPE_UINT, TYPE_LONGINT, TYPE_ULONGINT, #ifdef HAVE_LONG_LONG TYPE_LONGLONGINT, TYPE_ULONGLONGINT, #endif TYPE_DOUBLE, #ifdef HAVE_LONG_DOUBLE TYPE_LONGDOUBLE, #endif TYPE_CHAR, #ifdef HAVE_WINT_T TYPE_WIDE_CHAR, #endif TYPE_STRING, #ifdef HAVE_WCHAR_T TYPE_WIDE_STRING, #endif TYPE_POINTER, TYPE_COUNT_SCHAR_POINTER, TYPE_COUNT_SHORT_POINTER, TYPE_COUNT_INT_POINTER, TYPE_COUNT_LONGINT_POINTER #ifdef HAVE_LONG_LONG , TYPE_COUNT_LONGLONGINT_POINTER #endif } arg_type; /* Polymorphic argument */ typedef struct { arg_type type; union { signed char a_schar; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long int a_longint; unsigned long int a_ulongint; #ifdef HAVE_LONG_LONG long long int a_longlongint; unsigned long long int a_ulonglongint; #endif float a_float; double a_double; #ifdef HAVE_LONG_DOUBLE long double a_longdouble; #endif int a_char; #ifdef HAVE_WINT_T wint_t a_wide_char; #endif const char* a_string; #ifdef HAVE_WCHAR_T const wchar_t* a_wide_string; #endif void* a_pointer; signed char * a_count_schar_pointer; short * a_count_short_pointer; int * a_count_int_pointer; long int * a_count_longint_pointer; #ifdef HAVE_LONG_LONG long long int * a_count_longlongint_pointer; #endif } a; } argument; typedef struct { size_t count; argument *arg; } arguments; /* Fetch the arguments, putting them into a. */ #ifdef STATIC STATIC #else extern #endif int printf_fetchargs (va_list args, arguments *a); #endif /* _PRINTF_ARGS_H */ mdk-1.2.9/intl/os2compat.c0000644000175000017500000000550312110326462012240 00000000000000/* OS/2 compatibility functions. Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define OS2_AWARE #ifdef HAVE_CONFIG_H #include #endif #include #include #include /* A version of getenv() that works from DLLs */ extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue); char * _nl_getenv (const char *name) { unsigned char *value; if (DosScanEnv (name, &value)) return NULL; else return value; } /* A fixed size buffer. */ char libintl_nl_default_dirname[MAXPATHLEN+1]; char *_nlos2_libdir = NULL; char *_nlos2_localealiaspath = NULL; char *_nlos2_localedir = NULL; static __attribute__((constructor)) void nlos2_initialize () { char *root = getenv ("UNIXROOT"); char *gnulocaledir = getenv ("GNULOCALEDIR"); _nlos2_libdir = gnulocaledir; if (!_nlos2_libdir) { if (root) { size_t sl = strlen (root); _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1); memcpy (_nlos2_libdir, root, sl); memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1); } else _nlos2_libdir = LIBDIR; } _nlos2_localealiaspath = gnulocaledir; if (!_nlos2_localealiaspath) { if (root) { size_t sl = strlen (root); _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1); memcpy (_nlos2_localealiaspath, root, sl); memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1); } else _nlos2_localealiaspath = LOCALE_ALIAS_PATH; } _nlos2_localedir = gnulocaledir; if (!_nlos2_localedir) { if (root) { size_t sl = strlen (root); _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1); memcpy (_nlos2_localedir, root, sl); memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1); } else _nlos2_localedir = LOCALEDIR; } if (strlen (_nlos2_localedir) <= MAXPATHLEN) strcpy (libintl_nl_default_dirname, _nlos2_localedir); } mdk-1.2.9/intl/printf.c0000644000175000017500000001717712110326462011645 00000000000000/* Formatted output to strings, using POSIX/XSI format strings with positions. Copyright (C) 2003 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # ifdef _MSC_VER # include # define alloca _alloca # else # if defined HAVE_ALLOCA_H || defined _LIBC # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca char *alloca (); # endif # endif # endif # endif #endif #include #if !HAVE_POSIX_PRINTF #include #include /* When building a DLL, we must export some functions. Note that because the functions are only defined for binary backward compatibility, we don't need to use __declspec(dllimport) in any case. */ #if defined _MSC_VER && BUILDING_DLL # define DLL_EXPORTED __declspec(dllexport) #else # define DLL_EXPORTED #endif #define STATIC static /* Define auxiliary functions declared in "printf-args.h". */ #include "printf-args.c" /* Define auxiliary functions declared in "printf-parse.h". */ #include "printf-parse.c" /* Define functions declared in "vasnprintf.h". */ #define vasnprintf libintl_vasnprintf #include "vasnprintf.c" #if 0 /* not needed */ #define asnprintf libintl_asnprintf #include "asnprintf.c" #endif DLL_EXPORTED int libintl_vfprintf (FILE *stream, const char *format, va_list args) { if (strchr (format, '$') == NULL) return vfprintf (stream, format, args); else { size_t length; char *result = libintl_vasnprintf (NULL, &length, format, args); int retval = -1; if (result != NULL) { if (fwrite (result, 1, length, stream) == length) retval = length; free (result); } return retval; } } DLL_EXPORTED int libintl_fprintf (FILE *stream, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vfprintf (stream, format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vprintf (const char *format, va_list args) { return libintl_vfprintf (stdout, format, args); } DLL_EXPORTED int libintl_printf (const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vprintf (format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vsprintf (char *resultbuf, const char *format, va_list args) { if (strchr (format, '$') == NULL) return vsprintf (resultbuf, format, args); else { size_t length = (size_t) ~0 / (4 * sizeof (char)); char *result = libintl_vasnprintf (resultbuf, &length, format, args); if (result != resultbuf) { free (result); return -1; } else return length; } } DLL_EXPORTED int libintl_sprintf (char *resultbuf, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vsprintf (resultbuf, format, args); va_end (args); return retval; } #if HAVE_SNPRINTF # if HAVE_DECL__SNPRINTF /* Windows. */ # define system_vsnprintf _vsnprintf # else /* Unix. */ # define system_vsnprintf vsnprintf # endif DLL_EXPORTED int libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args) { if (strchr (format, '$') == NULL) return system_vsnprintf (resultbuf, length, format, args); else { size_t maxlength = length; char *result = libintl_vasnprintf (resultbuf, &length, format, args); if (result != resultbuf) { if (maxlength > 0) { if (length < maxlength) abort (); memcpy (resultbuf, result, maxlength - 1); resultbuf[maxlength - 1] = '\0'; } free (result); return -1; } else return length; } } DLL_EXPORTED int libintl_snprintf (char *resultbuf, size_t length, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vsnprintf (resultbuf, length, format, args); va_end (args); return retval; } #endif #if HAVE_ASPRINTF DLL_EXPORTED int libintl_vasprintf (char **resultp, const char *format, va_list args) { size_t length; char *result = libintl_vasnprintf (NULL, &length, format, args); if (result == NULL) return -1; *resultp = result; return length; } DLL_EXPORTED int libintl_asprintf (char **resultp, const char *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vasprintf (resultp, format, args); va_end (args); return retval; } #endif #if HAVE_FWPRINTF #include #define WIDE_CHAR_VERSION 1 /* Define auxiliary functions declared in "wprintf-parse.h". */ #include "printf-parse.c" /* Define functions declared in "vasnprintf.h". */ #define vasnwprintf libintl_vasnwprintf #include "vasnprintf.c" #if 0 /* not needed */ #define asnwprintf libintl_asnwprintf #include "asnprintf.c" #endif # if HAVE_DECL__SNWPRINTF /* Windows. */ # define system_vswprintf _vsnwprintf # else /* Unix. */ # define system_vswprintf vswprintf # endif DLL_EXPORTED int libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args) { if (wcschr (format, '$') == NULL) return vfwprintf (stream, format, args); else { size_t length; wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args); int retval = -1; if (result != NULL) { size_t i; for (i = 0; i < length; i++) if (fputwc (result[i], stream) == WEOF) break; if (i == length) retval = length; free (result); } return retval; } } DLL_EXPORTED int libintl_fwprintf (FILE *stream, const wchar_t *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vfwprintf (stream, format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vwprintf (const wchar_t *format, va_list args) { return libintl_vfwprintf (stdout, format, args); } DLL_EXPORTED int libintl_wprintf (const wchar_t *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vwprintf (format, args); va_end (args); return retval; } DLL_EXPORTED int libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args) { if (wcschr (format, '$') == NULL) return system_vswprintf (resultbuf, length, format, args); else { size_t maxlength = length; wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args); if (result != resultbuf) { if (maxlength > 0) { if (length < maxlength) abort (); memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t)); resultbuf[maxlength - 1] = 0; } free (result); return -1; } else return length; } } DLL_EXPORTED int libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...) { va_list args; int retval; va_start (args, format); retval = libintl_vswprintf (resultbuf, length, format, args); va_end (args); return retval; } #endif #endif mdk-1.2.9/intl/hash-string.h0000644000175000017500000000314112110326462012561 00000000000000/* Description of GNU message catalog format: string hashing function. Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* @@ end of prolog @@ */ /* We assume to have `unsigned long int' value with at least 32 bits. */ #define HASHWORDBITS 32 /* Defines the so called `hashpjw' function by P.J. Weinberger [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools, 1986, 1987 Bell Telephone Laboratories, Inc.] */ static inline unsigned long int hash_string (const char *str_param) { unsigned long int hval, g; const char *str = str_param; /* Compute the hash value for the given string. */ hval = 0; while (*str != '\0') { hval <<= 4; hval += (unsigned char) *str++; g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); if (g != 0) { hval ^= g >> (HASHWORDBITS - 8); hval ^= g; } } return hval; } mdk-1.2.9/intl/locale.alias0000644000175000017500000000512212110326462012434 00000000000000# Locale name alias data base. # Copyright (C) 1996-2001,2003 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # The format of this file is the same as for the corresponding file of # the X Window System, which normally can be found in # /usr/lib/X11/locale/locale.alias # A single line contains two fields: an alias and a substitution value. # All entries are case independent. # Note: This file is far from being complete. If you have a value for # your own site which you think might be useful for others too, share # it with the rest of us. Send it using the `glibcbug' script to # bugs@gnu.org. # Packages using this file: bokmal nb_NO.ISO-8859-1 bokmål nb_NO.ISO-8859-1 catalan ca_ES.ISO-8859-1 croatian hr_HR.ISO-8859-2 czech cs_CZ.ISO-8859-2 danish da_DK.ISO-8859-1 dansk da_DK.ISO-8859-1 deutsch de_DE.ISO-8859-1 dutch nl_NL.ISO-8859-1 eesti et_EE.ISO-8859-1 estonian et_EE.ISO-8859-1 finnish fi_FI.ISO-8859-1 français fr_FR.ISO-8859-1 french fr_FR.ISO-8859-1 galego gl_ES.ISO-8859-1 galician gl_ES.ISO-8859-1 german de_DE.ISO-8859-1 greek el_GR.ISO-8859-7 hebrew he_IL.ISO-8859-8 hrvatski hr_HR.ISO-8859-2 hungarian hu_HU.ISO-8859-2 icelandic is_IS.ISO-8859-1 italian it_IT.ISO-8859-1 japanese ja_JP.eucJP japanese.euc ja_JP.eucJP ja_JP ja_JP.eucJP ja_JP.ujis ja_JP.eucJP japanese.sjis ja_JP.SJIS korean ko_KR.eucKR korean.euc ko_KR.eucKR ko_KR ko_KR.eucKR lithuanian lt_LT.ISO-8859-13 no_NO nb_NO.ISO-8859-1 no_NO.ISO-8859-1 nb_NO.ISO-8859-1 norwegian nb_NO.ISO-8859-1 nynorsk nn_NO.ISO-8859-1 polish pl_PL.ISO-8859-2 portuguese pt_PT.ISO-8859-1 romanian ro_RO.ISO-8859-2 russian ru_RU.ISO-8859-5 slovak sk_SK.ISO-8859-2 slovene sl_SI.ISO-8859-2 slovenian sl_SI.ISO-8859-2 spanish es_ES.ISO-8859-1 swedish sv_SE.ISO-8859-1 thai th_TH.TIS-620 turkish tr_TR.ISO-8859-9 mdk-1.2.9/intl/localcharset.h0000644000175000017500000000255712110326462013010 00000000000000/* Determine a canonical name for the current locale's character encoding. Copyright (C) 2000-2003 Free Software Foundation, Inc. This file is part of the GNU CHARSET Library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LOCALCHARSET_H #define _LOCALCHARSET_H #ifdef __cplusplus extern "C" { #endif /* Determine the current locale's character encoding, and canonicalize it into one of the canonical names listed in config.charset. The result must not be freed; it is statically allocated. If the canonical name cannot be determined, the result is a non-canonical name. */ extern const char * locale_charset (void); #ifdef __cplusplus } #endif #endif /* _LOCALCHARSET_H */ mdk-1.2.9/intl/eval-plural.h0000644000175000017500000000532212110326462012561 00000000000000/* Plural expression evaluation. Copyright (C) 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef STATIC #define STATIC static #endif /* Evaluate the plural expression and return an index value. */ STATIC unsigned long int internal_function plural_eval (struct expression *pexp, unsigned long int n) { switch (pexp->nargs) { case 0: switch (pexp->operation) { case var: return n; case num: return pexp->val.num; default: break; } /* NOTREACHED */ break; case 1: { /* pexp->operation must be lnot. */ unsigned long int arg = plural_eval (pexp->val.args[0], n); return ! arg; } case 2: { unsigned long int leftarg = plural_eval (pexp->val.args[0], n); if (pexp->operation == lor) return leftarg || plural_eval (pexp->val.args[1], n); else if (pexp->operation == land) return leftarg && plural_eval (pexp->val.args[1], n); else { unsigned long int rightarg = plural_eval (pexp->val.args[1], n); switch (pexp->operation) { case mult: return leftarg * rightarg; case divide: #if !INTDIV0_RAISES_SIGFPE if (rightarg == 0) raise (SIGFPE); #endif return leftarg / rightarg; case module: #if !INTDIV0_RAISES_SIGFPE if (rightarg == 0) raise (SIGFPE); #endif return leftarg % rightarg; case plus: return leftarg + rightarg; case minus: return leftarg - rightarg; case less_than: return leftarg < rightarg; case greater_than: return leftarg > rightarg; case less_or_equal: return leftarg <= rightarg; case greater_or_equal: return leftarg >= rightarg; case equal: return leftarg == rightarg; case not_equal: return leftarg != rightarg; default: break; } } /* NOTREACHED */ break; } case 3: { /* pexp->operation must be qmop. */ unsigned long int boolarg = plural_eval (pexp->val.args[0], n); return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); } } /* NOTREACHED */ return 0; } mdk-1.2.9/intl/printf-parse.h0000644000175000017500000000420712110326462012750 00000000000000/* Parse printf format string. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PRINTF_PARSE_H #define _PRINTF_PARSE_H #include "printf-args.h" /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 /* arg_index value indicating that no argument is consumed. */ #define ARG_NONE (~(size_t)0) /* A parsed directive. */ typedef struct { const char* dir_start; const char* dir_end; int flags; const char* width_start; const char* width_end; size_t width_arg_index; const char* precision_start; const char* precision_end; size_t precision_arg_index; char conversion; /* d i o u x X f e E g G c s p n U % but not C S */ size_t arg_index; } char_directive; /* A parsed format string. */ typedef struct { size_t count; char_directive *dir; size_t max_width_length; size_t max_precision_length; } char_directives; /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #ifdef STATIC STATIC #else extern #endif int printf_parse (const char *format, char_directives *d, arguments *a); #endif /* _PRINTF_PARSE_H */ mdk-1.2.9/intl/plural.y0000644000175000017500000001627112110326462011662 00000000000000%{ /* Expression parsing for plural form selection. Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc. Written by Ulrich Drepper , 2000. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* The bison generated parser uses alloca. AIX 3 forces us to put this declaration at the beginning of the file. The declaration in bison's skeleton file comes too late. This must come before because may include arbitrary system headers. */ #if defined _AIX && !defined __GNUC__ #pragma alloca #endif #ifdef HAVE_CONFIG_H # include #endif #include #include #include "plural-exp.h" /* The main function generated by the parser is called __gettextparse, but we want it to be called PLURAL_PARSE. */ #ifndef _LIBC # define __gettextparse PLURAL_PARSE #endif #define YYLEX_PARAM &((struct parse_args *) arg)->cp #define YYPARSE_PARAM arg %} %pure_parser %expect 7 %union { unsigned long int num; enum operator op; struct expression *exp; } %{ /* Prototypes for local functions. */ static int yylex (YYSTYPE *lval, const char **pexp); static void yyerror (const char *str); /* Allocation of expressions. */ static struct expression * new_exp (int nargs, enum operator op, struct expression * const *args) { int i; struct expression *newp; /* If any of the argument could not be malloc'ed, just return NULL. */ for (i = nargs - 1; i >= 0; i--) if (args[i] == NULL) goto fail; /* Allocate a new expression. */ newp = (struct expression *) malloc (sizeof (*newp)); if (newp != NULL) { newp->nargs = nargs; newp->operation = op; for (i = nargs - 1; i >= 0; i--) newp->val.args[i] = args[i]; return newp; } fail: for (i = nargs - 1; i >= 0; i--) FREE_EXPRESSION (args[i]); return NULL; } static inline struct expression * new_exp_0 (enum operator op) { return new_exp (0, op, NULL); } static inline struct expression * new_exp_1 (enum operator op, struct expression *right) { struct expression *args[1]; args[0] = right; return new_exp (1, op, args); } static struct expression * new_exp_2 (enum operator op, struct expression *left, struct expression *right) { struct expression *args[2]; args[0] = left; args[1] = right; return new_exp (2, op, args); } static inline struct expression * new_exp_3 (enum operator op, struct expression *bexp, struct expression *tbranch, struct expression *fbranch) { struct expression *args[3]; args[0] = bexp; args[1] = tbranch; args[2] = fbranch; return new_exp (3, op, args); } %} /* This declares that all operators have the same associativity and the precedence order as in C. See [Harbison, Steele: C, A Reference Manual]. There is no unary minus and no bitwise operators. Operators with the same syntactic behaviour have been merged into a single token, to save space in the array generated by bison. */ %right '?' /* ? */ %left '|' /* || */ %left '&' /* && */ %left EQUOP2 /* == != */ %left CMPOP2 /* < > <= >= */ %left ADDOP2 /* + - */ %left MULOP2 /* * / % */ %right '!' /* ! */ %token EQUOP2 CMPOP2 ADDOP2 MULOP2 %token NUMBER %type exp %% start: exp { if ($1 == NULL) YYABORT; ((struct parse_args *) arg)->res = $1; } ; exp: exp '?' exp ':' exp { $$ = new_exp_3 (qmop, $1, $3, $5); } | exp '|' exp { $$ = new_exp_2 (lor, $1, $3); } | exp '&' exp { $$ = new_exp_2 (land, $1, $3); } | exp EQUOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp CMPOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp ADDOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | exp MULOP2 exp { $$ = new_exp_2 ($2, $1, $3); } | '!' exp { $$ = new_exp_1 (lnot, $2); } | 'n' { $$ = new_exp_0 (var); } | NUMBER { if (($$ = new_exp_0 (num)) != NULL) $$->val.num = $1; } | '(' exp ')' { $$ = $2; } ; %% void internal_function FREE_EXPRESSION (struct expression *exp) { if (exp == NULL) return; /* Handle the recursive case. */ switch (exp->nargs) { case 3: FREE_EXPRESSION (exp->val.args[2]); /* FALLTHROUGH */ case 2: FREE_EXPRESSION (exp->val.args[1]); /* FALLTHROUGH */ case 1: FREE_EXPRESSION (exp->val.args[0]); /* FALLTHROUGH */ default: break; } free (exp); } static int yylex (YYSTYPE *lval, const char **pexp) { const char *exp = *pexp; int result; while (1) { if (exp[0] == '\0') { *pexp = exp; return YYEOF; } if (exp[0] != ' ' && exp[0] != '\t') break; ++exp; } result = *exp++; switch (result) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { unsigned long int n = result - '0'; while (exp[0] >= '0' && exp[0] <= '9') { n *= 10; n += exp[0] - '0'; ++exp; } lval->num = n; result = NUMBER; } break; case '=': if (exp[0] == '=') { ++exp; lval->op = equal; result = EQUOP2; } else result = YYERRCODE; break; case '!': if (exp[0] == '=') { ++exp; lval->op = not_equal; result = EQUOP2; } break; case '&': case '|': if (exp[0] == result) ++exp; else result = YYERRCODE; break; case '<': if (exp[0] == '=') { ++exp; lval->op = less_or_equal; } else lval->op = less_than; result = CMPOP2; break; case '>': if (exp[0] == '=') { ++exp; lval->op = greater_or_equal; } else lval->op = greater_than; result = CMPOP2; break; case '*': lval->op = mult; result = MULOP2; break; case '/': lval->op = divide; result = MULOP2; break; case '%': lval->op = module; result = MULOP2; break; case '+': lval->op = plus; result = ADDOP2; break; case '-': lval->op = minus; result = ADDOP2; break; case 'n': case '?': case ':': case '(': case ')': /* Nothing, just return the character. */ break; case ';': case '\n': case '\0': /* Be safe and let the user call this function again. */ --exp; result = YYEOF; break; default: result = YYERRCODE; #if YYDEBUG != 0 --exp; #endif break; } *pexp = exp; return result; } static void yyerror (const char *str) { /* Do nothing. We don't print error messages here. */ } mdk-1.2.9/intl/wprintf-parse.h0000644000175000017500000000425712110326462013144 00000000000000/* Parse printf format string. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _WPRINTF_PARSE_H #define _WPRINTF_PARSE_H #include "printf-args.h" /* Flags */ #define FLAG_GROUP 1 /* ' flag */ #define FLAG_LEFT 2 /* - flag */ #define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SPACE 8 /* space flag */ #define FLAG_ALT 16 /* # flag */ #define FLAG_ZERO 32 /* arg_index value indicating that no argument is consumed. */ #define ARG_NONE (~(size_t)0) /* A parsed directive. */ typedef struct { const wchar_t* dir_start; const wchar_t* dir_end; int flags; const wchar_t* width_start; const wchar_t* width_end; size_t width_arg_index; const wchar_t* precision_start; const wchar_t* precision_end; size_t precision_arg_index; wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */ size_t arg_index; } wchar_t_directive; /* A parsed format string. */ typedef struct { size_t count; wchar_t_directive *dir; size_t max_width_length; size_t max_precision_length; } wchar_t_directives; /* Parses the format string. Fills in the number N of directives, and fills in directives[0], ..., directives[N-1], and sets directives[N].dir_start to the end of the format string. Also fills in the arg_type fields of the arguments and the needed count of arguments. */ #ifdef STATIC STATIC #else extern #endif int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a); #endif /* _WPRINTF_PARSE_H */ mdk-1.2.9/intl/relocatable.h0000644000175000017500000000523512110326462012615 00000000000000/* Provide relocatable packages. Copyright (C) 2003 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RELOCATABLE_H #define _RELOCATABLE_H #ifdef __cplusplus extern "C" { #endif /* This can be enabled through the configure --enable-relocatable option. */ #if ENABLE_RELOCATABLE /* When building a DLL, we must export some functions. Note that because this is a private .h file, we don't need to use __declspec(dllimport) in any case. */ #if defined _MSC_VER && BUILDING_DLL # define RELOCATABLE_DLL_EXPORTED __declspec(dllexport) #else # define RELOCATABLE_DLL_EXPORTED #endif /* Sets the original and the current installation prefix of the package. Relocation simply replaces a pathname starting with the original prefix by the corresponding pathname with the current prefix instead. Both prefixes should be directory names without trailing slash (i.e. use "" instead of "/"). */ extern RELOCATABLE_DLL_EXPORTED void set_relocation_prefix (const char *orig_prefix, const char *curr_prefix); /* Returns the pathname, relocated according to the current installation directory. */ extern const char * relocate (const char *pathname); /* Memory management: relocate() leaks memory, because it has to construct a fresh pathname. If this is a problem because your program calls relocate() frequently, think about caching the result. */ /* Convenience function: Computes the current installation prefix, based on the original installation prefix, the original installation directory of a particular file, and the current pathname of this file. Returns NULL upon failure. */ extern const char * compute_curr_prefix (const char *orig_installprefix, const char *orig_installdir, const char *curr_pathname); #else /* By default, we use the hardwired pathnames. */ #define relocate(pathname) (pathname) #endif #ifdef __cplusplus } #endif #endif /* _RELOCATABLE_H */ mdk-1.2.9/intl/ref-add.sin0000644000175000017500000000210112110326462012171 00000000000000# Add this package to a list of references stored in a text file. # # Copyright (C) 2000 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # # Written by Bruno Haible . # /^# Packages using this file: / { s/# Packages using this file:// ta :a s/ @PACKAGE@ / @PACKAGE@ / tb s/ $/ @PACKAGE@ / :b s/^/# Packages using this file:/ } mdk-1.2.9/intl/VERSION0000644000175000017500000000004612110326462011232 00000000000000GNU gettext library from gettext-0.14 mdk-1.2.9/intl/Makefile.in0000644000175000017500000003762612110326462012245 00000000000000# Makefile for directory with message catalog handling library of GNU gettext # Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU Library General Public License as published # by the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = .. VPATH = $(srcdir) prefix = @prefix@ exec_prefix = @exec_prefix@ transform = @program_transform_name@ libdir = @libdir@ includedir = @includedir@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/intl aliaspath = $(localedir) subdir = intl INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) l = @INTL_LIBTOOL_SUFFIX_PREFIX@ AR = ar CC = @CC@ LIBTOOL = @LIBTOOL@ RANLIB = @RANLIB@ YACC = @INTLBISON@ -y -d YFLAGS = --name-prefix=__gettext DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ -DLIBDIR=\"$(libdir)\" -DIN_LIBINTL \ -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \ -Dset_relocation_prefix=libintl_set_relocation_prefix \ -Drelocate=libintl_relocate \ -DDEPENDS_ON_LIBICONV=1 @DEFS@ CPPFLAGS = @CPPFLAGS@ CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) HEADERS = \ gmo.h \ gettextP.h \ hash-string.h \ loadinfo.h \ plural-exp.h \ eval-plural.h \ localcharset.h \ relocatable.h \ xsize.h \ printf-args.h printf-args.c \ printf-parse.h wprintf-parse.h printf-parse.c \ vasnprintf.h vasnwprintf.h vasnprintf.c \ os2compat.h \ libgnuintl.h.in SOURCES = \ bindtextdom.c \ dcgettext.c \ dgettext.c \ gettext.c \ finddomain.c \ loadmsgcat.c \ localealias.c \ textdomain.c \ l10nflist.c \ explodename.c \ dcigettext.c \ dcngettext.c \ dngettext.c \ ngettext.c \ plural.y \ plural-exp.c \ localcharset.c \ relocatable.c \ localename.c \ log.c \ printf.c \ osdep.c \ os2compat.c \ intl-compat.c OBJECTS = \ bindtextdom.$lo \ dcgettext.$lo \ dgettext.$lo \ gettext.$lo \ finddomain.$lo \ loadmsgcat.$lo \ localealias.$lo \ textdomain.$lo \ l10nflist.$lo \ explodename.$lo \ dcigettext.$lo \ dcngettext.$lo \ dngettext.$lo \ ngettext.$lo \ plural.$lo \ plural-exp.$lo \ localcharset.$lo \ relocatable.$lo \ localename.$lo \ log.$lo \ printf.$lo \ osdep.$lo \ intl-compat.$lo DISTFILES.common = Makefile.in \ config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) DISTFILES.generated = plural.c DISTFILES.normal = VERSION DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \ libgnuintl.h_vms Makefile.vms \ libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h all: all-@USE_INCLUDED_LIBINTL@ all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed all-no: all-no-@BUILD_INCLUDED_LIBINTL@ all-no-yes: libgnuintl.$la all-no-no: libintl.a libgnuintl.a: $(OBJECTS) rm -f $@ $(AR) cru $@ $(OBJECTS) $(RANLIB) $@ libintl.la libgnuintl.la: $(OBJECTS) $(LIBTOOL) --mode=link \ $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ $(OBJECTS) @LTLIBICONV@ $(LIBS) -lc \ -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ -rpath $(libdir) \ -no-undefined # Libtool's library version information for libintl. # Before making a gettext release, the gettext maintainer must change this # according to the libtool documentation, section "Library interface versions". # Maintainers of other packages that include the intl directory must *not* # change these values. LTV_CURRENT=7 LTV_REVISION=0 LTV_AGE=4 .SUFFIXES: .SUFFIXES: .c .y .o .lo .sin .sed .c.o: $(COMPILE) $< .y.c: $(YACC) $(YFLAGS) --output $@ $< rm -f $*.h bindtextdom.lo: $(srcdir)/bindtextdom.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c dcgettext.lo: $(srcdir)/dcgettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c dgettext.lo: $(srcdir)/dgettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c gettext.lo: $(srcdir)/gettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c finddomain.lo: $(srcdir)/finddomain.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c loadmsgcat.lo: $(srcdir)/loadmsgcat.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c localealias.lo: $(srcdir)/localealias.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c textdomain.lo: $(srcdir)/textdomain.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c l10nflist.lo: $(srcdir)/l10nflist.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c explodename.lo: $(srcdir)/explodename.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c dcigettext.lo: $(srcdir)/dcigettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c dcngettext.lo: $(srcdir)/dcngettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c dngettext.lo: $(srcdir)/dngettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c ngettext.lo: $(srcdir)/ngettext.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c plural.lo: $(srcdir)/plural.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c plural-exp.lo: $(srcdir)/plural-exp.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c localcharset.lo: $(srcdir)/localcharset.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c relocatable.lo: $(srcdir)/relocatable.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c localename.lo: $(srcdir)/localename.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c log.lo: $(srcdir)/log.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c printf.lo: $(srcdir)/printf.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c osdep.lo: $(srcdir)/osdep.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c intl-compat.lo: $(srcdir)/intl-compat.c $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c ref-add.sed: $(srcdir)/ref-add.sin sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed mv t-ref-add.sed ref-add.sed ref-del.sed: $(srcdir)/ref-del.sin sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed mv t-ref-del.sed ref-del.sed INCLUDES = -I. -I$(srcdir) -I.. libgnuintl.h: $(srcdir)/libgnuintl.h.in sed -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ < $(srcdir)/libgnuintl.h.in > libgnuintl.h libintl.h: libgnuintl.h cp libgnuintl.h libintl.h charset.alias: $(srcdir)/config.charset $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ mv t-$@ $@ check: all # We must not install the libintl.h/libintl.a files if we are on a # system which has the GNU gettext() function in its C library or in a # separate library. # If you want to use the one which comes with this version of the # package, you have to use `configure --with-included-gettext'. install: install-exec install-data install-exec: all if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ $(LIBTOOL) --mode=install \ $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ if test "@RELOCATABLE@" = yes; then \ dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \ if test -n "$$dependencies"; then \ rm -f $(DESTDIR)$(libdir)/libintl.la; \ fi; \ fi; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools" \ && test '@USE_INCLUDED_LIBINTL@' = no; then \ $(mkinstalldirs) $(DESTDIR)$(libdir); \ $(LIBTOOL) --mode=install \ $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \ $(LIBTOOL) --mode=uninstall \ rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \ orig=$(DESTDIR)$(libdir)/charset.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ else \ if test @GLIBC21@ = no; then \ orig=charset.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ fi; \ fi; \ $(mkinstalldirs) $(DESTDIR)$(localedir); \ test -f $(DESTDIR)$(localedir)/locale.alias \ && orig=$(DESTDIR)$(localedir)/locale.alias \ || orig=$(srcdir)/locale.alias; \ temp=$(DESTDIR)$(localedir)/t-locale.alias; \ dest=$(DESTDIR)$(localedir)/locale.alias; \ sed -f ref-add.sed $$orig > $$temp; \ $(INSTALL_DATA) $$temp $$dest; \ rm -f $$temp; \ else \ : ; \ fi install-data: all if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \ dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ for file in $$dists; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \ dists="$(DISTFILES.generated)"; \ for file in $$dists; do \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ $(INSTALL_DATA) $$dir/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ dists="$(DISTFILES.obsolete)"; \ for file in $$dists; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-strip: install installdirs: if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools" \ && test '@USE_INCLUDED_LIBINTL@' = no; then \ $(mkinstalldirs) $(DESTDIR)$(libdir); \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \ $(mkinstalldirs) $(DESTDIR)$(localedir); \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ rm -f $(DESTDIR)$(includedir)/libintl.h; \ $(LIBTOOL) --mode=uninstall \ rm -f $(DESTDIR)$(libdir)/libintl.$la; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools" \ && test '@USE_INCLUDED_LIBINTL@' = no; then \ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ else \ : ; \ fi if test '@USE_INCLUDED_LIBINTL@' = yes; then \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \ sed -f ref-del.sed $$dest > $$temp; \ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ rm -f $$dest; \ else \ $(INSTALL_DATA) $$temp $$dest; \ fi; \ rm -f $$temp; \ fi; \ if test -f $(DESTDIR)$(localedir)/locale.alias; then \ temp=$(DESTDIR)$(localedir)/t-locale.alias; \ dest=$(DESTDIR)$(localedir)/locale.alias; \ sed -f ref-del.sed $$dest > $$temp; \ if grep '^# Packages using this file: $$' $$temp > /dev/null; then \ rm -f $$dest; \ else \ $(INSTALL_DATA) $$temp $$dest; \ fi; \ rm -f $$temp; \ fi; \ else \ : ; \ fi if test "$(PACKAGE)" = "gettext-tools"; then \ for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi info dvi ps pdf html: $(OBJECTS): ../config.h libgnuintl.h bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h dcigettext.$lo: $(srcdir)/eval-plural.h localcharset.$lo: $(srcdir)/localcharset.h localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c tags: TAGS TAGS: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES) id: ID ID: $(HEADERS) $(SOURCES) here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) mostlyclean: rm -f *.a *.la *.o *.obj *.lo core core.* rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed rm -f -r .libs _libs clean: mostlyclean distclean: clean rm -f Makefile ID TAGS if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \ rm -f ChangeLog.inst $(DISTFILES.normal); \ else \ : ; \ fi maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." # GNU gettext needs not contain the file `VERSION' but contains some # other files which should not be distributed in other packages. distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: Makefile if test "$(PACKAGE)" = "gettext-tools"; then \ : ; \ else \ if test "$(PACKAGE)" = "gettext-runtime"; then \ additional="$(DISTFILES.gettext)"; \ else \ additional="$(DISTFILES.normal)"; \ fi; \ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ cp -p $$dir/$$file $(distdir); \ done; \ fi Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status # This would be more efficient, but doesn't work any more with autoconf-2.57, # when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used. # cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/intl/os2compat.h0000644000175000017500000000302212110326462012237 00000000000000/* OS/2 compatibility defines. This file is intended to be included from config.h Copyright (C) 2001-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* When included from os2compat.h we need all the original definitions */ #ifndef OS2_AWARE #undef LIBDIR #define LIBDIR _nlos2_libdir extern char *_nlos2_libdir; #undef LOCALEDIR #define LOCALEDIR _nlos2_localedir extern char *_nlos2_localedir; #undef LOCALE_ALIAS_PATH #define LOCALE_ALIAS_PATH _nlos2_localealiaspath extern char *_nlos2_localealiaspath; #endif #undef HAVE_STRCASECMP #define HAVE_STRCASECMP 1 #define strcasecmp stricmp #define strncasecmp strnicmp /* We have our own getenv() which works even if library is compiled as DLL */ #define getenv _nl_getenv /* Older versions of gettext used -1 as the value of LC_MESSAGES */ #define LC_MESSAGES_COMPAT (-1) mdk-1.2.9/intl/dcngettext.c0000644000175000017500000000347012110326462012503 00000000000000/* Implementation of the dcngettext(3) function. Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include "gettextP.h" #ifdef _LIBC # include #else # include "libgnuintl.h" #endif /* @@ end of prolog @@ */ /* Names for the libintl functions are a problem. They must not clash with existing names and they should follow ANSI C. But this source code is also used in GNU C Library where the names have a __ prefix. So we have to make a difference here. */ #ifdef _LIBC # define DCNGETTEXT __dcngettext # define DCIGETTEXT __dcigettext #else # define DCNGETTEXT libintl_dcngettext # define DCIGETTEXT libintl_dcigettext #endif /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY locale. */ char * DCNGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, unsigned long int n, int category) { return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); } #ifdef _LIBC /* Alias for function name in GNU C Library. */ weak_alias (__dcngettext, dcngettext); #endif mdk-1.2.9/intl/xsize.h0000644000175000017500000000672212110326462011504 00000000000000/* xsize.h -- Checked size_t computations. Copyright (C) 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _XSIZE_H #define _XSIZE_H /* Get size_t. */ #include /* Get SIZE_MAX. */ #include #if HAVE_STDINT_H # include #endif /* The size of memory objects is often computed through expressions of type size_t. Example: void* p = malloc (header_size + n * element_size). These computations can lead to overflow. When this happens, malloc() returns a piece of memory that is way too small, and the program then crashes while attempting to fill the memory. To avoid this, the functions and macros in this file check for overflow. The convention is that SIZE_MAX represents overflow. malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc implementation that uses mmap --, it's recommended to use size_overflow_p() or size_in_bounds_p() before invoking malloc(). The example thus becomes: size_t size = xsum (header_size, xtimes (n, element_size)); void *p = (size_in_bounds_p (size) ? malloc (size) : NULL); */ /* Convert an arbitrary value >= 0 to type size_t. */ #define xcast_size_t(N) \ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) /* Sum of two sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum (size_t size1, size_t size2) { size_t sum = size1 + size2; return (sum >= size1 ? sum : SIZE_MAX); } /* Sum of three sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum3 (size_t size1, size_t size2, size_t size3) { return xsum (xsum (size1, size2), size3); } /* Sum of four sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xsum4 (size_t size1, size_t size2, size_t size3, size_t size4) { return xsum (xsum (xsum (size1, size2), size3), size4); } /* Maximum of two sizes, with overflow check. */ static inline size_t #if __GNUC__ >= 3 __attribute__ ((__pure__)) #endif xmax (size_t size1, size_t size2) { /* No explicit check is needed here, because for any n: max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ return (size1 >= size2 ? size1 : size2); } /* Multiplication of a count with an element size, with overflow check. The count must be >= 0 and the element size must be > 0. This is a macro, not an inline function, so that it works correctly even when N is of a wider tupe and N > SIZE_MAX. */ #define xtimes(N, ELSIZE) \ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) /* Check for overflow. */ #define size_overflow_p(SIZE) \ ((SIZE) == SIZE_MAX) /* Check against overflow. */ #define size_in_bounds_p(SIZE) \ ((SIZE) != SIZE_MAX) #endif /* _XSIZE_H */ mdk-1.2.9/intl/vasnprintf.c0000644000175000017500000005304412110326462012526 00000000000000/* vsprintf with automatic memory allocation. Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Tell glibc's to provide a prototype for snprintf(). This must come before because may include , and once has been included, it's too late. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #ifdef HAVE_CONFIG_H # include #endif #ifndef IN_LIBINTL # include #endif /* Specification. */ #if WIDE_CHAR_VERSION # include "vasnwprintf.h" #else # include "vasnprintf.h" #endif #include /* snprintf(), sprintf() */ #include /* abort(), malloc(), realloc(), free() */ #include /* memcpy(), strlen() */ #include /* errno */ #include /* CHAR_BIT */ #include /* DBL_MAX_EXP, LDBL_MAX_EXP */ #if WIDE_CHAR_VERSION # include "wprintf-parse.h" #else # include "printf-parse.h" #endif /* Checked size_t computations. */ #include "xsize.h" #ifdef HAVE_WCHAR_T # ifdef HAVE_WCSLEN # define local_wcslen wcslen # else /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid a dependency towards this library, here is a local substitute. Define this substitute only once, even if this file is included twice in the same compilation unit. */ # ifndef local_wcslen_defined # define local_wcslen_defined 1 static size_t local_wcslen (const wchar_t *s) { const wchar_t *ptr; for (ptr = s; *ptr != (wchar_t) 0; ptr++) ; return ptr - s; } # endif # endif #endif #if WIDE_CHAR_VERSION # define VASNPRINTF vasnwprintf # define CHAR_T wchar_t # define DIRECTIVE wchar_t_directive # define DIRECTIVES wchar_t_directives # define PRINTF_PARSE wprintf_parse # define USE_SNPRINTF 1 # if HAVE_DECL__SNWPRINTF /* On Windows, the function swprintf() has a different signature than on Unix; we use the _snwprintf() function instead. */ # define SNPRINTF _snwprintf # else /* Unix. */ # define SNPRINTF swprintf # endif #else # define VASNPRINTF vasnprintf # define CHAR_T char # define DIRECTIVE char_directive # define DIRECTIVES char_directives # define PRINTF_PARSE printf_parse # define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) # if HAVE_DECL__SNPRINTF /* Windows. */ # define SNPRINTF _snprintf # else /* Unix. */ # define SNPRINTF snprintf # endif #endif CHAR_T * VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args) { DIRECTIVES d; arguments a; if (PRINTF_PARSE (format, &d, &a) < 0) { errno = EINVAL; return NULL; } #define CLEANUP() \ free (d.dir); \ if (a.arg) \ free (a.arg); if (printf_fetchargs (args, &a) < 0) { CLEANUP (); errno = EINVAL; return NULL; } { size_t buf_neededlength; CHAR_T *buf; CHAR_T *buf_malloced; const CHAR_T *cp; size_t i; DIRECTIVE *dp; /* Output string accumulator. */ CHAR_T *result; size_t allocated; size_t length; /* Allocate a small buffer that will hold a directive passed to sprintf or snprintf. */ buf_neededlength = xsum4 (7, d.max_width_length, d.max_precision_length, 6); #if HAVE_ALLOCA if (buf_neededlength < 4000 / sizeof (CHAR_T)) { buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T)); buf_malloced = NULL; } else #endif { size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T)); if (size_overflow_p (buf_memsize)) goto out_of_memory_1; buf = (CHAR_T *) malloc (buf_memsize); if (buf == NULL) goto out_of_memory_1; buf_malloced = buf; } if (resultbuf != NULL) { result = resultbuf; allocated = *lengthp; } else { result = NULL; allocated = 0; } length = 0; /* Invariants: result is either == resultbuf or == NULL or malloc-allocated. If length > 0, then result != NULL. */ /* Ensures that allocated >= needed. Aborts through a jump to out_of_memory if needed is SIZE_MAX or otherwise too big. */ #define ENSURE_ALLOCATION(needed) \ if ((needed) > allocated) \ { \ size_t memory_size; \ CHAR_T *memory; \ \ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \ if ((needed) > allocated) \ allocated = (needed); \ memory_size = xtimes (allocated, sizeof (CHAR_T)); \ if (size_overflow_p (memory_size)) \ goto out_of_memory; \ if (result == resultbuf || result == NULL) \ memory = (CHAR_T *) malloc (memory_size); \ else \ memory = (CHAR_T *) realloc (result, memory_size); \ if (memory == NULL) \ goto out_of_memory; \ if (result == resultbuf && length > 0) \ memcpy (memory, result, length * sizeof (CHAR_T)); \ result = memory; \ } for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++) { if (cp != dp->dir_start) { size_t n = dp->dir_start - cp; size_t augmented_length = xsum (length, n); ENSURE_ALLOCATION (augmented_length); memcpy (result + length, cp, n * sizeof (CHAR_T)); length = augmented_length; } if (i == d.count) break; /* Execute a single directive. */ if (dp->conversion == '%') { size_t augmented_length; if (!(dp->arg_index == ARG_NONE)) abort (); augmented_length = xsum (length, 1); ENSURE_ALLOCATION (augmented_length); result[length] = '%'; length = augmented_length; } else { if (!(dp->arg_index != ARG_NONE)) abort (); if (dp->conversion == 'n') { switch (a.arg[dp->arg_index].type) { case TYPE_COUNT_SCHAR_POINTER: *a.arg[dp->arg_index].a.a_count_schar_pointer = length; break; case TYPE_COUNT_SHORT_POINTER: *a.arg[dp->arg_index].a.a_count_short_pointer = length; break; case TYPE_COUNT_INT_POINTER: *a.arg[dp->arg_index].a.a_count_int_pointer = length; break; case TYPE_COUNT_LONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longint_pointer = length; break; #ifdef HAVE_LONG_LONG case TYPE_COUNT_LONGLONGINT_POINTER: *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; break; #endif default: abort (); } } else { arg_type type = a.arg[dp->arg_index].type; CHAR_T *p; unsigned int prefix_count; int prefixes[2]; #if !USE_SNPRINTF size_t tmp_length; CHAR_T tmpbuf[700]; CHAR_T *tmp; /* Allocate a temporary buffer of sufficient size for calling sprintf. */ { size_t width; size_t precision; width = 0; if (dp->width_start != dp->width_end) { if (dp->width_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->width_arg_index].a.a_int; width = (arg < 0 ? (unsigned int) (-arg) : arg); } else { const CHAR_T *digitp = dp->width_start; do width = xsum (xtimes (width, 10), *digitp++ - '0'); while (digitp != dp->width_end); } } precision = 6; if (dp->precision_start != dp->precision_end) { if (dp->precision_arg_index != ARG_NONE) { int arg; if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); arg = a.arg[dp->precision_arg_index].a.a_int; precision = (arg < 0 ? 0 : arg); } else { const CHAR_T *digitp = dp->precision_start + 1; precision = 0; do precision = xsum (xtimes (precision, 10), *digitp++ - '0'); while (digitp != dp->precision_end); } } switch (dp->conversion) { case 'd': case 'i': case 'u': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ break; case 'o': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.333334 /* binary -> octal */ ) + 1 /* turn floor into ceil */ + 1; /* account for leading sign */ break; case 'x': case 'X': # ifdef HAVE_LONG_LONG if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) tmp_length = (unsigned int) (sizeof (unsigned long long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else # endif if (type == TYPE_LONGINT || type == TYPE_ULONGINT) tmp_length = (unsigned int) (sizeof (unsigned long) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ else tmp_length = (unsigned int) (sizeof (unsigned int) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading sign or alternate form */ break; case 'f': case 'F': # ifdef HAVE_LONG_DOUBLE if (type == TYPE_LONGDOUBLE) tmp_length = (unsigned int) (LDBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ else # endif tmp_length = (unsigned int) (DBL_MAX_EXP * 0.30103 /* binary -> decimal */ * 2 /* estimate for FLAG_GROUP */ ) + 1 /* turn floor into ceil */ + 10; /* sign, decimal point etc. */ tmp_length = xsum (tmp_length, precision); break; case 'e': case 'E': case 'g': case 'G': case 'a': case 'A': tmp_length = 12; /* sign, decimal point, exponent etc. */ tmp_length = xsum (tmp_length, precision); break; case 'c': # if defined HAVE_WINT_T && !WIDE_CHAR_VERSION if (type == TYPE_WIDE_CHAR) tmp_length = MB_CUR_MAX; else # endif tmp_length = 1; break; case 's': # ifdef HAVE_WCHAR_T if (type == TYPE_WIDE_STRING) { tmp_length = local_wcslen (a.arg[dp->arg_index].a.a_wide_string); # if !WIDE_CHAR_VERSION tmp_length = xtimes (tmp_length, MB_CUR_MAX); # endif } else # endif tmp_length = strlen (a.arg[dp->arg_index].a.a_string); break; case 'p': tmp_length = (unsigned int) (sizeof (void *) * CHAR_BIT * 0.25 /* binary -> hexadecimal */ ) + 1 /* turn floor into ceil */ + 2; /* account for leading 0x */ break; default: abort (); } if (tmp_length < width) tmp_length = width; tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */ } if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T)) tmp = tmpbuf; else { size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T)); if (size_overflow_p (tmp_memsize)) /* Overflow, would lead to out of memory. */ goto out_of_memory; tmp = (CHAR_T *) malloc (tmp_memsize); if (tmp == NULL) /* Out of memory. */ goto out_of_memory; } #endif /* Construct the format string for calling snprintf or sprintf. */ p = buf; *p++ = '%'; if (dp->flags & FLAG_GROUP) *p++ = '\''; if (dp->flags & FLAG_LEFT) *p++ = '-'; if (dp->flags & FLAG_SHOWSIGN) *p++ = '+'; if (dp->flags & FLAG_SPACE) *p++ = ' '; if (dp->flags & FLAG_ALT) *p++ = '#'; if (dp->flags & FLAG_ZERO) *p++ = '0'; if (dp->width_start != dp->width_end) { size_t n = dp->width_end - dp->width_start; memcpy (p, dp->width_start, n * sizeof (CHAR_T)); p += n; } if (dp->precision_start != dp->precision_end) { size_t n = dp->precision_end - dp->precision_start; memcpy (p, dp->precision_start, n * sizeof (CHAR_T)); p += n; } switch (type) { #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: case TYPE_ULONGLONGINT: *p++ = 'l'; /*FALLTHROUGH*/ #endif case TYPE_LONGINT: case TYPE_ULONGINT: #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: #endif #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: #endif *p++ = 'l'; break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: *p++ = 'L'; break; #endif default: break; } *p = dp->conversion; #if USE_SNPRINTF p[1] = '%'; p[2] = 'n'; p[3] = '\0'; #else p[1] = '\0'; #endif /* Construct the arguments for calling snprintf or sprintf. */ prefix_count = 0; if (dp->width_arg_index != ARG_NONE) { if (!(a.arg[dp->width_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int; } if (dp->precision_arg_index != ARG_NONE) { if (!(a.arg[dp->precision_arg_index].type == TYPE_INT)) abort (); prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int; } #if USE_SNPRINTF /* Prepare checking whether snprintf returns the count via %n. */ ENSURE_ALLOCATION (xsum (length, 1)); result[length] = '\0'; #endif for (;;) { size_t maxlen; int count; int retcount; maxlen = allocated - length; count = -1; retcount = 0; #if USE_SNPRINTF # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ retcount = SNPRINTF (result + length, maxlen, buf, \ arg, &count); \ break; \ case 1: \ retcount = SNPRINTF (result + length, maxlen, buf, \ prefixes[0], arg, &count); \ break; \ case 2: \ retcount = SNPRINTF (result + length, maxlen, buf, \ prefixes[0], prefixes[1], arg, \ &count); \ break; \ default: \ abort (); \ } #else # define SNPRINTF_BUF(arg) \ switch (prefix_count) \ { \ case 0: \ count = sprintf (tmp, buf, arg); \ break; \ case 1: \ count = sprintf (tmp, buf, prefixes[0], arg); \ break; \ case 2: \ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\ arg); \ break; \ default: \ abort (); \ } #endif switch (type) { case TYPE_SCHAR: { int arg = a.arg[dp->arg_index].a.a_schar; SNPRINTF_BUF (arg); } break; case TYPE_UCHAR: { unsigned int arg = a.arg[dp->arg_index].a.a_uchar; SNPRINTF_BUF (arg); } break; case TYPE_SHORT: { int arg = a.arg[dp->arg_index].a.a_short; SNPRINTF_BUF (arg); } break; case TYPE_USHORT: { unsigned int arg = a.arg[dp->arg_index].a.a_ushort; SNPRINTF_BUF (arg); } break; case TYPE_INT: { int arg = a.arg[dp->arg_index].a.a_int; SNPRINTF_BUF (arg); } break; case TYPE_UINT: { unsigned int arg = a.arg[dp->arg_index].a.a_uint; SNPRINTF_BUF (arg); } break; case TYPE_LONGINT: { long int arg = a.arg[dp->arg_index].a.a_longint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGINT: { unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint; SNPRINTF_BUF (arg); } break; #ifdef HAVE_LONG_LONG case TYPE_LONGLONGINT: { long long int arg = a.arg[dp->arg_index].a.a_longlongint; SNPRINTF_BUF (arg); } break; case TYPE_ULONGLONGINT: { unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint; SNPRINTF_BUF (arg); } break; #endif case TYPE_DOUBLE: { double arg = a.arg[dp->arg_index].a.a_double; SNPRINTF_BUF (arg); } break; #ifdef HAVE_LONG_DOUBLE case TYPE_LONGDOUBLE: { long double arg = a.arg[dp->arg_index].a.a_longdouble; SNPRINTF_BUF (arg); } break; #endif case TYPE_CHAR: { int arg = a.arg[dp->arg_index].a.a_char; SNPRINTF_BUF (arg); } break; #ifdef HAVE_WINT_T case TYPE_WIDE_CHAR: { wint_t arg = a.arg[dp->arg_index].a.a_wide_char; SNPRINTF_BUF (arg); } break; #endif case TYPE_STRING: { const char *arg = a.arg[dp->arg_index].a.a_string; SNPRINTF_BUF (arg); } break; #ifdef HAVE_WCHAR_T case TYPE_WIDE_STRING: { const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string; SNPRINTF_BUF (arg); } break; #endif case TYPE_POINTER: { void *arg = a.arg[dp->arg_index].a.a_pointer; SNPRINTF_BUF (arg); } break; default: abort (); } #if USE_SNPRINTF /* Portability: Not all implementations of snprintf() are ISO C 99 compliant. Determine the number of bytes that snprintf() has produced or would have produced. */ if (count >= 0) { /* Verify that snprintf() has NUL-terminated its result. */ if (count < maxlen && result[length + count] != '\0') abort (); /* Portability hack. */ if (retcount > count) count = retcount; } else { /* snprintf() doesn't understand the '%n' directive. */ if (p[1] != '\0') { /* Don't use the '%n' directive; instead, look at the snprintf() return value. */ p[1] = '\0'; continue; } else { /* Look at the snprintf() return value. */ if (retcount < 0) { /* HP-UX 10.20 snprintf() is doubly deficient: It doesn't understand the '%n' directive, *and* it returns -1 (rather than the length that would have been required) when the buffer is too small. */ size_t bigger_need = xsum (xtimes (allocated, 2), 12); ENSURE_ALLOCATION (bigger_need); continue; } else count = retcount; } } #endif /* Attempt to handle failure. */ if (count < 0) { if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); errno = EINVAL; return NULL; } #if !USE_SNPRINTF if (count >= tmp_length) /* tmp_length was incorrectly calculated - fix the code above! */ abort (); #endif /* Make room for the result. */ if (count >= maxlen) { /* Need at least count bytes. But allocate proportionally, to avoid looping eternally if snprintf() reports a too small count. */ size_t n = xmax (xsum (length, count), xtimes (allocated, 2)); ENSURE_ALLOCATION (n); #if USE_SNPRINTF continue; #endif } #if USE_SNPRINTF /* The snprintf() result did fit. */ #else /* Append the sprintf() result. */ memcpy (result + length, tmp, count * sizeof (CHAR_T)); if (tmp != tmpbuf) free (tmp); #endif length += count; break; } } } } /* Add the final NUL. */ ENSURE_ALLOCATION (xsum (length, 1)); result[length] = '\0'; if (result != resultbuf && length + 1 < allocated) { /* Shrink the allocated memory if possible. */ CHAR_T *memory; memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T)); if (memory != NULL) result = memory; } if (buf_malloced != NULL) free (buf_malloced); CLEANUP (); *lengthp = length; return result; out_of_memory: if (!(result == resultbuf || result == NULL)) free (result); if (buf_malloced != NULL) free (buf_malloced); out_of_memory_1: CLEANUP (); errno = ENOMEM; return NULL; } } #undef SNPRINTF #undef USE_SNPRINTF #undef PRINTF_PARSE #undef DIRECTIVES #undef DIRECTIVE #undef CHAR_T #undef VASNPRINTF mdk-1.2.9/ChangeLog0000644000175000017500000002737212636571406011016 000000000000002015-12-23 Jose Antonio Ortega Ruiz Version upgraded to 1.2.9 2015-11-16 Jose Antonio Ortega Ruiz NEWS update Documentation fixes by Joshua Davies 2015-03-03 litvin Modify texinfo documentation Add missed instructions: SLB,SRB,JAE,JAO,JXE,JXO (from volume 2, section 4.5.2) 2014-08-04 jao Including autogen.sh in distribution tarball THANKS updated for 1.2.8 2014-08-03 jao NEWS updated for 1.2.8 Apparently tautological comparisons fixed (bug #42871) Whitespace 2014-08-02 jao Fix for compilation in darwin (bug #42818) 2014-05-21 Jose Antonio Ortega Ruiz Avoiding format strings security warnings (cf. #8467) 2014-05-20 Jose Antonio Ortega Ruiz Fixes for readline 6.3 2014-01-06 Jose Antonio Ortega Ruiz Help message for werrors configuration option fixed Fixes for building with --without-guile dummy.c -> darwin.c Compilation fixes Deprecated INCLUDES in Makefile.am removed Incorporating gcompletion (fixes #39817) New .gitignore entries Fix for #41098 (compilation in darwing sans libguile) Fix for #41097 (compilation in darwin) 2013-10-24 Jose Antonio Ortega Ruiz Invalid assertion in xmix_vm.c (closes #40359) 2013-02-25 Jose Antonio Ortega Ruiz Thanks where thanks are due 2013-02-23 Jose Antonio Ortega Ruiz NEWS for 1.2.7 Generating ChangeLog during make dist 2013-02-18 Jose Antonio Ortega Ruiz Convenience target to generate manual Guile versions updated in doc gendocs scripts updated Version updated to 1.2.7 Additional samples and doc from TAOCP, via ESR's MIXAL News bit gitlog-to-changelog updated Upgrade to guile 2.0 (Aleix Conchillo) 2010-10-10 Jose Antonio Ortega Ruiz Release and maintenance scripts ChangeLog generator updated Fix for #5652 2010-09-27 Jose Antonio Ortega Ruiz Fix for off-by-one bug in I-register modification breakpoints 2010-09-11 Jose Antonio Ortega Ruiz Allow parallel (make -jn) builds (#31018) Minimum libintl set to 0.37 Fix for the fix of #31010 2010-09-10 Jose Antonio Ortega Ruiz Versions mentioned in documentation and configure.ac updated Fix for #29524 (links to source repo updated in manual) Fix for #31010 (no error on MOVE 0) 2010-08-11 Jose Antonio Ortega Ruiz Typo in README (hat tip Iuri T.) 2010-03-26 Jose Antonio Ortega Ruiz Fix for #28086 (compilation without Guile). Document generation scripts updated. 2009-10-13 Jose Antonio Ortega Ruiz Requiring inttool 0.40. 2009-10-11 Jose Antonio Ortega Ruiz Typos and nits in the previous patch. Proper acknowledge for Aleix's contributions. * THANKS: * doc/mdk_ack.texi: Proper acknowledgement. Fixes for signature of guile initialization functions. * mixgtk/gmixvm.c: inner_main_ signature corrected * mixutils/mixvm_loop.c: loop_ signature corrected * mixguile/mixguile.h: Cosmetics NEWS for 1.2.5. Copyright year updated. Using gnulib's gitlog-to-changelog to generate ChangeLog. Stanza for ChangeLog generation added to autogen.sh. configure.in -> configure.ac in autogen.sh. 2009-10-05 Jose Antonio Ortega Ruiz Minimum gtk+ version pumped to 2.16. GtkFileChooser compatibility (conditionally using gtk 2.18 feature). Copyright years update. gmixvm: glade file: apparently, dialogs need to be top level. gmixvm glade file: dialog properties homogenized. Gmixvm's new glade file tweaks (mostly vbox layouts). External programs directory scanning delayed (but still present). Migration of gmixvm's glade file to Glade 3. 2009-10-04 Jose Antonio Ortega Ruiz Fix for application exit (glade changes were too many) Revert "Glade file updated (editing with Glade 3), and exit callback registered." This reverts commit 7acdf4dca205d8da124cd169da9993ac3c6e1627. Glade file updated (editing with Glade 3), and exit callback registered. 2009-10-02 Jose Antonio Ortega Ruiz Cosmetics. Guile: not using the deprecated gh_* interface. 2009-10-01 Jose Antonio Ortega Ruiz Fix for #23816: missing symbol name in EQU is now just a warning. 2009-08-23 Jose Antonio Ortega Ruiz configure.in is now called configure.ac. autom4te cache dir removed 2008-08-31 jao .ignore files for the compilation products mix_eval_scanner: clean up dead code and remove warning (input() not used) 2008-03-21 Jose Antonio Ortega Ruiz Copyright year in Glade file NEWS update for 1.2.4 Minor TODO updates Manual generation scripts updated and ignoring doc/manual 2008-03-20 Jose Antonio Ortega Ruiz Set all fonts dialog fixed (using correct default font) 2008-03-17 Jose Antonio Ortega Ruiz Default mixasm specification fixed Add extra application mime type for external execs in darwin (closes #17519) GTK version check for gkt_entry_completion_set_popup_single_match() Properly set external commands, taking into account the host type More ignored files 2008-03-16 Jose Antonio Ortega Ruiz Initial toolbar style set properly Ignore Glade backup files Lower gtk requirements to 2.6 Compatibility with GTK+ 2.10 2008-03-15 Jose Antonio Ortega Ruiz arch-inventory files removed Org-mode for TODO file Copyright year update Texinfo's @include only works properly with depth 1 More ignored files GPL/FDL license files updated Small intl fixes and POTFILES.in updated. Version bump and GTK+ >= 2.12.0 required. Adapted to new GtkTooltip API. More ignored files. Ignore files generated by autogen.sh 2007-06-26 Jose A Ortega Ruiz GPL v3 notices git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-43 2006-08-16 Jose Antonio Ortega Ruiz Make -Werror a configuration option and use AM_CFLAGS everywhere git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-42 2006-08-15 Jose Antonio Ortega Ruiz Unneeded assertion removed git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-41 2006-08-11 Jose Antonio Ortega Ruiz News for version 1.2.3 git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-40 mixvm's default prompt fixed git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-39 Version strings updated to 1.2.3 git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-38 2006-08-10 Jose Antonio Ortega Ruiz 64bit compilation fixes & About dialog embellishments git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-37 2006-08-09 Jose Antonio Ortega Ruiz Configurable toolbars (icons, text or both) git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-36 Attach/detach buttons in main toolbar are only active when meaningful. E.g., if all windows are detached, no 'detach' button appears. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-35 2006-08-08 Jose Antonio Ortega Ruiz Missing toolbar tooltips added git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-34 About dialog cleaned up git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-33 Sloppy gpointer conversions fixed git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-32 Darwin compilation warnings fixed Thanks to Aleix Conchillo. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-31 Only executable files can be selected in external programs dialog git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-30 Set names for MIX/MIXAL filters in file chooser dialogs git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-29 2006-08-08 Jose Antonio Ortega Ruiz External programs management improvement - External programs (editor and mixasm) execution is more robustly controlled both in mixvm and gmixvm. - In gmixvm the external programs dialog has been revamped: - Only proper paths can be introduced for the executables (via a graphical file chooser). - Flags for mixasm are no longer free text, but a check button. - Internally, the code has been refactored. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-28 2006-08-07 Jose Antonio Ortega Ruiz Setting ALL_LINGUAS in configure.in is obsolete git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-27 Minor adjustments to manual generation template git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-26 Restore invariant sections in documentation git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-25 Define missing ac variable GETTEXT_PACKAGE git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-24 2006-08-06 Jose Antonio Ortega Ruiz Make distcheck happy git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-23 No invariant sections in manual git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-22 Leak fixed git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-21 gmixvm: history in terminal input dialog git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-20 Refactoring of the previous patch git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-19 Load file dialog remembers last directory git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-18 All tests passing again (mix parser re-entrant) git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-17 2006-08-05 Jose Antonio Ortega Ruiz Compilation tests re-enabled git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-16 Info about new Arch archive git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-15 Acknowledgements to Michael and Xiaofeng git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-14 Invalid F-spec reported as warnings, to allow hacks as CMPX xxxx(6) git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-13 Accept F-spec in NOP (with warning) git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-12 Bug fix: mixvm's smem correctly handles negative zero git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-11 Bug fix: typo in cbpo help string git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-10 Compilation warnings fixed git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-9 2006-03-25 Jose Antonio Ortega Ruiz Warnings as errors git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-8 2006-03-24 Jose Antonio Ortega Ruiz CVS $Id$ tags removed. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-7 ChangeLog is automatically generated. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-6 Compilation warnings fixed. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-5 2006-03-21 Jose Antonio Ortega Ruiz Arch inventory files added git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-4 2006-03-21 Jose Antonio Ortega Ruiz Bug fixes for 1.2.2 (latest CVS version) * mixgtk/mixgtk.glade (Module): I1 and I2 in mixvm swapped to their correct position (closes #15746). * mixgtk/mixgtk_mixvm.c (init_mem_): fixed segfault when clicking Memory title bar (closes #15910). * configure.in: obsolete C flags for Darwin deleted. * misc/mixal-mode.el (Module): sync with Emacs CVS (Pieter). * mixlib/mix.c: copyright year in console message updated. * mixgtk/mixgtk_device.c (write_char_): buffer size was insufficient. git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-3 2006-03-20 Jose Antonio Ortega Ruiz Trivial changes to tag rel--1.2--patch-1 git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-2 Version 1.2.1 imported git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-1 Archive creation git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--base-0 mdk-1.2.9/intltool-merge.in0000644000175000017500000000000012636565532012513 00000000000000mdk-1.2.9/doc/0000755000175000017500000000000012636571405010055 500000000000000mdk-1.2.9/doc/mdk_tut.texi0000644000175000017500000014001712622455635012343 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2014 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node MIX and MIXAL tutorial, Getting started, Installing MDK, Top @comment node-name, next, previous, up @chapter MIX and MIXAL tutorial @cindex MIX @cindex MIXAL In the book series @cite{The Art of Computer Programming}, by D. Knuth, a virtual computer, the MIX, is used by the author (together with the set of binary instructions that the virtual CPU accepts) to illustrate the algorithms and skills that every serious programmer should master. Like any other real computer, there is a symbolic assembler language that can be used to program the MIX: the MIX assembly language, or MIXAL for short. In the following subsections you will find a tutorial on these topics, which will teach you the basics of the MIX architecture and how to program a MIX computer using MIXAL. @menu * The MIX computer:: Architecture and instruction set of the MIX computer. * MIXAL:: The MIX assembly language. @end menu @node The MIX computer, MIXAL, MIX and MIXAL tutorial, MIX and MIXAL tutorial @comment node-name, next, previous, up @section The MIX computer In this section, you will find a description of the MIX computer, its components and instruction set. @menu * MIX architecture:: * MIX instruction set:: @end menu @node MIX architecture, MIX instruction set, The MIX computer, The MIX computer @comment node-name, next, previous, up @subsection MIX architecture @cindex byte @cindex MIX byte @cindex word @cindex MIX word @cindex MIX architecture @cindex MIX computer @cindex register @cindex MIX register @cindex field specification @cindex fspec @cindex instruction @cindex MIX instruction @cindex address @cindex memory cell @cindex cell @cindex memory @cindex index The basic information storage unit in the MIX computer is the @dfn{byte}, which stores positive values in the range 0-63 . Note that a MIX byte can be then represented as 6 bits, instead of the common 8 bits for a @emph{regular} byte. Unless otherwise stated, we shall use the word @dfn{byte} to refer to a MIX 6-bit byte. A MIX @dfn{word} is defined as a set of 5 bytes plus a sign. The bytes within a word are numbered from 1 to 5, being byte number one the most significant one. The sign is denoted by index 0. Graphically, @example ----------------------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | ----------------------------------------------- | +/- | byte | byte | byte | byte | byte | ----------------------------------------------- @end example @noindent Sample MIX words are @samp{- 12 00 11 01 63} and @samp{+ 12 11 34 43 00}. You can refer to subfields within a word using a @dfn{field specification} or @dfn{fspec} of the form ``(@var{L}:@var{R})'', where @var{L} denotes the first byte, and @var{R} the last byte of the subfield. When @var{L} is zero, the subfield includes the word's sign. An fspec can also be represented as a single value @code{F}, given by @code{F = 8*L + R} (thus the fspec @samp{(1:3)}, denoting the first three bytes of a word, is represented by the integer 11). The MIX computer stores information in @dfn{registers}, that can store either a word or two bytes and sign (see below), and @dfn{memory cells}, each one containing a word. Specifically, the MIX computer has 4000 memory cells with addresses 0 to 3999 (i.e., two bytes are enough to address a memory cell) and the following registers: @cindex rA @cindex rX @cindex rJ @cindex rIn @cindex register @table @asis @item @code{rA} A register. General purpose register holding a word. Usually its contents serves as the operand of arithmetic and storing instructions. @item @code{rX} X register. General purpose register holding a word. Often it acts as an extension or a replacement of @samp{rA}. @item @code{rJ} J (jump) register. This register stores positive two-byte values, usually representing a jump address. @item @code{rI1}, @code{rI2}, @code{rI3}, @code{rI4}, @code{rI5}, @code{rI6} Index registers. These six registers can store a signed two-byte value. Their contents are used as indexing values for the computation of effective memory addresses. @end table @cindex @sc{ov} @cindex @sc{cm} @cindex @code{un} @cindex overflow toggle @cindex comparison indicator @cindex input-output devices @noindent In addition, the MIX computer contains: @itemize @minus @item An @dfn{overflow toggle} (a single bit with values @dfn{on} or @dfn{off}). In this manual, this toggle is denoted @sc{ov}. @item A @dfn{comparison indicator} (having three values: @dfn{EQUAL}, @dfn{GREATER} or @dfn{LESS}). In this manual, this indicator is denoted @sc{cm}, and its possible values are abbreviated as @dfn{E}, @dfn{G} and @dfn{L}. @item Input-output block devices. Each device is labelled as @code{un}, where @code{n} runs from 0 to 20. In Knuth's definition, @code{u0} through @code{u7} are magnetic tape units, @code{u8} through @code{15} are disks and drums, @code{u16} is a card reader, @code{u17} is a card writer, @code{u18} is a line printer and, @code{u19} is a typewriter terminal, and @code{u20}, a paper tape. Our implementation maps these devices to disk files, except for @code{u19}, which represents the standard output. @end itemize As noted above, the MIX computer communicates with the external world by a set of input-output devices which can be ``connected'' to it. The computer interchanges information using blocks of words whose length depends on the device at hand (@pxref{Devices}). These words are interpreted by the device either as binary information (for devices 0-16), or as representing printable characters (devices 17-20). In the last case, each MIX byte is mapped onto a character according to the following table: @multitable {00} {C} {00} {C} {00} {C} {00} {C} @item 00 @tab @tab 01 @tab A @tab 02 @tab B @tab 03 @tab C @item 04 @tab D @tab 05 @tab E @tab 06 @tab F @tab 07 @tab G @item 08 @tab H @tab 09 @tab I @tab 10 @tab ~ @tab 11 @tab J @item 12 @tab K @tab 13 @tab L @tab 14 @tab M @tab 15 @tab N @item 16 @tab O @tab 17 @tab P @tab 18 @tab Q @tab 19 @tab R @item 20 @tab [ @tab 21 @tab # @tab 22 @tab S @tab 23 @tab T @item 24 @tab U @tab 25 @tab V @tab 26 @tab W @tab 27 @tab X @item 28 @tab Y @tab 29 @tab Z @tab 30 @tab 0 @tab 31 @tab 1 @item 32 @tab 2 @tab 33 @tab 3 @tab 34 @tab 4 @tab 35 @tab 5 @item 36 @tab 6 @tab 37 @tab 7 @tab 38 @tab 8 @tab 39 @tab 9 @item 40 @tab . @tab 41 @tab , @tab 42 @tab ( @tab 43 @tab ) @item 44 @tab + @tab 45 @tab - @tab 46 @tab * @tab 47 @tab / @item 48 @tab = @tab 49 @tab $ @tab 50 @tab < @tab 51 @tab > @item 52 @tab @@ @tab 53 @tab ; @tab 54 @tab : @tab 55 @tab ' @end multitable @noindent The value 0 represents a whitespace. The characters @code{~}, @code{[} and @code{#} correspond to symbols not representable as ASCII characters (uppercase delta, sigma and gamma, respectively), and byte values 56-63 have no associated character. Finally, the MIX computer features a virtual CPU which controls the above components, and which is able to execute a rich set of instructions (constituting its machine language, similar to those commonly found in real CPUs), including arithmetic, logical, storing, comparison and jump instructions. Being a typical von Neumann computer, the MIX CPU fetches binary instructions from memory sequentially (unless a jump instruction is found), and stores the address of the next instruction to be executed in an internal register called @dfn{location counter} (also known as program counter in other architectures). The next section, @xref{MIX instruction set}, gives a complete description of the available MIX binary instructions. @node MIX instruction set, , MIX architecture, The MIX computer @comment node-name, next, previous, up @subsection MIX instruction set @cindex instruction set The following subsections fully describe the instruction set of the MIX computer. We begin with a description of the structure of binary instructions and the notation used to refer to their subfields. The remaining subsections are devoted to describing the actual instructions available to the MIX programmer. @menu * Instruction structure:: * Loading operators:: * Storing operators:: * Arithmetic operators:: * Address transfer operators:: * Comparison operators:: * Jump operators:: * Input-output operators:: * Conversion operators:: * Shift operators:: * Miscellaneous operators:: * Execution times:: @end menu @node Instruction structure, Loading operators, MIX instruction set, MIX instruction set @comment node-name, next, previous, up @subsubsection Instruction structure MIX @dfn{instructions} are codified as words with the following subfield structure: @multitable @columnfractions .15 .20 .65 @item @emph{Subfield} @tab @emph{fspec} @tab @emph{Description} @item ADDRESS @tab (0:2) @tab The first two bytes plus sign are the @dfn{address} field. Combined with the INDEX field, denotes the memory address to be used by the instruction. @item INDEX @tab (3:3) @tab The third byte is the @dfn{index}, normally used for indexing the address@footnote{The actual memory address the instruction refers to, is obtained by adding to ADDRESS the value of the @samp{rI} register denoted by INDEX.}. @item MOD @tab (4:4) @tab Byte four is used either as an operation code modifier or as a field specification. @item OPCODE @tab (5:5) @tab The last (least significant) byte in the word denotes the operation code. @end multitable @noindent or, graphically, @example ------------------------------------------------ | 0 | 1 | 2 | 3 | 4 | 5 | ------------------------------------------------ | ADDRESS | INDEX | MOD | OPCODE | ------------------------------------------------ @end example For a given instruction, @samp{M} stands for the memory address obtained after indexing the ADDRESS subfield (using its INDEX byte), and @samp{V} is the contents of the subfield indicated by MOD of the memory cell with address @samp{M}. For instance, suppose that we have the following contents of MIX registers and memory cells: @example [rI2] = + 00 63 [31] = - 10 11 00 11 22 @end example @noindent where @samp{[n]} denotes the contents of the nth memory cell and @samp{[rI2]} the contents of register @samp{rI2}@footnote{In general, @samp{[X]} will denote the contents of entity @samp{X}; thus, by definition, @w{@samp{V = [M](MOD)}}.}. Let us consider the binary instruction @w{@samp{I = - 00 32 02 11 10}}. For this instruction we have: @example ADDRESS = - 00 32 = -32 INDEX = 02 = 2 MOD = 11 = (1:3) OPCODE = 10 M = ADDRESS + [rI2] = -32 + 63 = 31 V = [M](MOD) = (- 10 11 00 11 22)(1:3) = + 00 00 10 11 00 @end example Note that, when computing @samp{V} using a word and an fspec, we apply a left padding to the bytes selected by @samp{MOD} to obtain a complete word as the result. In the following subsections, we will assign to each MIX instruction a mnemonic, or symbolic name. For instance, the mnemonic of @samp{OPCODE} 10 is @samp{LD2}. Thus we can rewrite the above instruction as @example LD2 -32,2(1:3) @end example @noindent or, for a generic instruction: @example MNEMONIC ADDRESS,INDEX(MOD) @end example @noindent Some instructions are identified by both the OPCODE and the MOD fields. In these cases, the MOD will not appear in the above symbolic representation. Also when ADDRESS or INDEX are zero, they can be omitted. Finally, MOD defaults to (0:5) (meaning the whole word). @node Loading operators, Storing operators, Instruction structure, MIX instruction set @comment node-name, next, previous, up @subsubsection Loading operators @cindex loading operators The following instructions are used to load memory contents into a register. @ftable @code @item LDA Put in rA the contents of cell no. M. OPCODE = 8, MOD = fspec. @code{rA <- V}. @item LDX Put in rX the contents of cell no. M. OPCODE = 15, MOD = fspec. @code{rX <- V}. @item LDi Put in rIi the contents of cell no. M. OPCODE = 8 + i, MOD = fspec. @code{rIi <- V}. @item LDAN Put in rA the contents of cell no. M, with opposite sign. OPCODE = 16, MOD = fspec. @code{rA <- -V}. @item LDXN Put in rX the contents of cell no. M, with opposite sign. OPCODE = 23, MOD = fspec. @code{rX <- -V}. @item LDiN Put in rIi the contents of cell no. M, with opposite sign. OPCODE = 16 + i, MOD = fspec. @code{rIi <- -V}. @end ftable In all the above load instructions the @samp{MOD} field selects the bytes of the memory cell with address @samp{M} which are loaded into the requisite register (indicated by the @samp{OPCODE}). For instance, the word @w{@samp{+ 00 13 01 27 11}} represents the instruction @example LD3 13,1(3:3) ^ ^ ^ ^ | | | | | | | --- MOD = 27 = 3*8 + 3 | | --- INDEX = 1 | --- ADDRESS = 00 13 --- OPCODE = 11 @end example Let us suppose that, prior to this instruction execution, the state of the MIX computer is the following: @example [rI1] = - 00 01 [rI3] = + 24 12 [12] = - 01 02 03 04 05 @end example @noindent As, in this case, @w{@samp{M = 13 + [rI1] = 12}}, we have @example V = [M](3:3) = (- 01 02 03 04 05)(3:3) = + 00 00 00 00 03 @end example @noindent (note that the specified subfield is left-padded with null bytes to complete a word). Hence, the MIX state, after the instruction execution, will be @example [rI1] = - 00 01 [rI3] = + 00 03 [12] = - 01 02 03 04 05 @end example To further illustrate loading operators, the following table shows the contents of @samp{rX} after different @samp{LDX} instructions: @table @samp @item LDX 12(0:0) [rX] = - 00 00 00 00 00 @item LDX 12(0:1) [rX] = - 00 00 00 00 01 @item LDX 12(3:5) [rX] = + 00 00 03 04 05 @item LDX 12(3:4) [rX] = + 00 00 00 03 04 @item LDX 12(0:5) [rX] = - 01 02 03 04 05 @end table @node Storing operators, Arithmetic operators, Loading operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Storing operators @cindex storing operators The following instructions are the inverse of the load operations: they are used to store a subfield of a register into a memory location. Here, MOD represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. @ftable @code @item STA Store rA. OPCODE = 24, MOD = fspec. @code{V <- rA}. @item STX Store rX. OPCODE = 31, MOD = fspec. @code{V <- rX}. @item STi Store rIi. OPCODE = 24 + i, MOD = fspec. @code{V <- rIi}. @item STJ Store rJ. OPCODE = 32, MOD = fspec. @code{V <- rJ}. @item STZ Store zero. OPCODE = 33, MOD = fspec. @code{V <- 0}. @end ftable By way of example, consider the instruction @samp{STA 1200(2:3)}. It causes the MIX to fetch bytes no. 4 and 5 of register A and copy them to bytes 2 and 3 of memory cell no. 1200 (remember that, for these instructions, MOD specifies a subfield of @emph{the memory address}). The other bytes of the memory cell retain their values. Thus, if prior to the instruction execution we have @example [1200] = - 20 21 22 23 24 [rA] = + 01 02 03 04 05 @end example @noindent we will end up with @example [1200] = - 20 04 05 23 24 [rA] = + 01 02 03 04 05 @end example As a second example, @samp{ST2 1000(0)} will set the sign of @samp{[1000]} to that of @samp{[rI2]}. @node Arithmetic operators, Address transfer operators, Storing operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Arithmetic operators @cindex arithmetic operators The following instructions perform arithmetic operations between rA and rX register and memory contents. @ftable @code @item ADD Add and set OV if overflow. OPCODE = 1, MOD = fspec. @w{@code{rA <- rA +V}}. @item SUB Sub and set OV if overflow. OPCODE = 2, MOD = fspec. @w{@code{rA <- rA - V}}. @item MUL Multiply V times rA and store the 10-bytes product in rAX. OPCODE = 3, MOD = fspec. @w{@code{rAX <- rA x V}}. @item DIV rAX is considered a 10-bytes number, and it is divided by V. OPCODE = 4, MOD = fspec. @w{@code{rA <- rAX / V}}, @code{rX} <- reminder. @end ftable In all the above instructions, @samp{[rA]} is one of the operands of the binary arithmetic operation, the other being @samp{V} (that is, the specified subfield of the memory cell with address @samp{M}), padded with zero bytes on its left-side to complete a word. In multiplication and division, the register @samp{X} comes into play as a right-extension of the register @samp{A}, so that we are able to handle 10-byte numbers whose more significant bytes are those of @samp{rA} (the sign of this 10-byte number is that of @samp{rA}: @samp{rX}'s sign is ignored). Addition and subtraction of MIX words can give rise to overflows, since the result is stored in a register with room to only 5 bytes (plus sign). When this occurs, the operation result modulo @w{1,073,741,823} (the maximum value storable in a MIX word) is stored in @samp{rA}, and the overflow toggle is set to TRUE. @node Address transfer operators, Comparison operators, Arithmetic operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Address transfer operators @cindex address transfer operators In these instructions, @samp{M} (the address of the instruction after indexing) is used as a number instead of as the address of a memory cell. Consequently, @samp{M} can have any valid word value (i.e., it's not limited to the 0-3999 range of a memory address). @ftable @code @item ENTA Enter @samp{M} in [rA]. OPCODE = 48, MOD = 2. @code{rA <- M}. @item ENTX Enter @samp{M} in [rX]. OPCODE = 55, MOD = 2. @code{rX <- M}. @item ENTi Enter @samp{M} in [rIi]. OPCODE = 48 + i, MOD = 2. @code{rIi <- M}. @item ENNA Enter @samp{-M} in [rA]. OPCODE = 48, MOD = 3. @code{rA <- -M}. @item ENNX Enter @samp{-M} in [rX]. OPCODE = 55, MOD = 3. @code{rX <- -M}. @item ENNi Enter @samp{-M} in [rIi]. OPCODE = 48 + i, MOD = 3. @code{rIi <- -M}. @item INCA Increase [rA] by @samp{M}. OPCODE = 48, MOD = 0. @code{rA <- rA + M}. @item INCX Increase [rX] by @samp{M}. OPCODE = 55, MOD = 0. @code{rX <- rX + M}. @item INCi Increase [rIi] by @samp{M}. OPCODE = 48 + i, MOD = 0. @code{rIi <- rIi + M}. @item DECA Decrease [rA] by @samp{M}. OPCODE = 48, MOD = 1. @code{rA <- rA - M}. @item DECX Decrease [rX] by @samp{M}. OPCODE = 55, MOD = 1. @code{rX <- rX - M}. @item DECi Decrease [rIi] by @samp{M}. OPCODE = 48 + i, MaOD = 0. @code{rIi <- rIi - M}. @end ftable In the above instructions, the subfield @samp{ADDRESS} acts as an immediate (indexed) operand, and allow us to set directly the contents of the MIX registers without an indirection to the memory cells (in a real CPU this would mean that they are faster that the previously discussed instructions, whose operands are fetched from memory). So, if you want to store in @samp{rA} the value -2000 (- 00 00 00 31 16), you can use the binary instruction @w{+ 31 16 00 03 48}, or, symbolically, @example ENNA 2000 @end example @noindent Used in conjunction with the store operations (@samp{STA}, @samp{STX}, etc.), these instructions also allow you to set memory cells contents to concrete values. Note that in these address transfer operators, the @samp{MOD} field is not a subfield specificator, but serves to define (together with @samp{OPCODE}) the concrete operation to be performed. @node Comparison operators, Jump operators, Address transfer operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Comparison operators @cindex comparison operators So far, we have learned how to move values around between the MIX registers and its memory cells, and also how to perform arithmetic operations using these values. But, in order to write non-trivial programs, other functionalities are needed. One of the most common is the ability to compare two values, which, combined with jumps, will allow the execution of conditional statements. The following instructions compare the value of a register with @samp{V}, and set the @sc{cm} indicator to the result of the comparison (i.e. to @samp{E}, @samp{G} or @samp{L}, equal, greater or lesser respectively). @ftable @code @item CMPA Compare [rA] with V. OPCODE = 56, MOD = fspec. @item CMPX Compare [rX] with V. OPCODE = 63, MOD = fspec. @item CMPi Compare [rIi] with V. OPCODE = 56 + i, MOD = fspec. @end ftable As explained above, these instructions modify the value of the MIX comparison indicator; but maybe you are asking yourself how do you use this value: enter jump operators, in the next subsection. @node Jump operators, Input-output operators, Comparison operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Jump operators @cindex jump operators The MIX computer has an internal register, called the @dfn{location counter}, which stores the address of the next instruction to be fetched and executed by the virtual CPU. You cannot directly modify the contents of this internal register with a load instruction: after fetching the current instruction from memory, it is automatically increased in one unit by the MIX. However, there is a set of instructions (which we call jump instructions) which can alter the contents of the location counter provided some condition is met. When this occurs, the value of the next instruction address that would have been fetched in the absence of the jump is stored in @samp{rJ} (except for @code{JSJ}), and the location counter is set to the value of @samp{M} (so that the next instruction is fetched from this new address). Later on, you can return to the point when the jump occurred reading the address stored in @samp{rJ}. The MIX computer provides the following jump instructions: With these instructions you force a jump to the specified address. Use @samp{JSJ} if you do not care about the return address. @ftable @code @item JMP Unconditional jump. OPCODE = 39, MOD = 0. @item JSJ Unconditional jump, but rJ is not modified. OPCODE = 39, MOD = 1. @end ftable These instructions check the overflow toggle to decide whether to jump or not. @ftable @code @item JOV Jump if OV is set (and turn it off). OPCODE = 39, MOD = 2. @item JNOV Jump if OV is not set (and turn it off). OPCODE = 39, MOD = 3. @end ftable In the following instructions, the jump is conditioned to the contents of the comparison flag: @ftable @code @item JL Jump if @w{@code{[CM] = L}}. OPCODE = 39, MOD = 4. @item JE Jump if @w{@code{[CM] = E}}. OPCODE = 39, MOD = 5. @item JG Jump if @w{@code{[CM] = G}}. OPCODE = 39, MOD = 6. @item JGE Jump if @code{[CM]} does not equal @code{L}. OPCODE = 39, MOD = 7. @item JNE Jump if @code{[CM]} does not equal @code{E}. OPCODE = 39, MOD = 8. @item JLE Jump if @code{[CM]} does not equal @code{G}. OPCODE = 39, MOD = 9. @end ftable You can also jump conditioned to the value stored in the MIX registers, using the following instructions: @ftable @code @item JAN @itemx JAZ @itemx JAP @itemx JANN @itemx JANZ @itemx JANP @itemx JAE @itemx JAO Jump if the content of rA is, respectively, negative, zero, positive, non-negative, non-zero, non-positive, even or odd. OPCODE = 40, MOD = 0, 1, 2, 3, 4, 5, 6, 7. @item JXN @itemx JXZ @itemx JXP @itemx JXNN @itemx JXNZ @itemx JXNP @itemx JXE @itemx JXO Jump if the content of rX is, respectively, negative, zero, positive, non-negative, non-zero, non-positive, even or odd. OPCODE = 47, MOD = 0, 1, 2, 3, 4, 5, 6, 7. @item JiN @itemx JiZ @itemx JiP @itemx JiNN @itemx JiNZ @itemx JiNP Jump if the content of rIi is, respectively, negative, zero, positive, non-negative, non-zero or non-positive. OPCODE = 40 + i, MOD = 0, 1, 2, 3, 4, 5. @end ftable @node Input-output operators, Conversion operators, Jump operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Input-output operators @cindex input-output operators As explained in previous sections (@pxref{MIX architecture}), the MIX computer can interact with a series of block devices. To that end, you have at your disposal the following instructions: @ftable @code @item IN Transfer a block of words from the specified unit to memory, starting at address M. OPCODE = 36, MOD = I/O unit. @item OUT Transfer a block of words from memory (starting at address M) to the specified unit. OPCODE = 37, MOD = I/O unit. @item IOC Perform a control operation (given by M) on the specified unit. OPCODE = 35, MOD = I/O unit. @item JRED Jump to M if the specified unit is ready. OPCODE = 38, MOD = I/O unit. @item JBUS Jump to M if the specified unit is busy. OPCODE = 34, MOD = I/O unit. @end ftable @noindent In all the above instructions, the @samp{MOD} subfile must be in the range 0-20, since it denotes the operation's target device. The @samp{IOC} instruction only makes sense for tape devices (@samp{MOD} = 0-7 or 20): it shifts the read/write pointer by the number of words given by @samp{M} (if it equals zero, the tape is rewound)@footnote{In Knuth's original definition, there are other control operations available, but they do not make sense when implementing the block devices as disk files (as we do in @sc{mdk} simulator). For the same reason, @sc{mdk} devices are always ready, since all input-output operations are performed using synchronous system calls.}. @node Conversion operators, Shift operators, Input-output operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Conversion operators @cindex conversion operators The following instructions convert between numerical values and their character representations. @ftable @code @item NUM Convert rAX, assumed to contain a character representation of a number, to its numerical value and store it in rA. OPCODE = 5, MOD = 0. @item CHAR Convert the number stored in rA to a character representation and store it in rAX. OPCODE = 5, MOD = 1. @end ftable @noindent Digits are represented in MIX by the range of values 30-39 (digits 0-9). Thus, if the contents of @samp{rA} and @samp{rX} are, for instance, @example [rA] = + 30 30 31 32 33 [rX] = + 31 35 39 30 34 @end example @noindent the represented number is 0012315904, and @samp{NUM} will store this value in @samp{rA} (i.e., we end up with @samp{[rA]} = @w{+ 0 46 62 52 0} = 12315904). If any byte in @samp{rA} or @samp{rB} does not belong to the range 30-39, it is interpreted by @samp{NUM} as the digit obtained by taking its value modulo 10. E.g. values 0, 10, 20, 30, 40, 50, 60 all represent the digit 0; 2, 12, 22, etc. represent the digit 2, and so on. For instance, the number 0012315904 mentioned above could also be represented as @example [rA] = + 10 40 31 52 23 [rX] = + 11 35 49 20 54 @end example @samp{CHAR} performs the inverse operation, using only the values 30 to 39 for representing digits 0-9. @node Shift operators, Miscellaneous operators, Conversion operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Shift operators @cindex shift @cindex shift operators The following instructions perform byte-wise shifts of the contents of @samp{rA} and @samp{rX}. @ftable @code @item SLA @itemx SRA @itemx SLAX @itemx SRAX @itemx SLC @itemx SRC Shift rA or rAX left, right, or rAX circularly (see example below) left or right. M specifies the number of bytes to be shifted. OPCODE = 6, MOD = 0, 1, 2, 3, 4, 5. @end ftable @noindent The following instructions perform binary shifts of the contents of @samp{rA} and @samp{rX}. @ftable @code @item SLB @itemx SRB Shift rAX left or right binary. M specifies the number of binary places to shift. OPCODE = 6, MOD = 6, 7 @end ftable @noindent If we begin with, say, @samp{[rA]} = @w{- 01 02 03 04 05}, we would have the following modifications to @samp{rA} contents when performing the instructions on the left column: @multitable {SLA 00} {[rA] = - 00 00 00 00 00} @item SLA 2 @tab [rA] = - 03 04 05 00 00 @item SLA 6 @tab [rA] = - 00 00 00 00 00 @item SRA 1 @tab [rA] = - 00 01 02 03 04 @end multitable @noindent Note that the sign is unaffected by shift operations. On the other hand, @samp{SLC}, @samp{SRC}, @samp{SLAX}, @samp{SRAX}, @samp{SLB} and @samp{SRB} treat @samp{rA} and @samp{rX} as a single 10-bytes register (ignoring again the signs). For instance, if we begin with @samp{[rA]} = @w{+ 01 02 03 04 05} and @samp{[rX]} = @w{- 06 07 08 09 10}, we would have: @multitable {SLC 00} {[rA] = - 00 00 00 00 00} {[rA] = - 00 00 00 00 00} @item SLC 3 @tab [rA] = + 04 05 06 07 08 @tab [rX] = - 09 10 01 02 03 @item SLAX 3 @tab [rA] = + 04 05 06 07 08 @tab [rX] = - 09 10 00 00 00 @item SRC 4 @tab [rA] = + 07 08 09 10 01 @tab [rX] = - 02 03 04 05 06 @item SRAX 4 @tab [rA] = + 00 00 00 00 01 @tab [rX] = - 02 03 04 05 06 @item SLB 1 @tab [rA] = + 02 04 06 08 10 @tab [rX] = - 12 14 16 18 20 @end multitable @node Miscellaneous operators, Execution times, Shift operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Miscellaneous operators @cindex miscellaneous operators Finally, we list in the following table three miscellaneous MIX instructions which do not fit in any of the previous subsections: @ftable @code @item MOVE Move MOD words from M to the location stored in rI1. OPCODE = 7, MOD = no. of words. @item NOP No operation. OPCODE = 0, MOD = 0. @item HLT Halt. Stops instruction fetching. OPCODE = 5, MOD = 2. @end ftable @noindent The only effect of executing @samp{NOP} is increasing the location counter, while @samp{HLT} usually marks program termination. @node Execution times, , Miscellaneous operators, MIX instruction set @comment node-name, next, previous, up @subsubsection Execution times @cindex exection time @cindex time When writing MIXAL programs (or any kind of programs, for that matter), we shall often be interested in their execution time. Loosely speaking, we will be interested in the answer to the question: how long does it take a program to execute? Of course, this execution time will be a function of the input size, and the answer to our question is commonly given as the asymptotic behaviour as a function of the input size. At any rate, to compute this asymptotic behaviour, we need a measure of how long execution of a single instruction takes in our (virtual) CPU. Therefore, each MIX instruction will have an associated execution time, given in arbitrary units (in a real computer, the value of this unit will depend on the hardware configuration). When our MIX virtual machine executes programs, it will (optionally) give you the value of their execution time based upon the execution time of each single instruction. In the following table, the execution times (in the above mentioned arbitrary units) of the MIX instructions are given. @multitable {INSSSS} {01} {INSSSS} {01} {INSSSS} {01} {INSSSS} {01} @item @code{NOP} @tab 1 @tab @code{ADD} @tab 2 @tab @code{SUB} @tab 2 @tab @code{MUL} @tab 10 @item @code{DIV} @tab 12 @tab @code{NUM} @tab 10 @tab @code{CHAR} @tab 10 @tab @code{HLT} @tab 10 @item @code{SLx} @tab 2 @tab @code{SRx} @tab 2 @tab @code{LDx} @tab 2 @tab @code{STx} @tab 2 @item @code{JBUS} @tab 1 @tab @code{IOC} @tab 1 @tab @code{IN} @tab 1@tab @code{OUT} @tab 1 @item @code{JRED} @tab 1 @tab @code{Jx} @tab 1 @tab @code{INCx} @tab 1 @tab @code{DECx} @tab 1 @item @code{ENTx} @tab 1 @tab @code{ENNx} @tab 1 @tab @code{CMPx} @tab 1 @tab @code{MOVE} @tab 1+2F @end multitable In the above table, 'F' stands for the number of blocks to be moved (given by the @code{FSPEC} subfield of the instruction); @code{SLx} and @code{SRx} are a short cut for the byte-shifting operations; @code{LDx} denote all the loading operations; @code{STx} are the storing operations; @code{Jx} stands for all the jump operations, and so on with the rest of abbreviations. @node MIXAL, , The MIX computer, MIX and MIXAL tutorial @comment node-name, next, previous, up @section MIXAL @cindex MIXAL @cindex MIX assembly language @cindex assembly In the previous sections we have listed all the available MIX binary instructions. As we have shown, each instruction is represented by a word which is fetched from memory and executed by the MIX virtual CPU. As is the case with real computers, the MIX knows how to decode instructions in binary format (the so--called machine language), but a human programmer would have a tough time if she were to write her programs in machine language. Fortunately, the MIX computer can be programmed using an assembly language, MIXAL, which provides a symbolic way of writing the binary instructions understood by the imaginary MIX computer. If you have used assembler languages before, you will find MIXAL a very familiar language. MIXAL source files are translated to machine language by a MIX assembler, which produces a binary file (the actual MIX program) which can be directly loaded into the MIX memory and subsequently executed. In this section, we describe MIXAL, the MIX assembly language. The implementation of the MIX assembler program and MIX computer simulator provided by @sc{mdk} are described later on (@pxref{Getting started}). @menu * Basic structure:: Writing basic MIXAL programs. * MIXAL directives:: Assembler directives. * Expressions:: Evaluation of expressions. * W-expressions:: Evaluation of w-expressions. * Local symbols:: Special symbol table entries. * Literal constants:: Specifying an immediate operand. @end menu @node Basic structure, MIXAL directives, MIXAL, MIXAL @comment node-name, next, previous, up @subsection Basic program structure The MIX assembler reads MIXAL files line by line, producing, when required, a binary instruction, which is associated to a predefined memory address. To keep track of the current address, the assembler maintains an internal location counter which is incremented each time an instruction is compiled. In addition to MIX instructions, you can include in MIXAL file assembly directives (or pseudoinstructions) addressed at the assembler itself (for instance, telling it where the program starts and ends, or to reposition the location counter; see below). MIX instructions and assembler directives@footnote{We shall call them, collectively, MIXAL instructions.} are written in MIXAL (one per source file line) according to the following pattern: @example [LABEL] MNEMONIC [OPERAND] [COMMENT] @end example @noindent where @samp{OPERAND} is of the form @example [ADDRESS][,INDEX][(MOD)] @end example Items between square brackets are optional, and @table @code @item LABEL is an alphanumeric identifier (a @dfn{symbol}) which gets the current value of the location counter, and can be used in subsequent expressions, @item MNEMONIC is a literal denoting the operation code of the instruction (e.g. @code{LDA}, @code{STA}; see @pxref{MIX instruction set}) or an assembly pseudoinstruction (e.g. @code{ORG}, @code{EQU}), @item ADDRESS is an expression evaluating to the address subfield of the instruction, @item INDEX is an expression evaluating to the index subfield of the instruction, which defaults to 0 (i.e., no use of indexing) and can only be used when @code{ADDRESS} is present, @item MOD is an expression evaluating to the mod subfield of the instruction. Its default value, when omitted, depends on @code{OPCODE}, @item COMMENT any number of spaces after the operand mark the beginning of a comment, i.e. any text separated by white space from the operand is ignored by the assembler (note that spaces are not allowed within the @samp{OPERAND} field). @end table Note that spaces are @emph{not} allowed between the @code{ADDRESS}, @code{INDEX} and @code{MOD} fields if they are present. White space is used to separate the label, operation code and operand parts of the instruction@footnote{In fact, Knuth's definition of MIXAL restricts the column number at which each of these instruction parts must start. The MIXAL assembler included in @sc{mdk}, @code{mixasm}, does not impose such restriction.}. We have already listed the mnemonics associated with each MIX instruction; sample MIXAL instructions representing MIX instructions are: @example HERE LDA 2000 HERE represents the current location counter LDX HERE,2(1:3) this is a comment JMP 1234 @end example @node MIXAL directives, Expressions, Basic structure, MIXAL @comment node-name, next, previous, up @subsection MIXAL directives MIXAL instructions can be either one of the MIX machine instructions (@pxref{MIX instruction set}) or one of the following assembly pseudoinstructions: @ftable @code @item ORIG Sets the value of the memory address to which following instructions will be allocated after compilation. @item EQU Used to define a symbol's value, e.g. @w{@code{SYM EQU 2*200/3}}. @item CON The value of the given expression is copied directly into the current memory address. @item ALF Takes as operand five characters, constituting the five bytes of a word which is copied directly into the current memory address. @item END Marks the end of the program. Its operand gives the start address for program execution. @end ftable The operand of @code{ORIG}, @code{EQU}, @code{CON} and @code{END} can be any expression evaluating to a constant MIX word, i.e., either a simple MIXAL expression (composed of numbers, symbols and binary operators, @pxref{Expressions}) or a w-expression (@pxref{W-expressions}). All MIXAL programs must contain an @code{END} directive, with a twofold end: first, it marks the end of the assembler job, and, in the second place, its (mandatory) operand indicates the start address for the compiled program (that is, the address at which the virtual MIX machine must begin fetching instructions after loading the program). It is also very common (although not mandatory) to include at least an @code{ORIG} directive to mark the initial value of the assembler's location counter (remember that it stores the address associated with each compiled MIX instruction). Thus, a minimal MIXAL program would be @example ORIG 2000 set the initial compilation address NOP this instruction will be loaded at address 2000 HLT and this one at address 2001 END 2000 end of program; start at address 2000 this line is not parsed by the assembler @end example @noindent The assembler will generate two binary instructions (@code{NOP} (@w{+ 00 00 00 00 00}) and @code{HLT} (+ 00 00 02 05)), which will be loaded at addresses 2000 and 2001. Execution of the program will begin at address 2000. Every MIXAL program should also include a @code{HLT} instruction, which will mark the end of program execution (but not of program compilation). The @code{EQU} directive allows the definition of symbolic names for specific values. For instance, we could rewrite the above program as follows: @example START EQU 2000 ORIG START NOP HLT END START @end example @noindent which would give rise to the same compiled code. Symbolic constants (or symbols, for short) can also be implicitly defined placing them in the @code{LABEL} field of a MIXAL instruction: in this case, the assembler assigns to the symbol the value of the location counter before compiling the line. Hence, a third way of writing our trivial program is @example ORIG 2000 START NOP HLT END START @end example The @code{CON} directive allows you to directly specify the contents of the memory address pointed by the location counter. For instance, when the assembler encounters the following code snippet @example ORIG 1150 CON -1823473 @end example @noindent it will assign to the memory cell number 1150 the contents @w{- 00 06 61 11 49} (which corresponds to the decimal value -1823473). Finally, the @code{ALF} directive lets you specify the memory contents as a set of five (optionally quoted) characters, which are translated by the assembler to their byte values, conforming in that way the binary word that is to be stored in the corresponding memory cell. This directive comes in handy when you need to store printable messages in a memory address, as in the following example @footnote{In the original MIXAL definition, the @code{ALF} argument is not quoted. You can write the operand (as the @code{ADDRESS} field) without quotes, but, in this case, you must follow the alignment rules of the original MIXAL definition (namely, the @code{ADDRESS} must start at column 17).}: @example OUT MSG MSG is not yet defined here (future reference) MSG ALF "THIS " MSG gets defined here ALF "IS A " ALF "MESSA" ALF "GE. " @end example @noindent The above snippet also shows the use of a @dfn{future reference}, that is, the usage of a symbol (@code{MSG} in the example) prior of its actual definition. The MIXAL assembler is able to handle future references subject to some limitations which are described in the following section (@pxref{Expressions}). @cindex comments Any line starting with an asterisk is treated as a comment and ignored by the assembler. @example * This is a comment: this line is ignored. * This line is an error: * must be in column 1. @end example As noted in the previous section, comments can also be located after the @code{OPERAND} field of an instruction, separated from it by white space, as in @example LABEL LDA 100 This is also a comment @end example @node Expressions, W-expressions, MIXAL directives, MIXAL @comment node-name, next, previous, up @subsection Expressions @cindex operator @cindex binary operator @cindex unary operator The @code{ADDRESS}, @code{INDEX} and @code{MOD} fields of a MIXAL instruction can be expressions, formed by numbers, identifiers and binary operators (@code{+ - * / // :}). @code{+} and @code{-} can also be used as unary operators. Operator precedence is from left to right: there is no other operator precedence rule, and parentheses cannot be used for grouping. A stand-alone asterisk denotes the current memory location; thus, for instance, @example 4+2** @end example @noindent evaluates to 6 (4 plus 2) times the current memory location. White space is not allowed within expressions. The special binary operator @code{:} has the same meaning as in fspecs, i.e., @example A:B = 8*A + B @end example @noindent while @code{A//B} stands for the quotient of the ten-byte number @w{@code{A} 00 00 00 00 00} (that is, A right-padded with 5 null bytes or, what amounts to the same, multiplied by 64 to the fifth power) divided by @code{B}. Sample expressions are: @example 18-8*3 = 30 14/3 = 4 1+3:11 = 4:11 = 43 1//64 = (01 00 00 00 00 00)/(00 00 00 01 00) = (01 00 00 00 00) @end example @noindent Note that all MIXAL expressions evaluate to a MIX word (by definition). All symbols appearing within an expression must be previously defined. Future references are only allowed when appearing standalone (or modified by an unary operator) in the @code{ADDRESS} part of a MIXAL instruction, e.g. @example * OK: stand alone future reference STA -S1(1:5) * ERROR: future reference in expression LDX 2-S1 S1 LD1 2000 @end example @node W-expressions, Local symbols, Expressions, MIXAL @comment node-name, next, previous, up @subsection W-expressions @cindex w-expressions Besides expressions, as described above (@pxref{Expressions}), the MIXAL assembler is able to handle the so called @dfn{w-expressions} as the operands of the directives @code{ORIG}, @code{EQU}, @code{CON} and @code{END} (@pxref{MIXAL directives}). The general form of a w-expression is the following: @example WEXP = EXP[(EXP)][,WEXP] @end example @noindent where @code{EXP} stands for an expression and square brackets denote optional items. Thus, a w-expression is made by an expression, followed by an optional expression between parenthesis, followed by any number of similar constructs separated by commas. Sample w-expressions are: @example 2000 235(3) S1+3(S2),3000 S1,S2(3:5),23 @end example W-expressions are evaluated from left to right as follows: @itemize @item Start with an accumulated result @samp{w} equal to 0. @item Take the first expression of the comma-separated list and evaluate it. For instance, if the w-expression is @samp{S1+2(2:4),2000(S2)}, we evaluate first @samp{S1+2}; let's suppose that @samp{S1} equals 265230: then @samp{S1+2 = 265232 = + 00 01 00 48 16}. @item Evaluate the expression within parenthesis, reducing it to an f-spec of the form @samp{L:R}. In our previous example, the expression between parenthesis already has the desired form: 2:4. @item Substitute the bytes of the accumulated result @samp{w} designated by the f-spec using those of the previous expression value. In our sample, @samp{w = + 00 00 00 00 00}, and we must substitute bytes 2, 3 and 4 of @samp{w} using values from 265232. We need 3 bytes, and we take the least significant ones: 00, 48, and 16, and insert them in positions 2, 3 and 4 of @samp{w}, obtaining @samp{w = + 00 00 48 16 00}. @item Repeat this operation with the remaining terms, acting on the new value of @samp{w}. In our example, if, say, @samp{S2 = 1:1}, we must substitute the first byte of @samp{w} using one byte (the least significant) from 2000, that is, 16 (since 2000 = + 00 00 00 31 16) and, therefore, we obtain @samp{w = + 16 00 48 16 00}; summing up, we have obtained @samp{265232(1:4),2000(1:1) = + 16 00 48 16 00 = 268633088}. @end itemize As a second example, in the w-expression @example 1(1:2),66(4:5) @end example @noindent we first take two bytes from 1 (00 and 01) and store them as bytes 1 and 2 of the result (obtaining @w{@samp{+ 00 01 00 00 00}}) and, afterwards, take two bytes from 66 (01 and 02) and store them as bytes 4 and 5 of the result, obtaining @w{@samp{+ 00 01 00 01 02}} (262210). The process is repeated for each new comma-separated example. For instance: @example 1(1:1),2(2:2),3(3:3),4(4:4) = 01 02 03 04 00 @end example As stated before, w-expressions can only appear as the operands of MIXAL directives taking a constant value (@code{ORIG}, @code{EQU}, @code{CON} and @code{END}). Future references are @emph{not} allowed within w-expressions (i.e., all symbols appearing in a w-expression must be defined before it is used). @node Local symbols, Literal constants, W-expressions, MIXAL @comment node-name, next, previous, up @subsection Local symbols @cindex local symbols Besides user defined symbols, MIXAL programmers can use the so called @dfn{local symbols}, which are symbols of the form @code{[1-9][HBF]}. A local symbol @code{nB} refers to the address of the last previous occurrence of @code{nH} as a label, while @code{nF} refers to the next @code{nH} occurrence. Unlike user defined symbols, @code{nH} can appear multiple times in the @code{LABEL} part of different MIXAL instructions. The following code shows an instance of local symbols' usage: @example * line 1 1H LDA 100 * line 2: 1B refers to address of line 1, 3F refers to address of line 4 STA 3F,2(1B//2) * line 3: redefinition of 1H 1H STZ * line 4: 1B refers to address of line 3 3H JMP 1B @end example Note that a @code{B} local symbol never refers to a definition in its own line, that is, in the following program: @example ORIG 1999 ST NOP 3H EQU 69 3H ENTA 3B local symbol 3B refers to 3H in previous line HLT END ST @end example @noindent the contents of @samp{rA} is set to 69 and @emph{not} to 2001. An specially tricky case occurs when using local symbols in conjunction with @code{ORIG} pseudoinstructions. To wit@footnote{The author wants to thank Philip E. King for pointing these two special cases of local symbol usage to him.}, @example ORIG 1999 ST NOP 3H CON 10 ENT1 * LDA 3B ** rI1 is 2001, rA is 10. So far so good! 3H ORIG 3B+1000 ** at this point 3H equals 2003 ** and the location counter equals 3000. ENT2 * LDX 3B ** rI2 contains 3000, rX contains 2003. HLT END ST @end example @node Literal constants, , Local symbols, MIXAL @comment node-name, next, previous, up @subsection Literal constants @cindex literal constants MIXAL allows the introduction of @dfn{literal constants}, which are automatically stored in memory addresses after the end of the program by the assembler. Literal constants are denoted as @code{=wexp=}, where @code{wexp} is a w-expression (@pxref{W-expressions}). For instance, the code @example L EQU 5 LDA =20-L= @end example causes the assembler to add after the program's end an instruction with contents 15 (@samp{20-L}), and to assemble the above code as the instruction @w{@code{ LDA a}}, where @code{a} stands for the address in which the value 15 is stored. In other words, the compiled code is equivalent to the following: @example L EQU 5 LDA a @dots{} a CON 20-L END start @end example mdk-1.2.9/doc/mdk_mixvm.texi0000644000175000017500000006722412622455635012677 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node mixvm, gmixvm, mixasm, Top @comment node-name, next, previous, up @chapter @code{mixvm}, the MIX computer simulator @cindex mixvm This chapter describes @code{mixvm}, the MIX computer simulator. @code{mixvm} is a command line interface programme which simulates the MIX computer (@pxref{The MIX computer}). It is able to run MIXAL programs (@pxref{MIXAL}) previously compiled with the MIX assembler (@pxref{mixasm}). The simulator allows inspection of the MIX computer components (registers, memory cells, comparison flag and overflow toggle), step by step execution of MIX programmes, and breakpoint setting to aid you in debugging your code. For a tutorial description of @code{mixvm} usage, @xref{Running the program}. @menu * Invocation:: * Commands:: Commands available in interactive mode. * Devices:: MIX block devices implementation. @end menu @node Invocation, Commands, mixvm, mixvm @comment node-name, next, previous, up @section Invoking @code{mixvm} @code{mixvm} can be invoked with the following command line options (note that, following GNU's conventions, we provide a long option name for each available single letter switch): @example mixvm [-vhurdtq] [--version] [--help] [--usage] [--run] [--dump] [--time] [--noinit] [FILE[.mix]] @end example @noindent The meaning of these options is as follows: @defopt -v @defoptx --version Prints version and copyleft information and exits. @end defopt @defopt -h @defoptx --help @defoptx -u @defoptx --usage Prints a summary of available options and exits. @end defopt @defopt -r @defoptx --run Loads the specified @var{FILE} and executes it. After the program execution, @code{mixvm} exits. @var{FILE} must be the name of a binary @file{.mix} program compiled with @code{mixasm}. If your program does not produce any output, use the @code{-d} flag (see below) to peek at the virtual machine's state after execution. @end defopt @defopt -d @defoptx --dump This option must be used in conjunction with @code{-r}, and tells @code{mixvm} to print the value of the virtual machine's registers, comparison flag and overflow toggle after executing the program named @var{FILE}. See @xref{Non-interactive mode}, for sample usage. @end defopt @defopt -t @defoptx --time This option must be used in conjunction with @code{-r}, and tells @code{mixvm} to print virtual time statistics for the program's execution. @end defopt When run without the @code{-r} flag, @code{mixvm} enters its interactive mode, showing you a prompt like this one: @example MIX > @end example @noindent and waiting for your commands (@pxref{Commands}). If the optional @var{FILE} argument is given, the file @file{FILE.mix} will be loaded into the virtual machine memory before entering the interactive mode. The first time @code{mixvm} is invoked, a directory named @file{.mdk} is created in your home directory. It contains the @code{mixvm} configuration file, the command history file and (by default) the block devices files (@pxref{Devices}). Before showing you the command prompt, @code{mixvm} looks in the @file{~/.mdk} directory for a file named @code{mixguile.scm}; if it exists, it is read and evaluated by the embedded Guile interpreter (@pxref{Defining new functions}). You can use the @code{-q} command line option to skip this file loading: @defopt -q @defoptx --noinit Do not load the Guile initialisation file @code{~/.mdk/mixguile.scm} at startup. @end defopt @node Commands, Devices, Invocation, mixvm @comment node-name, next, previous, up @section Interactive commands You can enter the interactive mode of the MIX virtual machine by simply invoking @code{mixvm} without arguments. You will then be greeted by a shell prompt@footnote{The default command prompt, @samp{MIX > }, can be changed using the @code{prompt} command (@pxref{Configuration commands})} @example MIX > @end example @noindent which indicates that a new virtual machine has been initialised and is ready to execute your commands. As we have already mentioned, this command prompt offers you command line editing facilities which are described in the Readline user's manual (chances are that you are already familiar with these command line editing capabilities, as they are present in many GNU utilities, e.g. the @code{bash} shell)@footnote{The readline functionality will be available if you have compiled @sc{mdk} with readline support, i.e., if GNU readline is installed in your system. This is often the case in GNU/Linux and BSD systems}. In a nutshell, readline provides command completion using the @kbd{TAB} key and command history using the cursor keys. A history file containing the last commands typed in previous sessions is stored in the @sc{mdk} configuration directory (@file{~/.mdk}). As a beginner, your best friend will be the @code{help} command, which shows you a summary of all available MIX commands and their usage; its syntax is as follows: @deffn {@code{mixvm} command} help [command] Prints a short description of the given @var{command} and its usage. If @var{command} is omitted, @code{help} prints the short description for all available commands. @end deffn @menu * File commands:: Loading and executing programs. * Debug commands:: Debugging programs. * State commands:: Inspecting the virtual machine state. * Configuration commands:: Changing and storing mixvm settings. * Scheme commands:: @end menu @node File commands, Debug commands, Commands, Commands @subsection File commands You have at your disposal a series of commands that let you load and execute MIX executable files, as well as manipulate MIXAL source files: @deffn {file command} load file[.mix] This command loads a binary file, @var{file.mix} into the virtual machine memory, and positions the program counter at the beginning of the loaded program. This address is indicated in the MIXAL source file as the operand of the @code{END} pseudoinstruction. Thus, if your @file{sample.mixal} source file contains the line: @example END 3000 @end example @noindent and you compile it with @code{mixasm} to produce the binary file @file{sample.mix}, you will load it into the virtual machine as follows: @example MIX > load sample Program loaded. Start address: 3000 MIX > @end example @end deffn @deffn {file command} run [file[.mix]] When executed without argument, this command initiates or resumes execution of instructions from the current program counter address. Therefore, issuing this command after a successful @code{load}, will run the loaded program until either a @code{HLT} instruction or a breakpoint is found. If you provide a MIX filename as argument, the given file will be loaded (as with @code{load} @var{file}) and executed. If @code{run} is invoked again after program execution completion (i.e., after the @code{HLT} instruction has been found in a previous run), the program counter is repositioned and execution starts again from the beginning (as a matter of fact, a @code{load} command preserving the currently set breakpoints is issued before resuming execution). @end deffn @deffn {file command} edit [file[.mixal]] The source file @var{file.mixal} is edited using the editor defined in the environment variable @var{MDK_EDITOR}. If this variable is not set, the following ones are tried out in order: @var{X_EDITOR}, @var{EDITOR} and @var{VISUAL}. If invoked without argument, the source file for the currently loaded MIX file is edited. The command used to edit source files can also be configured using the @code{sedit} command (@pxref{Configuration commands}). @end deffn @deffn {file command} compile file[.mixal] The source file @var{file.mixal} is compiled (with debug information enabled) using @code{mixasm}. If invoked without argument, the source file for the currently loaded MIX file is recompiled. The compilation command can be set using the @code{sasm} command (@pxref{Configuration commands}). @end deffn @deffn {file command} pprog @deffnx {file command} psrc Print the path of the currently loaded MIX program and its source file: @example MIX > load ../samples/primes Program loaded. Start address: 3000 MIX > pprog ../samples/primes.mix MIX > psrc /home/jao/projects/mdk/gnu/samples/primes.mixal MIx> @end example @end deffn Finally, you can use the @code{quit} command to exit @code{mixvm}: @deffn {file command} quit Exit @code{mixvm}, saving the current configuration parameters in @file{~/.mdk/mixvm.config}. @end deffn @node Debug commands, State commands, File commands, Commands @subsection Debug commands Sequential execution of loaded programs can be interrupted using the following debug commands: @deffn {debug command} next [ins_number] This command causes the virtual machine to fetch and execute up to @var{ins_number} instructions, beginning from the current program counter position. Execution is interrupted either when the specified number of instructions have been fetched or a breakpoint is found, whatever happens first. If run without arguments, one instruction is executed. If @code{next} is invoked again after program execution completion (i.e., after the @code{HLT} instruction has been found in a previous run), the program counter is repositioned and execution starts again from the beginning (as a matter of fact, a @code{load} command preserving the currently set breakpoints is issued before resuming execution). @end deffn @deffn {debug command} sbp line_number @deffnx {debug command} cbp line_no Sets a breakpoint at the specified source file line number. If the line specified corresponds to a command or to a MIXAL pseudoinstruction which does not produce a MIX instruction in the binary file (such as @code{ORIG} or @code{EQU}) the breakpoint is set at the first source code line giving rise to a MIX instruction after the specified one. Thus, for our sample @file{hello.mixal} file: @example * (1) * hello.mixal: say 'hello world' in MIXAL (2) * (3) * label ins operand comment (4) TERM EQU 19 the MIX console device number (5) ORIG 1000 start address (6) START OUT MSG(TERM) output data at address MSG (7) ... @end example @noindent trying to set a breakpoint at line 5, will produce the following result: @example MIX > sbp 5 Breakpoint set at line 7 MIX > @end example @noindent since line 7 is the first one compiled into a MIX instruction (at address 3000). The command @code{cbp} clears a (previously set) breakpoint at the given source file line. @end deffn @deffn {debug command} spba address @deffnx {debug command} cbpa address Sets a breakpoint at the given memory @var{address}. The argument must be a valid MIX memory address, i.e., it must belong into the range @w{[0-3999]}. Note that no check is performed to verify that the specified address is reachable during program execution. No debug information is needed to set a breakpoint by address with @code{sbpa}. The command @code{cbpa} clears a (previously set) breakpoint at the given memory address. @end deffn @deffn {debug command} sbpr A | X | J | Ii @deffnx {debug command} cbpr A | X | J | Ii Sets a conditional breakpoint on the specified register change. For instance, @example sbpr I1 @end example @noindent will cause an interruption during program execution whenever the contents of register @code{I1} changes. A previously set breakpoint is cleared using the @code{cbpr} command. @end deffn @deffn {debug command} sbpm address @deffnx {debug command} cbpm address Sets a conditional breakpoint on the specified memory cell change. The argument must be a valid MIX memory address, i.e., it must belong into the range @w{[0-3999]}. For instance, @example sbpm 1000 @end example @noindent will cause an interruption during program execution whenever the contents of the memory cell number 1000 changes. A previously set breakpoint is cleared using the @code{cbpm} command. @end deffn @deffn {debug command} sbpo @deffnx {debug command} cbpo Sets/clears a conditional breakpoint on overflow toggle change. @end deffn @deffn {debug command} sbpc @deffnx {debug command} cbpc Sets/clears a conditional breakpoint on comparison flag change. @end deffn @deffn {debug command} cabp Clears all currently set breakpoints. @end deffn @deffn {debug command} psym [symbol_name] MIXAL programs can define symbolic constants, using either the @code{EQU} pseudoinstruction or a label at the beginning of a line. Thus, in the program fragment @example VAR EQU 2168 ORIG 4000 START LDA VAR @end example @noindent the symbol @code{VAR} stands for the value 2168, while @code{START} is assigned the value 4000. The symbol table can be consulted from the @code{mixvm} command line using @code{psym} followed by the name of the symbol whose contents you are interested in. When run without arguments, @code{psym} will print all defined symbols and their values. @end deffn The virtual machine can also show you the instructions it is executing, using the following commands: @deffn {debug command} strace [on|off] @code{strace on} enables instruction tracing. When tracing is enabled, each time the virtual machine executes an instruction (due to your issuing a @code{run} or @code{next} command), it is printed in its canonical form (that is, with all expressions evaluated to their numerical values) and, if the program was compiled with debug information, as it was originally typed in the MIXAL source file. Instruction tracing is disabled with @code{strace off} command. A typical tracing session could be like this: @example MIX > strace on MIX > next 3000: [OUT 3002,0(2:3)] START OUT MSG(TERM) MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 1) MIX > next 3001: [HLT 0,0] HLT End of program reached at address 3002 Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > strace off MIX > @end example @noindent The executed instruction, as it was translated, is shown between square brackets after the memory address, and, following it, you can see the actual MIXAL code that was compiled into the executed instruction. The tracing behaviour is stored as a configuration parameter in @file{~/.mdk}. @end deffn @deffn {debug command} pline [LINE_NUMBER] Prints the requested source line (or the current one if @var{line_number} is omitted: @example MIX > load ../samples/hello Program loaded. Start address: 3000 MIX > pline Line 5: START OUT MSG(TERM) MIX > pline 6 Line 6: HLT MIX > @end example @end deffn @deffn {debug command} pbt [INS_NUMBER] This command prints a backtrace of executed instructions. Its optional argument @var{ins_number} is the number of instructions to print. If it is omitted or equals zero, all executed instructions are printed. For instance, if you compile and load the following program (@file{bt.mixal}): @example ORIG 0 BEG JMP *+1 JMP *+1 FOO JMP BAR BAR HLT END BEG @end example @noindent you could get the following traces: @example MIX > load bt Program loaded. Start address: 0 MIX > next MIX > pbt #0 BEG in bt.mixal:2 MIX > next MIX > pbt #0 1 in bt.mixal:3 #1 BEG in bt.mixal:2 MIX > run Running ... ... done MIX > pbt 3 #0 BAR in bt.mixal:5 #1 FOO in bt.mixal:4 #2 1 in bt.mixal:3 MIX > pbt #0 BAR in bt.mixal:5 #1 FOO in bt.mixal:4 #2 1 in bt.mixal:3 #3 BEG in bt.mixal:2 MIX > @end example Note that the executed instruction trace gives you the label of the executed line or, if it has no label, its address. @end deffn As you have probably observed, @code{mixvm} prints timing statistics when running programs. This behaviour can be controlled using the @code{stime} command (@pxref{Configuration commands}). @code{mixvm} is also able of evaluating w-expressions (@pxref{W-expressions}) using the following command: @deffn {debug command} weval WEXP Evaluates the given w-expression, @var{WEXP}. The w-expression can contain any currently defined symbol. For instance: @example MIX > psym START + 00 00 00 46 56 (0000003000) MIX > weval START(0:1),START(3:4) + 56 00 46 56 00 (0939716096) MIX > @end example @end deffn New symbols can be defined using the @code{ssym} command: @deffn {debug command} ssym SYM WEXP Defines the symbol named @var{SYM} with the value resulting from evaluating @var{WEXP}, a w-expression. The newly defined symbol can be used in subsequent @code{weval} commands, as part of the expression to be evaluated. E.g., @example MIX > ssym S 2+23*START + 00 00 18 19 56 (0000075000) MIX > psym S + 00 00 18 19 56 (0000075000) MIX > weval S(3:4) + 00 00 19 56 00 (0000081408) MIX > @end example @end deffn Finally, if you want to discover which is the decimal value of a MIX word expressed as five bytes plus sign, you can use @deffn {debug command} w2d WORD Computes the decimal value of the given word. @var{WORD} must be expressed as a sign (+/-) followed by five space-delimited, two-digit decimal values representing the five bytes composing the word. The reverse operation (showing the word representation of a decimal value) can be accomplished with @code{weval}. For instance: @example MIX > w2d - 01 00 00 02 02 -16777346 MIX > weval -16777346 - 01 00 00 02 02 (0016777346) MIX > @end example @end deffn @node State commands, Configuration commands, Debug commands, Commands @subsection State commands Inspection and modification of the virtual machine state (memory, registers, overflow toggle and comparison flag contents) is accomplished using the following commands: @deffn {state command} pstat This commands prints the current virtual machine state, which can be one of the following: @itemize @minus @item No program loaded @item Program successfully loaded @item Execution stopped (@code{next} executed) @item Execution stopped: breakpoint encountered @item Execution stopped: conditional breakpoint encountered @item Program successfully terminated @end itemize @end deffn @deffn {state command} pc Prints the current value of the program counter, which stores the address of the next instruction to be executed in a non-halted program. @end deffn @deffn {state command} sreg A | X | J | I[1-6] value @deffnx {state command} preg [A | X | J | I[1-6]] @deffnx {state command} pall @code{preg} prints the contents of a given MIX register. For instance, @w{@code{preg} @var{A}} will print the contents of the A-register. When invoked without arguments, all registers shall be printed: @example MIX > preg rA: - 00 00 00 00 35 (0000000035) rX: + 00 00 00 15 40 (0000001000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) MIX > @end example As you can see in the above sample, the contents are printed as the sign plus the values of the MIX bytes stored in the register and, between parenthesis, the decimal representation of its module. @code{pall} prints the contents of all registers plus the comparison flag and overflow toggle. Finally, @code{sreg} Sets the contents of the given register to @var{value}, expressed as a decimal constant. If @var{value} exceeds the maximum value storable in the given register, @code{VALUE mod MAXIMUM_VALUE} is stored, e.g. @example MIX > sreg I1 1000 MIX > preg I1 rI1: + 15 40 (1000) MIX > sreg I1 1000000 MIX > preg I1 rI1: + 09 00 (0576) MIX > @end example @end deffn @deffn {state command} pflags @deffnx {state command} scmp E | G | L @deffnx {state command} sover F | T @code{pflags} prints the value of the comparison flag and overflow toggle of the virtual machine, e.g. @example MIX > pflags Overflow: F Cmp: E MIX > @end example @noindent The values of the overflow toggle are either @var{F} (false) or @var{T} (true), and, for the comparison flag, @var{E}, @var{G}, @var{L} (equal, greater, lesser). @code{scmp} and @code{sover} are setters of the comparison flag and overflow toggle values. @end deffn @deffn {state command} pmem from[-to] @deffnx {state command} smem address value @code{pmem} prints the contents of memory cells in the address range @w{[@var{FROM}-@var{TO}]}. If the upper limit @var{to} is omitted, only the contents of the memory cell with address @var{FROM} is printed, as in @example MIX > pmem 3000 3000: + 46 58 00 19 37 (0786957541) MIX > @end example The memory contents are displayed both as the set of five MIX bytes plus sign composing the stored MIX word and, between parenthesis, the decimal representation of the module of the stored value. @code{smem} sets the content of the memory cell with address @var{address} to @var{value}, expressed as a decimal constant. @end deffn @node Configuration commands, Scheme commands, State commands, Commands @subsection Configuration commands This section describes commands that allow you to configure the virtual machine behaviour. This configuration is stored in the @sc{mdk} directory @file{~/.mdk}. As you can see in their description, some commands print, as a side effect, informational messages to the standard output (e.g. @code{load} prints a message telling you the loaded program's start address): these messages can be enabled/disabled using @code{slog}: @deffn {config command} slog on|off Turns on/off the logging of informational messages. Note that error messages are always displayed, as well as state messages required using commands prefixed with @code{p} (@code{preg}, @code{pmem} and the like). @end deffn @deffn {config command} stime on|off @deffnx {config command} ptime The @code{stime} command (un)sets the printing of timing statistics, and @code{ptime} prints their current value: @example MIX > ptime Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > @end example @end deffn @deffn {config command} sedit TEMPLATE @deffnx {config command} pedit @code{sedit} sets the command to be used to edit MIXAL source files with the @code{edit} command. @var{TEMPLATE} must contain the control characters @code{%s} to mark the place where the source's file name will be inserted. For instance, if you type @example MIX > sedit emacsclient %s MIX > @end example issuing the @code{mixvm} command @w{@code{edit foo.mixal}} will invoke the operating system command @w{@code{emacsclient foo.mixal}}. @code{pedit} prints the current value of the edit command template. @end deffn @deffn {config command} sasm TEMPLATE @deffnx {config command} pasm @code{sasm} sets the command to be used to compile MIXAL source files with the @code{compile} command. @var{template} must contain the control characters @code{%s} to mark the place where the source's file name will be inserted. For instance, if you type @example MIX > sasm mixasm -l %s MIX > @end example issuing the @code{mixvm} command @w{@code{compile foo.mixal}} will invoke the operating system command @w{@code{mixasm -l foo.mixal}}. @code{pasm} prints the current value of the compile command template. @end deffn @deffn {config command} sddir DIRNAME @deffnx {config command} pddir MIX devices (@pxref{Devices}) are implemented as regular files stored, by default, inside @file{~/.mdk}. The @code{sddir} command lets you specify an alternative location for storing these device files, while @code{pddir} prints the current device directory. @end deffn Finally, you can change the default command prompt, @samp{MIX > }, using the @code{prompt} command: @deffn {config command} prompt PROMPT Changes the command prompt to @var{prompt}. If you want to include white space(s) at the end of the new prompt, bracket @var{prompt} using double quotes (e.g., @code{prompt ">> "}). @end deffn @node Scheme commands, , Configuration commands, Commands @subsection Scheme commands If you have compiled @sc{mdk} with @code{libguile} support (@pxref{Special configure flags}), @code{mixvm} will start and initialise an embedded Guile Scheme interpreter when it is invoked. That means that you have at your disposal, at @code{mixvm}'s command prompt, all the Scheme primitives described in @ref{Using mixguile} and @ref{mixguile}, as well as any other function or hook that you have defined in the initialisation file @file{~/.mdk/mixguile.scm}. To evaluate a Scheme function, simply type it at the @code{mixvm} command prompt (see @ref{Using Scheme in mixvm and gmixvm} for a sample). Compared to the @code{mixguile} program, this has only one limitation: the expressions used in @code{mixvm} cannot span more than one line. You can get over this inconvenience writing your multiline Scheme expressions in a file and loading it using the @code{scmf} command: @deffn {scheme command} scmf FILE_NAME Loads the given Scheme file and evaluates it using the embedded Guile interpreter. @end deffn @node Devices, , Commands, mixvm @section MIX block devices The MIX computer comes equipped with a set of block devices for input-output operations (@pxref{Input-output operators}). @code{mixvm} implements these block devices as disk files, with the exception of block device no. 19 (typewriter terminal) which is redirected to standard input/output. When you request an output operation on any other (output) device, a file named according to the following table will be created, and the specified MIX words will be written to the file in binary form (for binary devices) or in ASCII (for char devices). Files corresponding to input block devices should be created and filled beforehand to be used by the MIX virtual machine (for input-output devices this creation can be accomplished by a MIXAL program writing to the device the required data, or, if you prefer, with your favourite editor). The device files are stored, by default, in the directory @file{~/.mdk}; this location can be changed using the @code{mixvm} command @code{devdir} (@pxref{Configuration commands}). @multitable {the device name} { xx-xx } {filename[x-x].dev} {bin i/o/char } @item @emph{Device} @tab @emph{No.} @tab @emph{filename} @tab @emph{type and block size} @item Tape @tab 0-7 @tab @file{tape[0-7].dev} @tab bin i/o - 100 words @item Disks @tab 8-15 @tab @file{disk[0-7].dev} @tab bin i/o - 100 words @item Card reader @tab 16 @tab @file{cardrd.dev} @tab char in - 16 words @item Card writer @tab 17 @tab @file{cardwr.dev} @tab char out - 16 words @item Line printer @tab 18 @tab @file{printer.dev} @tab char out - 24 words @item Terminal @tab 19 @tab @code{stdin/stdout} @tab char i/o - 14 words @item Paper tape @tab 20 @tab @file{paper.dev} @tab char in - 14 words @end multitable Devices of type @i{char} are stored as ASCII files, using one line per block. For instance, since the card reader has blocks of size 16, that is, 80 characters, it will be emulated by an ASCII file consisting of lines with length 80. If the reader finds a line with less than the required number of characters, it pads the memory with zeroes (MIX character 'space') to complete the block size. Note that the virtual machine automatically converts between the MIX and ASCII character encodings, so that you can manipulate char device files with any ASCII editor. In addition, the reader is not case-sensitive, i.e., it automatically converts lowercase letters to their uppercase counterparts (since the MIX character set does not include the former). The typewriter (device no. 19) lets you use the standard input and output in your MIXAL programs. For instance, here is a simple 'echo' program: @example * simple echo program TERM EQU 19 the typewriter device BUF EQU 500 input buffer ORIG 1000 START IN BUF(TERM) read a block (70 chars) OUT BUF(TERM) write the read chars HLT END START @end example @noindent Input lines longer than 70 characters (14 words) are trimmed. On the other hand, if you type less than a block of characters, whitespace (MIX character zero) is used as padding. mdk-1.2.9/doc/mdk_index.texi0000644000175000017500000000050512112755472012627 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Concept Index, Instructions and commands, Copying, Top @unnumbered Concept Index @cindex tail recursion @printindex cp mdk-1.2.9/doc/mdk_mixguile.texi0000644000175000017500000003520212622455635013351 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node mixguile, Problems, gmixvm, Top @chapter @code{mixguile}, the Scheme virtual machine @cindex @code{mixguile} This chapter provides a reference to using @code{mixguile} and the Scheme function library giving access to the MIX virtual machine in the @sc{mdk} emulators (@code{mixguile}, @code{mixvm} and @code{gmixvm}). See @ref{Using mixguile} for a tutorial, step by step introduction to @code{mixguile} and using Scheme as an extension language for the @sc{mdk} MIX virtual machines. @menu * Invoking mixguile:: Command line options. * Scheme functions reference:: Scheme functions accessing the VM. @end menu @node Invoking mixguile, Scheme functions reference, mixguile, mixguile @section Invoking @code{mixguile} @cindex @code{mixguile} options Invoking @code{mixguile} without arguments will enter the Guile REPL (read-eval-print loop) after loading, if it exists, the user's initialisation file (@file{~/.mdk/mixguile.scm}). @code{mixguile} accepts the same command line options than Guile: @example mixguile [-s SCRIPT] [-c EXPR] [-l FILE] [-e FUNCTION] [-qhv] [--help] [--version] @end example The meaning of these options is as follows: @defopt -h @defoptx --help Prints usage summary and exits. @end defopt @defopt -v @defoptx --version Prints version and copyleft information and exits. @end defopt @defopt -s SCRIPT Loads Scheme code from @var{script}, evaluates it and exits. This option can be used to write executable Scheme scripts, as described in @ref{Scheme scripts}. @end defopt @defopt -c EXPR Evaluates the given Scheme expression and exits. @end defopt @defopt -l FILE Loads the given Scheme file and enters the REPL (read-eval-print loop). @end defopt @defopt -e FUNCTION After reading the script, executes the given function using the provided command line arguments. For instance, you can write the following Scheme script: @example #! /usr/bin/mixguile \ -e main -s !# ;;; execute a given program and print the registers. (define main (lambda (args) ;; load the file provided as a command line argument (mix-load (cadr args)) ;; execute it (mix-run) ;; print the contents of registers (mix-pall))) @end example @noindent save it in a file called, say, @file{foo}, make it executable, and run it as @example $ ./foo hello @end example @noindent This invocation will cause the evaluation of the @code{main} function with a list of command line parameters as its argument (@code{("./foo" "hello")} in the above example. Note that command line options to mixguile must be written in their own line after the @code{\} symbol. @end defopt @defopt -q Do not load user's initialisation file. When @code{mixguile} starts up, it looks for a file named @file{mixguile.scm} in the user's @sc{mdk} configuration directory (@file{~/.mdk}), and loads it if it exists. This option tells @code{mixguile} to skip this initialisation file loading. @end defopt @node Scheme functions reference, , Invoking mixguile, mixguile @section Scheme functions reference As we have previously pointed out, @code{mixguile} embeds a MIX virtual machine that can be accessed through a set of Scheme functions, that is, of a Scheme library. Conversely, @code{mixvm} and @code{gmixvm} contain a Guile interpreter, and are able to use this same Scheme library, as well as all the other Guile/Scheme primitives and any user defined function. Therefore, you have at your disposal a powerful programming language, Scheme, to extend the @sc{mdk} virtual machine emulators (see @ref{Using Scheme in mixvm and gmixvm} for samples of how to do it). The following subsections describe available functions the MIX/Scheme library. @menu * mixvm wrappers:: Functions invoking mixvm commands. * Hooks:: Adding hooks to mixvm commands. * Additional VM functions:: Functions accessing the MIX virtual machine. @end menu @node mixvm wrappers, Hooks, Scheme functions reference, Scheme functions reference @subsection @code{mixvm} command wrappers For each of the @code{mixvm} commands listed in @ref{Commands}, there is a corresponding Scheme function named by prefixing the command name with @code{mix-} (e.g., @code{mix-load}, @code{mix-run} and so on). These command wrappers are implemented using a generic command dispatching function: @defun mixvm-cmd command argument Dispatches the given @var{command} to the MIX virtual machine appending the provided @var{argument}. Both @var{command} and @code{argument} must be strings. The net result is as writing "@var{command} @var{argument}" at the @code{mixvm} or @code{gmixvm} command prompt. @end defun For instance, you can invoke the @code{run} command at the @code{mixvm} prompt in three equivalent ways: @example MIX > run hello MIX > (mix-run "hello") MIX > (mixvm-cmd "run" "hello") @end example @noindent (only the two last forms can be used at the @code{mixguile} prompt or inside a Scheme script). The @code{mix-} functions evaluate to a unspecified value. If you want to check the result of the last @code{mixvm} command invocation, use the @code{mix-last-result} function: @defun mix-last-result Returns @var{#t} if the last @code{mixvm} command invocation was successful, @var{#f} otherwise. @end defun @noindent Using this function, we could improve the script for running a program presented in the previous section by adding error checking: @example #! /usr/bin/mixguile \ -e main -s !# ;;; Execute a given program and print the registers. (define main (lambda (args) ;; load the file provided as a command line argument (mix-load (cadr args)) ;; execute it if mix-load succeeded (if (mix-last-result) (mix-run)) ;; print the contents of registers if the above commands succeeded (if (mix-last-result) (mix-pall)))) @end example Please, refer to @ref{Commands} for a list of available commands. Given the description of a @code{mixvm}, it is straightforward to use its Scheme counterpart and, therefore, we shall not give a complete description of these functions here. Instead, we will only mention those wrappers that exhibit a treatment of their differing from that of their command counterpart. @defun mix-preg [register] @defunx mix-sreg register value The argument @var{register} of these functions can be either a string or a symbol representing the desired register. For instance, the following invocations are equivalent: @example (mix-preg 'I1) (mix-preg "I1") @end example @end defun @defun mix-pmem from [to] The command @code{pmem} takes a single argument which can be either a cell number or a range of the form @code{FROM-TO}. This function takes one argument to ask for a single memory cell contents, or two parameters to ask for a range. For instance, the following commands are equivalent: @example MIX > pmem 10-12 0010: + 00 00 00 00 00 (0000000000) 0011: + 00 00 00 00 00 (0000000000) 0012: + 00 00 00 00 00 (0000000000) MIX > (mix-pmem 10 12) 0010: + 00 00 00 00 00 (0000000000) 0011: + 00 00 00 00 00 (0000000000) 0012: + 00 00 00 00 00 (0000000000) MIX > @end example @end defun @defun mix-sover #t|#f The command @code{sover} takes as argument either the string @code{T} or the string @code{F}, to set, respectively, the overflow toggle to true or false. Its Scheme counterpart, @code{mix-sover}, takes as argument a Scheme boolean value: @code{#t} (true) or @code{#f}. @end defun For the remaining functions, you simply must take into account that when the command arguments are numerical, the corresponding Scheme function takes as arguments Scheme number literals. On the other hand, when the command argument is a string, the argument of its associated Scheme function will be a Scheme string. By way of example, the following invocations are pairwise equivalent: @example MIX > load ../samples/hello MIX > (mix-load "../samples/hello") MIX > next 5 MIX > (mix-next 5) @end example @node Hooks, Additional VM functions, mixvm wrappers, Scheme functions reference @subsection Hook functions Hooks are functions evaluated before or after executing a @code{mixvm} command (or its corresponding Scheme function wrapper), or after an explicit or conditional breakpoint is found during the execution of a MIX program. The following functions let you install hooks: @defun mix-add-pre-hook command hook Adds a function to the list of pre-hooks associated with the given @var{command}. @var{command} is a string naming the corresponding @code{mixvm} command, and @var{hook} is a function which takes a single argument: a string list of the commands arguments. The following scheme code defines a simple hook and associates it with the @code{run} command: @example (define run-hook (lambda (args) (display "argument list: ") (display args) (newline))) (mix-add-pre-hook "run" run-hook) @end example Pre-hooks are executed, in the order they are added, before invoking the corresponding command (or its associated Scheme wrapper function). @end defun @defun mix-add-post-hook command hook Adds a function to the list of pre-hooks associated with the given @var{command}. The arguments have the same meaning as in @code{mix-add-pre-hook}. @end defun @defun mix-add-global-pre-hook hook @defunx mix-add-global-post-hook hook Global pre/post hooks are executed before/after any @code{mixvm} command or function wrapper invocation. In this case, @var{hook} takes two arguments: a string with the name of the command being invoked, and a string list with its arguments. @end defun @defun mix-add-break-hook hook @defunx mix-add-cond-break hook Add a hook funtion to be executed when an explicit (resp. conditional) breakpoint is encountered during program execution. @var{hook} is a function taking two arguments: the source line number where the hook has occurred, and the current program counter value. The following code shows a simple definition and installation of a break hook: @example (define break-hook (lambda (line address) (display "Breakpoint at line ") (display line) (display " and address ") (display address) (newline))) (mix-add-break-hook break-hook) @end example Break hook functions are entirely implemented in Scheme using regular post-hooks for the @code{next} and @code{run} commands. If you are curious, you can check the Scheme source code at @file{@emph{prefix}/share/mdk/mixguile-vm-stat.scm} (where @emph{prefix} stands for your root install directory, usually @code{/usr} or @code{/usr/local}. @end defun See @ref{Hook functions} for further examples on using hook functions. @node Additional VM functions, , Hooks, Scheme functions reference @subsection Additional VM functions When writing non-trivial Scheme extensions using the MIX/Scheme library, you will probably need to evaluate the contents of the virtual machine components (registers, memory cells and so on). For instance, you may need to store the contents of the @code{A} register in a variable. The Scheme functions described so far are of no help: you can print the contents of @code{A} using @code{(mix-preg 'A)}, but you cannot define a variable containing the contents of @code{A}. To address this kind of problems, the MIX/Scheme library provides the following additional functions: @defun mixvm-status @defunx mix-vm-status Return the current status of the virtual machine, as a number (@code{mixvm-status}) or as a symbol (@code{mix-vm-status}). Possible return values are: @multitable {aamixvmaastatusaa} {aamixvmastatusaaaaaaa} {return valuesaaaaaaaaaaaaaaaaaaaaaaaaaa} @item @code{(mixvm-status)} @tab @code{(mix-vm-status)} @tab @item 0 @tab MIX_ERROR @tab Loading or execution error @item 1 @tab MIX_BREAK @tab Breakpoint encountered @item 2 @tab MIX_COND_BREAK @tab Conditional breakpoint @item 3 @tab MIX_HALTED @tab Execution terminated @item 4 @tab MIX_RUNNING @tab Execution stopped after @code{next} @item 5 @tab MIX_LOADED @tab Program successfully loaded @item 6 @tab MIX_EMPTY @tab No program loaded @end multitable @end defun @defun mix-vm-error? @defunx mix-vm-break? @defunx mix-vm-cond-break? @defunx mix-vm-halted? @defunx mix-vm-running? @defunx mix-vm-loaded? @defunx mix-vm-empty? Predicates asking whether the current virtual machine status is @code{MIX_ERROR}, @code{MIX_BREAK}, etc. @end defun @defun mix-reg register @defunx mix-set-reg! register value @code{mix-reg} evaluates to a number which is the contents of the specified @var{register}. @code{mix-set-reg} sets the contents of the given @var{register} to @var{value}. The register can be specified either as a string (@code{"A"}, @code{"X"}, etc.) or as a symbol (@code{'A}, @code{'X}, etc.). For instance, @example guile> (mix-reg 'A) 2341 guile> (mix-set-reg! "A" 2000) ok guile> (define reg-a (mix-reg 'A)) guile> (display reg-a) 2000 guile> @end example @end defun @defun mix-cell cell_no @defunx mix-set-cell! cell_no value Evaluate and set the contents of the memory cell number @var{cell_no}. Both @var{cell_no} and @var{value} are Scheme numbers. @end defun @defun mix-loc Evaluates to the value of the location counter (i.e., the address of the next instruction to be executed). @end defun @defun mix-over @defunx mix-set-over! #t|#f @code{mix-over} evaluates to @code{#t} if the overflow toggle is set, and to @code{#f} otherwise. The value of the overflow toggle can be modified using @code{mix-set-over!}. @end defun @defun mix-cmp @defunx mix-set-cmp! 'L|'E|'G Evaluate and set the comparison flag. Possible values are the scheme symbols @code{L} (lesser), @code{E} (equal) and @code{G} (greater). @end defun @defun mix-up-time Evaluates to the current virtual machine uptime. @end defun @defun mix-lap-time Evaluates to the current virtual machine lapsed time, i.e., the time elapsed since the last @code{run} or @code{next} command. @end defun @defun mix-prog-time Evaluates to the total time spent executing the currently loaded program. @end defun @defun mix-prog-name Evaluates to a string containing the basename (without any leading path) of the currently loaded MIX program. @end defun @defun mix-prog-path Evaluates to a string containing the full path to the currently loaded MIX program. @end defun @defun mix-src-path Evaluates to a string containing the full path to the source file of the currently loaded MIX program. @end defun @defun mix-src-line [lineno] @defunx mix-src-line-no @code{mix-src-line-no} evaluates to the current source file number during the execution of a program. @code{mix-src-line} evaluates to a string containing the source file line number @var{lineno}; when invoked without argument, it evaluates to @code{(mix-src-line (mix-src-line-no))}. @end defun @defun mix-ddir Evaluates to a string containing the full path of the current device directory. @end defun mdk-1.2.9/doc/mdk_emacs.texi0000644000175000017500000001263610770465100012612 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2003, 2004 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Emacs tools, mixasm, Getting started, Top @chapter Emacs tools Everyone writing code knows how important a good editor is. Most systems already come with Emacs, and excellent programmer's editor. @sc{mdk} adds support to Emacs for both writing and debugging MIX programs. A major mode for MIXAL source files eases edition of your code, while integration with Emacs' debugging interface (@acronym{GUD}) lets you use @code{mixvm} without leaving your favourite text editor. This chapter shows how to use the Elisp modules included in @sc{mdk}, assuming that you have followed the installation instructions in @xref{Emacs support}. @menu * MIXAL mode:: Editing MIXAL files. * GUD integration:: Invoking @code{mixvm} within Emacs. @end menu @node MIXAL mode, GUD integration, Emacs tools, Emacs tools @section MIXAL mode The module @file{mixal-mode.el} provides a new mode, mixal-mode, for editing MIXAL source files@footnote{mixal-mode has been developed and documented by @value{PIETER}}. When everything is installed correctly, Emacs will select it as the major mode for editing files with extension @code{.mixal}. You can also activate mixal-mode in any buffer issuing the Emacs command @code{M-x mixal-mode}. @menu * Basics:: Editing code, font locking and indentation. * Help system:: Using the interactive help system. * Compiling and running:: Invoking compiler and/or virtual machine. @end menu @node Basics, Help system, MIXAL mode, MIXAL mode @comment node-name, next, previous, up @subsection Basics The mode for editing mixal source files is inherited from fundamental-mode, meaning that all your favorite editing operations will still work. If you want a short introduction to Emacs, type @kbd{C-h t} inside Emacs to start the tutorial. Mixal mode adds font locking. If you do not have font locking globally enabled, you can turn it on for mixal-mode by placing the following line in your @file{.emacs} file: @lisp (add-hook 'mixal-mode-hook 'turn-on-font-lock) @end lisp You can also customize the colors used to colour your mixal code by changing the requisite faces. This is the list of faces used by mixal-mode: @itemize @item @var{font-lock-comment-face} Face to use for comments. @item @var{mixal-font-lock-label-face} Face to use for label names. @item @var{mixal-font-lock-operation-code-face} Face to use for operation code names. @item @var{mixal-font-lock-assembly-pseudoinstruction-face} Face to use for assembly pseudo-instruction names. @end itemize @node Help system, Compiling and running, Basics, MIXAL mode @comment node-name, next, previous, up @subsection Help system When coding your program, you will be thinking, looking up documentation and editing files. Emacs already helps you with editing files, but Emacs can do much more. In particular, looking up documentation is one of its strong points. Besides the info system (which you are probably already using), mixal-mode defines commands for getting particular information about a MIX operation code. With @kbd{M-x mixal-describe-operation-code} (or its keyboard shortcut @kbd{C-h o}) you will get the documentation about a particular MIX operation code. Keep in mind that these are not assembly (MIXAL) pseudoinstructions. When the @code{point} is around a MIXAL pseudoinstruction in your source file, Emacs will recognize it and will suggest the right MIX operation code. @node Compiling and running, , Help system, MIXAL mode @comment node-name, next, previous, up @subsection Compiling and running After you have written your MIXAL program, you'll probably want to test it. This can be done with the MIX virtual machine. First you will need to compile your code into MIX byte code. This can be done within Emacs with the command @kbd{M-x compile} (@kbd{C-c c}). In case of compilation errors, you can jump to the offending source code line with @kbd{M-x next-error}. Once the program compiles without errors, you can debug or run it. To invoke the debugger, use @kbd{M-x mixal-debug} (@kbd{C-c d}). Emacs will open a @code{GUD} buffer where you can use the debugging commands described in @xref{mixvm}. If you just want to execute the program, you can do so with @kbd{M-x mixal-run} (@kbd{C-c r}). This will invoke mixvm, execute the program and show its output in a separate buffer. @node GUD integration, , MIXAL mode, Emacs tools @section GUD integration If you are an Emacs user and write your MIXAL programs using this editor, you will find the elisp program @file{mixvm.el} quite useful@footnote{@file{mixvm.el} has been kindly contributed by @value{PHILIP}. @file{mixvm.el} is based on a study of gdb, perldb, and pdb as found in @file{gud.el}, and @file{rubydb3x.el} distributed with the source code to the Ruby language.}. @file{mixvm.el} allows running the MIX virtual machine @code{mixvm} (@pxref{mixvm}) inside an Emacs @acronym{GUD} buffer, while visiting the MIXAL source file in another buffer. After installing @file{mixvm.el} (@pxref{Emacs support}), you can initiate an @sc{mdk}/@acronym{GUD} session inside Emacs with the command @example M-x mixvm @end example @noindent and you will have a @code{mixvm} prompt inside a newly created @acronym{GUD} buffer. @acronym{GUD} will reflect the current line in the corresponding source file buffer. mdk-1.2.9/doc/mdk_intro.texi0000644000175000017500000000616312622455635012665 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Introduction, Acknowledgments, Top, Top @comment node-name, next, previous, up @unnumbered Introduction @cindex Introduction In his book series @cite{The Art of Computer Programming} (published by Addison Wesley), D. Knuth uses an imaginary computer, the MIX, and its associated machine-code and assembly languages to illustrate the concepts and algorithms as they are presented. The MIX's architecture is a simplified version of those found in real CISC CPUs, and the MIX assembly language (MIXAL) provides a set of primitives that will be very familiar to any person with a minimum experience in assembly programming. The MIX/MIXAL definition is powerful and complete enough to provide a virtual development platform for writing quite complex programs, and close enough to real computers to be worth using when learning programming techniques. At any rate, if you want to learn or improve your programming skills, a MIX development environment would come in handy. The @sc{mdk} package aims at providing such virtual development environment on a GNU box. Thus, @sc{mdk} offers you a set of utilities to simulate the MIX computer and to write, compile, run and debug MIXAL programs. As of version @value{VERSION}, @sc{mdk} includes the following programs: @table @code @item mixasm MIXAL assembler. Assembler which translates MIXAL source files into programs that can be run (and debugged) by @code{mixvm}, @code{mixguile} or @code{gmixvm}. @item mixvm MIX virtual machine. Emulation of the MIX computer with a @acronym{CLI}. @item gmixvm A GTK+ GUI for the MIX virtual machine. Provides all of @code{mixvm} functionality accessible through a graphical interface. @item mixguile A Guile shell, with an embedded MIX virtual machine and built-in commands to manipulate it using Scheme. @item mixal-mode.el An Emacs major mode for MIXAL source files editing, providing syntax highlighting, documentation lookup and invocation of @code{mixvm} within Emacs. @item mixvm.el This elisp program allows running @code{mixvm} inside an Emacs GUD buffer, providing concurrent edition and debugging of MIXAL programs. @end table @code{mixvm} and @code{gmixvm} implement a simulator of the MIX computer, giving you a virtual machine for executing and debugging MIX programs. These binary programs could be written by hand, but it is easier to produce them compiling MIXAL source files, using the MIXAL assembler @code{mixasm}. On the other hand, @code{mixguile} offers you the possibility of manipulating a MIX virtual machine through a set of Scheme functions, so that you can use this programming language to interact with the virtual machine. In addition, @code{mixvm} and @code{gmixvm} are also able to interpret Scheme scripts (using an embedded Guile interpreter), that is, you can use Scheme as an extension language to add new functionalities to these programs. This manual gives you a tutorial of MIX and MIXAL, and a thorough description of the use of the @sc{mdk} utilities. mdk-1.2.9/doc/img/0000755000175000017500000000000012636571405010631 500000000000000mdk-1.2.9/doc/img/ss_worddlg.jpg0000644000175000017500000001735410770465100013423 00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ“!"ÿÄÿÄG!”1UÑÓ"ST•ÒAQRaqt‘´456G…²Ã#2B‚¡$3³&ÿÄÿÄ"!1AQa¡ðÿÚ ?þ°¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@®Ñv8ÅLØÄX¶]òLÂ{}»ƒ0EÉ.4jp’*&mi#Ì]ÈÓ[<5®åPÙµZØb Ûa´Ôêá€0(1ƒF-¢' š}“.;(9µ›¥{µÊ# 8*DYóf±ß¶9&$GÕÖžw‹ÏÆE`³ÐÙ¦fÚ"®®ât©s’7+…»È—68´Ô†šº<û €Í¹GW4´É®H°ÕT›hˆºÐEô[B­Ë£œ!"Ás³Û¬V›+w5l¥;ÕSª¨TÖ³í$ôÀ²Ôª™/üµôk‚aáØö9XvÙvŒÊëR¸ÃeópúÇ\ÔY†Y¡È}Q­4DUJ U“¥DÅ—â‹Õ®×2Í\Q·¥²àìƒU‘ 2ØŽÊmÉWÅE4R!@$U»Ã#_o—«U¡0[°dKYg æ½"01Ê"­ ÑÇQR^I˜¦ÚŽyzi²ýÃ;[³?GmKÑ6'^Ø›Öä~à‘eš·è ¼8'ùaÂØbÁ§qaË=«OY–Å ¶rë4kÿ"'ùº¦³ùú°Ïü©“Ùé„ékOÃØš$K[³¶{\q¹^5ùˆó$â 4FÛd,ÿ†2ÔJ7ÇJ•u\mæAæL\lÅ W4$^(¨¿5y7 nÉy¸‘ÁÉj…$Å´EyPPQMÕ¢'‘+îhðâ3v£Æa±m–Zl2Nˆˆˆˆ”h½íëJRJRJRJRJRJRJRJRJRJ‡|¹Á²Ùg^noõ`FrT—tum6*FY *®Hй"*Ô 3Šl؉ÙL[NhHˆ€OÇ›o~À'«A+o€’ÐyY.•ãÁh.éPÞ¹ÁjõÌãùN•éLµ ½&š&…ÂÏ,“%y´ÉW5ÕÃ<—)” R” R” ü""TDÍUW‚%~Õv'ýÚº}ÍïèZý²wÍ»™oÛ'|Û¹ñ«ûõÒŽÇ>÷tgoŒä©Nè"êÚlTŒ²U\…rDUùªmz<¸²#¬ˆòYy”Ï7Ї‡oáQ7퓾mÜÈxÔ[ÿ꘻ýÿ”j¯q&'´aÙænÇ5­ã%¸±Ýjï4Ž›€Ø Ž6 j7Q\QEUáØ¹fý²wÍ»™oÛ'|Û¹ñ­e((µ‡WÖkjÕŸ ¾|êý²wÍ»™®þ'þÍhñN)³a¡an®ËB} [n,å8¢k- êÉS$Í3^4»öÉß6îd0ĶÝkäó¨/ £ƒç2ËÉ¡WÚeÕu°<½!Q!EÍ”EU8ä•íYÝ£ûu¯sΦш}º×È9çPR ¿“ÿf¥t§\aB‚ÊÔÜwŒ’è䛃±$+Y&@À˺½$SQÌQ=‰P†Víoôsõ…Õì»6¼¸å£Nm{í‡Û­|ƒžu*GG³¤b ,¨3á²€ôNño˜ã“ú¶­qE3z›Qc2qQ[Ét"ä#Õë;´bnµòyÔÚ1·Zù<ê»M)?†ßÉÿ³RºS‡.0¡@Áejn;ÆItrMÁØ’¬“ aÀeÝ ^’)¨æ(žŽD¨C+v·ú?¹úÂêö]›^\rѧ?¶½öŒCíÖ¾AÏ:¢°²º4Ÿ?ÙÜnÅdöèoÛ¥H+}ò[ÝrÄFˆH½Slz$Ð6¢êÁ=UÈzågvŒCíÖ¾AÏ:›F!öë_ çMŠOá·òì×ÇN=?Ò~ ;ìËlÆ¡Ln#CÔ¬gžy‚iím8Hˆ„C©½&‚á乪eo»[ýÜýau{.ͯ.9hÓŸÛ^ûF!öë_ çAš»Xz@›­a1,×|%m(ÆÞÑs8òß|4©J}¶â«n)bM†¤B\—NŽYÝ£ûu¯sΦш}º×È9çSèUØ?TÂ?ìü£µ[ŠpDë¾?‹yƒ†°­¬˜¸E”æ"fAïWÛiAM’`SIˆ++©âM žœòD½nÞìxvÖ¡Èvß§ª7[SɲoÒTù {8åRvŒCíÖ¾AÏ:“‹±šè×£i˜/^.Ê.W[tëlxâÜÔÖ›ã"SÎ8â´Ãyñ1-Jª®;¯<›Ó°Åÿ±Gï‘?0ÝDÚ1·Zù<êò–y­ƒfÁ&ÖÝ$f!*¡¢"«Š‰ÄSäì ™JRJRJRJ­Ä·Ën³¹v»:óqAÆšUf;¸Fë‚Ûb-¶$d¤f"ˆ(«š×–Ķ|DÜ‚µItœŠh‘Èï²J™¢Nˆ˜æœS4LþJ zR¼a¼ãí»褎 : ª¨&¢‡è’¦Dˆ„œsÈ“4Í=©J­yŠþ'‡·’T(Q¦8j‰Õ¨>o€".yæ‹óà‰’ŽJ¼r *R” ü""TDÍUW‚%~Õv'ýÚº}ÍïèZý²wÍ»™oÛ'|Û¹ñ«,SŠlØhX[«²ÐŸCVÛ‹ùN(†ZËC D‚:‡2TÉ3L×W§Hx@§ÂˆÝÑÇvåa#Énç‰ôdVB´$h`¢$H«¬rN)Aó¿lónæCÆ›öÉß6îd®8 6¦fY""ªf™¢f•õ;aØV˜W)Kxi¹¨â²ÉY&m:[\ŒŠ?UÖ€¢ªfD(™®y**ÍšyoÛ'|Û¹ñ¦ý²wÍ»™úNðO…»£ŽíÊÂG’Ü7Î)è$Ȭ„hHÐÁDH‘WXäœR½äcœ*Äûä» J°Œr¹2Û.8L,ŒÑ‘ÈEu™¨ª eÅ8qLíàí~Ù;æÝ̇7퓾mÜÈxÕ¾ÄVŒK év‰¸ <±ßmèÎGu—Q”iÑÒB¹"äH½Š•kA“ß¶Nù·s!ãMûdï›w25¬¥O~Ù;æÝ̇7퓾mÜÈxÖ²”=ûdï›w24ß¶Nù·s!ãZÊPd÷퓾mÜÈxÓ~Ù;æÝ̇k)A“ß¶Nù·s!ãMûdï›w25¬¥O~Ù;æÝ̇7퓾mÜÈxÖ²”=ûdï›w25öÅâÒûÂËH.¸K€H%_©kSU¿ö(ýò'æ ó¥)@¥)@¥)A›é"Ñs½at‰fg9›Œ ­·‰¦œÙ¦2ú¨æ*" ¯N–¿àŒU‰m¥û…Âßg»^¢Â†ÓV÷‰æšf3®;¤œq´Ö®uÎ*µ’ ¢i.(½6”'!hè¢ùщ–l9|b4ÉN•Šçp€Hël:TÛlZs&ú…Oñœ-Y— ú•6>0vhY߸Ü!J ƒ#U…)É÷)-½žŒÀ…&1éŽdŠ."pÉK³Òƒ’bþ‹ç®ù‰ƒâaè–‹£Vô“CA¡÷9Dó„Ž0óhákнa6â—T¹¢.’«>†0%ó¹(¯3¢KC·³ •dóQæÜTFÀPQ©LŠ Š"(   çÒ)@¥)@ªìOûµtû›ßеc^Ã6ß&’ˆ¾Ñ4¤¨„Š™ÿÍwJpñåÆ(,­MÇxÉ.ŽI¸;Bµ’d 8 »¡KÒE5ÅÑÈ•s×l ˆ®7¬2MB´Z­Öƒ€`Ü{Ô·ŽÜu(ã [Hï.hB Ŷ[F!öë_ çM£ûu¯sΤº/, ¯¢Y––#|$±m÷;lF׉85%ð—!÷|Ú†ªºUí`ZIHÌõv6Aò3¤›F;>o Ûb\nnÉ™=ÑøáoŒ­4 Éôê pÈú°Ò®„ET!èF!öë_ çM£ûu¯sΠÆÝ°&"¸Þ°É5 Ñj·ZƒqïRÜf;qÔH£Œ5m#¼¹¡H$PTPeèÛໞ%»`üJ7ysíQ£AnþM”“%×]|£Æ,‘õ!TUR#q‚ŽïhÄ>Ýkäó©´bnµòyÕmßdá¢û=æÍ`}¬CwYŠD¹ \JbÌ5Et̘gIz((D@$É5uÚ1·Zù<êm‡Û­|ƒžuA¢¥gvŒCíÖ¾AÏ:›F!öë_ çA¢¥gvŒCíÖ¾AÏ:›F!öë_ çA¢¥gvŒCíÖ¾AÏ:›F!öë_ çA¢¥gvŒCíÖ¾AÏ:›F!öë_ çA¢¥gvŒCíÖ¾AÏ:›F!öë_ çA¢¥gvŒCíÖ¾AÏ:›F!öë_ çA¢ªŒ_û~ùó ÔM£ûu¯sί)awšØ16lamÒFb¨"*¸¨œE>NÊ ”¥(¥(!JµÆù<ã³D‹,ѹ¯6=™p$Dÿñ+ËrÃõ×/yHøêÊ \fÌ”Ü7¢Fj)‹D®²N‘’€šäˆC’"üù®}™qË×\½å#ã¦å‡ë®^ò‘ñÔŠ÷Þvî@üêlW¾ó·rçPGܰýuËÞR>:nX~ºåï)Hد}çnäΦÅ{ï;w ~u}Ë×\½å#ã¦å‡ë®^ò‘ñÔŠ÷Þvî@üêlW¾ó·rçPGܰýuËÞR>:nX~ºåï)Hد}çnäΦÅ{ï;w ~u}Ë×\½å#ã¦å‡ë®^ò‘ñ׳‘/€ Cp¶¸_é†`„¿6®±rûr\¾e¯[t‘›o0D_h]A^ÔBD\¿æ‚&å‡ë®^ò‘ñÓrÃõ×/yHøêÊ«â­Öà.¿L(Ì Î4ärt—A(*ª¡Š&j+Ã%á—9 |îX~ºåï)7,?]r÷”ޤlW¾ó·rçSb½÷»?:‚>å‡ë®^ò‘ñÓrÃõ×/yHøêFÅ{ï;w ~u6+ßyÛ¹ó¨#îX~ºåï)7,?]r÷”ޤlW¾ó·rçSb½÷»?:‚>å‡ë®^ò‘ñÓrÃõ×/yHøêFÅ{ï;w ~u6+ßyÛ¹ó¨#îX~ºåï)7,?]r÷”Ž—ïn„ôç¦@Û®›CÛ"LË"ë %É.W‡Ú² ­Ü°ýuËÞR>:nX~ºåï)YUu½/,Oj\íHu¶Ê)¸B$™ŽeÖk–Yðà¼8öÐ~nX~ºåï)7,?]r÷”ޤlW¾ó·rçSb½÷»?:‚>å‡ë®^ò‘ñÓrÃõ×/yHøêFÅ{ï;w ~u6+ßyÛ¹ó¨#îX~ºåï)7,?]r÷”ޤlW¾ó·rçSb½÷»?:‚>å‡ë®^ò‘ñÓrÃõ×/yHøêFÅ{ï;w ~u6+ßyÛ¹ó¨#îX~ºåï)}5hˆÓ à»pRBD)ï’fŸ:)ä©õ-~J+¥¿ªzT˜RY'[hŸäѲ@BES$\ˆ“†IÃ><2[)JF°~¹xûèþ]š“Q¬®^>ú?—f‚Ú¹/L*\ú=Æö’-±?G$²²'KqH&…ÄÉ´Ì:6TP>µÒTUk­Wó/K—Œ_Òv9„0ÎqñÂï:þÉ Ò:õ¼ó„™Z$BÀ':Â\•UŒçlœ=?‹ãÃ?&¼œcîüOŸ»ñ=×B´ôÂÕÿ¦ nÃvà¹Y_iþ¾âJ¾€)m’*lèH-!–]a<**‚‚¯u ŒèVØ.θË##©×ßqm´ùÈ—$Dûk‰ÑíÎÇ? Þ[‰±¼ –äJ—‘)ˈêE5Í2GZFÑx+fjˆ®®{œn–k\L=.ët±´°®©ƒùÎ\Þí÷¸îLe•Åâ(sD5&v‘Ìx®JOjÁý)I—Ç/ûw¸– 1z&ÉÁ*âM)Š>HY´P‘zÓ4$TC#QUGž»ÅCzé«Ü[+éŸ*3Ò™kAzM4M …žY&JóI’®k«†y.\®ñc騸µ¸}jÿ%×JÔîÚ­Åe FGÅZgE }X.¤%ë“VuõÑ>Ʊ1M²å‰[º1aÝc‰O&õ°´šml”ካ QºªŠŠŠ‚š3‘lÓ¬;ÿ>Ôª|1ûµkû›?Еpçþ@ûR©ðÇîÕ¯îlÿBUExaÙg÷É_˜r½ëà þË?¾JüÔ•È.˜Êû…ú\z-úz­ž\†Ûj:·cx Q=!urs‰z$‹–i]~¹—ýG­©0#u‡©·§6ÈNÒ«»Ô„—­Í8¦zz´NÂ'W<ò¬å½pÖ6Nݹ°Ü˜ì&å°r™DWYL{Gµ3Ïå¯FÜmÍ][‚zID´®y*v¢ýuü»1^À¦Î3·7²Ü“0H®ª’@ÁþàÉu+¥¨úH™‚ ’)*§EÃøÎÍŒºIJ›Ä,Xá;؉s$Z/< Ø‹†zKX¤|KP®¢U¬aå™Ëq?]Y+|xç¤ÄÖ±=¦SVXîI¹$IC â¶Ø©6¤I’"ðË?’´UÁËØ1ƾà\;oÃQ¯oá‰Öëlhwûsýs¤Â¢3ZuO«]:•MÉSµFt{OKpzL¹ÝUÙ³âuÓ†Ú8‰æ•§+j›þEÕ"›q5jN&¢¤UÖñYœÇj¥p<„ºO“yþî!ƒ‡Î|wÞ¼ºÛÀÞÉp\Û¤º¢®¬/òº‰ÄHDTIS¾->+ýߺ}ÉïýeRê+ýߺ}ÉÿýeS(ã…?uí?rgú½«Ç ~ëÚ~äÏô%)Yž“fâ~—+ DvLÀˬÙÁÛ\u› iuÔNÁ_­t¸¢8Ý$c86ü1ŒáYoQÛĶk›€´:LØ!dˆI"‰(¯VJ+žHm©"#ƒ«ŠcÙ· ?gº]¬—üNÌ«ls~9?ˆ&ȵ´Í›qÒIþRN Š™Õ]ÎÛƒq º%Æ|x3¢ dl<óŠy¡’™’’®¢"%R"%R"UUUUZ»èçIéFS²%6û%·}Ò"zèh¹M*¨7š*ƒ’ö€®­JßÚçfœ÷r¼?£/·«5†ß}»@µDÔ×Í ·©{Qª&kóW£w;kŽGm»„C9QÊLq…UÖGF§¤ Ö7™'Ö?:W8éwØpÆ9׋•ÆÈû°bKµI»D‰''Õ´ M —ÓÔ¸ÞjIÁÓÉW%EÆZ°œ¼_iò°ÍÚÃ:½‹ÒÌbÁ¹6õrL貚µ¼M.jßU˜®„É:±ÍWA÷twÛtèW(-N·L2#é§ØqmÄùÄ‘U>ʵ Äóò,ñ•krÔñ4šá¸`jÂýÛUDù³æì©‹ÙVöE6$ýH~÷ó ÔÚ…‰?R½ÅüÃu6 R” TK‚3¯ ö¹µéNÝ*ÃH‹—̪$™ýKóTº2ßi LƒI d*ëBj‰õf”ÏèáMgô ðª}Ådîkw,ÜVNæ·rÁáA.×m·Z¶­×j‹l’rålÑž½óË[§¥Q–I™/É3©ºÏèáTûŠÉÜÖîX<)¸¬ÍnåƒÂ‚ãYýü)¬þ~O¸¬ÍnåƒÂ›ŠÉÜÖîX<(.5ŸÐ/šÏèáTûŠÉÜÖîX<)¸¬ÍnåƒÂ‚Ñç^yQ¶ÛMFf¹¢qUU^ĪÌ6$vÚ*$1EEL•BP,–P40´[Ä…sEHÀŠ‹øU…¢á§-¯úFd¡ vŠ«ÆIŸÍÁQ~ÅEùjUD—k¶Kw®•nˆû™e­ÖD—/µR‚ËYýü+Âá‹„'¡Mˆ2#> Û­8‰Šö¢¥Wn+'s[¹`ð¦â²w5»– Ë`pºo ‡çªuLËn´Ê!f‚"«–ž ÁsL«vÈ‹ ƒ,°4Ø €d"(™""'bUVâ²w5»– n+'s[¹`ð©$ gô ð¦³úøU>â²w5»– n+'s[¹`ðª.5ŸÐ/šÏèáTûŠÉÜÖîX<)¸¬ÍnåƒÂƒï—ÿ]¹)ú:¢:Ÿ È…DQ>µUDDùUjuAbÏiaáy‹\œÌL#ˆ’/Ô¨•:Qp³©ú/k@ôÔb6—$"ˆH¿Z***|Š•* ¿g´¾ñ<ý® ®æFqĉWëUJ ]gô ð¦³úøU>â²w5»– n+'s[¹`ð Î?Ñ7Gòq„üQ; Ÿ.hdãØ£©jqÐh‘D\5AÔYqQÍ2SqOk †`Ãb(mÆ‹±i–YmL„DS‚""""'eVî+'s[¹`ð¦â²w5»– gô ð¦³úøU>â²w5»– n+'s[¹`ð ¸Ö@¿ k? _…Sî+'s[¹`ð¦â²w5»– ¼F¿öm z$s# "ö’£àJ‰óð_±juD‹k¶Dw®‹nˆÃ™e­¶DW/µ¥Ð)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPÿÙmdk-1.2.9/doc/img/ss_extprog.jpg0000644000175000017500000002405210770465100013442 00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀv¢"ÿÄÿÄG !"”Ó1TU#2V•£Ò4AQat35–´&6Bqrs±²$%CSbÿÄÿÄ&!Að1QaÑ2q‘ñÿÚ ?ýaJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJÔvã·”n[¦Ú¢G]AUD\*€ª"áQqüÒ±ö›? tû²Gä Ý¥i{MŸ„º}Ù#òSÚlü%ÓîÉ’ƒv•¥í6~é÷dÉOi³ð—O»$~J ÚV—´ÙøK§Ý’?%=¦ÏÂ]>ì‘ù(7iZ^Ógá.ŸvHü”ö›? tû²Gä Ý¥i{MŸ„º}Ù#òSÚlü%ÓîÉ’ƒv•¥í6~é÷dÉOi³ð—O»$~J ÚV—´ÙøK§Ý’?%=¦ÏÂ]>ì‘ù(7iZ^Ógá.ŸvHü”ö›? tû²Gä Ý¥i{MŸ„º}Ù#òV'vŒØޱqi±L‘¹o|DS÷ªª†?šÐoÒ” W8×½¦~kG4æíŽÜÄÞ{þ¥ög/+†ÆÇÍûx2K”Æñé]ª·ÍôíNö¡·jÛõŠTˆLC| „CmÐdÞ0UGØqQQ_sÜ¨ŠŠ:PikžÐ-öI¬Ú ;Ïw+¥¶­¬G–†L¦[$'E6œNˆ‘"û— žøÝÚæŸ¾[n²¥=(#ZÑ×/dL`œxÎ#£øÎB 3¼Ü!ÚI¹ ¦/]ŸÛîw×nky¼ÄjEÂÊTî4‘äIŠmNæÔÓ£  ’" §L¢-hZ»)³Û,ÏYbÞï£nr<0àWðHˆÜvØ–$oG…"³Ó\Æ¢5:h<äˆBõ®S\/¢o)¶ˆÉíG6©ng)Qðû*²Gî@wkÜ–-½Ü-Œ<óJYfSE–ðÚ*‚œVQTÔËh"!'¾¦æhÛd¯jr?1=¥y‡y{i…è½×ŒGÃк7”\ªî<*e0¬ŸH¸«èiqØ~-ÆàøIŽ’£#vi„RTEShQ¬¸#¹7(¢ìÊnÅK;­tãr-M”¹*ÕÙ¶\…, >QG— 'x@â% ‘!.áéâLã§´m®Çú9ݘ£Öc³Då1]ì—wÉ2úVú¦©t꘨±Øn‘jãfß.n¹grEWB3†+ F•&UÀBFE @„ q®ÔRÍüÔt4è=‹Ã©¹ æÜv†‘öH€PšÞÚrøœlv†åB1Lª%kÚ;A*Å®5 ÌŸ³4Ü—´XÎ0ñ4ÜòMQM Ç #ѧ½WÒGfV¬–+R̹ƒv+JZàº8".EpUÛ…tN$‹¹Ý‘T\&õ§D[âY5 ªuÆåx Bá¹qzi7Èâœvã’'Šlhz"tU\tÂ$Õu…ÓWûqÖv=mQ8X¹@~bEˆó0žâtÔD‘–·!"ЉÑzôZßÔºžË§N+wY/²Ô‘†˜Šì‡ L¶4$H”Üj›G)•L¥U5d–Zýºã}}¼E€Ü'f¥ºèøŠ©g)—„¯ÄyHD‰²l„”HI„„„…EQ*:v²ÓuX¤Îpf“²[bºL¶ã˜ãmÇU¶Ìò;D‰·r™Ê.‘±•§¦Áfël—6LÇãÜ›3~IÉ$QQÚ¨.íÊeGªªf«’»!Ñ笢j˜Q·ÊŒqfÝ Æ×»ˆ H*ëã(€Ø #$ÞQS Ö›‹EãTØm\[¹\9Û`¥ÂRfª,*š!ŽÇÔ 6ŽW8Lx‡0÷½hÕ«@ÏÕ k ÅžìL¨œ6FjÆ^R45isÈæ3ADTÝÕº.Í©îö{Éd‹Ö§¹[\ÚŽðqu0»ƒ‘¦ÿå_[éˆÆ‘îú›MA–R\a¶}¬Ù)a÷Zñm]꬘¨av˜8¥±Ub5Wfð¯¥ÜRcÂý!Ó-XÛ ¹ w¯¥Oný <ìG¯TÛ½‘2VÝmï-›š¢Ù.<°QV<Ë„­ÉãñágŠc#•a)»-kÚÓ¶­HLÝ-SïvT‹“ÖažØÉQi•uƒ©mñ(¯BEÂÕŠóu¶YmÎܯ7(vØ,á]“-ñi Êá2D¨‰×ø×&Ö}ŠÝµMÞã2~½–lHöˆÆeÖ¤8‘Â\9¶lY<oTToJ¤¥VMwÙtE»î÷w´ÂæÛÎݧ>Ð<"èàA$4xü,›^àý‰M—uýk£c”QVØY€ÑÅC¸²<ââ’6¡’ñ!( §¿ic8Zöµê­1tu¶j;<çJÄA5·ZÀ’øÐËo¿KŒ"×?¶ö4Äm+¨ìÎÝ"+÷½:V^v¡¼HÁó^'ÓžC®‘LEQ':“YÊ"¢ Æ¥ìíùšÁ­Ub¼E´Îˆ’N[¹˜l£„ö—x €¤$ÜòDQQVÅr¾ä"Põõ‹õò$땲®Ï,—îOa é2£D«"¨®K;‹nG®®Òô=ÓY;¤àj[L‹ÃbcHÜæI$¨émo¤d ×!"'@q²Ê¡t¨7ØýòQµ& “*2e»!&ÕUC•ùíÎ8I=°G|š/[YõyfÊÜ·XH&”ƒm±ï-ò¶ÒõÏ*6 d8èŽ_y\u6›¿é½IŨ-7W Ãte· corPªYTÂm`Ó¦W*=1•I*)J)J)J*6=æ+úžvžÞIP¡F˜áª'ƒæø"ç9EŽy艅*õÇ¥†ëõjjç îÏñ¢} ‰¨¡¦|$‰¸W÷Ч»ÝA½JRJWˆ<áMv:Åx[ÀÆB¨q¸¤¤Šˆ[²;QW"‰ƒ*®äö¥)@¥*᪬ýIN̸ƒ79,«Í´MžÝˆ.Tñ°UE§U•Q³TÎÕÀMR´ì·(w›DKµ¹ÒvÆEæ&ÈÀ“"[IS)תV0®‘¥]®±C PxÉÁ¡-DÜöVÁkwؾÏrçÞiÎà±ÐⲱĢ 𢠶þÕ\‚)ª§k¥JŠ¥¹»pÍØÅÂ$˜LߨµÈ¶3tj\˜½í·k*¼-BŽdrRÜ®)ˆà‹Âˆ[7îÆwG»ÊÍšÝǯ,”¥#À”ÄæâÆÜ€¥Æß4L·£Äª9TMݪ•nY¨q…ì§P=)Ç¡¹eÒào*‹V—1hýŸ>2ÌÀ?Ng-•$þ ¢©’ûôôwbóâI„Æ j“lfèÔ¹1VSN± ÖUx…Èä4¥»‘LGÄ^Bît¨»RÚv“—¨çÙæ5i±j°EñzÏzt›Šñ9DZì£n¦öö"(*aÒꋊ¦jžÉµÕý@‘½‚Ë÷»m»“î÷É.;í³ñãÂ2ÒºÚ¢¡F‹šít¤blœÅ9>§ìzÙ3ô«Øö»4^ýdm›>ä!î—4ï;¥®všïô©—sî뛑À9vùsí¶yQ\çÝ\$")pdÃj9d|b†ôb&ËÁ–Ézÿ½ÕiBœZvA¬®–&l¶©zyˆ°Râ¶£$m·“ÒÞu†q]1ic&TµÁòû&’±REºD ]õûµéùWhû¹Ò,ÁÂXEU‘ÔPP›%EU¯[¥'1DbmÎû)ÑS´Åþñr‘fÓ¶XÓ­ðb·ÌóŽ6†ÁÉSp·¶K˜W¢*å*«â*Þ¨ì»P^t±³!õv3]…)ÆQ©‚(-5!IÈòA ­Ãô{“•|B¨¨½¢”œ‘‡.ÖÖ ¨veg‡sèÕ‰è„üÝ“qK³c!†2¸Jޏ§”dÑx@ÈE„%; ƒv¶h6"\m [93%²ÎóG%Ôl…6•2»¼D„"£â¾Òƒ•1Ù—o—>Ûg‘!uÎ}ÕÂB"—AÌ6£–GÆ(oF"l¼l—¯ûÚö®Ë¯P’é©–øŒHVZ·¿Ãå¶´ÕÆã!µiQ™L¶#¨¨h¨@›O®Ò“˜¡ÃûGì³Yj+®×mwNEöu±Æc?áG˜¤J²Çc<ê#˜h‹a¶bHK½ÅÂ×´îÉ.“u]òr°Çs¸GéŽyO€\£I?¦HÀëB­²iÄ®:(J*^ÕJ·›=9jvO $ÉÒí6ë4'ÃQÀ¸YɱPî0ÛX‹%–ð?D®+r²!á.TܽW¤v{W]m³ ; â8,Ü$4w4 +°”ù µ"ê-¼öÕE.·ªTfGfºÂofk§oòàê€Ý‚[+*è| R^hÏ îq Îm[\ ýªÝ;?Ó—=ÒD»ˆDh†Íl´ˆÄhZ`Ö0ºDã`=mJA†ß»«•(¥(¥(+·Í6æ¬ìñ, ¬m+û2^GL„I–.¢û£‘E]Ê ’'óTêžô„NÈ`Û>e¢Ùd‚øj[}ÆÌm‡p„ÒÃYL·ÃJâ·/"åMËÕvÜbÞfÄ)°E…uÇEˆfH¦jjЍâ"õ%ýÞêõï‡ã­~AÏZ‚“£»5½ÙÇH§íf6;eº¸mºê³5Öã)$ª(œ®8²+”¢ñ«5&;֎ξͻþK[Ä™›$¶à·2IKŒð¾jÔ û›{"÷yUݵIDÍk±÷CñÖ¿ ç­Nñ¨~:×äõ©ŠæMíÊãv%5í/yq‰¦ìzhmöW#25oš/Ïtm–Ä{ÓJÛbJBá p½G踚_XÞçY¢Ag¸A„2(ªÊhä«Ïã F0›ò¤\k»ÜŠ»½ãPüu¯È9ëS¼j޵ù=j¶”åúƒ±{ËÏ“¡nQôó£!¶ƒW #Ãcì3'0D‡Ê1—‰>[„ËY"Řô É{w tÔ (CDò_xdË4îÊÒ#BQ£x•3²B‰ Cqª¥«¼j޵ù=jwCñÖ¿ ç­R1 9›X©UÞñ¨~:×äõ©Þ5ÇZüƒžµŠ•]ï‡ã­~AÏZãPüu¯È9ëPX©UÞñ¨~:×äõ©Þ5ÇZüƒžµŠ•]ï‡ã­~AÏZãPüu¯È9ëPX©UÞñ¨~:×äõ©Þ5ÇZüƒžµŠ¢5÷(ÿYüÃu©Þ5ÇZüƒžµyK ¼ÖÁ‰³`“ën’3À•@ÐÑUÅDê)û½Ô”¥(4¥;vÉ#B„ã]6“’È zuÊ#kŽ¿Î¼¹¯¿.¶ùóôjJ”¼×ß—[|ùú4æ¾üºÛçÏÑ©*PFó_~]móçèÓšûòëoŸ?F¤©AÍ}ùu·ÏŸ£NkïË­¾|ý’¥o5÷åÖß>~9¯¿.¶ùóôjJ”¼×ß—[|ùú4æ¾üºÛçÏÑ©*PFó_~]móçèÓšûòëoŸ?F¤©AÍ}ùu·ÏŸ£NkïË­¾|ý’¥o5÷åÖß>~9¯¿.¶ùóôjJ”¼×ß—[|ùú4æ¾üºÛçÏÑ©*PFó_~]móçèÓšûòëoŸ?F¤©AÍ}ùu·ÏŸ£NkïË­¾|ý’¥o5÷åÖß>~9¯¿.¶ùóôjJ”¼×ß—[|ùú4æ¾üºÛçÏÑ©*PFó_~]móçèÓšûòëoŸ?F¤«NMÊ+‚çqÑ"#¸êŠ/»vÁ\g ŒûñAãÍ}ùu·ÏŸ£NkïË­¾|ýÏÚѾå÷lÉOkFø{—ݲ?%×ß—[|ùú4æ¾üºÛçÏѬý­áî_vÈü”ö´o‡¹}Û#òPaÍ}ùu·ÏŸ£NkïË­¾|ýÏÚѾå÷lÉOkFø{—ݲ?%×ß—[|ùú4æ¾üºÛçÏѬý­áî_vÈü”ö´o‡¹}Û#òPaÍ}ùu·ÏŸ£NkïË­¾|ýÈïÀÜn{`)’3€øˆ§ïUU "5­ñ!!BBL¢¢ôT Žæ¾üºÛçÏѧ5÷åÖß>~I"ej¡xíÇo¹?ofߨ.®Æ-®Í*cm¶2ÙžÒÚ«œ®0Hª¼×ß—[|ùú4æ¾üºÛçÏѪ·ëB×öW]ÿ….…?Z¿²ºïü)pô(-<×ß—[|ùú4æ¾üºÛçÏѪ·ëB×öW]ÿ….…?Z¿²ºïü)pô(-<×ß—[|ùú4æ¾üºÛçÏѪ·ëB×öW]ÿ….…?Z¿²ºïü)pô(-<×ß—[|ùú4æ¾üºÛçÏѪ·ëB×öW]ÿ….…?Z¿²ºïü)pô(-<×ß—[|ùú4æ¾üºÛçÏѪÜ^ÓlNIi©vQlm×´“q°ÌŠÀ™*¡:ëB¤J‚ˆª™%DLª¢UÙ…w ¦QS÷¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥µ¬¶^?­òìÖÍkX?l¼Z?åÙ –¨ Ö³Ó]ImÓ—Kî—%DŒÁ .T•P7’&Ö÷’†õäŠ#¹QR§ëóGú\ÏÓß­}Þéܯ¶áVîtZHÍ#Œ!;ïI îÇLý›„¨*ãjYÕ«ãïøÝ×êGOÏ?¯>Ÿ ej[ ]QKȺÅnó1‚‘Ò8œ¯üW¨‹Ô‘·Q³Q–¯Ï¿èá¤ÛÔww»N¾^åsbt†˜i]úVämVœ~F1ã&Ë ¶ˆ€ *&®«ÚeÚám‰f‰o¸7j[µÕ¸ܱ4† Û§¹ü;ˆ›‡r*ntz/¹ZfâÓ¯ÒŽ–¹ÑußùŽëm*y¿ÈÑZUó‘}MQrïà Kœp Y$…ÂS@GMŒçn2ˆ™*«Cí¢áp°Ü¯výC³ÚësWî&Á¶"kƒ`Ln"E„d(hÞP°[0ºŒ¸öv*W7ºö™2ßcÔ:´ëNØí3·4mÍ7&?(% l,pd¶6¦ª»Èö¢*6»’µt^²»ê~ÐìöÓs±‚Z®àô7†ClÈ6ݶ(<ûL™Š#Æ(Dت*¸‰Óª£$áÓ]%Ü"ŸÅ*L³V¿èÙÿÁ*aÏíþ)PúcýšµÿFÏþ A ÙŸü…ÿj挃r­˜Ix¦êmL6ˆÉ»Ò*ˆ¼*H‹„_¢4Á(‘‚ƒÝ=ÏìþBÿµsnÃÛlµ1Ïò5!ñscvÛÆ7låMØÝÜGØÞÞí®…ù7nc‹d‹ÊñlÛ¾ñ,󳇷8»¿go9ÎíÎç<Îï1¦íÌql‘y^-›wÞ%žvpãvçwìíç9ݹÜç™Ýó5¥|ºÛì–§î—I)+›ÍEIUUPDDQˆÈ•DQH‰QUƒM7nc‹d‹ÊñlÛ¾ñ,󳇷8»¿go9ÎíÎç<Îïã¬kÉëmv¶é‚rß&;Rá,½m=V0É6¯2b†¨Ã{‡y¢©;•4uÅsËTk]/QF¾iû„Kh²®6–™­«ÑÕ’Nœ¼d›ÞÜ‚JB[Cj) ¸oRc¿.Ûl³éF#¤û¹Df8±>‘Ù& gµp JDXʯDU®:º—ûX^£4„;-ïMY¯ö÷oÁt8Ó#„›¼¢4æâr’*á–÷eU UÜ©r»¾E7nc‹d‹ÊñlÛ¾ñ,󳇷8»¿go9ÎíÎç<Îï§Ènõ£û:Ð:E»«én”+$Ë› . }‘MT›äª¦l‹b¦*™t|*½*½{ך¶Ã ¦a¸î§v¬~ÒN6ËbåÆ8Ú•ãFÇM»„.!B^îH"ªª Ú7ç¶üsÏÓ¨±¦íÌql‘y^-›wÞ%žvpãvçwìíç9ݹÜç™Ýæ4ݹŽ-’o+ųnûijÎÎnÜâîý¼ç;·;œó;¿ û’ôÄIîj¯ýìyÆk-l’]­ˆû=È„¤].\nÃM&휩»±»ˆñ»Ûݵۭ‹ûŽý¨7iJP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP+ZÃÒ]ãúÑÿ.ÍlÖÄšÔ§Þ-††A!ºÛì+‰½(¨b©”EEÏ»¦:ä&yøÕ ×Ù>‰…«nÚØ'qvåνÒr‹ñ£s©,•l ?ùUÃݹKd#´…lœW¯Ž¶ù=jq^¾:Ûä\õ©MF©Óu=Õ~Æ;6o³vnì·¨¦ÝšœójÐ<; lT@‰2¨oª!º›PѶÓ`íëaÖÚtµD‚Z‚álˆ¢C!ˆÑ¡¼Ü¤\a,:Š‰Ž˜Ç½sž˜÷â½|u·È¹ëSŠõñÖß"ç­R¢¨Õ¯V½_-S”›ìçOÚ¬éû‚µ¨,î¸Ý¾áj·„f 3’ãÇhr¹L©!}TÆ:æ~>ÓQ¡J…Áif,¶<–[†Ø¶óJN¶b‰‚'%é— Þ\áÅzøëo‘sÖ§ëã­¾EÏZ«,MisºLºžž³•Âs \¥„Ú»!•Æ[pñ“Ú>UN‰ü+åƒLim?·Ø:rÍiÛÉ·¹AmŒrläúˆŸ[‰¬ÿ0ÏÕL|â½|u·È¹ëSŠõñÖß"ç­R„©ª+╦?Ù«_ôlÿà•ô™½*{Fe1¸!áþi—U3ÿTþK[pã·#1YEFÙl[UÊá ÿj£ÑÏìþBÿµsnÃ^@¶Z˜Wöï‘©‹›¶Þ1»g*nÆìnâAþ5ã5˜“¡¿ lvdÅÙ4ó/8˜!!^ŠŠŠ¨¨½+”?¢õÛü¼ìöXï6þ]úUÒß¿›~s/®îó#9÷󻟮Y?¢õÛü¼ìöXï6þ]úUÒß¿›~s/®îó#9÷󻟮YKŸdÚº§fÓ¥¯PcégÇF\öÊLˆ‰„Œƒ¼UÔܨ jYABCU!róÙ7f¶í Þî2§­ëPÍÈɹ¸Ï£YÊ4Ðn.0芩¹T‰Up€#þ‹×oòó³Ùc¼ÛùwéWK~þmù̾»»ÌŒçßÎî~¹dþ‹×oòó³Ùc¼ÛùwéWK~þmù̾»»ÌŒçßÎî~¹g1¦"n¢½u¦¿Jíãový>Ý D†Dv"Ã}¹H»UÁ’記éŒ{×9é£âiȬÄ+¤‹´x†Ž[Ú• !¶¸$L¤hí © †*½z*¢c%šSú/]¿ËÎÏeŽóoåߥ]-ûù·ç2úîï23Ÿ;¹úå“ú/]¿ËÎÏeŽóoåߥ]-ûù·ç2úîï23Ÿ;¹úå+ª[áÛíÀè[áÆˆ4¸ØCXzÖÆc_Š¥º§çVÜt,%õä†FE ï$eÇ#&hu­š¹ç:ÕMš¹ç:Õ\Cr«0¥¿ ÇŸi·±6E‚4ÙÎÜž§å¨dìd­é,%¥$§2R#Xî8qдcûõ‚öÝbvÉw”ÝÏ:Õ¥ÝTÈêjDçÛyÝ+ÉM-Ä%­!)̸œ–N`jb‡~Ù«žs¡=TÙ«žs¡=UÉñ+m9z“ ^pâìÈE¸.öþ§¢ÂTƒ;h·ŠH)«-©-Þé_@¹òWˆfbœÕær¡-åM\4),­ Ëy”-!Dž)m'‰ï“ÞïT]š¹ç:ÕMš¹ç:ÕY+šãÌEzÂX‚d(eéŽâfÝ„9©mǸ,©³âµ ¡ü‡ÐÔ…wÍFÙ«žs¡=TÙ«žs¡=UÂñ&=¼à'gY-°¡-¸·1 ûÜý‘/)»l¥R\~Lt­÷6ÊHYp,€¬¸ILå[EÎ[¶;záCµÄ¾Ü•eô³æÛ u (qaÍéaiÍ*n9f ªšµF“.ųW<çBz©³W<çBz«G ɸMé—v™fâü&]–Û „!Õ „‚I(œ³$ÿ‰©*Ö¨3R‘11pdzW<çBz©³W<çBz«‘b»©¶rÀÊ_ÄnL\‹„&#ÚX»¿LT/f•ĵ)’J–·‘JJÀP(«¢r£¥ÈÆ8VÖÌ D†¢ÜÙŠë)œ”°Ã«Kì¥2ÃëS¾ãK Ö•êXA SèMš¹ç:ÕMš¹ç:Õ\ ÷/ LÅ“fcŒ‰-ŽàåKƒ6õî—RÒn%ÖÙI–´¨¤¶¶Zõ#JHFFÍ/” g/fWÓq„ýÚõl‰n‹ÔÊZ¡&rÚ;Bµ$•ˆZ B;ëÔ÷D¼YsN¯³W<çBz©³W<çBz«…Nå~üÄ[’¢âLpn+vå¦à×ȲLóhÒRü¤%ÇS» mPr+'ˆÐ;>ž»®´Ý^µÌ„Ì…+wS• (š”¢ßñJ”Gx“–uQ½³W<çBz©³W<çBz«%qL{}ÇQlœ°®ÌÌ7`ÀÛl¦½{z<˜9Yâ¸v ¥…Žä¨¸2q­Jü_Æ!ÙöjçœèOU6jçœèOUrŒMÊmú×Êû8Eës2$d²#²äÄ<­ÖTä”,è+)CêR urNHùF»Æ°al>Ü»›ŠÕŽÚͬ²îÿ)—àB[¡ZôäÖÝkWpF„dJNEHÉ8}³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²RƒÍ\ó ê¦Í\ó ꬔ Ç³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²RƒÍ\ó ê¦Í\ó ꬔ Ç³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²RƒÍ\ó ê¦Í\ó ꬔ Ç³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²RƒÍ\ó ê¦Í\ó ꬔ Ç³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²RƒÍ\ó ê¦Í\ó ꬔ Ç³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²RƒÍ\ó ê¦Í\ó ꬔ Ç³W<çBz©³W<çBz«%(1ìÕÏ9ОªlÕÏ9ОªÉJ {5sÎt'ª›5sÎt'ª²Rƒ ¡hmK,”‚r uVjÇ#ú;ŸýÿjÉAˆ(!Ç5qVc$“ôAâ3h¾ÍD¹²q .!°ØLÔøMä 9”0êOÝžY ò-åN¸;2S0aEqœ ©OJSd¨¡+àjá’ÇÓá¬l\ç*æ»k°c"JYKýÌ•)E=ýç˜<2ÿÖƒv ‡ ˆŒ™Jm†ÒÚòœuÂ2K^jYáÅJ$“Ä’k6Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjꪴ`‡5‰lÍŪq‡âö&º:Ù)9€¤-ò•ŽR A"¬{K’Åö•}Êm.>KÚU÷(0ÞaÄ»[]·Ê\öÙw-J‰!ø®Œ”ÒãE+OÇ"3ƒÀ‘^l6ëeŠÒŪÕqâ0„dµÔ¢¥(©Y•(¨’TI$’I$ÖÆÒãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjꪴì`™5ùoMÅ©q÷âÒÎ&º4Ø*9”!ð”<¬{K’Åö•}Êm.>KÚU÷(PÌ8LDdÊSl6–Ч”ã®‘*ZóRÏ*Q$ž$“Y¶©ð9êÕÕXv—%‹í*û”Ú\|–/´«îPfÚ§Àç«WUU à{9¬Kfn-SŒ8——±5ÑÖÉIÌ!o”¬pâ•àAcÚ\|–/´«îSiqòX¾Ò¯¹A›jŸž­]TÚ§Àç«WUaÚ\|–/´«îSiqòX¾Ò¯¹A†på“®S¶Æg©ùeĉ’äKyÀŒô¤¸ò–½)Ô¬“žCQÈq53µOÏV®ªÃ´¸ù,_iWܦÒãä±}¥_rƒ6Õ>=Zºª­;Ø&M~[Óqj\}Å8´³‰®6 Žd%|%¤«Òãä±}¥_r›K’Åö•}Ê32”Û ¥´)å8ë„$d –¼Ô³ÃŠ”I'‰$Ö+|| wQ#¸Û×)"Tµd³´t4Û!Y¸i±Èw9÷É'.Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê ÛTøõjê¦Õ>=Zº«Òãä±}¥_r›K’Åö•}Ê 8ÒÒ”¯2’pz«5i?&s 8û‘cèm%jÓ “œ»ŠÝ ‡ˆú£Ê¼:–÷áí‚@ÈG28ưDu·ñ²Ÿeam¹iihPï(VA¯Õ'5Þ>Mååqhü“š reƒ¨œÇr;ägÞ¬6¥kň^Õ·uYY:Û!_(®)@?EŒEŒZµÝÜ´A±Ý/“™aÈj ã£`…•õ)÷[Njм€$÷$œ†YúÂÂ>!Ÿ:Øí¦ãg¹BKn;qaK-¯=.%L¸â IJ‡ãf N`pÏ™âñ|¡bK=Š;OΓz)A}Õ¶Ëmµk‚éS‹BP€V ’5-#¾ªÐŸ†±üéÂsñðëRƒ;ô=úóêóNu; )\Ïnå ßí÷.Ø!ÆZÌÖ%c;¬ÄÈh¶±§Kì)(!e Ô}ÆYä£]«ÞšÄX^Û}e‡n|dHKN~2†yñ×F¸×°•¯”.œ°ò‹r'X/ÈÇ~t;zíq— §B!ðâ”RKäâ4)+IAã—ÕºÓ-)לCm¤f¥­@?Äšùc–<ÉÚ3ø âé÷D\®%§m;’¦·)å—‘ 6Ù¹²SË”´V4瞤}Éö"o`»N"iµ6›„F¤(dS­!Y'Ãá5=_7‰¯ö{•ê6Ç¥Üíq.ÇKZÚK0ÛA,­E„-+@ Xm:‹îd’¥ù$Å Æ×|yÖ”ëZ%[[h ”:V€ J€Ìw…"lnã묛>nDC¥éÆY¶$Ëf9XÌ©!Ò¡˜#03UC×%;ÎR±†¦–P~VÀž åÞTpGù ZyZþËÀÿöŽÇÿõXµ q—¢é-‘Ñ¥õ;þœ»£Ã-ù9–”ÿïU ‘4÷ùKÆ>¿| ŸÁ÷{ƒ8ÒV—u™xi6xwFfLÃÇnä””Ýl€NDï'…Gµ;ÿÅ?þeÿý ÉfãË”¥j׫ÚŽ­Z³ùyüsÔ¬ÿÏR¿Ì÷è:%)\{—»£pq–6}î=½ÛuÉǶܤD+u.ÂR‹. « ·55j1rš§Ý‹•ýìecc %纹¹¬m“O¥jy:¾ñp¢ƒ‘)ŒÂW¦Å_29qÁ70:Ýõ÷¥¡”®L«„™/£b¥-¢Û޼¥6P¥©I(#%ûõÕ9 Æ· [g˜Ôö^-ï˜ìÝviB'¤wÕ¤wœIW¤h*IÓmóñù´ëš‡=X×5JWåZï )³Ù»Ì¿ˆ­Ù­ÊŒÌ ÄÈ¡n=<8¢–l)D4ØÌçÁ"·«Ti‹—MZ£L\ºUŸY®x¾õ…qÖ®–——yCÉS-:VÑï,$>ØV\RTœÀ AT~(å ƒ³`zËw”V¨ zd}†Â9›%qØÖê\9­µg¡ Èq®0ý%Þ¡LDÓqjà©NÈ’Ì’Ú_qj?&ÚR¢RP H uUåb{ü·{c°åÜ$a4²â¥™hnñ,‰ ‚J’ÚÇ…qïäV+W=>m:¶sÓå[>¢ªÿ(¸¬ƒæb"*aeL´ÓÀØ[¯:†[ Yà„kq:•‘É9FFÁZ—›t;Åžm¦âÑzØîFØZVÚÒR¡©$˜'ˆ ¢»:¢ð.&oÚŸ}P܃:•C¸EY* ¾”¥D%yâ V…%` Ò¡˜Jµ%3õóôdâŽKyP,ËÄ^-åˆî—ÛerZ`’Ó²RJV ­I-Ò•)!”Ù96åFí.UÒÑŒ›´9tŒÀz–¤­†',-,»¥H^‚âq–‚‹‰ [Á%M¯,i×xÚÕ‡]¥iÚzDE¸û›E / ÑÈýÊ]ZR4¬’r c¹^ZÒTnVÙqÜ91Ï Yî²±†„ýÆÛr£:ê¶;fPîFà’r Ë<†}ü…HŒG‹{`ßÿ†Ýÿýjòg;cÉnEˆ„a»i-­‰ø#Yæv£üû«±9F¹C½¶ýÆúã¶ ñ·˜óš‚¹ ¤‡å¡IJÚ9c%ìÖTrÛ/V„|äÏ^¯XÃØn·=É»\X/µ&ßqsSæ@RT•>öyRA~1áÞ®ƒ\¯’‹”k¿*˜Âá îÅÚ3Ök:šÇâ•Î é_çßú{ÕÕ(5,²\›g…1Д¸üvÝPHà ’ Ëü8ÖÝFáoìÅ«ô&Ð*;”kž(´áY0n8‚ö²Re´ŸÊ¸\Z3BrüTJ9䤇Å_ñrˆo8jÛ‚š‘qeéÑmî¦à]NÒ;êkhû[4”6R‡’V¬ôiÌfVž‰Èß)mã6_²Þá‹>/·6p·(‡À fISJ$}$  ¡kåKþWá;+8žýtzMÛÛ“~Ÿ9ûd—¦Z_nnÌ-¶sshtpÙ‘Ädk-Ø‚â«bq£˜r=…Ë6 Ÿl´_m÷]¤ÆŠ©ËP,)„¡l¯d´”)yr9…(T†µ|b)õ*¹ÉÍÏ]°¬yË œ?{A-ÉŒ™ <ÚÈËå[-­y!Yþ*ޤœÇtR²rŽg'“ÌHmz÷ñi”bèüm®ÅZ2ÿòªÊ¬[ˆñ<ÇÛÀöè]ŽeÅ5ÙIéZÛ}I9“H)*@ eI.Ž5†N2ÄØN|vñíªµHu,‹½¸)-ÇZŽIÛ4¥(¥5…¨ ø€8ÕW J·µKV™÷W¬ªäñoAjÚ¤íYJœB”! œÎ¬¸äø®u¼cٿϺȱÿËÒã¬^« RЗ6€ò„6 ÉÌ•gÇ »R«üš瓌2nš÷þÄDÞµþ6×byÿެêÁAJ‰'ß±&&h¾aëdE͸ 7&ÂüÇWœ8Ò Ô´Jl/žòGHö ”Í!]ºáÏŽ’ûú âË•þÙ 9`º±eS¸¹-Ⱥ>Êj6»Ö…¥-":YAÒÚÖ®ç-iÉ`ÄøÕÞWdXo2mrÙ¸©0mä?ÐRÜrÊæ;k.¸­éjB‚´¤µø¹æ ‘¸cÛŽ Çv¬3.Ö‹Šo/¢$Gmö·á­—–@oRVó¡Ä-GF¤¨( ÒRJ‘Ók˜ò¿!OYì YQ=¶YŽDp‡³ÞîEtê H\~Tö–@i$›_ñÍgÝZ8âá.Õ„®W m2˜`©¥8I ú ŒÿË:Ïhþ°¼þšŸöìÔw)ŸØ+ÇèçÿqAE7îRчíWÇ®8bþ–5Æßévntø±V¹IZRóÉARv À'ˆÌŸøÖ> ¸ÉéMŒänÇ¡­²]IF½¢ÎYåžD¨9Î+‹‰0þ>Ä·Kv¹ÞܺÉmè²b9(eƒ+N6­«¨V¥9 9$Œ’Žè’@ŠrýÊ1ü^MïÿúÉ…ñëºöFÝåñ=rzéÙw—DõÉë®:üuMÈùéÛw(øÂB,Sp­ÊÉZ‚%L~LrgûúCn©ZˆÌ ξˆ¶Äb!Fm-²Ãa¶Ð‘Á €¯‘·ytO\žºýì•»ËâúäõÖôhP9×üLB¹Íäî8‡ Û„nñºÁe€ó’c%y€²wZRîÅŧHÔ†ÖœÆuòµ¶Ä9EÄÖt`ر..ÇmÑ2sö½„B„¥­Œ]HN¤¨$6€¤-+m:´ÀWݪ¸[T U:!¾ ©ë­hʰÇuN°ì֣𔗙÷Ö¨|ÉxÁ<®Üd],Ø ¦sZ߸4B•ø…-m›ýÁ+Ȩeò|u ?AòM†;QÀ¶Û"ÛŽ‡˜e!âÃ)i s.éa àJÍY X»#nòø¾¹=tì•»ËâúäõÒ"„)°äÌÂínÍ-ÕEºÛg8„$©E¨ó˜}Í qR´6¬€âN@wê'a—&<è¼bF‚ÜR‚¿ œòîH?ÀàºodmÞ_×'®±V‚s2`úÄÕåë Žýûÿv1Þ­Ì=¬CÊ´ìCnjz­‰°A·&D¸OÅS¯2쥬„>™dò8œóÌñ$½oV)ƒë^‘:ÖÄ™ ?äêzè7j§Ê'˜g* ˜‚4—‚—Æ&½IK…`ì–@–Ðxçø£*±vJÝåñ}rzéÙ+w—ÅõÉë à>AWÿ2[K“!àåÛØT¢»ƒ¯<ûáǵ´‚µ©M¤£e©`Žñ%Hïv+T5±‹}¾3Qã°Ú[m¶”$ ‚@d¬’·y|_\žºvJÝåñ}rzêF˜’"#fÕS±§&X/^wÄÙR&¦:#m¹ÉŒ hRÔRÓ‰"âø‘ŸtjÏÙ+w—ÅõÉë§d­Þ_×'®®êâw˜Ã”‹Û·&VŒS.[-®ËrJ¦Ý{U8¥(2w÷g0@@ÉÍ®V°v-»òÉdºÙðû³-)vƧæ&KDq{ï;© XYÉ$)9ñþÙ{%nòø¾¹=tì•»ËâúäõÖ}ȓ݆Õ+W²Vï/‹ë“×NÉ[¼¾/®O]i\g• =âѧßn²%/ÝÃk™p†ÓŠ“mm†@1”¤æYެœwn2+xÚÖ‡;Åó®8üE¶òkòâmê À—b;& <†5Ç”…%¦maµÇqÄf2Ñ’ˆ.}UÙ+w—ÅõÉë§d­Þ_×'®¸êðÆ­~ýµª*>H,8–Å`u¬T‹ ȱcm(…¡9†””ì[ZJZÙ1’ŠÆˆÍs*ÎíZ½’·y|_\žºvJÝåñ}rzë³.?,«×ü2[,0opY‘?ÆŠÓ.æRà¡9ð|Sßï®Ïåj•ê…Äš¥:‡!Lx6à+Úð#>“%Àá’Á€ u/ù}ÉäFû*/ݬù=äò V¹7\}¢ÜDk~'†ŠÖV ÛM>”6 ”£¥ ŸYÕ§ÞkNªPá5§ÑsÄd¥Hru²횆Jm/κ:”«ÿ0 øcŽYžÿU|‡° „aákm’ÐÚ›m·U!.<AqŒážédž$çÄÔ÷d­Þ_×'®´Ë_ f-_¡3þZxïEÁöÞîzG'ÜCñÙK9ðIRŸu´÷JÒÄ÷KNy Ȕ앻ËâúäõÖR,²Ð”J~ÞúP ´‡…¡Þ#?§üh> ĸš+˜fíaK eÉP!7"å ·ØB&Ny¤8ØR4¢ZQ—rPS–C·”Bb2ì–6àÉ(*š­zÓ´A iQ+ PÉY}w&’ê‘Æóˆà•8ÛJ)ÿ"{Õ²…ذ´*Ø•$æ(Æ31˦¿.­zté´íüÛGb¦1–fûÓu·Ã¨æ{HmO ¤+ZBT¬ÑÄ€®ò²Í:’R£`P IJ€ Œˆ?MkvJÝåñ}rzéÙ+w—ÅõÉë­¹¹ŒŒ‹ð¼Ç×ÉýÒö—ÝS½‡¹6ˆËQ*VÅÔ ž: T'NC…VyBäï•Y…® º^íð]ŠÖó ×nôI}²”ºãÁ!i:rÒR”æA:€Ê»§d­Þ_×'®’·y|_\žºMÿü®ÍÆs¥áLW ¸xšeà¦ZY”ÊT¥d®-¸•÷+B² ž÷Øê L)ë.í ›D{„ÝL¦ÃaׂFI W|ä >ð©É[¼¾/®O]å>ï Ûaå-ÝÅDzܱ"âÝ$¶„)Æ£ WÖB®ÒÃeG ãÈ9+‚U …±ÄK§,—9–XӚśœƒm Þj<`Ú³mn ‹­-%9‘Ý0î\8'©ßð'×Û¬ëÁÙ{Äõ¥ÉB>!—·T–ÐØQm§’Œô6„ç—#:<“rVT•È$d“ÛLüÀáÀ~þ¢ å'$Û0úÿ½6bróìx®Ã\âÛÉ&.‘.L´ó²!¾‰ oWùr‡sJ´8ò’H ˜9|U÷²Vï/‹ë“×HŠöë Ïé©ÿnÍcÆ6·ïX^ãj!ß’ÂÛ«F´¡_A)f3ú3¹Ù+w—ÅõÉë§d­Þ_×'®¨âÑï×:εã Zl1í• WRZÝžy1 y'ºï(‚@?Ey½c< 2*c»‹¬z…_ ûHã¡Id®ñ #.?úWf•&Ï)­”™0^o¿¥n$ýëOt¼ի¥&,ržM.–KŸ*Ö¦ì6.1áXÞi×sXB”à ljãô×q¨¨}¯Ãp¹væVFD¡h¶û%nòø¾¹=uEC•5>ÖéHƒ&[)C͸l,§XH¤çŸ C¼sŽë=›œúmÔÊIK¸~æòTIPvž`ŒÏt¬ÎK^ž¥~>¿Â»s“­n'JæÃPðS×X‹öSß‘Ö'¯üOM4äÃy—ŒÜšm’¡ÇD$26è *PR”rÈŸý'‰'3¨¸ÿ\­åÚ[9¢\4Ÿðu=u“²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×AµJÕì•»ËâúäõÓ²Vï/‹ë“×@¼TÌÿ°¿ôšÚ¨Ûœè.Ûe6ÜÈëZÙZR”º $ƒ:’ ÓuµÀp7:å*Ô3 yô ‘þDÖ¿lx{ÏÖ¿ko®£B/—Ò½í(+ï";$ ü©GÿSá¯&ñ [Ù¸öR>äþÏc#x76„ô«<Ž¢¤„åß*wè%{cÃÞ~µû[}tíyú×ímõÔRnñûàìµÅ#d2‚˜V§JRÚ W’’²¥%:H Ô@Ë>µµwœ_¤h6ûcÃÞ~µû[}tíyú×ímõÔUÖï×gË[-.C1’¬”¬ÜyÔ´Úr÷Ö´ŒûÃ<ÎC3[[WyÅúFƒo¶<=çë_µ·×NØð÷Ÿ­~Öß]jm]çém]çé ¾Øð÷Ÿ­~Öß];cÃÞ~µû[}u ÿ}Š î™`Om‡c8Ó.(­iÙ«H’;°I i•d"Cjï8¿HÐmI‡€Ï³¶ÃþRO@<(î[ÖˆQf´Èµ6ÂJãGQ‚·ÉУ¥.G ))Nd×Vìý¿›¹}›#îS³öþnåöl¹Se´~* ^íÙù4õ3_=ã\QbTÎPp“³¬)võq òo°f„(ÑÊÖ…=¶K8ÊÎÞy¤qñݱ<Íúd9Z’­‹n¡iz ¤~1AdÒ¼CÓQ»YþJ=žgîõQÎï±ÅÇ”¨—ËUÖ\¬1!øoCvÜâ\e1rFÔ,!A}ÙÖyA*'0ÌÅ—”"°Ä™³ ‰°bÀqîá\u÷ßî†j–ÈWt£·àCƒ;öÖ’g™û½6³ü”{<ÏÝé'.a&ÉÊ ða‹æoÂS »É~ê^n䀗uîiL¶ËYB´ƒéÈf¬²¯Ûu›&ã„Ý•Û,àNf"4vÐ%8¬Öž¥­Äµ¤d±!+JPB”æ];k?ÉG³ÌýÞ›YþJ=žgîôŒ,ͤm¤_/ ‘ûF*ÏTkt¹(¹µsa¶%6–e%”ÊZ©H9…¥‚[<¿õÿ ˜ìôï5W/÷j"ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ¯vzwšÇ«—ûµ;=;ÍcÕËýÚ‚ÃJ†‡t¸ËáÁFÁ!n‡¤<ÑJNy+%°]ÉãÞàk /s–„­»{ B†iRL’ð‚#ñôªû—ém!Å» *6m-â…<ò´ f­!l¤(ôgV ô/í”ÿQû8Uaªô/í”ÿQû8U`*†tX­Dáëš~ÉïÙª£»c²á| h¸ß§¢ U±„¸´©Y­H ’ Ë$÷€’$oâž6 ŸèO~ÍUOºàÉø¾ß¶YâYÊtEm‡]}çš «Z_eÄŠÒŽÕc€Ô›à]±Mæ.Ã\C5·œ‹k„ôÇÐÈÅ!¤¨$9$å™?¤Rïy‹k¸Y¡Hmå9wš¨qÊ!+LwŸ%Y‘ÒÂÇ Îe<2ÌŽG¹/Åxƒ*Þ×/s•‡WfjUÊCÉ0ÝIt&cY6¬Üu oh;œŠiàpc^Hï÷©WCŒ5¶”ýÕÑwzC¢cè— [ °âCd2© ¤d¥w̜¯88wZWå?’9·‹¤pÂâE¶Å…»µ2‰ºº][Š’ËŠ‡$¡Õ•ñZkÍ •xc¹rWt“zÅóh°ª5é.¥w¼¾¥JiÐU#r.4Þ”XQÙ:QÁ æWhuGRR<"©sÚpÖ²=u\ÏÃ$¹3q ¿-×]Íç4¥¶Pµžáµ¨œ²&¤95±ËÃx.ÙežÝµ¹”æ¤[ÙCL$)Õ) % ¶’rPÔ Ú•©ZFyUFvºâNO°‰´¶Ë®[.®Íu¥Ýä[Kˆ-Kg$ÈŽ…8‚òO‘@œ%*Áw·_­-]-R ñ+JT[R…-*J€RT•%I) AW»}Î ùw±Ú=m’"ËN… ›¥¦Þ ÌŒpëg1˜î²ï‚)•‡ïxc a˜°ê±`‘1†_‹éÚ)â§Cò É ¶Ö¸ÿIZ«]ÎFÓo‹‹-8^Ý`³G»6Á‡tc$Îm ¢*W`² ZtÇqJYR³S¤©µfIN.HΪ•í•^ Ú ±2χ/ŒF™)ÕXî—®ƒ­°”:”ÛmH-9“{>YÅjÍ\$&òc~“ˆnRã˵۞’íÉÑŽë¦âò$²òŽât€`º…''ýòJI&¥¬C§Ç¼ÅÎÃÈmá*(ÓYfPúßB9ç˜1ן2)Èž9IWÈõþdkˆ‰ aæŸE¸v2Øþ¸Ò÷c3h—KÑ–€d¶¾-9Ý7ÄÝž©É…’^ÀÖû$õg"6×PÞÄ€§V¤¥+K, (Ò@ ™¨³Ò¼êjT¯:‡†š‡†ƒÕcuGRR<"½jÄáÍĘ §aŒAjüڥݟq´<òØe Çq÷^p­Â†ÛJ–µd•’ É$÷«ešçñmjãŹÝZJÚSj*)PR’A@ ƒT8ÖWÚcƶÛn.³%o%©²‹–Ku:›} ¥´±«ñ‚O¡ýìÄu×b9øwǺ¢Ç‰ž·¦j·Ýæ>¨ÇlàSJ·a Ù¥KN¥)Y¥G:œ/.³Jä0°2 6TO´\¡?t²Ü¦\eIu”¸B °Ú‚ŠÄ-aEcŠò#ûÕŠ7%.[pvµ±`·£i²ºÛ.)¸s¥©–el\Öâ6%)+l÷+#¹ÈUœ$;+‘aîM¯¶¾XÅÒ. ͈äÙRvûÛM=³u ah ޶I J¤é ‘¤&ºÞ¡á§îõJó¨xi¨xh=R¼êjT¯:‡†š‡†ƒÕ+Ρᦡá õJó¨xi¨xh=R¼êjT¯:‡†š‡†ƒÕ+Ρᦡá õJó¨xi¨xh=R¼êjT¯:‡†š‡†ƒÕ+Ρᦡá õJó¨xi¨xh=R¼êjT¯:‡†š‡†ƒÕ+Ρᦡá õJó¨xi¨xh=R¼êjT¯:‡†š‡†ƒÕ+Ρᦡá õJó¨xi¨xh=R¼êjT¯:‡†š‡†ƒÕ+Ρᦡá õ^Vt¤šjòá&‚a$â{ý‡oÿy5ÊÖ8½áFáÇØ6ï‰'¼´­Ñªa¦B»¬ÜBHÚ(y~2†Y%v% :ýõ²r µ4œÿÍR+/70€"”$(|9h9tš +ÅÉŒ'æÜIÐĆ$(Ç›L>ÑÝž+B¸‚#é¾ mª…öd¹Ðž°Ã-µJû‡ ÊŽÁÀ;àd2'ÃôU¾‚$ ƒ÷Éó`&3Šeõ´¤<ò›à¶cÁ W{gÞËé­™è»Àƒ"|öìÑbFmO>û×E!¶‘š–¥rJ@’x*C ÿL½~šŸöíWÏ8“I¿µŠl8”›ìHrnWk[ÖøÐáÓ2Ÿa-…Š_ý$«YVyœó¬ê×"åZ£L\»­ÂÏ›D5E¶4$2¶ŠÄ娤)$g–Äg–}ìÅ~À´âvøÐ“Øêc2†‚Ìå§PH<¶',òïfkŸò‹HÄ‹Á6U?x°³¾ÒÒ…dOy ­K)• ÚA+F’”¥M‘é¸þávµaÕδ-–Ümć\rÙ&ठðÍ£dãªÔR2 ¥’r-:£T\uF¨¶ Çù ³í> 7Cä6Ï´ø5ÍÊî)w=x Ò”Ú-]nHTGÖe¶—¦ !½+üE¸.¨íµèZÐÑ»ór™q‹ˆwËÇcbáw.wvf3Éz(†‰ŠT…¾ImÄÁüÛJBÙ$êëf–ýÇù ³í> 7Cä6Ï´ø5]ä#”Är“IÚÚásJ"± R^q0ÜŽÓ¬©í*P·R¬²M­JOI ¬8„wgç> iXpýþÏgbÖÛVÙ(gVN™kl«5~.ÉYwòïýt­+ÝÎ5žÖõÆ[s]e:“Ò9¨$ii”©jâFy$ä3'  …ÜqÛ>ÐsàÓqÄ>ClûAσ_¼—ãØëÛ14x`o‘šuÈòc<ÞÍki )BœB6Èò +#‘ïåY¾ãÛì,k.ClûAσMÇù ³í> SF7Æ]ŠööMVÌMo³Ü’»L†ŒÆ¦9C!oEZ[›Ý!Àïtœ¸qÖh+Ž!ògÚ|n8‡ÈmŸh9ðkBå”[½ª#¶;E¦lëå­kTdÃq*ŒÀ~Õ .¾Ú$¨Gš•…!m'hÚÑß.‹É­þeúÂð»‚Ýêß)q.l˜;®ÅÝ)q)Ù‡žôœhæ—V¬Áäãˆ|†ÙöƒŸ‚!ÆÙÀùÁσQXÏbk/´ÄŽýŠD[”ö#Gµ&;«žó*Ròva-¥ ¥,‚Ú XRÀ¨ÞG¹@¸cY­É›:߉РøV‘g”Ô„²T.oN¬4ø ZBÃMä•, \;¤dMXpýþÏgbÖÛVÙ(gVN™kl«5~.ÉYwòïý»¸â!¶} çÁ«=RùBÄ7øÛ>Ã}jmÂ<‰J‘6#Ò[J\v´lÚRUš—%¼ÖN”%+Q “4D[wqÄ>ClûAσMÇù ³í> A`¼e~¾b\0ëæÚ‹&Âî^ãEDU¦TE£qîñt¥Ðwµ÷›ASßâN¾Æø™ìorÃ÷HLO\kl‰ˆ–Çà8iÄ 2Êå­)–•j9> ‚¨€âMj³Ixµ—qÄ>ClûAσMÇù ³í> YéQUÇù ³í> 7Cä6Ï´ø5g¥cqÄ>ClûAσMÇù ³í> YéAXÜqÛ>ÐsàÓqÄ>ClûAσVzPV7Cä6Ï´ø4ÜqÛ>ÐsàÕž”Çù ³í> 7Cä6Ï´ø5g®]„1N;¾Ë—g¸=fÃ÷ÕÅ2Y…2Å)[¶—[JÀ^Ù-Í@ ÒVÒÛÒ¥ ” (-[Ž!ògÚ|n8‡ÈmŸh9ðjŸjŘÝÞHl˜Þéˆ0m´\-í\ŸyÛT›)y¦”Üd4$8²¥,k ÷-’k¢áYÓ®x^Órº[ÕmŸ./ʆ£™ŒêÐ¶Ïø¤’?ô ŠÜqÛ>ÐsàÓqÄ>ClûAσVzç¬ãA‡±5ŠÏd[-‰ð'JqGL»8¥0¸©BqV•6“¼+7šA 3â Çù ³í> 7Cä6Ï´ø5Íí¼©ã7q‹6»Œ\UÒÛovÔ»D­HSðâÈ;ŽÓv6_w&Šu¨4â°k=÷òŸd³c ›l/{—d½[ìÐáÇ´?ËvI€­Ej”摦b—ã%*Ï,ÐlÅn‘—AÜqÛ>ÐsàÓqÄ>ClûAσ\¡žX1Ç?kLðûBuÁ ¥ì+pºKÝÙjÚãÈñÜJÛRÓ9JQP9!q7èü¥Dgáü#2êDÛ•µR]šÞžÃAÐb“jiZw’TT²)p…‹òLî8‡ÈmŸh9ði¸â!¶} çÁ¬üšÞåb^N°Ö#œÛ-˺Ú"Í} ‚JÝe+PH$œÔrÌ“—ÒkO”«µþÅÑs´I¶&"®ð!O*ÝqäI˜Ä|Úq. 6¤‡T®é.rà29†]Çù ³í> 7Cä6Ï´ø5g¥cqÄ>ClûAσMÇù ³í> YéAXÜqÛ>ÐsàÓqÄ>ClûAσVzPV7Cä6Ï´ø4ÜqÛ>ÐsàÕž”Çù ³í> 7Cä6Ï´ø5g¥cqÄ>ClûAσMÇù ³í> YéAXÜqÛ>ÐsàÓqÄ>ClûAσVzPV7Cä6Ï´ø4ÜqÛ>ÐsàÕž”Çù ³í> 7Cä6Ï´ø5g¥cqÄ>ClûAσMÇù ³í> YéAXÜqÛ>ÐsàÓqÄ>ClûAσVzPV7Cä6Ï´ø4ÜqÛ>ÐsàÕž”Çù ³í> 7Cä6Ï´ø5g¥cqÄ>ClûAσMÇù ³í> YéAXÜqÛ>ÐsàÓqÄ>ClûAσVzPU;>37I“‘²ô0ÒPËÊs‚6‡2JSßÚw²ú*®˜‡úªOý‡?ÓTº ê韢HýŠêãTëõtÏÑ$~Åuq ó…¦^¿MOûvª¹Žù À8¢Ç~ÚŽ‰v»ÆŽËv…Èi÷R¡¼jÈ)K V¼õHïƒÆ¥­_Ó.ߦöìÖý<„,˜# µc±°´´•}Òô§ˆO: ¥œ‡Ð)HJR”ÌGb·b(‡rL ¸mq¥»ÖÖãJJÒrR‡8>š×¨ÜC|·Xa"]ÉÇÂp4Ú#ÆrC®,‚t¡¶’¥¨ä•€<?E*‡‡¹1ÁǃvU¡¥HB1ô‡’§ ªKù/ð„— YëJQ eˆO®ðvs¥¥IŠòƒ)K›%)ì‘ò ‚]Ј9~Ü9DÁöùw(Ó.êiVÖ_zJÌW‹@0£ÉCZ Sh*XÈðáHÿ?’}}?…æÝko™r— “×9"TÅkQÚ:m¬‰È|›-§!îsï’NíT°õêöåÂfäËhp¶S:Û"™€a¡ #ˆî€Ë<Æyƒ”•Ý*”°"E<1™‹3Ie†l!¶‘’P”Ž HBNÁXjv'oI·)wÖÛš„—RÒÖÞa·ÈVÍkF}ÊÔ’¤ðÈŒ… Ê‹:aIfTY ¥Öeamº… Ò¤¨p ‚#´.xŠËm¿Zl3g¶ÍÎð§S>D©âÓeÇ2ÈdH'3ïù—Y7X­‹}¤Ì0#ì•6RåÉQZ–§]V@¨•{ÉH¼@iâœ/jĨaW.¡¶BÀD;´¨hp+,ÉaÄÁy™Ë¾s­aìo`¾Þ×e…ÙvnŒegY¦B%  @¾ÒÀkkâ‹&i‡/lÈ* 6ÄWd8 ‘©Ji*V”Ž*VY'†dRv9lžN°¨Ä0oÍ3u2ÞÒ†ˆ×©ŒÇa¤ìþI !ÐÐlìZÔÞ+Ð5S÷ÛU¾ùh“iºÆL˜RQ¡ÖÔHÌg˜ Œˆ €A@ ‚*”¬„…Ù‹jnªu×–Ãiy˜¯9-à’ÊúPZB–‚”©@iÈqÍÞî,¶©K¤”Ƈ:q@œ†yÌ’I $€3&“êG£Jo%ø:e¦=­è÷tÆfVùò7ÙÍ8ôhXy×ð[Î%M6R§ ŠJF’*Ý3p Ç†ÊžSL4–§ž[Α*ZÉRÕÊ”I'‰$×>{”l Í­«Šî2vn<ã”Û¤*JØÔà[½ª4¤‚¢¤€äÎÏLy‘—æßŽûiq§[PRV… ÂðA:£F/&øF"fˆPçÃ3³Rã]e2¶Q´ØR: À% $÷ˆ"¦°Î´á¸ …hŽãMºêŸyn¾ãî¼á¸ãŠRÖ¬‚Fj$äïTØÜ¡aIIšaÌ›0ÄNµ"5®S«yM™[ Cd¾€²[AiI§ìw87«,ͱý¼ñ›•Ý Nѧ…d Ìr ‘±;¼ÈÀmìdæ/)»µxt²]u‹ÔÆZp5–„©”:R\PRRsV`ê9ìaì†ìg.–¸O5%M)„m&<êiJ Sl¶µ”2‚¤¤”¶;”ðà+B爬¶Ûõ¦Ã6{lÜï u0#äJž-6\s,†@‚s9ðï+ÆĶœK[Ö¥ÌüNë%¹p_ˆëNìÐæ•6ò±Ü8…–D(RΡ1f±b–£·zŠó†9QeÆ%»Ô +Hq¥%ZT8)9䮃•*â‹&i‡/lÈ* 6ÄWd8 ‘©Ji*V”Ž*VY'†dTšåbøl¯“Ì.q,@ÛWXó`6–b&=êc1Øi;?’Kt4;µ#F•謖¼…íJ~ií=""ám ÒR—…äTÜr\&:sJNMhÈ¥$dR2·bÛæÃL‡&9 ÎeFÉbCešÚ| 4èf³Ð£–¡ŸÓ–Å·Yn8†ë`ƒ=·îv„²©ì$Øó9e™QÈG òÌg©™¼î‘ÂáJ„¥A7J„¥Ý*”t¨JPMÒ¡)A7UÌ9‚0Þº*çk‡%‹;j~sòÃ%IQi¤¸µ%¤”( Êxp±U³¬;Åæ0MáR,Û#1„Yf)Ý.8¶Ð¶ÐÔò ›s»h)9$œòãA!tä×\m˜zÚô;ƒ°ã!›H‡w—Q’Kc»iÔ©D!!!J$åŸèçi¸PcÃeO)¦KHSÏ-çHÈ-d©jáÅJ$“Ä’j…rǸj·b7]º=i¸Ãßcʉg—% ^·6M(´4¨ïOÓà9OÚ§F¹Û"Ü¡©k-”>Ê–Ú›QBÒ’R “‘}"‚ÉZOZà=|‹{qSâFz+ëWpÓÊiN',ò9©†Ždf4ðË3žCblMháŽÊ9/\E¶âÁzS…)ËR´2…($jNj#!˜Ìñ Ÿ8rÈ\žâ­í­W ìܤëR”%”²–œÈœ’R#³–Y ÑžY’L ³“!o‘!ö™½>¹RX–ø™).>ÃŒ¸ÓªK¯(¥QÙYg¥9é$È\¡ay÷TÛ­Ï]. RØFÞšcñ’^m·[Õ! ’ n¶²J€@œª×J©-yäë Ýo.ÞŸsqu×rL ÄÈN(¸Üv– aÔf’ˆ‘Æžömƒ–d“?×.ä¤1µzc<™ SÒÑÑ©%Õ’µj-¶TJ‰QBIÌŒëF”,ògi´á[•— ]q•Ù‡mž]òt¶íáHÒÚÚi×ÊP¦òIIN’È ©œgƒ¬x½˜¬ßÍMEt<Ò"]¥CN´­ BÔqÔ•¶…$«2’3NG:ËJ X›…<6Tòša¤´…<òÞp„ŒRÖJ–®T¢I¸V–ÙuÇNÕµÜä[ÊÐ8ä™Áq³¨$æ$Œ•[÷|eôŽªn,øËéT òSŠÃÏZY™iP»ZœµÜV©O£uBž– ´iGáJ Íq'k£ZЇ ÕÞ˜W'×ÎÌ-DzÜlÑ® œveKwðÕÊD±»<ÑmM¶Þsž q:Ô¤¥°Pt]“qgÆ_Hê¦âÏŒ¾‘ÕVÇ6äË L÷ Ä×­vK YÉa,ÙìÏ-Ȭ©½¦·-¶5¹­ „¶M'‰9Õâ¤w|eôŽªn,øËéUuiÞm±îÖ×mòœ˜Û.å©Q&;Ñ’\iIZxŽ9˜ÌŠÜYñ—Ò:©¸³ã/¤uPR¹4ÂqðF ¶áÈó¦NÝ#4ÓÈëšÖ†Ò‚P—½’ŒÃi:™Èwó¯âNMäÏåFÍŽ!b[“.FžÛ²¢¹°SIa¸² ³›*XԷΠVN8FJ)껋>2úGU7|eôŽª n²K‰ˆo÷뛌¹2äú`4¢C0ÙI 7™Ž¥:áðHÌ€ GãÛöuîÓ~ÃÛƒ³ 1"2˜™-ØÍ©­‡5ëi*Vi\fóAV•-$€k¡n,øËéTÜYñ—Ò:©1qDon läžÿk¼YÛ6 ‹|Úˆ’¹¯´B!´ËjJ¡¥%—Ö½‘)yÅkoRtÿÓMt¬}e•~Ã.@€ó-LnLi‘‹Ùì˱ä6ú¼¸éRš $f@'ïU¿qgÆ_Hê¦âÏŒ¾‘ÕVfÇ€qt+‚q,Ch]á×Þ.Âvé+bÛkj hü'FÕÕ'±ì•k@J¸ÏDÁva‡0u—Ìk·±:S–ÓdÚQ«/£=9ÕŸqgÆ_Hê¦âÏŒ¾‘ÕPq¼‚ñ~r í5eœ»¡V›cn\ä!3µEIuÒZ^îCqîJÒ¥©dTMZy'µ_lŸY°ö!mjU¦¸2Öûo!¦€á+i²’HWq’€wG>½ÅŸ}#ª›‹>2úGU8¡Ê±'&ògò£fDZ-É—#OmÙQ\Ø)¤°ÜY ÙÍ•,j[çP+'#%ïrnÆ0q$™ˆmv±oS= ÕÙ.4´Æ6R¸í‚aKמ`¨'Iüjèû‹>2úGU7|eôŽªê§cÛöuîÓ~ÃÛƒ³ 1"2˜™-ØÍ©­‡5ëi*Vi\fóAV•-$€k¡n,øËéTÜYñ—Ò:ªLYNEb¸ÂȰƒp¡X¥ÙpíˆÙ —®Žµ%æ×¹ë{d#©!IÝU’6„+PÍHïV<%É|œ/zÄÒ›»=‰-÷[:#7’ÆRßÛJuÍáMÆ —ò Ég'Ô•¶aÜYñ—Ò:©¸³ã/¤uV¦nlGR¤w|eôŽªn,øËéUu*GqgÆ_Hê¦âÏŒ¾‘ÕAJ‘ÜYñ—Ò:©¸³ã/¤uPGR¤w|eôŽªn,øËéTÔ©ÅŸ}#ª›‹>2úGUuQívÌkó~IJaa÷B#w›aÄ0ì…©Õ¸YR›*ÞU’–€5ó'qgÆ_Hê¦âÏŒ¾‘ÕAÄÂ\¢ŽM°žzÙ…_‹imˆ×F;4úpb;-¥´ëÝ JVâIZ4‘¥:”¬ºÄJ\&5–X”¦Ò^m—K¡ywIJÊRTs”¤‘Ç!Þ©}ÅŸ}#ª›‹>2úGUuT9M‡î0c@Áë¶´ËÊX¸ºýÁÈ’y ’ÂÒá%]Öj)ÌÜñ:“Ð7|eôŽªn,øËéTÜrœɬkMÎmÊ`•oRåDz]újbÇm˜1X ­´©´:ØXÍh:Ñ£WŠ:-Hî,øËéTÜYñ—Ò:¨#©R;‹>2úGU7|eôŽªêTŽâÏŒ¾‘ÕMÅŸ}#ª‚:•#¸³ã/¤uSqgÆ_Hê Ž¥Hî,øËéTÜYñ—Ò:¨#©R;‹>2úGU7|eôŽªêTŽâÏŒ¾‘ÕMÅŸ}#ª‚:•#¸³ã/¤uSqgÆ_Hê Ž¥Hî,øËéTÜYñ—Ò:¨#©R;‹>2úGU7|eôŽªêTŽâÏŒ¾‘ÕMÅŸ}#ª‚:•#¸³ã/¤uSqgÆ_Hê Ž¥Hî,øËéTÜYñ—Ò:¨#©R;‹>2úGU7|eôŽªêTŽâÏŒ¾‘ÕMÅŸ}#ª‚:•#¸³ã/¤uSqgÆ_Hê Ž¥Hî,øËéTÜYñ—Ò:¨#©R;‹>2úGU7|eôŽª¹¿ÕSì/ý&«n¾4ÜkDÅj:ww ‰ú2Iª’¸­ ZmR´¨f3Si=yò4÷ê韢HýŠêãTË Ì)(“ èúâIÐVRA!…ðÍ$äÏÀ|s ó…¦^¿MOûvªv«øiÖÚ™yÚ+,æ§.Wf¦w¸üç¸Ðgªg,RâÃÁûiwT[‘¼ =zvÒÇ#Ü;-¤)l§,È#,Ô”'1«³{Î{7¸üç¸Ð|Èþ)¿œ(ĉX–êÌôÙž{ '²n·¿Îæ¥-£ {!–Î i~;N©Ò$TÕÛâˆØ’ð»Òt¼ZÔ«Ê]´Ž:–â´ÄÅCQ†F†Kvò—SÅÅ>âO{Ð;Ü~sÜi½Çç=Æ“Ÿ¯Õb~ßG1ÿ‡û¼K‚¯Q›&èôfâ©ë—l¯ÝØ¥í{‘¬% <$¸Óiko‰á—U¬Ü~sÜi½Çç=ƬͳLõ¥{rêÍ­ç,¡Mž4옙-Qš_t3Ôâ[p§$æFH9 ó·¸üç¸Ó{Î{EV¹ ‹®”8¢âÉeKu¦ö.••êh‘Qú9ö,½ÜÙåmø¢õ5‹ª/vÖ-VÄÏq ‘n^ë¼8"¡ää¹åo+‹e†ÀïðìÛÜ~sÜi½Çç=Æ‘¼IĸÏ!w»ÇÂiëÔÛ„§¬Ž¿‰c½=ÉÄ.6–ÔÚÆ˜ŠÔ¹¨ £C(W|ðåºäÜ+Æbñ}•cÃÏ3-Re³sv2R¦(/65jÙªRÒ×yŶ”žýtî?9î4ÞãóžãRbôÒÄæÜ.,b^!Áv™˜ÎL|óV‡ïQf_7HñB›eNÆÊ’—ž5$$!JIsV¤„ž­Êüɰy?›&™1~*eI˜uˆŠ’Òdº’8¤¥‚êµ#,Çz¬ÛÜ~sÜi½Çç=ƵªnÒ0ùÙ…Jm†®˜ºt\¿KL;£x†@C‹K [Dð6’•¹rÙ…puL!‡{¹òw&ï3“ü9.þ…¢ðýª+“Ò´hRd)¤—OÐuÃè©mî?9î4ÞãóžãKû};ÿ£æ»V'¿ªÐ\c]’å­§1~‹ƒ¯®Ôñ™/… ¡¸†œ¸€Û|40‡;ýî·Èt÷§Øï EÅË•©›¦Î×)S×9.3»0§r\ßm2! q\HGøeWî?9î4ÞãóžãR1·ß½Á9qìC4Xùlßb㘗¹Ó.‘8Q7)bL]i–V°Â$–J’©'ipRްBMbä.÷s¸â˜M=z›p”õ‘×ñ,w§¹ B¸…ÆÒÚ›XÓZ—5”p(e ïž›{Î{7¸üç¸ÕŒ õËùn¹7 ñ‡Ø¼_eXðóÌËT™lÜÝ€ ”©€Ê ÍZ¶j”´µÞqm¥'¿]'{Î{7¸üç¸Öf.&¥Å°v-·Då#3ˆq‚"â;¶P¾Z¥ÞÔ›’…·bnheå¿¥(BT¼ÖrSŒIi([jÔƒ›9 gˆó$pœè#±¿õ_ÿ—'ý«Õ?U¬Páw2áy·Ê˜KŒ’¯Á^â*ËA¡jþ™vý4·f·ëBÕý2íúhÿnÍoÐ*ßœÃX}wT7l(C‰CŽÜ®Iƒ„«€[)*Ò5iH*%JH˾DõFâ[×hIb=âãhy& ›ÖDdCˆZ'‚’Fyø:w–,¬íÝÃ쩆-ê¸Üv— ‚#‡$$*.hü$©$<‘òy¶€¬ÆyT´~QeËÄŠµB²C[2&K·[Ýrç¥Çe0™íš ¨²Ê•JRà+'d{ŠýW$öÇ¢WKÓ,;È×$¶óc²l­çZ;­çÉìÈ) €r©XÛ&ô‹…ÍÆš–üèÖ布<—Ò ëÈz”s‚–R ‹ êãû'üïÄ—ËíÊý ñd·[û%¸»h7%ËmçKaŧ5²ÑÛϨŽúMZê/ Ù"aë:m±}äí]}ןP.<ë®)Ç¢©JQàãT¥@­;ÍÖÙe¶»s¼Ü¡Û`³–ÖL·ÒÓMæ ‘©j Éf{ä Ü¥ÅÖ,o†"b=9™Qd6…- u r:Ô„¬²èB”âBÓ©9æ ¨+¿(F0vЛS.À>5ºT•N}/¿° -±¤íI—-z“¤º2­ö;d-– šØÆÂ ÍŌֵ+fÓi BsQ$ä’M@\p-¶v%Uåw ›m;*<ÙVöÜ@‹&Kv/,êN; ZRvhÌ©ÁÄ£ð(GÝcÅrÔÌF.q¶¸ÔàúÖÂv''Ð6.IްŒ×ܸ8ý!Žq\« ûm®Ùl‹p¸ÏC¯!§ˆÛ[MŸ”м֧eN]Ò–8Ša mÃw寏\å¦4UB·±)Ä)¸”´©Lµ¥ %$¡¾++VHH!•mâÜ,Î ~´]nv‰ÐÐëML·­´»²t'hÙÚ!iÒ­=ìÁBH Š“ÿ8Ýqjú¹C˜caûÓX}ž×¯®@j,—.!2ÜT°‚‚ˆá)(ך³p(-A$ Í£_ÃîÜÄELwjÌxñÒ°«Ï:†ZAQüPVâA9'#ÞªäNM!AÅëÝ»ß"5mŽÄHVð˜®Æ´%¦Ë¬)Ä„÷e+ VŒ2NVœOe‰ˆlÚf©æÚt¡iq•éq§´­·x䤭)P̘ƒZÕY¤… ®T¦IÙ[àØ­¯ÞËî!Æè&BQi[Rv_)´¢„ Ô§2á–fû†.ñ±µß¡%ÄŹCjc!Á’‚@Zsÿ”*®®M „&C81x/¼ó÷†ÝdJl†ÐâT6[ ’–Y% Ó²ANDgVë5ºžÏ ÓogcvãGo2t6„„¤fxð ~?=þ… r•p¿© ÛðÔw]ŸÜ- ¢ê’]d)Œ÷Žãðuè•Ý#ht/†g l¸?ˆ£].æZî %1¥ï,)ĶÚÉmÍ*hsJHRT’8T9-·5o‘ &%ıa*߯$´—-qTâ¶c«eÀ+f„æ½j HC!V<‡…l-Ù™¹ËŸ•Äf‹HÈw Lv›FœÁÓ‰^’3HË N|HI8^ê‹öµßŽôfî0Ù––^8Øqa*0Ï#þ5#X`²äxLGvSÒÜi´¡r:@È­A JA=ó¥ fx8Vj²AJR R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” Ö½gnŸ¢;þ…V­á_.ËzÁá«dƒ¥Î Ouž¡Ü¤}?ûm^¿³·OÑÿB«òdg$:ßÊ´‘™­@‚8‚8pâ>šìLæjë›ë~“ìþ/?“WÿH÷¦#n½ìÇ?'cä‹•X‹?ƒq†jˈÛ`Ègf…%©MŒµd•M¬¤•f“˜'"K½Ül–;rî7¹öëd&È ‘1ä2Òsïf¥|ÛÉZÇ(ñ,1~UÅû£m"L©g=.¹L¦>¡À‘´* ä”'<³÷îQظ¿‡Ñب S•¶å¸Ããdn3½‚ÉVD ê˹Zò9åŸodòkòx¯^ùýã‰ýÞÔ|>/žtøö¨ÇÂk1ûKeìI„™MµO_ìm‹© ·Ìh „åÁ¬ÏÊwÇâçß™¼4»Ì›*.ö…]"µ¶‘Il¾Ëy­hÏRSÄq#."¸Z¹9ÆÍaivÞÀ¸ô‹å•ûjœL¨ß€º¹s]ÛIÔ½½´ò·lòv8  ”¾`Y>EÂЋ O2‰×©è™*K"$ÔÌbjgäÈL¶P欒>ÿ¦׊#?Ç{øuü=|Ã8‡daëÅ¢îË+Ùºä-¾”+Å%€ÀԦŞiˆ®mȽ‹[¯Ë–!‰ulɉ3/]œ†e¯c¶ÔŒ¡i;@PHÚ¥ê$åÓ*ÌT³pñ±gšG¢)±gšG¢+Ýi^áI¸ZÞ‡í6Ðóšt̆†Tëy(¤<…£ˆÒx–G""¶¶,óHôEGH¼aØ÷ØöKS7i(.1rL‡P3ÍIlJ>ƒPüa‹žäêɇ.÷§®ÒàÁa…­a½›% ¡¦Šl–IÒV È=ÒÑOĘKIÇó·{SB¸ßí—d܃ÑÃ1›‹ºkmiWËí?t -z»Ü¼AĺEªñ‡nÓfµÝ-Så@^Îc1¤6âã¯râRIAàx»Æ—ë¾Ãñ2ýsµÚ£-ÀÒšûl!K=ä…,€IÈð®oÈþÄ–k囲ö§!3a°=i\…½ižâׇ w{<ã8é/d½rVôï)ö›ÓØŽÅ~µÙ¾5 ,ÈBaØès7•A„‚‚–iya¨§IÆ›XŒÒÔõç1{czëjjë)²ìx+Ø}Ô óR['R‡Ä ÖäÅÁ…és4fP\uçJP†ÒeJQàI®`äïÚ;`z¦$J±Ëvî‡ØØ4 µ .¡A_.WœG‚4 K^¬ˆáÔyS´N¾`©­Ñ›—!¢KV°”ÉKZyl’x ¢[R8ðî¸ðε1V‘ÃaÜY‚Ú±G¿;‰pûv‰.lØœ©Ìˆî¯24¥ÍZTs€?A©Ä´Â€R[lƒÄ‘Ƹ„|'Œ"^N,^Ÿ?y•,®Ô©´X·µµw3»fá„ðp6s –­{Ý[“ËD¼?€0í†{È~]¶Õî ’•¸ÛIB” âA)&ŸŽ÷è?[ĸEÁs-ßìk£•ÇLÆŽæxðwÉ÷ãeÞ­»%ÆÉ|·"ãdŸn¹Âp‰ÞCÍ+.þJI ×Ã8_aø0Ÿs.ñ#Xlj+²á%Y z!C­+1¥´ª3’þN¾½ ätGí×8vk¤Ûí²áo¼].k›=2Ónšl‘çR–ÂBRÊÉB”®þfFÄîµJ•k‹2$92!1&jÔˆ¬¸´¥o©)+PBO”•3È{´¬×ü-z.ž÷f¸Ë†tÊb$¦ÝqƒžY-)$§9U à<[;–¼/â^-Ò A¸%"3Öõ-Ñw9(x¥Íá!EÕ¸”œ›Ô dIh¥Qü‰aYdİ¾ÚæF‹l±½noxz*˜Ž¥<ʃP¶*.)‚9™9¹Ü7‘â¼Ñ¾Vvv=‹<Ò=Q×ë¾Ãñ2ýsµÚ£-ÀÒšûl!K=ä…,€IÈð©J rŸi½=ˆìWë]‘ûãP¢Ìˆô&އ3yQÔøA()aÆ—‘ÖúŠxÔ™¨".Vˆ·Ì3+HÃÑo‡ï1šH··%µIi²BÔØ:’’Ž$eÝ'Â+O ã ‰f®Å8ró)¶Ë«bÁ™%€TR…š€Ï½™£a‹f+Ãø£@ ]î,av9·f$ÃØ-ç{KÉJßK¥´îÎêÍYå¥*Ï:²Å²Ü»ã Gx·M[²X6ëdHr’܃ ¤òn%ĆÝuÕ¸ ­h s))ᩈTÌmk¦Åžiˆ¦Åžiˆ¯t¨ªúqf Uáû2q.UÎ:’‡á‰ÌíÚRœCI F­@—m1ÅKHï*Z;¶ù/If;‘^v+¡™mIR™YBV°?Z…dx䤞ñÀìØ”¸ØR OdØÛjß’³n…3sˆêåÄ)J4Hu[È*Rô“™Mu>L°õßÏÅâï>m˽¢TiÓ6Ù-nÚÔ¤°„!9-§„œ Ï=ED“ºá±gšG¢)±gšG¢+Ý(+o¥'üÒr¬¯é—oÓGûvk~ƒ%¬@µAn ²Ù F†M± m´ðJ@¶·ÿÍ~·ð­®ò„õÉ›{6|yk})CvôÅ2ä ‰(gzPd+!¬•gÜ¡Y òÈ.ÿæ¿[øSü×ë ùÅ\¡c'°Ì«’oKeû-™ëŠ›Lhÿ†¸‰S[ØÈÔ?»º4Ê·|³uðRtdjqÌW¤_6«›nH¸].¶˜vÙ,²#0¸íL,¹©?/«TfT²³ ¦R4ŒÇ×Ûë—rßÿ5úß›ÿæ¿[øW,ä–ýˆ'b Aa¾¹ruvÆ!ºUqÜ̆Ý{m­¢b|–mI»ÉÎë¾+¢Õ”†öÿù¯Öþßÿ5úß´kNó2D k²âÚ¦]^o-1")¤ºæjé.­àg5å™È&·ÿÍ~·ð¦ÿù¯ÖþGäŸܱw'ÖlCu³½k•6­ -ìÞ+i .´âÈl•!d,ÝôÔñ*ÄQñÔíÞæãP­×Ûm¨[ƒ,¤7'uÖâÔ¯–×øK¥@W«¿ÅÌ@ì›ÿæ¿[øSü×ë ã|“b¬Ew½Yû+src7Ë·UÇ[,%0\BãÛE¾ïGá6vÙ¯\uÀñ›å*ëxkY,VËÃÖV¦F—)éŒ5nfʘHGË‚/-Õä52 ž5&j-k4é;ÿæ¿[øSü×ë à.P1eÛ±·×¦˜h2l±]µ!†v.‰­CS‹QWË…ç-ÒHW«2xôÎSnÓl¸9ù¶ù Ź1"‰+@Rc%ù-2§ˆ<„¸¥ñáÜñáZ˜¤…Ïü×ë oÿšýoá\A8Šøl×(óñÞ$›eÑP£&-¾÷+“Š‹ô²R”)’¶Ôë¯fžã2¤„¨ž¡…Õw^µ®þÛ-Þ “= Ÿ“Lhßîug—øTûÿæ¿[øSü×ë àøKâ;ŒxoÝqp·±y°9wzCñ¢èµ94µ—÷rë_/©AÈê9Àßy.—}›ešýåùòc™Ê¹3ã"<§âhFN:Ú’\ÚåÜ$èÐJA&‘˜ïÈœ/{ÿæ¿[øSü×ë ä÷ù¸Ïò†›½Òè§ð”ÛœX0¡F“*l¾†˜Hq¥EÚ/'Ôµ•"G‘Üä’ “ ¸ÎÕˆS…qýÑW[¼«füÛìÉŽäpRt¥-ÅamêSÈ!+ÚpIÉY¥Y£#¬oÿšýoáMÿó_­ü+F¨œ¥]o b %ŠÙxzÊÔÈÒå=1†£­ÌÙS ùpQ %庼†¢†TƤÍE¬EˤïÿšýoáMÿó_­ü+“à{î ¹âl!:uÚI‹‰0“·Iµ2Èf$„nl”åøC¹…­\O ² ÉF.Æ7‹«dǧöBÀýÆ#S“ˆ²C% ж§[ò™+xItkA 9,V¦+Wºœ[¹ïÿšýoáMÿó_­ü+F•öÿù¯Öþßÿ5úß´iA½¿þkõ¿…7ÿÍ~·ð­PooÿšýoáMÿó_­ü+F”Ûÿæ¿[øSü×ë Ñ¥öÿù¯Öþßÿ5úß´kçÛ&"å*O%ÖËðºâ¶.wXö„³6ëΫvÖT¸©M·mò)uyÉ$ç’ôäHoÿšýoáMÿó_­ü+‚9‹q&%²]ïÜMt°˜X¶ÛgÝ#Lj²Êd kRYu•æ¶œ~NJwGޤ„c¹ß/vÎT,˜@bG‰-¶‘!øím¤6ñØ’†Â“±+ï !—‚têl%Í%âÝcü×ë oÿšýoáZ5Då*ëxkY,VËÃÖV¦F—)éŒ5nfʘHGË‚/-Õä52 ž5&j-¨‹—Ißÿ5úß›ÿæ¿[øU[Ý¥_°.¾Ne,ʸÛ#K}´‚ãIZ’ã$Ьà[…úV5•ŠV#±³Á2cÙf;sCˆ j2›H+HN×^¢æ’5ç¨ LTÓ7‹týÿó_­ü)¿þkõ¿…hÒ¢··ÿÍ~·ð¦ÿù¯Öþ£J íÿó_­ü)¿þkõ¿…hÒƒ{ü×ë oÿšýoáZ4 Þßÿ5úß›ÿæ¿[øV(7·ÿÍ~·ð¦ÿù¯Öþ£J íÿó_­ü)¿þkõ¿…hÒƒ{ü×ë oÿšýoáZ4 Þßÿ5úß›ÿæ¿[øV(7·ÿÍ~·ð¦ÿù¯Öþ£J íÿó_­ü)¿þkõ¿…hÒƒ{ü×ë oÿšýoáZ4 Þßÿ5úß›ÿæ¿[øV(7·ÿÍ~·ð¦ÿù¯Öþ£J íÿó_­ü)¿þkõ¿…hÒƒ{ü×ë oÿšýoáZ4 Þßÿ5úß›ÿæ¿[øV(2]ämíRû:X_ÓŸ÷MTjÏ7úªoý…ÿ¤ÕbƒÇúºgè’?bº¸Õ:ãý]3ôI±]\h4¬èZæ]ô!JÊhÏ!Ÿÿ.ÍHl^æ—èšÅ…¦^¿MOûvªv‚b÷4¿DÖ•êÇo½Û×o½YâÜᬂ¨òã%æÔGx”¨jËQ˜’ìíž $1f¹ÞqÀÛq !Âr'2§„! Ý)Iä;äná <êmÉw ZÖ›YÕo €Ù-w?'Þ‹—z¿_ÂV æÏ Û—>91õÁBœ’ÉÜQNkA4œÆUç+Øx[Ñ=«]îDv£¹*æ¶Ølö-–ßq…¸þn Àq—‡Ém )@Œêi¬q»ž&…vµÜ¬ÉðÑp“"^ÅM=j|%ööN,éüÓ’ÂY§'".iîŇí–;…ŠÉÕQ^ÂT²Þ£ß:PÏ…oì^æ—èšÔÁض>#‘2­[4ø²óî-¶—v/jÙ:6kZt¨¶àË=@¡A@±Õ›å#ѱ{š_¢i±{š_¢jb•±{š_¢j>FµH½±|~Å Û¬tØœ¸‰Sí$çšRá€âxôš´UJç­p1B¬Ž[Ըðe\[i,Y24ìYY+ Ô­£\R…$m¨ŒéÉÃ-¯Ú­s&M¶X¡A“9{IoGˆ–×!\{§ Äç߯Ûîµß¢"%òÇéÔȉy Xï(ž5‡cë^'¹7-¾é2¢*u¶D¶–®1’´¡O3¥j:Aq¾ VN$‘ζñ†,c¿ -[ÌùˆuÖ¡Û›mNìš Ú¸v‹Bt§Z2V&¦"/ƒ–°Ý¥ëÌ{ÓÖ.]#7³bj᤾Ò8÷)pIO~“[“ "dWbK†™ÞAmÖkR’2)P#"ú hرÌÎ$h‹k¹¦5ÎÒ«µ²æ½Žë6:w}E8]IÓc%¶œû¬³ËŒÆ)¾CÖ)yÉ}Æš(BZaÜuÇ–Ûm†jRÔ”ŒÈ¨fG~¬ÅbHôUæry‚æÛáÛ¦`l?&{¤wm,­¸úÈ+Ù¤§$j –Yä3©Ø6öàÂb((‹;ii†kCm!#$¥) 8*<¡¡ËsÏÆÂ8–DȲ>Ž„¤!·Õjx3Ŷ¤éqEA]È9­8~ëûa·ÞíËS®[•JIISn$)$ƒÄˆàjŠÃØ# <ÍҰ…™Æ®‹K—.ÚÙLµ%Z’§FŸ”!\AVy5·‡°ÕŸB\,=`ƒhŠ· «b 40Ú–@E(’R3ïä‚«wZpݾÊõâU¢öÔ52Ô›{®¦;H¸Ç\–£‡ÚZÞJPØ[ì’^-ä•…e•]p^!‹Š°ÔKì&‹LIÔRƒ&;äd¢ŸÇŽãòϹYàxäsprˆíGöĬIÚů³jËUÇpoy9$$fî_Š{ýá•0æÃøl<œ;†-vpö[Qlm2ïjБžYý5êç­p1B¬Ž[Ըðe\[i,Y24ìYY+ Ô­£\R…$m¨Œëg ã[. ÅØƒ Û ‡$ØCÛÅ0µ:]N–ÕŸtR¦V•pÈ(e™!@,¦æÅîi~‰­ îµß¢"%òÇéÔȉy Xï(ž5gªî0ÅŒa×áCE¢ëyŸ1ºÔ;sm©Ý“A;WÑhN”ë@ïæJÒ$ÔšÈEÊÀ˜NUù7ùX6ÈýÝ6êg¹liR¶ÀPp§P) NG>F]êÉᘽ‘Ýp¡ŽÉ¡MÜ6væÓ½¥YêK¹'»3˜Vyæk=‹Á¼âHˆ¶»šc\í*»[.kØî³c§wÔP…Ô‘½62[iϺË<¸éánSlÔíÜbež–×.Ñf\TËlÉ„ÙH\€Râ‹hN´µP .-TÄ×' ý‹ÜÒýM‹ÜÒýS¨!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôMW-<à«Lƒ"Õ°üŽŒÜie¥%ÄñJAà¶Ð±àR{àUî¨k”ö1ª<¸8?&TÛkwKlDD=>*‹`ºÒ·Òl©+Z‡ È"Ám }"ËL‰H˜øÝS“²PPò¸wN$¶Ù vN¯N¦Ôµœ•“NfÕo±ÏMÖËèˆÒ"¦dfä$$%Ö‚Ò¥`†y â;æ‘éÇcú'Õ§±{š_¢kBû‡­w舉|±ÃºGCÄ52"^BV;Ê@€FgYꯌ±’påÞ©¬=y½K›LÀ‹yŒË1ÔÊ\ZËï6;ï·N¢xðáIbáö£bY·öÓ'y™ 4'Ù¥¶úÐR2Ìd/>9dõ0ö˜rjæáìe´J[e¥¿ØÓ)‚RT„‚FiI˽˜ ¶r¹d¹Ieq,—ÕÚ•nå ÛiŒÇy„vüS)NÏ Ts9k^ãË+M«]o¸/Zaaù,DžëÛ“šxÇÐÚRÌ•©GD¦–HiÔ3Ô4›R‹®Åîi~‰¦Åîi~‰ªt>X-[ä›6؃K2lG-Ñ Î ‹µXSï¶ 3˜ÒAI 9d=ÎIƒCцë­%kŽñAq’Fe (R’T;ÇJ”3 j*7b÷4¿DÓb÷4¿DÔvÆ±îØ°/دV‰nD\ؽi´o,!hB–‡¤d\GràB»®÷•¦‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ(!ö/sKôM6/sKôMLR‚b÷4¿DÓb÷4¿DÔÅ( ç¡hµMÖ…'6–c/îš«UÓÿUIÿ°çúj—A‚ãý]3ôI±]\jqþ®™ú$Ø®®4p¯ôË×é©ÿnÕNÕbÊëL»ìÕ–sF|>®ÍIïr9Ïp ”ªþ?Ãîâ|:»CnZt8âTë7[ZgÄ})âã%HÔ´¨¤¤$çßs{‘Î{…7¹ç¸PsW9=„jÒÖ#`0ý¹VË–ÒÖU¹%A1ssðR„LÊOÊÚÂr9gSW,»âlK*ñ‰-/Yq «°ò ±gq§Ó;ÖÏKæJ“´Úµ(·’´Œ’Žý\7¹ç¸S{‘Î{…';‘‰´&Â0ýÆåuºÝ¢Ü®3Úe…®%¼Ch6ÒÞp˜ZóqNHyk^}Ò—Þo¨½îG9îÞäsžáVfÄ¥aŸ¹°dCyO%§ÚSKS/-—PÈ”­) ãÁI ƒÄkG{‘Î{…7¹ç¸Tì–ÈÖ{[6èŽMu–uiTɯJt梣©×”¥«‰9f£È €©—žN ûyMÙ†­ò®nRâª\…?w) ÈÖ6m¨ÃŠV ÔYVÍîG9îÞäsžáNlTù;äàá;¼in]˜™Ûo]¶ØÓP C , ßXZ¶îEŒØ^Hî[#ß©,}„eâ …²íjºD·\­èu”.]¼LeM¸¶\?'­-.GaÄ/Wr¤¦·¹ç¸S{‘Î{…8¥¼ÚkÀ‚͉0Ì›F%´µeöžÃE…"Îã²[®ÓSâJS´;¢t¨7’uÒ¾ýZñµ„bL8õ¨LT'¶ÌI!( ؾÃÈy¥”œµãh%9ŒÀ#1žu›{‘Î{…7¹ç¸Rr‘‡>›É+Ò°ÓÖ·ça‰‹—4Ì”ÔÜ2—à¥b;QšÝãí`¶Ë)BNÑ_Œ¬ÁÌeѰݴٰí¶Ð©²'1ŒdÈV§_Ѐk?J•–døMbÞäsžáMîG9îl¥ ògvÃ+CöŒGk-öóm³©û))e…*>£$!ôªC›(¬6ÞA±˜=ê´à<4ötrmÁ™× µÁW ŽÇ‹»3´-6ÖMµ©E)ÒÒsÍJ%EDž5¿½Èç=›܎sÜ*FNóÉÁ¸c7o)»0Õ¾UÂ-Ê\U@ §ãîå!¹ÆÍµqJÑ¡Z‹#"+.ä¾Ã‚qmÂõb~äÜiVæ!"÷RÑCϺµæëªQxd2îYåWŸ{‘Î{…7¹ç¸SŠ•QÇØF^ ¸[.Ö«¤KuÊÞ‡YBåÛÄÆTÛ‹eÃòzÑ’ÒävBõw*@àjk{‘Î{…7¹ç¸RbÈšS­xY±&“hĶ–¬¸vÓØh°¤YÜvBâ«uÚj|IJv‡tN•òN£šW߯Ì'ɼ»&#¸âƒ7 µ|~ ÑcfÜ¢¡n© [Ï6S¬©¦³ÍÔðFC"I«–÷#œ÷ or9Ïp«y³ŠJR¢÷¹ç¸S{‘Î{…A)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)\Ïrw‰ðí®Ö‹íRîV;",–w—dZc³SE:Г©×#¶3 3Óßñ½Èç=›܎sÜ(9ûü“M¹rIfÀ7ÌKþÃìÅ› Ú¨åQcwq¥¡O/5¸ÂŸAX ¦a=Ϩ8 …Eïr9Ïp¦÷#œ÷ Fm)UL[€ì8¯Yï8†ÝmºÆµÂ—¸3 ¢B ¹Aá¯0•$GR{Ù¡â2ÈËïr9Ïp¦÷#œ÷ ™ä§+NÅ;­^]¼E¸ÃœÌ4"DV™ƒ9Ä©¥¥—†`(è±ÉÖ'”íå7ìWd™íz·Þ_j-…Æz+ˆ@+”àÙ©¸A$HS…Yä4Ö÷#œ÷ or9Ïp¤çqÌoü‡Á•ˆÕt¶'açÖͪí†:t¹ÞÀ ¶—› Rw ‡Ðò“— ÏBÃ,^mÓ» üc6X6ˆ-Äz }ݵHä¾ÚÖ­›IB#”'è #R²á¹½Èç=›܎sÜ(lªà~OÃØÚv'~áj[Òã¸ËȶÙÓËZÜK…ùE+P}àRrXJ2Ú9úá~¨½îG9îÞäsžáK”¨½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáA)J‹ÞäsžáMîG9½îG9îÞäsžáAïÿUIÿ°çúj—V«“®;j™´Vy0¼¸å5U Áqþ®™ú$Ø®®5N¸ÿWLýGìWW WôË·é£ý»5¿Z¶&ôËÆ‚‘¦jsÏôvjSq{ÆGIê Õª‡+‘bÌÂ[väÎFð‚”¹gzèÊGºv++JÞNYŒ†y)IQO Îâ÷ŒŽ“ÕMÅï'ªƒå×ðÝøáv—‡n®ÎU¡æ°éìk®n3Œ©Š#,·uÁZKŸˆÓE¢IÕþÖ¬/ •|û‹„Üû+”©1ž³Hº°¹'e°.E`…,iÛ€£Ü¤¨Ç*뻋Þ2:OU7¼dtžª•Š[͸Œ@Ÿ‹0¬>Ðga»³Œ‘6äÍŽ[¨ŠR–” Ey¦ËmµÀ6á*CiI_JŠz_+1&MÀ“#Ã&P/ÆT¨ñó.?2T–Ò2N‘ÄçïÕÓq{ÆGIê¦â÷ŒŽ“ÕVr‘‡ÍȰ©-°íÏ Î•ƒ7ÙJ‰lnÁ ¡µ©˜ 8˜ íJ–ÝÇfUÁ¥<…þ×Éü{¬L‡âß–µÝ™µÆnr–½j/†’%_IÔ¦¬Û‹Þ2:OU7¼dtžª·öúð-Ž,B)Â3dDn̦qKnáçß z)me+ßTD§­¤„!Ä–œë¤rú—É&„ô+”)VÛTH2˜è®!æã¶]BJ€<5'4’Däk n/xÈé=TÜ^ñ‘ÒzªqNöã˜ÞËŽdrß„/ȃe† ĵ79äª;kƒ$HyæÃ9’R”(¯,ÐÚ;ª”™NNpe’×1#µáK~a E¦ qmÈŠ^m-çˆJFanO–¡ÁUÓ÷¼dtžªn/xÈé=TŒ6Õ®iË=¹¹—k ×k$«Õ¦e&DVmÎNJ”Áie–û¬öi’„¹Þmn%G½]Wq{ÆGIê¦â÷ŒŽ“ÕRbâ–&¥óÜh%Ûþµ]°ÝÞ>&„ݩ˾%]žd•-æÛhª;2mHJS¥Õ©il/0¥ìr]i¹[&*CÖûÍžKvKxŠs6§Ò.Ç)yÒ´Ít)•¡ ]mOx÷ÍÅï'ª›‹Þ2:OUjó?ªqMZVÖâ÷ŒŽ“ÕMÅï'ª Õ¥mn/xÈé=TÜ^ñ‘Òz¨5i[[‹Þ2:OU7¼dtžª ZVÖâ÷ŒŽ“ÕMÅï'ªƒV•µ¸½ã#¤õSq{ÆGIê Õ®6m¶ÉS9D»ÀÀ×(ðîvˆM.*-j‡"eÅ.ÌZÔžä,)æð5$«Q $víÅï'ª›‹Þ2:OU&.(ŒM¾sĶxÎàXàÉ7;äË´Æn—žÖݸ˜à¨)élèee;VÃIk!’{sØ‘]ϳo‡íÑí1—ÞÔF‘…²¶”ÓA! H!9 *Œ² ™Ü^ñ‘Òz©¸½ã#¤õU´ˆ¦­rÏø™±âüCÉÄûfL3 S—âK­JRÉ,¶ÈCKÚ¦J(Í:ô%ä¥W]Ü^ñ‘Òz©¸½ã#¤õTWÎ %ÝþWæÜ$aÖ[¹½‰-R ±°ü— ¦4 ñjìR–„t©…6¤,%ÁÜ—BÖÖâ÷ŒŽ“ÕMÅï'ª¯rÕ¥mn/xÈé=TÜ^ñ‘Òzª ZVÖâ÷ŒŽ“ÕMÅï'ªƒV•µ¸½ã#¤õSq{ÆGIê Õ¥mn/xÈé=TÜ^ñ‘Òz¨5i[[‹Þ2:OU7¼dtžª ZVÖâ÷ŒŽ“ÕMÅï'ªƒV•µ¸½ã#¤õSq{ÆGIê Õ¥mn/xÈé=TÜ^ñ‘Òz¨5i[[‹Þ2:OU7¼dtžª ZVÖâ÷ŒŽ“ÕMÅï'ªƒV•µ¸½ã#¤õSq{ÆGIê Õ¥mn/xÈé=TÜ^ñ‘Òz¨5i[[‹Þ2:OU7¼dtžª ZVÖâ÷ŒŽ“ÕMÅï'ªƒV•µ¸½ã#¤õSq{ÆGIê Õ¥mn/xÈé=TÜ^ñ‘Òz¨5i[[‹Þ2:OU7¼dtžª )¿ÕSì/ý&«lº0¶mS5”L/,¿úMTè0\«¦~‰#ö+«S®?ÕÓ?D‘ûÕÆƒÎþ™zý5?íکڂ¿Ó/_¦§ý»U;@ªþ?¸]­Xus­ e·q!×¶I¸)<3DhÙ8굌H©D䜂£1ŠÝˆ ¢É2t6àuµÆ–ìg[XjC)+IÉJàHúh9¹]Å.áǯáZR›E¡Ë­É ˆú̶ÒôÄ7¥‚(·Õ¶½ Z#W~ÿk»â¥c|W‡d½e—¹Ûb\-%¸®ÆÓ¼;1 iõ×§vFkJSž¥w=á^ÞäÇ; uÙT†•!LÇÒJœ.©/ä¿Â\%d;¬)Dñ'?×y8Âî_n7µöx͹2¸òÕÛ ý4 èѳÛhJS¶t $ÙQ(Òr5gc–N1îñ{¿Úî’­7Fmje¹Úâ¸Ã }[M¬|–ãš–Ö–õ)*Ëå!%$UÚ«ø'Xðl%B° ›qJ„³*ë*[m%é ¥÷NagÃ<òX*aŸ.,2'N’ÌX‘šSÏ¾ó ´„ŒÔµ(ðJ@’x+5(4¬—kUòÖÍÒÉs…s€þ­”¨o¥æœÒ¢“¥i$”9ø"¨Ü{}…eDzۯ0lòZ\g”ûÎIÝÕ/lÛ3™Éµ$©aF“—Lªô솧bvñ$›r—qmm¹¨Iu--mæql…lÖ´gÜ­I*O ˆÈR7ƒ‰U90Ç·ÜGwµ·v0ïÖg/3Í.+h1ŽÉÅ­E/’‰£a) K‰Ë4œ¦9BÄ7øÛ>Ã}jmÂ<‰J‘6#Ò[J\v´lÚRUš—%¼ÖN”%+Q “ÃX+ aËŒ‹…žÜ¨òAo5IuÔ´‚­e¶’µ²‚®% „¤8p›aK)j;w¨¯8c•\b[±@PÒ´‡RU¥C‚“žJá˜9TŸùÆëj¶ ÆWëæ%þm¨±âl.åî4TEZeDZ7áoJ]{_y´¥=þ$Ù9C¾KÃØYÛ…½–šä¨°£ÉÙ%Ù2Ž…/.:R§Bˆâ;õ¦¾O0¹Äp±m]cÍ€ÚYˆ˜÷©ŒÇa¤ìþI,!ÐÐlìZÔW j§ï¶«}òÑ&ÓuŒ™0¤£C­¨‘˜Ï0AA‚ €AVµTÌÒiõrù8û7‡.»{r-7T–°ÕÂVßTF%4D6Õµc4?¥eÕä…##ž¬‡HÁ÷7¯xJÏy’Ë,?>œi—’óhS¥E)Zx- œ‚‡8Ô2¹8ÂFÚÜĸ´„:ã¥æ®òÛ’êœÓ´.>—C®êЀBÔ BR>•šÙ%²ÛÛoŽÜhqCÙld–Û@ J@ú b¿Ê8Ü.Q¹E»Ú¢;c´ZfξZÑvµFL7¨ÌámP²ëí¢J„y©XRÒv­ðrè¼šßæ_¬/ ¸-Þ­ò—æÉƒºì]Ò—˜yáÿIÆŽiu`êÌžC^MðŒD͡φf#f¥ÆºÊel£h-°¤8 t€J(IïEMaœ?iÃp ÑÆ›uÕ>òÝ}ÇÝyÂ+qÇ¥­YŒÔIÈÞ‘·{²ÎêeËãK?)Kb÷of& v|xP¦·oKÅå<ÛHF·„½m%ÂßÅ9÷CV¡ƒ‘îP.ÖkrfηÅbt>¤Yå5!,•#K›Ó« >V°Óy%KWêÛ;Xgâ4_§7p•)·[}¶žºI\FÜ@ LbæÅ*@:»®ÿaì†ìg.–¸O5%M)„m&<êiJ Sl¶µ”2‚¤¤”¶;”ðà*G¨°Õ/”,C}³áü7Øö¦Ü#È”©b=%´¡•ÇkFÍ¥%Y©r[ÍdéBRµ@«¥BbÌ)bÅ-Gnõç r¢ËŒKv3¨ VãJJ´¨pRsÉ\3*“u…ò£5ñ,¦°mæ(±î˜0d ºìõ2úSïmBÂP–BÔ£›dÝ%KXpM÷>Ö.‹}L+¼ûËug±1 Mí&i)HCϬ%eO”f§xtñ¬­ro„˜ÄÉÄq#\áOJ#¶KÌÆ-°i²Ãn†‹`Ä)Òs9ƒ™ÏÕ‹“Ì7dzæõ¹Ì@—n­)¹‹w\S…HB6€¸ò´ºÚNKHH@V¦¸fÊR•¥)@¥)@¥)@¥)@®=vÇœ¡5Ék| [!aéÝDZ-[’ò7©l4Úwi¥j-¼sÉ(XŽ3®ÃUF9; Èqæ­¯¤.CrRÎÿ °ÓÈD”–Úס¯–iµ„¤(§ºp¦x1Ë•£–m?I¶³knʔ͸¦;/a‰÷ka–m®G2É[*Xœ¥)JQ’@9“jg•9r›ƒp]Ú ¾Ý2ógD›ŒGDiN6ãˆm>é ÝŸBÎGº[ÿßÙ&æ=SUÎ9YÆ8ƒbkžÈ¶[àN”⎙vqJaqR„â­*m'xVn+4‚8gÇ£Ö“Ö¸_"ÞÜcTø‘žŠÃºÕÜ4òšS‰Ë<Žja£™<2ÌæW¶ò§ŒÝÆ,Úî0 AqWKm½ÛRíµ!OË!üî;MØ8Ù}Üš)֠ЊÁ¬÷ÜkÊ}’ÍŒ&m°½î]’õo³C‡ÐüS-Ù&µªSšF™Š@N_Œ”«<³AêgY “ÜU½µªá=›”jR‚ä²–RÓ™’JDvrË!š3Ë2I¶rc„-ò$>Ó7§×*Kß/ó¥%ÇØq—uIuå´ª; +,ô '=$ƒnJ‡4g– gqÄÏÚÓ¼>ÐpC){ Ü.’÷vZ¶¸Árô« 2Ú¼ôfÜq{›‘u(¤v.¶¸ÿqd©=âI /A!ÀPKºP ñ-蘺Ã&mê‘*;ÖFÃÓĸ/Ç ´K€8•8„‡%—rZ ’tž=êæG’œPÖzÒÌËJ…ÚÔå®âµJ}ªôµ£J? Pnk‰;]Ö„8N®õÂ5»7Ê5îø›njës0#ºn8ê7uË[N­­Ý ë2€àÒrR¸UÁÊÆ±E›9%«cÒvÑB ìJ†ôWP•êЭ!*Ò­*ÉYdtœSUCä» ÝðõÖ÷qºÇCL&í"æâv[LÔ©2R—H:ÆMñJ2QVª¾RB”­;Ͷ=ÚÚí¾S“eܵ*$Çbº2P#K)+OÇ"3ƒÀ‘Pfƒ*,èLM…%™Qd6—X}•…¶ê3J’¡À‚ ކ›Œpä,HÞ“pR.)Ò#¸¦·3-¡n„ìеeÜ¡J W ÌV.M0œ|‚í¸r<é“·HÍ4ãò$:浡´ ”%ůdƒ£0ÚN„ærüëwÌ|™ŒeÈŽüg¸]àݤ:¹.¥öWu;$²³p(Âg%©AH puѼJÓ‡qŽÄ7àZn }öRW’£¸Ú]@V‚¶”´„º€®m•$¸ñ—â‹&i‡/lÈ* 6ÄWd8 ‘©Ji*V”Ž*VY'†dUG“\|Ã×kbîÁTK¡ËL1%×W% 1†ÕhZBY!îT’¥8¬ó'9|{`¾Î½ÚoØ{pvd$FS%»µ!Õ°æ½m%JÍ+ŒÞh#JÒ¥¤ Iÿ›\ZRÝ‹lW B› I2˜ä39•o%‰ –kiò€Ó mšÏBŽZ†NR7»¤ -ªEÒé%1¡ÇN§\P'!ž@3$’@I É®b¸ÂȰƒp¡X¥ÙpíˆÙ —®Žµ%æ×¹ë{d#©!IÝU’6„+PÍHïU»Ye_°Ë <ËS“dbö{2ìy ¾„¯.:T¦‚I à{Õ­U4‘êÑ{”l Í­«Šî2vn<ã”Û¤*JØÔà[½ª4¤‚¢¤€äÎÏLy‘—æßŽûiq§[PRV… ÂðA:åQ°.…pN%ˆm ¼:ûÅØNÝ%l[mmAm„èÚº¤ö=’­hÀã‰W™è˜.Ì0æ²áàù-vö!JrÚl›J5eôg§:~?=þÄT~QpkíOu–à´^unFu q°½l•$Ó¯$æÖ¡¨ß Œ9}µâ ›j}ÇCªeÔ:ÃŒºÓ‰ï¡m¸”­ âJäAï\²%¸™6è›jAÃðY‹hX’û¢Z™“ ä)ä© 0·²•!½c7_|äo¼œØ.6H—WîÆ:f\ç Ke‰NIC)Dvc¡;g@[§C QZ€%J?ædmßùÞ mÇŶYªFŽnO\"¸¤Zäª3K,¥à•H ìRvkAȯ>é#¾@¬Ø[Úq,yoZ—3ð9;¬–åÁ~#­;³CšTÛÈBÇpâY¡ULM‚æ]qÜk¼<9†-Šf|YKÄ ¾¾Ê<ÛEl© e#JÒ‚ÉÍå <³È ÞOíØÆ"Ä“1 ®Ã-âjg Áº»%Æ–˜Ñ£†ÊW°A )zóÌé?NÚ¡qN(²a–˜rñ)ÖÌ‚ ÓlEvCŠ ” †’¥iHâ¥e’xfEMU;Ø/³¯v›öÜ™‰”ÄÉnÆmHul9¯[IR³Jã7šÒ´©i$RvÂÆùn/áT]#[û$µ®J™CO·åÆ+x$´ƒ!(-%K F”•u'!ÄV\=Œðíþâ«}²cë/¡/Cy€óAA%Æ”â@*HÔ‚¡Ýàäm;´¦d% aÍZöJI'NœÁÉ]ê …+ J\&5–Y”¦Ò_m—K¡ywIJÊRTÌR’G‡z³P)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPx›ýU7þÂÿÒj±Vy¿ÕSì/ý&«.?ÕÓ?D‘ûÕÆ©×ê韢HýŠêãAƒ°‡¦^u• 3S–_£³TüuÊÆÂ×wìá‹Åîá)›cM¨G$fµ¸´#VD!E@˜Šºá_é—¯ÓSþݪùǰòà^‘Ê·'íÉ÷í²¶»==×ýM¦¼¸÷³áx½·Ú5øcLh«žghÅåôÿLö?´êÕ>K­1u§þ§1þ]ÿ“ls„±óRE’T¶¦ÄÈʃ-½”†Aï(§ˆRNGºIRsg˜«†âÏŒ¾‘Õ_3áþ×P`Á1$¿Ø¼¶–ïýÃþ®ï«è×vþX¥Å‡ƒöÒ#y@ zôí¥‡G¸v[HRÙNYFY©(NcW¾ËæŸ7Þ˜ÎcøqöÿfÓìÞosLÜTO®bêVÅŸ}#ª›‹>2úGU|Îþ)¿œ(ĉX–êÌôÙž{ '²n·¿Îæ¥-£ {!–Î i~;N©Ò$WF±bË ¿– mf±âT_'®Õø¶Eâ-ºÝ¸¡ÛÃyÒPJ m:R€HH¯Dâ-âæKqgÆ_Hê¦âÏŒ¾‘Õ\Óþ.XºaÆ‘qœ{»w×ÆÔ­õæÛØ1\TfCN¸Ú¢¤Žö—Ps+.õZ ]ÅŸ}#ª›‹>2úGUmV•íË«6·œ²B…6xÓ²bdµFi}ÐÏS‰mœ“™ æ@3̽ş}#ª›‹>2úGUWy ‹®”8¢âÉeKu¦ö.••êh‘Qú)˜îóŽ#òïƒE¦ôÆ왆ÚâÊŒ¸©È–âÝIx9“ERRQ—ɺ¡©[$껋>2úGU7|eôŽªçüšYÚo” IpµÜñ¶kzQie©×Ù“›zJHrC >êÀÒKm2!HxV[®M¼aö/ÙV<<ó2Õ&[77`%*`2‚ócV­š¥--wœ[iIïÔ™¨µˆ¹§FÜYñ—Ò:©¸³ã/¤uWÏÖlIŠ^½ØÍúïp‹‹\zÆ–mFcŒí£:Ô35{˜7S›—·UÅ¢Ã`eŸ½Êüɰy?›&™1~*eI˜uˆŠ’Òdº’8¤¥‚êµ#,Çzµ1V‘šX÷|eôŽªn,øËéUóÊ1 ”Û ]1tè¸'~–˜wFñ €‡– ¶‰àm$%+rå³ àê˜B÷säîMÞg'ør]ý EáûTW'¥hФÈSI.Ÿ ê'‡ÑJû}DžâÏŒ¾‘ÕMÅŸ}#ª¾k‡Š1Okï»jÄ7îŽÙÒ¼Nq[ÆÕ)Rá!ÒRâJa-rã’4èa~Ž¿È]ÒÓ ÏT-³Ç¸­•Ií‚Eå‰* 4­£Ÿî”ßt HZ\wÉ‘˜ïƉÂ븳ã/¤uSqgÆ_Hê®CÊEåpùZ³Ä·bQ1ۜފ›ëÂBSˆ!»n€ÓÌ)5È+R‘©Â8¶Zü†Ýn²qâ­íbˆ˜¦v‡œ¹Üà_¹Gz^ÙÊòZvqV¤ï`É) ÿ»V"þ¿êL»6âÏŒ¾‘ÕMÅŸ}#ª¶«—òÝrnã±x¾Ê±áç™–©2Ù¹»)S”›µlÕ)ik¼âÛJO~³3QmD\º6âÏŒ¾‘ÕMÅŸ}#ª¸4\XļC‚í31œ˜8ùæ­ޢ̾n‘â…6ÊŒ!•%/<þjHHB”’æ­H ;ø,cÛãpq|u[£Ø¥Ér\»Û×Fu·¡ù­»±V”•½) ¹Ý'f ß»šùý¼[µn,øËéTÜYñ—Ò:«j••jî,øËéTÜYñ—Ò:«j”»‹>2úGU7|eôŽªÚ¥®âÏŒ¾‘ÕMÅŸ}#ª¶©A«¸³ã/¤uSqgÆ_Hê­ªPjî,øËéTÜYñ—Ò:«j¸dëê\n83]¦ZŒk2¥>Ü÷åî rl‘p,¡Å+`ãqŠZHN(îF@PvÅŸ}#ª›‹>2úGUS9»Cº[/ÍÛ$»6ÛòähSMíÛª%5°eÀâpjË7 TKZV¢ÊûA«¸³ã/¤uSqgÆ_Hê­ªäÜ¿ÝçÛ®y•Ü·Øœn[³\vüå·ŸFÄ2Ê¥¶•-:’·”œŠË`g5&ib-Ó÷|eôŽªn,øËéUóM§Ê“Ê B%Úl\½XÑÝ/ËräÄ7a[ÖãFÚ²[yhîÑõ«X*ug2Ž?PV¦)˜›jî,øËéTÜYñ—Ò:«j•«¸³ã/¤uSqgÆ_Hê­ªPjî,øËéTÜYñ—Ò:«j”»‹>2úGU7|eôŽªÚ¥®âÏŒ¾‘ÕMÅŸ}#ª¶©A«¸³ã/¤uSqgÆ_Hê­ªPjî,øËéTÜYñ—Ò:«j”»‹>2úGU7|eôŽªÚ¥®âÏŒ¾‘ÕMÅŸ}#ª¶©A«¸³ã/¤uSqgÆ_Hê­ªPjî,øËéTÜYñ—Ò:«j”»‹>2úGU7|eôŽªÚ¥®âÏŒ¾‘ÕMÅŸ}#ª¶©A«¸³ã/¤uSqgÆ_Hê­ªPjî,øËéTÜYñ—Ò:«j”»‹>2úGU7|eôŽªÚ¥®âÏŒ¾‘ÕMÅŸ}#ª¶©Aya Ú¥è*:˜^yÿôš¨UÓÿUIÿ°çúj—A‚ãý]3ôI±]\jqþ®™ú$Ø®®4°Ó­µ2ó´VYÍN\>®ÍRyBäcã+Ó·§d],×)/ÚÝJ7‚AKCˆZ ²á¨$(ä3'!VËWôË·é£ý»5¿Y×£N¸­QpßɯǫÞÑ3è€äÇ“ÜÉÜy °2òåËËz-eÙÞYô7f4Ó áöÚÛBÚ”Þ„ìæþO5ýÛk¶["Ü.3ÐëÈD©â#A¶ÖÓgå4/5©ÇÙB—t¥Ž"¤àˆµÿ{Î{7¸üç¸×+W(s l?zk³ÚõõÈ E’åÄ&[Š–PQ …%óVn…¨$™ÛÃ<¡C¾â O=ºWcìQ™Üæ’§Œä©r²ÓHIZ‚WÄŒ³+ édTœ“½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢ëšãR®ØTb~ÈaVe.ΛkуqS‹˜ÌÙŽFFaL§fàÙhÁÌ _M^ÞãóžãMî?9î5ÀËÜIn¾Ç™5†&^oÛ‹R›ŽÜ5¥mŠõ)Ñ0) úRYñÈuÌ7rìζÞ7GáïÑ“»¾.3­Z>… ò?â(\,{Ü~sÜi½Çç=Æ¢ê]¯6ˆbMªÓkM¶ãÒžsÙŽÚ9•hY$ŒòîBF“š‡ Ó4.[Ü~sÜi½Çç=Ƹm£–¦îXŠ-¹»M±¤I‘oa¼ev"\xïíD=—Û2Z¶œN£*ëÕf&&Ò›Ü~sÜi½Çç=Æ¢éQR›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”›Ü~sÜi½Çç=Æ¢éA)½Çç=Æ›Ü~sÜj.”1$”vsE¸Î«,ˆþé¨X;„í.“ òîŠRØÿ€)9ýMHÞ8zè̘Ž Õ#•nLpÇ)1à¿9ÕE™HÙ΋¤­ljÍMx)$RNzTs‚¤¨%1@‚â“-çÐìi(R] àww ¤ð÷ÿ­•P»Úí6,-ÉfŒÄ8qcIKÛþêDgs>sVeG2J³$“Vú -îo=ã..ÙAn!´´ TŸv…Á)ü¸Wæã3ϳýT…Z³¤³݈/w[äËe¶Í­ÇÔÃM¬!–ã¡Õ¬‚ÚÔ¢•ÀxC>ü ìo‚¢CŸ0ã›ä¦-ÑcLš¸V³(GbCKu§W²Œ­(-¶µ ue©9…£q™çÙþª?¦ã3Ï“ýT…P®_ðó1[‘/â8[XæCmL´˜ï-d±Ü´ä`²­¢Ð€GhÙ%¤›+k3’ê¡bɲRË«eÒÊ¢¬!Äœ”ƒ“\ ƒÄda b#ÊŒšX–ʘ’Ø·Ä yµ)kR69)%Nº¢\YþñÏuu¢k³Qt’™N¶†œ|GŒZTP’­–d$­dð+V]óZxÆC¸eVÅÈM‰:sœ•06qûí0Ñt,%e*[©&•$Ø;_ò†ëèGøTh³-]š‹¤”Êy´4ãâ<`âЂ¢„•l³!%k w†µeß5›q™çÙþª?­î×ßü¡ºúþFFi·ñTü8‹íðKƒ4×V[‹³(}o¡žzŒ¼ódS‘9œƒ.ã3ϳýT…MÆgŸgú¨ÿ ½^âG²ÚÞ¹ÜñEÕˆ¬­A¦I$%)JRÉR”I$I I¬i¦ïöçgC¾ßi©Òá(:ÜP­q¤9ddÙîJÚQNDfàò pa1 ÒLX±ÛKL0ÌxÈm¤$d”¥!¬€à¨yœžá¹—ôâ H¼%Ä:›ƒ¶˜K’Œ´(8XÕšt§#žc!—z­¯¿ùCuô#ü*v¾ÿå ×Ðð¨ àáˆPd¦$s1fDlY%$¶Œ™îPJtŽÈð ÞÜfyòªð«ÔÈ‘â\àÛÅTÌž\Ýš 0¢°„êZŽL÷),Ôr©#<ÔÍ Í-öT·n×Ȫ¸€‡DB¢²±¡µ *(qÏ% A*Í "†Ž-Ñm¢RÄ(›#0‡dÎȂքìrN‚””åøºFYeYæY—1Ìˤ™ àC±ã-!hPZ‘k¾•%*è ÄT§kïþPÝ}ÿ ´æDçØþ(º¦dòæìÐi…„'RÔrg¹Hf£ÍIæ h·‡#·q]ŹkD×5ÈL8¡ÕjKiVjØæsKMá  tešpa± ÒTh±ÛKL²ÌxÈChHÉ)JCYÞ©N×ßü¡ºúþa‘f–ÓÑ‹µñô¼éBÖØˆÀÐ¥k^¦Á)Í!=ÈQÍiá§R€Bœ%n-Cd©¸M¥¨ˆÜ"e [kJP6=È i¥2¶ƒßHËr=™qÝì{¤–\’æÕõ"ÏõQþbÂm7‰p­§Á¾ß‰u‚ÌÖóqC‰C¨ HP ’†y3úMIö¾ÿå ×Ðð¨4wž}Ÿê£ü*n3<û?ÕGøUêdHñ.pm⋪fO.n͘QXBu-G&{”–j9 Ô‘žjîv¾ÿå ×Ðð¨4wž}Ÿê£ü*n3<û?ÕGøU±"Í-§£!kãéyÒ…­±%¡JÖ½M‚SšB{£šÓÃN¥ ݯ¿ùCuô#ü* ÆgŸgú¨ÿ ›ŒÏ>ÏõQþov¾ÿå ×Ðð©Úûÿ”7_B? ÑÜfyöªð«NNbL…È“-o<æÇ[ŽCŠ¥+báqœÉg3¡d­>*‰##S]¯¿ùCuô#ü*à Í-öT·n×Ȫ¸€‡DB¢²±¡µ *(qÏ% A*Í "ÚÃŒ5rræÔµ·9ÍZä¦Pêµ%´«5ìs9†YÒ÷F_“ÑqŠóø¼å²±‘!¶JÂÊ’܆Osljú*oµ÷ÿ(n¾„…XœÂÉqô¾åêâ·R‚€²ÔbBNYú]ã•y¹?“ÚÜçphi¥|¡Ñ§OÈwHèÿß­ï_ZM¾ìù—© ?;ˆÚ§B’PÆKu}ð«X=†¶[;´ôì[-7“Q»”³Hù.÷ ýc²Â™S7{‚ –Ú)j0Г–`|—ø Ç0ÜwT꜔¥—¤·-Ò¨qN·Ûtü¤6Ø ìÚ™`ª×:ëaç²{%%[T6EÂR’r­¸¼¢[¤âˆvV¬·¢ÄÛ¤‹Tk™i¡É1Û}o |¦Ð˜î£2€ ‡ À$"¢1ÞìLg½õIreŸ~Âæ­Q“9™Ð§°$­Hik-© RBŠB¶ZurÏ<ŽYU”îOq0ž›†ç‡•*M™¸IrL·T«  §¹p”ùEü¢Fd2Nž ‘ ×+ð‚ÙÅëÂx†%¥ö¢¾ÃóŸ·ÃK­>…©+ zRÜè‚ ®í!I:ª2_ü@àö ³>=ªû>#Õ-OÄDu¶ÚRfëIVئÝ-Y£RHliRµ$odíHK—#ؾW(+ì ŠÄÔÇ®!Rí4ÃëjLi ¶¥†â¡Õº‡\ed®BÒ¥$¬.<’`yø[Þ®’,˜jÇ}ºV¡Y_qÆÃŒ.R–âµ´ÞE{tœÂ³$÷J½^áI¸ZÞ‡í6Ðóšt̆†Tëy(¤<…£ˆÒx–G")xWHc’, }»Çz½_íЂ„ÓIzd§"í—RÚ;”:³™J@IÿQwMâ\ûÖ.³2ûlVÒn¨­9I–“¥†ôçž”wN’@îÃ$’²¡Íä~Rá‰ÙûUýû½ñùWxú÷jgìP•d (\˜Ë(Ì$)µIȪGrã…l0!Ü.°gÄ…!m~TVÃŒ¼ã/4YrB^qh[j4‡ᤨð¯8¯•¡_¬ëf5ÎyŸétu†Œi Ä9ÇÛGt]Çt'=š‚J†`¦ª»Þ»¾÷•;ò!}¼XæDnÂ683bÛCʈÛé·\#¢^¢ÊHyOKŽ£’s `KPþbnCq$¤ÆEºt#2ç"$æ70äù2q‡ƒ%M¸y¦Él6S²)@ ®¸{–ü)ˆcº,®€’Ìfmð߇!×ÖêqVÛêe=Äw”BÜIHlê4çdäž÷pÄ8AË¥ÏlUÞèÂPóiBÚi«„†šmA<3KhBO=9’Ndêfm˜ŠŠ`âë‰ñ,¶mᘫ·E‚XÞÊ %:;$•©õêͤ!””êU ¬>ûÈœ+ ¦Ág†Òq Â|{}ÞÜÓA¨nM–¶Cm½äÇ^ÍÖÈÔÊŠRTœ’Nc±_äO‰b¸KµA ƒ1\r,BàlHt$”7¨ðN¥3=ì딹Ên*·áÇä¿mjñvjëiŠì-NÛžŽÜ¹A¥jnSà,é º…”—t”,‰Å|×â‚O#³µØöÉoáû¤”Á‘ ,ÙrY ¦Iu©Q .†že%) €c $éáVÞR,›®å2í&Üó³¤áéÖ«$6†ÕÂÆî²JRŒû·9éJPÈ (R÷•«&ÜU‰í“míJˆ™K[³­éSým–Õ$8êÑ—Ê0TjQXè9‰î¶~ÄW'-o˜Ò$Çn8cmº"R [É9©.%@QH!Eï~ß¹=ïvSÉUÊM®õë~´Ã¹O³8«u¾CªŽâ!ÍKò$)E´ûÍ÷$x¶ŒÖs*\%†m|¤`¸gµMªl‰.ÌiR ȳÁhIÑ !ôÀVcV­ djÍÉ'¹ãN¬˜ŽïezÓ.tZ[Ù¼VÊ]h!Çh•!d,Ý$}1ü¦r§`äös âï7Ö6æX› H…Ó¯¡÷Ï&Û^y€39n÷8ÃWá Î+µcÕIC1g]mlVD¾æhe…4 ]QF­;WU©Yft6ÖcP"©ÑyºÛŸ¹*$L5.ÞýÁÍ™÷n$æÓ.æ´4þM(–fCÓܬjŠ–”¤›&,åI¨WÛ:Øt‡‡ãÞ'Ǻ]a£Cq NqöÑÝAC±Ç Ô[PIPÏ29M—â7‹ …o‡È#ZÜR‹ófÊ­:!AY1À¯1¡]ÈV`ÈœTw»®ÓsÞì­áÞG1E²R§ªáhBZR]nÌÛ«T d\®2ƒO•7¯J[šÞ‚3ÉÄ•) NwW„/8®ÕU% Åu´I±Yû™¡–ÒuE´í]V¥e™ÐÛY@ŠÔÅ|¸a<(äHøšÆÏ5èê”ü9Diø¬‡VÐp¤¿ò –ÖBX.¨€\F{ŸózÄq]Ó¦ÑwSöÄÉT…늠¥–ã—·—Ó’JY!Z’GruR&¶õïØ˜§½ÝM‹ÈµÖÜýÉQ"a©v÷î–lϸãq'6™w5¡§òi@³2žåcTPœ´¥$°ï#˜¢Ù)SÕp´!-).·fmÕª².WA§Ê›×¥-ÍoAäâJ”…„'>Éÿ(ðq´)’¬öYúb<ÃKI›Õü¢²*!™+(ОíI^•þ*V®æ®ôÚm7R$áÛ•âf,¹ÜἸNÚm1•0³¦6ƒ©{VÂÔÊžpæTTÛ'N¤‘\Æ'"xŠ>¸ZÚ³àfÄ™Ñ_DgcD}Z[CéQ2 ´$¯7S¤¹Ò‘µ¾S4Úq¯)xƒâ‰ÌÏdñ§JÝ‘l•IiˆŽHADÇNÆJÔ”©¦’J5(’Cj¬R9CÆ0n Ã3Qgrôó±ö3YµÊØ4ÚÛœ·¬ºò“Øç‚ »FÔâ¬ßm?×k•.ü?b‰Ö`ÄÉÖSY·¿3ï8¬Û³%4²”¡s­êÉ HIŽ­) ¶òk/-cb7¬Ö»J#â;ä—fêu7 Ì;*b[aİùD>•k éA •S¹XÅ(µÜf1Ò…áØeÞc>êf$ÍeHaIPÂ…¹õ¹¬fãHâNg¶Õ¹fœvëɶ,¹ò/aÀÏʶG~Àäf’bé†6I£8†Ê‰ (-<[NDçškwŽDñ ë=Š ·X_—o†¶7‹­Í«ƒ,ê’ë"3–ÀÚ´³Μ›ÌÒ³ô5*F™·,å"ÁyºàîS.ÒmÏ;:Nj²Chm\,në$¥(Ï»yÓž‘Ä¥ ‚ ŽJ®Rmw¨/[ðõ¦Ê}™Å[­òTwj_‘!J-¤‡Þo¹ Å´f³™PìT¤ME$Å͹†(ÁH7ÜîÂ8E»~—"cÍÅÈŽ'xfKo0ÚQІʞmÂB²%°‘Tÿ’ÁŠçÞáÜ­vÉ$Ïw~Š¥ï- *¼÷c¹¬ ÖòF¡™Œx÷*ïT§¢Äæß<ÁäO1….Vy6û\Íæ\GÁ¾4ÌbZCáN©¦íIh¬íš\mÝy$•ÒuužKìWl-„m~dk2Q©õÛЖÚÔö¦Ò†›e¶ÕšV­k¼ÔœÂ;³¢ÛJZ8“’;í“”Uc8MØ’›”ÉÁ%÷SÛg/ Ð¥†•§P›o 9+ú:¸+f[–~Oñzy1‘‚×l¶"‹»³m’­ÓÞx[ìפêi½Ý —K‰C`*ÈêÒžá]Š”˜¼IAàSö<j´J‹3ñ#†œD-L•úÒV»£ÝYœÔsRtg)J³76DQJR R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” ŠÆ?ÙÏèþÍU†³cìçôÿfªÃA£ ×ùlÅ6K£Ä ƒË‹)­jNѧ"4•§4Fi$f> œ¼Úà^!·âÆÝ–ä±))Ö¤äë!敚H=Ë¡YwŽYÁ"¨˜ö$©ü“rŸ g¥K“nšË 2Ù[Ž­Vô¡)T¢H$šå¸Ó“Ãa²r‘m½Áºã5OÃ#Øž6¦–æ4ÍÉ–ØB\Ðâ*{4ä·u ï{ù;¾(ÀøcNDÛÕ½ÇÞK!…ìå¼Ê_h(¨4ò[ZRóy’t8ž'‡P òhÚ9Qc&àË¢Ërt{{ >ŸÂ޶\qeO©žëjâ‰m–ÔIN¥+"MCÚ-r†^ ÁW¸~3EWx‘ìÏ@@ßUFSIR–\ {FœËhte”€U}²Ûñ{xÚD´Jz/¼]‰p’™N¼£«%³Í„d âÆžä6Ùï4í>÷ŸäëåÞð™°Ì¬/hÃK‚ûVÛ0d[Skì»dÙi!aÀB Nz³ œóÌÔ[œ“r~äGb¹aRÚy¶àTÙ©.‰ÌμøöFgÿÊÿåF™.S]Ä a@0Ãïǹ;r·°f0}M2äÖPúôA eNOxsf(øÎõŽðŒMmjV#ÄR׆Tæ›Æ—Ôns ƒ›¶iPA†X ^ƒ¥9•zª¨ä÷ #¢ÀˆsQojH• ¹É ˆàN‘»¹´ÖÂBs-¤ Ôs­a÷ù@MþÏp¸\î’!ÍÄ·k|«s–ÖÔh-ªqŠþ¤¶ìc¤-JÒ¤ºžJ =>”Z‘?’|6æõžB#˜K€ê¹JdHajqjCÚlÔëŠÍÍGRÔ¬ó$ÖÓü›àÇïJ»¿hS¯©÷¤—-åFÚ<Ó<½Ü¯d ÐëGGu«3™ÈÕ¶”œ—Jü¸ÂÆ\MíæTóo6^¿Nuqœl(%L-O0rZÙæG1Â¥pæ³aرâYØ‘<}ä¶ÖøòÐU!í³ªPRˆZ‹™¥fS©A$fiA†|Xóàȃ1¤½CJiæÕÞZ2P?àA5Xg“œ$ݶášú.%ƒ%éIOHVÁzÙÒúÜ.£f¾éT4’HÈÕ¶” Aɶ¿6v…>NvÑku]––…IŠ€mõ%Ð^ËZΧ5+5ždš±[­p-ó.Rá±²zç$J˜­j;GC-²‘9“e´ä2Î}òIÝ¥FÖœ-j«#RY„•êm—f<úYBBÚ)[6ÀHÉ´ä‘Ç 35‹¹?˜®SÒo$¼äˆFÂDt¿ëù7ÒÒH.,@é*$djÓJ ”žM°\›Êî²- yå¼óêis1¶4ãO+w+Ù´:àQÓÝjÌær4¶rq„-áý…¾[ЏKurnRd-FåøÃSŽ(€Û„ÈŽä‚[iJ-‰0}Žÿ5¹Ó“qbZ oû¤˜.©°IR㸂´‚T@Q ²ÌÖ«Ø?wví ÞŸ–µ<¤-ÛìÕ¦2Bе0’ö–¥Å¤) ’rIi¥ ÕË °YŒ•ÁMп)l)ù2.òäHp0²¶]qÅ/f Wq«I X …()AXV‹½¹wzÜì‰ SÊÙH˜û±§’¤º¤GRËHRÒµ…¤¬û浘äÓ1izÚݶVÍ×Zx¼«”•IBš5¢AsjØ@$$!@$)@d ÎáJ ŒžM0L† GrË“0Zض†å<„ºÞ½¡CÁ+t•æ¢Ö ‰'‰$Û©J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J¬cý‘¼þ€ÿìÕXk61þÈÞ@öj¬4j½ÅÃX{â9ͼäKQvkèdâÔ6– HY$å™?¤V\5àÝo,w tì=x`³”›‘öއRòѳ,ºâJc¼t…jµãZ—mCaët캃¼lõì¶°›F½9YjÏ,ÆywÅFÉ䦺äÕÇ? 9s7ñn ‚‡ÒĈî,²…·ÿQ©N•'‹hW<Ö-31®‡!1æbÛ w”îÅ-»qi .mk@YêÚ4ê2ïêmc¾’hx§ M¼ªËÙäÝ´ÎS[[ãf²…ü˜V®åIRO$"¨PùÑbÆfb¥K͉6åKìpIŒ§åÜ$©Àg<•< §þˆ9÷Y&a®O‡Ú»mÖ+3íø†é}m÷`kKŽLLД-)q$„ohÌêA;@¤&áã,8¬8Æ ™ˆðë6Ù/¼Üi­][r+ÉBœ#K§JJ¶m)JHÏAJÆj Ô}ÍÆø2s¦bëh“›S±väÊ„ŒÔ¤(«%8’3ª¸k“«ÜEÚÄv››¬E*üÊ#Y—©Ù)š\BŠä82L A†€:е w(¼˜bH¶{½³ !W'14;Œ‹\(û­?2L–»§$!mi3’¦Ðö Ð:Bh;Õ)ZInëØ¸Íªl#=;åñA§2RvºÚfI ÍjÐH'^D(7iXV™FsKC̈¥‡Z-â–Jt(/VIH`¤¤’T’ t¬Ô R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R”XÇû#yýÿÙª°Ölcý‘¼þ€ÿìÕXh?0¯ô›×ééÿnÍNUvÇ.,±éÒY‹4²óï¼àCm!1Y*Z”x% I<­u¿òqe³Ç·Ý/XNÛl„"#É•¦Ë7"éJˆJè7–_ô‰Oâð ]Fâ«Ä|=†.·ùm:ì{d'¦:††kRAY I!<+B6$Á7ˆ#_°ô´± Å·pnc+ ÆS.à<.2Žy6➥+ABÒ• ˆ#0EIÙc|¸Ä~P1DnQgÄ—g€¹÷Vx¶ër/ÅÈ(uÓsyN©í—pTÛ-¨¨¡°5“[+åŠè»eæã Gz=‚Ô«•ÙK»éЖäÍaä3“JÚ`­H'@XPÌ ä õœÙ·J¶³ƒ0ãpf 1‘ld4øB”¤…¤'%d¥¬ŒûÅDý&·›Ã¸}¸OÁnÅkDYÓæ°Û‘“¯K NYÆÑÌx jáÄÕE/ ò¡"ùÊ#øj6ºv9©Ò­ææ#JÐÛ±õëSŠ,eM”¤¥å(•#4ŒÎ]"¡ÎÂç§7g7ÔrÜ[Þ“šJNé×ø¤§¿Þ$wªJ¸³àÇK2¢Ii/0û.¶ê3JÒ¡ÁI ‚àA§îÍJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJR‚+ÿdo? ?û5VÍŒ²7ŸÐýš« cZçß94åÉkcxŸp‡.,Vµ¥;G\€ÚPœÔ@¨™ xj}äÎå…m£Û0‚ó}gሶ¨g|ŠÛÉn{A*.¸Þ–ZiqP2ÍDøä,Žq¾ö¯„1Æ&Ýw¾Ä!ùÛ¾ÓF×e µèÕ‘Óžœ³ÈåŸxÔNårÓ:ßyŸ{rÌÄRá¡w-ÉwXN®K…¦ÛK¨e¸=Èqœ‰É51ý«bˆ½ÅÁò"v[ëðçÈ·•”–Žé›O)¿Åkx«N¶ã‚&ÅeÂW8˜ÚEü\µA[ï-V»zÜ[S õdëÚ΄¬“¬ì›Bµ~3‹ÿÙ¨`¨ìG~EÊc(yµº­¥®RU´º¦”¹ -çhZu:;“Ç…n3°«Ø¬6ÕÁåÜ–ä&²„þÅÇÛmn8Ú_Ѳ*J[^ Ü‘‘È)ŠŽ÷¹&3–>P¬×[ܼ1 «”h»-˺àÎTU˜»”¤€T…%D”ÀÉÙÊ–ºZEÖÖíî᥅¥q0ô÷ŠÐòV¦Ö”¡’¥ ìÖ €!*TA {—,<Û¶{ÝõÔm#ï‹t•h@SéV½- I‹'RU’’p¨’jÄOͣɋ$ò›tUÉ«â0Œ¤Hj2Q|([.©¶Ò·ˆBÂÒÚÆ ÒR¢¦”½)Ö’Þ÷ v¸c“+]‚åk»[æÀa¨Òë–ø—œm–Ч;W6l“¥¿“Ó‘ù4çÆá{nêõ­æì“aBžt쟙RZGt3ÔÚ\l«4æK²5Œ9ŽâJð¶0Ä«LwïVèoaÅuå9!æC…¶Z@[‹þñ G$’{ÄÔÚ"ŠéJ§Èå/1<õ˹²^ßQg˜¸¬¥+R¶y-Ù)R—’Œ» *?òe…ŠìöXsSn]$DºÉ~+Éa†Ù…)÷4>@h­ a`)ZAP !8ÜŒìèªz9KÁË‚ì­þjKn´Öì»T¤ÊqN…öqËa׃nP’BÈ9$å·Éž$wae^œKIJ®wÌìÛRi‰¯°ÚŠUÄ(¡´•g—xð -+Jÿp6›Âè˜rgq\#FF·žÐ’­OÒ£–@}$ŠæÍrÄÛXQw鶘rP.-û;$çneKÉmAÔ¶Àq·“«B‘’ÔP„¨©`PujU^ópí¸ÎÜÅæ,wâ¢^ð»݃ +>/;²ÐÁIt¥Iþðù+áxø†n2§½r„¥"C1­rŸXŽ$èÔÛe%e£©)•qJAP"‚ÓJ¬ò_Œ#c¬lÄÑàM¾Fi×#ÉŒó{5­¤,¥ qÛ kÈ:€P¬ŽG¿–\OŒì8jPbò«œtlvË”‹L§b2ŒÈ*rB-7–’Nµ †Dä4W?Ä\§Ù`â«=šÖËkºH‹u’üW’à ³ Sî>@h­ a`)ZAP # .UìN^ïÎÊì\?lku2¶ÊeòüÉ2X -­e¶Æ’—vNdw››:5*œÿ)¸2ÞÚ”²YCMŽ• 6µ£åRâˆYÌžEÄÇ«‡)·Lm„0‰œõÃyÄ<ò[lˆàkJVã%zÝ _t’“´-ìíâ}ë’K$‹®$~¸3†e9*Ft0Þ¶$•:â•!*$­GA%C¸OÓ7©>0‰ÄüàìE¸w)×gP˜¯°âÜLW–âÞuל|Y^ÉâãË^¶¶y ‚”€&n\“Øn3Vg]/OÚ•.dÎéæÄ@ì¶d5 Œ›Úä±)åe´à¥w9 Áè¥Bܹƒ‘l;bŠãv‹¤ë|)™qeÂnŠôWC­‚ 1R—sCƒœrÈ’M¿áv°Å½ˆî×)1Ûvcî&QiE÷dÈ2âÔiR–¤’Π¢Dý*£ øâdë̇ÚSeÆ\(q†Y¥CŠT3àGxÕ-|šB~-Ô\1& Ÿp¸ª•ryqÃìnoãlÂK]Ä«ºBµgÝf*õJkÊ/#Xwl‰.—IN·lìsŽ©˜kSƒ%|°Öƒ/f¢­l†ó! Œ’»Ù¬‘-WÜøî<§o3“6@p‚”­1ÙŽ2$èaŽg2®9d( °&oáÈö×[…ÂD¥¨bnȪ3 BP†R[B5!!< õ/‰ÍG†UŽTù Ã<£N2¯Òg$˜ ‚PÛqœJRJÈZ6̸Zp“­²‚rHVa WD¥ sëŸ$ö+”Åï·[Û֥˛/±æ„T»-™ H †ö¹,JyYkà¥w9 ÁÏ“8!ùRnX“]åJ]­K~cŒjß-R˜HÙ´‘‘ZˆV`•¤+5Õ)Dͨ£òM…ñÕí‹ÝÍ;‹Q„]¿cáKÔÒT¥%:e°òS’–³šBIω9 ¼½ÉU­ìe#9{¹›‚@eÄC·¶cí›[yjL`·BR¾å/)Äæ”•tPµ#rolÁ¢â»EÖzd\^Žä—„hlVU§fËhk R½ÊO””ÝéJ Uã“‹eîî©—ÛÅæéo;d—ZÝÙÞq—t©-‡H(uÄ„©Å%!\Èe®ŽL l”ûØ—ȼ‡c¹òëÌq¶ u %5²) }ðu¡E[Uê$œÅö”öO$–a"wKÜvŒ¸—D·!¿üY¥¼ãËL‚¤Ý8óÊ%½™ùU€@9WB¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥("±öFóúÿ³Ua¬ØÇû#yýÿÙª°Ðhº@±Û1MîèþïÞòåJwB•³i¸)jÉ “’A9O‚´§r¯€âCŸ0Þ”ź,i“W Ý&PŽÄ†–ëN¯dÚ´ ¶ÚÔTx$iÕ–¤ç†ÿd•‰p(r Œ·.ëL&ñ!´­Ø-¡%DBsPÏ N_AªÆ&ä¦u¾9€mv6#b»6¥"eÅö¶ ÊpqìÃN•‰,% Œ†”‚€”‚ï{ýཹ°»1[‘.Tè[XæCmL¶IŽòѶKËN6U´Z¨í d´“`…6亨RãÉK.­—K.„8“’rï(Aˆ5ϱ~Æx¦M‚í!«²m{ë[–ä––HSªa ±˜Fan…e›I*…‚XN8^09NÜ\K(ŠÂc6 ¥)wOvù ?üEêî’„²FÙï<“¿{Ú[)UNP°‹8º^nlxr­ÖÛ²æN$—Ú0¥0‘ îÞA)V@¤+<ûÇ“b~Cñ4´DnÂâD3… [Œ˜ ®t‡Ø[¹ J›p2ë-ü˜l§bR€Е¥bº@¾Xà^íoï.›•Ý Nѧ…d Í$ˆÃTœŸM_)·KýÒ•a¸¢C ¶¯h½˜q¶Ð·ô©;58ðIC‰Òœ”Is\¯"XEì€!á¹{½èiCKvÔ¢S<¡¤ Êt›!åèî‡wÞÚ¾‡.Ô¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥("±öFóúÿ³Ua¬ØÇû#yýÿÙª°ÐW¯÷¹Xkrˆà¶Ë’íQäÍa[RÚ‚ÚÒ§4Œò åôŠ£Èå;”gì˜ê`²[0ì¬+a‹vK;{Ïgc/y@æÊQ¶ŒPÛœAJJ²PZHép­p/–ÌSdº1¼@¸<¸²šÖ¤ír#IZsIf’F`ƒà¯x³áœS¿vf,ÕöB3Q&n×)1w†Ûéi{©„½šOjÒœ‚»‹ñN/²°õ¦\¬=p|srjJ"9¶¤—““ŠiO¬–ƒJ#-y—R„æ6É œ…YV8^m\\S Šú$¶Z©*wOvÁ)üD%:Ž”­g,ò9€0»Ñ\IÓ‚#¨veÎL‡Ùx?ܺãŠXVÑ(PXV¡³l’‚(PRêaD/:· ¶âÎjY˾¢I$ž$Ò6Ï{øàûÞÚ'bv0е!v»•ÎMÖiƒ<¶V§C?Çh´$ ,,fN@‘žC2(·Î_°-‘¸†ë¾CyÖÝrLiÆiè‰jC±ÜÔ•¼ ¤:Ë©ÒÆÕGF`SŸK¸Úà\&[eÌcjõ²I• ZÔ6n–\d« r?&ó‰Èæ;¬ûà/“¬(úµ·ãÒëî©ë}Þ\7V^}ÇÜ [.¥JIu×IJJÎéÆñ׉®j5†õ&ë—$8Âe!M‚ÒÒµ¸“ªÍ̃© Õ¤!D~rA‰îxÇ“«&#»Ù^´Ë‡Ö…–öo²…—ZqÂ%GHY wINì<†âbw1<{qEåÕ¸·foÖ”%IVjî‘“hÉ4§H)ÖÆÖœ-j«#RY„•êm—f<úYBBÚ)[6ÀHÉ´ä‘Ç 34â½)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J¬cý‘¼þ€ÿìÕXk61þÈÞ@öj¬4˜WúMëôôÿ·f§* ÿI½~žŸöìÔ唥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥V1þÈÞ@öj¬5›ÿdo? ?û5VÌ+ý&õúzÛ³S•LŠ1?dn€6}’®ü״صøº8iÓ§¿Ç<ÿ¶¾q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ´Òªß8ž-Ðý>q<8[¡ú M*­ó‰áÂÝÓçÃ…º ”Æ?ÙÏèþÍU†¡/ã›À\NÜ·g7€{i³Òuhφ¬³Ë>ÔÝ H¼þœ?Û³Su …¿¤^NíÙ©º)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J¼_ý“¼~‚ÿìÕX+>/þÉÞ?Aöj¬ öVå1[µ£ðwΩ06ËWÉ¡yêÖ2ÞY…xísêøwìæT§ú}ßôÄþÁª‘ ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2®}_ýüʱR‚»ÚçÕðïØÿ̧kŸWÿcÿ2¬T ®ö¹õ|;ö?ó)ÚçÕðïØÿÌ«(+½®}_ýüÊv¹õ|;ö?ó*ÅJ ïkŸWÿcÿ2²Œ,¢ØaÎ?þüʯsf±‘ «. B3[Š=ä¤}*>ÿ¶t[­¡ˆÜ^k €ÂJҞƆÊÔPJT\üc—üYꩊTãÖû‚æÂgˆkQa++kE$‚Ià§Ɉ@ ítª…=©r^…63hàqIz2œ!A Gž$}ýØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+ø´ØÞüãnöüZR±½ùÆÝì+øµ®»}és÷Õ]a’ÑmŒà¨†3 2Ô~’sïeÞáJPxnÑrM©ëa¸Ã,HJ’úÄ5m\*)EEÚ„ƒþYp©ÊRƒÿÙmdk-1.2.9/doc/img/ss_mix.txt0000644000175000017500000000250210770465100012602 00000000000000|-----------------------------------------------------------| | Menu | |-----------------------------------------------------------| | | | | | | | | | MIXVM / MIXAL / Devices | | | | | | | | | | | | | |-----------------------------------------------------------| | | | Command output | | | | | | | |-----------------------------------------------------------| | Command prompt | |-----------------------------------------------------------| | Status bar | |-----------------------------------------------------------| mdk-1.2.9/doc/img/ss_devform.jpg0000644000175000017500000001552310770465100013417 00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀŒ@"ÿÄÿÄH !1TU“•ÒÓ”"#AVt´36Qa²25BSq³$%4u‘ÂÑáDd±ÿÄÿÄ&!1QðA"qÁÑáÿÚ ?ýaJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJU-çVé[-Ñ›UãSYm×ÐÌYsÚi×IIB” ¤ŒÖì º¥+Æt–áÂ~[ÉyM°ÚœZYen¸BFHJ –yrJA$òšjR” R” .c1–†Ü-Å‚R†X[ª c'àdsýâ¤W„OÖÈ“þ£JRJRJR\ïSG¾E×·ÉqôLGo»X`ÂI"¢8q§¦©hx:à^Éæ”/¬òÈÅtJT³sT—N¬4JPmúfÝb»\l°F„§-¤S5±²·Ô•ÌŠ‡ €æõ<ŽP3ÎßWiþ’¤MkµÎœ-̸ͲJj廑"\†–c)[@¥ 8·”’¢3êÎ:å+[çi®4äw‹&¿v>«n/_¤8ê ]uÚ·*!’…%†£Ò[{p 6öv‚Žômf´½ ÁÔÖý3)P»™‘ñËTtOÙ+m’„a!B\¥-;[g+t«$Œ„çoJ“†­ÙJRˆW„OÖÈ“þ£ïQ¤Å[’Z’ÄÇâ>Ú€ãA”¨¤BÒ¡Ö”ý™åA¤¥f·7?¼7 ?µMÍÏï ÇÂíPiiY­ÍÏï ÇÂíSssûÃqð£ûTZVkssûÃqð£ûTÜÜþðÜ|(þÕ–•šÜÜþðÜ|(þÕ77?¼7 ?µA¥¥f·7?¼7 ?µMÍÏï ÇÂíPiiY­ÍÏï ÇÂíSssûÃqð£ûTZVkssûÃqð£ûTÜÜþðÜ|(þÕ–•šÜÜþðÜ|(þÕ77?¼7 ?µA¥¥f·7?¼7 ?µMÍÏï ÇÂíPik¡ÿI¨ç’í©››ŸÞ…Ú¨P¡Ïµ.R`¥™ËxÈpÈ|´°ê€ 9J à0söc¥NtoI–Èp5m³âÑ JdGu· n£ h  ÙPûFÂ’•'O,H6ö ÁŒÌX±ÛKL0Êi JR‘È$«÷÷®îæ öi¿¼÷t0_³@¶X]ÿ˳Sê²;ÌüKÒK{é/oV–É)F”‚yžHð2sÈuTÊ)J)J)J)\úÿ«oqú[gKEÌ{zaA’æ4ìÉî:_‘!µ¤¾ÊÃq€K ÂÝIR0’(: +yéVÉiEÂL«Mï‡CøæÑ=,¶Y”ô6ÝqöZúͽ°x´¥¶ _Õߤ薥L´¦¥l[íȺ\j9øH‹qôWõß²:×°¥ì‘ôr”†ö•†›Òe²ßîýÒÏr¶?ln;Ê=øq”óO­imÄ-ÇÃ@Ó¿EkB†Á9À5Ýô ½k¬dB´éù˰ðøò¸ï#¡Å;-· Ê_QR6ãnÒ[J¾’IØ(Y•JRJTÃlF‹EK|2:Ò0THýøIâh'R¿:iΙ`Jé2ͦޱÆKw©HŽË‘Âd}àú-Ò¿¤y¤©;Á'íýlyÇ¡‚ñÖÖ¶– 0¤, ‘þ%9ÿ: 4®<çKómóXféoŒ¦áÄ–‹ÃŒ¥CbkfVé-‚£„,@“Èäýc8<ùÜ+¥hv«3’µ¢çþÈĤ?:+%L†ËŽJa€§K€§pøIX ;²Ï]'<ùç÷;—‹«çŸÅí]&•ÌzKée¯E_ͪÁ~{`“qÉf:¸jpòc¼ð.¥4¥¤-@$í¥8"ºu”¨w™Æ·8ã8Þ©Hm²F@RÔùf‚e+äm1iK’#HO¸²\ÏîWXÿ,Th%hrT7Sªˆùh8®µ$¥+N~ýàÐJ¥s-E«µ}½ÝozŒ»–M'$%È.CtJÒaG”âƒáݯ®PJwD}“Ï5azégHÚz@oEJ®$©1⬇˜·ŸÙÝ#v§ËÎÚ>’RF×20pÚW6ºt§l`‰ªµjX–UdD}-E(º2ˆ2¤’”— ‰FÄr¡´QQkû%u&ãÒŒKwøÝ%ªáqS>vÓ1þ¢¶ñ%_]ýªwè ¹ô”R‡@¥rŽ”z\¶YZÔúnÛ ÇÔ1lóŸ!a¼û0Ü›!Õ:…~•¤¤”ã'#=^Uæ8¸^ߊûÒÄxÍ8”2òšÊ–§$¤‚p03Žg¯–,*-»õ–àãôßýåÇÌdzéÀ`yqóºåÚvìbôÑÃ_ÔŽ^¤Ì¸ÌIe‹ÃáÈM%­ ¿oPÝ!¤„„%ô”©jÝŸ¤k7¥Ýq¨àºÊdY4¹‰. É›å²d[ÚMÆ3n6óMN/Â\*un6Êv´àR»?BðÞ\|ÆG®¾*ÇoJr\¸ùŒ]eúBÖÿÍŽ ß[»[dÉðíG¸5 „êÖ²æ”ÒÒ’•l•H m,Ê´–¨—¬zUÒ·ùñ›)×c0ëmà'i–õ;$€°3»ÎÖp®²ÚÐV‡'E.¸â#Hl¸­¥–мyœ‘“Ïg=u> [?¬.ÿ‹GåÙ©ô R” R” R” †Õ² W©7–ØÄéQ™Šó»júM4§TÚqœ œ9'kžp12”+‡G6|«„‰v•»Ä‰ †~½ må¡ ½†ÜZT §£´yó5kvÓ6K¯øø[î3nM²Ö­;èÉßa¾DlþÞiÁú]|†.)AÔZ+Mßçª}Ê꘠ÀX˜ôwQ¹ßnÊÒÒPGľ2’ r0Bi‹%Ê=ÂÕTI %Ô‚‹„—CŽºêƒ©+ÙwëyCx²VJqÊ´Ô R” WŒ¶7í•–ÜB‚Ûp ”(uý}£"½©A‰·ôw¦ j÷u\%a‡}qEJ¹¶\R‚Z’Éú W3Ï'üëc„FކÎÊ2NIýçö“×^´ ÏIÑ:ZJç­û;+UÂàÅÊQ+WÖHcwº__,n‘ôFyä¥fã>UÂD»JÝâ ÈD†ŒÇÃ?^…6òÐÐ^Ãn-*PSˆ QÚ<ùšÖÒ’k¡¦kWè]/«Zï°}NET7·3¾aYËnn–âAQ +;$’0yÖ–” W”¦&:Øs;+È8#÷ØG]zÒƒÉ3¯ˆ@gbÄ |B”¤Ÿñ-‚ÁCü«äF7 ¥—ZŠÜpŒ¨õŸý}ƒ½©A–ŸÑþ•Ÿ{•w™ [ÏL}¹XUÆO¼ê„%k¼Ü¨„´ØÉGöEK™¤l’µoÅãÏÞ6㊉r“·ÔŒl—[iÄ¡ÜÓJ²yr«êPcèËE»ozÚí²S.W)%†wŒ<ÂÃM—6YInCÉÃa#錥$\Ý´Í’ëÅþ>ûŒÛ“lŸõ«Nú2wØo‘?§wšp~—_!‹ŠPcnh›ƒòÝ™j’êe¹%×Y7!¹ :ÓêKAÍ„)h}ÐJ@$«=`²¥([ñ±m×ù/N}¨Í¿”´·T…) whmYiåÖs˨Օ(+§Ýìsa?ëÜ4¶ûjmjfâp •¡AHW>JI`ƒT[NŽ´\Ù¸ÄÔ·'kke2õ|ÉM¤¤í4ì…!\,¤ààŽ`ØR‚ó‚Ïß6ß›oÿ5ñWû2† æÛómÿæ¦Ò‚ºÊ´>õÆSJÛaéAM8:–Óh$~Ñ´•sê8ÈåV4¥”¥”¥• T)/>§»ÍŽ“Œ6Ú)O/³i²êkˇLïû—‡Ú ²¥VðéÿrðãûTáÓ;þåáÇö¨,©U¼:gܼ8þÕ8tÎÿ¹xqýª *Uo™ß÷/?µN3¿î^j‚Ê•[æwýËÃíS‡Lïû—‡Ú ²¥VðéÿrðãûTáÓ;þåáÇö¨,©U¼:gܼ8þÕ8tÎÿ¹xqýª *Uo™ß÷/?µN3¿î^j‚Ê•[æwýËÃíS‡Lïû—‡Ú ²¥VðéÿrðãûTáÓ;þåáÇö¨,©U¼:gܼ8þÕ8tÎÿ¹xqýª *Uo™ß÷/?µN3¿î^j‚Ê•[æwýËÃíS‡Lïû—‡Ú ²¥VðéÿrðãûTáÓ;þåáÇö¨,©U¼:gܼ8þÕ8tÎÿ¹xqýª *Uo™ß÷/?µN3¿î^j‚Ê•[æwýËÃíS‡Lïû—‡Ú ²¥VðéÿrðãûTáÓ;þåáÇö¨,©U¼:gܼ8þÕ8tÎÿ¹xqýª *Uo™ß÷/?µ^±aIeô¸åÞl„Œå·ÈJ¹}»-ƒÿCA6”¥”¥ 5&å,¸¸c-„:¦‚ß”[*RIJˆ å´æAåÕŒ>¼4¿õZÿ+óPybýÝößž_³L_»¾ÛóËöjæ¹ÅÃ¥hVèþ}¡èŒ¼i»“ï%o¸¶ð‚,¬…4—²^Il#ûT·Mc…ˤk±~îûoÏ/Ù¦/Ýßmùåû5—ÑÝ+Xu_H³t•—d4ÌLrJÒY”qp¤uìeÖöÌ9…‘„„)΃Ive†X]e4¦Åû»í¿<¿f˜¿w}·ç—ìÕÍ(Ê›îï¶üòýšbýÝößž_³W5â‰qW5Ø(’Ê¥²Úu€°\BT¢ž°•,y…c¨ÐSË“u…És Cøv’Véfb–´¤s$ÚAÀÉÆ~ÎY<ªÆ¢j²Nžº~ ÿôÕRè]MÚlfåÄ·Ãøw’ÑzZµ õj#ž3öóÁåV5ã¥?Uí?‚gøŽ/Ýßmùåû4Åû»í¿<¿f®iAM‹÷wÛ~y~Í1~îûoÏ/Ù¬¾¨é:5Ÿ¤{^‹ivæ¹/³[¬;•Çqí¢„¥°“¶P„ï] R l© °p: IeØ¿w}·ç—ìÓîï¶üòýš¹¥QM‹÷wÛ~y~Í1~îûoÏ/Ù«8râÍeOC’Ì–Òã)m,-!hYBÒHþÒV•$ްA˜¯cADì›”E4¹ð¢¡…¸–ÊØ”\)*!)$'–Ñ‘'ŸV2E…BÔ§0“ž×ó ÔÚ)’‰éOeµ8²NÉÿò£ ß–€®Ù\åm'÷4FÀ‘ûÍyêÕ«§àÞþWÔØ¿w}·ç—ìÓîï¶üòýš¹¥6/Ýßmùåû4Åû»í¿<¿fª:OÔOÚ´tù9ÑÓ=«„+s«NËŠŠ©mGdäo…¤,Í¥I8<½ÇWÚu%CWÜîðä^!Á\yÑa¥6ûèd¨î˜BÁ ^Òp¯é¡ss’é-ÕÓ³âýÝößž_³L_»¾ÛóËöjæ•¥SbýÝößž_³L_»¾ÛóËöj澪 Q*sØbᆄ…6¶$ÐIV RFBTAêçŽYPoçÚ³ÛOåÞ©Ô R” R” ðÒÿÕküd¯Ì9^õM­(µ/'ÿ™+óP[WãΙuL.“/ïÞí:mË…ŠÓoNþKQ’²¨ku%2¥mE° ¥6ÙÊÐûŠ.%¯×»áUŒÙl ¸ÁfÉmn%ÑÇ]¸0ˆ¨ Ë[£)Ô‡±ÉEY$u泞?)§§Úû·ÏêLwéþðÁ%èš|tnÝÖØ×ûæ[…»ë®©*{â›$Î Ùh´ÒNíĬ§¥Zô¯‰W›‹õ’eóJ²‰"|(ð×0|B·[‡\Ž€¥:„¤>œ« Z9dhtnœÓú>Ì-vÞ!DÞ)Õ‚êÝ[‹8Kqd­g)D”¥#’@Z‹HhÍI5µ’°^%¡°ÒŸni÷€I ZI Ê”qÕ’mY54åêçóõ2Ëžwû±:Þéw´hË l:‚ÔÄ—žSEˆŠoá’•–œmPå)´8W´[@HF ›þ‰‰¦.)\-,ê;”‹´7Ós²2«/ m ­‰ [þ1JÚo{†Öü£¡°ZXQ!8OMÓ¶[›„¸:vÉm³Ä[…Õ±*mK ¢” °”ŒõàÙV{áVpç\NV é1:RὨžÔF\tޢȳü;V¶Ê].| Ó Ó!;a Ú ’vppœæ´ /SNÔWΦaã&E‚ÞÉ’¨OÇKŠnmÏèáæYVð6¦Š¾­+ RsÓ7›áRp·•f«ý_º~ ÿôÕS*¨Vֺ؞ÿMU6ªã¥?Uí?‚gø{T}0âQ¥í žÏð Zâ?ÊKOÝ“rµkK]Ùûzâ%¸lÍIJ×k”·Òu¤(Aå8Y| í¤°ØJÔ;FøW„æâO„üÑ™•Cjiö@[n¡C J’yH ò Ô³sIfæœ3ù6Ø.WýSwéS!.ÊjCÌGVÊŠ1ÙN¶V’JHDV”´”¶ójäun•\½&ݧ";"ëtR`0¤-M¥€ç%¼§•n‚¶ ²“ô‚F M=lµië,k5š"AŒ’–šI'¬’¥)D’¥)D©JQ*R‰$’I¯ãQYl’ ê+%¶ñPÄø¨}´¬‚V ”3ׂmLq’j®?¥È>?VhË=›H.<í9‰QÚ]•…]ÝÎB—!-°§Å4ãE;!²¤!ä ~”GµIŠ“*fêÝ#ÙX•m†Íµükë™=¶>3êÉŒe† ù¶v°PAJºÅ—Bè%Í›¥—Dé«döv·R¢Z˜eÖö’RvV”‚2 ¨‘WÈn"&»9™L·›CN¾‹B ŠUÖR’µ V¬ušÞÓ㮎In™«´ä%Úã)ö¨ï7ˆvÄ9;p¥.é-ÔÉ Rr¶Ìe­ï¥”á„côœû9êªÅÛlë¾"ú«T]ÇÃ&qŽ“!,ä«vÆÐFI;9ÆI©ÛáSðª½IÿŸÅÅüÃu6 ê#µ$v¸¿˜n§PWjÕ«§àÞþWÕC©ÿV®Ÿƒ{ø ]8êRqžt•‡éTÎÒÚ}—b%qQ-áÛ©l-¸;X 8Ák$% XݤóQQØiÝ–øWŒÖâN†ü)±Ù“Cjiæ^@ZB†•$ò ‚A‘(ü·?OÛ‘=˰¸\à ¦^†§,4úÙpº‡J‰¨8T²§6‰RŠŽI$ßtS§. ^áÞrüm/ižÔ–æ¹ÉÛ„† Km$ÒV¶²’y$çl£coèD¢UÀÝä^®ðžZDo\ä4Ü@ý-­%Ã’¯¤¼Ì…)}Vq Ãb(ìÆ‹´´Ë, ! ¡# JR9È ç§«ºÄÇ»›ôm·?­W'Vik¦£³*Ά­MÀä±`qÒñÙ@;§“!Ó²»WÒOÛ˜—`Ö¨½D“p»ÛXÒvF5,XáEÛ‹­ªvø!côÛ XSŒ¤‚âV‘’ÃBõ¡t îæõÒõ¢tÕÎ{Û;ÙRíL<ë›) KRI8“Ô«‹, U’ØÍ®Ëm‡l€ÎÖê,FËMí(¨ì¡ ’I8dšë8šóÎ[¼Ý¦ÂÜ| ÖåÚwmî‹{ Ç!²@)Àûê¯UuW–øWÂð¥wøëWãOåÞ©Õîs6Ôû§òïTú)J)JBv×o8è2YSŠÚ^âS­+ÉPà}|ªm( p˜Ý¢åæR=tá1»EË̤zê}( p˜Ý¢åæR=tá1»EË̤zê}( p˜Ý¢åæR=tá1»EË̤zê}( p˜Ý¢åæR=tá1»EË̤zê}( pˆdâ¦< ­‡¦<â #)Rˆ88<ÅO¥(„CîÕ1”•l31æÐ 98JTÉÉä*}( p˜Ý¢åæR=tá1»EË̤zê}( p˜Ý¢åæR=tá1»EË̤zê}( p˜Ý¢åæR=tá1»EË̤zê}( p˜Ý¢åæR=tá1»EË̤zê}(!5kˆ‡›t™/)µm#)×BUŒd¨€pO>¾u6” ø¤¥I)P I ŽDTYá¡ ¹=´$a(D÷Ò”°€?p« P@á1»EË̤zéÂcv‹—™HõÔúP@á1»EË̤zéÂcv‹—™HõÔúP@á1»EË̤zéÂcv‹—™HõÔúP@á1»EË̤zéÂcv‹—™HõÔúPCmŠÄ€úwî:””¥OÈqÒzövÔqœ ã¯2” ÿÙmdk-1.2.9/doc/img/Makefile.am0000644000175000017500000000131210770465100012571 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2001, 2004 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EXTRA_DIST = ss_mix.jpg ss_mixal.jpg ss_devices.jpg ss_worddlg.jpg \ ss_mix.txt ss_devform.jpg ss_extprog.jpg ss_symbols.jpg \ ss_devdir.jpg ss_split.jpg mdk-1.2.9/doc/img/ss_devdir.jpg0000644000175000017500000001234010770465100013224 00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ„Q"ÿÄÿÄC!U”Ó1T“Q•ÑÒ"26Aat²#4R‘´%5Bq³3DV¡ÿÄÿÄ#!1Qð¡Aa±‘ÿÚ ?ý`+L° ILÉÑ£)EšI×Rƒ2ü31_nÒqšîe 3¶í'®æQñ »IÆk¹”|@h€ÎÛ´œf»™GÄ6í'®æQñ¢;nÒqšîeÛ´œf»™GĈ í»IÆk¹”|CnÒqšîe 3¶í'®æQñ »IÆk¹”|@h€ÎÛ´œf»™GÄ6í'®æQñ¢;nÒqšîeÛ´œf»™GĈ í»IÆk¹”|CnÒqšîe 3¶í'®æQñ »IÆk¹”|@h€þ%IRII2RL³##Üd*LvR§G L¶ë¨qÕ8êMiJPi#É$e™™­?ynÌÿ €*÷+¾']È/¬Êï‰×r ë´¯r»âuÜ‚úÁÜ®øw ¾° @*÷+¾']È/¬Êï‰×r ë´=K°‡6+3‰%¹+6ˆÙeM) $)e™•™!^Ì·xç»@F"Åk*2q"¨§T£QG)Ó[`ÞÑËKCLËK-$ç—†eíãÄcFîbcêêü1>ú#560¤"#ѦÖó°–ƒQ>ëdi2aÌôtŒ·nÞ×5:3¯Gm•­â’ÊŸiÖÛRÚRh߬"Ð#=4™žj-#"2J²²8Ëø;G§Ãµ•Š•]Y%ÙìÖØ“(ˆ‡î¡H&’y§KW½ Œ‹-©%õÈ•-Îí?jpŸ¯ŸnæbD$E67õQ–Òò$kg7¦j2pÍÅ2û™+2=""%îNη"TXîÇfD–YrS†Ôt-d“ud…,Ò’?¬z(Z²-ù%GàF&!ì‰%Æ¡yEŽ,.*l‰ëW#â³m¸²ZS’RЖHœ[g‘“*$(ÒZDj#¹Šh;N}üA²vò,E¶®jnÒ˜o°äwÓ–Ö¥ä8¨ù¹ í¬ôÕ¤ªÙ§kË1b$Tâ:üA‰'½2öÄ“ÛG— ­bÖ«š”jl‰'!¢È}Ý%‘#"êa«¤Ü|Qý¥²üœoÖøùؗÝÏ«©qçÕ;o¸ñ·¢Ú‰r$ÇÑNHÌœ†îg–FZ&“Qê¤ôèòñŠÈòsUL®4}4£\éƒB4”dE™äY™‘{Ç?—ز¤á¹ñnªM’0\*z‰r ZqlX)ŠT¬É' zo´¢q9¨Œ—¸¿Ô…v 3vAˆ­ßÄEû¾Ëö(·Ñ¹Sî÷Ù¨™ö™‰!$ÞIa•<Ù‘’×¹„d‚31«Š»ª™ýíØµ4‘;ýlÒé“Ý-Þ´¦I=N/í“›‡«<ü I?îë8Û--×VHm 5)F{ˆ‹y˜¡‡­Ø¼®nÎ2ô6ìGÝI$¤´ãHq.%9é$¾žŽK$«4«è呟 ÅãUb›ûšùˆ°;gf6™)žÄy 1-+kAhîšÇ[a.é%*•—ì’¤§2$ÜG€q/•‰!ÖA¯F¼Ln6°›B–MWBЇØï1_NŠTÔ„‘’¦FF— ;Ô½÷ÇÙ{ÿ¾ÿ]äR¤µu¿ÖHïµÎ²KÐRHÖÓŠmdY‘‘- ,ü,ÈÌŒŒq"ì»×D¯°ÕQÝ^ׯ¬}‹˜áOiÈqÙK°Ø5 ’lÈ[KÍJ[¼,ԓȇ²•€ì$öYM€Ö˜+©TûîHY*B£ËiÙDiJ>‰©-f•IN‘»ì½4éÌâìkU†.*êçÇšëÖz:•0„šSœÈq K5—í'4{ˆþŠV~$D¯]Á‡6|ÊŠÊH/£רÓ-¤;„&ŽÊe¼““Fá·/4£è¯ZZG¼ô|’»Å&™wÔȸïÝBâ¦Ø:›*ùG5Ô­|ÑÃÈÍe¦i#Q§êËú#ô(7Ù­œ7…¨™±™ ¸½c°Tá¦Q™ÿß^³é‹úÊ%)g™ŸÓWˆôƒª@äðÇÙª¿É³úJ_j!þJGë`E†>ÍUþMŸÐBRûQòR?[<®+º™e<âbꣵ1øÑÚLD:j&Vm©J5‰­ Ü_q»‡»R­M4dbl‘h’4HîÕoºÚ”G–’M2Èü|~ñΡÀÃŽÙ]ÌÄñáËIÜÙ5‰IJ’‚+ &¥’T[Œôˆ³öû”ŽÌAžÁ ü »7ð;ÆË ì½G{Ãöõ÷Õ ZÕ¾oE|AFƒIæFi24™‘‘‘‘‘–ã! CAao*žåd»(½CbZóòúh#ÒNÿi[ØsµñÝÄñ‘› ÄgV“N‹1ÈѤ·^3Ü’"#<Õá¸ÇŸìça§m°+Ì$Ìœ8ó®ÅœAÓ·[Œ8Á%”6éºjyÇPò‰iOÒAÒ<Œz±¼Ócô(þ€üëë{Q¹ìξ†]ôI3°¼U¿.Úã½”ù Tg ÈéÖé2z‚“ÌÙ3SˆßšuƒÐ`ŒŽ'˃ØâȵMµc¬AYª+‰RŽwN›S¤:âHÑ-D¥:j#5$È’i%t:…ÇïÕ_?éÞ‡–ÃHºk `¶ñ&–ÛC1Óe¤´¨ûÉCs[™¤Í&zz[ÈòöR*)©ìØ;2˜Í)æÓ‰~:œ,k22ÉiËëž~?p“¼b=WÈ9Ö€;Æ!óÕ|ƒ`ï‡ÏUòu„àñˆ|õ_ çX;Æ!óÕ|ƒa8ƒ¼b=WÈ9Öñˆ|õ_ çXN ï‡ÏUòuƒ¼b=WÈ9Ö€;Æ!óÕ|ƒ`ï‡ÏUòu„àñˆ|õ_ çX;Æ!óÕ|ƒa8ƒ¼b=WÈ9Öñˆ|õ_ çXN ï‡ÏUòuƒ¼b=WÈ9Ö€;Æ!óÕ|ƒ`ï‡ÏUòu„à èÉ…_jK %¢Qø™$ˆ³ÿàKJ1<Z‰:Q$!9ÿ©ZLžEí<’£ËØGì„R£G–ɳ*;O¶g™¡Ä“Ÿû {\ƒí,Ÿa…jåJyZN<ì4)k?i™–f*ÿÓ|ÿ¦Rò ü£[aRpjîYØTœ»–GÀê¸Q*à·º q#4Y!¦›$¥%øn!kMÀ¯ä1ö'®å‘ð …IÁ«¹d|li¯øü‡óMÀ¯ä26'®å‘ð …IÁ«¹d|}[ŸøJrÎZ–IûôI‡HÏ/a’Yþ%íÅhuð!)J‡4e(²Q´ÒPf_ŽD,€¥*—ŸSÛÍŽ“Ë&ÛC&”îû´›3þf"ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4€nΙÇì½8ý ÙÓ8ý—§¤4…¤ÙK7 e°‡TÑ-ùFÙ©I3JŒˆ­ÚDe¼È÷xe‘˜|léœ~ËÓÒ 3ÙzqúBl¯¸}o<¾ˆe}Ãëyåô@C³¦qû/N?H6tÎ?eéÇé ²¾áõ¼òú!•÷­ç—ÑΙÇì½8ý ÙÓ8ý—§¤&Êû‡ÖóËè†WÜ>·ž_D;:g²ôãôƒgLãö^œ~›+î[Ï/¢_púÞy}ìéœ~ËÓÒ 3ÙzqúCû.M¬(ÎK™wi&·M™ŠZÒ’ÞfDm¤"ÌòÏîÝ™î 3vtÎ?eéÇéΙÇì½8ý!¤3¢I¶›¹q+á÷w’KhÞ–¤-H?2&ÔE™oË?¿~G¸ógLãö^œ~léœ~ËÓÒe}ÃëyåôC+î[Ï/¢3ÙzqúA³¦qû/N?HM•÷­ç—Ñ ¯¸}o<¾ˆvtÎ?eéÇéΙÇì½8ý!6WÜ>·ž_D2¾áõ¼òú !ÙÓ8ý—§¤:g²ôãô„Ù_púÞy}Êû‡ÖóË耇gLãö^œ~új´:…ªîÁÄ¥Df…!Œ”^Ãɲ<¿ØÈ“eM.|(¨an%³[ÃI¨É)3#Bwiã3ßá–fZ /þV¿ÎJþ¡Á8ƒ ÿ•¯ó’¿¨p ç«B®í‰žÏçÔ=—‰¶›²}âBVûˆÓo$+2SIp•™¼“l‘þ¡ÑÇãÎÙqL.Ó/ß»©ÃnXQT×§_%¨ÉYªÝI¦T­/ªÙ(”¦Û<Ö„kÜQn%®3Ë–tzþÇœ|ùrºž|xû~‚ÁÝ«Pâ¾Ñfá*v]Ó0U2=’V“fQ6â᤼t3u½ï'2Y–I$)΂9Oö^‰‡Ë³víkÿ–á·zëªJžïM™‘¶yè´DzM$ò=[‰Y–“ŠRµ{W‚Ä«š Ô“/0«(’SáG†¹…ÞªÔ:ät”ê’}9U’–ƒËveeºÝcÆÇx—w©ç¿¿ÇAÉ1½¥½F ¡Ùí ªbKÏ)£b"›îÉJE§T9Jmô’FÚ $ŒMýS©†-;R°©gÙH¶†úléU.Ém ­‰ W÷Å+I½nM­ùG™(´ ¥’ŒÉ9'¨Ê»0…â®k°Q%•Ke´:ë²7…š‰ 4ø’ThYžã4+/NV í18RὈžÄG.:n¢È§îíU¶itÜî+L7NBtÉ Ò$É=$ç˜ô/NÄV78™‡ŽLŠ öNJ¡?.)¹¶G'™eZÂmM¿f‚Íd¢I%IÎKµ³OuŠÌÏZ~IÿøÔ-Šx¯ìý§äŸÿBà¨p§ÙzŸÉ3úL!Ÿeê$Ïè `Ìö›ˆ¥ál.æ=z™ËMå6¥µôŸu =5!¼É?†’›F“ˆ¾ÐqÐàÌOe\ì7m)韱DgU¥–‹n)³ZÉZ SJ/ÏEDG¸òâ¸Ëã\3[>Ú&8·°:ÖU#Q2iõ ³4/W+Ð3#Iè©'—¤÷—ž¾¡…~û¶R-muÒã:Ô¹lNSKœÓº:Íq£"ZTHAhäH$¡)JR”¥%c PØv©i:Žò 6­î‘e¤Y©† $ISªIø¨””‰FYš¼.w+9Yónô~¦Ï;XƒMh¥Þáf[”™Ø‚¹¤RUªîî¹ RœJRO§ê«EKIäYf^NÇ*k d+F›Yw¯Œ§TÔƒ€å„5Ç„R32a󎔑fyþÉi%$óZ7hï c+•jpÍzië«€L'Q ØŠŒ¶ü*mDF“/öüwøCðô¤cbSÎsóq¨l]±'îIüÜ_êD[ ­(ª^gÿ™+ú‡‘IÚ¸‹yÇHä²§¤½D§Z%+,³2BˆŒò"ß㸦¸†c4´ ±‚Í%kq-uÛܵºY8§RE“ŠYnQ«32ñÌ|l˜ÞbËÞR>pÙ1¼Å—¼¤|à#Á¸sàúb¨Ãµå &±N¬Õº·y©n,Ík<‰)#Q™’R”–ä‘X‹`ÌI5± ¸–†É¤?>¹§ÜJÌÉ$¥¤Ì“š”yxfgívLo1eï)8l˜ÞbËÞR>p[m»¯¼;KA†á.¤­§ˆ· Õ±*mK2"5PDF¬’’ÏÇ"/`Ó×ÉÙ1¼Å—¼¤|á²cy‹/yHùÁÚâ q “ÌY{ÊGÎ&7˜²÷”œÖ(V–´2òOÆ¡tPÙÌËX©$”JÐzcÎ Ì2Í*Q‘äyòÀ|0âQ…êHÏrgô°(lˆdg«TÆRj5h31æÐFg™ä”¨ˆ³<ÏqÖ×kˆdì˜ÞbËÞR>pÙ1¼Å—¼¤|à9ò» ÁnâI“d;ftε”zF&»4W¬ÜR5JJ´O"Ño=f¼³#B[èør®§QĤ¤„Ô*øˆÐe–óÉ%žffg½J333Q™šŒÌÌÌÌÌC²cy‹/yHùÃdÆó^ò‘ó‰¡[a ‰&¢v"ÂTÐÙ4‡ç×4û‰A™$”´™’sR/ Ìý¢æ¥ Ãp—ÒVÓÄ[†êØ 6¥™("#VIIgã‘°|l˜ÞbËÞR>pÙ1¼Å—¼¤|âmq¸†NÉæ,½å#ç “ÌY{ÊGÎûˆJL¼Ü_ê…&ªâ!æÝ3’ò›V’5òt’¬²Ì‰j2#ÈÏŽñtÿÙmdk-1.2.9/doc/img/ss_split.jpg0000644000175000017500000042737510770465100013124 00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ"ÿÄÿÄi  !"1SU’•ÑÒÓ#ARVt‘”256QTcq“¡¢´á$asu±²³µ34BÔâä%&7br–Cdf£D‚ÂEevÁÕðGƒ„†¥ÃåÿÄÿÄ0!1AðQaq¡á‘±ÁÑ"ñ2#RÿÚ ?Õ´¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(-·knšu—©]ÜêÏ­ýlnÚ¢3Ž.õcp4׋®þqoØVN­ûê»üùïñ }ØYŠëR¶aÈ”• 6̹ÊíêݽÐ! ÝåGÿgÓ¥fzõU‡ÀÓ^.»ùÅ¿aNšñußÎ-û µÜlVhí¿(Ãí"IB˧ˆ°Ú¥¢3Ž]]´òajÏ2’#&Aw.ÖénDeµ8´%XqÌ­*Q!ÉK„ý¨Îâ0H2=?Jv:µ!økÅ×8·ì)ÀÓ^.»ùÅ¿aSÓB݄ۃ„äin¸Bg*KŽ~ÍIQîÒÁæ•g9ëu†TìXÜë¾À.«‰°JI ¨Žä0Ò2Õœ’’éúQ±Õ«º³ÀÓ^.»ùÅ¿aNšñußÎ-û òЍé}*”Ó®²3¹ ¸£Ë–R 9ÿ1¯©Ë†·A„Ãì··š^x8Iü9 O.÷,V½O²uêzµO:¢–­W•¨$¨„Ü'Oúð“üÂDÓ̺¶^µ^[q )Zpl‘È‚8{·ÿgZCÃýfà…¥“d+@…E+G|a!@‚±\¡Û®뻆×#\]BSÅQ2–¤¾°•~u´”€§ ÆI«3ézq²õjU8kÅ×8·ì)ÀÓ^.»ùÅ¿aValµµé3­ÍE‘± r;Ž8€ÂÂd¨#[†þ \”IÂÎÜe8û¸ØíàÍm¦>YT„™A¼†V‡”!Nq„’‚RPTwòæ¤:=.Åu+&ž-)áj¼–Ò •/² à’<ùÁú |ð4׋®þqoØVeÑ·#ŽÁÇmK\u)ÉE#%N„w`ãý–ð ?öÔ0Ü’oO<ìTºÂaÅWß-ïa +æê [N*Rð¤ç}/N6:µ+| 5â뿜[öô"iâÒž«Ém* Rû Þ9 ÀՊ}ŽS*;pÔìV“+‰=JVXuµºlBVƹäñ9c)DŽ̢ꋌ´ðŽ‡Þ’—\-¥É aGj”Â[RJAÏÇ9°ß§ØêÔ‚ài¯]üâß°§Mxºïçý…NÊbÓÚüÓoŠô”-„-†ä©L4µqò’¢T Ú¹/’¦° 4ŽÆÞT#:Ú/GRÜVí‚CiÆF±Ìç)ï¤c«íz}Ž­]Øb&ž-)áj¼–Ò •/² à’<ùÁú |ð4׋®þqoØTÔf˜?°0—Ñ©ÊJ”¤‡$!…+b¶JP¤”Œþò™2Í•8å¦ßÙeœ£…-À¦Ã¯¶]2Ñ6IÎܸy ¤ íúq±Õ«º½&Š2Â$Ùïl¨ç¹rry“ßcà ίO”ðµ^KiPJ—Ùð Éž|àý­:ê;/>émi‰ë ØI$- }±æÚ§' æQ¦#Ïì#Ì%ôEjCò’¥)!ÉaJØ­¤”)%#¿¼ƒ…`Hôý9ŠÐêÕÝ ÀÓ^.»ùÅ¿a^²`X£,"MžöÊŽ{—'!'‘)=ö>üàŠ°Ì³AeN9i·öYg¨áKp)°ëí—G …ôM’s·.C)×]GeçÝ-£1=a[ #cBd‚¥¤¶#ÁûTäá\ÊpWWuXDÓÅ¥<-W’ÚT¥öA¼r@'ß8?A¯žšñußÎ-û – 6ÅÆ=L)ô²éT¤%XS¯íÁF27RTJö¨oÎjÑ]ß.Û’–Ò £lp©‰ÇV¤ ‰§‹JxZ¯%´¨%Kìƒxä€O¾p~ƒ_< 5â뿜[ö;3(º¢Àã-<#¡÷¤¥× irBXQÚ¥0–Ô’sñÎp¬¦-1m¯Í6ø¯IBØBØnJ”ÃKW )*%@¡ «’ù(÷ð jû~Ÿc«WtMxºïçý…8kÅ×8·ì*E‹ºNá*<'ÒÃw°éRÔ6”¹Ü¨Œ ”’Ž{AÊÿóSòìvru-µÃK–ÚšijY*d!¼d“ÕÛÂB%Õ`Œ§j}?N6:µ)ü 5â뿜[öài¯]üâß°«2mPUuq¦l²”²ÂIaÖVxK*PÊ™C¥Ô§$¨©XÏÚèÅyûd²Ä¹ÌDw¨Ç„§BÉA$àoO%|ÐåÌw· Øô½)ØZž\ 5â뿜[öài¯]üâß°«&£µ[XqÕ[!¥ÇY¸%ެ‡°¬¸údgvHa‘.+à) ðŸmg¶{Ìy¬:Û-ÊQKî>P J”P‚¥ä ÿhä·ÎÔ«2=?Nv:µ ¸kÅ×8·ì+õë}ûMÆD8׈Â^IvZJ²ëh €ÒOyd÷þ ñ–•"[É\~¬ µ3‚8g?kÝdòïsçYþâ_¾bÞX©êz:#DÌA§TÌ«¥+ÄìR” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” ßkèå«ô™wX¶}E!·å?—“ RÒâ’½¡k pP•£°·†4þ¢)^7!×íΠ‘Þ;V¢22pq‘“øMm.•éfR¤…¹<àŒÿ÷·*ró:Íe¶»s¼Ì·Û`³Ž,™n¡¦›Ê‚F娀2H'¾@®Óêê‹1a¢^èšCέç¬Z¥Ç¢¥­S ’¢y’O™¯Ÿr'>Oj®AõësBÕZRs¶ä@¸ÅšÝÍÎ1[/F½¬¥ ÔBc ¿$T÷µçÏr'>Oj®AõëÖ/ERc8\béТ…¶O[€{•¤¥CšþH­ýÁgÁ7äŠpYðMù"žö£¢ùîDçÉíOõÈ>½e{™OêG°šŸÞÇZ·îÛÛwoÎÝÝÖÜã<ñžuº/×;§ã7&ýtµZ˜q{äÙ °•+₲?ÍYí&+­!Ö’Ë­!HZ@!@÷ˆ?§½ªNˆs÷¹Ÿ'µ?× úô÷"säö§úä^·Ãs¬Îp8s-ëë\ŠÎ×Px7¿ˆÒyóZxNnHæ8kÏÚœzÃ\YM)Ö˜RR—ÙÇSg(YA8PŒ¤á]å (&ûúΈh/r'>Oj®AõéîDçÉíOõÈ>½tŸß’)ÁgÁ7äŠ{úΈs繟'µ?× úô÷"säö§úä^º‚Ï‚oÉâ·-èšÔ%®*e:ÚÝm‚RZR žù +@'¼ Óžø§¿¬è†‚÷"säö§úä^žäN|žÔÿ\ƒëÖý†å¾cJz"âÈm.-¥-¢•€´,¡iÈøR¤©$wÁb¼­ómsåÜbÄ-¸õ¶H‹-<"8n–›x'$`÷¶r2;¬wÁïë:!¡ýÈœù=©þ¹ׯY}I—-éR,:o<µ8âºÜ•’pŽù­ýÁgÁ7äŠpYðMù"§½¨è‡>{‘9ò{Sýr¯Or'>Oj®Aõë ø,ø&ü‘N > ¿$U÷õÐ1z*“ÂãN…-²zÜÜ­%*×ð‚Ey{‘9ò{Sýr¯]ÁgÁ7äŠpYðMù"§½¨è‡>{‘9ò{Sýr¯Or'>Oj®Aõë ø,ø&ü‘N > ¿$U÷õçÏr'>Oj®AõëètM 4¦E‹T†Ô ¥#¯AÁ# 8ñ“ôšè > ¿$S‚Ï‚oÉ÷õçÏr'>Oj®AõéîDçÉíOõÈ>½tŸß’)ÁgÁ7äŠ{úΈs繟'µ?× úõù#¢{€¶N‹ Ǩr[Ih¸óðœ Ä/íC©çÜßøk¡8,ø&ü‘N > ¿$TŸ[TÅ$é‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$W:Çerç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿOpÝGøµÏô1?⫨ø,ø&ü‘N > ¿$R±Ørç¸n£üZçúŸñT÷ Ô‹\ÿCþ*º‚Ï‚oÉà³à›òE+‡.{†ê?Å®¡‰ÿP:Ï£iÚZØì«Šæ0àhºÓo0ÎÆÐ®é·—‚8©<Ç:ì > ¿$V˜û'9X¼!ÉëpêÅ'aÍ¥+*R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” íŽŒ¾öùÜÿߨî^ˆÞ…e¹wèv.%êØQ2D¶#ðøsYyjBŸ÷²´¶Ó‹ !YØ{•wŒFi_jm-'gŒŽü·}fËÞ ¿,ú*ê̤a¤æÁÔº¢ûã¢5›Z¢½´"5áSâ<Óz•á RÐÀJ’©pÚØ*IFwmQnƒízÒÙÙtj×nÅ+ utM!h N*ÛY›)ÂÜd+†‘µ<Õ—¼~YôS/x6ü³è¨¯J§ô‘í×´ÖÕd™yìUårdƈëw„¨2ØÜž3 áo##vpI状eïß–}ËÞ ¿,ú(5 ïLëÅi«ú~/ad]u¹=kŽøã"'WCJi+iö@qn¶VÇ;¥ çžíyw¹\,—9L^uZájnÁƈÃÒµD+s°¥"T×T¶:ãŠu¤4û [ÅiP$)Díê½àÛòÏ¢™{Á·åŸE"Äݨ¤'¤k¶,==ÖŠ{'uŸÿÙ6]‡",–'*p­m¡oÅJ6ŽJw$=:¼ ΢ÔO[å]ß³³ÞÓ]vú›¢Ò‹ûC®#$IYÆÌ„òHÛ9{Á·åŸE2÷ƒoË>ŠA/J«t‰mº= óOůvi"DxüD·ÖšPØôr¥` è$ŒÒÙ?kV\½àÛòÏ¢™{Á·åŸEI‚ñ¤zE‹aŠ?8³w—l&ðúÃkžü¨.„ïI$2‰M4¬§b@Ñj°üÛ厮ͪ5÷k²dÏu¹lݯlÑØêZQu¼Îã‡|w[C…´©õà%)®†ËÞ ¿,ú)—¼~YôRb¼û(]Ü']t¬ù·Gÿ$Ü–Ò¤B¸7-i¦’R[R’Ž @x·È¤¼r2MlóËÞ ¿,ú)—¼~YôUHŠ)=)ÙæÍ“kºZ­W©7mÈi™V™Q[y€ç)(•ïKB¶ “• £äÖ§éRý~µÍ²[×–+$¸6HÌÌ·ÛîQ˜rý»–¾ “â ¶R[Ø—©Àû@OGeïß–}ËÞ ¿,ú)å\ÿoÐ/õ+lØ6}_u‹Q˹6ü`ánãPœYv*ŒÔ„¬Ø+Z¸jX+îœÜ½Ó²ô—HRãë NÜ5s[…)Í8Û7µ6Úåõû“Œe)p$Ž á'kÆÒ”‘Üa;/x6ü³è¦^ðmùgÑH% ï¯«é9zq›® vøn'e mõ§˜Kƒ(ÄJbBYZJã§PÚTæÕ+ §dô3oÔ6Ý/&>¤9™&j”É›9É/¸ÖÄ¥ï“ 6w ˆt§–ì$¨sËÞ ¿,ú)—¼~YôR,MÞ•«:SŸh‹ÒvrHôoV²Ü¯vBO«Œô>xr’¼¡\N䣑k†pv~^ðmùgÑL½àÛòÏ¢ƒŸØ·êÛ¾ƒ·#Dja|‡÷zUÉË\ö]~BžšãÑÜ+.*á¹½H$*rß,'äÚuœ=dÄ+œ}S=ˤ93žfÛvjÝ"SA²Gã¹Ã|!%/%àR8ʶïIÂú /x6ü³è¦^ðmùgÑA¤™»GÒ¶ˆ÷é“wj (žò>ÕÇÂqCäU“Þ'^y{Á·åŸE2÷ƒoË>г5š‘zR¼ò÷ƒoË>Šeïß–}¥+Ï/x6ü³è¦^ðmùgÑAéJóËÞ ¿,ú)—¼~YôPzR¼ò÷ƒoË>Šeïß–}”¯<½àÛòÏ¢™{Á·åŸE¥+Ï/x6ü³è¦^ðmùgÑAéJóËÞ ¿,ú)—¼~YôPzR¼ò÷ƒoË>Šeïß–}”¯<½àÛòÏ¢™{Á·åŸE¥+Ï/x6ü³è¦^ðmùgÑAéJóËÞ ¿,ú)—¼~YôPzR¼ò÷ƒoË>Šeïß–}”¯<½àÛòÏ¢™{Á·åŸE¥+Ï/x6ü³è¦^ðmùgÑAéJóËÞ ¿,ú)—¼~YôPzR¼ò÷ƒoË>Šeïß–}”¯<½àÛòÏ¢™{Á·åŸE¥+Ï/x6ü³è¦^ðmùgÑAéJóËÞ ¿,ú)—¼~YôPzR¼ò÷ƒoË>Šeïß–}”¯<½àÛòÏ¢™{Á·åŸE¥+Ï/x6ü³è¦^ðmùgÑAéJóËÞ ¿,ú)—¼~YôPzR¼ò÷ƒoË>Šeïß–}”¯<½àÛòÏ¢™{Á·åŸE¥+Ï/x6ü³è¦^ðmùgÑAéZSìœû€ÏÍ$þ÷·>^ðmùgÑZkìžIM…€qž¥ òþyPÍ]9Is5)JŠR” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” ì©.Ù ÁfcÑPã÷7T¦’‚¢S4€;´¨c»?à©›¡Ÿm~Þv–ø•-1Ömžå%*9P9÷#¿‘üÕ ÑáÛ·%8ì¹Ü®ðþ\9š‘¸ÉrS)p‹£@<€%é8$süufR0Ÿê¯øÊW’ß©NªÿŒ¥y-ú•®ï× d‹mªÏÕ>à§V_”Ùq¨Ì4V₾éM ¡ÍÀsƒUVµÔV ½µíMyÓÓ¬rß1¤?Øä%DQI(qJ\—RQ”í<“Àç–9õ4ÄôÌÝ[#ª¿ã)^K~¥:«þ2•ä·êUyŽ’ú9~[q×úUÙ,6†‘w`­K' ä’yb­u±‹Õ_ñ”¯%¿RUÿJò[õ+*¹G쎕J×;N®vÚÜf#E6¨÷Ö˜Æ"šx?%)K¤)ýê}-$ 2ÑJ9 êNªÿŒ¥y-ú”ê¯øÊW’ß©Z+ì]×pѦd[¯ú–2c¿z“O»qžÓZÞ‚ãŠS„-e#8ÛËŸ=þ=ãA‹Õ_ñ”¯%¿RUÿJò[õ+*´5ŠÏ¥®:7JÞ/:_GÜ.—;³eÜm~CÎ2’··]B”IÏ<ÏðÝýUÿJò[õ)Õ_ñ”¯%¿R´ò4æ‚=ýÑߘm¿ñ5ä.Ÿ›¤.bɧìÏNÔŠƒ-v‹|xÜvz„§8k,­a@-)V »àrøHmžªÿŒ¥y-ú”ê¯øÊW’ß©YU‡zºÛ,–×nw›Œ;lqÅ“-ô´ÓyPHܵId÷È]UÿJò[õ)Õ_ñ”¯%¿RµÎ±é‚ÅMŠ>Š»iíY.eÅMKèÓ’:²c>êÖØJ° HvIÚJw&ÿ§/vÍCfw´JL˜’JHRT“‚•$‚•$€RA©]Šì÷ê¯øÊW’ß©NªÿŒ¥y-ú••Qº†ÿbÓ‘7PÞ­¶ˆ«p4‡çJC ©d²8JŽ;øðUUÿJò[õ)Õ_ñ”¯%¿RµÅó¥ë3z²ÙM\lúšÐ˜æ^•j˜‰2a¡·c6Û‰Ce[†_Y(䢔¨£*NÅÎk½Mqfߦ]Ò7 B“|œ¦‘6DuK`²!I’„¶ë{·pߌ(žu+ XZú«þ2•ä·êSª¿ã)^K~¥Eôuy•¨ú>Óš†kl·*éj‹1ô2m+u¤­A ’@ÊŽ2IÇÂjzª±z«þ2•ä·êSª¿ã)^K~¥j^ˆuþ¢—{‰hÖcI“u\¦J[m)6ë“Eè„ TÐBRµ{Ò²µïHNä©§TjŠÂΙ‰»ª¿ã)^K~¥:«þ2•ä·êVU*£ª¿ã)^K~¥:«þ2•ä·êV­›orí¬5{ÒÔ2º½íYn6¥— ¦è.mKmÉiÖëŠ$IQÉïWÚtÓXçVïiÿñô?ª¿ã)^K~¥:«þ2•ä·êV¢LY6n“t+QÔ1˜›q”Ì”JÔ²¦¶òD +JKnIq' JU¼ŠG1ðîz ^ªÿŒ¥y-ú”ê¯øÊW’ß©^6·\ë²Vµ)-ËJP ÈHà4p?É'ýæ¤(1z«þ2•ä·êSª¿ã)^K~¥sçÙÒ7H:g¥ˆ6 q|­V¸“[·õžaãÖ$‹Ê(â”4Ü-$|æ¡ù¢õ'I©w½{2v¤Ò· K씣—µ—›§lf÷ÑùÔÒn±R^B%êy·ËŸ¾3)å6â J“Ü«º*J€"롯jÔº&ŨÕFUÖÛid/plºÚW·vq»ÀÍUÆR¼–ýJuWüe+ÉoÔ¯Üpj(m¨6¨’¤ç‘!là‘øFOÒjBƒª¿ã)^K~¥:«þ2•ä·êV–±XxÓš»Rοê&Õi¸¾Ûq¡ËBC !s.!d¸Gà\«=}êˆî6ü† )—’[Z¯ñ”àŽJ[º¼GÚ µÕ_ñ”¯%¿RUÿJò[õ*£ZLµ]-V-s®åpHCF˜içqö œàã9±œã7Š ^ªÿŒ¥y-ú”ê¯øÊW’ß©Xš²á&×bzdD´§Ò¦ÒØq%I%KJy„OàÉüG‘¯v_T'n륙YXG+bû¯´ïbIïäã¾Ý8Ýï|p¶uWüe+ÉoÔ§UÆR¼–ýJ§EÖ(7ØûÈbcÔj\8ji^Ðp¬¸à»ãž;¤Œ«sjvöFE/UÆR¼–ýJuWüe+ÉoÔ¬ªPbõWüe+ÉoÔ§UÆR¼–ýJÊ¥/UÆR¼–ýJuWüe+ÉoÔ¬ªPbõWüe+ÉoÔ§UÆR¼–ýJÊ¥/UÆR¼–ýJuWüe+ÉoÔ¬ªPbõWüe+ÉoÔ§UÆR¼–ýJÊ¥/UÆR¼–ýJuWüe+ÉoÔ¬ªPbõWüe+ÉoÔ§UÆR¼–ýJÊ¥/UÆR¼–ýJuWüe+ÉoÔ¬ªPbõWüe+ÉoÔ§UÆR¼–ýJÊ¥/UÆR¼–ýJuWüe+ÉoÔ¬ªPbõWüe+ÉoÔ§UÆR¼–ýJÊ¥/UÆR¼–ýJÓ_dšÖæ›`¸²µ&,´n BfDH<¿˜Vï­öH}í7ýßߢÕÓ”—7R”¨¥)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)JÈèðí‡[’œv\îWx.ÍeÉ;Ù³9»~û³Jâ¤ûÛ¾ð{¤ ©ø1øAä+£¬õ[~ÒÍߌÿ÷áRwˆ«Š,×Þ]Õ¥:SÜ%ävŽC•]Y”Œ(ý:»qN®°F´©|»<èñC™ÙÅru­ *À$$d“ðV š:VÍ}«Ô”“´æßŒ~•vé'IÝï—eãOÜ¡Á¹Á*"U2*¤5‘Â+! q~YF Qw$SH_Fý(/¿­l#óYÿ‰¯/­éêÕ5Ò¬Kö…‰6Ï.Û?_ë'aËel¾× BС…$íˆ0jùÐÝöã}·Ý×.sבn4)o%°ã¨J»†„$áÎ ÈHäy‚j†ÿDÝ$I;_×V…rW̰¬|8̃ÏýÆ·°CÓjŽW+AJ9RÏÂ¥„“’Oá&µèè×§ÿR%ëŸzGé£kþŸxÞ4òù -íNγÿ'šùm”£pS‡8ÉJ\Sa*ʶ•`ŠÝú®ÍQék¶ž˜ã­ÆºBzËh€´¡Ô(¤Fp£Œƒù«’nt•tqÝ#?IÚb¦CQÙ™y%<l¶Ha€Qîð8h Ú0®ö{;U±É«±Á¶iä\žŽ­qºCSì¶ÂúI}õ¶¤ºÃjqÕ! ZÚ┳>ÄK£¨íO7Ñnbi‘ÔnZ”ËI)’Få¨÷9Àü¸}—½›^¶»7 ¬6ôIN)ÜGYeaI-¥*HWt¬(sîElžˆº:Ñå®T8seM\·Ì‡ž’ ¥­d“€ä”ŒáÉ©5Uæ´ö‰‘ÀèÇA§®p3¥m§o[ágù:yã­5ôí?Ÿà†µe¾ºÓ–k^œƒ¤à]!Ùà±o0j¹P”ûm !+[MÇ)Jˆð¥~zÒ2Ûÿç_ÿÉÿB±5‹œf´c`S»ÅÇý™3–xÎý‡æøNJ'ô†Ÿÿ‡ÐÏÿß“¿ákáèZÓR]´ûw};ËÑs7 ´__¸¸ó]Ö6{ë(؜Ƚ@Þ–·é+ë²™Š˜·×0ëËØ¥[g däc%@ç"¶+´Åb޳Š9^7M.]]S,O¶MZPV¤&QY óÝîõyAŸªbB±êÄGb——{yÛl£ÅuVÉüI- å¦V 8æW¾$$§w·H=Ú5ƪӷkëŠz ™©IU¿háÌSª`€áø[O%ådvîJ¾º\Ñõ½–ÛßyfÎü ÆRv’•æ vŽO’{épÓèΚÍ\tú=5š½zÿÁ}ÿèí¿÷fêáPú"ÉÚÖ‹±éγÖûn ÃÙÅá6”oÛ“·;sŒœg¾jb½í1Óþ—€nûåŠRaj¹RYSl%´­2‹*IL¥¤‚”ª6P¾)(² ¢¶‚kqµ¥²j§5ËÚŠëvµE®Ø䢈\å·„8 (F8ujNå墷§vm.—tµ”²í³Ý·_m¡Á ä¾¶Ðënq£¸SÝ%Ð8ˆîÛ!*Ox¥ZçQiŽ”unÁmÒvÝ? VíÁ¦ã²ãiá!qÏÄ$¡KÊRPHVÞi_ŸÔqª:#æÜLL´¶~‚Ôqõ…\£»Ö™—¤GS«Ž68¥²’ämí¥ö§Zu\U¡Ñ€Ú›…jþˆ:·t-wÞ¤Ý%89GTvÛ…Ao*3J qŒ îÓÆw—tv…zk[Tn±ªuÏò'ämÔhæÜ®?ì«wåŸ×T-P™—™’5·ÈI´M-¶±rša«‚%´ÒÒµ(ëIîTR•­†ÉÂB\«ƒ·È– c¬XºØ5lƒ*ôܨÎÛìÓßemt÷AAîÚq8É ¤÷«UHén½L³Z˜ ‚§\œÃWµ"Ó-÷ÞuD‰Êhºët#v°y¯:¦b,Ö˜‰›­–ÍD‹§L6Ç.Îý¾ñf¼Én_òåIeÀ`O@[jR²R¥2æ7!*ÂA nè 厉&\5OMpuÑŸ”ûwd¶ûðPeB‹»\½©\¦wG.o”@pžh Ü+©êÆQ¶ºŸž§÷vk2re.è„ó,ÊSj 8óEÆÐ¼w*R’TÁ )$ŽYúð¶°ë3.n8©~R\läwIà¶œý)#ýÕéu2…²I‚óLI (´ã±Ôú¬r%´©*XÿÊ ïUëk}Í pÔðîíFÕú¹Ëú"ʹÈ_PT¨ïÛ(:¿{|¥) <Ê€6 ¡;MFj”n7ûDÛ²/÷›fi¹.Û-­­ÝY›qD›‹*modlPKd‚]ÿxéÓÒíëU;ªÎ‘œÉ€PÌKCjVnKHã'¯¿d§A)ÊvðÏrw$fhw>È ‰V…¢’‹hëµ:ÂÄ¥*C®:£°OKiJJÔ9óæŽå}Ñ®®¿“íûqÿõYý-Oå°~Å+=ò&‘vòoŒ+MÝ$Iv•0”"™. 8ÓÅÖÜJx…!9XRq•oÝ5ª~Çh=$Z´œ .®´ÚlöËTTDˆÊ[þVøJ‹Øó¤}¾yåDý«a#~Ö­¹´ˆË^­gO-Å“[‹Ò–áBUºCî>]AQH PA Ï6‡.B§:Dƒ)ö­·-zq…ÀÖ º*D¥’ˆ=õºò—Œºv¤¯nsµ=ür¼ë §µxaë“3>)&,øŽ©™ ßÚ´óÁ唞G âªéèbÓ)æûcÔšƒQÄmAB÷[ 9èiæ^áAÐS«¹XoZœ4¦¢_ï.Ï„0TÀi¦¼||±ü˰«™ô¾é¢>—aÙtÌK…ãG]f¬ ¸¸ÑXZŠ‹D«‚¶Çqà ¢RßLPkýn•w× Z Ï]¾TýŠÄ´gtu¸í¹ p`ƒ”’"*Óòìvçeéúq»¤ Œ¹÷7 ÁcšƒsiS›ŒZe.§Zà£q‚âò’ƒ±zr¿FÓúŽ#˿۬Seiä[l¹Ï¥¦Äµ;n- «–r’¬`òIåZùÒ\K’!ÆÚµ¦ßn–÷`×r6 }m²¡%Ã)À÷9x¸R•=µj<·€ê‹ÓééèJ;ÑœNK{qÜœàìúkã¡üÐÿþŽÛÿvnµ¼®–:8§Ò­kb\…° ²‡Ñ•(§˜†¶gC,»¡ýÃí-§›ÓðãkIJ¡‚0Aø*@š‘÷ÏæR¾ÅIVÌ:«ìI!i¸¯¶¥drR”Ñ™*ú+6¨ÓzMîFZý¼ý½ÝñÿØ1W½Ws B¹8†Ñº/@JáòqH Pî»Øï ÷Ꙫ:=Ôv¸äé ¢Un¸H\÷­¯5ÄuÇT”¡·V°$ü‹r¿ßä;!HèßT{éQîœÈ¨œÿñûØ8 wêíQ|“y´DDÔÇS±5$ …4œåÃ?ozÐ2›Ô··í¶æt ÖØØºÇ–ô‡ÖÈm)mY<’µÍ[ú+ý!Œé9)Æw8ÊqŒç. c9Ï{V{ÛUö¦—y–㑤pÒµ8…­¬…äœã–’Kœ¹+vþóœOå7Ýco‘tÓ²¡ERòÂJ7Œ¤”¨+~Œssæ9g"Á®\+ÝÔw¸ísºæI<Ô{û•ßÝöç;ò¾±D\wä».Ø$o8½$¡KkaP(WuÞçýüóâ}²¸™•½ZÿFŸÍZ~Ý¥5|‹Å½Ë€˜ñå -!{”¬(wÔ¥|uù=ÑÉ9Yp a€P~Ò” R” R” R” R” R” R” R” R” R” R” R” VŽû$>ö›þ‚oïÑkxÖŽû$>ö›þ‚oïÑjéÊK›©JTR”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥dè$ÉjÍs0Þ”†ß¹´¤´¤©¤ƒÝ©#ÁøLÝû“öò‹L¶Yi²ëŒ÷I PÀڳϺüç¨Î”­;2Ën».âéuÔ•%(DµƒÜ‚2IZ~Ë'ù§©^ügnú‚ýµ]Y”ŒiÿÊò›õéÖŸñl¯)¿^J÷ã;wÔí©Ô¯~3·}A~Ú¢iÿÊò›õéÖŸñl¯)¿^J÷ã;wÔí©Ô¯~3·}A~ÚÖŸñl¯)¿^iÿÊò›õéÔ¯~3·}A~ÚJ÷ã;wÔí¨iÿÊò›õéÖŸñl¯)¿^J÷ã;wÔí©Ô¯~3·}A~ÚÖŸñl¯)¿^iÿÊò›õéÔ¯~3·}A~Ú¿-Ͼá’Äß+Ü%©¼„¯¹J€<Çr±Ë'<Ï~ƒ÷­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½:Óþ-•å7ëÖU(1zÓþ-•å7ëÓ­?âÙ^S~½eRƒ­?âÙ^S~½i¯²M oM°AB•Zö’ S"(_ÌkwÖ˜û(þâ1óÿy…WNR\ÉJR¢”¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(;?¢ÿôÿÏvýøTÄíg×+RµzhÂEŽ*'ï ßÖ")ñ0;®"FÁ“”¤ÿ¶Cô_þ‚ßùîß¿ ׺cVê]Io¸9¥´ó­Ze)qUÛCìl‡âPûbÆÝì²á@QÂâ3ºêÿÑIÂé&×Î¥¨Vû¥œªÑo¶J˜ôE&ím3ÓLGÛÂP– »ãh¡&KI'¹^INp¬xhÝ%)W;Y_b3ó)ÉLJr2ãlu˜-•nTv”ü¼' ¬äîVþŒ£[àÙâÂÕš‘…Y™r¨ÜF¡-,ƒ< ýá²Atöõ&ob1t³z÷L8,®"TÓöÄwíòͲHŒê_äÈ/pøhZ‰!jJ²¤Œs°kø è×Gê}LçV•¨`ÅZ‡縒]Š_Sm¡kï!Ìg$ŒÀÇè'H3r²Îë—7\³&Ü"—‘Ť ˆuL—PHZP´¡[–v‚¬ÕÂÛ¢íp,úBÖËóΓáõ-i*sdGb.ƒïn¨÷!=нȇ•¤=%{¹D·Û®2~Z–† $4ÚÜ@R–Öõ $:…•4NôíVR0kÉ=$i¨ûîK¸°ã.´Ò¢H´KjZ–æâØDe´^àÛ˜Úƒ‹ø§3ú;²Ì³1jv]Í ³r¸Ü’¶Ÿs‹52ÒèÜšîÜ`‚”s89¯Ø:Ó6="ÓtºÁ¸-ÈÏ76+0ã­—XL„%Ä¡¸éiJR%:…¡[“Œó ‘±t›i‘©®ö‹¢ß‰ÃºÆ‡o*¶IFRü8¯6R‘µ—ãë@K› ÀNÝÀçÛOtŸ¤g³nÙÓ6T¥ÉbÓ)˜ÊzC-:ÎJ’¤³ÄKÍ”%kÎU·%@Özt-½P¦Ç•r¹KruÚÞL‡ÐqÉ@ƒ„6”„«©¶TG5/nÐ@Nƒ£+ —K;]ÉqDÛdÝî8‚æøˆ†FBÚD·rÉ*^ r6„¾œÖšoPÜWÓ=ÇßKJyq]i´•©ÆV´„¼€TTÙP“Ϙ¯hu/?>¹yý•;'Ç×/"?²©jPDö"O®^DeNÄIñõËÈìªZ”=ˆ“ãë—‘ÙS±|}rò#û*–¥Ob$øúåäGöTìDŸ\¼ˆþÊ¥©A؉>>¹yý•;'Ç×/"?²©jPDö"O®^DeNÄIñõËÈìªZ”=ˆ“ãë—‘ÙS±|}rò#û*–¥Ob$øúåäGöTìDŸ\¼ˆþÊ¥©A؉>>¹yý•;'Ç×/"?²©jPDö"O®^DeNÄIñõËÈìªZ”=ˆ“ãë—‘ÙS±|}rò#û*–¥Ob$øúåäGöTìDŸ\¼ˆþÊ¥©A؉>>¹yý•;'Ç×/"?²©jPDö"O®^DeNÄIñõËÈìªZ”=ˆ“ãë—‘ÙS±|}rò#û*–¥Ob$øúåäGöTìDŸ\¼ˆþÊ¥©A؉>>¹yý•;'Ç×/"?²©j‹†Ìd^ëí‡,¡*¸¥@ޮߑÌädwÇ|Aó؉>>¹yý•;'Ç×/"?²¬ÛTø—K\KœxÑ&0‡ØsiNöÖ¤œÈ#‘¬šžÄIñõËÈì©Ø‰>>¹yý•KR‚'±|}rò#û*v"O®^DeRÔ ‰ìDŸ\¼ˆþʈ“ãë—‘ÙTµ("{'Ç×/"?²§b$øúåäGöU-JžÄIñõËÈì©Ø‰>>¹yý•KR‚'±|}rò#û*v"O®^DeRÔ ‰ìDŸ\¼ˆþʈ“ãë—‘ÙTµ("{'Ç×/"?²§b$øúåäGöU-JžÄIñõËÈì©Ø‰>>¹yý•KR‚'±|}rò#û*v"O®^DeRÔ ‰ìDŸ\¼ˆþʈ“ãë—‘ÙTµ("{'Ç×/"?²§b$øúåäGöU-JžÄIñõËÈì©Ø‰>>¹yý•KR‚'±|}rò#û*v"O®^DeRÔ ‰ìDŸ\¼ˆþÊ´§Ùë®év¸ÎVÛ3šÞ@A¢ €p‘œ]\ùöC}ìÍqÿ1WNR\çJR¢•Óz¯P_™ÕfY½ÜÛi¹¯%D¥„¤òÌ•Ñ:Çïºóó÷ÿÄUoF\½\²ê?Ý~¸ç¦²ê?Ý~¸ç¦¢©]háY\¢ö×" y©Ô×0🔵uÅe¾.ù%\.GíıUð™w§Wif>­½©ë”u8”­Å¤7-l!ÎçS¸àA?±om²Ì&I‘ÂfÝ"3¨j§ÖŒóŽ9žcºÇóÂÒ“eYL‰e¥Öa! szÜ@ûc¹k VpvƒŽg4j©µ¨[eJÕ—8íðZSÊT‡UÃ[»”Ò;’I,‘Þ*'õpÕ6¥GjN º‡œmjq¾¶¿{R^q¢œ…y·œÿ?ûëáz‰ ·=Áe Ÿ%Q×!OÆmÖԦéR€XWt ¦ÔTFJ‹‡ zžçe½:©aûƒ#Ãkª¡IV÷Ýu9WÉÀ#Œý °YÔçË7»Ãޏ ”!œ*Q<€f²Ñ;\99È™¨•-´î[Ç‹‰¹”ç sH¨{D”D¸4û‹u Sa* GÚ«’‡>h<”2’FsS®v™L¿Çfµjeĺˆé8Z8¹ gxKiQuGd ÂjD±Ó|ÕjÙ¶ï{;ÛS¨Ä—{¤';”9ój²~ §ðW«·-hÒÙmÛ† BßqM4•<ð.-*ÚRž|ÈW"Ãʲäê+tÉŽÜd±-¹&<Æi½ª@ã—”TpN Ûvàw·gýšÄ‘ãê›ÁÇeª×*VT”-6ƒ·8% pàgùæ‹õ}¢v¸rs3Q*[iܶ9s)Î@æ>‘X]²ê?Ý~¸ç¦¤-÷›|Hï[ÐüµÆW H~DdP\;C+VÔÅ<‰È'ý²r’©·3¿sï-Ó¼‚¬¨“Ì€yüæIŸ,ÞÙuî¿\sÓNÙuî¿\sÓQT«D¬ ºp6~—ÓoO™"S¢lô…¼áZ€Ùã$÷¹Ÿ¦µElþ˜~ôtçÏîáÄ­a\5eêÑÿ˜)JTh¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)AÙýÿ ·þ{·ï­ÇLíC%‡Þ”–™ˆÂЖd¸Ð RÝ 'b†~Õ=ÿÁU~‹ÿÐ[ÿ=Û÷áVØß}¾eûïÕÕ™H©¬´Ö÷¾>Ô© Á“f‹«%M§©JRÙp”©Ä ® nAN8„÷XÀÄ»[õÓý!F¹4íÁ«Jߊ¶Û`¥B;@#ŒÛ©2‚Iß•ž ää6M*+IXdj)Úž-®Âé&ã(ìâ“zKì)ä\!—T”¥Â¤I²­»Ó³¿»Ù'©Þ~$Û¥»TÎn Á/ªú¦f<…1! !)˜YAJ–ÑÜ…7”•§h•¹éA¨¯v^’—y¿®<Ë’“!™âã:”´R¶\‘•K5%E¾í,¸s^ UNß,wØú¶Ç؃}™oŽZëë’Ã/)N-Jâ׃öªmÆÈ H ÆÀ¥; iÐY™³Œ¹)Ùœpd¸×ðìPÏ{á¬^ÂCð×/9HõêN”„‡á®^r‘ëÓ°ü5ËÎR=z“¥ga!øk—œ¤zôì$? ró”^¤éAØH~åç)½; Ã\¼å#ש:PFv†¹yÊG¯NÂCð×/9HõêN”„‡á®^r‘ëÓ°ü5ËÎR=z“¥ga!øk—œ¤zôì$? ró”^¤éAØH~åç)½; Ã\¼å#ש:PFv†¹yÊG¯NÂCð×/9HõêN”„‡á®^r‘ëÓ°ü5ËÎR=z“¥ga!øk—œ¤zôì$? ró”^¤éAØH~åç)½; Ã\¼å#ש:PFv†¹yÊG¯NÂCð×/9HõêN”„‡á®^r‘ëÓ°ü5ËÎR=z“¥ga!øk—œ¤zôì$? ró”^¤éAØH~åç)½; Ã\¼å#ש:PFv†¹yÊG¯NÂCð×/9HõêN”„‡á®^r‘ëÓ°ü5ËÎR=z“¥ga!øk—œ¤zôì$? ró”^¤éAb·®q¸¯8ÛÂ⺧”–ZQ”I<ÔO3ðÔ¥FYþèÞ¾zŸÝÙ©:HaI½]$ɇçÙ˜€Ó®4¦Àa¥ ¤ŒŒO/„Ôì½Krº;pK ͸¡ç™i;ºÌd±<'3Œ$sñ†Å¬¶qd³ýѽ|õ?»³Q’5ŒVåÈŽÅžõ3€ê™[‘£½'gw#ùñðñ<)¾Œ¯òíZv;s£º»e’=½m (d2óižeÅÆyIQä7$6 žœk£ˆj“L¸6מ7¹Òî “"#Ê’¶Ù9Ð u‚P{œ¡GŸÃ1Û’>Lê_¨ÍNÜ‘ògRýCþjuNF÷eÆ\Vgu½’‚·q*´%RŸu§£ƒÝ†Üi;rŒpRˆ¬ûŽžF›Óò.Qí¦N¡]êDøŽAŒ·Vò×!÷iÅ÷-:¦Ô¥aâ(ç$;Û’>Lê_¨ÍNÜ‘ògRýCþj M=hE»O·n“ÃâÂ×1E=ËθJÝVÀ¥)G€â¾»_°ø’ÛõTz*'·$|™Ô¿Pÿš¾S­ã©jm úÜF8¢*T¶óÞܼ§?qŸ‚‚cµû‰-¿UG¢¯Ø|Imúª=Û’>Lê_¨ÍNÜ‘ògRýCþj n×ì>$¶ýUŠv¿añ%·ê¨ôTOnHù3©~¡ÿ5;rGÉKõù¨%»_°ø’ÛõTz)Úý‡Ä–ߪ£ÑQ=¹#äÎ¥ú‡üÔíÉ&u/Ô?æ –í~ÃâKoÕQè§kö[~ªEDöä“:—êóS·$|™Ô¿Pÿš‚[µû‰-¿UG¢¯Ø|Imúª=Û’>Lê_¨ÍNÜ‘ògRýCþj n×ì>$¶ýUŠv¿añ%·ê¨ôTOnHù3©~¡ÿ5;rGÉKõù¨%»_°ø’ÛõTz)Úý‡Ä–ߪ£ÑQ=¹#äÎ¥ú‡üÔíÉ&u/Ô?æ –í~ÃâKoÕQè§kö[~ªEDöä“:—êóS·$|™Ô¿Pÿš‚[µû‰-¿UG¢¯Ø|Imúª=Û’>Lê_¨ÍNÜ‘ògRýCþj n×ì>$¶ýUŠv¿añ%·ê¨ôTOnHù3©~¡ÿ5;rGÉKõù¨%»_°ø’ÛõTz)Úý‡Ä–ߪ£ÑXÖ=IëpTã BZ/Kd6T€@È'#õþ^Ì޸퇣Zç¼Ê¹¡ÁÃHXü )`àü}¯Ø|Imúª=‹*Ûnu´9X«\µ!je” ©<N ˜ÈÌ+$^]i-Óc%×iq|5$(òíQ#'–qŒ‘_·º6_ž«÷w¨$ëŸ>Èo½ù®?æ1« ëŸ>Èo½ù®?æ1ªéÊKœéJTRºÓIÇÕºš,éÈ×—x fá"0i-¶àÂ@ ‘žö<÷³ž|¹.»¢9¦îŽ8—7ÙHîTr\r:ÔZûØmL̹_é þâšm—›m‘¸¸µ¤'?…üü?9úöU|³Õ_DZ›”B¯’”’,À ‡ùCµán‡ã}½¸ô©ŠTKŠ”3qu G¼Dwj‡Ô;èIÚ¤7”­caK«[ÓªJ"ûª¾Yꯢ-;ª¾Yꯢ-J]-ö=e“y¸O¼3×Ê}ÕÝf;±¦RÒŠˆâ¾QHÁ*˹ÏÍþ¶‹E’Ts­·+”È«m§c¾‹Ü—êd¡[¸¤,Ãd“ÛœÎxÎïuID7`uWË=UôE§`uWË=UôE©GmIµÝlj&ð¤™*aàíÂL„)®ª@Þö;”[;ʩաë%:¤¢ØUòÏU}iØUòÏU}jË©ïÖ3fró~žÔ {N4Û²ä†ËŽ%´öFå¤@s$M{ÞîlÖI·«“üc9*KÛJ¶4„•)XH$àp'à§T”Tûª¾Yꯢ-;ª¾Yꯢ-X4®¥´jhó´®YêRLY-Ë‚üGZwbÚ¦ÞB;‡sŒaB¦)Õ%~Àꯖz«è‹NÀꯖz«è‹Y/ô‰§£ë—4›ým—›u¨«œãA1-Ô‹¼œñ…%@íØJ’ÛÈA·Óª«J(ýÕ_,õWÑÕ_,õWѯ§T¥Ú÷ ¦ß8=š¼Þ.| Ü.¹ Ü=ØÎÝÀã8ÇàîGoüyªÝêÕ»Zj{ŧP[,¶[=¶sÓ!Jšã“îNEm¤0äfð8lÿÕY4ê’IîGoüyªÝêÓÜŽßøóU»Õ¯ÙçQ.ÅeÔ#RÙmÑoЛßڜˌ¤4¶á àJ{Ó¹a HÈïdTü5äÛK7hÚëF9ö%¹LHئ”Áyì‡{9üê’Šÿ¹¿ð=æ«w«Or;à{ÍVïV¥íººçë™zŸLj‹]îâ«sÙ`)”´êXy⢳)ä¬{ÉN9ÖħT”jOr;à{ÍVïVžävÿÀ÷š­Þ­m(rºÄ‰pöõgƒYÎwe´/?ÍöøÿudÓªJ5'¹¿ð=æ«w«Or;à{ÍVïV¯óµUª%ÊE¸µw“&6Þ0‡h•%(Ü7TÓjNqÏÍx¹¬­M ­Ë~¦JG|7pÀÿìiÕ%or;à{ÍVïVžävÿÀ÷š­Þ­mK|Ø—mLƒ!¹ÝHSn6¬¥Cù{ÓªJ5'¹¿ð=æ«w«Or;à{ÍVïV¶Ý)Õ%“ÜŽßøóU»Õ§¹¿ð=æ«w«[n”ê’IîGoüyªÝêÓÜŽßøóU»Õ­·JuIF¤÷#·þ¼ÕnõiîGoüyªÝêÖÛ¥:¤£R{‘ÛÿÞj·z´÷#·þ¼ÕnõkmÒRQ©=Èíÿï5[½Z{‘ÛÿÞj·zµ¶éN©(×Ñt…ê(H‹©u;öðÙ†œoVåã…\Ïá<ëÔi­HS£Vê`⒥쉒p ü'é5|¥:¤¢Úö§ùaª<˜”í{Sü°ÕLJ¼ÒRQFí{Sü°ÕLJv½©þXj&%^iN©(£v½©þXj&%;^Ôÿ,5G“¯4§T”Q»^Ôÿ,5G“¯j–£É‰WšSªJ(ݯj–£É‰N×µ?Ë QäÄ«Í)Õ%n×µ?Ë Qäħkڟ冨òbUæ”ê’Š7kڟ冨òbSµíOòÃTy1*óJuIEµíOòÃTy1)Úö§ùaª<˜•y¥:¤¢Úö§ùaª<˜”í{Sü°ÕLJ¼ÒRQFí{Sü°ÕLJv½©þXj&%^iN©(£v½©þXj&%;^Ôÿ,5G“¯4§T”Q»^Ôÿ,5G“¯j–£É‰WšSªJ(ݯj–£É‰N×µ?Ë QäÄ«Í)Õ%WFµý²Ë;R^nQ&C’ë¨yÄ´R¶Ô„€ A'‘Ýžèƒý»µëw„¹yÎG¯Th_ø¿cùÇüaP:²Ës{¥·å ,箫½Û^µ\‘Õ¦=¹W¬¶%Ãe8Dð¶•ÍÂûdw¹Ù¼Ç“im~×­Þåç9½;^·xK—œäzõ«z&´.'K3f@±?n¶›cèqBÅ"ÚC¥öŠ%Ç–¾¾þЬ>…ms¿ÄÝ6UxÄnߨb1ÙE§¢>·ô§I[!$oQÇÛ«½øjN±.}ï™Jþû—P)UMqTO Þ盋uÙ B ’Ê ²r–GÚ§zМžYRG|ЍtKe×Ζ5mÃV[ …]-]vl[ƒÏ²§RüÀ†š a°[RB’RÚŽòêŠCmT`ˆÝÃPËbK²ƒLÄam¥™N4”·‚‰Ø¡Ÿ´OðTb[>ú.?2‹ý÷è>û^·xK—œäzôízÝá.^s‘ëÕs£«oHpµ.¦W^í“­ÏÎJ "<$uX©ÞÞé.ðšÞ—h§%{œÜÂj#¦ëkso}ëÅŠUóN²Ì´ÉŠÍ±ÙàIR˜,¬²ßuže!.÷›[‰QïT™¤,EezízÝá.^s‘ëÓµëw„¹yÎG¯Z*ͧ5S7»¿Z.2ukoXÔÍÐÃqî fš†&£®Ãhe»€[Jæé}²3Ž{{¥ø“gt64(Òe‚üUJ%×â&KJ’Ò@梦©Ú9œàwëSªEè—ízÝá.^s‘ëÓµëw„¹yÎG¯ZyIm‡nºJ|­×¥ª­½= ¡µ©ˆ."ûL¶YuЧ%ž HR”—Öâ°â”pêÎìçt3=^"L”éí"Å»}…‰O3º¿] (³È(ÉmÁÜ/+hníÇ9ÏÔŽsŸÃpiËÌ[í½Ù±y µ6T5@|y0³ÈžEM(‡dÈIV›ÑÝL·³zv{–¨w 6¹-Rà•¸»cL¹:\h­) ¥¹­$sܬgÕ ¡»ó:Zái~ªRß—æÚUÝ”FÜÒJS(µ†Š9K»¿•ÚwEoçTR“ŽýWtçßž¥üÑ?Â5FÓÝí"Z5°tÚ 1åHh!kYD0Î#4cDFîò[|  £+8¼é¿¿=Kù¢„jÌQnë]8‹ù±õÉKCéŽâš‚ûŒ4ê±µµ¾”³¹=Ê”1ËXª“bµjÍ?s“n··c•c“t~y”ü‡Q)”¾òžu¾l¥Ã¹k W8r“ŽtSÑMþêþ …—î»m»©÷zäÄKŽûlÄ}<<Z.¶A _&„šA-Ãp¹Á.Ý[ü7®RLX‰Ø£Ät4ãÅ9¸iÓÜã¾@9•¦uoCÕÌÞ¬ú[H̓QM²âHp75¹ Z¸.`¯{¶¨­Q“»)UEê>‡u<ýCª&µs‹$^#ÝfS³ei£¼ÛLº„ÃS®4Ùq#bT”„Ósfî¸\àÀ—n‹-þ×)&,DìQâ:qâœÜ4áÉÀîqß ÊÓ:·¡ÈêæoV}-¤fÁŒ¨Î¦ÙqNƤ8šÜ…-\0WLj½ÛTV¨ÉÝ‚”ª§t>ˆŸcéFý©Ü…gâ$ahy2f:¥¼•…LvÜmIËEÇRÐ’ŽmÍ›&•ó¸~n†ƒê•ó¸~n†ƒê•ó¸~n†ƒê•ó¸~n†ƒê•ó¸~n†ƒê•ó¸~n†ƒê¾Vv¤šn†¾\ ¤Ð@À$ô›“ßì)ÿ¡5¬ým£è h+dnòb¡ }o²†áƒ»!Å êçÜŒJ¹•MÛÿñ0RŸñëÖÂÍØÙa”NІËI-¥QŠÊPGr NHø>žù +ýAqÒÕ6.ÂÝÓ2:$0—Ûuµê;¶Ê¬$þƒ‘Ì£d¼}Ѳüõ_»½Qw&®IT5H—ÖDÖ7¡¶ dûàÇ2¥µƒŽ_Ÿà2—º6_ž«÷w¨$ëŸ>Èo½ù®?æ1« ëŸ>Èo½ù®?æ1ªéÊKœéJTRº÷£%cIÝ}ñäfÿ {Ó{ʲèHÁîOxœw««¯z2V4×ßFoò½7¼«.´Œä÷‰Çz®ÉºÂÊvMR8Mµ¶%¸llå ÷ç9$ü |™`{‰uÔ(ãq8W#où,umÇ{;ùÛµ¯¶ÎÃ»Šæ#m–§­¥2Û%mÉ-¶r”aç;‘üýYvx·]BŽ7…qB6ñwðÿ’ÇVÜqW³í³·k_m‡wÈ®|¶jI·£¨¬jn”5 …êЄÜc7h!æG "à;¥…d~ó©Ë>½´è‹Ðzß4˰\¥¥2mÍ!Jr3î«héÆU¹jÙO5V¼©.ajî€`Ð×YZwUj™Rm¶·Wo‡²3¥Õ´Ñá7µ,nVJR09ŸÏSý tXü9 jZÊMÔ$õX™ D‘ƒÌrS¤±ÈR“Ê_Ÿ§Õ뉭œ#G©ÕY–Ô½¡2.Zuä³Å ܰ®þbȳÂ^϶ÆíÍ}¶7Ü'1:S¹Î²ôcª¯6Çø YfJŒîÄ«†ël­HV8 EeßX ºiÒÞ¸­@ðwðÿ’ÈNì𗳿ۚûlo;¸N{ê›4]G¦.ºzk7é èo­’‰C¨(QI €p£Œ‚3ðô;´Åîñn•%®½"êKŒX“Ø’¨²Z‚–Ý\wÐêøp½»ÛN@PÈåš­jqoÓjm[—%ÎÇpbØÓhRÞ·9Õ\Ph'TlGú9û×6¥úOèYû.–•zÓ7Ý]~½‰qCP1—ø’[C™ÚÂ06)gvä„ã$€ L£¢¥i®†µ›ï³Ù}_sÓ³c©Q›Sœ=Ì/lXÉÆâÛrq¹ÅH!óéÓêõÞlá§O©ÕY•·¡ÙqçݺA—Ðë+Õ'j€#8·Â¿üàÖÁ­Sö5Ɯ͛VI›k¹Û“3R8ütO„ìgoªÆHXC‰J¶îJ†qðÚÕÛOþb®ºq AÓ–‡¹ÈEÇSi¤È[’£!Hp%Jk%™±Ô‘¹RZîyd•! î¼Ó¤ÆtͶð"ýÆ+LŽÍMCéŠØx8–Êa¶­êVIScrRAB ÷•%'¥ºŽf„¹GÒ‹)»(6[J_à­ÖÉ/4‡?øk[AÄ%yNÕ(ÈÆá¤-7Í?K«QË“ˆm®,+y½» €á„È`C„‡sÂASi)GWÇÕÕí^#.±]QNÍø/ð_—lj¨o³?bÚ}O)-¾Ó<â u„”>²*(J ådãhTÅr·B’µÜ»óé{4ÉzBLY™ÆØÅ³iNÅ!ÆÁ”¸ÄTçz”ÜvUjwí=S]âkaAÖÌõŽ“¬mpb½9uî$Œ¶•Úûãj¿²«ºúKúvƹÑ,:uç̉ sxb;¯–Àá£a­Y;J¶«M£U2é^Àß3ÿ÷rìvHGúÕ³¿Ü«û*ƒ«Ü´ØzM‘'Rć <ëS1-o²ÊT”¨¦bd¥*) K¬˻؞øAÚÕ4ЬEeÒ Ú˨ºÕÒíIÒŽ©»Kåb+ˆqÆÁop#k\‰ I#¾~èzäžfiÛãœ]<ÓK˜›]âT×Ú@ e<±¸ ó‘(¹æJð:þ‘5Š“”l¾x?2“ýö*J£d}óÁù”Ÿï±RUQ¦´öˆXtAÑÎˤxìGÓQôiPºÓ"±Ýì+Hâ#aÚ¥nHÞ¬¤æ¼´µÖÁ¨º7_EöKÔ$ß4䶬5ÕÄF7E[ÔÉ{kiS‹à:”)ଃŽsýk §º7ÒÖA­4Õ¦ím²Ã‰6Ë« ½æØBV…¡JAëRZlºm:ÅR¦t«Ñ[6¿t7µx’Æ¡mS8\øqŠH ³ÝwXìÐm}n“ÜýË„K\{”­X^›ØæŠ[†Û5 ä÷K! Bwœ°rHÂFÍ­gÒ&®Òz®û¡¡i]Mf¿H‰¨ ¹(¶ÎjIe‘[{×±GhÞâ“ð¨VÌ ´}мüõ?»³RUhû¡yùêwf¤¨*vWÆ©Ôë^N'Ç)Ã{¹ˆ©ÇæçðÔeÿU&ñj•ÇZ–âCÀ›\QHI!`ç¹'<êUj‹6ŸÕ—è×y]YǤ²û[㺤­":SP’<檵ÇZh9s™~Då¹ÁSjBƒrûÉÉ`Iæ{ùÿuI‘y覡A¿Û"%H‡õ- 6VU±$fTë+uµ1!NŒ  r„ãíÆ;ÿ gÐ)JP*4¹& òD´[¤ÌiøÌ¶8 l© tœïZ~8Æ3ðÔ•`=&zîNB3Êi”:⟦†VB³ö‡=׳R¾O]<¸þÖš•òzéåÇöµñCâë_œö4Æ¡ñu¯Î{¾ÍJù=tòãûZvjWÉë§—Úׯ5‹­~psØÓ‡ÅÖ¿89ìh>û5+äõÓËíiÙ©_'®ž\k_Ô>.µùÁÏcLjZüàç± ûìÔ¯“×O.?µ¯‹gaØàDxë›mx9’öS‡ÅÖ¿89ìkÖÙ)3­±¦¡ Ê =ðÇë Ä³ýѽ|õ?»³Rugû£zùêwf¤è#,ÿto_=OîìÔ6œ¶Þnæô6`¼Ì«œ§AvRšRHp£ «?iœçá©›?Ý×ÏSû»5„ýí:k£kþ£[ ›RnsTÒN §^^Ð~ íÅ&ËY£ß¨êÄmžpsØÓ¨êÄmžpsØÖGš‹P\/·{¤çf@Z_ƒèÍ©9!¢Ž©J;WÌ8Õ¥HPwZ³Hš«GPþ#lóƒžÆGPþ#lóƒžÆ¬ô¨+CPþ#lóƒžÆ° Ø/ñ.· ж­SÃAMõµ¤7ÃNÑ…pŽì÷ûÃÏWJPV:Ž¡üFÙç=:Ž¡üFÙç=aè.­Ú¾ÿ~´D¶^¢.Õ$4—&Z¥ÇK¨,0éR‹Ì 6½Ï”†‰ÞR°6¨üé Pßà_lúMö=©·ò%*DØIm(eqÚÙÃiIVT¹-ådíBRµ@©3B"¬Þ£¨¶yÁÏcN£¨¶yÁÏcT+/KËÏc¯qmðcÙ‘i‹"#‘Þ\….spÕ½/‚@lÜ ISFÓ‰Òò^žÒÎÜ-ì°ô×%E…>O .ÉÜt)xçµ*t(‚@<Ç~µ1AáÔuâ6Ï89ìiÔuâ6Ï89ìj¤-c:â1 6vïMH|;9ëT¾!¨.#ù.ðë*WdYJ·¬†Ãn)\†Èѱ©´]R&9Œ.¶èóƒ%[‹|VÒ½¹øq»¨0:Ž¡üFÙç=:Ž¡üFÙç=k¨],j…[`Lz ¥gQ@f]™3íŠzL[CëRˆ|qaJ[{[uñ‘°:4Ô7+ìK³„ÇTÛTôÄqæ"»¥q˜’…ð]*[Gd„¥HQ$)*üÁ%ëÔuâ6Ï89ìiÔuâ6Ï89ìjµ}×·ØZÖ\xÑà-ºóÏ%¥ÆyO¼äž¨8©x+†ØAœÎRJ–ém8ta¯oºŽïknía߬Î^ &ú­¿1•þ$z€hnÓ6Æù«|dO½¹ï]圣ùè=ßQ]½‚\uÃÙA.'iÊÈr‡ÀjFñ÷FËóÕ~îõF¼smc»ux¸2=ñHÃéä9C¼9T•ãî—çªýÝê :çϲï`~kùŒjè:çϲï`~kùŒjºr’ç:R•®Êègî×úîg÷ëk­º4…w—h¸.Ù{ìki»KJÛê¨{zø¤îʻ܊F?òç᫲n¸Lû½/ú(¼;_+kQø]ƒÛ9‰.%èâEÁöJŽP[ ¡Ô¤qkš6Œ:â¶oA/x"Å~:㺇Üu mjrÚ“”¤’±È©_Ãùª6ó}¬Ã —oeËn(ÛmB8eyÂ3œc½Ë?„TTûò58âð,öw1¿…¾èâwc³v#¹Û8Î8Žãw Éi~äì»|¤²KI¶¡²¬¨'í²qßÏ{à »Ò«=®ÜüimóB=jv»sñ¥·Íõ¨,ÕsÒÚbéz‹{¹éË<ë¤MZlˆM¸û;TŽ(' %C‘$Ök·?[|ÐZ®ÜüimóB=j 5*³ÚíÏÆ–ß4#Ö§k·?[|ÐZƒ×Wh˪‘Má™ÅømºÓ.D¹I† ‡ jZIaÄZláYæ‘UKçBZ:æÃM·/PE-¹½\K£—ÝHضfñÙPÉ FB’’ÅY»]¹øÒÛæ„zÔívçãKošëPR¡ýúºýÊ\U0ë*ˆÂc[Zp9´+ˆ`2Âä -JH W.f¶ÝV{]¹øÒÛæ„zÔívçãKošëPY m—RéBK‰IJUŽ`døÐ+ê«=®ÜüimóB=jv»sñ¥·Íõ¨&¤Zíò.=¥¬÷ÉMyöÕø‹MV5 9öKK÷'eÛå%’ZMµ •eA?m“Žþ{ßHö»sñ¥·Íõ¨&˜µÛØp8ÌF±Þ!5™Už×n~4¶ù¡µ;]¹øÒÛæ„zÔD6Úµ! JœVå0TpOá8¸WÕV{]¹øÒÛæ„zÔívçãKošëPLO´Ûç¬.\VÝPï ÅífÉâö|‘X=®ÜüimóB=jv»sñ¥·Íõ¨' Â‹®VRÒ?EdUgµÛŸ-¾hG­N×n~4¶ù¡µš•YívçãKošëSµÛŸ-¾hG­Af¥V{]¹øÒÛæ„zÔívçãKošëPY©Už×n~4¶ù¡µ;]¹øÒÛæ„zÔjUgµÛŸ-¾hG­N×n~4¶ù¡µš•YívçãKošëSµÛŸ-¾hG­Af¥V{]¹øÒÛæ„zÔívçãKošëPY©Už×n~4¶ù¡µ;]¹øÒÛæ„zÔjUgµÛŸ-¾hG­N×n~4¶ù¡µš•YívçãKošëSµÛŸ-¾hG­Af¥V{]¹øÒÛæ„zÔívçãKošëPY©Už×n~4¶ù¡µ;]¹øÒÛæ„zÔjUgµÛŸ-¾hG­N×n~4¶ù¡µš•YívçãKošëSµÛŸ-¾hG­Af¥V{]¹øÒÛæ„zÔívçãKošëPY©Už×n~4¶ù¡µ;]¹øÒÛæ„zÔjUgµÛŸ-¾hG­N×n~4¶ù¡µš•YívçãKošëSµÛŸ-¾hG­Af¥V{]¹øÒÛæ„zÔívçãKošëPY©Už×n~4¶ù¡µ~+O\’ 7[n?ªëPYéU6b-ØÂL~´ì·b•˜­œ[vç˜lòÏ|÷ë+µé¾0ƒæ¶ý4°¿ñ~ÇóøÂ².Z§ZYúJ[»{14[³ãÂ…5»z^/)æÚB7¼%ïh™.ùÆ)ÀOt7n¶æßÒýŠ$—yÆí³ \BA-`m+á9È«„íaŸ¨Ñ~œÝÂT¦ÝmöÚzé%qq-1‹œ¨`BÝÝwùÖ§dîªta¯oºŽïknía߬Î^ &Ù[„äóÂR;ÀTV¬Ò–-RÔvïQ^pÇ*,¸Ä·c:€¡µi4¤«j‡%'8W,ƒŠ“ZYc7kk/KËÏc¯qmðcÙ‘i‹"#‘Þ\….spÕ½/‚@lÜ ISFÓ‰Òò^žÒÎÜ-ì°ô×%E…>O .ÉÜt)xçµ*t(‚@<Ç~¼NÒ=›‰wM-Hˆ ¶Óî">YZR˜JƒKR$©I%8#¦o¶«}òÑ&ÓuŒ™0¤£c­¨‘‘œ‚Á ‚Ejiz$lÕ‘zBÖ3®)ÓÓgnôԇóžµKà8Ò‚â?’ï²¥vE”«zÈl6â•È`l{›EØõ"c˜Âën82U¸·Åm+ÛŸ‡±šˆ{£Mõ©«jíÒ¸m>ãáôܤ¦RÖâv¸W 9Å^䀕,…¤€1j…<(lC†Ãqã0ÚZe¦Ò–Б„¤Þ1OÇ矰õªö”û×´üÉŸî °Õ{J}ëÚ~dÏ÷@³ýѽ|õ?»³Rugû£zùêwf¤è#,ÿto_=Oîì×®œŽÄ½=&$¦[~;Ò¦¶ëN$)+J¤: H=ðAÆ+ÊÏ÷FõóÔþîÍGÛ¤·Ë:[ÉyM±*k‹K,­×Kî„¥ž\’I<€&“r&‰]%¤¬:U§ÑeˆóFFÎ+ËvKŠJî©JH$%íNNɩʩi«å·QÙÛ»Z]yÈ«qÖz;Œ8•´â›q*mÄ¥i)Z’È©*V¢n• J ºT%(%cÄ‹é/GŒË.Êt=!m¶§–”¬¶VÄ!9<ð”Žð«4¥‹Tµ»ÔWœ1Ê‹.1-ØÎ (mZC)*Ú¡ÉIÎË â¼cÊ‹!Ù Ç’ËÎEp5!XQie XJ€ûSµhV<)'¼EEêQdÓ-0åâS­™A¦ØŠì‡7)A %JÚ‘ÍJÆË$Tšn±]™ç@éÍÄ»¦Î–¤D †[i÷,­)L%A¥©’T¤’œ S7ÛU¾ùh“iºÆL˜RQ±ÖÔHÈÎA`‚A"©§]iQy‹iMÙ.H”--¶\[tni*y)-¥KÒ•(d`Š˜½Ý YmR.—I):w:â8À ’I $I«>yÝ#6c½Ñ¦zÔÕµvé\6ŸqðúnRS)kq;\+â¯r@J‚–B‚R@µB6!Ãa¸ñ˜m-2Ói KhHÂRï­z÷HÚA›[WÜdðÜyÆ)·HT”-±¹À¶|TmIEI À#6xrc̸̈6üwÛK:Ú‚’´(d(ßsWŸÐÁÑ®‰a«ƒ(²îj{E—[rSËKm•ñ  Y '~†¶ “߉­3`µiËz ÚXq¶œuO:·¤8û¯8¬en:┵« ¨“€x ¦ÇéF¾Ô÷Qy n EçVägP— ØVÉR@};𜵸n wÈcN_mz†¦ÚŸqÆÐê™u°ã.´â{è[n%+B¹ƒ…pAïRY³´Vš©ÛÔ’mÊ]ŵ¶æá%Ô´µ·Û‹d+†µ£=ÊÔ’¤òÁÓZ+MiËŒ‹…žÜ¨òAo*’ë©i[Ëm%j)e\Ê I rä*n±Óµ#zzMÁH¸8¤#hŽâšBÜÉm t'†…«Ê ¥rÀ9ÓºÇNjƒð-7>û)+£¸Ú]@V¶”´„º€®Em•$sæ)<þ$ùçdþ¬Ò–-RÔvïQ^pÇ*,¸Ä·c:€¡µi4¤«j‡%'8W,ƒŠŒk£}$ƦN£‰ç zQ°"^f0Ám€M–t4[}¡NÓ“rsáªuE“L´Ã—‰N¶d›b+²PHÜ¥4•+jG5+O,‘X§]iQy‹iMÙ.H”--¶\[tni*y)-¥KÒ•(d`ŠG‚|¯ô¨JPMÒ¡)A7J„¥Ý*”·O¾«oÌe‰¢mq“+O[qg…Õ›â7€C€·ŒŽ÷:È}P¾c'üF*µ:ÂnÉm$gkr”‚yœp9ÐOÜS0˜mN©ßåÌTÀ/§ïõfÞ>èÙ~z¯ÝÞªÔHèëñµ¾áD†ÊC­`Àg‘žf¬·º6_ž«÷w¨$ëŸ>Èo½ù®?æ1« ëŸ>Èo½ù®?æ1ªéÊKœéJTR»+¡Ÿ¸_빟߮5®ÈèmA:~ìIÿòÜÏïÕÙ7^OzªúÏíì¿×Q¿üj±—ªÞ²9Uÿùê7ÿQP7þ“¡Û:Zƒ¤MÂĈ¥lŘÛÓ™½fBTYáµ»% w'=a$ªðÕ=&µùi[1®pìQîó£Ü®n0Ù!¸°f­æÑÝC¬{S’Ú€*ÍÆV›ÓîÚîV§ ïs©3{œuDûó¹$mNÒÛµ!8Ú1#@èÙ…Ý_´©×–óÏ–—-ãˆóKiÕp ø@­¬(íî·däàÔ½9ÎÿÒÚªã]'Og]É·ÍÒú‘“ÞÕºÒ¦b‰aÑrunqv„©¸‰Òû’ža=ѬÅôÑ£«Ÿ§rKó!M¨0¦][ŽÆmky´²— ùµà©´¥E8 9—²è-#hº1t…QšÂÛ[oȸȴ–Û}¤ ¸â¹%ŸHì/½Ü§êÑú²rn,‹´GeqKÍüKŽÊ”êJV¾n¥°³¸á;‚° B€5R<«ŠéžÄ,¶û ²ÜÔ‹„—cÇH›nÚT€‚w;Ö¸($¸mN J»Œ Õ“¤¼ûæoüTV Ýi­«·<ÅÙȯ:ã²»äÓ×´! ë»—ÆÆÐœ9¸Œ æôŒB´uÄÀßø¨¥…?¥n‘5˜ÕW86Τc[¬±®!§l’¤õ‡vJ )§Q†ݺî”{É5r¼kXVçn1{r•q…&ð«¬íi¦¡jv´Ü›Š‘qqM·´GuM!n[moðеã¹B”®X"¬í Ýÿpÿúkÿ°§ýÃÿé¯þ¤´Ö´ÓZŽã"ßg¸ªD†\£ºÚ]@VÂãJZB^@W"¶Ê’ <ÅXj*¹díwŠça{ÄÚ8S‡œ>ß‚¥kç÷Ñnù”¯ï±Yt VÂé»tIoðÞ¹I1b'bÐÓä {iÅdàw8ï mƒWX¯×9-K–¨û÷ÈLÄBP …%2 +PQÆÔ¬žG—#€ž¨«ßk¼Vû5Ø®&ÓÃë|<ãù·|+X–Ͼ‹Ì¢ÿ}ú_û‡ÿÓ_ý…?îÿMöm.,—¤³K/;ÐÌ„6àR™YBV°>Õ[…`óÂ’{ÄTV¬Õv-,Ìw/RžhÈ* ¶ÄWdº°‘¹j ´•+jG5+O,‘š`Êþáÿô×ÿaOû‡ÿÓ_ý…f«_i!{‰gMá.I–,­¦\[tni*})-!KÒ•(d`Š™¾]mö;L›µÖJbŒNp$’HI$ 4›VîÿMöÿ¸ý5ÿØW£ý%hÖm-\—r•Ãu÷ &Û%R¶Æçã†ø¨Ú’¢¤¤“€FmP¤Ç› ™‘nDgÛK¬ºÚ‚’â2•;à‚h*?÷ÿ¦¿û ±µÃá#…·‡´lÛÞÇÁæ© ¯iO½{OÌ™þà YþèÞ¾zŸÝÙ©:Œ³ýѽ|õ?»³Rt–º7¯ž§÷vj>Ü©H²Î\&YzReM,6ó¥¶Ö¾;›R¥„¨¤€HJˆð{Õ!gû£zùêwf¾ô¼Fݶ:µ)`™ÒûÇÿ™r‚¥Ñe³SÙíS j86xûî3&°¸$îë2ž¤(-†öì⥠۰NÞ«…Hõ~2þ‘è§Qgã/éŠêTQgã/éŠu~2þ‘è Ž¥Hõ~2þ‘è§Qgã/éŠ }¡´ ¿Ißo—X·+Ä¥]$‡RÜ»¤© i†!A×V^YÈpá*jE~kÛöuîÓ~ÓÝAÙ‘LL–ìfÔ‡VÛ÷´•+)\fò‚6­*ZIÖÂê,üeý#ÑN¢ÏÆ_Ò=&*DѤ,ýÞìý²Åû3oڤȔãî¡ô®pÓ±,[XY€É R‚àî9ØúË*ý¦\æZ˜Ü˜Ó#³Ã.ÇÛèJñÏj”ÐI#$yõ[ú‹?HôS¨³ñ—ôEjf£JFÐ:ºÁ:–!´.ðëïa;t•Ámµµ´)ÙÅuIì{%[ÐÇ®G'bh»0Óš:˧ƒæ@µÛØ„)Ç„ÚQ»væ¬ýEŸŒ¿¤z)ÔYøËúG¢ Ñú-ÔÉ·@ˆôÛRŸ‚Ì[BÄ—ÝÔ̘O!O%I€E½”© ïqÅ÷Î ÷£›ÆÉêýØÇLËœá)l±)É(e(ŽÌt'Œè tìa*+P©Gó›×Qgã/éŠu~2þ‘è¤X–¦¾h{äÍc.Dwà‹=Âïí!ÕÉu/²¸ÝTð’ÈO À£ œ-J @[€¸åÑ®‡¾iëµ±wGàª%ŽÐå¦ ˜’ë«’…Ê´-!,ˆw*IRœVrNvÏQgã/éŠu~2þ‘è¤XkÝ{`¾Î½ÚoÚ{¨;2#)‰’ÝŒÚêØs~ö’¥e+ŒÞPFÕ¥KI ©Yú-½Ùûe‹: öfßµI‘)ÇÝCé\&á§bX¶°³’¥ -ÀÜs»ú‹?HôS¨³ñ—ôE"Â:•#ÔYøËúG¢EŸŒ¿¤z(#©R=EŸŒ¿¤z)ÔYøËúG¢‚:•#ÔYøËúG¢EŸŒ¿¤z(#©R=EŸŒ¿¤z)ÔYøËúG¢‚}õBùŒŸñ¨?УÿHþÊ´La ê«~£º ¬çúHõWcý ?ôì ö‹þ¹úvÿ¼*Áxû£eùê¿wz«ñ×#Nß÷…X/tl¿=WîïPI×>}ß{ó\ÌcWA×>}ß{ó\ÌcUÓ”—9Ò”¨¥v·G–ËZ ÛÅÍ÷!2Ü«ƒòävAÈí!’öV²”€žj?çÞ®)®Êj×>ùö9j{%­Ž±>á ÷+[Òž#®;%(NT@Q$øj웣5OI}Ú_³·iÔÔÆtóKVmH¹R"2yÕHá6ê”´'„žÜ…+VʼnaÓwH1§FqÛ„G‰_MÉç›RHÊm[ÈæB“ðF¹ËVêž”4«p]ÔÚûtk„Á*‹¬ÉSÒ…­ ص©jØ@<Î|ŠÝÝéA¦ôÔ‡5ÍÆ‘q|Êxä*=·w5%*ÉËŠ's›UÃÞNÐI[ŽñѯV©¤ÅÓ«TÍáhíj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚV¯û#í ¹–žÄüÛ·S)Œê,R&:U¸íLYH_Þðî‰yÄÝ ä„UëÆÕOjÏ`­7Ú¹roKvíÔœh;Æ&ië„ðÝHS–ð–“͵0â—YìE[ǵ«_ƹyÎO´§kV¿róœŸiZfͦµ$ËV¡Ñõ‰»–à˜ =âÔ›6à$Ëá‚Û«)•DeO„ájJÖ“+eôë ¡ ÷oì|øÖHŒ;©EMìi)aIIJö€T‚;•e9V71IHšÂoµ«_ƹyÎO´¯‡tµ•äßj\†Ï}·§>âçJ–A©ºTý­Zþ5ËÎr}¥;Zµük—œäûJ„ébß®.ˆ 苬(/"å ÉAè«qki2ØRÈZ_h%´¸\AÜ]FP IɶÀL¤AމÏ2ü´´û¬´ZmkÇt¤ ©E)'$$©DY=úÞÖ­åç9>Ò­Zþ5ËÎr}¥intÃ|rÞ¤ÑÏɎΟy:±©vG‹Á.FZB÷&s›Ú˜â\@ %ÖÓß;/¡=*ΔЌ²-,òîO¹s› +)i¸î¼wpBR@mÈøyïšEâ¤Úhžíj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚV¯Ô:zߦÎÙtܼÝO.éÍë:e+†ÔrÓ,<¶î Ž•#lt•¢B^äìÊ”*W ç,p¯ºÊÓaÓW; ºMÝ3í칦å[czŒ&–QÄe /!Þã’Ž¬ΛT^ûZµük—œäûJvµkø×/9Éö•GéºÚÜÛÆŸzñb•|Ó¬³-2b³lvxT¦ +,·Ýg„™HK½æÖâT{Õ_Ñ͵bé#E?vÓ·a¨ûSU³Q]XÓÒL‰ËÞzZ(pÓÞøVRª )ïR/RvmŽÖ­åç9>Ò­Zþ5ËÎr}¥Et¿lîæÆ…L°_Š©Q£dºüDÉiRZHÔTÀu;G3œýiyz#OOµ‰—«N ‰™Òû\ƒEqÃNG‚&ñžêˆT–R²Ò‚V¼+î7ïkV¿róœŸiNÖ­åç9>Ò½t›×y:ZÓ#PFj-áØ,®{ œ¡©¸”ó<‚²3Þï×>=lìÒ5 ¥ošUEWËÂ4‹œs6:¤È}Õ6ã¼8–Е­å%×rv¥6švûwKY^Amö¥Èl÷Ûzsî þt©dûíj×ñ®^s“í*±Ð\~«¥ç°3n±GEÅaƒÆå¥‘ÂkùB¢ºK«;›;É'„xŠ¿ÐCöµkø×/9Éö”íj×ñ®^s“í+UjË-Íî–ß”,³žº®÷mzÕrDV˜öäu^²Ø” ”áÂÚW7 í‘Þç夓§³ô‹cµhÛźÓ2ä‰Ð!ö¡:Ò­Zþ5ËÎr}¥Pº…*Ùey—˜ŸkŽþ¡ypÙer WÙê‰À\B— ÉQ”’]FwaÐ…mZ²!ûZµük—œäûJvµkø×/9Éö•1J‚µ«_ƹyÎO´§kV¿róœŸiS ‡íj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚTÅ(!ûZµük—œäûJvµkø×/9Éö•1J~Ö­åç9>Ò­Zþ5ËÎr}¥LU_¥ksW]s€ñ¹†œáö=‚ûÅ)u #„9¸‚ÍHÞ‘’EHvµkø×/9Éö”íj×ñ®^s“í+L'F[¯ý¢<ÞmŽˆZ¶Ü-ÿ÷mq8Õ2 ’ò"=¹q¤Rây%IiK “Õ–ÝÒ¦)PCöµkø×/9Éö”íj×ñ®^s“í+YGèÞ]ë¥íM©¤"Ùnj>¤…*<³e=‘Û0`’–¦#©i[j@m@áÑ»$â­ÑFoLéË,­k¤-Òl²´„tN…nÒîªG*¶NŠž*äÈJ°RàJví|©)äBÛ—onÖ­åç9>Ò­Zþ5ËÎr}¥sî‹èð߬ÛìPnº-ëv˜žÅæ@°½ ™Î³meðàZ[ÞâÛ/mw*mn|2+¡Í2å¾õiUÿKÂ=‚á9sèîléHáÚ­ížôÜm®¡Ä÷`ð–•©_€sŸŽŽíj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚV«Ô6¾’a[µÝQpfónN©²Í‹×f·‹,ȶ-ÇYm2RO FY**JÜ ­™lÖ69é€PnqUpœ¨[Ÿi• Ç^K |€‡›B¶ðÛYÞFÒR@;¹Pdvµkø×/9Éö”íj×ñ®^s“í*‰srÇnû"-·(ºjæÜ·íà\îqtÜ¥6óλo1ƒ²PÉBÒÛ£yYKa$(§½[N‚µ«_ƹyÎO´§kV¿róœŸiS ‡íj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚTÅ(!ûZµük—œäûJvµkø×/9Éö•1J~Ö­åç9>Ò­Zþ5ËÎr}¥LR‚µ«_ƹyÎO´§kV¿róœŸiS ‡íj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚTÅ(!ûZµük—œäûJvµkø×/9Éö•1J~Ö­åç9>Ò­Zþ5ËÎr}¥LR‚µ«_ƹyÎO´§kV¿róœŸiS ‡íj×ñ®^s“í)ÚÕ¯ã\¼ç'ÚTÅ(*:‚$x1™‹ %ü€TTI)Q$’I$’I'ðÔEOjÿ¶GôÃû† h0­_ø±aþ¯›ý­Wµ÷AߦkYr#H€,·ÌÄ—W)ä¾Ê㇄–Bxn˜,áÅ()n€ãœ&:Ǻu“ª8Óov>fÕ:ÙZGtÎr¤“ËùÅ_³¨|ckó{žÚµ;IÝNè¿Aß´åÞÖ»´ˆ ‡a³9g€¨òžur³q\BÒÁ†×½¶T’¥8¬åG;2¡3¨|ckó{žÚ™Ô>1µù½ÏmYÚƒêç÷Ñnù”¯ï±Yu€Ìië¹76|¸Ï)¦VÓib:šYA$åjÏÚ w¾Ï €ÕYWKæ”ÆRÝžìäÙd…) …)€€r­ï óÀÀW<à—DºQhÛƒ1d\‚¬­½E¶…ÒD®¶´©7ËN$")J°PÑPQp’rve)½B±-Ÿ}™Eþûõ—XFž‹““`KŒÊe 8—ã©Ñ„Fœ}¹Ïà ‰Ð]Û´…þýw‰s½K]ÖHu-̺˖a¢•žXq{˜*‘¼%AíHùÒž¿Ï¾Ùõ›ì{ÓmñäETy²ÞŒÚó‘ÝßÄi*VR¸ÍåmZT´’©œêÚüÞ綦uŒm~osÛT˜©F¶²ôO}³v:É|FäZeH–䇑!+‚Ü$ìKÖ6öHZ”Ø[ ¸çbt‡c—¨t³¶û{Ì35¹QfÆ/ç„§cHnB¼s Rš $d€O#Þ¯\êÚüÞ綦uŒm~osÛV¦jC\Åè÷XÁ¹'TC6w/NÈ|»ë´¾m-¨-£ùVÂëÊOc™R· Ž%\ŽNÉÐöA¦t]M‰Hµ[£Áíâp›J7càÎÜâ¾3¨|ckó{žÚ™Ô>1µù½ÏmPMÕ{J}ëÚ~dÏ÷{gPøÆ×æ÷=µzÛ"¦ ¶4$,­1ÙCAG¾B@ýT–º7¯ž§÷vjN£,ÿto_=OîìÔeŸîëç©ýÝšòˆüXºí&uÅVÈ.âãóR°“犂HʲA»Õëgû£zùêwf½t¬†[µº…¯N—‘ƒøË”^€¯¶½A;PÎÓº•w;#&YWÃq–Ò½÷{înZÖÂ]îBZQp”v¤’‘µ«Ã­ÇðŸ¨Ó­ÇðŸ¨Ð{Ò¼:Ü ú:Ü ú½+íÇðŸ¨Ó­ÇðŸ¨ÐSz:¹t‡7Rêf5u’ÙÜÄä¦ãÏqâUŠ­îŒ×­êx—J²¹½¤ *¢:n¹7 ñ§Ø¼_eXôóÌËT™lÜÝ€ ”©€Ê ÍÛ¸j”´µÞqm¥'¿['­ÇðŸ¨Ó­ÇðŸ¨Ô˜¬,M%ÏvmIª^½ØÍúïp‹«\zÆ–mFcŒñ£:Ô35}L©Ë—·UÍ¢Ã`c<¶÷Kó&Áèþl˜RdÄø©•&6C¬DT–“%Ô‘Í%,U¸sÈïU›­ÇðŸ¨Ó­ÇðŸ¨Ö¦kT‹QÎÈÔ*Sl5tÕӢ螽-0îê-,@)mÀâHJVåˆÉÕ0„]íçÑÜ›¼Îôä»ú‹Ãö¨®OJѱI¦’\?ÜO/‚¥ºÜ ú:Ü ú+ü}¹ÿG5Úµ=ýV‚ã’ìì—-m9«ö\}v§ŒÈ)|„(bˆiˈ ·Ëcs¿ÞÛ}Oz}Žð¤\\¹Z™ºpír•=s’ã=Y…8’àÞûi©KŠæB?›yëqü'ê4ëqü'ê5"ÑôþyËv™Õ—»›=-¿^¦±uEîÚŪؙî!2-Ëê½aÁ ' žVò¹¶Xlÿ'Aw»ÇTÂiëÔÛ„§¬Ž¿©c½=ÉÄ.6ÖÔÚÆØŠÜ¹¨ £‘C(W|òÜÝn?„ýFn?„ýF‘o¿Ü›µ·M×&á^4û‹ì«žy™j“-››°’•0Ay±»w R––»Î-´¤÷ê‰fÔš¥ë݌߮÷ºµÇ¬ifÔf8Ï3­C3WÔÀẜ¹p+u\Ú,63Ë¡:Ü ú:Ü ú"Óõ‚p÷¥xu¸þõu¸þõzW‡[á?Q§[á?Q ÷¥xu¸þõu¸þõzW‡[á?Q§[á?Q Œº}õ[~c+üHõRcý ?ôì«L÷[wU[øjÎ ÊÏ/ÊGª³èQÿ¤e´_õÈßÓ·ýáV ÇÝ/ÏUû»Õ_‹þ¹úvÿ¼*Áxû£eùê¿wz‚N¹óì†ûØšãþcº¹óì†ûØšãþc®œ¤¹Î”¥E+º:'–ÛZ%¤)+$NÞüÛÕÂõÛ}}è#çÓ¿{z®Éºå!vù/FzDD<ìWKÑÖãiR™YBV‚~Õ[´äs”;Ä×·^gâ¯èšŽ¥EHõæ~*þé§^gâ¯èšÕ½/jÝA¤Dûra**XS§m’_ã¸“Í ÙK0Ñ‚œ:é#šŽ0‚jñÒæÐäë̘0Ÿ²7&阭°ê$Bjb÷—É-¯y€ðØ”… -²IÜ2"*ÝÝyŸŠ¿ zi×™ø«ú¦´œ½[Ò‡EšÙl´Üî±"SÑ­ÊJQÑ1%‰™Þ¤¿) ‴8”ⶉ¼¦ÿ¦!Ü÷•< ¦dæ9`¦CKSO'†T¢Œ8…»•Œ}²»æÌQ"jµuæ~*þé§^gâ¯èšŽ¥EHõæ~*þé§^gâ¯èš¢t­aè«|)R­÷)ª—6´æ¡šÛ-ʺZ¢Ì} ‚JÝi+PH$2£Œ’qðšž ‘ëÌüUýÓN¼ÏÅ_Ð=5©ïzæ÷Xˈ&Ïo»Â´ÈmqSî®OUT¼ °“5œ!I*XC„´ãÒ.¹•§´î´¹ë™¶×Q¦. ŒdAЍ¨}+‹ä'c޹…•ÈØ ^.÷:mU¥èÚyŸŠ¿ zi×™ø«ú¦µ§CúÞN´Ñq.Òm—1W)f›D”=/ ×BTW•!-S’®*r›Õ#×™ø«ú¦yŸŠ¿ zj:”=yŸŠ¿ zi×™ø«ú¦£©A#×™ø«ú¦yŸŠ¿ zj:”=yŸŠ¿ zi×™ø«ú¦£©A#×™ø«ú¦yŸŠ¿ zj:¼g&Rá>ˆO2Ì¥6 Ã4\m Çr¥ )%@’Hå‘ß —ëÌüUýÓN¼ÏÅ_Ð=5¨Q«5ˆÑö»âåXTãZ™V[›bÚèQÙq.2xþòBr²Å9ÎKPÝõƒ$Z¬vk•†DIjeDvÖé~,$qO‰;–¾å…ß'‘Q§³:ó?@ôÓ¯3ñWôMGR‚G¯3ñWôM:ó?@ôÖµÕú‡QÙue®,wì’#\'1‹Zcº¹Ï4¥$?#ˆ„´¥P B@Þ €¨¾„õ¦¡Ö O¼ÌeI™jnaŽÎ’¸@m¥¬6p™o¸¦žq`ʇt ÛÝyŸŠ¿ zi×™ø«ú¦£©A#×™ø«ú¦¼d.ß%èÏHˆ‡Šéz:Üm*S+(R ÐOÚ«bÖœŽxR‡xšÄ¥^gâ¯èšuæ~*þé¨êPHõæ~*þé§^gâ¯èšŽ¥^gâ¯èšuæ~*þé¨êPHõæ~*þé§^gâ¯èšŽ¥^gâ¯èšuæ~*þé¨êPHõæ~*þé§^gâ¯èšŽ¥^gâ¯èšuæ~*þé¨êPHõæ~*þé§^gâ¯èšŽ¥^gâ¯èšuæ~*þé¨êPHõæ~*þé§^gâ¯èšŽ¥^gâ¯èšuæ~*þé¨êPGjù ðštîO¥ mÉ$¤€óšƒâ/ñIßSwÕ©û—úí³çJÿÚ;.B$©€Ëeec†w¥Îrq€®ëøh)QÞu]&Ùú£I\„@˜8O•3ƒ–O>ä‘Èç½Î¯¼k÷‹m¿__±ª”¿üm³TIþú+`UœB#8×ïÛ~¾¿cN5ûŶ߯¯ØÔ**3~ñm·ëëö4ã_¼[múúýIÒ‚3~ñm·ëëö4ã_¼[múúýIÒ‚3~ñm·ëëö4ã_¼[múúýIÒ‚3~ñm·ëëö4ã_¼[múúýIÒ‚3~ñm·ëëö4ã_¼[múúýIÒ‚3~ñm·ëëö4ã_¼[múúýIÒ‚3~ñm·ëëö4ã_¼[múúýIÒƒÑK*˜ü´²‡e>ØÒÊÒB1¸Ÿ´Ïxwë>” Œ³ýѽ|õ?»³Qö×^fÍ9èñ•)æåMSl%A%ÕÜ! ¨€ <²N9Ô…Ÿîëç©ýÝš¶ÇìÓ¢©×šJšÙq•”-}Á”¨s|wFzé:Éû£(fÔ±„zݦè'Ãw‰¿¸ q°'hæsWJ¯iM*ÕŠåqº;w¹Ýî72Ûò§pB¸moá %¦Ð|öäç™8°Õ¥)P)JPUtwHZ;W^.v­=¶Ü%[œ Z#ÌiÒò8m,¼ØB‰S`¼”`´©??ÍsªåXgÛmvËd[…Æzy•*®® „&C:P1x/¼ó÷†ÝdJŒ†ÐâT8\ ’–Y% ÛÂANÍ[¬Öèv{<+M½ž 8QÛ¼“±´$%#'Ÿ §ãóÏØkx]/qâ"J¬ ”Ü"·&ʆn)qrFi´>6®µ±WŒ¯w9åƒpÐ:Zžß5Ç¢Æ* ¡ôÅ–$ÇYS->…´îÔïBšyµµ=ò1Ê¡Xè®ÂÜUÅråy}†ã¶Ô8úbš¶òS¥÷.2Êp¬Žp1VM)§ØÓÑe!fÜ%M’eL™1H.Èt¥(Ü­‰J„$¤9TŒ_—þ¹¹>Û¿HF°vЛS.À>5ºT•N}/¿À -±´ñI—-{“´º0 4HGTÝcÅrÔÌF.q¶¸ÔàúÖÂx' $p\(“a_ràçðT…ÇBÛgjU^Wp¹¶Ó²£Í•omIJd±·‚òÁA^äðÛä•¥'†ŒƒŠi mÓw寏\å¦4UB·±)Ä)¸”´©Lµµ %$¡¾k+V)|óŸ‚MsªåXgÛmvËd[…Æzy•}ß{ó\ÌcWA×>}ß{ó\ÌcUÓ”—9Ò”¨¥vßFzùôïÞÞ®$®ðè‡ïŸŸNýñê»&é*TÝ**‰©ônžÔ²׈’< Ë·5ö[}°Iu¶Ö”ºŒ©]ʇtys5ð46•ìܛ­IrLž'<âØË‰Úâƒ%E´­iä¥%!J䜚œÕ×Mé™Iyšû áÜ[pžy¸í@qå¶…%”e*îœ)ÉçÈ×ÀךLßeYUwKr¢ñx«q—Ææ“½Ô%õ$4¥¡<Ô„¨© @Á¤óùX®ÊìnŽô¼[s"7wЇ]CŽ:Åîko«bJP‚ò]ÒpÞíƒ<“Sö;U¾Éjb×kŒ˜Ñci$ó$©D“’¥I$’I$’I¯:KÑNÙ¤]…ÙÖãÇq¦–ÛÐd6ú”ïú †T€ã›ÿØ)I ÁÛœ±Y.q¯¶n1šÛ/nÚ™žŠèŠNæžJVž`ã)# ƒVfwf!ƒJ›¥EW¦E‹1¤³.32Kˆu(u`- B°~©)P=ð@#˜¯j•›.,&RôÉ,ÆiN¶ÊVë +qa@'ý¥-IHòTækÚ‚¥&Ål‘6ã5Æ$Üa7S¨yhRÙlºPRFÒ îÉ»®ÿ!Œ»|8¶øàBa EŒÒYe¤ %´$”æXqúJÑOµpu – 4^uÇ#<„¸Ø_ ­’¤úwá9kx* wÈkLßíZŽÞ©Ö™:Ón©—Pë0ë.'C¸”­  àƒÞ"‘àŸ*Ìݧ&êFõ ›z—pmM¹¸Hu--mä6µ´ÃZÓžåjIRy`Œ óÓ:#Mi¹ývÏæ^ í&<ò#²T•ÙC‹RYA)IÚ€‘ܧ—!S³µ¦š…©ÚÓrn*EÅÅ6ÞÑÕ4…¸ mµ¼ÃB׎å PR¹`ŠüÓzÛMê’­Ö©¯®HdÈm/B}€ûAA%Ö”â—P ’7 ¨wIçÌRQš§KÙ53L"ñç r¢ÓŒJv;ˆ T¶”•mPä¤ç åqX§BéNÌÅ»&Ò–äD ÓÎ!Œ´6´¥2•Ô¤IR’Jp0FY5f«±ifc¹z”óFAPe¶"»%Õ„ËPm¤©[R9©XÂydŒÖ"µö’¸–tÞä™a’ÊÚeű—Fæ’§Ò’Ò±Í)RVFȤxäìO—åî×õj‘kºFL˜rµÖÔHÈÎA`‚A"«s:4ÒRíl[bì˜ìÉë~õ{šÒÝzuit-å¥M¶R§ ŠJFÒ*ý|ºÛìv™7k¬”Å…Ýq@œ àI$’HjºÿIZ5›KW%Ü¥pÝ}Æ ¶ÉT¤-±¹À¸á¾*6¤…(©$)$à– ³ Æn&"2§”Û ¥´)ç–ë„$`-d©g—5(’O2I¨Û¦š´ÜdO’ú&3"|f"È~$çã:¦˜qÇJVÒÒ¤aN¹’’ är«t)1æÃfdGÛ‘öÒë.¶ ¤¸… ¥@Žø ƒš«ÙºFÒwm7'RF•qjцäs-â¶ën ¡MšOw,p÷gr~2r›d‹áã¤4Õ§IÙ[³Y1¸-`4Ô‰ÏÊá$%)Ayj(@ ‘Ï™©Š÷Ó7ûV£·ªu¦CŽ´ÛªeÔ:ÃŒ:ˉÆPãn%+B†A€8 ÷ˆ©J ,ݧ&êFõ ›z—pmM¹¸Hu--mä6µ´ÃZÓžåjIRy`Œ òÒÚ&æ®Rî6¥^:ÄÎrL»ÔÉiu[PêKέ%{[BBñ¸%!9Ç*ž­4Ô-NÖ›“qR..)¶öˆî©¤-ÀKm­àž¼w(R‚•ËäV#}"éUéÛ…øÈ¹·Ý9«|¦Ý³ÌnJ$;Áá¶#© ò”®°Î0ƒãùé'/Ë}ŽÛoi¦a4ôvÚ›"pB$8ž}n­Ò¡»»O8­ªÊA) ”âJ³¬—8׋[7Íi—·mLÈOEtaE'sO%+O0q”ŒŒA¬ÚJTÒˆJJ”@d“Þ^ÓßKjd[—b»"r.LË~ÐÒÂ^n+ÈaõRãˆO?¶ÎS‘“JzVuŠéùc{µ¿Ö \#7*+»ž#N$) €#) à€ fÐBR¦éA J›¥%aÞm°îö×mÓÐ⣻Ü7–ÒÁ)*JÐB’ @ ¤‚åVz½ÜãYío\e·5ÖYÛ¹0á=)Ó•­2•-\ÈÎp2N&‚‹qèïJβ@²½æÜ—˜j5â[tºâ-Mº’êÉ YR‚² A$×ëi¶/é¿2oÜ6ÇJÜMþvK h:Ž6×@Îð­ÅJ*ÉR‰—Óý%hÛì‹$xIvü‡œµ&]¶LS1 6Û‹[|fÓ¹A •“´ªÇ¤.‘t„çíl¹?(Ý#Ç“LÁ´%¹ ªÚÆðFÐéI9ïR|‘á!JðÓzÛMê’­Ö©¯®HdÈm/B}€ûAA%Ö”â—P ’7 ¨wIçÌUŠƒ_?¡tëÚ½ÍY¶êÕÝÒÑuÆ/2ÚmÀÖ6%M!ÐÚ1Í%;NUrs5c¶A²Ù`Ù­Œp ÀŒÜXÍoR¸m6”'*$œI&½nÛMÛõ ,2æ¾ÜÅ<Ô}ÝIòÂs6”øG Väá*P'rp9бPBR¦éA J›¥%*n””©ºPBR¦éA J›¥%*n””©ºPBR¦éA J›¥%*n””©ºPBR¦éAV¹®Û>t¯ð]¬9-fâ¤õfN÷ö°æ ;µ¼–>žÛ'¨~ëÛþtÀr°Ÿ‚êä¸è ¼•pʆ×~×»WsÃþù øÛfþ¨“ýôVÀ­/ÿlßվШg…)JŠR” R¢tЖý¶%ÆMÆCê“)•!°„)@+¹Ú®]á’y~¥i»ÕÁŽŠ-v›U¾÷õÕ §Òõ–B A<$>P]l!Ç’²”wòfƒeÒµŠnÚ¨´È•;R1g2ŸJ.LÙî !’Öö8*Ø’µH¸#“hä7dÂô‰7]^æ_lvØw¶mÒ˜› MáIÂc:[R ŠêÛJsÇYÜa )Ú2T§"¥öŒ†Ð—ÐXÞ”¨¨%DwÀ% ü;Oà5ëZÎ]×S¥iL)Ú‘ëAj!z{¶P&¶äÐê’Ï;” #$ŽÂ´çqñ:C‘h»MîqÝ·ÙúÔEµ½ÓžKØ•¤ ¥´Ür¦Ñ…±¹Á@ÚT¯ ¬;! †¦?AYÞÈA$~í*ÿwÁX}™ò‚åú8þÊ‚N•ØÙŸ(._£ì©ØÙŸ(._£ì¨$éQ™ò‚åú8þÊ™ò‚åú8þÊ‚N•erAr|iW'«I ¡Ç¢’Ókç´ßYø;Ø©Ë?Ý×ÏSû»5‘¤ÛmV— ›A=zg2?ù—+Ï÷FõóÔþîÍ~Ú™#IÏbÝ1¦¸üôG’¶x©eÂû¡+(ÈÞÁÛ‘œc"‚R «\åÊD)¥.#æ<”²´¬²èHQmxûUaI8<ð ~Éà³à‘äŠÖÝèC¡Sª­÷™fF—ujLY ES+”®§H^ç;–âAÁÞ—’HNÌ øà³à‘äŠpYðHòE}Òƒã‚Ï‚G’)ÁgÁ#É÷JŽ > H¨ëõßOiøˆ™~¹ÚíQ–àiM}¶¥žòB–@$àòª×GZ.ù¦µ.¦¹Üõ…ÎòÅÖr_e™ Å@EŠ×ÎvÈt€vlÚJJÉ5ãÒ}¦ôö£±_­vGïB‹2#Иv:ËÊŽ ¿å  ¥‡^ð‡ÔSΤÍ!b++S×8Åî=ë­©«¬¦Ë±à®Ca÷P3•%²w(r<Àø fL\Q—1q£FeÇ^t¥m d©J<€á5£ìêûGc,@TĉV9nÝÐû„¡%Ô(+ßÊóàƒa×»rÚ=)Ú'_4TˆVèÍˉQ%ˆ«XJd¥‰-<¶I<‡-©ùw\ùfµ1J¤lÈwVh¶¬QïÎê]>Ý¢Kœ6'*s";«ÉRæíª9?©Ä´Â€R[lƒÌ‘δ„}'¬"^N¬^™Ÿ?¬Ê–WjTˆZ¬[Ú⻓ղá„ðp6r-[9÷¶·G–‰z@iÛ ÷ü»mª47ÜA%+q¶’…(Ì‚RM?çØ}ÆÔ:VJ®I|²¼mYìˆn[JêxÎx¸>÷Œ¶ÇxÖ]š}šõmjåf›åìð¤Äu´¼)$ƒÌÈÖŠ‡ÑÖ²]šÛ ëJôí©˜kÉü)¹RZ(îƒn&Ê%ü+|µµïm‰í7kt[ìë¼9»]zãqä­•>„ˆ±Ø*wïAÅ­•ºCgn\üâ¤^>ŸÏ9rl°H¼iØ÷ØöKS7i(.1rL‡P3•%²w(r<Àø -W;v›6®éjŸ*øs!·|û—’J#Èã¼k[êM%©$ëùÝ^ÔãЮ7ûeÙ7 ôpÌfâõMí­*÷þ'òWBA×»½ÉÐþ’Ô–k囲ö§!3a°=i\…½ižâׇ w|<ÆqÒ^Â÷ÉX»È¿ßœüfÈ¿]ôöŸˆ‰—ë®Õnô×Ûa Yï$)dN*üzó§½Ç±½uµ5u”Ùv<Èl>êr¤¶NåG˜ª¯Iö›ÓÚŽÅ~µÙ¾5 ,ÈBaØès/*:‚ÿ”‚‚–ix;ÂQO:¢Ø:;ÕöŽÆX€©‰¬rÝ»¡ö8 -BK¨PW¿•æ#ÁÂ%¯vä‹ÏÖ9ϱ8on > H§Ÿ$WÝ(>8,ø$y"œ|<‘_t øà³à‘äŠpYðHòE}Òƒã‚Ï‚G’)ÁgÁ#É÷J;ŠUnØ„§0egüHõTcý ?ôì«mÓïªÛó_âGª“èQÿ¤e´_õÈßÓ·ýáV ÇÝ/ÏUû»Õ_‹þ¹úvÿ¼*Áxû£eùê¿wz‚N¹óì†ûØšãþcº¹óì†ûØšãþc®œ¤¹Î”¥E+¼:!ûÅgçÓ¿|z¸>»¢¹n5£BR‚éÝñÿͽWdÝz¥Guç¾*>ƒé§^{â£è>šŠ¥tÏ£õ²Œ‹u¬ÁLU0¦ÃÏ]¥G 8£ÍnFm*fj0†žrPÉ 8‚½tQ|¼¹>Ë*|,NIºËb[r\•.sSQ±LFÃpxñ¢¥„4F6—^{â£è>šuç¾*>ƒé¡ÃTÜú4Õ—™jÔ5Û»³"*Ù…õ-¶C(œL¾’£pt¤!6BRqÌlŽm—›>‘‡n¿Ïë×Ôé[¼u½µ ujm¾"À[›RêJÛ¸ó5מø¨ú¦yújÕ(‘¥Guç¾*>ƒé§^{â£è>šŠ„é3CB×6èQ%ÜnpUtiITIòJƒryIRZqJ!­©Z²[*ÞŒ(s³@ŒÜ(1á²§”Ó %¤)ç–ó„$`-d©jåÍJ$“Ì’k¯=ñQôM:óßAôÐj8]ê”ÛmðÞiAÓ°‰gX’û¢b™“æÖúIæR¤7¼eÇWß8;£M=s±D»?xTtͺÏLµ²Ä§d¡„¢3Ž3¡+u[#¥JZ’ Rç3}yúiמø¨ú¦‘bn¢_túfµ—"4ˆËq¼Á¼IuržKì®1ˆxId'†àY‚ÎR‚èî9ÉÐ6=r5¤½G®âX×)Q\ ÛuÝç‘¥8…p[aq›+bT·µ)Jm œܺóßAôÓ¯=ñQôM ›«!iëüûíŸPi¾Ç½6ßDUG›-èÍ©9ÝüF’¥e+ŒÞPFÕ¥KI §Ùz'¾Ù»d‹> ‹#r-2¤KrCÈ•Ánv%€ k{$-J l-ÐÜs´úóßAôÓ¯=ñQôM"ä;½C¥·ÛÞa™­Ê‹61<%;Cr•ã˜J”ÐI#$yõkè½ë7$êˆfÎåéÙ—`½v—Àm¥µ´*Ø]yIìs*VôàqÄ«‘ÉÚyúiמø¨ú¦‹W†‡² 3¢ìzlH2EªÝx§o„ÚQ»vç«ÓÑeáפK·X4v‹á²Â™·Y_qØÓd±2<¦œ‘† êå°R…+kËçÈ Úýyúiמø¨ú¦¬Íf¨„èÓO\ìQ.ÏÞ3n³Ó-l±)Ù(a(ŒÄd#ŒèJÝVÈéR–¤‚T£ùͲ£ºóßAôÓ¯=ñQôMAD¾è;ôÍk.Di–ãyƒx’êå<—Ù\cð’ÈO À³œ8¥ -ÐÜsãNkW†±F¢Ñzëÿ9«‚ H½¼óÄ1€Ûpq€#)н¤îÚ¿íƒ×žø¨ú¦yúiµS£½!7OBKrí6лÓ£ÁŠòÔÅ•µEámˆTØ*%AY- Hw†Õ_*;¯=ñQôM:óßAôÐck<άÒw 9"ã>ÜÄö¸.¿HKÁIiRp  NRr=k}-ÐìØsmI¾jŒÈp~XT;“¶÷Ó×g0û) †–2-N$¡Å÷ ¤ #hõç¾*>ƒé§^{â£è>š l’´×GZkNNq—%Ú­a>¶I-©m2”(¤ NRq>V ŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}45…{rêÍ­ç,¡Mž6ð˜™-Qš_t3¹Ä¶áN’0ƒ’åœ>¼÷ÅGÐ}4ëÏ|T}ÓAªl½j×tî’…wUŽß?KiÇ­P¤Ã˜ìd¥VõÆ“…2Þº›ÛçÜœ¨)[ez-ÑzËAÀ·Ú£èÅ·&èë’]C‘Þ ˆ®ðR!Ô)1ÒS¸¶RI$â¶^{â£è>šuç¾*>ƒé©ESt \i/Q븖5ÊTW#CvÝwyäDiN!\Ø\fÀ Ø•-Å-JR›H';£ºóßAôÓ¯=ñQôMTSuU\Þú@€¹,rtt Qä³²ïG}n¡I_æÄe‡ k›l8„’”•ãfèî¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}44¨î¼÷ÅGÐ}4ëÏ|T}ÓA#JŽëÏ|T}ÓN¼÷ÅGÐ}4ÇŠ—u‡n·!*BŠw´P ÀA#ýõÙÇ㾬¯^¥53…ÖšZ€¼;ßúUP´°•!Þ–¬Ò%:—]ºXîµ! µ€Oá'¿ðÖÉ­oÿì_ÕóµšÙg…)JŠR” ŒÒŸzöŸ™3ýÁRu¥>õí?2gû‚¿Krg_$DEÆL6˜ŒËƒ€–ÉR–§AÎô+â c •+°²¾PÝ<ˆþÊ…•ò†éäGöTT¬^ÂÊùCtò#û*vWʧ‘ÙPeW”© ÅŒä™.¥¦[Nå­G ÀºD™mŽÔ´ÞgHþRÃe·ÎÕ%n¡;[¼£Þ=úýÔŸsšùìOÞ vn¹y¶G©NÍÃð7/6Èõ+æû¨ôõ…L¦û~µÚËÀ–„Ém²\Æ3·qÆG{ðЬY:ZÑW 3öýϨ!bÈ*’ÉJ‡½ …$îŒΤêˆÉ²ÓÙ¸~åæÙ¥e@ppÇZŠ›V×¶ÔÚÐq‘”¨2yŠÁÓº’ɨà®eŽâÄÖ­®l$)µc8RN“ƒœ+ö'RM'¿Ô£ÿˆý"kx0û³ýѽ|õ?»³Rugû£zùêwf¤êˆË?Ý×ÏSû»4Ó38V×[áç¥óÝÿÌ9K?Ý×ÏSû»5)›¼|§¥3ò鸢ß!á–Ú]t6µ ªÈ ÚOryñïP\:ÿä¿køS¯þKö¿…kžŒ.wÁ>ó¦u<©/¹LHGð°„¥LÇ‚ +%*opÜâÅâƒ;¯þKö¿…:ÿä¿køV (3ºÿä¿køS¯þKö¿…`Òƒ;¯þKö¿…:ÿä¿køV»èÿX^µ¢Ô–Û–’¹ZµÍK ½!qˆH1£;Âs„û„¸KÊP)6m…‚+ˤ«­á­Ad±[/YZ™\§¦0Ôu¹–TÂB=ül yn¯qC* çRf‘Uˆ¬¶O_ü—í uÿÉ~×ð­béV]»}zi†ƒ&ËÛRg‚èšÔ58µ{ø^eºQ°í*÷dž{3¤Û´Û.Ž~m¾Cqd.LH¢JИÉ~KL©â#±.)|ùw<ùV¦(¹õÿÉ~×ð§_ü—í бõN­—w:UzŽl­*XUÑQáJ 1ι_-™ c%1U³Ÿhè´«ö…Ó÷ÉÌ¥™Wdio¶@BÜi+R@<ð "”þ>âÓ×ÿ%û_Âò_µü+¡ô«Óh·Mv÷¹Z‚ØÔµ£GáÚäÈ,)M„s(lLtþU¾*Ú÷öWE·[­Â5îÚ[óµ\ú¢$HC)}i1˜x¥Þ½¡O-²QÜå¿÷Ô‹óÍ Š/ýò_µü)×ÿ%û_´ޡÕZŠ>ºÕîn5 Ý}¶Ú…¸2ÁjCrz®÷¥{öÿå.”l!E^îÿ7DÚ«Q]ïV~ÊÜܘÍòÄíÕqÖË L¸À6Ño»Ùü¡ÆÏ+ßDr<Ñ~}IŠ7'_ü—í uÿÉ~×ð­mÒUÖðÖ ²X­—‡¬­L.SÓj:ÜË*a!þ 6¼·W¸¡•óªM‹¤ Yvìmõé¦ ›,WmHaž ¢kPÔâÔUïáy–éFô«Ý’y¢ÿo¹Fÿëÿ’ý¯áN¿ù/ÚþƒJ î¿ù/Úþëÿ’ý¯áX4 Îëÿ’ý¯áN¿ù/ÚþƒJ î¿ù/Úþëÿ’ý¯áX4 ñ•#ª wvÁ•ðçÿˆÅVXÿBý#û*|}õBùŒŸñ¨?УÿHþÊh¿ë‘¿§oû¬º6_ž«÷wª¿ýr7ôíÿxU‚ñ÷FËóÕ~îõsçÙ ÷°?5ÇüÆ5tsçÙ ÷°?5ÇüÆ5]9Is)JŠWmôa÷ ŸNýíêâJî‹#¼æmhFA;#ñ·ªì›¬4¯~©#Áþ±N©#Áþ±QZ_ì…»ªÔ[\ó°®b!TvS{z#¡[ŽÕÆŠ„lžéîeÅÜ `o& .ú‡Sµ»öë:N«D‹ÂµuÇ Fm‰†º¡I-À)tsqO,÷>‡ê’<ëê’<ëœ,MÍr´?cÕ2»=½i«dX’¢»QÌ/=9FJÂd!hszÓÕIc%(qÝ r¶¯G¶‰öjµ]gɸ\Ž:Ô‰\}KuD©x[„¨¤(ÄÁV^©#Áþ±N©#Áþ±Vf¬ÄR¯~©#Áþ±N©#Áþ±QTŽ”çëX¨.hË\9¯.ã K²V…¡¥Je+)aÐP¤)Àµ¥´e`(Œ TJ\&5–Y”¦Ò_m—K¡xî’•”¤¨ JIð;Õ›Õ$x?Ö)Õ$x?Ö(9ž×©/ªµÔ7W$¹lmÍY²{¯®Øé— /… CZ[ràhå±”/¿ÞÚ½ Nvu–îQprãljçöITåÍJÚêì)À‰+îŸB_SèKŠæB›°ú¤úÅ:¤úÅ"ÑÎäݤµMæâÏJ¯E™ŒÝy·3k·&sˆKöõõn°± ' œTê¹¶Ylÿ/~‰5 ŽûÒÑ¥u›·{[L–æ_zÛódq[þPÜr¢XizI m+.Œ'*;›ªHð¬SªHð¬R,MÚ·¦{‹pîÖn×¹6[¬ÊT‰M\\‚ ”©€Ò Í÷YáªJÒßyŶ”š¤Z5¦zóe7Ë´øÚ©oYRͰËq®4g†f/ª±Ñ•Ï+póh²ØÏ.‰ê’<ëê’<ë‹OèNî–eÌ…¡&H‡&DPŒ™R#ä8ÄUHm2\IÒRÉu[‡1Œü©ejë,÷fµmÅqœº:Æ›C¥Æš:´e8Lõ© u–Ÿ[é-X#–Õ©®‹ê’<ëê’<ëîµ@è¥IV²*eÖ=âI·G/\#¨)©ká§sÈ#‘JÎTåƒZw@O±ÛšŸa¼t—SXÕlméú’6£šÈŠëN´„!ו1IJ·‹„ûÒÚݱI)#ÐRGƒýbRGƒýb­oVie  »ü]GÑ&˜šÍ雼¤Z¢5p}2ƒî&PŽÙq.«$‡2¬¨+ºÉçß«µ{õIõŠuIõŠŠÒZ¦óqg¥W¢‹ÌÆnˆ¼Û™µÛ“9Ä%ûzú·XXŠÇ“…Î*u\Û,¶”T}_oF–éÕ¢µ²noF¼FT5ö|Ï~=½lÛÓ%ô:êÜXmÉyÊP ¯ÁŠè.©#Áþ±N©#Áþ±M¨µ½ZÇ¢;ÜI–D&æYGf\Ч¾?xn䡉üŽKÊJˆ‰%#‚ð ï¬lz÷ê’<ëê’<ëG…+ߪHð¬SªHð¬PxR½ú¤úÅ:¤úÅ…+ߪHð¬SªHð¬PxR½ú¤úÅ:¤úÅ…Q:{œõ»£9R™Ôqq¶¡ÇÉÈ KKŸÈo»e PRÓÌ$“ƒÞ­…Õ$x?Ö)Õ$x?Ö(9âÙ}œÅîÅrÓ÷¦g@·FºÏŸ׫dßÙ–Ûj·!iS¯®"yÅ¡ 9+n¾*¥z;‚»Ë£ „ëÖ¤y놌ìœÄ›ôÐÓòYM´!ŶØy:æáŒ,¬•…šÞ]RGƒýbRGƒýb—,Òý]Õ+¥9°a_¹[ŵ÷ ½½q*p>ÐBä!Ä A{iVBvœ¯½ÃÜ5ïÕ$x?Ö)Õ$x?Ö*ì4ηÔ61ÒݾÁmÖnÅÔb|5JbM÷ú.?2‹ý÷ëJ}ëÚ~dÏ÷¶íú†[òZ”Zz#mLÅqÐT•¼TÄœ}º{ÿ†ƒE½©g¢ó{fɪgH¶¦>DKë÷'ZdÜ"¡çßKˆGcä"2ßPe´ãý!Èá ú£P©M°ÕÓWN‹¢zô´Ãº7¨d8´±¥´O‰!)[—.W'TÂyw·×l6ïródR°Û¼ËÍ’=JN)ÌÕa¦"ê.“ÜÖÝ9}³_bÛÞLhó Æm«„§­r§Û.¥ÀZB‚ ÷·HÜ®Ný¨žØmÞåæÉ¥;a·x;—›$z•f“5„ƒV}ÉGÏb~ðÝbjO¹Í|ö'ï ×Íæç㨑ž§L¸ëîà¼ÚBRò¢T¤0O3_Z“îs_=‰ûÃu®éîf¤´ê»ÒÃh¸ÎOP”Ë‹O†Êa@½ì„¢µ×GÚºá¯zB¶Ïˆ¸L‡eÌ,íS¬,rgí²yäý©¹“]L²Žò°jŸxèãEÜ¡FŠ«Jaˆð£® «ŠãHåÜ6RByYÅ|ïþ‡ø3þO§ª4j¤ÌRø_J4éõcÔÕ[)–É #§hˆ²„ûí¹Ár à€¡Ã*áݻﭡoûã›ó(ßâ?QÚCGiÝ&è³C-¸ö8¯8âuÌ ËQ*W/ÂjFß÷Ç7æQ¿Ä~·ÿÍÿÃÿO¡:«MÝÈõcÕõ'TEvº7¯ž§÷vjN£,ÿto_=OîìÔ{œQ–º7¯ž§÷vkÙ›…’l9‘.$™SZy—Z mÔ)÷B’¤‘… F³¬ÿto_=Oîì×íš|;V”s¸>˜ðá¿=ù«¼Ûh}Õ)Gù€Òf„Em k›´éèj…`°Á´ÅR÷–aCK*ü;PÏóÔï¿$׎ŽÔR5UË^™½Ùc!qܹd¥@œ¥ ºµ£ ‡ƒÝ]üORkºE6Cð^ðKòM8/x%ù&¦)ECð^ðKòM8/x%ù&¦)AÁ{Á/É5}ÓÖ»ôDD¾XáÝ#¡Àâ™/!+å @#'M[®..Q!¿ÅzÙ$E˜Š7K-¼’0}íæÕ‘‘Ýc¾ZÃV1§_… ‹­æ|Ä:ëPíͶ§xMñ\Á.+w9'q²\¡^lÐo׃ð§GnLg@#{kHRUƒÌdh+±ô¥Š:®*¦­¬›¦{ Q ëyÎx¸O¾g'í³ß5•g²Â³[Ú·Z-1íКϵ°’ÁÃè O‰QœÊû—AÈïTÏ@Úçê…^ܸÝiéqçJ¶¶êYRcí༰PW¹<6¹%iIá£p8¦ŽÐ6½1rnd[ÒbbÄ\lyn¡M[£)iZ™gjJIm¾k+VH>~lI¯µt½?p¶ZmV¸—•Á¼„K¸l†Û[MŸ|ؼ­NHa´#ot¥Žb«–þ˜#\¦[ä[ìè]’Ríì¹%éÉnR˜ˆÊod}§z×b¯xÚ^ Å[õ†“cQ? b.÷[4øhu¦¦[œm.ð â´xˆZv«b{ ¡$EDGè»OÄŸ peÝ"[c.ª´´òz£ÎÄBÕîIsrLýªÀ<$nŒßÇ矱8OëkðÓzq먈©¯q˜:VÆ}÷ËH*?j Ž `àpqŠ©Âéûp°ÌoÓ–W¶<´\ÝwP@i†d!ÆäIq+iô(Ú@·àf窬põŠE¢rßm§J—X^Çqµ¥ÆÜAç…%iJ†AHÈ=ê¥Þ:$…s€Ôgµ~¦K†zî3^þFçdd¶„-öÜŽ¦”KHJP” àwU×JÝÛÔ^Õ~j3ñ[¹BfZxaƃˆ Pø3ƒüâ¨/ô½NkÀ±¹&žjŒMTÛ3Cï¼ÃŽçiá°ÒØss½×r…¨*ÙPr4ñÞ–ôÇi(\‡‚0V „¥!G¾v¥#'•Pžèg£ôʺIµØ¢Xݸŋª×ˆü¯ ÈCío틜2­Û’ Ë@¤„ój¾<¦:1ÕçYÙ%Üz´ÄiŠŠ;®C“µW‡ö#ˆŒ¬ £ BÇÁšµÔŒÓ,i˜ÓÒ‹Œû”«ŒÃ6d¹¥¾#ΖÐÞHiB@ChJ@åžù$ÎÕ‘@¼ôŽmúÍÛ2m,;o‹p‹m—)SÂ$%ù\$·iâ6“2(Z÷§ix`ÌÓÚ›U]íúŽ?k–VoöK’ õ^̺¨nFþ?V Oq#áéÎG­Ï@Úçê…^ܸÝiéqçJ¶¶êYRcí༰PW¹<6¹%iIá£p8¯-5¡$Ù%ßevó©§¹{ܹ&J §cå–™KèáFA Kl¶9£‘%$œÔÛÊîõè÷VÏÔVƒ6ïffÜã—IøÝFC³˜x3¸)Þ'½ˆ*mÔ‚´„’‚JÒ º¢¬Ö8Ök=žÏiyøp-M¡–ÙFÅšCE´¡eI'Ò¼¤¥EH8* •«, _jXÚCIÌ¿ÊarÁm¶ÙB҂뮸–›Få`$­ ¨òä÷ªmézÐÄ«BuUÏFZ¡]cÍ~=Æ&¦D˜„Ç\T†¸«i¤—ÖJFv†»êÜvÞõUŽ£±?g¸˪mamÛ­.6´ä”­ PÈ##˜#•Ain­¶CÛe.·ªÓ(H“-M!R: Z”–ÛBA „ÂFБٜԅKèKïm麯Tì½¶<î¯ÄßÂâ´•ìÝ»±œ ã¼*f£4’.šÒ¶9Çœ‰j‚Ì&ñÅ!¤$¨€V3€~Rt R” R” ¬ôŸª»KÑ’5Ü)1#âlÞ©y-1Äqí‹Ø„q7(í<’jÍPÚÓO3ª, ´=>m¿ùLiMI‡Ãâ´ìwÛ}µ'ˆ… ám'!I ŒŠ ›¥ö¥_týºKnd{»²šrá`Ô’ ´b¡´¸¾ }ÓŽKm@îw ó ;rtÏHzªýtÒ ÆÒVV j["/h}Ëë¼V ‰ÆIlE!KJ¥€‘¼„J3Š˜w£È³ò­C¨¯—÷{6Þ—ÕšRY’c©`uv[ITd)*ÆAR¹žçnvœÑV«k=NDÕö¹d]’i;ØWVÊœÂFWü•¾cš¹sTcè}sTêMMff ‘ÍŽPe·”½ÂS{œmN´ØÞ9ÿ¢Îyà[ªŸ¢ú8ÓzF蛥•§š¸‹9í­…ÜV§œy)ÇB‚°®@1ÞÅ‘ˆ®Må@¼ôŽmúÍÛ2m,;o‹p‹m—)SÂ$%ù\$·iâ6“2(Z÷§ix`¿ÕFç msõB¯n\n4ô¸ó¥[[u,©1öð^X(+Üž\’´¤ðѸUº‘‚rR” R” R” R” R” R” R” R” R” R” R” R” R” ¬jÿ¶GôÃû† j{Wý²?¦Ü5Aÿì_ÕóµšÙ­àÿâ‹ú¾oö³["¬â¥)QJR”šSï^Óó&¸*N£—a±­ek³[”¥’b ’~Šùí~ÃâKoÕQè “¥Fv¿añ%·ê¨ôSµû‰-¿UG¢‚N•Úý‡Ä–ߪ£ÑN×ì>$¶ýUŠ :ƹÄ¡*9uM(©+C‰”-* J°y bö¿añ%·ê¨ôSµû‰-¿UG¢ƒàĽ““q¶“ó=µ:ëÆߨ9í«ïµû‰-¿UG¢¯Ø|Imúª=Nõã oÔöÕïl‚ìwß•*J_òP‚Pß Bsµ!9'¾¥’{ÿƒ¼û_°ø’ÛõTz)Úý‡Ä–ߪ£Ñ@³ýѽ|õ?»³Ruã,hlðbGf;@çcH N0¯jË?Ý×ÏSû»5àÍž.¢ÐW?8¬D¹›Œ7ÊãÏ!X?‡ 5ïgû£zùêwf¼´ä‡›€ò¼:^ãRn±4º;£½2í1ɶ×rK S6ÛgQŽ’ßßK|G7<¾'væFíˆä1Wz‹ër<'êër<'êª%)Q}nG„ýBnG„ýB‚R•ÖäxOÔ)ÖäxOÔ(!ô_G/G^n·}9§m–éw'B–¸ð™h²ŽH,¶P€RÑ,¥ÂŒV¥+áåó¯´Œ½Ap¶]­WH–땽²…Ë·‰Œ©·ˇÞ÷£ K‘Øq ÝÜ©‘©®·#Â~¡N·#Â~¡IŠ‘4PmýƶL·Ç·Þ‹$eÛÞr3ÐR䥹 ’ÞɆÄ+©D+Fø´0Sš¼kkÔšqëP˜¨Oq˜“BPÁ}‡óK)8Ü ”äd23šöër<'êër<'Ꙩ×ítO6/åÿk}¸·60¨)mMÅBÔ^/½ðÄŠlñµMgžp6•³EÓšbÕ§ ©ÅEµÂfÕ4€„“‡ óÖäxOÔ)ÖäxOÔ)Q®`ô4X†ˆ«ÔMÛ¢7ÈãÔ¶ä`ÓÑ]iÉyë+IƒÃyCXÇ<‹§GšYZZÝ9·åÆ“.|±&B¢Cc ¥–˜m¶™Ü®Ó $¥w‰Ï< .·#Â~¡N·#Â~¡H±7Tï=†³vò›³ [å\"Ü¥ÅT¹ ~?W) ÈÞ8m¨ÃŠVŠÜY"ôptÞ4·.ÌLm·®Ûli¨…¡…_XZ¸îEŒØ^ܶ~­nG„ýBnG„ýB‘bn…×ÚF^ ¸[.Ö«¤KuÊÞ‡YBåÛÄÆTÛ‹eÃï{Ñ…¥Èì8…îîTÈÕnßÐükdË|{}á²F]½ç#=.J[Ñ-쑸lBº”B´l;‹C9«÷[‘á?P§[‘á?P¤XJR¢úÜ ú…:Ü ú…¥*/­ÈðŸ¨S­ÈðŸ¨PJR¢úÜ ú…:Ü ú…¥*/­ÈðŸ¨S­ÈðŸ¨PxÝ>ú­¿1•þ$z©1þ…úGöU‰Ç\wUAâ+8ƒ'¿(ÅWXÿBý#û(=¢ÿ®Fþ¿ï °^>èÙ~z¯ÝÞªü_õÈßÓ·ýáV ÇÝ/ÏUû»ÔuÏŸd7ÞÀü×óÕÐuÏŸd7ÞÀü×óÕtå%Ît¥*)]½ÑsŽ'G¶âÀëÓ¹ÿͽ\C]·Ñ‡Þ‚>};÷·ªì›­\g¼*ü£N3Þ~Q¯ŠTT}ßSÙm"ûj}¾LµmŒÌ©¨ioö•T5}µ¨í/^Ÿ²5}„åÖ;aס&ZKí ã SyÜ1Ì„V¾é¾Ã¨/ñ·X­3ÞëŒwœŽä$Ç Ž˜]ðÈÉ ÇVï|_ @5^¾h Wuvádf¡ Ì¼Ìjî·Ùà¸&11 ¥!>ÿ¼mïb£o>úp±vÖN·Ò˳=zN¯³*Öü¦‹“E†×˸S›¶…s‰Ï:—…pnlF¦Cš™1ž@[O4îô8’2•‚á¥ÝÒ÷éR¤ê SQÀ’…ÁEº5¶M³­Fu3/wjêåÜ ÂB·,¥ %9†Áè¦Ës°hh–ûÁ}OÊ”òCÎ~CŠC$€#ÅY†bVÎ3Þ~Q§ï ¿(×Å*+ïŒ÷…_”iÆ{¯Ê5LéOJݵeª [V£™gT{Œ9N%¤°PêZ”ËÅD¸Ë‡zJ( +À^ääUª .G„Äw¥=-Æ›J!à€ã¤ ¨!)H'¾v¤ ž@TqõUŠB®)©-¯^{ 9 ê˜Îx¸W½ãí±Þ5•g¼Â¼[Ú¸Ú.±î0ÏDYÖ׃ƒ…$y‚+FCèÿWªÑn„í¥V cQ“‡wSs ¼¤´QÌ!ÄÃx’þ¾R‡Ú÷¶WE¶«­¾5îmÚ#ðºÜúÛqä-•>„ˆÌ2TïÞ‚Ö¦Váîrçû©Žwç.M–Gõª=í‹÷ØM]d ¸Ä%ËJ_u#9R['q0>Kf¢µ]&L‡l¾Â& ørÙ-..:¹÷.%$”žG‘ÇxÖ¶Ô:WQH×sz½±Ça\/¶Ûªn!æQÛÕw¶°¯~ßü™Ð€ ‰KÝÞäè›Jê+EêÏÙ[cٱص.BÞaIœâׇ ÷{3Ç ß!@rï"ÿ~sðKe_5 ®Ãï—Èv¸ëp6‡fKK(RÏy ¨€IÁå^Oj›#7¶loj+swWÓ¹˜+š€û‰ü)lÄ~aU^’­W‡u’ùl³=zjiq^†Ã±Ðæ^S ÷ò°¥•´¼Á(§U iíQÍ)¤'i‹³Zjruâ á¨Ü%ÆC[\Yq了›[iÉ ©kÚ0žKA-É.z!Åv\¹‰”u×v¡ %J$à>Që*Åž5áý_fjÛ)eæ.äÐeåŒ!e[Tr k¤ëLÛÖŽ~¾:%HD˜’„e¬$IKZyl’y émHç˺çʵêàk«]¶|›nŠ™&}òäëŠâ­îJ¶1Õc2µ)ÖÙ[¯-…8RÚ¶r p]Õº[’·KÈRР•%yñ«±:DÑRí³nquΟ~ \’ÕÙ•5ˆ­¨â,+ÜFHÉä+/G[Ø´i5ª4YQ…ˆí±)h[Í% ¥! R IP¤H8$V­·é9-Åv:'YÆÒ‘ ´„Øäj&Ü’¹-Haq—}qA„´Y>üÞ{œ$‘ÎîÎÍ¿f½Á½[Z¹Ù®ñ®P^Ï LI)u§0¢“µi$AÁï‚+/Œ÷…_”j¡Ñ„+ä+Dä^Qpa—')vØ×¢\¨Ñ¸m€‡] ^õqªÚð•$n8«eEa?¨­QïlXß¾Âjë!Æ!.ZRû©Ê’Ù;ˆäyðǶë9s²È½ÛuMªm®*ŠdMpmÆ BœJŠR@RIÉïøk_j+¨¤k¹½^Øã°®ÛmÕ7ó¨íÆê»ÛXW¿oþLèFÀPD¥îïrÀŸnÕ×»^º‹Ú5ÞÞåÞíëråA<™ne)áÈXƒÅ ,pÉJ7œšmUÞ·d¾Ûï–ôÜ,·ˆ·8k$&DI)yµßI$Íã=áWå×]Ù¯6æ$Ⱦ[¯LÛó“ëò˜L†"[ËLu†UÍ …ô*)Ü´ì*²¾3Þ~Q§ï ¿(×Å*¾3Þ~Q§ï ¿(×Å(>øÏxUùFœg¼*ü£_ ûã=áWåqžð«ò|RƒïŒ÷…_”kó{ƒe¶»s¼Ýã[`³Ž,™rRÓMåA#rÔ@$“ß VESúa¶]®ÚȶF&=9»ºR l%ð–f°òÔÙ|†·„6¢û’@9ÅÍ“Zi›âÙE—VZ.j}N!‘âÛÅÅ6§v¨ä¤8‚qÞ N{ⱓÒ&ŠUÊ5±:çO™Ò¸]^0»3Å{Š”©­ˆÝ•o INtÎEk™_XÞo‹êØÔ=‘²Ã¸¹ûû–ä¼™*rškùÙÂu Hlœ§3Œ£3ýé›Ý«Üç¯ÂàöF=lŸï¨WJ»†ù»ý¼Ó‘Ü÷ùŒ…ööß9l· óJßd¾ÊY’•— +N4‚@$rɳxÏxUùFµÇFV å£Vßnw+;Q#Þ’ÐC¨Q‚Cîž® s¸9Æ%OÇòq³;‘ˆ7–úŠÕöÅûì&®²\bå¥/º‘œ©-“¸ŽG˜¬™÷&mð›>{q"²’·^}à„!#áR‰ÀÎkVê+¨¤k¹½^Øã°®ÛmÕ7ó¨íÆê»ÛXW¿oþLèFÀPD¥îïrµÜïË»è‹ÒŦ]Ô#L‘›cËe¢óñ¥©’­Î+`H[E`“œ$7`Sj›¬Vkä Õ½ 5Þ5Ê„„H‰%.¶¬w𤒠fqžð«òRº&·Ü¢Z.s/vÙð.÷;ŠæNL¤Ç@[…¦Ð Ia×R–ÂB@RÊÉA*ïäܨ>øÏxUùFœg¼*ü£_ ûã=áWåqžð«ò|RƒïŒ÷…_”iÆ{¯Ê5ñJ¾3Þ~Q§ï ¿(×Å(>øÏxUùFœg¼*ü£_ ûã=áWåqžð«ò|RƒïŒ÷…_”iÆ{¯Ê5ñJ¾3Þ~Q§ï ¿(×Å(>øÏxUùFœg¼*ü£_ ûã=áWåqžð«ò|RƒïŒ÷…_”iÆ{¯Ê5ñJ¾3Þ~Q§ï ¿(×Å(#u*ŽÉQ$ñ»çÿJª¦5ú³?Óøª¨zè?ø§bþ¯›ý¬ÖÈ­dÛèÒe‘çê’›|̆ÚSŠûfG$¤Ü*õÙ¸~åæÙ¥YÄ"N•Ù¸~åæÙ¥;7ÀܼÛ#Ô¨©:Tgfáø—›dz”ìÜ?rólR‚N•Ù¸~åæÙ¥;7ÀܼÛ#Ô “¥Fvn¹y¶G©NÍÃð7/6Èõ($éQ›‡àn^m‘êS³pü ËͲ=J :Tgfáø—›dz”ìÜ?rólR‚N•Ù¸~åæÙ¥;7ÀܼÛ#Ô “¥Fvn¹y¶G©NÍÃð7/6Èõ($éXðfGšÚׯ¸VÅ¥ÆÔÚ’¬‚•G"{¼EdPFYþèÞ¾zŸÝÙ¨ûtX³¬³¡MŒÌ¨²%Miö@[n¡O¸•$ò ‚A‘¤,ÿto_=Oîìׯšˆã¶ç–• :_|ÿóPRzÒÖë+7»ì-9O›Üâ¶á1 1xQYËl6” Œ‚ñ½WúÊê/|d}'ÑN¢÷ÆGÒ}´¬®¢÷ÆGÒ}ê/|d}'ÑA‹JÊê/|d}'ÑN¢÷ÆGÒ}ÿ£ûv¾‡¨µ#Ú®óm›o~jUà¸Ñ#«FNö÷Is„Þäº E9+ܽÀ( ŠéžÜÜ˵…ëµ’UêÀÓ2“"+6ç'%J`´²Ë}Öxi’„¹Þmn%G½[W¨½ñ‘ôŸE:‹ßIôT˜¬Qbi.s´iýNÕæÊ/–«„T‡¬ªfæb8ï3mCÖÁá´2‰ám«›¥äœsÛ,Ä™7BL4™@¿R£ÇÉqø©Ú¤¶9¨©êvŽg8úºu¾2>“è§Q{ã#é>ŠÔÍj‘g7"¤¶Ã·=+:VŒë²•ØÝ‚ACkS0@q0Aâ0•-» «“Jy <»û¯£ø÷XšOÅ¿-k»3kŒÜå-{Ô_ $8J¾¸ Yº‹ßIôS¨½ñ‘ôŸE+ü}‡2Zôåõ6¢ÛzêÜ–í·«6@u…ÜÞá)𣉋SmÜ[|¶<„wûûW¡h/A²ÝÒˆ[íŽÜø–ÈÊ‚¸IC=]„¸QÎí„)ô¾´¡\ÀWóæ¶7Q{ã#é>Šu¾2>“詎w©7hýSg¹=Ò«Ò…žk×EÞmÏZî)‚âÒŽ[¬ Jc)Â'4®n›#½ÍЕžåSCqë<ØZ³:΢ì#‰—¸ûV\YÛ)[“1aÔru ø9ï¢÷ÆGÒ}ê/|d}'ÑH·ßîMÚ«¦{ss.Ö®ÖIW«LÊLˆ¬Ûœœ•)‚ÒË-÷Yá¦Jçyµ¸•õR-Sµy²‹åªá'U!ë*™¹˜Ž;ÁŒÛPÄÄu°xm ¢x[jæéygú3¨½ñ‘ôŸE:‹ßIôR-?§Øœ1iY]Eú)Ô^øÈúO¢ƒ••Ô^øÈúO¢Eú(1iY]Eú)Ô^øÈúO¢ƒ••Ô^øÈúO¢Eú("ßT/˜ÉÿŠ€cý ?ôì«#ì-UyIÝN1ý#[cý ?ôì ö‹þ¹úvÿ¼*Áxû£eùê¿wz«ñ×#Nß÷…X/tl¿=WîïPI×>}ß{ó\ÌcWA×>}ß{ó\ÌcUÓ”—9Ò”¨¥w7E0øº-§8˜ÌéܶÿóoW ×xtC÷ŠÏϧ~øõ]“uƒ¨~Wö:‡ågøÖm*+ ¨~Wö:‡ågøÖºé×PjM; 륆í=”A‚d<Üv¡*Ñ)S…áÕZZ¸¡M)¼$àŠ´6«jõÊþÏñ§Pü¯ìÿÕ‰Ôº¥: ϳ³ž¸MÕwK3—4±J,Æ~xh%*Bc‡V"´È*HNç2E^:,»Î½èÆf\¤¢\–¦M†e!JcÊu„=„òÒÚWË—uË6©6MõÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¯I|…`‚‰“˜¹¼ÒÝ À¶HšæH'% !j ä{¢1œ äŒÉÐauÊþÏñ§Pü¯ìÿÑúEÖH³[g=}Ü­Ekfb‹ñ£pìêrd¦‚;¢Ûišð!ü«|EµïíŠ.×kŒ[ìÄÉ]´Ý:›r$¡”¾´˜±ß)wïEÄ)å´Kcn[üæ‘~y¡1EŸ¨~Wö:‡ågøÖ°Ôš·RF×ÓŒ{£ŒÁ¶ßí–„ÛC,¤·+ªoqjW¿q?•:Q°„{»üí=H»õý_h»ßfÞû{DXÒf4Âá*7ö«€Ûh8[Î`íÎ8¦Õ&Ë7Pü¯ìÿuÊþÏñªoI÷kÓZŽÅ`µÞŸ±µ6,ÉoMa¨ëpU!ÊFÀ—Öêð7”0 žuOF·ÕÒ¢õd&3ñØtÎe¶aö:*冸Œ;’©œuq2‚–Ç­Ü‚XŠý¾äÙ¸º‡ågøÓ¨~WöBt§wcÑr&Û¤·BåDˆ%-IŒ—ä´ÊÞ ò<4¸¥óåÜóåšÖÊ—Ò­Õ™¢Ï©œDM?6DYîH‘$É£BÞõõIÊš.Éi[i%);¹ÖÉÔ?+û?ÆCò¿³ükËJÞ#ê-1jÔu¨×8LÌeŒ-(ui ¼@PÍi­5ÒN«‰m{š›–¤U×M½xE¦4&Ö¸òäT¡–Dt—x[¥-µB– gö½ôÅ&‰Š·WPü¯ìÿuÊþÏñªw@zŽí©ú<oÒß™ts¸C’û–Ç ‡8RÝB6´â@ „ñ …%GzVúƒ ¨~Wö:‡ågøÖ°Ôš·RF×ÓŒ{£ŒÁ¶ßí–„ÛC,¤·+ªoqjW¿q?•:Q°„{»üòáH×]€×–›Uömòïh¾1™mDDŽ®¨_u)ÚÛl—yý…iÛ¸ + mU¥èØCò¿³üiÔ?+û?Æ©]j-A|ƒsfj]”›mñËzäOy„Éàˆ­¸JºªK:—œ-‚”€••' ØTFPü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬Ú©ôµ:çG¡v‹“ÖÉrnö¸BS-¶·D‹„v)¥hݱŹ$sŠ þ¡ù_Ùþ4ê•ýŸãZ’óvÕ®Ø.‰®îL½eÕÐlb|H‰žÄ§ %jt-… 8×Yu¶ÈÊ’{ÂR稵-«¤Ëv‡å.âìQ¦?ž'Um·ŒÀ „%'r£ ¦`Û´€Þ<óö¹ˆ™ìØýCò¿³üiÔ?+û?ƳiA…Ô?+û?ÆCò¿³ükW¯H—–/±,ÏÞ]µÛ/ðâ©*E¸[ˆbDzBTHë…ì<ê’S”eHà !z¿k½VŦ ëRê{r®ú]«¯[—Ø[¥lä. Koƒ…¨-/¤¸ëX’Eˆ¨Ý}Cò¿³üiÔ?+û?Æ´e³Qt®»'G.ØoNj+†¡Óï§³ —Ì4PPÛ`6Ó²K…<Ô¤oYØïCÚ§¤ Xü+„ùÚÎddv#Œ»kVfà-² ‡¸Áà$ó[î)\.òT0Fç9üœç?†òê•ýŸãN¡ù_Ùþ5‰¬Þ”ƘšìË…(%!§K*qJ*6ØyIkˆ¼ìFó´)IÎG#]èfõy»Ú¯lßdKvU¶î¸iLä0™ 2ÊÂ_êã€W— k)ڤݠ¶õÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥Pü¯ìÿuÊþÏñ¬ÚPauÊþÏñ§Pü¯ìÿÍ¥WT7Âm¦óœ<9ãÿ"ª§µÛ#úaýÃP4ÐñNÅý_7ûY­‘ZÞþ)Ø¿«æÿk5²*Î! R£55öÛ¦ìî]®Î¼ÜD8ÓD³ÇÜRÝq-6”¶ÚTµ)KZRA95'JŠÓ:†Õ¨á½*ÒóËKmøÎÇu—R¢…¶êR´+j’p 9(ñ+@¥)@¥)@¥)@¥+órfµIº]%µV˼갔$wÉ¡–]*3N_ ê+›onâÛ)p·ü¶Ý"É„>„)IÁP'˜ âNJR‚2Ï÷FõóÔþîÍIÔeŸîëç©ýÝš“ Œ³ýѽ|õ?»³X½’~ÍÑíîï–~d¤¶Ûï†[ZëÊN+’Hæ£Èu•gû£zùêwf¾¬¢\ô´ÛmÂ;raÊ‘9‰ ¸2—Sî¥I#á*N,±H›«}k+Ψ›w‰vTgD6b¼Óȴɶ8xÁÜ¡Qä-NmO aÑ„/* æ…Vè-)¤lZar´±,=)-¡ç¥Î~[ªC{¶#{ËZ‚½XH8Ž3Sµ©¥lÌV—)JTR”¥3At…nÕ÷ûõ¢%²õv©!¤¹2Õ.:]Aa‡J”^eµî|¤4Nò”…µ@×çHZ†ÿûgÓúo±íM¸G‘)R&ÄzKiC+ŽÖÎJJ²¥Éo+'j•¨‚[£Ä‹é/GŒË.Êt=!m¶§–”¬¶VÄ!9<ð”Žð«4¥‹Tµ»ÔWœ1Ê‹.1-ØÎ (mZC)*Ú¡ÉIÎË â¤Ö–XÍÚÚËÒÅòóØëÜ[|öG$ZbȈäw—!KœÜ5oKà†Ð7B’TàC¤´ãbt‡|—§´³· {,=5ÉQaF“ÂK²d7 ^9íJ `1߯ tfâ]ÓgKR"C-´ûˆ–FÖ”¦ ÒÔÉ*RINÀ©›íªß|´I´Ýc&L)(Øëj$dg ‚0A ‚Zš^‰5d^µŒëŠtÄ4ÙÛ½5!ðìç­Rø4† ¸ä»Ã¬©]‘e*Þ² ¸¥r#D^ƦÑv=H˜æ0ºÛ£Î •n-ñ[JöçáÆìf¢èÓF½jjÚ»t®O¸ø}7))”µ¸®ÈqW¹ %AK!A) Z¡F á°ÜxÌ6–™i´„¥´$a)w€ Sñùçì4Ä.–5B­°&=Ò³¨ 3.Ìö„E=& -¡õ©D>¸°¥-½ƒ-ºŽøÈØj•ö%Ù‹Âcªmªzb8ó]Œ‡Ò¸ÌIBø.•-£²BR¤(’•~aó£]ÃWQeÜÔö‹.¶ä§––Û+â2²Nü+ lA'¾ZfÁjÓ–õA´°ãm8êžuoHq÷^qXÊÜuÅ)kVQ'ð#Oçúæä¨÷Ý{}…­eDzۯ0lòZ\g”ûÎIꃊ—‚¸m„Ìáµ$©aFÓ‡Föû¨îö¶îÑà&úÌåâcÆy¥Åm1á8µ¨¥òQ1£Äl%!Iq8ÊN-s´Vš©ÛÔ’mÊ]ŵ¶æá%Ô´µ·Û‹d+†µ£=ÊÔ’¤òÁÓZ+MiËŒ‹…žÜ¨òAo*’ë©i[Ëm%j)e\Ê I rä)|óŸ‚Q!jü íŸOé¾Çµ6áD¥H›é-¥ ®;[8m)*Ê—%¼¬¨JV¢O²ô±|¼ö:÷ß=‘ɘ²"9åÈRç7 [Òø!´ÍÁ€¤•8ém8Ù:³JXµKQÛ½Eyè²ãÝŒê†Õ¤8Ò’­ª”œá\²+è#Ù¸—tÙÒÔˆËm>â#呵¥)„¨4µ rJ”’S‚0)¿xüóö' 5)J)J)J)J[§ßU·æ2¿ÄU&?УÿHþʶÝ>ú­¿1•þ$z®ZlæU²4—.’§šK›[Ka)d”“Èwè<âÿ®Fþ¿ï °^>èÙ~z¯ÝÞ¨yÃÈ’[!ÜKe*C©FS€²Aæûªbñ÷FËóÕ~îõsçÙ ÷°?5ÇüÆ5tsçÙ ÷°?5ÇüÆ5]9Is)JŠWvôFãiÐì…8€zôîDÿóW Wmôa÷ ŸNýíê»&ëÿŸ (SŒÏ…G”*•õy°ikÔØ³o6K5ÊT3º+Òâ´ëŒç(R)çø+æF›ÒR.®,6Gf\c˜³d.JrK$m-8¢2´ËiÈÅV5®²cJ6ä™¶KĨØë3&Æi¾ V²ARŠÖ’²6’RØZ€Ç.c8©é ——m±¬·™~LHrP†’Ìéqе;¥)ÀBÇ Á•„ ”+ºåBVH:£Ø6Ù¶ØZ7KEƒpc3la IØIG!8^ÒI8©øMÀƒ ˜p›3 ´Ë!(Ci)Hä­o3¤6#tw'[v³~v,'%¢|4½f Š·[}jËᵩ•}¢ÔNS€yâíA1Æg£Êã3áQå ‡¥ÇŸ (SŒÏ…G”*·w¹Á´ÄD«ƒü\’ÄT«b•—^u ¶œO5¸žðÎN&³(?ciÝ)W5F±YY7\öD·¤õÌç<\|ÎOÛg¾k.ÍÍe¶µm³B·Û`³žh!¦‘““„¤9’y ×Ït›¦©âî˜çkiÖÜméyÇÖãhiœ¸¾#e²ÀYÛœ…bǧnrî°U&e†ådXp¥,OSŧïH$`¬ƒ9fA0˜‘fÓ²/±ïÒ-V§®ñ[bzã¶© ç)K„nHæyðšÁÓz;Bé©Ë§4®œ³Kq¢Êßof;ŠA ”! ”å)8ïdÁPOêæÎ«wNÛlW{«±VÒ'ÉŠK‹€(qëˆ*!,¥°µ‘˘òÁ¬Yº_Óe‘b½Z$½É‘:ûM Ieµ¶…­! R‘‚ëyK î‡.þ(¶ßí{PDD;õ®×vŒ‡¨flvßBV;Ê X “μŸÓÚUûëçìvWnñÒÌõÄiRHï¸Fà?1ªî­Õ,i÷áÄEªçw-.ºÔ;z§xMñ#õ†¢†P/-Ämin¸„( ´à^H¤¤ R¹K/ðš·ÂeLÃn,f”ë) %(I[‹+ZÈí)jR‰ï’¢O3^üf|*<¡T©‘ª­²¦¢ÑrµõY®Â[Sx%Em«),¸â B·'!_l…‚§è=¤Y´ì‹ì{ô‹U©ë¼dØž¸íªCH9ÊRá’9ž@ü&¡#ôqÑŒfd³AhöZ”ÐfB´FJ^@ZV°Ý'z¬YJO| ‰¸ë«dJ«2à\Üi©QáI¸6Ò XÒ_ÛÁed¨/r¸óJT‘ÄFHÍ`Èé.Ý Ç[ºØ5±ÃɄܘí+L€ÒRâŠV\}”„¸¬¸9xlnØ0­:~ H![-q£Û–\‚Ó,6„EQJTØ%.-9N9-C¼MHq™ð¨ò…Rt檷^R]mûTäMT OSh}2\nÚ¥%d´Cƒb”6óø'¨&8ÌøTyBœf|*<¡Pô ˜ã3áQå q™ð¨ò…CÒ‚cŒÏ…G”)Æg£ÊJ Ž3>P§Ÿ (T=(&8ÌøTyB°¯vû-òÖõ®÷ßs€þÞ,Y!æœÚ ¡¹ (2;àįÏ9òŠô·mKDvJŽ2’µ% žðÜ 2y9ÐxÜt?G÷|uÃHi‰­ábwí¬8Ü`² ƒi)Â2@Î1œ •‰l±D\%Ä·ÛcªßÄ„Ze 1˜;rÓxÂ;„w#¸O.B¨¤«;j6 ¹[n¶èŽÈ›Ðûm©Qߊ·P¶—ÃZ†å)—6•ARAô¹k§­×ëEª^‹Ôhì´†£Ç H S|EîH‘ݼ„6nIdl®3>P§Ÿ (T=($cµoŒô—£·—e:¶Ò”©å„%k#핱NO<%#¼`NÓúZu»Û%šU¥¶S¸/EiqÒÒJJ[ ‘´$ Œ ‰ü«wcgµk;’¬;s¼—8)iId!§ÜéÏrp'¾TRp0•¡zB…ªß·²›æÒnvÎÊÛÌñ‰1rØÞ8.¹·ý3}Êöžë½Èá“ ŽžÓ:CNííOØ­x›zŒ6˜Ç‡ÄÆÀ>Û„Ö ûQŒ4è>ŽÓttNŒÒ©ŸƒÕ¥ \~+<¥-l^ܧbP€œä$Œ ΥūNØ Ø%ØœKW%Ì–û3BJÕ&C’IN0Rê€w€ÎO3›c¶ØìVä[¬-Ö¸H$¢<6PËI'¿„¤+”f|*<¡N3>P¨zPLq™ð¨ò…8ÌøTyB¡éA1Æg£Êã3áQå ‡¥ÇŸ (SŒÏ…G”*”f|*<¡N3>P¨zPLq™ð¨ò…8ÌøTyB¡éA1Æg£Êã3áQå ‡¥ÇŸ (SŒÏ…G”*”f|*<¡N3>P¨zPLq™ð¨ò…8ÌøTyB¡éA1Æg£Êã3áQå ‡¥¯+ql7 uÇd nÀûEIüÝQ]Œ»ø(?Y_³©[—úí³çJÿÚ¡_,+=Ò3=‹×][I?¹çó *¤FÁahîÝžåg;@V씎 gÃKítµf%´!Ä[¥žá{’¤’Ö8à#˜ø+dÖ»ºº¶ze´8Üwd(Z$a¶ÊB•Ý£½¸üüÍ\{%3äýËô‘ý­YÄ"N«]%éǵ^–V^àî¹[ä8±!ÆTbc/9±Æû´¬¡µ”B±Í=ñ%Ù)Ÿ'î_¤íiÙ)Ÿ'î_¤íj*¥{èÆÇ)à1"×ø»¥Ñ«”‡e.f`ÈŽ7©Òµ:­Î2Z±±|&¹;¢ÍA'Q\åÇ—j¶½%Û“£PGuÓr}™y Çq;@ °]mI!Å«·„¤’khvJgÉû—é#ûZvJgÉû—é#ûZMÖ& :>í›V&|½i²éØ@/ÀT),10µèÚÊZ’ÃKQ+˜Â•¹$nî–AÝŸ®º"ÖúU_®è§˜7.1È ´·ã¿øì!í‘§†¥±Ï¸’TJFéì”Ï“÷/ÒGö´ì”Ï“÷/ÒGö´Þ©µßTt7k™Û_a­VXzÆÛ6mÁIê—AÖwL8IÚáßßS— ç½ÏgÙãuX‹k¨CƒºKîp¢«(V÷V®!îSݯvõŒrZ•Ý+í‡d¦|Ÿ¹~’?µ§d¦|Ÿ¹~’?µ “¥FvJgÉû—é#ûZvJgÉû—é#ûZ :®t‘§\Õ:>M™‡ƒ/)èòQY@+aöÞJJ’ HQl$¨@$€qŠì”Ï“÷/ÒGö´ì”Ï“÷/ÒGö´Ù¯ÖK4¸÷é|e½1OFc²/Oꌔ ºÃá.;Ý%kÊ€Æý£’EZª3²S>OÜ¿IÚÓ²S>OÜ¿IÚÐIÒ£;%3äýËô‘ý­;%3äýËô‘ý­Ï÷FõóÔþîÍIÔu•¹ÉòdF\n³$8†ÜRJ‚CM£žÒG}áïb¤h#,ÿto_=OîìÔt ‘mÖ9÷ Ò4™¯>ó‡ m }Ò¥ð5’Ä´[îwA%‰¾ý%.¶¦¡ºêTž iÎP’;éPÇ•xHífCË~E…o:³•-vGT¥ÂIoÆ™ÔÖ}F‡Í­é%lm.µ*Ñ]JUªá¼”«j°p¬`ààœ˜¨n“ù8<Äï²§IüœbwÙRDÍ*¤þN1;ì©ÀÒ'˜öT4¨n“ù8<Äï²§IüœbwÙPIÇ•C²%—œŠàjB°¢Òʰ•ö§jЬxROxŠ‹Õ:¢É¦ZaËħ[2 ƒM±Ù($nR‚J•µ#š•Œ'–H¯Þ“ù8<Äï²§IüœbwÙPbu¥Eæ-¥7d¹"Ph´¶Ùqleѹ¤©ä¤¶•,sJT U‘€r*b÷teµHº]$¦48éÜëŠàg2I$€’@&°¸Oäàó¾Êœ 'òpy‰ßeIt¤µµq]ÆO Çœ`2›t…IBÛœ `7ÅFÔTT œ3g‡&<ȌˈóoÇ}´¸Ó­¨)+B†BðA5ÀÒ'˜öTài?“ƒÌNû*Øý"è×Úžê/!-Áh¼êÜŒêãa{ Ù*H§~–· ÄùÌiËí¯PÀTÛSî8ÚS.¡ÖeÖœO} mÄ¥hW0p =â+ǤþN1;ì©ÀÒ'˜öT3uŽœ…©ÓÒn EÁÅ!DwÒæKh[¡<4-XîP¥+–ȦÖ:sPÜi¸)÷ÙI^ÆÒê¶´¥¤%Ôr+l© ãŸ1^Ü 'òpy‰ßeN“ù8<ÄﲤÍSª,še¦¼Ju³ ¨4Û]â‚Få(!¤©[R9©XÂydŠÅ:ëJ‹Ì[JnÉrD Ñim²âØË£sISÉIm*X攩@«#äV_IüœbwÙS¤þN1;ì¨&iPÜ 'òpy‰ßeN“ù8<Äï² ™¥Cp4ŸÉÁæ'}•8Oäàó¾Ê‚f• ÀÒ'˜öTài?“ƒÌNû* šT7IüœbwÙS¤þN1;ì¨3ßT/˜ÉÿЦë=aé£è6Ë’’Ô–c¤ÃšØ r+»@?$Œ)óÇÀ@"ÝE†Ô¸6‡â©C ,ÙÞA#ð7_.¹§]qN;eukQÊ”«+Ä“øIáÐCX4Å‹EékvŸ±2–c¢lrT¥ì‡8ˆ*qgý¥œŸÀ,׺6_ž«÷w«;öÏ£ÚeÁÞ[vg’¡þðÝ}¿- ¬Fbo¼ÉS®)Øn´”§‚âs•¤ú’1ßçA7\ùöC}ìÍqÿ1]\ùöC}ìÍqÿ1WNR\çJR¢•Ù½s•§d·DFs˜Öާ ‰}kÎBÓ·Æ1ðW×eô5÷¿tþº™þ%]“tí²LÛœ&ç[o¶Y±Ï øñ‹¯ƒ…%â#óŠÉàÞücnúŠý­R­ŸöŸØØÛ6ßå®;¤ÌvÑß·DR‚€œ¨,ã¿‘ŽýcÞt#ðt½Â,ví/.ã:Ø“œµ ´·1²¥ª8q[J‰YÜ2”ö3QRúãAvâÁEæe¹N¶ÑD)(µ§¬[ÖNKÑÜRŠ›páÁÇpžYü tx¨WX—&n¬q¢\äÜÛÌÍÇúÆä©A{ŠeÈRRO"깚ñإÚn–ˆHޝ¨œ”ᇠµ ¶—n„©¤åA´nÀ)*8qGã'06m=ªÑzNÙ"¡Úý¦rOˆ§ãñqlY’£?ˆ¬Z‹“ÚCº"õ¤UxhA¼vC¬8"*z뮸îÿåmÈ8g<ócàÞücnúŠý­kÝmj6µô‹T&fµÉÀóšNBd©÷ÊU×Éáà ŒsIïó«>±ƒ¬äÜÛsNÜ:´@È O^eœ¯r²v®äòÛÏxùG|Á7Á½øÆÝõûZpo~1·}E~Ö‰ìÄ}<Èm¨Ó.¨e°´È•ÃmkäKˆkÿQÈlÙH<ªkr^•-Ó—a“{ÖÇ£\¥DµHu¥>ââ’© Hpœ„œíïP5Þ‘²ëy,zý5:|E5=†]¶¡Éi¶¥a+qD4ám-¯ I)Ïàž´…²Wcµ]tû}Œm¦• 4,uDûÚKiw¸Gr0*Ç!…t­gŠ—›/·cžâÚ Ò•? %DwÀ%*ü;Oà4ÑòV©Ö‘Róeöî̸¶‚†ô¥Pb„¨Žø¥@‡iü‚¡,S5.2›1¨­.3’%Hi"<£)$%ç×̸Nsœ­»JÜ*¶i "ö”:-–]¾49r̤ÅE¼¡˜Ä¶„4„¸ÜnÇÆRÃ^zäÔa"Ç"Ù™†írp-rÉJ¥¾âUÆ(áà ‚îy¿Ê¼õ-»^¿{í–éÀ€­¼$vE†±ÜŒ÷*€éóßq_îïÁ¸tcn¤Q¹..Ï\£\D´@÷Ö–ÊZFÄ,¬©-­,¡+H=Ð$df¥ìšRm²í2ò«´y÷Yƒc³eÄRœ ”´€ Cc⤠žg*É©ëÃWWb¥6y°¡¾ —*"¤ § %.6AÎ9ä÷.yÖ>œrOEºf&´zAf#4 >·ÞaÁh(}µ¥ð¼Im)#¼Hƒ+]÷I̼^ ]¤Ý"&Le¶ð¤áŲæâµwIr;+IÂ:¯Úº%l‚Ä8×dp˜~È+„’°a¦2PÛ·«©F+Œ–†1P÷uÒM &á`˜äÎÄu]:X€R!ÈCÏÜ)GsE¾ª¢NÐ6©<±¶§lÖçÑ®c½Ø©­ÝQvšíÂà¦z ’÷_µX£€€IImG¾lsèLóæš¿ÛœÕ¥X¨í¢D9d¼ˆ±òügu²T’éÛ•6’7`Áo£âÜ Y¹Çe‰wxwR† „%·"˜ÜаØNÜgæ È”´Èaî”5l¼Û‹bÓmmä¥@–ÕĘ­ªÚ¤œ@ü5g¨#¸7¿Û¾¢¿kTÝÑ|m!y™t°]޹P‘ ²óÒ¤´ÚRãŽnJ]®è©ÕœÏhN÷7ì:PW4¾Ÿ¸iÝ= Éå Qâ4 v”ㇾ§C£+R‰RŽ9’MIpo~1·}E~Ö¤iAC¸tx©·Y—'n¬¥Ü¢ÜœÛrqƒ¥)QYPBŒHåIÏ2Ò{Õñ/£§&uÇæ_:ÅÊ[ñÞUÅÈ»Ÿl0úe¶û½ˆm+BNÐ2¬¨“WúPU´Î——§MDZÓà¡å&JÛìyJÚÃL! ¥.”%¶[7~¦87¿Û¾¢¿kR4 ŽàÞücnúŠý­87¿Û¾¢¿kR4 ŽàÞücnúŠý­87¿Û¾¢¿kR4 ŽàÞücnúŠý­87¿Û¾¢¿kR4 ŽàÞücnúŠý­87¿Û¾¢¿kR4 ŽàÞücnúŠý­yÈ‹~q°”]á2w%[‘“€A#ºpŒ0~‚•¥¼ºôjíÇKvºö¡u¸‘“rRš±Å>󮽸¿þ¯qÉM¶Nps6Ι¸§T«Q¿x*h†!°†vGovå–ÒS„ ¨œçbÀ«E)&èî ïÆ6隷ÚÓƒ{ñ»ê+öµ#J {uèÆ-Ç[DÖ+¹<ÅÚ<Æ¥©Qß–†ž[l­”´$lÚâ¹$ å@’•­*ùÐÁÑ2 ?§]·B\[X·Áê•Hú‚}j°FÿH5F]îÓ¦Þâq¶*y9á9Ãs¾‘ÞQÇóünéCQÜuSz^}:åÝÙr!¢>e'.±Åâ ŰŽø ÎÕ–II«ŸD½ëæ»þþšVƒ·& ñnw8ŽÀ»Ï¼EÒš.7"`–p¶Ô’”õ×JAIæ”nÜ‚¬Ò'Ê#ú»]1¦gêWmÚm6›{’[—#¬?†•Õ´öS·v¶Ö NAÇ:ù½k weµF»]m6vùJħ$4ÒH)ÕìÃ#˜æáO>]ú·Yú4‹Ìí–~¨Ô«s·>ɹhˆ§L…Éq'„ BÞsz’IÊR0ÉT—AéËlk[.Fræm,&<ÜÆ1ÛJ”P“Ü¥I , å)HR•ŒÔ‰ï«{úYù?¦þ¼¿EW¤ëkJ[5:­¶-—T2»z™\—]”FöÃl¡Õ(§*Ú$ ݵHÑÄ8ºVÙ§ãê+óh³IKöiAQøöÔ¥’Êlðv­µ­ú—BÎIå…|-êGIÚ©ˆqç®Óm0d½×Qzâ²”­H_ä²[d¥HPR\RJ1ÝY,ô«ÞÔíi¶­öÜ–ä6±Ö¸.>ÛkqÆÒÿ„T„¶½À+¹#SZŸ =¨ 7å:ìêö[‰ŠòÜ[κó‚ë+á<\ykÞ×'h ¥ ,NŽ­ñµ<;ÓW»×ÒEÖ5°¸ÑˆÜ™ ¾‡–=ïˆBŒ‡W‚², ‚¯‚ˆ)ÓzQƒ ù³,º]ˆÑÛS¯:äõ„¡ R‰Ç &ª·Ž“uE¡Ä·p·Ù™Q€ÅÅc…5\Ï„:îÖ iaE{vcºÛ‘Ŭ,]±Ú›µ;+ƒ É ®k|=ÆK)Vå1œŒ%d%*är‚¤ãºÈÂÔz*Õ~í—®HšŽØìˆ²Lá-#c ë8SyIÂÿ•9ÌärO.G6&;$ÃTÜ:OÔvùWó#iö»Ü…Ètõ²Îc¡N>„:ØãˆJTÚ¥ªåÈ×”>•õÈòÞÊáŠêq€ÔÞ:œZ@Clð¸Ž+s¤„%D–6œ_¯}Xï Üb˼ß{0Ïq»zh3ù­<܇Ú<=ûÈùjRqD&±¯ èë³sÓ9S$*\ž´ èŽúYw­N“¹-ºÒ›Wuqœ8•»9nŒ¬S KÊ.®×Rmû«í6¸·"$SÖÞ·Š”’ÙFÝéRJW¸( ›U€“8zÏ^Ë|‚ÆŸ·v6ƒÓ˜\y¨sa.„­¤© _J‹.„–·…òÎFoW@CÓïÙPÌî< $wÑ7Q%çœ*qò˜èm  ‚P­§nTVHù¥î—=I«çßú´8—›cxÈ·ÌqOí.Yã)eḡ+íS¸$§’•V¶ÂRùk‘Ònª}ËU±‡u¦Œ7âÏjb”æòØDe2^àÛ„ ç†¿Šq)Wë™V{uÚ=¿M9å%1"!íîû…NZÃRôS¤n¦×¨"ÛâJLdÊRSeqÔ¥¥ˆQSm)#”wÕ‚rÒÔp5%½"ZEªÚ·-0ã>üQaZ\@wŒC‰p§kéPohK@”©µ‚I!)ðר5Æ\û¤Ë›.Ê‚!,Fq H@>>FäëeÉóø2–ù`(+&.‡“ZÜ5Ru¾¤SóØœŠ¦àðÊ êe ÄmømRRIQ$ãyX¤âÄeõ¥×Ñþ§eç¬6ûLæY ñE¸´¥;”€ ¶©$¤sN@PÔÏkZsį©·è¬ £ hÈRaZçÜäFè}MÌ‘ÆÚñúàQ·8¬­|ðVT@Nã›%%!ÚÖœñ«êmú)ÚÖœñ«êmú*V”TWkZsį©·è§kZsį©·è©ZPEvµ§±UçZÈ&ÅŦ_[ ¶¿&ZÇc”HYK°Vœ€R  µƒ½>jãd¸½ ‹· ¤IL£< u œ’„¢<×ÂUºÜ¸»‘½YlmézPVú6½\¯ÚXÍ»ˆy›Œø/*+jm¥˜Ó½)R”S¸4‚£Œ÷ê¤åÙt,ž”¬úvÓnftJ¼[´ô$!…Èe6¸csM }¢žJÐT”‘¼‘ß­¹J“uŠFZáÓæ-Št¦µ”¸7øHjïo¶•ÂZßD‚¸ªãMi ¸ß¸·Ò=ñ ( P\×Ý,^5C·Ög;a° šjæ•¢kjS—'P츫f.ÇŠP´†â†ç€ã$d¤×MÒ¬¤a¢äôɪX××»ÓÐLȦ=µRc59ñ—\iÆÓ֋IÂDd€—7oPNLŸE¥›¯Hú¢ëqÕjèƒe±ÇLÛXS1¸ŽJ¸% ÷n/ß7¸Ù$€£´nT…š¤­wYŒô½"ÓV"ët2{l„Üä/± 6êšL«a)l0©Hu BœW îÂɶ•wMšOtz³}Znù'XÙ.WP¨°e>¸cÞª¸òÔìæ’‰ P%n¸ë`’ )C3Zg¤s«ái–¬LéûtûœÓÒ•pŽã¨K&³!)iì²â‰ÂÖ‘…/ow¸©Hף˵é],kËãUZd¥«€~ £«­ÛŒbCÚê ŸW¼¥![[NïVäîØ$ºjÕÒôf•t‡67]œˆûåÃKí¤,à•ÉŒÛ_j;µºþÎ RjñJd×Ý,^5C·Ög;a° šjæ•¢kjS—'P츫f.ÇŠP´†â†ç€ã$d¤Õ¶F¯›~éƒJZæ\,¬˜:²{)³¶ÒÄöÕ¾àÚuEx(u=Úp„òRp¥sÆî¥K«HÈé#¤;oDV=qq‹§¤ ólÄŒ[nØ—˜[®8ù~ShZ2Jrë@0J°7CÞ:mÔ¬YìS„í®Ã[Ï6̈·).©2]h)¨íÜÜ’–ÁÃN>­ÅmóR;®†¥X%¨tïIW«‡Mèù6ä!2SbÚ–å¾”´•‘Æq÷°¾ãº ´(nÉI;FÅ'®XàLì„+3nuÈIÛFäƒÄln^¬å#r¹ÝýfÒˆÒÿd}åv’Úàj`ÝD2¨Ì&úô7B·«Ùpx÷@²âÀîP07“UëÆ£Õ,êÏ`®ÓäêäI½!ÛO]qÐÔVؘa«©‘Ãi%MÛÊ]ÜSî$÷¹ôM)8Xš9¸ê%¥™ Zµtùz/­ÂnŽj -8¦§•!sˆâG [vÞ(O&KëHåßÜ}Ì™;@C“2T™‰2f"$™—ˆ™N¦3ŠQ梦JÜy«9=ú·R¬ÎY¦ R•¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@®oû">öÕùîæQë¤+›þȽµ~{Ÿù”zºr’ç*R•¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)AÚ÷­ÿšïûúj.DîZo–ÝWnƒiwQDÔW{£Î9-æÐûEÂÞB²dÆ PFp×}{ §D½ëæ»þþš«GéŽñ÷rzðÜi6¨2o…øÑì’c<Ô[r¤ãržw-jà¶  ).’pªÔÇû&É»vŒÖ³ú?ºhëô]?5Îï&Kò ÜÞ¾«*kÒŸBB㷵ćÚžù+îJBL—¹ÜË݆ÅmÕ— Zc!‘ظéiÕ¸‚RCå;Ø @AÚÈAIÜÔœTž©é ÝaÕ,éžÃÞ.WGÄ~ P›hñ íÍZ+q r€öIÀ‘ÏŠa\é–̘“¥#MjgZ¶B3®¥,±ÿg´™˜w‰—†Kk†öàä€ w ã1%³+PiîŠÒzKE9¦­–©ì}QËš–ûŒ³qq¨2"¯.†Ô®]iÅ%Eà%$Œ[/Ö–é¬Ý¸G½tÕ‘‹£ÍlŽZy‚™+.G·•’ÈR])i@©X¯t ™®ÛÒú»Ç;qmŠj8~`}/©µ¶xÛ±d(ñ‚ÙÈ•H÷¹ÏµjçoMéù«•¶J,ï…¸¤Ášäûœ¤< FPS×XÂÒ K€rÁVô¨m¨cj› nñ"LˆŽµ&*™–„¥Ô8Ãî0à!*Pûv•Ž}ìw»Õ3@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@®oû">öÕùîæQë¤+›þȽµ~{Ÿù”zºr’ç*R•¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)AÚ÷­ÿšïûújÖöŽÓ/ZªE¡‡á2å*XâÊãu…wDžï¬<ï²U:%ï[ÿ5ß÷ôÖÃ%·Þ’ÒðTgCK.2´$’„¯(*-8Xî“‘¤çrT×31&™˜¼+6^Žt¢ííµÏ޶ÖÔ™W)2\¶ä4Œ©×HJ%ÈH# 8ö IˆwØ‚Óï7èÎŹ§¬;ïí:ô—–œîÊräÉ ÊpG)e78ʵƸ†æðdðxi0žŽ*’”ïknô`¨nÜ‘°d¯hI#6 £]º<ÐÏ^f˺¹sT½DÓ¶çÚ‘¨¦ðæ¡m¾¥GK%í…)C’”%8lnRq‘—¯44 HÄÉQÓ-íöâ¶Ü÷ºÂ¸":ÝSe!—ÙZT‡ÀRA÷Îe@m­e«ft…/WÄ~,kìË­®ót~¹Ë>ÛcM¦Ýpn‚P@Ü\ÞÐP.æÜ#2{—H×;žÛ÷ªÅžEÁ†ä]®:u¨²š徎ØJRÚ\n× ÞæÝÎFEÖlÙ]i„hý#‰j˜Zu÷Üx¤§{<·–@*Q Üâ° ”qŒ’y™¸ñ›aé.¡OIt:°ãËZAJ0€¢B„å8*V7)DèO©zj€ˆFLÀÔs1”M]­åªc­NÓj}˜Ðd+†¦Žçp â•ãz®n”£ 6ÈɵƷ&ðcpxj3^.ž’¤ïwvõä¤nÜ£¼d/pQ6” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” W7ý‘{jü÷?ó(õÒÍÿdGÞÚ¿=ÏüÊ=]9Is•)JŠR” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” íN‰{ÖÿÍwýý4‰Ó>–›¨§­ð®òïÝnv–¡!¦’µ¿µ8én„/n¢¡’¡¸QK¢^õ¿ó]ÿM{3Ñ‹0Þr¶Ì·1{…{¹]“=Û`Zë]|¶Ë›V•) *y?n7l8Ù¿)º³)dYúK6Èýîv–Ôkl{‰·;&iˆR‡û‘ÝZ¸O¬†Ûu½ªQwAC) Re-ïONbÖ¹µ9ua/ÁjâŽ} *ÚOrT 7pÁÞ¤•%9ÅWm}ßΑ¥u¨¶OµÏº;6R!ÙÜŠ§š~S²dÇQT‡;…©ÀŒ€l)'qVäËGèþ4»¾ÏªnÓµ HqSÆye¸òR…«}´Ÿ~YNÀ­åHQNà„’jFõç6úøYç9·•¶|¸° È:K1bFiO>ûÎ6Ò2¥©G’R$“ÈQ Öz=Vé×$껡[ÜáM’. p£/8Úâ·a?Á¯Mwbí£Cß´ÏZꗶȃÖ8{ø\V”ûr7cvq‘œwÅSµ÷Dñõ5áÛ¤KÂí/%«xˆˆéu¤´äN¸”¦i•"iP´ÃOtAÛAs:£Mè’u 0äa)uÖö©‚ è9ÁAQ ÝÞɰ4μҺ‹Sß4Õ®ñ ëµ’I**d´§Ô4¥¸”%E[§CJ$ 8…¤óê ôI-Ý1½C ;šu÷¦G-[\uIrOKpÈëªAåY×¥¥r‡»Þ¾øöϪÿõ•ÓŸHqœ ¿ØÄ(¡ճܭ!I<•ð‚ >Yת¥r½¿§‘gÍjSiSî«kiSGàR€Éø? å^ïzûãÛ>«üiðúθu}+”×Ó¿HHJ±nJ\N䀡’29ó~pkéžœúCy·Üo±ŠK8z¶6¤©)ÏÛsæ¤÷ÓáõpêªW+±Ó‡H¯Å“%£iSq’•;ï ‚A *É rïׇ»Þ¾øöϪÿ|>³®_Jåw½}ñíŸUþ4÷{×ßÙõ_ãO‡Ö{êúW({½ëïlú¯ñ®¥´:ãö¨º­Î8³Œd”‚ký=Z2±ª' ªR•Í¢”¥”¥”¥”¥”¥”¥”¥”¥”¥¹¿ìˆûÛWç¹ÿ™G®®oû">öÕùîæQêéÊKœ©JTR”«M¥ñJFy¨°V볤%k~O(¥-°@ÊÒpåw¿ kF™×4„™¤UV¥Z»/#ñKGš£{:v^Gâ–5FöuÛáµ±îB«Jµv^Gâ–5Fötì¼Å-jìéðÚÏrZUæÔóó۔◧â¦2‹/ZZ9IPNFÆUð©#ýÿŸ²çΉ-è² Úó+Sn'±qNÈF;⟫_r U«²ò?´yª7³¯·®ršum*%˜© )%6Ȫ€„`ç©ðÚû§¹ •*ÕÙyŠZ<ÕÙÓ²ò?´yª7³§Ãk=ÈUiV®ËÈüRÑæ¨ÞΗ‘ø¥£ÍQ½>YîB«Jµv^Gâ–5Fötì¼Å-jìéðÚÏrZUÒß0ÍT¨ò!ZÊ Jî-Ì!AIaÅ$…%‚‘ø*—\½ONtM%½:ªR”¬)JRJRJRJRJRJRJRJRJRJRJRJRƒµ:%ï[ÿ5ß÷ôÔWGW^‘/ÍÉn¿y~ÂÝöïZ¦¢Ü˜B;d²Âb†€“ÄJ›i*/r 8yå&¥z%ï[ÿ5ß÷ôÕ©«þµCtµz°AŒ%Km”Ëh¶\zVy½$:ãŸÂÔ¯„ÖµZe!L³t™©®SO^œÑP"¯Sõ1eiËæ[ZžŽëê¬1–¶¡®[R²¢´ 0.}4LgO\î¶ý+Bì¶©7«OÞ!<c”0 Ò¸Ùr+ÑTƒÌ¨&­¶û¿EZ¦Â;é¢ï–†‹0ÓnbDiÐpx-)›VÔ㼃ʰõgGZ3_Z-qÐädÙà¡èͳm m-²xn4—ÒÖÐTƒÁSgš9…—ÔÝs|nõª§-©³i·VÌ»œËÁa!BÞܰ¢€ÊˆlR…+$¤ •sH¤Ïéþ\tõ½£7Nµ×™ëR£¶¨æé[Щ1qJÛÀ $•§ ïãu‹|&0•¾fOò…lKys—vv! ÉÏr;ÀT4]¡âE\Xº3N1i([MÛJ’‡PA8#kï§ó:àï)YMRéÁs•$¢dÈOÇCüd¡ÈÒ]޽«ÚÉ*hvŽDrªŽ”¹1£­Ý'="UâánÓ—%Hi©SÞšúMªêBúÔ² Ôé«QÆ+cB‰*ffc4§\yHi°„•¸²µ¬þÒ–¥(žù*$ó5ݦ¤j ·hðm/^ZGP™-¶›T” ¥pX€)SkØOx¤ã˜5'ÂÅ7kë—J·‹sr"LÓ–vï *ÛŒÕÞD–ä5%€Ú£Ãqż:³„¶#otEW5—K÷-AÑF¤“¦ìæ–tÔérä=r\G¡).JŠ•0 AkXv2Õ…”‘³8R¶° ¢fzʧSlyàû°…±ÃŽòÔ»J¿œŒ×ÔÍ ¢¦ÅfÓÒcÆâðvÚÊÐ×’îÐS„ï*QV>Ø“œæ¬¤aE{¦ŽòøÑÑ×§lÖu\ýÁ˜²N ·áQ,ZRCêQR FN%z<¾ßîý&jFolF„–lV—Z‡èfGAqé丱-IKaXO=‰æ jØæ“Ò®j!¨ÜÓVUÞÀ)Ahɤ Ž.ÝÜÒJ{ýâGz¾-z;HÚ™q›^–±ÁiÕ´ãˆoi´­m8]iD%#%´ŸöTI<êBÍ6NV§‰¨5„Nár\–î§E³Fmq;úšmÕ¶ÊÜBU)—‚Z÷Å´•€œ”ŠÛLéÈ×÷µm?ifðøÚìöá¶™À§ÜÞjîo§zCÕq:Òz¢ùn²Ì¼]™ˆ–ЙÒT©¼HÁÂàDxKX|”¬–PÚ’wàb²í})Þ/ðl Ó9¹ÓnÑ.’ĻС† -Gq9[%GrÜ;w!`nJr­·5h«D‹:´€ÛdÉ2߆mÌð]|€ ªFݪ_!ÝžB³íÖ;-´°mÖ{|3/!Žd7ÂKË:€0´¥Jí”9"*ºù«nzë[Û¯-bÑk»ðjr–ói1":„ø *­Â²²Rµ¤¤.¤zLÕ24•–,ØpáM‘&Zc7CÒ§IBÕ†Ó;î8¼ ¡jIyÌ·c²µ~wP7h·¢ðë]ÉéŒ!mdsŠr”¹Ç!ø+öýe³_íæÝ}´ÀºÂ* 1æÆCÍ•ñÚ°FE¥5—K÷-AÑF¤“¦ìæ–tÔérä=r\G¡).JŠ•0 AkXv2Õ…”‘³8R¶‹­kw¼ô¤âĆˆ6nÚ§Û”ê.G-Q¡OKˆv8@¾+iZrµgjBrš»ÌÐÚ*lXñ&hý=&Vg,ö{R”¨¥)J)J)J)J)J)Jk²oÿ åüåïÖΪ7MÑš›£™‚ôFå¦UÆ4pÓ)¤•-{RJ’  {Õ­MQ)8q­+w¿ÑŪ;Êeø:Q§Pp¤/QÈJ’œëãÜúÉø¶ÿܯû:öüFžQÇ¢ZjÜëŒ\#>ËéŽãn¥huIÈl‚Q9¿Þ?˜ÕÈÖî¬ûn³$—XPQŽâ¤1!ÆJR’\)*÷Är? y¬‹î}dü[HîWýzÅÐöȦDTéVFv¸Þ¨• ŒÞ{ƤúÚg±¢T°4ó+‡ôà º¦;§JR¦¡‚¥€¡rsÙ îŒW\·:¨Ê»9n]¸F‚”‹eíÀ2 áûåÈcžÚ½½ ­:·žkI¸âÔTµ«S>J‰æI<>f¾}ϬŸ‹iýÊÿ³¬G©§”^™køe´ßlNKrØÔÆçq[0†’ÂKjI%²ÎC¿ù/üµUyµ4êÚQIRRJT2?ˆþqÊ·W¹õ“ñm!ÿ¹_öt÷>²~-¤?÷+þη¶˜äi:%­d¼ÕÆÏhiù°#FŽ„²úÃ(ã%\U÷’‘½@!AGý’Aç¿¿6·!ˆ.´³qr3)§Š´`;ICDãˆAÁ<»ùNo÷>²~-¤?÷+þΞçÖOÅ´‡þåÙÖgÔÓÊkÓ-n¤FQ¾õwa {)P!ooen„ €¡¹³#‘N~îkµö¶„G‹ý;ë q8ØO¸â÷øƒ»VÌsì Ø¾çÖOÅ´‡þåÙÓÜúÉø¶ÿܯû:¾îžÔé–“¥nÏsë'âÚCÿr¿ìéî}dü[HîWýkâ4ò‰Ñ-']íaû‡æÍÿtW:ûŸY?Òû•ÿg[&&­Ô±¢3·´)CHJUzs$Ž~õ\=mqêR莖ΥknÝ5G…Ð~zsÙÓ·MQátžœöuæ[«dÒµ·nš£Âè?=9ìéÛ¦¨ðºÏN{:tÉVÉ¥knÝ5G…Ð~zsÙÓ·MQátžœöté’­“JÖݺj  üôç³§nš£Âè?=9ìéÓ%[&•­»tÕAùéÏgNÝ5G…Ð~zsÙÓ¦J¶M+[véª<.ƒóӞκj  üôç³§L•lšV¶íÓTx]ç§=;tÕAùéÏgN™*Ù4ª5‡Tê'õE²Õu‡c®ßy§àJq솶dwHHç¼sï¼ÒbŠR”¨¥(ÍÿdGÞÚ¿=ÏüÊ=t…sÙ÷¶¯Ïsÿ2WNR\åJR¢•d÷úÂWøqê·[[¡¸.Þ-±¬ÑâÚzD¹kBîKÉICqÉäÏŸ0?=tôµtê‰gTV:WBIèêírLMS­µ–íjQkO"¡Ë*çÞϽ_jèöHR’ÒªÚJIFŸuC àó Ç~½_¥ÏÛ—'n:Š ˜3zº˜i·Õ!N0ò^.8·Z½‰W¹]ÒJ23µ í?sé_‹éý¸÷¦žçÒ¿ÓûqïMb}m5XÓ0Ó7£«‰J˜‘:b&IuA@Gp¥<À [ªå¸íáóݸVK÷ý—½.å0œ•0>ÌÔ‡P D¬©¼¥;Á%hÈÆ GÎÝ÷>•ø¾˜ÿÛziî}+ñ}1ÿ·ôÓÞÐtËRöj°¹§b„”<—Z[.¡o-JYJÃHPd`)ÕÍ;ygjAÃÔ—¦[ã¡7ÈRT66„, …+äÒ¹óCD àríÍî}+ñ}1ÿ·ôÓÜúWâúcÿn=é¤zÚ"jtËži] î}+ñ}1ÿ·ôÓÜúWâúcÿn=é­üN”öåÏ4®†÷>•ø¾˜ÿÛziî}+ñ}1ÿ·ôÓâtžÜ´MƒýnOõ|ÏÝœª­uú=–¦œl7§[¶¦”[°HB¶©%*IP# ‘Èü5 î/Á[>£pöµçõuƹ«zbçŠWCû‹ÄðVϨÜ=­=Åâx+gÔnÖ¹R;´çŠWCû‹ÄðVϨÜ=­=Åâx+gÔnÖ”Žãž)]î/Á[>£pö´÷‰à­ŸQ¸{ZR;Žx¥t?¸¼OlúÃÚÓÜ^'‚¶}FáíiHî9â•Ðþâñ<³ê7kOqxž Ùõ‡µ¥#¸çŠWCû‹ÄðVϨÜ=­=Åâx+gÔnÖ”Žãž)]î/Á[>£pö´÷‰à­ŸQ¸{ZR;Žx¥t?¸¼OlúÃÚÓÜ^'‚¶}FáíiHî9â•Ðþâñ<³ê7kOqxž Ùõ‡µ¥#¸çŠWCû‹ÄðVϨÜ=­=Åâx+gÔnÖ”Žãž)]î/Á[>£pö´÷‰à­ŸQ¸{ZR;Žx¥t?¸¼OlúÃÚÓÜ^'‚¶}FáíiHî9â•Ðþâñ<³ê7kOqxž Ùõ‡µ¥#¸Ù½÷­ÿšïûúj§gè²u‹VZµÃ6»”»”}W}¹J‚Ô¶6p$"àq°¥$qI€Œàa9Ƥí6Íeiáö>ólg‡ÆÙÿcIV8®qï¨÷Ô3üßIõ®‘þQÛ<Ä÷¦¬ÄL֦ȻuŸVݺ5ºiWôÒÅ6f “)©’¤ÃPŠÔ‹“òÓ%¾ ëµÒ?Ê;g˜žôÓ­tòŽÙæ'½4§”lúV°ë]#ü£¶y‰ïM:×Hÿ(ížb{ÓJGq³éZítòŽÙæ'½4ë]#ü£¶y‰ïM)ÆÏ¥kµÒ?Ê;g˜žôÓ­tòŽÙæ'½4¤w>•¬:×Hÿ(ížb{ÓNµÒ?Ê;g˜žôÒ‘ÜlúV°ë]#ü£¶y‰ïM:×Hÿ(ížb{ÓJGq³éZítòŽÙæ'½4ë]#ü£¶y‰ïM)ÆÏ¥kµÒ?Ê;g˜žôÓ­tòŽÙæ'½4¤w>•¬:×Hÿ(ížb{ÓNµÒ?Ê;g˜žôÒ‘ÜlúV°ë]#ü£¶y‰ïM:×Hÿ(ížb{ÓJGq³éT{ÔruÂË|¹Cœ†-ìÊmq¢ðS—¡ð’O$Áß<¾¿RbŠR”¨¥(¥(¥(¥(¥(¥(Nécî5£úúßûÂ*ãTî–>ãZ?¯­ÿ¼"®œÂN WÅ‘;¤K”­ñ$H¸­¦‘7-KÀ<‡3ðÖÍ?u‹É.2ÃŒ6ÙqN±)§‘´-=ÒA!N 9Àã/xœÕ³¥—®O¥jf%à>à@E(t(œ àVLÍIg‘Û\µGu‡ZrC6æcnu—µ†×°œ³‚wB‡ÅÂrè„oKÞˆQÚ^ÝŠ‘paÙm oXÏpê.öà:ÆzÉsfÖ››‘€Œ •gˆ’°•%EîJIï(€Àjz﫨â[#2C.ctØ,?¹ ”¼+jD˘æqËuþÖG›m¹zD&!8‚ÒhK\ì,ÊÈaÉTAçRÔ7V)JTm²ëˆum´µ¥¤ïp¥$„'!9?€e@gð‘øjGµû±„™ˆŠ—PAÚÛÈS€,€‚[x ‘økÚÁ¨¤Ùíóá³Â[AODeƒÄmY%h%IÃxÚN;»â¥-7Ë–ßËZ§èu‡å¥ØˆÚùC‰_ 9Ä%-‚y#$Ÿ€  5D¹¦oMËDeFkrÐ¥ïZ-$'’·8±881‘žø£Zföã’L,.:¶)*u *VÝÛQ“ï‡o<#9„TÓzŠÌÄqldMT%¡Íï®#\D)JaI÷­ÛV@9#~åßçìÆ­µ&Tg–Ä´‹l†Þ†M¬¼i„²O½’c •'q”;Ç™wQëíLº–ùia•©HK…'j” ÷‰IÈþqøk⦥ê)24Ìk¢ÂJuk.¦#)ZK` „{ß5g*ΜTöË|»”“#iZÂJÔVâP”$wÔ¥(„¤9"³šÓ7·ÚaaqÕ±IS¨IR¶îÚŒŸ|;yáÈ ü"¿4ÍÆ4å¢`p1*8eKm¤º¤âIØ¢±¹° I‚jÂÆ­µ&Tg–Ä´‹l†Þ†M¬¼i„²O½’c •'q”;Ǧ[qçPÓHRÜZ‚R”Œ•ÞT«šfôÜ´FTf·- ^ñ%¢ÒBy+s[ƒ€A#ïŠÃ²N6ËÌl8bHmð‚q»b‚±úªÌÞ¢³1[U hs{ëˆ× R˜R}ëvÅÕHß¹D÷ù…R|Ie¹[E§›8RIùÁr ŒG"+0Ø.ýA©¢SNíÚ´©Ì(á$ À(òŒXï×΢œÍÂê©ÐâK,°ßŠZi-‚qË$ ?ž¬PµdI5¨ï¹=-DeÆ”ÚØ -•n¹[„t ¤a;”AçH¡5Vîö‰ö¥¶™Ì¡LìRC‰$(nA# ÷Ær>úµÙ.W6‹™mÁ¿bBžBâ°Ô%D«˜äO1YzŠão‘¾ÛÖÌw]x¸û(iD­-§nÔII‘¢ïÛ3Š“+Ž]lDFœâ$A.¨…°®gºFO{ðTTDë\ÈpbNx0cËÝÂ[RsšBJ’ ••´ä+Ÿz–[\ËÄäÁ€T…ãbÛ[É ¤­@FæHL“d^’‰of]ÁSc¾ä‚•ÃBZ*q,¥IÜ' áÞy“^:>]¾Ý¨àÜ®NJC0ßn@ÙKŠZ´«ot´€Ÿ<~U6»5ÂäÃ’#6ÊXmA yù °ØQæ¹Å$˽œÔu\,·Û ¾'c_D‰°Y”© [™*†Âw,ðy£’ÐTyüê§ÒH)JT R” R”·£?º: úºçþ#U¸ëNtg÷GAW\ÿÄj·zv† R•”¥¹¿ìˆûÛWç¹ÿ™G®®oû">öÕùîæQêéÊKœ©JTR·OØ×÷zÏ󋇸ëKVéûþïYþqpÿ=]9ItêCmm¹Ô:>2 IÈÈ’Ø#é¬Ë_ú²ÿ§{üET…qyÞ"^Ìè‰ã4pÑÄ¿µ ɇûG–r*r×þ¬¿éÞÿU_×ý!é"Ssz”Û®µÃ„üŽá­œE´"9«mQ7¦- «5´Ý%g¹-sÏV}i=ÃhË]y÷͘9ä7TéCVëÖ`}zùˆZè•ií/ʼnsÎ*¦ l© ¡Ðêøâ PHRA*Õ:£ëŠÕ¦o Þ­÷iA2-R-¶©nËŠë [­pRIR²ydàŽ{MK¬Ò‘GAÒ´Ï@½1ÃÕRQ£uÚÚ¨éz,¦ÆîñÊÒêP@-»°…-¢,­#nä£sUDN§ÔV}73.òÃq|6[JJÝyBARÕüÀ­=Òu¾ ãÝ4Þ¥·Aøf= m#ã)-¸·? )øj“Ò}Öåï¬õ\TÆv^œê¶¸"AÈŠ‡›eÇB0B–¥>„óÀÃc9ÆÕ[z`Õ7Ë–ÖÛ]Ó·oŒÒR¥DKÀ%ky² J·)%±Èäœãj‚ùm›å‰öùLˉ!Æ^eahq'˜ ŽDVEk®‹jˬõ~–·«¦å‘ö±Õ$¼m?;˜+ÇÀ\5±h<%µÏv â4ÒQÇ,,¬ ?pUcj[¼Kœ¹ß§ïê–ØŽË`ʸm ­X À5óïžwÌ£}úé»ÿõÇÿ£·Ýœ Œ¿kmMežÌKœà9%ˆ¨›«ÞaÇÎpRas<Ç O¾jL\ºK=í'£¿÷<ŸÿgÕO¦ÎŽõ>±•uE‘ûcLÏ´*÷¥½m¸éÊø(%öÎôŠPJQÚ½Å&VýqÒ²_4t5ê­?&àW2ŽgGl<ÙFØ6‡ÒÙRU€¤¡C ÎNÚõ%Ù­EÁ©íVË|éñß“±÷%¶´2¦’æå-†ŠU—‘€ÈÏ>Uj­`ý¢5‹¤®Ž­±-í[šnËwWTiõ:Û Sð¤!JÁ( Q  ³èý÷ Ó_]ÿJß©Y:öT¨= ki°¤½T{uáÖee4´ñÊT•`‚sV³Òš­PµLi®jfQ¦!Ýb™ÇÕÝíí!ÈW$ž$×ðyº#nmCje@å|³Ó Yl?r 5øõßô­ú”÷ Ó_]ÿJß©ZûN#TjÝWtTEÌ»ÂDuÊÆÖWJË×k¨eh°êTËl€UŒ! „äW¨´Ó]6ê=X3-É¢8‹{×ÅJ(˜œe!¦Öâ¸e)C[›@'¹邬Ÿr 5øõßô­ú”÷ Ó_]ÿJß©[•:aj×~äkñë¿é[õ)îA¦¿»þ•¿R³º@¸ëèz‹M³¥,ÖÙ¶÷æ©3—"s:´•lslg8MîKD:’½¨Ú‰­yª5Kk{Ì=«ß—¨mÌ\•*$›×H˜Ï¡Ç„U‚¦ÜØ¢´ `4RT²U„ÄA™¢ëîA¦¿»þ•¿Ržäkñë¿é[õ*ˆÆ«ÓëMéû–¶¼¿¥0DY jTä™Ë2‚ã K([j-¢3‹l- iE@¨$+82.o[íÖP®“­—‹‹P¸Ð´ÛWù/9;d¹*m¶—J!•":–ã.…*?>EU®ˆ­êµ['܃M~=wý+~¥=È4×ã×Ò·êVĪM¢ã¯œéNé}šÚÖ˜nuG‰Î(‚\” Ò d…¸ †BÚ.a±°…/yž˜j¬r 5øõßô­ú”÷ Ó_]ÿJß©Y=4Îz ŽÔ¥Orßlvä¹ÉLÕÃKlðRä na },!N'˜ 5ªnÚ’ø‹1qíEuiæ­²ÒjT÷X]ÍäËš–Ôå‹SmÛÇ ÎE­|Ï~Ƙ’kóFÍ÷ Ó_]ÿJß©Or 5øõßô­ú•j×’.±4=úU‰µ9vfÛ!È(J7>QlðÀr­"u’̆íz®t½Ö¡‰—7/Ï”´µ58© šG8RÛ·qy4^ZG.üéŽy/ûý›܃M~=wý+~¥=È4×ã×Ò·êTÏD²åÍБ$K•"ZL™h‹"A%Çâ¦K©Œâ‰æ¢¦CJÜy«9økU]õ§jÿwì%ÖtV‰„9jëŽ:ŒÛ 5uB66’[€RèæâžX=îiÓR+4_=È4×ã×Ò·êS܃M~=wý+~¥cô/qnmÞøÍ¦ù*÷aj´éEèëͪѨõ²Ý.äéJ"k-QÃuaçÖ Z%•6‚ Ô”ü<«Lô²ì+®¡kTiñbƒjnàìe:¹BDäDRÉSir+l¬-¦Ôèá¾á #—|¤E×Þ©#Áþ±N©#Áþ±ZýΖ&FKÖùú~Ùøi-2/iT …¢RÖ§¤ð½è´ K ŠÚZÀ*ÎEëDß»dÓ­] PžÈ‹"9p/„û-‡R1¸X ÀÈÁÀÎ*Ð{uIõŠuIõŠ”ª·¤}q׳4D=Elzõ¤)L"k*RÖTð[)H^âë|)ÄmÊBO”RGƒýbRGƒýb£ºBÕ'JÛaºÌXÒeΔcGL©b,t”²ãî-×¶«†„´Ëª'j¾×çT©ý2˜ð\”:×ý›é7¶Þ¹%µÇ ½)§l=e`Á–°=ï(k9ÀEÆÆê’<ëê’<ë÷©ï4öšº_ç…˜–ÈoL`ʸm ­X‡ 5¯ébdd½oŸ§í‘¯Ö’Ó"ö•BZ%-jzO Þ‹B°àØ­¥¬¬ä 6T‘àÿX§T‘àÿX¯~í“NµtT5Bx?",ˆåÀ¾ì<¶HPÆàm`+#8ªMÃ¥ø¶Û„÷®„"ÇÙì"SS’¹JrrVá\}£cjêRÒ…ï;‹'ÍНRGƒýbRGƒýb¡4¯™¨n7+UÖÓÛq€Ó/­.cE·Vó`q‡äw´c¹R;æ£úEéé;¤˜­ZXšÍºÜ›ÍÇgˆëDsÆ 0‚•qÝÙJöekDî«KÐÚ«_T‘àÿX§T‘àÿXªòuF¨k¤¨ZVfœ³S•%#^\uö£4R”¸ã*Œ”¤©Km;C‡«A&²zOÕ7m)i2Ϧݾ¹&hŽêP$”Æo„êø«êñßsnæÒŽM‘—’O"cªHð¬SªHð¬U2ÿÒ=Âߢ™Ö0¬vË•¨"Lù»–Èp(¥qã¥Lîuд”„¸%E)䬤lz¾©#Áþ±N©#Áþ±R” ‹ê’<ëê’<ë)J¾©#Áþ±N©#Áþ±R” ÖvSÒ&žIä@½ƒõ†ëfV¶·ÿâU‡óß?yElš³ˆB”¥E)JP+›þȽµ~{Ÿù”zé æÿ²#ïm_žçþe®œ¤¹Ê”¥E+nt&LG­ÏBCnLë3}¢–¤EN1ßÌsÆyfµm®‚~éX?­^þØ•tå%½$û¢ÊB“§aÒëná·R’JžeÃË)åÞÏ{¿_jo\)CK¥;‰Q¸”Œ““È9ŽýFh9ÚÛPß®K—r×,À7{Ä&¥2Ý[XC2d°ÉHRL¢¤ ÉP.'* A9…rí¯#éÛ;Œêý[x—sÖWB›‡Й"fó^¹ù2|æ¯iN¹ù2|æ¯iQ½/ëÍU¦§k¸ö[eÎkVýÍÆ,ˆ©‡Ã¶ÈQ¸û¡ç¥¤ð;R—94{œœ*'_ôƒªm»u·ÞRÕÑ­O¯€Ò”–aÇ».2JJHî x§8ÉÚ7r޹ù2|æ¯iN¹ù2|æ¯iU¬õ•ߤhZÍM&Ë&;ð`Ý\‡1X{«^^[‰ã6´„¼˜Ýƒµ `•fåÒ'HvNd+µÕLÚ-I_Zƒ·¦ãqÖæ‚¶â´áêùڳ˕Z Ã×?&OœÕí)Ã×?&OœÕí*›7Tô€Þ˜×™µ˜n×ÛS‘³v)®ª¹hÜã­¼&Ç0r´óÊ ÎÊÐÓ®Ìk-C¥nçoìÛb”ÔÙ 2‡Ò§ËáL¹ÁBJC(XÂpèÎy‚‡®~LŸ9«ÚS‡®~LŸ9«ÚTwH÷^‘é*ådÑoÞTbX ÊŒÔt[„$Èyù‰*–d9l†`䫼HÌ^•ÔºÞç­Û*õ¨b[îW»í¹¹/Æ·uD·ÙHe0ʧCè !X’ TxáX´^¹ù2|æ¯iN¹ù2|æ¯iUQ{é’Ã2Ù©n:’á;[϶;cZC„«SM© ¶㈊ƒ¹JÆôŒ$¨}ªzU¿\·ÜçjÙ`Ä_[F˜jÊ†ÐøºÜãæp§dV’™ä…s93œçÏa°¸zçäÉóš½¥8zçäÉóš½¥yÙoºš?IÍC¿Þ$ªÊå2%µ¸‰†í½Ä´‡V–‰’ÛéCd¬¨©´òÊkhÐk.¹ù2|æ¯iN¹ù2|æ¯i[6”ˇ®~LŸ9«ÚS‡®~LŸ9«ÚVÍ¥²á럓'Îjö”á럓'Îjö•³iA¬¸zçäÉóš½¥8zçäÉóš½¥lÚPk.¹ù2|æ¯iN¹ù2|æ¯i[6”ˇ®~LŸ9«ÚS‡®~LŸ9«ÚVÍ¥²á럓'Îjö”á럓'Îjö•³iA¬¸zçäÉóš½¥8zçäÉóš½¥lÚPk.¹ù2|æ¯iN¹ù2|æ¯i[6”ˇ®~LŸ9«ÚS‡®~LŸ9«ÚVÍ¥²á럓'Îjö”á럓'Îjö•³iA¬¸zçäÉóš½¥8zçäÉóš½¥lÚPk.¹ù2|æ¯iN¹ù2|æ¯i[6”ˇ®~LŸ9«ÚS‡®~LŸ9«ÚVÍ¥²á럓'Îjö”á럓'Îjö•³iA¬¸zçäÉóš½¥8zçäÉóš½¥lÚPk.¹ù2|æ¯iN¹ù2|æ¯i[6”ˇ®~LŸ9«ÚS‡®~LŸ9«ÚVÍ¥²á럓'Îjö”á럓'Îjö•³iA¬¸zçäÉóš½¥8zçäÉóš½¥lÚPk'[§í´Þ?=Ñ^Ò£Íæú +x#ÿÏ£ÚÖÈÕÄ=p àˆpÖ»é[¥ 5Ѭx1ç6¹3$)¸v…¡ØS¤IH„ƒÊJH}D¸jinâZ¢HX)jõ¸øp¬œko“ƒÎŠö•3mºÚïãOÞìò™™K‹SøRZs#Ÿ0rœœS‚h ×ØÖß'í)mòpyÑ^Ò¯sžr<'ä3éŽ4Ú–ˆì” d!%jJBxnP<ÈëÆùtƒd²N½]êð FrT§v)\6›IRÕ„‚N'ø()XÖß'í)mòpyÑ^Ò¶ (5ßF’Œ¾“ïJ[m¶ëvˆÍ¸†÷mI9Ü€  `G" m*Ôýÿã°þŒŽímŠº²R”¨¥)J)J)J)J)J)JSºXûhþ¾·þðЏÕ;¥¸Öëëï«§0“‡«VHº—£»ÆœœãÍĺ‹Œ'ÖÉÄ¡×^BŠIaGgà5'¦,×GX솬½j.Ý‘j"88ÎvõvÎr3»wÚŒcžctÛ«E±Ü:¤¤L—þÖþPå|Zµe†ìÛNZµ-²z¨­*4ä:òP¥©°R£•„%J)ð’{ÀÔUº•D»t‰¢­2{®¹Óð;ðÜ›³-(ìqM«’”%¶´À¤(wÁ¬†u®˜yû“ êÛ;ŽÚ’âî-¢âÙT4·át{ØNwcçAs¥RlšëJ_áÙ5’æ¾"ZÛæÓÇz’µ%8JtRÛ„ùQø LC¸75’ô9È’ÐZÛ+iÝé BŠœƒßJ’¤‘ðAæ($n6¸ –Ùsâ½l’eCVõ¥—*À8>öó‰ÁÈî³ßŠÕ×£èwË›²u-úõ|„Lž¯m”c·0}§XO¤-Xi×Ŭ€£Ï<êkŒ÷…_”j2Ûª,·97¶ÝEošý±|9íGš‡YPÚèI%(P±ö§ðJÅkdj:0ÂSïj]G"òŽä{˯0eÆà%Ô4”a®HK *â¯q$äZt­Žœ±1h‚·Ýiµ8âÝ}{œy×SŽ8³€ ”µ©G ¨àÊ¢lšÏ¨uû vi¥ìqp¦!ô¡_”ƒüÕ%Æ{¯Ê5nÊb°™µÀfù*öÛgËŒÌWÝÞ®í¦Tê›N3…>éÈ;¹çœg¼*ü£N3Þ~Q¨¯]§cê8qZrtÛt¨RS.Øj@z3¡*FäïJr…­$)*(òª¼ž‰,ÂD6î—¸ì=q.‰nCö³KyÇ–™H'ºqç”K|3ï«€qV ½æžÞíÆíubß ²%H 6Œœ ©DÌα$j» ~ÇuKmg²„ ~ùÈO[Î1Âʽó9kžø¤x'ÊÇy·C¼Z&Ún,‡áMŽäi @[kIJ“Ëð‚ESÑ„Ÿ{Rê9ìw#Þ]yƒ.7.¡¤£ pŠB_|èQW{‰'"Ê_tKËwÎãP­kM2õ–Eí­Yhr×|9Sql°Ò¹ ªsvÔžc‘? žÒ¶8zrÄÅ¢ ßu¦Ôã‹uõîqç\qN8âÎ*RÖ¥2£€*­ÈèÃO˹Jvt»œ»l‡%¼›C¯#ª2ô¦Ö܇Q„‡7-.½VR8« jnôMˆÔ¸sS&3È4ëNïC‰#!IP8 „V#ZŽÒõéû#WØN]c¶ze¤¾Ò0¥7ÀsÈøE'ÉÙ룴“rDÉŠ»Ýo3å¶Ë.L¸¸Úà³»„Ðá¡ Ú’ã‡8ÜJÔTI¬Mg mz¢àä¹W¤4ʆ \˜ˆêÝÂ(R”{rBA[œÐP¬8¡»½ìz†×}Œ¹V;ä;£ ¸Z[°å¥ä%c¾’RHdr¯Ë¦¢µZ¥C‰t¾Âƒ"sœ8I––×!|»”TyŽC=ñV·ªmDœHš–ç¨C¯½6àË (¸ RÓMn)m¹Çs’JÏ<Ö¤¶MºÁDx:†çbq.…™ާœ°‡Úq;NAär‘Ï)Ej~öõ›ì'n¬6z %¤¾Ú0¥6à9Žd|"¿5¥³éÈH›¨oðmVàiΘ†RÈ$$)dp•wðਨ}BrE¥èZ¿S@ìQuÖPަú%×Vë²Ô™Üu-Åwc çcÕNñªl–iqb^5ºÝ"Z¶ÆjTÔ4·Žq„Tr~ ”ã=áWå ŠT?ï ¿(ÓŒ÷…_”h&)Püg¼*ü£N3Þ~Q ˜¥Cñžð«ò8ÏxUùF‚oÿÄ«ç¾~òŠÙ5¬ížôé'$‹ßï ÖÌ«8„)JTR”¥¹¿ìˆûÛWç¹ÿ™G®®oû">öÕùîæQêéÊKœ©JTR¶×A?t¬Ö¯lJÔµ¶º û¥`þµ{ûbUÓ”—[*ÓjU®M­VÈJ/Öb–Â{Œ¥)ÝèÆ½KYVGtTIÎMFXtF‹°<°é ?jt:—‚á[Ye[€¼¡#ºuÔƒßËåØ)QP÷]+¥îÒ£Jºi»<ù\Œì˜-¸¶TU¸©I%$¨ä‘ðó©ňÜ×® ŒÂ%:Òv@@-´%J¸²ä ÕŽù¯z„×ö™Wý ¨,Pd&<»²LFQ 6·R¢G>DƒRmX¼Ý޽M¡§Ú{cV Ó’­Ö¹öDÌelÃ{ilž.v¶½®)=ðp²;Æ¢õd‰o“m3õ\-s—rm,Úß¹µç%#;’†Tà%c+È ÏÛg᪠úGXK» T1:ßÕ_„iLˆ&RÃ-\â5ƒÕýèÍg…Å9""wóïàOèïY¦Ét†Í„­zŠ×*̘Û,êzdçÒ—Jù–Й¬«,e[â §¿ª^œÂm^gŸ†áT½ uÔ7;¤éÉ×§âuk”"¶\’äq»ÞÞoš‹~ø¾åCÚ¿ ¯˜6}Ñí¶mÊ «Mi8+3d³ˆ-+i!EpV@Éÿhã¿U8põ Ó¥˜ŽÜ´<û=ŠË6SöÙ1׳!÷u ”ò’ÿ¥Å„¶–³¹aK9ä‰Þ–-7k”+$ÛDI]µ]Ç#F[)}Ęï²×Þ‹©ä:çrKb§b#,Û½ã£ò¦ÓwºiŒê‰Œ*Cöœ~ëkcq÷æýõxO1ïŠøÇ8«c¢ùšªílèé…è«nèÙLeL\rœ-/·-”ò!\±ß­ovÓš½½$Þ‘÷>˜í¾ò&;y—mzä1DÙ&ÞßöÀ)CÛKƒrS“°w&nñ¦õ$þ’£ÍfKöh/ΩÌzm®c:ÐS<$‰×T¿|… ]ÆHA«KóŸÚsœ²àÝ¿£M~Ô™ÂÒ:­²ëbKÉj<ÑÄh,6¬+º@qÀ3̫ɩ ïèÛ ¸Ðç½aµÈ¹´‹|f^SL®[mîØÂpV”ñU„ ¼àwG5Nˆ,zŠ£Ôw{ô[²Ö!±ëºá‹ ñ²’˜^ðOÉR÷r ÄgLZKR^o7žÄZœžÕûO¢Î‡Ðôt&‰Tœ¸èw»áæCneœ¯|d `ó”ŠÓe­ªœ¶Zz¼jû¤{m³£û†¥OYì›q؆ìѼ–¤q‚A_t\R»¿¼…wñRqnh{+ÍE¸é-3k4Äy-¿# Ê( -(”‡va[OuŒõUÓz…hèÑÖÍC¥c.MÁÙÓ.W4L%O%å%Ö!‰.m&Kˆ{íXîBÒpU‰Ñ¾×šJk¸1nº\&OCÖw›Àëªvœ–ñ[îT´’TÛª¸ˆJSX"’Úv ËCQؤÛ.-Íi- Œ%¡Ðûm­{SÅFw%*S¸ /¼I¬¿¡äÈŸ¤ÖöyæÐô‰Ö¢¦T¤¥íÅ×g¾ø«*R‡uÄVs¸ç?IÙ"i½5n°Á+Tx1ÐÊV³•¸@æµ…J9Q? $Öœ¾hY>EÂЋ O2‰×©è™*K"$ÔÌbjgÞÈL¶Pæì$&* {íY•Ó²ác™Ðf·›å’WGˆh˜–ÌènBa´É º”§ˆœç o3ªsà&°ïò¾Ç™ë‰6ÿ'¢ÙK’ÒÞŠüÕÀYu }Òµ¡Kûd—‹Ä‘Ȭ¹žy¨íg×ö‹v­º"×rvõ.Û ±ËËÐzÁu¾2{±Až®Ùt,ñT €îîYnš5Öôþ”ÐÖÖ柊ûKºÈqiÜãQÀq(PÎT§ž+8 ¤;’ †m"¿§9÷f&Üç6Xž²i=Æn®zÓc·MK+reÙqšiÐÒFT§   ’N0+ë¶í)ÚÚ57lö^Á¬‹—_kª¨…œ;»aîþø"¥'¼äh2$3鎴Җˆì” d!%jJBxnRFO2:ÔviæÕ åµ¢»‹÷¤j Óa"l›rÒÒ%Ì–ð}8•‚¦Ûu)Rw ’æÔ¨§r„VÆ“¬4ŒnÇõScg²`KƒIë`ò,«»ÿðsY1uŸ—}‘a‹}µ¿wŒïÀn[jÒysS`îHæ9‘ðŠÓ7]=©¢áèø}êm÷XÏöÁqÝjëëÉyÇc¥=i-·½N8°¤©im.€‘¿%–!z*Á™ ß~¶X-׉÷G…ÆL%Gy×Û}µÉd©ü8·Ë§Œ¡´$‘œ ¿9Ì6V¤Ô6 5µòÙfˆã¡”?>Z#¶¥H@RÈXJŽ;øðW×Vi[Mò%Šé©l°.Ó6uX2g4܇÷¨¡R‚•¹@¤`@çP½6Ç»Ü:,ÔVKŠmæ}ÞÛ*ÞËQa¾aĥŗœ@Ø@;IW1„žx«ëÛuöúïftþŠÖ6]Y.Þˆì\{7ˆÑÛ¯S-–¥©%%Ź€Û¹K¸ÈVBd ‚î­Ò­OŸosSYQ2Ú¤NŽ©í"´‘•8êwe ™R°¯Ý3«4¶¨™Ô¶kØ·ØùÍHánÎÝÛvçj±žþà­wiÒ¡Ò¬­÷ëe‚ÝxŸtx\dÂTw}·ÛQŒ–JŸÃ‹|ºxÊB@ À¹ôuh¸Dfë{¾Gê÷‹ÜõÉ}¢´¬°Ê}î;;’HîZB Á#zœ#¿A/#PØ#j(ÚrEòØÍêSEèöç%¡2^@ÜJÐÑ;”žá|ÀÇr¯ÀkåK§¼Ê²³µ9t†ÙrL$Ll¾Â2¥ ÉÇ2>ªtšî í¯H=hÑ—«ÜkEÉw /Ñ Ú¨S#pÒڊžmG–ݤáDµN¼è+•ÏUJa6 N.Ì›¬ÙpäÍ€9r£Éih‡ÃWU!K̇€0ŸöJÚMkmíëëZºÀ奇8ONMÅ“µüU9»h<Ç"sΦ-ó!Ü!3:¦%Å}!m>Ãm¸“Þ)PäGóŠÓ}1¬ã&÷|~Ý©œ~@Þ—´.íúÁSè:˜$?ÂÁ%[7Ûˆ°:³\¬=A¶ÝãÓ’ô§AZV²]’ë¡K)%E…,#¸ * Â@f!˜”ÃZŸM;z‘dkPÚtŠ‚äˆIšÙ}”ŽeJo;’á"°éA7i7w5¾™E¸HêÆZ®¬CØ*áïÝ·~£·9À?‚©3-úŠóÒìG2cØí/NvØ”¹ªÏ}ÖmOÉPxºèqi †O7Ü'¼=%h×¶¶u¥å›eÍÛ¼øQ"Ú—zv’\oŒ\`0Ùt,`.žàTÚ«½Û­ô]ÎtÝ]§æË¸´§ ±äËŽJm%aKm)Q+H-¸ N@دÀju×ÓJuÕ¥ ¡%JRŽ@ï’~Z»PÚ.ºmÞìúkFß/¶í5+­?*<ˆH.\böÔ§JÞCŠ8ÚB”wr­~Øçkì±êÎbP:×r}ë»!×Ú÷D'Ÿ>UfÒEÐËé @¢Ònë×e6Ñ F2ÍÕ€Èx‚®ýÛwá*;sœø*F&¥Ó’í/u¥ûlד$¶¦6¦_uKá¥X;T¢±´I'—~µÖ•g]ö7WjW´”Ë^°¹DgÜ„!´–ø¡” ´úÊÃEխʱK'Hé¢Dü"Æ“¼ÁT=4õ»«AoSÊã·5•»9N …,6…$‚¥òRBÈœç?Qµâê-?.û"Ãûk~ï;߀ܶÕ!¤òæ¦ÁÜ‘Ìs#áí{»ÚlvåÜowHVÈM"d„²ÒsÞÊ”@«í:Bô:Uƒ2¾ýl°[¯î Œ˜JŽó¯¶ûj1’ÉSøqo—OChH#8Ž‘Ø¸¿§Ñب S•¶å¸Ãã`¸Ï[’¬ƒ»Ê׃œe´²ØÕºREÒ©Meváqc¬ÁЉí)é-aGˆÚ²´á î’îUø |¿¬4“¶×õM©ÐT‰‘—ph;¤§r–âJ²„Ì“€:Õ¶Ë^²°Ú4 >Ðï77l÷‰—iîD—d>ÝÁ°•q$ É’Û‹ T½‡&²4Ö‘Õ‘ºU.U®b,ño×+’JžŠ`6™|!Ö6«­ .éw- îíÅÞ†ÕlÝ3«4¶¨™Ô¶kØ·ØùÍHánÎÝÛvçj±žþਗ਼ªôuh¸Dfë{¾Gê÷‹ÜõÉ}¢´¬°Ê}î;;’HîZB Á#zœ#¿VªJRJRJRJRJRJRJRJRJR‚+U€«ä•ƒÐIø;ƒPì\f¸ÊU’bJ’ Úå‘üêéÿ0©m_÷»pù£ßÜ5çAe>õöÔÓ°Šë‹ qI ҆ѴŸÂOUjŸ8ÿËVšTU[´Áò«TùÇþZv˜>UjŸ8ÿËVšPU»L*µOœå§iƒåV©óüµi¥[´Áò«TùÇþZv˜>UjŸ8ÿËVšPU»L*µOœå§iƒåV©óüµi¥[´Áò«TùÇþZv˜>UjŸ8ÿËVšPU»L*µOœå§iƒåV©óüµi¥[´Áò«TùÇþZ¯kÍ?ب6¹š½NÝz€ŽÉ|Tå-œÏ—ùÍlª§t±÷Ñý}oýátæpŠ¼Ú¥_z7ÔvH/¥‰WnqXuD€…¸·•9ò$¤*Ǫ]Õе³Z)ø·½ =†D¸¼w’Ì[ƒ [d9ÂÇòÖÂB–’RÉÈO![kJÃâÚ–ç›/–ßþaÊ–ê•ýŸãQZ¢Å¦¯ÍEÑÎÉ·ð\ªî—‰­q£™H¹)D)ARšAÙ»™$djŸª4f°½é[­…,ìidêY,MzTm³“4OK µµÂ e4µq`þè~¡ù_Ùþ4ê•ýŸãA¦e[5¥ËH]Õµl›Í¾DK…¥B»J¯0ç¶Ú ½)-¨º@ÂÆ?ګ/Oh»E•ç²"Äm]üW±—?Î¥•(ÿ9«OPü¯ìÿuÊþÏñ¤Z¼çâ »]ô£ïZQi»•·VÜ­ Zæ©÷™ŽˆÄ$ÒZâ·ÅaÂ\%䤅›7À5‡©nÚ¯Z°?©^tê-eL•EqÆLó—r ÉiΰØ'3Œf·Pü¯ìÿuÊþÏñ©1X¢ÄÒjÕ=Y5¾íz¸ßâÜÐdÅ…—®‹ˆe/ƒÆÜœD< Òx€ ‘¼•/v@N6EguÊþÏñ§Pü¯ìÿÔÍYˆ¤QƒT›F½CéNéªÞÕ·)ùp£°ˆ+Dl‡%+„­¬ÑÇAA ÞNýå@$VÄê•ýŸãN¡ù_Ùþ5AéJÕt¸C²Ì´Å~c¶»Ÿ[\xëe/8“æB›ã{ÑZò]H_s–Åk9Ýêñf¹DjÆV½Al“fL}–•=2kÉK¥|Ê™Œœ±•oŠ2žÿEuÊþÏñ§Pü¯ìÿE‰¿<ÕX×v©WÝ~²B}1å\-²"°ê‰µ¸Ò•säH5ªÞÒš²UÓ¶ti©°:«ð‚-i‘ÉXe©èâ5ƒÕýìÌg‡Ä9"*wóïᄀù_Ùþ4ê•ýŸãE¯ó÷Rú1µM³hö¢\#"$‡%Ì–c!aB:_”ëÈk)äv%Ä£—.ç–F+[_4«º»p²3 PÐf^f5w[ìð\˜†ÒŸÞ ¶‚÷1Q·Ÿ~õÊþÏñ§Pü¯ìÿMÈš5§Fv›Ã:‚ó{¹Ù^²5*8lÃyØëX,®BЇ”l } #=ÙK#w>ü7KšWQ^.÷ŽÄÛœÕò‹JCÌ!0\ ‘—÷\<Èm̳•{“¨~Wö:‡ågøÕ™¬Õ˜ŠEnÃ¥u}ylq¸VûõÂì«‘y‚Ô†ä&PCh߸ŸÊZJ‚ÆÀ"£iÉçf陋´þŒušÉd™xu·I€ÓQÝa¾ei,¼âÀH«˜ÂO<_º‡ågøÓ¨~WöM—z´/IúXê™’gÛtÅÞn¶4ÛžŠ©{µ%ç i.¯ mXP1UÄËÉ$ ÙYÝCò¿³üiÔ?+û?Æ›PÞ¬VwPü¯ìÿuÊþÏñ Á¥guÊþÏñ§Pü¯ìÿ VwPü¯ìÿuÊþÏñ Ö¢d5•†[•ˆ/>ýÍŽ'[<•ðw±ù‰«wiƒåV©óüµ]µ§gHÚ}ÎÞÍŒÿýCu²êÎ!nÓÊ­SçùiÚ`ùUª|ãÿ-ZiQUnÓÊ­SçùiÚ`ùUª|ãÿ-ZiAVí0|ªÕ>qÿ–´¯ÙßI4Æõ¹Âj{{ÖrµíŸnQøTq’~Mts‡Ù÷¸¯Ïrÿ1WNR\ãJR¢•¶º û¥`þµ{ûbV¥­µÐOÝ+õ«ßÛ®œ¤»”¥E*;SÞ"ií5t¿Ï 1-Þ˜þÁ•pÛAZ°?jF±o6èw‹DÛMÅü)±Ü!¢H mi)Ry~H©8²Å+vµs¥‰‘’õ¾~Ÿ¶F¾ZKL‹ÚU!h”µ©é£‡§'M·J…%2á͆¤£:¤nNô©(ZÒB’ B*“²Â›ué6ïF9«Q¤£›l¾›§ì–Ýmö$9Ö#¤6®:øŰ½Èä?/*¹gÕÓì/Y!Ír+žê–ëªd܆X[É[ÑRzC)%d•:Ø)¹{Lè’Ù݇«õ4ćaêo¡r\un¹-I~;ƒŽ¥8£¼c!! œËÎÐh™¨[½=ªu r*ä=nd®:›€óÍ­µ8ÙS%J!./j\RÐ2;œ’Ýô„Ƶ~ã "ÓÖ`³B—jºuøÊmâè@âðÑïL¸¼°9œòñé¤s¤î’bµibk6ërnw7ž#­Ï€Â UÇwdY+Ù” ­º§´Ž”cO˸\]ºÜï7K JŸp[eÕ¡° Ûa-! ¡ Þ²P9­DäšÂÖzת.K•qºCL¨bÉˆŽ¡-Ü"…)A—·!D$¹Í ʰijÁ•dt§znã¨áKÑŠ"ÞÍÅVˆjrbe^Š¥ìCApÒÒ¸¨l¬pu@)=Éç‰=®õ÷OΑɧۼ@’Èn³a¥ˆÅIueèu$”¨ZÚBI È)©Yz%Ù·Áw«õ —c¸û¶Æ”"%»k®¶ã\F‚XÔ„:´§Œ]<ÂŽMx{B‘k¾Äºê íÖMö;PçÎ’¶òã6VC4ÒJuÐv (ñÏ8"N,FRÝßfê}jÔ7 Z-o\TH/¶¢KgyB ܪÁH#våU ]+®=ÖccN*T?:$3hrl‰Q%JI´lBÕ R^ó¹MC5³P”¡HJR0UE– òç³®ïÛe*c©µ—Ò˜ÑÞ–ÛÈy½¨­.½ßYH.,¤i9š.ª«Ç黋f•=6Í:ëlÉŠÁ¸1¨ƒ––xÈu^ÿ/€8JG%Iج)æF{¾Söî×Gt|“§ µiÔ’Ÿ„$¦è¥¸ÛÍ5-жÑÁ u…¢.ä;½%AÔ˜ïþŽŠ-åfcº£Q½wCÑsQŠÕÐòJP–$Éxwm¨ù'!$豤³dfß­µEµi/MŽLî”÷XâÈ_2ò¥ O £¨V×fö_gªR È\Y~ZZQa§-6µã¹J–¢”“€T¢<õT¬z«R^´b.°4ÄÝ…Êe½øŠ»ÆdÆ’ó p¾YÞPK9kwv9`-³ÙrLÙ–ô7]iHD†B Œ’0´©%C¾7%C#˜#•kÇ:&é9šeÞ5zàËž¹Îò€¥8ë¯<ƒˆ¡*mÇ*R;”¤a;’b£.}3*š¶_M–Ô™ÖˆîßP‰\eõ²¶à6&Z‰JT“ïaIu¾yQí§µ Öf¸¿é›¥¢>ÆÆ‹2,ˆÓÔÿXa÷d¡iSHá¬ubJAXî†qQw~Û»iæ¬ _©·˜¦¶"6‰ŒîQZQ%¼%[72VМ’@5mÑoÂ׳5qÖ‚K³C@u¸}X²ÚžSM ±Ã-ªC„û-ÊP«4H«Û¥ CuÒzç©­vˆW^ÅÆvd¨ògª.Xi¥­e KNn_rI '*ç ¯:EWEÒб*àôdI[—›Ø¶°‹Zm ḧYiÜ%(äryŒÏôƒ¦¬t¬Í8õêçi‰9¥±-pG™Z…´K͸HW} (0¡Ï0WîŒ!ßb©«®§¿ÈzLn¹ÈÄD9r‹½kK.í`%!ŽQWÝu'n:•×®Ô<ÊÌL6Ò‚‚ZiÐÀ}¶Û* JRàÂ’ ÜJ³úž ;oÔîwûíÍýA˜— rÂ\fÊðÈ 4„ã‰'nò{¬€DÛÊî„‘Ò.µN„²jÆ4Em]‘7ÝBëo©ÙleL…!M¯*()Ü @Ù“³gºód?*¥¾ÛJ[l%iIu@ ˆ“Ë$ãŸ:ºiøW½šá!oúãÑc ¤5ÅSe µ d”¡k Áo'Œë¤UͶJ„ÜÉ0—!•´™1ŠC¬•$€´Ã9d ƒÞ«>ò¢ÄÖº²T»Õ¥½3§›¼Y„g¥¥ÝBàˆ†K¤eäÅ*§„ ›-€´«qf K÷Ïû]ßE±h´\ FŸ"äüÉ‹·žu8¢› KHmÂ[8ã%'*« ¢øVÍuÒNêkõÂÛtNÙa1é '—a ZjÖáRˆïžu+¬´juCkƒ/Q^bY^ÕeÚ"è)³Ák,—€RNÒâF,s%ŠÒŠéA%ë}¬ºã®£lkº_›(l¸—¤ÆJ=奀ª+$—#w)í¨Óuwt7k(C‰C¯].i„¨à-Ç”•m[RJ‰RÒ1ß#h¦«âj)—ëÜÞ£!é0`¾ãEˆÎ:…¡e$6#k‹*Z’œòú’ÔõÞ #ǽ\ìï!Àâ$ÀS|@pF \BФO%$Œà÷À"J©Ö‘.—Wtt¡§!µhÔ²_„$‹š”ëO4Ô§BÐß%Ö˜»æô•RvßĉҲækwô¬{]¨L\Évø,;w)”© 6ë‰T†C$°Ã‰ae‚á));9àe¹Ñ[(bÆÅ·Zê‹[vYLŒ#ˆKÝ)î±Å}|XËÊ”%<6Œ 6¤ KIÐæ^ Uîv«Ô¤³Ö ­ ê¡«ZÞB\e d­(R’’÷œç'7tÙÑõþV¥Ó]“ofß-¹Óa?™&Ci\iNÇQK…*I- ¥'½V ¬ô¤—¤!̈Kz¼³&K²‚n)Œ8Nºó<¤–Yl÷n:¥¬È'håVjŠR” R” R” R” R” R” R” R” R” ˆÕÿ{·š=ýÃQ—]nSA•¹¸ åanH';Ot3È|5'«þ÷n4{û†¢/{ì·‚ç-Ü5§Þù)=Övžè|áþÐŒÔÊݧXW×3ó½ÔíR¿’»ÌŒ ³UgS+va\G\ÌwÎ÷SµJþJï200jÍ@¥)@¥)AHÓ“XÓ.¨z@x Àˆ‘ÂanœáG¼€N9wê÷Û%³âÜ|Û#Ô­yjŒÜ®˜5;n©ä ²ÓËl÷•ð¤ƒæ«wa¢xkœ_õêêÊBW¶KgŸù¶G©NÙ-ŸãæÙ¥CEµÇz+O8›¬u­JeË“¥m’2R­®äwŽ €šôì4O qó‹þ½EJöÉlø·6Èõ)Û%³âÜ|Û#Ô¨®ÃDð×8¿ëÓ°Ñ<5ÇÎ/úô½²[>-ÇͲ=JvÉlø·6Èõ*V¸âR º© B”^'v ‚}óvNIw'$rϧa¢xkœ_õè%{d¶|[›dz”í’Ùñn>m‘êTWa¢xkœ_õéØhžãçýz ^Ù-ŸãæÙ¥;d¶|[›dz•Øhžãçýzv'†¸ùÅÿ^‚W¶KgŸù¶G©NÙ-ŸãæÙ¥Ev'†¸ùÅÿ^†‰á®>q× •í’Ùñn>m‘êS¶KgŸù¶G©Q]†‰á®>q×§a¢xkœ_õè%{d¶|[›dz•Wé"í}²ÒÌq,,_-êÃDð×8¿ëÕ]@b,+[9-DÞ 'ÊuÁþ²ßÀ¥Ÿç«§0“†n§ºO±ô#«ïv·ú¼û| Ĩ®ìJ¸n¶§Ô…a@ƒ…pA†¨×‹¯J¶÷-qY5çzj,d­E^H…9ç’ AˆÜÌu¬/ p|)kéæ MÓ­÷cI‹"DÖ_ŽúR´:…>èR“Ȥ‚A‘¥ä5o’ôg¤7çbº^Ž·•)•”)h'íU±kNG<)C¼MEièg|µh j×w«[·«´»\æ£C‚”²ÕÁÔ•‡c/dc4Û'† Vžòª¡«úCév×n¹\“.;t]uK1'XRÔ˜±®#;'-9 KRŠ{ Z«»½/ú'@ê ‰™~Ò:fí%(KÓmÌ>´¤©K) ZIÆå©Xü*'¾MHK²i©pzŒ«E¡øœWÞà;µ7½àày{HÆçÎ…úƒ‹Îw³ÎsÁòAteÛý¡ÙþÜÿø\Ø{ÿŸw ±ÿîÝÄÿË·ýª¹Ô˜Ó:CKõŽÖtýŠÉÖvõŽÇCj?nvîØìnV3ÞÉü55Æg£Ê÷‹ä+Të|9L\Üv{¼&UÙ"Ki9HË«i K)î‡táHÆNp“Šþ™‘wc¥=Sd›}›s€Ý¶ßpˆÔ–˜OTSïÎJÛAi´ %†ÀÞV®Gº95pã3áQå ¯ÂÑÚ¢V£‡¥täkÒqå\Z·²‰%nd-eÐÛ•¹Y9ÉÜsß ±Ò¾8ÌøTyBœf|*<¡A÷Q‘ïŸÔRl(bæ%Æh:·¶HDbÞH¤V®ìw)Y<•˹V$8ÌøTyBœf|*<¡AOébïv¶Â²B´K~·k †¹1ÐÊŸm";ïµÇ÷ ãŠe $¹Ü‚àÍjéý"k%Y.“¾”/NZåLJÙeÝLÌœÂTè_0ÚÓ ”áŒ+|´„Ž[ÖóÍz¶»m¼Cr‚ðØÒÚC­/#rT<À<ÅaÉÓšNOc:ÍŠÈ÷bˆ6î$F•ÔñŒp²=ïkŽð¤[ž Ç;ó–5ýÚUƒBj ìé‘.Ûl“-†T -¶”´¤ãŸ2­Lþ®Ö.ÃJ£SM¸u·á]S”€óW m:¿¾˜Lð‹ƒ KNþ}íà]d‚ {à¨T:OE3c“bgMiöí2œâH‚ˆ,ˆï/ î[a;Tr2>OÂþyϳ¢Ë¼ëÞŒfeÊJ%ÉjdØfR$¦<§XCØO!½-¥|¹w\°1ZÂýÒ&®´»q¿35S&Þ¡5g[ p[˜š¶”’Ÿâ •/yØS-yŽ[ºp Ãf&ãFŒÂm2ÈJÚ@ÀJR9À+ ›6œfù"úͦÔÝÚKa§ç";bC¨ÂTà”9Dã¤îDÒŠŸE×{ÓúŽ÷bºß¾5)¬Ìy¨èY/®J GW2–uîÂ^\ûÐ1jÝIf¼^»tr V>‹ÂC,-3ÜR¤å·K½ß1Ûo á{ä ç–ȰYôöŸŠäK ®×iŽã…Õµ ;l!K=õ€'Ÿ~¿.Öm;w— eÖÕjŸ&œXoIŽÛ«Ž¾]ÓjP%æ1ÞfÚ¬Æ(×VêI= A2.Ž9ã¨.6u[ ,£·2ÊB“ïüOä­)egaL´m­=,]îÖØVHV‰oÂvít×&:Sí¤G}à–¸þôqL¡¤—;\©æ,Úu‹ë÷ö-V¦®ò ==ÛL‡P1„©À7Èr'àíyƒf½[]¶Þ!À¹Axìim!Ö—ƒ‘¹*`b¦ÐÖóÎs g§¯úš\½ q{SÉ}‰×ëŽldGŽ#Mn3w"ܬ†ø‰qf+*îŽòyÖÛªµÛBtywTe]´n–¸*,tÆŽe[t²ÊI)m’v p‘ÈdÕ›ŒÏ…G”))ºWÇŸ (SŒÏ…G”(>é_f|*<¡N3>P û¥|q™ð¨ò…8ÌøTyBƒY¢KQ:A±Èx8[A½ç†ÒœW9-ŽIH$÷þWŽÙ-ŸãæÙ¥P_i¹:âÊÒÔàBë›n) ÿZlòRH#ýÆ­=†‰á®>q׫8„JöÉlø·6Èõ)Û%³âÜ|Û#Ô¨®ÃDð×8¿ëÓ°Ñ<5ÇÎ/úõ+Û%³âÜ|Û#Ô§l–Ï‹qólR¢» Ã\|âÿ¯^¬Ø¡-$—®]ÿ¿ëÐHvÉlø·6Èõ+Cý‘A]¬!jBÐn{© IIÚ¹ñT’Aæ28<ësK´Z¢FrL™—™lnZÕqy«á­'ÓëÊFÆq\õy©Hߪ&"X±?7PÙ„™¯¢5ÂFå$H”´v¬8]ÛÉ#+X´I½ê“Óĸڶ-êˤ߰ݚh‹£ CDV™ê[o‡¾íÁ¿ [iq­ aÕ&ù/¤Íi®ÝTY uŽ;Pd8Û nR ßRPC) I.”`¡@àƒŒ«fºÓ÷)F`&õ#±}dIu9¼%*;…·PÓœ-,-*NÆÊ”¢“´³Ò%_ûõš÷£åöj†oÎÛ®÷&Š×¯>Ü~ÈIK‹RÔ²’ÊS±J'r@ ‘UŽž/w;v¤šÛW©¶é Øþ›a™îGn;¤nB[@ĵîD$pWÈ!å«àç¶´½úÙ©lÍÝí¼äGu^Œäw¶œSN!Mº”­*JФ E`êmi¦´Ôøðo7G}äq0˜îº–›ÜÄuHIK-î8ÞáJsž|HÌKOM»ÝtÖ«Ô‰ÒºÎ.¸½ËEä¦ß|·ß³¸”?!”ºÁ’ë(q Fi•eI9P>6-Ej^‘½4æ¡ykŒä"íÑÝ0Á˜¥‡½íɉlõ'J”¶ÙBFâÊJ° +rÙu¶ž»Ï¸D„íÃåHD™OÚä±*aÂÓÁ2\m,¬¥iP!+?j£ÞŒ:MÑïÚû&Ô›ª¢-ÖÚŽça&ÿ,S‰Z’#dw-­^ô„Œœ V’øè>tÛ—F6¹“åÈ–úÜ’¯,¸T„Èu( póu!.žn$%d¢+UÞuñ­Cy5 á:oH4—$¹ lL1]Da´£€¦ÜVòÒOáß¶K¤ Õ­›µðüWؽ¥$JT•%@¨(R@ ‚TÝ!hö.ómÞRÃÐPòŸqÖDqÁF÷R)á©hNT¤%EIä jÌýM3hùÃ@ÆÕ3¦QoS“lëöÔ>¦µ”§íéÞÌÂèvê¡ÆŠJÑZ’¤²‘ò±•~ÔÓZèÎÑ=®bo*bYŠÔR{ –òZ\FBquVѵ!ÕŽ"ÒˆItÖëGIú1Q\{¯\ãn´×UrÑ-ÜS©Z›áÇ-\ KNR’mg=ÉÇÇ¥MÖÍÑù•ÛÝl¯­1`žûMáÅ4¤8¶Ù!µ‡¤”,…9‘Z‰»4´-7å@MŽz®“:”Ã*OZTn [NõñR¤–ðœá@§c5¤,úû@7Ðü•^:D“"-¿PÏŒž¥©f>…N–!²¹<^ JÚBT•©Äå-‚W°*·´ù-ƒ"cÉyM0ÒZYeo8BFHJ –®\’I<€&«íëÍ2æ˜cQ·&ràÈ’äF›d“%o¶µ¡Æ„~zTÓ€§fFÂ{Ã5•híU¨eDèæÏ5tÔË»‘$;qucªRGYw„˜Èm;¬†ÓïJCŽTÊsöäÖÍ·ÙÚ{¦÷µ\õcZb®MÑ·/³Œì¹Dð™ -Õ4†ÃŽ% 'ˆÉ¬®ëÍ$ÕžÓwvòÒ!Þ'·m€¥6°§¥-ÂØgfÝÉXXRTÒ•nÆ z[µ®›¸j,1':¹¨yÆTG’ÃŽ·ž#M¾¤œq;U¹ QPÚ¬´âÖ³HJR¯²Fu²ÙÐõþtíBõŠ[d¹j}›»–÷š˜î–[J›Z ª$;‚ˆûSŽTŽ–µ¼Wµ${”{Ò.zLZüíZ©ËqºI㼇ÑÈÝÔ§i)d-#.œã“Yj{F±¹{¾®kPÉyØÐ•ÂHJ”¥¬2…” %$•¨ŽY#"¼5>²°iÉÑà\_˜äé-©Ö¢@·Èšùm$²ÛZÂA n œf¦ðÖÒÕvk”ëŸIýˆ‘|¹®ã*ñs‡w·5v}=°"XaÀÂp# "‘!²µ<±‘Žw… €Íöýãy‘i¹O-Úš¸]¤Î ŒÆ[¥O¸²8®8(-~ ›{¤ÍÞm­ûÊYz Sî:ÈŽ8(ÞêCÅ<5- Ê”„¨© ƒYÚ_TYµ*6§¥ÇÚ]fT'¢º”«;Ãy ^ÅaXV6§àÕŒ}9)9ŸŸ!Fé[Ré}5Òf‡•sÖlÙ¥¹9ÆçE‘TvœRã‘”àh§Ž–ÀuHÎà”îäS.w{Ó}!]-Ö®-Î<·®Æáqfúì–ìñSAk¬ÄPêñ utîݽ{UœeU¹5N¶ÓzfXzšû áÜZ!>óqÚ$€ãÎ6…%”e*îœ)ÉçÈ×ÀךLßeYUwKr¢ñx«q—Ææ“½Ô%õ$4¥¡<Ô„¨© @Á©ùXhÈWÉïZ.„ë{L=;\™/ki†%Åòܾ±›¢ÒIÀŒéKA@úëst+6ëqèÚÛ2ð_Sî;$²§ÊÊ×HtGQ.µeÑܱ¹YÉæM}Æé+Gɶ9=‰ó\Kn¶×Zåu•©Ä•£d~iRR¥%II%DÅ‚Áx·_­,Ým2D˜¯bB’¢…%IP J’¤©%$ €EjY†œSiɽ-ʵXú@œÛð—?³¡ËïjÃÿ&‰•el«k…Ä5È2RKŠ*žuDáâ–u06tÝ-í¸¶5”©àÔ²èr£åHh©)F¤²‘ÉåmßNtƒ¤š»¿k~æë2^JœzíÇR™J”êPúZ”,©)Q !Yc“4wVuåNž‡y¶z¢í2Ó-jp-MìŽZâ¬(4á) †Ös„œgnwçý]ùÙª,šÊÃk]oúü¸=ršÔÆçjGË–àÝÈ4µ6·BkІRÜ¥£s›[$‚vó¨ß‹O\¤Î¸ªÙ¨Ž¸üÔ¬$Æ@A*t#*ÉrïUuþ“´S0£Í]ÕóæÔêE¾J‘ qM©RlõpÚÒK»0P {ǹòã@ƒ"tÇ’Ìhí)לWyH%J?Ì&¬¤4.˜¿ikΖÕ÷øš¢ósÓ0è#k .\”ø'rÖÓüV„…-´!…¯¾ÞJ£«ä^ôJlÖ]Swº\aÀ°5 ´5d¨nsœyã%¶F^”âi-²VÕŒžõnºHÒÏE}ö õåGq´=­?=r[”,°.†ÕÃ^Û°”ã9åX’:ZÑLY#^ÖõøÛ$´]D¶ôÝÅm$TÖ¤°B½mVÚœaI%¿9ËQvç9z£íövžé½çmW=@˜Ö˜«“tmËìÇ£;.Q<&C uM$!°ã… H â2F©~˜¥Å‡£øÒ#¬ =zvÒǸv[HRÙN2AÊ’„änç˜Î»ÓÎêÆt±ìÃ7Ýy¦"É1–]-W±õ´PAå‚r3)¨ï¶Ý=.nHqÐÓHÙº² Ú†ÚJ–£„¨àÈðTØsÅÇY[†„±ÅŸÒ Ûv°Gc/QQ!¶%¾„KujZD¶’R‚àZŸKiVÄîY·éÊé ö$êK«7tº³w†Ìç\T;b–Xy1 J"òASŠy`ç;&OIÚ&<6&9v|Æy¥<§‘o´GBV¦Ô§Ô–ÈŽд’îÌ(`ã%ît{7y¶·ï)eè(yO¸ë"8à£{©ðÔ´'*R¢¤€r ]ëóçömO’™ÐÙûëS°‹²'Ûã¢`F¿½zЇÆâÌx%eõ;™ÚØ#íÈn¡t¾¨³jT>mOJ+´ºÌ¨OEu)Vv+†ò½ŠÂ°¬m;N Á©ªJAJR¢”¥(¥(¥(¥(¥(¥(¥(¥("5ÞíÃæpÖ¸‰’â «%´ôe ¤« …sñŠÏÕ‰+ÓóÒ‘•®€?pj!Ë:.qFp§BHüàó˜ÐGjæÔÕ‘¶ÖêRY ÕŒ«ù+ÜÎ*ÅU}Wp…2 š‰)™ KV Ú‚¶§«:2qÞæEZ(¥(¥(5¯ƒ&å­µL(‘zË®!ᢒ‘-²¢­¼ÂBA$Žðü?¦ô"ãjw+ŒCQ#*S¬[ã8Ì718|-ÈH î,©Âœä>­k=KKt‰¨n@-¸ÜFe½™C‡íšB”~Ôò#ÏÈTg»ŸøˆóíÇØVæ%‹/F §ÐÄöí¯\Ñ"ØQ% ^Pà DjB­ §zYx`cpRwcàüԽΒ§š´®ÄÏqøöÀ[m€…ÇaÂØyR\mÕ?éI ‘Uv-?ñçÛ°§»ŸøˆóíÇØVzej¸Úôeæßª¡_‡lyذPÒÝ™;¬<ó‰‹Ã8cµ•ã+B°¡¸–ò²mçAµq¸]î±s%Þ!ÊaõŒÚ#!æ÷”•¥§“ÉAIþ »ŸøˆóíÇØSÝ‹OüDyöãì*ÒQvíLkÅÁË{6¦m޵)¨qr´!Ž2 à„¤ ¸r3ËÂHæ¤à‚IM¯IÚäY틇)äÉw޵ªVIrNNBÜÏyxäq˹Ú0”éïv-?ñçÛ°§»ŸøˆóíÇØTé’­ñJÐþìZâ#Ï·aOv-?ñçÛ°§L•oŠV‡÷bÓÿ}¸û {±iÿˆ>Ü}…:d«|R´?»ŸøˆóíÇØSÝ‹OüDyöãì)Ó%[â•¡ýØ´ÿÄGŸn>žìZâ#Ï·aN™*ßXéîm«úòßûÂ+W{±iÿˆ>Ü}…{Á×¶½S> ¾Rnãã‹”©„¶GÚºÒR>Øs?ÍÌÖ´Åà™m6.Q,ÚVçx¸8[‡ÉÒd,$¨¥´<ê”p9ž@ò;¤qGÏÕèÍLa@dÉy)êe]X!kSÉ=cb’Pħ¸çV;[.ȰÍa‰3®H˜„<[Q}Àµ\Ž<F©Ðú0usYÚߺZã»©íª€®ÅÚ:¤hùmÔq¸²v¿j~Yë<[Œé»ø{1Öe;#f2~׋·?Üàgbƒásƒ]º,·øo\¤˜±±GˆèiÇŠrpÓ‡'¹Ç|€kW^m–{ª¢Þ­W{d?嫌–› uúÛ"ô]iM:,¡0Ê™IZ]Å÷Âà(¸w§qs `—óøçì¾i‹ÔMCdfë ¶ÛŠqµ4ú6¸Ó­M¸ÚÆH JФœ2 ê»#¤« [Œ¦¦Æ¹E·0ä¦EÕÆ“Õ]v2·ÛI +Ü„´ï2€“ÃX‘Sš2ÇÚîŸjØ©j˜ñyù2$q^}å¼ê‚Fv‚·““ߪlþ‰£\gNf}Õ ²ÈvsèŒÔ ‰)r[rPà\Ç{ië’”„lK§™Å'r)j­ZGU1¨_—V«¥¢tFÚyÈ—З8Nîá¸6-iÚ­‹ÎàPA׿³Ö6}(õ‹—Xqû½Á˜YŽ€µîuÄ7ÄP$mm*qJø7$s*âè]'.Ãp¸Ý.—H·„æ™ak‹Dh6ÚÞpkËŠrCËZóÝ÷…bt‹Ñ­YÍr’ýÂÉ…ÅH“á% XfR$)½º„åEãrNÕhN,æÉºJÓ«›»ê)ËeŠï*Y.E‘v”DmæÁÞŽéÀêð¡°”6 ÈžD>’uůAÚàÜ.±ßy¹³D6ƒoÇd%e§Êœëm¥;ZW}Y$€&¡,Ý1kéš4Ø-´ÜÙsB[·l˜ê¤qJÚvO»d-å--ìPIÉÇ;–¢bù" [Ó÷l <@Väè –ÙFR‡š ç÷€Fr&ÐNP2uì~-º-¯OÞ/w °pT8 Š£•œ%N:·’Ï5$mq[ŠS3W Ô>„bÉ„Û,Ý¡ G[2¥HµmJüŽ,<8‘Ä®KÁ*îö£²vý”¥”¥”¥7ßŃó^¿yn¯ªu½â=‚U¶ï(Ëí»/¸ÏÛMe#»m*Xæ~åš®û±iÿˆ>Ü}…jb±ß­îŧþ"<ûqö÷bÓÿ}¸û 2U¾)"k!*D‚¬n B2·{ÉHøTÿ«5¡ýØ´ÿÄGŸn>¾Òîš[¸¶RÚÏ F÷p%8<Y§L•n O‘= ät̸6x©‡¼ðB†§V±ßÇó¨¤DéþŸâts)yÎ+»€Zö„î=“ÈgðQ¾—tÓEe¶AqekÛ{¸ Ê=ò}ã™þz«t¥¯lÚŸO±LHêb;´ÓO>òS°â‰SŒ£è”I$’MXŠ CJR²¥m®‚~éX?­^þØ•©kmt÷JÁýj÷öÄ«§).Ã¥)QJˆÖ¶Dê]{Ó‹}QÓu·È„^HÉl:Ú‘¸‡³Rõ­oiÓZ6÷¨Ö¤&Õo~jšIÁp4Ú—´ƒ;qRpºk[5¬Ž5”낵4ÕY›½2ì~ &n²ø¶†ç¡Âdì²¥vE × ´¤9aÎèŸT®×q†ÄÛJרàI‰xY”ûI†_“9å-„¥$H ’æÁ–Ú_"03$t‡¬`ܦf¢Îåéçcðf³k•Àiµ·9nyuå'±Ï(x© ÎRͬµ\»†zB쨅t¼Ï±\c7 ÒïXˆ‰ûŸiâîÚ• 8mM¨€£ÝžU«×™ÚœÏ?•ª-Šc!ÌÔ×[,ÀD SHQ*i WBÕRÔ–“žå”œåD n’ôõÊý Ôý¡QÌë\ó-¶_”ìd>èëG VÑÙ!jJÒ JOóÓN]¯ëéRi˼›d˜à¸@\XkaÄ"CÓÃt©Õ‡‘=ÚB*=ÈåN’õ Êà ÔÅ¡1Äë¤ó·ŸŠì”0é _¢éÙa(I©I;Q®üÙG»hŽ‘§âé–™Ó— §eͽÇ7gá.Sòe:úã¦3§«.Ó«XävŒ…Jö•xg¤Ùí:SGØ—ùr ðf¸™²ãn¥ Ë)ŒÚJÖ—T¯!HÏ2pnúÿXÇÑMê&›D†dJ·ö5Qßyû¼øòžŽYµc†YÜ’C¸ ;€*2O¯‘¬¥Ù54Xvvn2'EÓ¯Hu—V‚âã©n·5J^c´\Sji‚HP yß“)®‰ízªËhŸoÔÐ,±·Ü¦NŽ»uÉÙ;ºÔ·ä) a­»8©H#vì„÷ª¥-~Ôw[¢í &-úÊ›4õI”óKŠ„õ”ñ[Ci)|ì˜ï½¬¥;’Ú³”ŒKôewÕ7iú»ôë4øVé 9Vûs±Î!?Ê2•¾îBV®AÓn;ÕÒŽ½¾é˭шðÃeMæzdFyÕÊBºÊ¸M­µ°vC{ß Nå6œeC23 ´ótf¦è¶f¢¾]Í‹Ké8Ó¸±&ãiynLº"K4:Â-$wN¥ã•¸w¶=õWÃ: Xö2csàÛ®!R#9º¾â‘ÆÐò\”Ô°Ï¥,8„pP„¤+ îˆ2¶O¯‘¬¥Ù54Xvvn2'EÓ¯Hu—V‚âã©n·5J^c´\Sji‚HP yÅ\µoI14F¾¿µvÒR“¥øÊŒø±HCs hërC{:á#ml,(áMº "/>âùцšIh¨vIr›“).È“!Æ÷lâ¾û¬'y*) p€TI yÕçÑŽ¥™*dN´³lD˥§ãî)éLHmÈ«O% žñ* %Ä¡´¨‘ÁZŽOHúµ7G݃hp‰&uÎÙl·¡‡›©˜PU!Já,8¸§bR€ãJ$îÌÞ«¦¶§~sð†g¢\!¼á6ä8%Au1¨ç<ë©a¹V.*k¬ÇÜ_A l…¤ruum°h;ÓgJiûœ˜ ƒn¹½r¹!§V²òƒÎ= ¥$v¸¶Ö·W…-L…JÕŠÜN”õC’`S1MÝ×bð¦=§gEC(u™¯,KY}Õ%0 Ú¡Ä.#cœ…ÏXk÷ô­¶íg¦#Ï“trÇØù—äu™Lv;®¶âd£c[[»JR”+ºUo¬~¼ü3·ÓíÏËkOT¤A¸,²ü´´¢ÃO:ZmkÇr•,%E)'¨%Dx=êÕö»?K–½ p´Û!iwI‰s//¸”3*T‰ºâ8¨BIJÒ®éD +hOL¥Áˆ/2ĵ4 Ã¯4]m Çr¥ )%I¤)$ŽYú¢Ùuª¸tríÙ릙·Ü!Ý.1'\%EuÛf$¹ ƒòñHtç;pf­ºóS#¤ÈÚzólLhw ¬«|f{%²„4ÓÏ5#­©E—Èc<4$oœ¤ç[›,}/Úoú‡£«ÞœÓ‘­K»Á~޵Ϙ¸í°‡™Z €¡§ Ô’¤÷H#=ÐÇ:v³Ðúêÿv튰,×¹vÆà:bj hnÞ¶^}m>‚†QÖòÉeÔ¡HW~®=/ݯú{£«Þ£Ó’mŒË´A~à´O†¹ ¾†YZË`!ÖÊ¢”÷yP=ÉÏ*ïI} \,zõøS­öxÑ­­Ü'\çYå\[m.¸ê ZH qa)Ê)ƒiç9³ îŽ/«»ºÌ†,·${…Ê癟J¦®[sVy¾›iÏx)ÔoR’–ÁGrMôQ¢®Znëz¼Ýx =qf,V¡³t•q 2ÁyỈ 8µ>¾[R”„¤ß5›j»ê•kW§d½f™Ôí±.¢ÜWcmëÌBZ}EÇ7ã«#+JSÊî{°ú(ÖGu¾[n¼{ˆËmôÚdÚÜW‰”*,•@O aÓ„¯r€BªÁ2óéfÇ®u–-¨–9ZYÖí8ÒnïB~b‰9eJDgpÁN7”©Y#!9 ¯Þº(¾^\Ÿe•> '$Ýe±-¹.J—9©¨Ø¦ £a¸çp5tei´8ï–-«Œû’nÒû­¡†R:Ö–Òv¨:¦Ê–•ÃQ6ûUÓU=®5^™“>Ê®«m‰:Ó!»k©àu‡f!(}%óÆÙÕIIkvUÉ<±g2D°º(ÑW-7u½^n¼¸³+PÙºJ¸†`¼¤æDZŠŸ_-©JBRïšØJèÊïªnÓõwéÖið­Ó„r­öçbœB”e+}Ü„­\<‚;¦ÜwªëI R•”¥”¥”¥”¥”¥”¥”¥”¥v¡û•'ú?»Tººj¹R sûµK ð¸ýΙóIà®®5N¸ýΙóIà®®4 R” R”ÍöJ}Þ¼|âßþŠÒÕº~ÉO»×œ[ÿÀ‘ZZ®¬¤¥*)JRJRJRJRJRJRW®„~ýYþ–'ïѪ‹W®„~ýYþ–'ïѪéÌ$áØÚF;+³­kFI›/''ñ‡*[ªGð¬Ô>œ‰~—“tfeD“"k/°óamº…>èR“ÉI AäA­1К^Õö=ë('£–MÒá:úݹˆzeO¾§„™Â-4¥!)m`6éÂP•§ C1[ÿªGð¬ÓªGð¬Ö§¿èM¨dôw.ÙÑͰÚÚ»¾ËÍHÓ=X±Cž­Ž2ëISm J€RBJÖ• •bîÜWC½ è„Øõ2¯’ûhêÍ ?7„÷D×ZØÿ „­èZ p¾è¨’@ ÝR?ƒýfR?ƒýfµ×AvûtÌv>Õe¿¿±Ú ^œßŽ&7u…>2q·í2söâ¶e‡TàÿY§TàÿYªoH¶Þæê]2þ‘½Û Û˜œ¥ODˆ<@겓½Í²Zâµ½L€ÐNBö¹¸„Õ?…§Ûé¤Hû¢±F¾XšŽýÂۥ洘ڮ*’ò\C\wk­¯'ˆJB Î%c-ÅÕ#ø?ÖiÕ#ø?Ök›¡iU›EÑR`¹O"\#:gTŸ%¶åñ”õ­*.–Ô—YË‹( q¤öRÊôƒÐ­v@í¦öþ¿J³[ÜÒÈ— ¶Ñ:SК[Êai†R—R•Hl¶”£â§6ŒÕÒ}R?ƒýfR?ƒýf½êg¶ô†×K7k…Â÷lwJ¹2cÇD¢C’ÉBI’ ‡RÁqÒÞ„ÔU˪Gð¬ÓªGð¬Õ§ϰÚR«{—@åÖ*`®j\g«¾–Êã6w¾Úd*:ÔÚyƒZŽñ¦o벟Óww_v×%½ •[Þ}Ë[Ê™5QÆôŸäN%§-§ˆæC o‘ï"üðM£Ý)Õ#ø?ÖiÕ#ø?Öj/¤÷yzPEÓî)»ÃÖ¹-ÀZW´¦AiA²ÀwδIÓËS2µi+„MÖá¶·tü€—\KS–¸$ñ$­Ëo§“Å•¨rï? OåÑ]R?ƒýfR?ƒýf«Ä™@C2,˜if.$i ‡ˆ©Nª3jIæ’– IÚy§=êÔ—;ªžÔ7žÁZnµräÞ–íÛ©8Ðv+ŒLÓ× áº§-á-'›jaÅÿ$Ú¤Ehè.©Áþ³N©Áþ³ZÓ ûkp¯ç­v=>ìhhb+ö×`fRW ¼® ‡qW QP·G'Ú”?š'ì´.æ[ûónÝL¦3¨±H˜éVãµ1e!|;{ú%çGtƒ’Ej—£5µ[‡ªGð¬ÓªGð¬Ö³ÑŽXíý:ê¤Z´ÕÎÚÕÖ 6Ü’Þ›•4©¬½=r[ü¶¥¸Ñâ•aÍÉ Rfý’0m—>‡¯ðgi篲߃%»S Ú¸8ÜÕGt2âRÚZP$€éÚOÛ óʯýR?ƒýfR?ƒýfµ>º»é¹:ç@êØú[P=:,ç\‘poG\%˜FöCkPÄJxëAá}ÒW·i ­¿AáÕ#ø?ÖiÕ#ø?ÖkÞ”R?ƒýfR?ƒýf½éAáÕ#ø?ÖiÕ#ø?ÖkÞ”ÝöC2R9n@yÆ5stoÙ÷¶¯Ïsÿ2\åVqR”¨¥)J)J)Jm®‚~éX?­^þØ•©kmt÷JÁýj÷öÄ«§).Ã¥)QJò—‰q^‰)–ߎòÛ­8¤­*) ÷Á¯Z„é=Þ^ƒÔtûŠnðõ®Kp•í)ZPlƒðÄs©« §0Šc£MÅ¥ëkvÙ\7]iâò®RU% hÖÉÎ+a…¥€N|çô_£¦"Öƒñ¤â !_gEK*!À§iä‚ꃮ…8rµ¨kQ<µ3!ÛV’¸DÑ]n›kwOÈ uĵ<)k‚O@JܶñJyö”á$¤`r¯¦Ò÷-4„˜“QeÊ÷Çs’Áx9¿ˆ[n%n¥|E•¨…’ çZãNé;-¿¥iØ,÷ ”kÌ»“zœÞ4³l²–.º´·-Q›T„)þ $¶sÞH5ûiКn‚Õz…]Yä½tš©6Ý>»a) …1 )•¹n)E  >½Äš“‚‚Élgµ³nˆä×YgvÕLšô§NTTw:ò”µs'QÀÀ …VÒ¦õ.ð˜›,;½lÏØmn£cŽ´”¬%—TžEÖÂWÿš½ú8Òñ4^†´iˆA®á Sm†Òã„•8°‘É;–¥+ÎiÉšr{ú¶ä$[ï.NM¼*ïz…k|¼«cŒÌ ä'"AÈ6h[ 89ä›LÓÉ‹ømVú7ÑèµÉ·ö:RÄ™(”ì§.RW5O au¥8_ Hä_ H‰©;~’ÓÖñgLKrZ`ïPUÑpâÈ'ºZVV¬«»_>éY竎™lôaÒ iz=s­²íˆ§¢ÄÑ2cnº&<°d· ‡ed8Ê …„eIïŒìuwÓruÎÕ±ô¶ ztYι"àÞŽ¸*K0Œ9ì†Ö¡ˆ”ñÖƒÂ<û¤¯nÒVRf|fæÁ‘ å<–ŸiM-L¼¶\C¥h!HW>JI`ƒT“шU•Ë2ؾ¹É©ž[^¤¸¨‰n/ˆ•÷$•ºµ«nQ VJRE¾ü˜ ±ÏMÒ]€c8%FꪓÆkiÞŽR¢æS‘°$•gâ´…žnœ…Ðü›L®õÖ<=C=pì‹Òóšc†üénFRš,`°PQ áå§~ÄÔVΗÑΘ˜ÄhóÍöthíðÄyz‚{ì¼ê^mo½ÍGý W ”ýªRt§áêeêD±6MÑEÂÛÓ.2%üC•†PêÔ–Aïa°‘Ž]îU©‡Gv-A£4u–f•‹t•.c†eÎfŸq‡-ð[ä…Æo¬ :Ë{”#´•`ðÖVž@š·ÛôE‰Î›ÞÔ°ô…¶×؈«Wd¶¡—gΔIuÂàH.ll`«$HX<Òqyöä"㬴ţWØÜ²_Q5Ød<ÔiïÅ⤥IRYZ ÐR¢ JO,ƒQSú7ÒWqâOs–Û-)…ï3\†”²²Ô…—J¤7•+t­ •Cý’0m—>‡¯ðgi篲߃%»S Ú¸8ÜÕGt2âRÚZP$€éÚOÛ ó¤t´™ºƒRGÔLiEjKOb‹Mªó¥¦HC²ÃïЦ”"-iÂ_}BA# “Sx]¥´GGz_¶)×õ·xzmÁµ³,=|šã/4®'½©•:Zá§ŒîÔmÚ‚²RjCKé;&šv[ö¶eõ‰D‰sŸ–ó‰Fí‰.<µ«jw« ÎãÌÖ²áiöúEé¾Ç¨¬Q¯–&£¿p¶éy­f6«Š¤¼—Æ×ÚëE+É₳Yÿcý¢}¶å¨]nÞˆ6'†Ô45arÌÛÏ£Œ_xDuJZJ’¶V¬”X‘¹+ާÐoQê÷û’níÜ£Æ1Z~ êd"–ŠŠŠpèÉæq“žðÇÒ´•7©w„ÀÔÙaÝëf|†Ãkuu¤¥a,º¤ò.¶¿üÕAû X´Ü.qíi[¬‹¤¨a(Ô-X¦ÏE¡­êîã˜í¯l¬ä§;É+VR¨¨¶7Òò.újt‡Ótº½~”«3Ï"m¥mK 2]I”‚•ÁJc!%IS.r;©ýIÃ`މôgk³´ñF U®àêÝ—Z–⤺WÄ.KùÚáy´ç '* l²[#YílÛ¢95ÖYݵS&½)Ó•μ¥-\ÉÆTp0´æ”`‘ÐÅæÐ¾Žºv&ër•k²]4»Ì²Kó¥* ²”„ðÜNJ½!GvÞõmŽ4¼M¡­bk‡8BÔÛa´¸á%N,$rNå©JÀä3A£m'õr»³êº8ó³ÚUêb£HS¨(^ö ¥¢6œ· ÀÛ££ÕÝmP®.:ëͼe¹x–¹h[ail¢Atº€ë ¬Xÿhç_¿ÉrénRáèËõ¬A\þ»5I¨“}Z˜u*i2¶%¡n*AS£+Ca $ª±L6¸£.ØôKX›ØÌEÐ3Ónšê”mÛVKªzT§ŠÂ Ç<£ºlnÝ+èÏF­˜Qœ5Èpù· wYJŠâ¸ªt­Ö œ7–\Z”VâT¢{äàU¢é =ÊÙ*Ý,8cÊel:uM¨¡I)8ZRN æ’ï‚ sn¥Ów•ôoi‰+MKrÿÕå*NŸ~Kì´¹n®3ŸmÅ7ly ) ­iPN[!²+¢õ£'O\•6<¹1DGKÌÄBÔûˆØw%°ßvVF@ s«©!hèßIZ´ä95ÍËD”6Ûå^fIh!³”¡×U±¼¤§C’«'UhM/©çuÛÔžyLÎð¦¾Â$2Ty ­)y¼©GcIî•Ë™­I¦- †–Õ÷ÑzÊ‘vÍ%7K¾Ó-È@y :C쥵>át‡VÐ)m NåÝýѸÓöKVžÒÌ?6ûĈP0óìG”§W\bZJX‚áuÅ-d’v¥HÂr‹É³xAÑš~¦^¤KdÝ\-½2ã"PÄ9Xe­Idö åÞåYºŽÅnÔQä™;p:ÚãKv3­¬7!Æ”•¤áJˆäHøk_èÇ,vþuR-ZjçmjënIoMÊTÖ^ž¹-þ [RŠ\hñJ°æä„©F¬1D‰3GðeÛS=e)vÌõÕ„éØŒ­+yÊ@”…vò•W“Ýh•Ƀ%¨—hoÁޏÑ܃~IBÜS®d´òJ”µ¨©KVT£Œ“RP4.Ÿƒ«ßÕ‘Õzì´Œ‡Våòk-9p„TékbK®£nÔ“Z.ãlŒt%NÝ4Uù¹ä_§çKMš9–ùBã!––¦)!MµÜ©´pÒâÎÄ…Z$GÓW–å8­u·D€¹æé-í39õß÷0ê\d¸SnE”R…)EÅ¥´¶€6ï²Éa´[ìV¦mv¸üŒ• ­K$©EJQR‰R”T¥(’I$’k:µÏØþô&´|»,+5ÎÎÔ+½ÉÖcJ²È·¶ˆïÜ$»4m )á¨ÎÀ@PIÀ­QJR” R” R” R” R” R” R” R” R”Ú‡îTŸèþíRêé¨~åIþÏîÕ.ƒÂã÷:gÍ$‚º¸Õ:ã÷:gÍ$‚º¸Ð)JP)JPs7Ù)÷zñó‹ø+KVéû%>ï^>qoÿEijº²R”¨¥)J)J)J)J)J)J^ºûõgúXŸ¿Fª-^ºûõgúXŸ¿F«§0“‡eè︊ùì¿Þ\©Š‡ÑßqóÙ¼¹S¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)AÍÿdGÞÚ¿=ÏüÊ=s•toÙ÷¶¯Ïsÿ2\åVqR”¨¥)J)J)Jm®‚~éX?­^þØ•©kmt÷JÁýj÷öÄ«§).Ã¥)QJż\aÚ-.׃¡G\‰HChIR•ËðMeTv§³ÄÔ:jé`žV"\á½ òƒ…pÜAB°jN,±JÝSGIöòÒ˜{Mê(÷‚ìvãÙÝe‘.O.-¥#ßxa%,>Nõ¤§„½Á$`äÛºCƒ:á§£³b½&5õ÷¢35İ–£ËeìgSÅâ‡Õ]¥ F@G5_s¢y²C× ú‚Ù"ø]iM:,iL"„"Z—£qOº'Ë.éÜ]È Æ»Ýê¨èÓˆ³jû;=†¸I»-SlN>©3¤‰aõ’› hõÇ [””ŽíC•jiv{,Ö®§]DÒrô† †äβ¨Óœ\5Çq¶1¹Ü7!N¥©° ›.  å'«µ}9+®B›p•6JbC… (/It¥KÚêJ…¨•) “šù…§øZÖã©äËëHˆÌ(pöˆ¬ ©KäåKZ²£Ë’îrqºCÒÇTÛa´Ì¨Ñ¥Á”dÇT¨bTu2ã!Öw'ˆ…4ó©#r~Û9åS·9eç>¨yÝ([béñ¨§uö¦XuûŒ¦ã4n 8¶ÞK¡n¥6¦œ KAÂ6ç œ‰#[Úzòò,w·¬¶A$\oHC"#*Ž…-Ô€§Î””e¶Ô7rÏ"EvçÑv¤z²ÝXÚݶFué³ ÜlŽ>ÌÙÏIrC,7%¬ -õ•nHÆNâÑú%ê:ÉýCk¸Ú#«¬N–ÏÎW!Çe%Ò¦ä<O0qå8 G0žï#%<ç>{Îsä·hí[QÈ™ Úî6™ðÛe÷bN,—8/oá8 .8ªá¯–íÃiȳ‹¬õõ¯KÜ‹*ßt˜˜°Äû‹ñB›·Å*RCÏnZNÜ¡ÎH VQÛX½t~ÆŒ•u¸-FeÌ2ÛÚ­I·Ãe¦¸… m¥w<ꔥ-D•|XÝ"ôpueÒL¦®ÌBfånM²æÛ°…­Æ°²´ðÙ*J7áck¤m«jÂF%åhéƒLÜn:š/V•½6‰«œòåCZˆˆâ›wk ¾©% )+i Ÿ… æAé Ùâ[ô6§zåGuÛx\º|:[|)RCE²±ûÁÆSƒšñÔúûª.Ýbõªb± ™Ø¾Å[TbûÇ [ëyÍåtžå-‚´¥XäF鮊dY4Ö£´D½Ûm¦ù˜¤Y¬ýEˆèHZVêZâ«ùBв »»èlí;pguì»èmDÆ­ÒvýG Ø1ç¶]i™Ý›ˆJ KI (¢ TÃUéý)éû|¹Ât+´{lELl]ÂLgÞˆÚÜÓxQp© iîúIia$‘WX1cÁ„Ä(l¡ˆÑÛKL´„¡ J@ø ×­ôe!DíÊ5êVf\Ë„ïZw­¤&Húäª-¾Ü¨Ñä:ƒjÝp¤#yYÊ”TàJòœ`âÅèëIë[“ö.$WÞ~*-¶DÅâ–ÚÚI“ ¸µ>PÓ‹HÀ@%YÇx ¹²¤N¥fj7¬·;´H--ùh€Xâ2Ê¥­Òq°R{É%D‘„žxðԺŻMù«¾ÁyÔUÆënE¶†a’¢”­k}ÖÐÊ nÉÚ¬F¿zPÓ×]Y¡îzf×w…jì¤gaÊ‘&¥a‡ZZ”ºÞÕ÷@… 0r“žU kÑ<í^ò.{ÕŒÝÞ‚˜3&"Ƭ¶†Ýum; *A1ŸHycˆTç<z¦ðm+4Ýt˜—ÔÚ]Òº‰*ëñíï©¶Ü÷ÙiÇKMnt)%Ii•8”!XÈV5-¢õ :¢À›»0&Ûÿ”ÉŠìiœ>+NÇ}ÆJ¸kZÒ°R¢Áª«Z+W}3UIÕv9çkíÚÚ•byJ¶¶´„6S, ÷[ Õ°-À w í—èÏN_ôźlÕöÙviùÒf²bZ×M®D‡d:¹÷w'{¸N6̨œ€û×Ñ$ÛÒfX/“-ñb™s§Äe²ÄFFíÊY[‰RðIKajŽc8ƒ¤{Q½»n›Ú˜ʉr#%lL“ [ÑÚ Qp¸Ó£šT[PI$V?I:3Rj»¼ÄÔ¶˜öX©JÜ´Ü,îÊfCá[’ã…¹,ïHîpÚNFâ Û· ͨ¹Ûõ Hí³.eÆØ…Z‚Þb\„ÉuÞ ã2…Ì’´µ„]=Ý#œçÌIG×ò$.l64&¨]ÚaÇí…PPúX{‹Ãr¤†Š eÄà/x#š@çSšQ1«t¿QŃ6 yí—Zf`@wfâ£ÃRÒB€ (‚•ðÕ>ÁÑÖ¡‡¤õžå« I¸_R”H¼Eµ:̵严©r\ʶ­„lK_HîkbA‹ &!Ce FŽÚZe¤ %HÂRÀSœçè*Ó5äx7ÔÛ'i½E·Ý}ˆs nc¬´ã«m¤%eÒJp¤©´…íîIÈÌs½)ÀfBí²tÆ¡bö$0ÃV•¦/Xx¾‡–ÙJÃå c<{§FÌ H?-h}T½}3SOÕÖ¹hR_jÜ…YWǶ4´”²³ ´Òµ–Jœ¤á$Ä[º"‘o´] ÆDîŽÇS°¤¿ì´% çv˜‚Hu£s…DÚFÎY ¹Î}D£ý/éÖØë ÛnïÇSnn¡ „ÛKΰµ=¹ÐUµÆI ñ½’2 I¿Ï’˜pdKSO¼–S…¶[+qa œ%#š”qÈù­OtèR<í5nÒîϲ9ja§“%÷¬ ¹qRßyÇd–âFKœE ©h”‚p{ØÚ×Fæ=l”ͺSq&­•¦<‡⥧ HJÊ2à¹Æ2;õdTcëù6T.í0ãö¨(},=ÅΌRCE²âp¼Í s¨¨ý2Xݴƺ n*í©»LZÑuJqÆÐû¾ýÝ¥\%¨px‡hÆljzOQYîZ²›…õ)D‹Ä[S¬Ë^AKŠZ—%Ì«aÚØFĵð$Žæ½zFèÂ>±j©GOC±Çˆ!ì6$½=¦ŽR´G’§6°•7„rh‘̃Ìa¿9ÊsœÝ0jêuÔM'/HjnLë*9ÅÃ\wcÃrêPJ›©°râžSZ’ìíž $1f¹ÞqÀÛq !ÂpNJœZ„€t¥$g¾@8дÿ ZÜu<™}a酮є)`œ©kVTyrCcÎOž¿Óîê}:»CnZv8âTë7[ZgÄ})æã%Hܶ¨¤¤$ç¾ Ø@IéRØÖœsQ¿ie—ž¸Jn;[-ée×w‰¹Ñ¼¡M9Ïà2’r/½$Û,^EöÉ}¶ÀGZ \žŽßB£²ëî¥ JË¿èÙu@© J‚{’r3[‘ÑN¤MžÇc‰¬­NYmiR×mŸcqèï¼^[©%-ÊoÞ[ JeEIH@ÎâS-Ú6«s\ÎÔ³µE†ä•·!›s,.¬ÛÚq!"XAç´¸­nS¹§j|sœ®ò±hí[QÈ™ Úî6™ðÛe÷bN,—8/oá8 .8ªá¯–íÃiȳcªGF±£%]nËQ™s ¶ãv«RmðÙi®!B[d)dÏ:¥)KQ%_UÞ¬øHòR”¨¥)J)J)J)J)J)J)J)JíC÷*Oôv©utÔ?r¤ÿ@ç÷j—Aáqû3æ’?Á]\jqû3æ’?Á]\h¥(¥(9›ì”û½xùÅ¿ü ¥«tý’Ÿw¯8·ÿ"´µ]YH)JTR”¥”¥”¥”¥”¥”¥¯]ýú³ý,OߣU¯]ýú³ý,OߣUÓ˜IòôwÜE|ö_ï.TÅCè︊ùì¿Þ\©ŠŠR” R” R” R” R” R” R” R” R” R” R” R” R” R” æÿ²#ïm_žçþe¹Êº7ìˆûÛWç¹ÿ™G®r«8„)JTR”¥”¥”¥¶×A?t¬Ö¯lJÔµ¶º û¥`þµ{ûbUÓ”—aÒ”¨¥Bkû´«„ÔØ1Ó"]¶Ù&[ ¨[m)iIÇ>dSuø­»NìmÇ<÷±Rp±4–ŒWk—a¥Q©¦Ü:ÛðŠ.©J@y«ƒ…¶€_ßL&xEÁ%§>ôΞ¿êirô%ÅíO%ö'_®69±‘85¸ÍÜ‹r²â%ج«¸XF;ÉçV(c¢.Ñî]PhnÔøç²<.«Ô8¹Nx¸÷½ÙÛöÜóæ¯ ElèZc–c¨mýÈ\ˆÈbÑ×™†¢ëåcxî‘Ýrî¹wëU«=±5¸¶t»m³_–¨—‹œÖYdõ3Bm—eÖB?”‡ÆRáw¸Üá ï§~–.÷kl+$+D·á;vºk“ ©öÒ#¾ðK\z8¦PÒKÈ. ÖE…¾Ž`ë;”k 4¤mPþçn-ÂÑ9ÍÊÜ¥:ï‡$ä•wÉÍJkÖ{\—Û‡b;Ö»+Ãê¸Ü1¿‰Ü÷ñŒü8©´5¼µD½Q«¦é’-:ºCú”»6²Û ßiº9cÌ&L‚¤«‡Imµ)H-äáD©)«+Ñõ,Ž–²ÛõõüÛÛ·?6âÊ£@(ˆ_*n#m­¿ ¥åê_úœäê+gBÓ³CoèþBäFC޼Ì5X(CÇtŽèà#—uË¿Y²uWEoO½Y¤êMä·Ðò/ܸâZl¥á!Y! ¡AAc¹JH8«/~‰g\çèõ®ïrzç.5ÞéÊy¶Ðã¨pÃeA¤¡¶6v¤FqTþ˜µn¤³^/]ˆº9«ŸEá !–™î)RrÛ¥Þï‡˜í·†p½òPsÊÕÑè³ѧi˜÷¾¿Ú÷VÿÍÃâð?ü=»¿ócá¬ýYÚ7eìݵö¹Ù.?ýÙ>‘þƒ‰ÝoÎß´çÞ©…ÚT9ºMÓú¦l•Õ›‹×õÜØÓ-‰QÌfJ^‘<ЈÛÉ i …+Œè*'#ºIö]M­d®ÿ§ä\µ'Ûº‚Ò’›:®Žº÷XâÆh…€¥-6èß•ðʲ )ÅÖÒÇD5þ¥ "öór}f*b*JÐUµñ%)îˆÜ¬/ÂpyšøŽ®†Žƒ’Üuh¤‘‰ A‰Øô=Ë’À÷°¾÷Ÿz•¡”‡C÷›ÿ£è7;´"jž’˫ؔ¬p¤8ÐJÂ@O!+(î Šrœ ¹«µÔ‹ó†ÑtmÉ7­ÞÏ Ù%–XëŒÔÂÛ“ïû·EeK+; e£hÈå·¬(´¢Ë 6ÁM¯„“B pÈÊvlîv㽎Uì~Že꛼WXÒê¡îÍ)Õ-È¥ ¾>Ü´R@»œb“™ú‘6†½±ê­D®Ø­‹V^l)´¦®Ì•ÜýÈÿX ŠÚc¥l•Û*Bv-ÂÁRq«u?K{F#SÜMÁ–"[}¤!¸ ©÷Ãïp[œ‡; \g« ‘°®"œ»œ^„~„¥he¤3ÑãÚJ$½ëaªÞÌŒmÉÿá¥Ì+ïàÿ=cÈ{ m?.Ï%÷z5´Éb2^´¸µBam°§ ¶ Á.)äTT{ù«½Sj6$ö\“Dve½ ×ZR!‚ã$Œ¤-*IPïÉPÈæåZÖÕx¹«¢×&^µÔËs±/—(.ÝD(îKÛä°Óhl5Ã.¨6ØîZQQåYýØ®ÁÏìïRìOVs¯uݽ_´ñ8›û›s»w,g<ªŠ?Ð[z5WtÙ:8N˜’ê\T±‚ë•¶•ㆥ$©ÔƒœË ©+ }©µ·IVËb•.ár‡.ßcUÍàÜHc€…J–^¸¥ÀNÂËm•"&\ K܇p*íÛ¤‰Ó®Ø»´ùk”éQžjQ_ ‡\ Ç-I¡HÂËûPxnàP*NTN†!ÅÓìÊ #ÇÉ]…""QÝ/q1åÍg9G|œ÷êZØŽ»œ«b4±ÕÉo3LpÇd9sso¾c˜ïÿ5Xíóç0“ßäÅé¶EÞßÑf¢½Ø¯³lÓíÙW]ŒÓqÓ)-¬<ÚÆÂ  Ú¹ (sÍ[¥½_{µjù0[Ÿ~µX-VVî— ¶hÐxy%KëaC†ÚXÉKhRÔ\¹ÝºGí°lû£v³Øž²žgø_µ[vñ»ûwãñ»àÍGjKoDºfÛikQÀÑX0\Z­hžÌXíGYVõBÀ QQÜvà俦ð»J)éz’_HæÏfÖÑ”¹)»† ÆLk;E•ðn)²U(8Y;§Nå)  ÈtHíö[úŠdýQr¿ZQq0­nNb*CCîÃ-‚ ÜD ƒÉ Aî«é˜ÝÛ5Œû“1ô$-O/M%ˆÜØà¥EçœPÂÒ T¢¥¨ŽDäó55¢oú*ñ p´UïOÜ"@J¦m™u¸ÁYÚ Z$ ªÀåœÁHž—®:‚ ­7¦5,¶ï1‹]Ž,&Þ 9rBœJ”ˆã) RK{y÷JR’š€‡«µLZÙ7ñ5Æõt³ˆ¯FލðQ¹…·Æx¬uV–¾"¶Ê@N> ޼¶tS2÷ë»~Š‘u’€Ä.Í3Oº¢BâÊ”y…GðÖK±ú9—ªnñ]cJ?¨„[»4¤GTµÅ)¥ñö墒ÜãìŸéBfåÒ,ø7´Ýê÷|°¢\`ÕתÀbt†¶?ÖLN*m…õ]«q8RKÛJ°ƒW®‡¯óµ7GЯñ[ò™÷y¶¤ºÓnÁ+B¢QÜ’¬§–*=« .ÖfMmèϰ-ÉlËy¶ õT¾€¤£ˆ 6€âÀÏ1½XïšØV…ÛݵÅrÒ¸«·©”˜ªŠRY-ã¹Ù·–Üc劣]M¿_ t€çcï·MGo…ÖŸ½À‹liLAa,¸¦YiHOrÊøC‡½eI*;Q”U2Û®õµû¢~“oOÞ¯:~ù¦Ý~á´ÙC;]nCpÖ%Ç<@—½ä³„¨¡ÄggZm£_ÈrÕoÑIÖM-ÇßTfb‹Š°x‹QHâ ¥džþãžý|ëz'zÙ1zÁÍätJe›ª¢–„ô°q9qÃ! gºØû5•}ë){~¾ÑNþÍjÎäå¾e³„ÁŽâD‡7ø¡{Ùo¼àNö¼É6«§[%p%µ Þ öHuhe[N¤’2æFFq߯5]£ ;˜v­UlèÎØû1¿’E¹±•6œZ½íB …ÃÈ`¨¬÷ó[èÄVÙQnlÇ~ Ì­¹-HJTÒÚ)!iXW"’2<±œÕF‘ªu£QöÚuîïhŸu‰ Ûqê0šŸ=E™+˜›ÛDrØá²Rã© RCÛT£°˜Ç:EÖ«Ón)¿:Ô‹ ™ûŠ"ÅÌçQ.s\;‡û=Q¦WÕ±—d’Qƒ[ >‚™Ò·90"ônÞžqÖÛ¸¸Ãp„58‚v%â;‚ TpÌn8ïÔ¤ÑgMu£8[ÇkœN­·vF:¦~íÿGüÕc<íÉ'ïÈ4Ì‹»)ê›$ÛìÛœí¶û„F¤´Âz¢Ÿ~rVÚ M ©,6òµr=Ñɬ¹³`Gb'\#L\„¡ Û“Ë0Imž¶ ÈP¬•g¹Bð Æ0-V¾Š›×òµ[´Z5“KrCêŒÌaqB–ÅŽ * 9'¿¸ç¿S:Üi#§žíØY ”)QÑ,ëœýµÝîO\寻Ý!O6Úuîl¨4”#vÆÒÔ€HÎ*ÙU>ŽaônÄy’z:‹¤ÚaÅ¥¹ŽX[Ž¥#;Rág‘#r°{'ðÕ²¢”¥(¥(¥(¥(¥(¥(¥(¥(¥(#µÜ©?Ð9ýÚ¥ÕÓPýÊ“ýŸÝª]…ÇîtÏšHÿuqªuÇîtÏšHÿuq R” R” æo²Sîõãçÿð$V–­ÓöJ}Þ¼|âßþŠÒÕue ¥)QJR” R” R” R” R” R” ½t#÷êÏô±?~TZ½t#÷êÏô±?~WNa'ËÑßqóÙ¼¹S£¾â+ç²ÿyr¦*)JRJRJRJRJRJRJRJRJRJRJRJRJRJRƒ›þȽµ~{Ÿù”zç*èß²#ïm_žçþe¹Ê¬â¥)QJR” R” R” Û]ýÒ°Z½ý±+RÖÚè'úÕïí‰WNR]‡JR¢• ¯í2¯úPX ÈLywd˜Œ<¢@mn4¤%DŽ|‰¦ê;SÞ"ií5t¿Ï 1-Þ˜þÁ•pÛAZ°?jNMki·ôް—v©bu¿ª¿"Ò™L¥†Z¸7Äk«ûÑšÏ ŠrDDïçßó»iÍ^Þ’oHûŸLvßy¼Ë¶½r"l‡“ooŒû`¡í¥Á¹)ÉØ ;“es¥‰‘’õ¾~Ÿ¶F¾ZKL‹ÚU!h”µ©é¥'©«ˆâÁ9J@¸Út…èt«d+}úÙ`·^'Ý0•ç_möÔc%’§ðâß.ž2†ÐFp1n=‘ÄsƒVžŽ­ŒÝowÈý^ñ{ž¹/´V•–O½ÇgrIËHA8$oS„wê ÃÒ%êã«.šz^™‹iÚæ³hLù3UÅÆRPB— 5±hAwsN<¤ ƒµ\ñ3Ñþ¦¿_îz‚ êÅm·<–âñ ]1·-‡œ­†ˆ( o<ˆÊˆäRjŠçM0õ ÝåiÛn‡Ÿq³Ý!p/X ƒÖTÆå%lH}¢’AQâÁ;û‘¸’˜˜ú;R£T¥—ôâfBƒyºÝŒ‡äFê×å70"8/«­4Úø‰á„ÅANsÎëÒ^¯»èût›ËZz,ë<Ýbd‡na‡UÝÂa¾¸®œ %EEI’Hë¯K2â˸¦•ì“-®|[sqçî™2\F䨶¨á²[CŠ…)´,•)³ÜR2N˜úCT.UÊûr±ëY3„˜ µÉD‹2nŒ­–å!JRB“€”¾Ržä¸Kª%'jJvoDV;¦žÐPí×¢; ©¥¾às†_’ëá² QHp$%<†1Uè}(JsHÜ.Ó-ö tû|¦Ú–Äû»ðXˆÓƒÞÞ}Éqq°¥‚„€Ê·`žëm¿£ýD5f‘…ÌA+‰†ÃœD(!Å - ÀÞÚöïBð7%I8Å6EU»VÞúDÚtœÍ5oµ?5Ë%ŤAz:¥ºË­õçÒ$”•q†C`’°¥«âV¡è q¥z)é3J·n•ýB·X·®ÞÓQVó[iÉ*D³Ü©ÔáC%{ÂÖ’°²fëK•¯YÀ³ß,p [®OIj±t k -Õ<ë;m’–þØ8¢ ÐUË Jt‡vÕÖk¼í7¤ÃŽB»ˆ1Ó>VCÑÕ™”³ÃR›JÐò0€…«ºI8ʶÎsŸ²³5,[ყà?a›j¶Èž$ÞYšìrël°¢¶Ù!§•q\KDí*0°¬Z¯À›ð-}–=YÌ@ÊZîO½wd#ºû^è„óçʵ…ϦeBÓVËé²ÚƒS:ÂQÛê"kŒ¾¶VÜÃdËQ)J’}ì).·Ï* miî¼ÄÆŠ©o¶Ò–Û ZR]P„¢$òÉ8çέ& ËDHÓºêôWª&éݧP‹”'VÜWm¡q¢²Ô´!0·>ãN8“!Ak’—NÔ‚”„á¹ÑÞ¶F˜™oì ®È¾ÙŸ·)ÄÉ‹˜.®\çxÒwöºÛO/«gÇ #®wŽ–.VE\`Þtýž ˆ>ò¯ßötdÉKÊB¤I,É [<Þg…äIX:C»]ÑòNœ‚Õ§RJ~’›¢–ão4Ô·BÛG%Öˆ»îô•Rvc¿"׎XžÜËiýG'¦]˰÷ö[téRHyØ" ‘Ýl=2%O-KÊÃáIG0I5né‹‹ú}Šp•1¹ [n[Œ1.6ËŒõ°Y*Á(;±Ü­x9Æk–^•#Ïéµ'àÁާn2mÌ \·ÎKŒ¡ÕñÃ&V†V¤/z·“žV¨Óuwt7k(C‰C¯].i„¨à-Ç”•m[RJ‰RÒ1ß"ÖÑ%/F ‘¦õ›‹w£éÒ"ÜØ’/×([×-l»-÷:¿¿Hm)uip­kNæÐ§Ox¢Ì;u¬_:{I_ Ú•"àõÙ‹µé·­×d¼—•µ˜üw¸\I%®XIX çmdËéFîÖ€k\3¤£.ÌÜe¿-Çná ^×VØLQÂ=`¯`Se\ °ãx9$ ›H—«Ž¬ºiézf-¦CkšÍ¡3äÌeWqIA \0ÖÅ¡ÝÍ8ò’‚ÕsżJZaóÑQAÔzŽï~‹v@šÄ6#½w\#1až6RS ÞIâ‚Y*^îA8Ù5QèÿS_¯÷=Aõb¶ÛžKqxÐ.‹˜ÛΖËNVÃD·žDeDr)5n©*R”¨¥(¥(¥(¥(¥(¥(¥(¥(#µÜ©?Ð9ýÚ¥ÕÓPýÊ“ýŸÝª]…ÇîtÏšHÿuqªuÇîtÏšHÿuq R” R” æo²Sîõãçÿð$V–­ÓöJ}Þ¼|âßþŠÒÕue ¥)QJR” R” R” R” R” R” ½t#÷êÏô±?~TZ½t#÷êÏô±?~WNa'ËÑßqóÙ¼¹S£¾â+ç²ÿyr¦*)JRJRJRJRJRJRJRJRJRJRJRJRJRJRƒ›þȽµ~{Ÿù”zç*èß²#ïm_žçþe¹Ê¬â¥)QJR” R” R” Û]ýÒ°Z½ý±+RÖÚè'úÕïí‰WNR]‡JR¢•‹y·C¼Z&Ún,‡áMŽäi @[kIJ“Ëð‚EeT'H.ðô —§ÛS—†-r\€„£qT„´¢Øá;€åSV.ºkX¢ºŽŒ p”ûÚ—Qȼ‡c¹òëÌq¸ u %k„RûàïBЏ«ÜI9³:$„ãöwaêýM±!ÇB:›è\—[®KR_Žàã©N(ïÆHHH':Ôê%¥™ Zµtùz/­ÂnŽj -8¦§•!sˆâG [vÞ(O&KëHåßòÕÚ–t}o˜Þªœ›žÉ½‹S÷çâÉz2&<ˆ’#ÆJ6Üž[)A-º°'ý!QÝ&¿VkH“w3£­\Σºj ÕÝØŽ<åº$¥0ˆðTà)%´´Ò ˆB”€§ Ô£Ï$“«´ì}G+NN›n• JeÛ HFt%HÜéRPµ¤…%@…UFÑš—KµÓ®ªÓ5›3‘Ûž¿ªZ‘4=<Êm–œq\5%k{M„„œ¤ T§N3ßa´©W-Ö·®»¤¤Î\$¶ÏW}M…Éloa ˜èS‰æÍfvjó:$„ãöwaêýM±!ÇB:›è\—[®KR_Žàã©N(ïÆHHH'9­ôg›â®‘u ö>És'ÃŽƒMC—)%×ÛÜÉZ•ïΗ´~שu¯¶·¤ípeô>ߪ&"X±?7PÙ„™¯¢5ÂFå$H”´v¬8]ÛÉ#+XÌ·ê)‹éf\9ZžäÊEÎîÔ´±vyÙmEm—ËeVÒ QÚFÔä'rœ)k)÷Ó‹½>iµ~MÅÑþ’^‡2"u-êòÌ™.Ê ¸¦0á:ëÎ<ò’Ye³Ý¸ê”B² £•cë=kÕ%ʸÝ!¦T1äÄGP–îB” ËÛ¢ Üæ‚…aÅ Ø5RèìýÆõ©ØEÙíñÑ °#_Þ½ECŠãq f<²áÚÌí löäÞž/w;v¤šÛW©¶é Øþ›a™îGn;¤nB[@ĵîD$pWÈ!å«àæ§ûA´óuÊgEšzmÑçæË¸È·:ôÉÒ¥4"¡ém8܇KaÒV—ÈS… ¬1îF§o‰ÇT­ËÌdA¸ORâªCÐÒÛ¨Ll©‚„ œ;‚C…J$¬ó­m7Tê&uf¦BW2v« ¼¢Ñ > xªe™"œ¶$‹.!¶ÈueeN:œ”‘#eºYŸ°êÉ}°ê昵ĉ.#Ðõ,ÒóÓÔ©(TtÉBÐæõ£ªGÉBwh¬Æ+â9Ï¢Ì^žgŸ_úÝÖHRmö¶aË»M»¼ÞíÓ&!”ºæTHÜBÈ9œœ“XOGP½»t|½ÇùS!EBÙS%ÈBÒì–’¦É.+‡ vs©NŽ,× ?¡­‹µÂUÆâÄqÖäH”ä…­å¥áÇ Z’¢¸’> Ó“/—‡5mÊ3ZÉëMíSo ÜD‹‚ÔͮކfuiKаe´l€àx¸]pÎÌRgê‘xý>/FzeÔMV§c·)3iÇä_ã± žV–‚[Kii!Çqµý"ÉÎMF·Ñ4V+i°ê½Aaƒ¥ÚH·³˜KÜ'Z\‡8‘—¹Õ¡÷ww’Jж…s­¥¯šæ]—RBÑÍÉÔ`Eju¯P¢c­|~¸ôyS”ÐqilGŠ·|ÖM¹‰:·¢Î‹¸×Y SßmÐY[íêL¨Fi°ì™kCðÖV€v­`«sí€{‘izŠ·¼ö\“Dve½ ×ZR!‚ã$Œ¤-*IPïÉPÈæåZñΉƒºNf™w¤ ^¸2ç®s¼ )N:ëÏ â(J›qÇŠ”…å)Nä›åùPcž«¤Î¥Fpʓ֕‚ÖÓ½|T©%¼''xP)ÆAÍi >¾Ð ô?%WŽ‘$È‹oÔ3ã'©jE¡S¥ˆl®Oˆ¶•%jq9K`•ì ©$6%ã¾ÉÙ¢ØîšÇQ̳´ÀbLˆL55e[],ÇB‚v”¶RÚ’„A%EY–Ýü-{3Wa¨$»1¤0ô[‡Õ‹-©å4ÐÛ8Ú¤8A߸òÜ¥ŠÑš†ý}¥m³­ý!Ú¯7‡­nªËm‡ªÝrHeHà¡€¡qÀáGQw:ÔIÊ«jÛìí=Ó{ÎÚ®z1­1W&èÛ—ÙFv\¢xL†êšHCaÇ ÄdŒWò‹WH:a:ÇJÌÓ^®v˜“š[×1Äy•¡H[D¼Û€$…wÒ ó~èÂö*šºê{ü‡¤Á6뜌DC—(»Ö´²îÖRÄX Ú°y’yÖ7Ù#:Ùlèzÿ:v¡zÅ-ˆ2\µ>ÍÝË{ŽMLwK-¥M­Õ ÁD}©Ç*GKZÞ+Ú’=Ê=é=&- ~v­Tå¸Ý$ñÞCèŽänêSÈ ´”²‘—Nq‰¼.ÒÚÍèò檺jKÝשHvM¾ž®ˆðÖâÙ( 2…« ¸´"–@Qïžu%¥,Q4å™6Èn¾òxξëï¨^u×ãŽ,€Tµ¨òsÀ V˜´êG•ÒmÒ.¤¸Ü“9É×FZLBÿפ?ÁyVÄ'†[S(B’êÊS®# û\Xz»?q½jvvDû|tC,×÷¯QPâ¸ÜB™¬¸v§s;B[}¹Åâ¤Úh´km5>¤·_ªïö·-ÈÄhñQ Øès$ñÂ$Gwàí ÀʳøžŽ 7{véù{Žò¦BŠ…²¦ K…¥Ù-%M’\ƒçM¹tck™>\‰o­É :òË…HL‡R€—7PéæâBV@*"·10ÌM^pú6†Ö¯ºê šŠñuEØ:ÔÛuÁˆOFr:‡VÉÅ 'vCaÌ2­ÙVcæt1¤Eªõl°*N–zžÌ¹©³GŠÈq ²–“¥L©%ƒ´¬¶AÊ–ç<-I5“ªíotÄô ª$ÝîÖçg*él“¨Ò:ó©aÝ–øÑXJT…ìQt!!!¢µ¼Ci«î¤íCZ7¯¦Ý-SãjF UËP&Ù v wJЧ•”)iÆÐ­í$¨­N†›:ïÑ»wm<Õ‚á«õ#¶óÖÂDFÑ1Ê! J#„·„«fæCjÚ’H®WH«›l• ¹’a.C+i2c‡Y*Ih*;†r2ȽZ" WõF…Ѭªý©Ó¨o3žŠÜ˜º‚k j q×@mÔ¥ä†@i­%NqR¾Ûxj7âÅÓ×)3®*¶Dj#®?5+ 1J‚HʲA»Õ©ò‘áGµtIÝdfØÞ¯ÔŽ*,ôÜaKZ ‡ãÉq w)ŒËZ]PQx8O"0y×£4–lŒÛõ¶¨¶¢Í%é±Ã ‚½ÒžëY âÆ^T¡)á´aµ€kR¯WB›g—rÓ:Ùçt÷h,&j÷xˆG Qqés··²êƒ[SÛ™ )GA+ö¦š×Fv‰èÕsySÌPæ¢ËØL·’Òâ2‹ª¶©¬q†”BK¦‘ç9”›sœÃz³£­\Σºj ÕÝØŽ<åº$¥0ˆðTà)%´´Ò ˆB”€§ Ô£Ï$“+©-O]à¢<{ÕÎÎò"L7Ä`¥Ä- IòRHÎ|5TkÊÇOðm¶í@ì–Ü™-3c¦úô—‚SÅ=HKqK€lyŠö¶ ‡ŸirœŒ†ÙRÎxL‘Ëð¨Ú¤]ºt¥Š&œ³&Ù ×ÞO×Ý}õëκâœqÅÊ–µ@xŠ•­Kö?Ý. –¡e7îVHìÃ¥G½È»Ç\£Æë9O¤)chŽJS” «žkmRb‰)JTR”¥”¥”¥”¥”¥”¥”¥”¥v¡û•'ú?»Tººj¹R sûµK ð¸ýΙóIà®®5N¸ýΙóIà®®4 R” R”ÍöJ}Þ¼|âßþŠÒÕº~ÉO»×œ[ÿÀ‘ZZ®¬¤¥*)JRJRJRJRJRJRW®„~ýYþ–'ïѪ‹W®„~ýYþ–'ïѪéÌ$áÙz;î"¾{/÷—*b¡ôwÜE|ö_ï.TÅE)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPsÙ÷¶¯Ïsÿ2\å]öD}í«óÜÿÌ£×9UœB¥*)JRJRJR[k ŸºVëW¿¶%jZÛ]ýÒ°Z½ý±*éÊK°éJTR¼åÈb$W¥Jy¶#²…8ëŽ(%(H*$÷€9¯JˆÖ¶Dê]{Ó‹}QÓu·È„^HÉl:Ú‘¸‡³RqeŠVèxý%èÇí/\Û¹Éá4ëL–Un’™+S£-lŽ[â¸)(I Qá/¤½Y®]TY uŽ;Pd8Û nRJßRPC BÒK»0P pRqM‘Ñæ²pV¦š«3w¦]Á„ÍÖ_ÖÐÜô8LÖT®È¼P‚á¶”’/GѦ¯¸èætûoZ–·Ü›*Câë2;Q¤K”ä‡3 -Ni%À”¶øH!*Ï%7j³z6:ïO;«Òdz \ßuæ˜L‹$ÆYt´ ^ÇÖÐi@HPQ– È̦¥¿Ú´å¸O»Hq¦”êYm-0ãîºâ¾Õ ¶ÚTµ¨óäN=àj>-Šc!ÌÔ×[,ÀD SHQ*i WBÕRÔ–“žå”œåD n’ôõÊý Ôý¡QÌë\ó-¶_”ìd>èëG VÑÙ!jJÒ JOóÖ{s–Wœ¾“4TXq¦»vuQd1Ö8íAãl5¹H+}IA ¤-$ºQ‚…‚2Ò’UÎ]¼Ý‡"ÒëÎDyÊ™ /!©¥­+*BTT6+#¹8¡Ý´GH‹ÓñtËLéË…ŠS²æÞ㛳ð—)ù2}q‚ÓÓÕ‡iÆÕ¬r;FB³ÇG÷ÅôˆG¢Í¹“â!»¼É‰—%Ö^i.9Im¨àñ–·{”¥cºï“wM—­/ªìš‘ÉMZŸ•Lj_bT'¢¼„¯vÅðÞBUµ[U…ciÁ85㩵¦šÓSãÁ¼ÜU÷‘ÄÂcºêZopOÕ!%,·¸ã{…)Îyò5ÑF¼é˵öåvÙFCL&ï&èâx\\©R¤¥.® Ã|ÒŒ(ƒ•ª°úRÐwíGuº.Ñ"b߬©³OT™O4¸¨OYO´6’—ÎÉŽûÚÊS¹-«9HÃx]¥fs]éÄÞ¦ÙÙvç6\¾µÔmå4ÊÙqM©Ö›R›G&÷n$¥  ½w¦Ó j6äÎ\\ˆÒl’d­öÖ´8ÐÃãoJšpìÈØOxf©öm ¬4þ³‘s´Lޏ~ãp-»{””N2KÎ";‘¸ji—Iã§zö¶ÜWÝ›Mô€Î†¹X§[4ú~í*z-M6:D™ÊS}a¨í¸Â§HRBÀ,jmæ[Áx·_­,Ým2D˜¯bB’¢…%IP J’¤©%$ €EC=Òfï6Öýå,½)÷aÄGou!âž–„åJBTT@Á¯®‹´üÝ/¡àÙ.ÇvK }k,¤Ž#Ëp'z€S„€\P Yjæ£T§º8¾®îë2²Ül‘î+œvdN}*š¹mÌYæøjm¤=à§Q½JJ[Ȝɺо”4r"4ù“v+zJbµXæ™kZ›qÔ‘3Å((eÕíÚCjçʲï:ÿKÙ›ŒåÎTØ©~*%’»dŸäÌ«8rFþNžDį̂`âƒnèÂæÃY·M%¤õ ó×–­‹Ô©±¢326º$ÈŽë‹tªJÒÃBRƒ€yüߺ2Õót%¿Jµ&Øân@›ÄÖZ„]}núºB›œËh-¶†ß [?ȤU/FâŸ%¸PdLy/)¦S«K,­çHÉ BRÕË’R 'Õ}½w¦Ó j6äÎ\\ˆÒl’d­öÖ´8ÐÃãoJšpìÈØOxf¬Õ)d. ,¿--(°ÓΖ›ZñÜ¥K QJIÀ* Qžzµ•›Mô€Î†¹X§[4ú~í*z-M6:D™ÊS}a¨í¸Â§HRBÀ,k*²?Òfˆeˆ/®ôxS¥¡Iˆòƒ)K…¥)ü#ù:C€ —v¤¨`âZÉ©í‹åÖÉ sS>Õ°ËjLãá+S‰BÐ]BC¨R™p ©'içÞ­Jz#Õmi·¬ìM´(]íZ®KT·Ðb6§¦,8¨þV ÜçRxÛ7­tÝëÕžÛ­éfí™jÓíÙgÁoK]Þ\”"3’ÜC…£)*_YH(âaI _z¨°k-OhÒ7/wÕÍj9/;ò¸I R”µ†P²„¤’µ‘Ë$dW†§ÖV 9:< ‹ó%µ:ÔHù_-¤€V[a XH$ Ä“ŒÖKö›þ¡èê÷§4äkcÒîð_·­sæ.;l!æV‚à(iµ$©=ÆÏt1άô>º¿Ý»b„ì 5î]±¸˜š‚Z·­—Ÿ[O ¡”u¼‡òYu(FRUß©¼Jîæ»Ó‰½M³²íÎl¸!}k¨Ú%Êi•!²â›S­6¤6ŽMîÜIJ@* m%¬lZ¢]Â%¥W$É·púÓ3­R¡-¾ %Ëí œ„“Ë?{ã4ý/ µ-‹¤ÈF¹%»*®sçÈ"í!fR$©çO½ŽºÆJŠÈl HÝb™e·N~ìã^.“ÝŸ=ÆTTê!-¡$€J[i 6 !À&‘‚rýÕ:ÛMé™b5êkì+„qh„ûÍÇh’8Ú–Q”«ºp¤w'Ÿ#_-ë­(æ ‘b`‰‘ËÅ8ÈcsiÜâú’RОjBTT `ÔK6=s¨ä±hµD±ÊÒγÿiÆ“wzóIË*R#;† q¸$¥JÉ ÈUzõÑEòò»…–Lø1ìnIºËb[r\’¹ÍMFÅ0@m ÁãÄJŠ–Ð m‹\˜é7G¿kì›Rnªˆ·[j;„›ü±N%jHŒ8Y‘ܶµ{Ð^2p0jÍdº@½ZÙ¹Û_Åx‹ÚRA¥IRTJ‚$ €Ej–t±ìdÆçÁ·\B¤Fr 'u}Å" ¡ä¹)©až3JXqà % HVÝoi§ô–Їd—)¹2’ì‰2ovÎ+ï¸úÂw’¢§D’'jŒözDÖÚnV¤y©¯‰êuÆß ô2ë­…må 4âÒ¢R•6«#‘¯¨:ÓKM¶ßnQ¯1× Á%è·Gð ˆÎ´„­Ä’FÔ©9)ÈÎG|*Rôƺ¿k׿j#lbÊÇYjÌý¶ðâ$[ÃŒ­¡$2¨¥ ’R²œ©Â„«jO2¸­9Ð’íö[Ο{Z_Qkzóဈ\@ˆÑi!䘼5ã@‘µ@†Y?l\Ý›óœï Y|…¯4ÌÉšz4iSWÛdI´½ØÙ"<„)•¼‘Æ-ðвÛk_ J Àïs`Ÿ.42'Ly,ÆŽÒyÅw„‚T£üÀkS[´gHv-3Ñ­–:~ò­"ÓNÉ‘:îäe<ð…")e´· C„€úJV®è„¤î%gkÝ äÛ%*ÖÜg'†Vc"JÔ†”îÓ°-I„ç p TU“Òn1]xΞ‡u¶z¢í2Ñ-jq+S{#–ƒ« KNR‚mg8IÁþ“´S0£Í]ÕóæÔêE¾J‘ qM©RlõpÚÒK»0P {ÇGz=××XN¿³dsP9q*Cñõ¦Ä¦šmôˆí:Üd9/nIoˆ¥8£½EK¿F:Æ^€·éT;iW w?Ù‰":Þ·2ã)AnâJD€’µ%jQ%ÅUŠn“á±Y×zyÝXΖ=˜bæû¯4ÂdY&2Ë¥ Jö>¶ƒJB‚ˆ<°NFe5öÛ§ ¢eÍÉ:iâ»!×VA;PÛIRÔp•y~ ‹b˜çHs55ÅÆË0ÔÒJšB•ĵdµ%¤àg¹e'9Qï_Ûî×M:¸6†ÙuÇOµÝ$Û”´xD˜À¸Ò·œ€AI# È›*:OIÚ&<6&9v|Æy¥<§‘o´GBV¦Ô§Ô–ÈŽд’îÌ(`ãÒGHšj=ùV7Ñnòާg„¿ÀJ–ç |Ž÷)8ØU» 'qPÍF„é­jÑ­3¦çéô¡õÝ£ªðüGe©É9ÕÔèŠâ–ÖÅ$-gkÅDeA[Û%Øë[ž©RaJv=°A±Å[ëm)*i#üÕÆ©×¹Ó>i#üÕÆJRJRƒ™¾ÉO»×œ[ÿÀ‘ZZ·OÙ)÷zñó‹ø+KUÕ”‚”¥E)JP)JP)JP)JP)JP)JP*õÐß«?ÒÄýú5QjõÐß«?ÒÄýú5]9„œ;/G}ÄWÏeþòåLUí6Vû®µ¨/ÑRãŠs…_ ´•NË™?þ¾uóÚËß*µ?œ¢¢¯tª'k/|ªÔþp>Šv²÷Ê­Oçè ½Ò¨¬½ò«SùÀú)ÚËß*µ?œ¢‚÷J¢v²÷Ê­Oçè§k/|ªÔþp>Š Ý*‰ÚËß*µ?œ¢¬½ò«SùÀú(/tª'k/|ªÔþp>Šv²÷Ê­Oçè ½Ò¨¬½ò«SùÀú)ÚËß*µ?œ¢‚÷J¢v²÷Ê­Oçè§k/|ªÔþp>Š Ý*‰ÚËß*µ?œ¢¬½ò«SùÀú(/tª'k/|ªÔþp>Šv²÷Ê­Oçè ½Ò¨¬½ò«SùÀú)ÚËß*µ?œ¢‚÷J¢v²÷Ê­Oçè§k/|ªÔþp>Š Ý*‰ÚËß*µ?œ¢¬½ò«SùÀú(/tª'k/|ªÔþp>Šv²÷Ê­Oçè ½Ò¨¬½ò«SùÀú)ÚËß*µ?œ¢ƒU}‘{jü÷?ó(õÎUÒ?d|4Ûô´X©yçÂaI%Lj+YT¸j%D“’yü?:æê³ˆB”¥E)JP)JP)JP+mt÷JÁýj÷öÄ­K[k ŸºVëW¿¶%]9Iv)JŠTFµ½§MhÛÞ£[ ›U½ùªi'ÀÓj^Ð~ íÅK×”¸ìKŠôIL¶üw¦ÝiÄ…%iPÁI¾8ÅIÅ–)[µŽõŒ‚´ÌÔYܽ<ì~ Ömr¸ 6¶ç-Àco.¼¤ö9à‚…ïµ$yÆê^Û±ÆÓ&¿§¢^¤Ýúµã­Êà°ÌF®fï´ ¢TRµ¤BP‡¢B;­†ÇFš1‹KÖÖí²¸nºÓÅå\¤ªJÐ!­’ œVÂ!! !JœË7¥l éØšy»rSl†ûXd8±‡Y}/¶²¬îR¸¨JÉQ;Žwg':š$#tåÚþ¾‘u&œ»É¶I‰ +„ņ¶B$=17JXqI“ݤ £ÜŽTé/Pܬ0­LZNºO1yø®ÉC1ÞµðZ!n‘Ö„J”‘^Ð4.Ÿƒ«ßÕ‘Õzì´Œ‡Våòk-9p„TékbK®£nÔ“Rz–ÁjÔváìÃŽ´‡Róji÷u§ö«mÆÔ•¡CŸ4pHïQa«5IšºÝ£Ø¿¦=© aɱd2-rä5&LINGp!¨-(¶—*(ç’ 2põÖ¨Ÿª‰6¨öû•ÖáeÄ€úÜŒüdËÚûŽq‡’¥Á{,£b’•6Jû jÇ3£=. hÚŸL8ìu~®ÕÂCM¾Þå(¡ô¥ÀKZ/%j';Žsáè­5T9©cÛ”‹’Ö·7.©¤8±µn!’®PRÒ¥d䜚¶«;"ú2»ê›´ýFÝúuš|+tá«}¹ØçŸåJßw!+W Žé·êˆéG^ßtåÖè‹Dx ‹a²¦ó=2#<êå!]e\&ÖÚ‚X;!½ïŽ'r›N2¡›õ†Ño±Z™µÚãð"2TR‚µ,’¥)EJ%JQR”¢I$’I¨ÍO¢´Ö¥žÄë͹Re<¦K­%Ö÷pÝJó{†v8œç—3Sx]¥K±ëëÞ Ö“­1n–‹3tûu¹‰v)o®SѸ¨+ë!ÖÙÈ[Kp²œ¬¶ƒÝ';“'iÔ¦ãѤ‹Û÷Í9jŸm¸Ü˜¸M~Òó± åH`­,‰)R K)Y%ÅÝ ‚&ŸÐ]ëÃ×cj%»ÆP-\¤¶†\u CŽ´Ú\eÕ%kÖÂWÝ»$šñµtq¤í¶;ˆ÷7­·'8’ã̼̔‡\Sª>úê¶ïZÔ¥íÇqߺ¦ÞW îŽ'_îzÑrÕ Åbï.8}ö£°¦PÞòT„”)k)PAHPÜ{ ¬UOHúµ7G݃hp‰&uÎÙl·¡‡›©˜PU!Já,8¸§bR€ãJ$îÛ•XVÒ¦õ.ð˜›,;½lÏØmn£cŽ´”¬%—TžEÖÂWÿš¬Þe"Ñv´_KÚ’*]´?—®îÈ„ÛW§§ÅKAôKZ·CR”û¥ „î6Ä+F6Žfjõªu¹Òv[ÆœÕ:NâõÊZ-̲暔ّ%R…á*˜Èi´¨­ Pà8ygjmŒts¤Y¶É‚ˆ33&Bd»-W9*š§R©_Z.Á % …òŽñ çÚô†¶&Ò˜vòhSë…¹÷Ã[Ùâ¸w(ïq[—•«*î×ϺVnâ^ze. „Ay–%©¥y¢ëh^;•)I*H8%!I$rÈïÖ¿ƒªu\ŽŒœ¼­ë`ºE»Î*D{,¹Mì5øÁÆá²µ¼µ+†‚SÄÂB”¢¬'°'ÆnlÞSÉiö”ÒÔËËeÀ0JV‚…sä¤Aæ5R·ôc¤ Zß¶ÅEñ1Þ’eÚ†zÜmâ§§qO´¥\*()++;³PPÒî©wN=x Ò”Ú-]nHTGÖe¶—¦ !½«þH¢ÜTxÛö-hhÝûon:Š7K0ô´ÄÁ\)¯¼ÚP›\¦ -¥…º…¦[¤3%d%!M4œ£r‰$6£R¯tc¢:ìª CJ„&cé%NT—ð¿å .²Þ ”¢y“œèÚ'NGÔ©ÔMÄ’g¡×k‰9õ²ËŽm…,´ÚÔ°T”‚w+Ÿ3V±û¤±z_»_ô÷GW½G§$Û—h‚ýÁhŸ r} ²µ–ÀC­”)E)îò {“žUÞ’ú@¸Xõ‡kð§[ìñ£[[¸N¹Î³Ê¸¶Ú]qÔ 0´8:âÂS”þW]e¦-¾Æå’ú‰®À{!æ£O~/%*J²ÊÐV‚•P¢Ryd ŠŸÑ¾’¸C|kœ¶ÙiL(¿y˜âä4¥•–¤,ºU!¼©XC¥iªo ´©ìt—¨'ê ËVáo ˆýÊ%®ÐíªWêüDº‰œT˜èZœeJá„­\1“ŒäOtS¬®Ú†ëw³Þ›J¤ÛãD–y6Ì¥õ>žbB”¼¤ÇWwœ((` s˜@iw¯]ŒI¨–ï@µr’ÚqÔ):Óip!—T•¬[ _tNì’k;Jék&˜D¡hŒò]˜àrT‰2Ý•!õµ%o<¥8¬@> F Ê»ÒÖ¤ÔÚ^¹Ùß±) €ˆÖé1Ýz]ÖQ'™Ø´†Éa[\﨔¥)$Öî}'jHRæOL+K¶µÌº[áFqGqCjbƒŽJZ¸% THH-¥m©D… Ýõ>€ÓzPG¿Ü“wnå1ŠÓðoS!´TTS†@æO3Œœ ÷†t{£ß»M¹È³%÷§!ä¾Û¯º¸çŒŽ¨0UÃBÖœ¥KJB” É959Î})Îs»\û¤ë‡ô>²¼B•bëZnÖ‹²W3N̉ÖÁâ˜1—Sͤm‘’…e`$”œnú¤Hè«Eȳδ½îäk‚R‰…WéÅÙ %+BY[¼mêd\÷¢­Ñ;sV«%²5žÖͺ#“]eÛU2kÒ9QQÜëÊRÕÌœeG`+SJÙ˜­.£^uçOk¦ Þgé÷m*nT¹ŒFŽ÷XµÁi§™oºVRR¥!(ÛÃG5¥{ ª†Ÿû m³tF¤Ô&é¶_bòÕ¾Í\› (‘§c.o)Aʞ„©”ƒ™fÐnϪ%êKrnìÜ&IrT‘Ù©ŠaçV J”Â-Ga8NÜmœ·Zà[æ\¥Ãc„õÎH•1[Ôxކ[d+à{Û-§¹Ï|’sFªÕ]½ëKÏFz7Wé›Î’TA Av·¤‡':}ü%ÔJNÄ4…I)R’s$žCnO2ÄX\°Ò¸ yE-—0v… Î2@'nÒ– {"@ØÖžÕ­H/-B:8a®@¨îVÁ·r²  ¹÷JÌÒ{•²UºXpÇ”ÊØt6ê›QB’Rp´¤œÍ$ß»#P\zHÕÐ:“a¹p.Q  Ä D§™KŽ"Bžeòœ’ëE–‚ƒKä$„ðÖ*:óÓÒ-6$ÔÙZv5Úç=³r2äuvÙ·öCª-ä¶µïK¤e|5Zá»ÄÿFAØPz,Ѭ¨³Çy™q·#!wùËTE6•¥&:ÔñSk‹Iá”䊚¤´ô}9O5o"ÛSSh¼áW¹J\RÊ·)\d…’¢wîÎNB­ÛŽ¢ÒÌ=-10W kï6”&×)‚Ëian¡i–é ÉY HSM'(Ü¢I ¨Õ—_Ü.Ö­:¹Ö…²Û¸ëŽ[$Ü„YDhØqÕn) ¥„àüÆÑ:r>¥N¢n$“=¸ó\IÏ­–\p(8ãl)e¦Ö µ‚¤¤¹\ùšÏÔv+v ‚ˆw$ÉØÛÖ×[±m`¹4¤­' PäG"GÃTk }"ks¸º2´ÚwŠËÕÆ}É7iH}ÖÐÃ)kKi;TSeKJÀ᨟»—HÚÖݪ¤ÛÓ©ä‰3âZí݌ʜS1ä?κ¥]&8îQÄŽRsg{¢¹0dµí ø1×;oÓ¢©([ŠuÌ–žIR–µ)jÊ”q’p*G´=6oï5szá%·Û»Ëqq’÷úAs§«g¼ ;Œ InŠu•ÛPÝnö{ÓiT›|h’ÃÂÏ&Ù”¾§ÓÃ,HR—”˜êîó… Ž{¡t®–²i„JˆÏ%ÙŽ%H“-ÙRPRVóÊSŠÀäQ੪JAJR¢”¥(¥(¥(¥(¥(¥(¥(¥("õJËV9®’ˆÎ«™&«È°w â]&ãº)K`üÀ¤à¼Ôþ®éë€$Ä{û†µ×JÝ鎒cÁ~sª‹2:‘ÃiZØÝ•4Iä¤II9Ú£‘T•¦£€¨\Re¼ú% K¡õí?2gû‚ƒó°0<%ÇÎ2=zv„¸ùÆG¯R” ‹ì  qóŒ^á.>q‘ë×q‘ëÓ°0<%ÇÎ2=z‰cZ5.øå¾Ý§¯³á±0Â~èÃMuVž Ú¤÷N®åJB”¬‘´ãòͯ,2b4åÚãm³I‘tn‰Tä%rU[±²€­¥E\0­ nÇ>ù ~ÀÀð—8ÈõéØãç½x ]¥ Êu°j{)oiOÍ×ÚâÆm$-ÄnÊ7 ’†³¬·kUîÜ‹–ç ç ÂB$D}/4¬)$ƒƒL˜xv„¸ùÆG¯X´˜W¶cGzJ˜~;«RyNáHS`TIŒãïsÌêþÖ¡dýñAù¬Ÿï±A©þÊ?¸Œ|ÅÿÞaW2WMý”qù‹ÿ¼Â®d«8„)JTR”¥”¥”¥¶×A?t¬Ö¯lJÔµ¶º û¥`þµ{ûbUÓ”—OE»Ý%ÇD˜ð º77ؤ¨¤÷‰ ŽxÉï×ÄëÕÚIuËk.--€ÔÒNå'í2@ïü5TÖðµmâSENjápšØ¥rZѰnCkÈ ¸G ³œå$-9F<ˆi8’Øv<†aÛu§PR¶Öž)P<Á`ƒQV®¿züF×—ì¨g^H Á„A¿e^Ô ®³§mLØäØ™ÑY»L¥ñ$ABR#¼¼ƒ¹m†v¨äd|³WKôå‘Pá-§"G.å¶Ñµ!<,$ €RF1ŒT­(!cZãÆ¿=¤ôó7wÓµéí¨&Cƒð)ÀÎâ?9¬›ËOÞ­®Ûo =Æ ÀcK|ºÒðr7%My€yŠ‘¥~]†Ý0Û̽¦d` Å WT¼Ë=Æ01·êýb·Æì¿VÑšežÍîì· %=víÜ|3ï¹Þ¼îÎw«ðšŸ¥e‘‡lv¶mvM?f¶@cw ,7Ë-7¹EGjÐ*$œù&¼îÐw— e×LX§É€çÒ\â®:ùwM©L’ƒÈsï —¥vç§mW;ªî×-¥¦Ü\el.\„¥Ç”ÒÐ[Z ÔÉQIB”’3‚’Gx×Ѱ[ŽšN™í/Lv ”Ûpžª’TTp×`î‰W{¾I«)B¬8NÜ Ãf+M¶,fi–e)m `%) `>XH¶´‹Ì›Ò4­7IMpdM ÷›ä6-|ÊO!Èœr3J ¢ôvrÍØUôw£•këk©,q°SÄÙÀÛ¿ØÎ ímÒö[dèíºI—niLÁ~;hmÈ­¨¬© ©,„’ã„„àêü&¬´ ÃžäùðdAh¶J‰%¥2ûJRÛu R’Ö’ D‹ì »µ´éžÒôÏ`ÐIM· ê©ÊŠŽàìÑ'½ß$Õ‚±®I+Œm×Õ´Žès<Ç!ðŠ§¬^Mµ/hí4൫p^Ò!‘ŽmeŸ{ïµÇxW„-/e…¨U¨áh='ô·uW[B$•¹ê.†7nVådç''=úË,My~øŽ&ÅÄ_q…§»äƒ‘ðÿgèb`*ã6ûƒŠ‚îÅñÜahîû”Œÿp ImkRÁDG¥l˜ºCÖ$6•€@XJÙ + PÏþøÔ–ˆº™–˜ÔšGNÞšeEM"àD„ žùlœÍS” „fӛ̫Ó:KN·s˜ÙnLÄ(ßAÆRµ†w(r‰ø+ïOÛ›ÓÑÜ`ÒÖ C¯ˆãpWÀJÕñˆC üõ1JKŪ=ælI×'§®2¡«tWå(:ã9ʦIIÏàÅ}"ÚÒ/2oHÒ¶Ý%5Á‘4,ÞolZø;”žC‘8ä*f”†t­›<‹3:I7l”àrD44€Ã«å)ª?ÎEM[×:ß ˜0,öÈ‘XHCL1)Hm´ŽðJCXù…fÒ‚5ª<[ó×øÚOO3w};^žÚ‚d8?œ î#óšð»iÛ]Þ#ñ.º#KÏ"_]y©)K¨rFÍœe2Asgs¼óÇ,â¬T ¯¿a·>meý¦]6„¥Ò°•u$§!œ³ï```'À©‡f]iM;n‚¶Ö’•%STBï‚8\ÅdR‚²Ö–²5f~ÊÖ‚ÒhµÉp:ü$¶€Ã«í)¾Õç"¿¥,K›nœ½¤U.Ø”"å¤"% +@i\  %D¨ã’9Õž”Ö{kVi× Ö+`·K¹;ÆžüU†œ”¼¨ïuId«+Qʲr£øM{^ã¹|·.Ý{ÓÖ[œ'+1î3JÇ{)SD“¥zNŸ¶Iñ#Déw»ÄJUÕ1ÞáežãÿÁÅ|]`[•2ípѶ¤\šêS¤€…»!•á7JšmžI)$Œc–*ÉQZ§îGÿÏgüTÐxY&±ÚÙµÙ,0mÝ‹ ´Þå¨JQ$àwÉ5›ÛÅÖ«P” ›íŽGâƒëÕ§lr?X>­BR‚o¶9ЬV±ÈüP}`úµ J ¾Øä~(>°}ZvÇ#ñAõƒêÔ%(&ûc‘ø úÁõiÛÅÖ«P” ›íŽGâƒëÕ§lr?X>­BR‚o¶9ЬV±ÈüP}`úµ J ¾Øä~(>°}ZvÇ#ñAõƒêÔ%(&ûc‘ø úÁõiÛÅÖ«P” ™:’Yu–Z‚ëËØÖp;Ä’NÞðšËë÷¯Äaýy~Ê«±>ì[¿¦WøNUrïjÖŽýp®¶Wú¦ŸnÈËwU¾‚¦dáçÊZJr2èÎBîÉÈVņɷ\—"DYqÃ/0®åÞ"•gßI#ࡲىɴÀ$ÿòÈôW…·ï‚Í£ÿyÚ– ƒÔë|M7wr$±Ö`¼ ši)$l<²g׎«û×»|Éïîö R” R” æo²Sîõãçÿð$V–­ÓöJ}Þ¼|âßþŠÒÕue ¥)QJR” R” R” R” R” R” ½t#÷êÏô±?~TZ½t#÷êÏô±?~WNa'È¥)QJR” R” R” R” R” R” R” R” ñÒ¿zöŸ™3ýÁ^Õh¹" ž ,MmøÌ!—a:à% '!HIdsïx<¨,Y¬;Ú®iµH6Vá¹pÙˆâ[ŠC!_…E œþçŒdg# ³q~,ÿ7Hõ)Ù¸¿›¤z”ýû¦Ýôl›´Tµt¡*znŽ^Cî&:^ÚÊ07!´ç¹Xà7×Gµ5·CÚ k+¬k­ý†6M—-º¬œ Âv‚p2A8Å{ön/ÅŸæé¥;7âÏótRƒ\[$kû=ÝäÙô†©bÃ"àä÷`½Òëé[®—^CoöD¡kRÉÜÚˆÞpG,e\º!~CWxñµ#-1|ndk˜vØYŽüé2ÂXWpœO[Z7°v¡[AÞÍÅø³üÝ#Ô§fâüYþn‘êR,(—~‰$]ŸÔmÉÔÝNÛxRnµ™ !õ¦ä!õæJssxRš •ïY8%%6ŽŒ4“º>Ñ:$™ÌO“6r¥½!±+.(¶Ú2³&L…©Xl ï‘‚LŸfâüYþn‘êS³q~,ÿ7Hõ(&Þ¨Y?|P~k'ûìW×fâüIþn‘êW‹.õÛË2YjBYb;¨RÝeMeKSd8 œœc˜ïóÀj¿²î#1÷˜UÌ•ÓeÜF>bÿï0«™*Î! R•¥)@¥)@¥)@­§Ðëëƒßu겤7|‡ Xan(¥);AÛ§™ü¿Þ:²•bh:¥­|ã †£Ùµ#,§’ ©Að¨äà|5ñ']®Jr,ú™Ä´àŽñÊcƒÈóüø5Ë4¥’î«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúúj{¡Êñ^¥ýý5r¥)bî«÷C•â½Kúújó^*BR™6]Hò °‚Ú€ÈïgÆk–)KuGom|š¿~ÏaNÞÚù5~ýžÂ¹^”±wTvö×É«÷èÜöíí¯“Wïѹì+•éKuGom|š¿~ÏaNÞÚù5~ýžÂ¹^”±wTvö×É«÷èÜöíí¯“Wïѹì+•éKuGom|š¿~ÏaNÞÚù5~ýžÂ¹^”±wTvö×É«÷èÜöíí¯“Wïѹì+•éKuGom|š¿~ÏaNÞÚù5~ýžÂ¹^”±wTvö×É«÷èÜöíí¯“Wïѹì+•éKuGom|š¿~ÏaNÞÚù5~ýžÂ¹^”±wS/\4¥!iÓº… m[´¡ÀRAø þzõ÷C•â½KúújåJRÅÝgmé$Âqç{Y¾Hyí»Üy“„çÈ žðøMf{­9òFéú'½•r)bî·¹ôž©öÙ0W¥®Í&C+h¸yE@Œã„3Œ÷²*OÝ6ÑâMKæµ×Ò–.ì¯tÛG‰5/š×OtÛG‰5/š×\kJX»²½Óm$Ô¾k]=Óm$Ô¾k]q­)bí½ÓÄäÝÕ>ðÌY±ãÉ“ (£-¥e H PçðYäGæ­CJRfªR”¨¥(¥(¥(¥(¥(¥(xè]|-X_(uh`GyÀÛjqA™J!)œO!ðU•bi5·ÛÞœð—?4KöTíïNxKŸš%û*âJRÉwmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wmö÷§<%ÏÍý•;{Óžçæ‰~ʸ’”±wE}·˜7Í<^·&b› ĺ·¡<ÈI\˜…#.%9'b»ß‚¹Ö”¤ÍT¥)P)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPÿÙmdk-1.2.9/doc/img/ss_mix.jpg0000644000175000017500000014235010770465100012551 00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ&Š"ÿÄÿÄ[  !1T’”Ò"AQSUt“¡Ñ5Ra²³Ó#&234c‘£â6Bbqsu±Ã$Vr•ÁCEä%Fd´ÔD‚¢¤ðÿÄÿÄA!1aÿÚ ?û^õ)^8Ý%~é>q^ï…ùËÿÍÿ°®G…lO›Â{<(i[¨T9n­‘u~IJ〢¦A*#Yš»IóŠ÷|)¤ùÅ{¾ò·xQ.Ór¼Ï‡2T¥·jB–™JfÜSµXSˆNI@É+NT¼çÅ]ÿîÏ^ø;ã!,]Öu éZ’(RÓ¼ à)X'8 ÕÒ|â½ß i>q^ï…z®ÿ2Öß g3v¿I·[#9¶n2T²ä€²†’¬8¯ŠUÌ(;'Î+Ýð¦“çîøWÎo9¿XâÙÛ‘3r¶³"Bæ-¦Pãäam8óa’@^5ËZ' ®6¨÷(¶õÀšò%ÝÖˆ)meöŠâ\^½ ZB0Þ¡…g ÓôŸ8¯wšOœW»á\=Ǩ]Áæ­S­Š€”ÅÕqw.3¸djRÊT‰m#zp¥ï>*èx+v~÷`Dé…8dHkS ! Ko-´ 'xH?ëA¯¤ùÅ{¾Ò|â½ß õ\úï>ÃsÃÞ]Ý M´/*KR· ¤ù¤¥ÌaÓAÖi>q^ï…4Ÿ8¯w¾mráDî .D¬0¤³,Grã'A.EŒ ^S4ⵑ¨¯8l 'qî]˜ËË·Æ1؆ÅÊZšQt7i@:V’R¥m”2 ZæÉ¥²÷IóŠ÷|)¤ùÅ{¾ZÔô™ˆOÍB-Æ[Él”¬¤’N3Ÿ[­Y«¤—sqçIóŠ÷|)¤ùÅ{¾Â]g|9l9tSêvTvÚ‚Üçu”«H$1‚‡‘’T¥àršÇá ¯ò¿Yá·¨fcl…-@ ¶µáÅ„ø8liÔ•àÅ}OIóŠ÷|)¤ùÅ{¾ó¼#œÓ÷·ßá‚é v"üxÂ2¶3 ­iBKê‚‘´Ærœ '­wxW}ŒÏThrc¹6á ˜Œ´°òŒq!H:µJ¸¾’yÕœø¨;}'Î+Ýð¦“çîøWÍŸáýŦe–®œ’†SBR?Æíõ HZÆÉ8N´ÿXó#è©Jgƒ1JÔ§ã¶é;"ÞJ’æJyù‰8æÉ ³¤ùÅ{¾Ò|â½ß õ_<¿ÜøBÅ¿‡¦ \hÛM¸8Ó±¿ìYQÙ 6¡¸’¡á'*'›žƒè:OœW»áM'Î+Ýð®"çÃKŒ.·eLX­Æ/°ÊL‡ZmO¥Í:–‚·’£¤¨)my)# Øœá|Öm–kb^·²‹tDB(_y·#GRœIÕŒ#h¥ø)ߎržKáõ-'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPyÒ|â½ß i>q^ï…z¥'Î+Ýð¦“çîøWªPF ¤¡JÖ­Ã>/…I^\ýÿòšõAà*VAÞs¸â›q²ÂºHKò¹¡iN€#O“8É;ÒÚÒ ßÏŒóyY2d­÷›•%¥8ñI'HW0Iñ(W”M©jЏí%àØssħI$séçÈòPXa-ÇŽÛÚ”6„— –¢Æõ+%Gé$“ã©6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÖ+·GÛè‘y+mAi]¦-$ƒéS„(}|u­ªW™gÚží5Jó,ûSÝ ŽlvgÄ\g•%-¯,:ã+Üs¹h!C›Ä~Šü%²pᲦ˜o:S…rI$ä’I$ï$æ¥Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SX¯ðjÝ"C®Eä-Ũ7v˜„‚Nw%.‘ôñV¶©^eŸj{´Õ+̳íOv€Â[¶µ(m! .-DêVJÒI'ÇRm‘]SQê•æYö§»MR¼Ë>Ô÷h$Ú"º¦±XàÕº<†ßD‹É[j Hrí1i$ïJœ!Cè ƒã­mR¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»ANÙhhSˈ‰Çôí]}ç_qzs€VáR°2p3“å­  ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÖ+ü·Hãë‘y qEj ݦ! “ÉK€$}Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐI´EuM6ƒÈ®©¨õJó,ûSݦ©^eŸj{´m‘]SM ò+ªj=R¼Ë>Ô÷iªW™gÚží›AäWTÓh<ŠêšT¯2ϵ=Új•æYö§»A&ÐyÕ4Ú"º¦£Õ+̳íOvš¥y–}©îÐzZ‚ ²F?4Ô•]Ǥ4ÚœS-iH*8tçÿí«p´ôõ†Ô¿û”‚fÞNÿ%FÒÒïKˆPR I0Vª•OðV¬JAð§{Îñ¸xëÄEj½%ZÒ¼Àlê@ÂO„w¢ƒÅÇ„(…9P£ÛåÏ’ÛiqÔFSIÙ¥D„临 úU¸ÍýÕêÏ®ÒdÄ\)PeÇ RØ’[*(Vp [Z’FAùÞ9«¸L¸+…h6öä—gá%Å©(JQ:òµ%*)ÜêÇU¤Y¸I&Gq«bÙí#Þ%2­9Î2†AÆk•Î̵}¨R¾_' ¬÷8³vÑv  ½~™ :‚… aÆÈNR¬ŸÄ×Ðí]ìñ.-¶¦Ñ%¤º®täg·ŽRúkâR¿<(˜Ó×›mÅ-ÅÙ¹%ˆª†Ò˜K)+Ò—\ $8Alœ):HP)5öµ­  ­Å%(%J8¾/à pR{.]-©Ó.QBà[e™ yÅ8îZU ¸¡’N¡ŒçCêü»¢û`ƒtBJD¦î’7@{ëN¾ ›ÍÊß.àÕ£„•2++h#Rxm(Ãj%´¨)#* .+›#O×ø#{< àÌ;‚ÖÚžZ4¼[B’¢|€¼ @óÓbÅþs¶ûb]dáÇeFŒ»)¾†Š†AdŒŒdW8ã’Zym+…W¼¡E'öo ´ï­žüüÒÝÿï¬ù/é˜úxÖœ8¡Ž3ŒoòqÜ?¸PV¾ü×{ö–¿»­;<ù-ßÞ³½1ù¨X˜‰[OÆ)ÐRvIJH1‚Œï5U2ýgÿí÷UîÿÂ#Ç:³c†sœçñ’|y9ýçûÍUJWÃÙ©~³5"Löâ®,µ)%ºÆ¥…°NÍI'Jçòš–êm-ÔÛ¨_míp”XqMÍTtHoRp‡ŠÆ”«ç šŽž|o±«_TέÓpqÇÒØSÏJuç • ¥kY))*Q$`œ×kÀ^I¿A‰[‚3…¦æé Lt¤àWÏܹYRÁØ*s¦GD¢òÝuèJ5ëqJ'ÁJRAÈ)È#Š„ð•ëÕÎ;ób-‡å;d ­)Ão¥3ž;Tr¡¼þ…C 9™Ë陜¯²Ö_¯HàýŠEÉL—‹eCaaKZÒ„‚£ù£R†Nü œjÔ¨&DbáD)(+!¥4êBŠu%Cd`ÇœVÛR±^Sz„ã……G“ÓK ÞpHJ°5$…$…xÁä Jù{I»ð#†°Ò®ˆ¶Òö‰mN¡³à-Ó‚B›+Q”—B€$hÜá´ÙM…|L%Li°äuA m¹ ­¤U¤©.)ÉPNiÀ)Uf^_ku¿ê•7ë*SŠÔ ë‰b¦·¨…o;€ð¹•ùÃq=i»„WÙ¶˜½ÙrTVd–¹-gFÑ ^œ™C8ÕÏV…âòüÅcÿÒ—ÿòê ÉÙð:Û£L¥6¨™B“ù¿‰GöÇûVS\/•à‡%\»d–¶ÍIDu:ØÃ$€¤ÉÙ²ð‰Ý´Vt§Á›ƒ7Ù÷íÚÝ2T)H†ÌwôXÊg%ÂîAÇ3˜ñŽs]Eq|˜Ôþߤ±5¹Œ¹C­þi¤so5ÚPA åIõ€ãIY›$f§ª–¯’!€ßÕS„snðlλbµr•Å^,—P„$Ÿë¬©IÊGÃvIóû¯á‚T[¥ÂÕ‡%¶¹ ÆX’V54áF§Q¥%)ÂT­Ê9ÓŒê_xdž6ä ìWØ©LCžm«yçAÝåÒN 9J•ÄÚ?éî×kvuÒ(¹É’äGVpðp+dÚ’ÞU¯ÁÏõq¼o¯7ºÊTA~U­»z \äÃ…r‹3Sè[&BâËa*B´(•c‘R-}’•“ÁÉ·yÖf¾Z¶âŸæC¨ZGõÐR¥a'ÈNFñ¿Ÿ|$2îæ&xÈ„öÇO>½N?×Q–›õÒôû‰àüV8«j(㲂”—8:’ Nsá3âÈß^á ÚÃ%¤ðŽIÕ„qø€¥ (œ ¢ $'8‚Ž?ޏrGÓåÇ7ó¡xóç-´mÊõî/;°Ny•žqó³«úÚ¿5¶ñç­-êmæñ´ee%HÈÏõIœsÎË(m{°U#êú|ŸéY2?V¾ÄÄ©™­+!À•Z÷c>0ê÷ùãÜk´ÿ¥8èö6~<àÌTèˆì¨jRÒÌ[¼†[AQ*:P‡R2IÀT³k.œÇà™&eÑ×AJ¤D'IÒ‘1`§ ús_O¬k5§ƒ¼ŽX´E )JË!!NçÕ΢2w’Nóå­>9¤³×Q«äˆ_à7õEW¾ÞÙàýµSä²âã áťƞl—‘¼á#:‡‹$]ã‘zK=qQºìÒó‘œ :€YIÁòï þg¹ÞYU¢u¸6[o‹˜ÑÒì¦ãiKò„­;L§ }))Æí$c¹ÂðêŽ;À¸ó$ÌmÙ] ¶·[ÚeÒœÈ:µ i'' žzû«‘ì¯-+u˜ Ry”¤ ‘R…[R ¤˜ ƒANêÌÇVÖ²Îå$¼Wàýñ¾ÚÛ¸±dhî€Z2”—@:€ ;·ã<Ǩ@ ‚2Š¡ã‘zK=qN9¤³×¦\sœ½Ùpðn\w ¸²¾!0”¥¥“³ZAÒœïÒA;°7V?x%ÂûõšR¥Ïl£jÄ(€8—\IÔÔæÆ1€3‚sŒWÒxä^’Ï\SŽEé,õÅø?áóü"ýšðÂX¼GAp ‡›I8;Р­ÊIÆúßVsìñ¦¿1†á7*F«ÉÒ¼ žs¸U¾9¤³×;á<ö!ÛxVÌÕ)»|»ª™˜òR’¤5ɬ¬„j kV€ÚI8 q<üÇ>ÕÂVfðòcðsZŒ¸Ò’€ë CMœ¥K…3ãm~-ô¸p_ƒW9²eÉ[ÛY* {es}¤¬„¥”¡ÀœéJG7ˆUCÀN’ ã9òÄßÅ §ÂL–´€ÿŒ@;€é-ù®ö¹8Ü à”YŒJB·Xq.·¶¹<êR´œƒ¥nH;ÆG=tÜr/Ig®("‡úÔÿñÇÙ¢¼^!9r³Ë†Ó‰iÇ›)JÔA'ÄHÈÏï«r/Ig®)Ç"ô–zâƒç­Ý%Z²D¾Cæ¢0c™o:“‹ àoñï#5ù7„\Èiw«~YüSˆNý$gŸ›×~ëÐ_F‡]Ž´ù EAÅìÿ2ÿãM+ƒS`Má¤$Ûe·)¨ö÷µ6­A$¨å篣U&y6:µ2¨­«Ê•$Tür/Ig®(0xT\mq^Lw^l%Ä(6¬js£>#äß åÞ¶]¶ZÁÎBØJ³œý'?œ¯.r;W㾈©10§Ù#éX¯;Xv?\PqüÚ¿[üQæLt¶6‰'$ø‰òùO9>=NwUY2! å/0?¹b½ñȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ š•‹ÒYëŠqȽ%ž¸ LýJGøjÿjš©Ê•qB_iJR “йA]rUµ[lÆyòŒk-é$ïÆTFüoÝåZq‰>“Ök¿^ =<þÜ}š+Ƚ۲-ÄI,¥6–V¬­N”8ÎrFâ7oÎ0hbO£dõšïÓŒIôlž³]ú‘Û‹1`1.jW:¶›Ù¸”‡RP”ŒêPq¾®Pgñ‰>“Ök¿N1'ѲzÍwêK•Å›\TH}+R!˜à u:ê[IÞFíKú3ÏÍW(3øÄŸFÉë5ß§“èÙ=f»õ¡J þ1'ѲzÍwéÆ$ú6OY®ý~Àº¢çdu‰õµ5¦^m³¤-(sIʲ¬x!Y8'˜ã'ß Î2_JJ•n”7’ gÜ“þ•,[=#ý^HÿÞµk˜)m <ûéi–ØIRÖ½)HÀÞIæ\±lôŒOnŸ9bÙéžÝ?£ããHƒ5©,€ã…¤ÿ¨8«×óÕûè&å‹g¤b{tüiËÏHÄöéøÔ:×óÕûé­=_¾‚Ç*[öeÎ?@:um“Œù3šóËÏHÄöéøÖjÔEå•B•ÀOŒ€¤cýÏï5áWûb.\š»´4ÏÈTÉHw$dxÎðAæñÐjòųÒ1=º~4å‹g¤b{tüjkùêýõ²K( Qt‚¤§ÀJ”r¢Ü3»'yæ$àh-rųÒ1=º~4å‹g¤b{tüjkùêýôÖ¿ž¯ßAu‰q¥cÈià9ök Çî©«>ûóJñ˜®|¸R1þç÷šØ R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” ­äÇGÖPÛºÔmKQ¤ÉH%Gè“â®&$¨Ìp›Œ8›²¬Ì<ìÈ‘…Šv´Htadþ'F]Pú^<ÚEwP?O?ÖÙ¢®Ð|ÂÝø7CÜT\ˉ6÷XT¦T†YŒ•¶­mêl,²âHÓœ(ds¤l+ƒ7”©ÈÑ£Z£À“>õ¡,q}‡ i´†ÀRqÁWƒÏ#œvô ù”>ð7“>T‹jK®´ìÆ”–‰l?¯a:[txjYCÂÞMop“¼»2õ,·Rµ7Þã¤ê!òæ:p]F2Fþ½}(8KÇ$žPfÆÅ±˜Q;Ô'KŠmO¨…´âަN¢… ç¢²p&ålzÖ¹ÌZîÉ‹”$IpŽ&8ÃŽ%Æ@kN½ Bp€6i_@¥Ï"þƒƒíÄL^‰3w ¨q‡‘ÝYÓ•a,¼V1¬ ÀœGÿÃy Ø B€ôX2“hç<Æs!ä®:$¤êNy9P8cIôzPs| °Êàõø’‚¥ÈS©Co¥Ä!%)HC,¥ !䜜îÁ¿¿nkͦäã(eigHrR#•-$,iRÈN¡§PqÓ¿vkèUÏ3i¹2ÃmiŠt$';eoÀÿÉAóë}ÍÛ½µqáÜ5Á;nìh—éšìPØO„¶T)Þ<rjÑøYÑpe M’ü»jÙŠS5¢¸ùAR”¡áèq Vœ’[Þywœ›rù‘}²»”äÛ—Ì‹í•Ü ãµ]Ñm[…wÝvæó’XjyK‹‹´wf–”V7)³¸¤ài'p³¶þÿÔÐßisÛ¶…GÙ·´)–ÀHq“ (YV‡Nü‚N+ºäÛ—Ì‹í•ܧ&ܾd_l®åE‘ÊÌ€çÖE|úõ{·—øSe\‹p]ÂWâä½qŒ”G;š*RK›@´-µiç}}!V‹’¤¶ö˜¾Œm•¿%'ægßRrmËæEöÊîPq#ð‚g X¸C˜ó¶w\aÆAM†paY} !^ÔpàŒ€+Ûvîj »!òÜã³i“áIgŒ¡n8æýä2ûÉÚsêí96åó"ûew)É·/™Û+¹B¸m¼%U€²Ên(¹‡›3^rfÑÒõly1¨¤ã-nÀߊýoá•d[ܨöȤH>–šJvÊ9VÎI*PF7+js‚UŽû“n_2/¶Wrœ›rù‘}²»”ž óæøÏ«;õ›­ŠÊfÝqfj$ìâ-©½;uX¤çó?³ï«Ø¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éPbãÑ¢ö…w)‹F‹ÚÜ ž•.=/hWr˜¸ôh½¡]Ê éUzthî>ähû6ÒV­2NÉÇÏVè"úyþ°>Ív©@ý<ÿXfŠýŠì© S¥ÆC!dz ^ Š;V:[¸Eqrá"[“£>—-áØðCµHR ùK_XÕ”‚T@¤§›q!ÝÒ¸‹g î×GŽÑ·%×d¥­¡Ð½´òÈ(måAho*ÉÜ1šÕ´ßdMá,ës¯CR"8 ) XHÖ°áÒ­ûÒPùÁ84*³¨š\%™ÐVÁQê?Ú¼ìî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥TÙÜzT^̯¼¦ÎãÒ¢öe}åºUMÇ¥EìÊûÊlî=*/fWÞP[¥C ó& wÈ .¶•®×Ör aÆŸ¹GÂÐãnÅR’â!iÊ Žq¿w÷Ôíü±'ÕÚúÎP.¿#Îõw>©¯uâëò<ïWsêš÷AÓÏõöh¯VßÕWë}ª«ÌÓÏõöh¯VßÕWë}ª¨9î_fÛQ©ÇQ=ýojj’ˆCc˜¥´¨€¥”$œnD] ®àÍÚÕá;-%Ô…n œ!Äyjq‘%RC-‡Ô€ÙwHÔR !9çÆI8úMŽÌföl2ÛMêR´¶‘•IÀñ’I?I ŠGë¶ïXWÙ9Y³8EpÃX6Fì’݈üw\T”©œ*`kt Ú¨(ê'NFjü×[fD]Z[m’¥¬à'ñkÏ÷?Ö¬r½³Ò1=º~4oN<Õ¢BãÈS4-Däa)ÚJüÔê8É® '/³$ S·IP–‰Bßq¨ÆJiŽBݱ;Ÿ[‡FN„<,×w"u–dw#Ê—öVÛ®!IPòw aðAVæíÊc0[^ÑŠÙ¥_8'˜¦‚÷®]¸3j¸È@mùpÙ}Ä$`%K@QýMp²¸K}9øæâñiöP¦¤Êj9F%–Kìl‰üZRéV:¿7ûUß‹½¬ÂŶOƳØÁ8ÆQa›+FX"NÍ-'l8^?;ýjÛäˆø'>l¶nQæ¾ãë…3`—^KaÅËN½Ÿ©%Å éÝàÖg.·K !˜ó$k™;€"9ŒÞÑIIC›ËûBR@ ÑÙ5ÐB“a¶ÄDX/ÛbÆGæ2ÂЄ'Ǹ ¡q<zäÝÉÑh\öÆ)["êGоqûè08~ºÜn6þ;-O·r¶®ršSm¤FZTÏ€ŸÆ­i•ji^*Öát›„x*Ý"j]jS0Sº°ð¿tèÇH*ð“ŒU¸‹àä $CUª;ÒU­÷-¡N«Ê¢7¨ï<õùq<»´†®FÓ5´+R'fàIò€¬àÔá× …w™j‰8ܦÒýº:£²Ò2„G*sÂPNÝe8À•jß]ÝéÇš´H\y aà…  ¨œŒ%;B©_šG#5UGƒJœÌårI˜Â6lÈ;=£iù©W8ÎáV$N²ÌŽäyRà>ÃJÛuÄ)*BãTp‘8A}™ ZºJ„´H’ûF2PLræí‰ÜúÜ:2t áf»®\»pfÕq€Ûòá²ûˆHÀJ–€¢úš¢aðAVæíÊc0[^ÑŠÙ¥_8'˜¦´ÅÞÖá âÛ'ãP]ª7oÔ“ë }ªk÷•íž‘‰íÓñªÓî¤ÇCLLŽë…öHCn¥DáÄ“¸ &‚ídp®l‹oïsâ9³“ï2½ éZ[QIÁÜwÏZõì3*;±ä4‡˜u6âB’´‘‚;ˆ#ÅAˆ·fÇáäXü û¥À’ñŠ´7¡¥¶¸é$$/xqyԣϻ­úÌ{ƒv)1s~Ënvà•‰KŠ…:œi:ÈÎFw`Vi®Û½a_dåfÌáÂ7 `Ù²Kv#ñÝqRR¦pt©¬eÐt'j  S¨:A«ó]m™uim´>J–³€ŸÅ¬o?Þ@ÿZ±ÊöÏHÄöéøÐAÂ.Òl¯5c’ˆ×¶ÊY‡V2P° @P¡X$n®<Éálø!0®KiËK¯Ç¹•KŽó˜iÄ)ªAJPµ ho~2w]|é6 œ7!ÏzÛ.+˜ÖËêmÄ+”Çþ•EÛoß;°¬1<]µ´ÉK9Á:0œàgAA±j¸5w³Â¹0•¡©‘Û„¬aA+HPéÁ®BÄxHÜ•p„™©"’ÜÈnGq(Ù© sJLdhÔV0»8 ‚k­kX „00'ãY ZøÄ'á3ƒíÅ‘§lÂd!Ý'#R@ÁÁÞ3W¢ççH¹ð6Ç>c›IR­ñÞyz@Ôµ6’£¸d“Í[m<³GT{Y´ÁaK+Sqvm$«d„àg ý®r½³Ò1=º~5Qÿ]¸úÂ~ɺ³Tá:ÛÒ'ºÒÒãk|­!_‹@ܼþ•rƒ™¹_¦[n÷À†˜ÔKlG˜ŠÃ%jS®;!ø * èFw“Ž|þðí.óÁ¼÷Ü~[Rä°ã«ˆ¨Ú´<´§PBGÐA ®„0Êd.BZ@}hJàHÔ¤¤’O9©X-GËFXf: i ­K)BBAR”T£»ÆTI'ÆI4U(ò‰fyöa?5ÄÈ{ 0P¼¼¡¸­INî}äsywUÚ¥á 4u´üÈí8x”8êRF\Q‰òh!à…ê_x+nºM€ä7äGmÅ%E\Ô„«Z4­D ’pB·o±øAuº[øI Ç™ Ã\ÈÑÜÌföŠJJÞ_Úr’HÖŒîÉ®Ÿ•íž‘‰íÓñªN'ƒ\›¹:- žØÂ%+d]HúÎ?}<vo¿B›q~¸%–^} ¥z fÁÙ¡)>ŠñT<-c„‹\Wì“Ó+-ºe >ÓKYð SŒ:œÈðyÆýÕ-¶¬Ò"×Åõ ¡NEm–”SpJpq>S\[àµáLªæ‹<å0IhÉ :[Î3§Vqœo  Ï¶Ý¤Îá5¢S3¥*Ùw´;90Ÿm )1´à„ëÎVAR†Nì`WW\ó°8ýÍ77¢Xœž•%i”¶Ù.…'HYß‘ƒØ©ÊöÏHÄöéøÒË·êIõ†>Õ5-RŸp…&:bdw\/²Bu*'$Àù5v‚¥«äx>®ßÕnªZ¾GƒêíýQVè1Ïô8ÿ—ÿÇYWUÏ< ØÊÜ›-–£6R¢ØR@RÊÀ:S¨êÁÞÁ$ Õ?Ðãþ_ÿy†ú˜·ÆalJJÛi(P⮜;ÂqAÈÇ7Û%—’DI4í½ šZ†´©@5©¿ ¥` ¥88;`Ì <¹Ûԋ“â¦[fÛ­RrD‚RèÐK` ¶¤ãNuœ€+êÉçÞwîÜ7sÐxŽêÝ»¤-…³¥…cYVTŸ&Fìy|ue¿–$ú»_YÊ9åVsϰsë"¤oå‰>®×Öruùw«¹õM{¯_‘çz»ŸT׺ ~ž¬³Ez¶þª¿X{íU^`~ž¬³Ez¶þª¿X{íUAn•Ÿt¼Ä³ž¢ÌgTPd«¶Ž25’|óÍœr3b ±:R’ËÌ¥ÔêJN•ãÄHñdoÁÞ3¼‘Aíù ÇJKš¼#¥!*$ã;€Àþê‹”óRû#½Úý‘úí»ÖöNU¥ÎŽÝŘ sžiÇ›F“á!G<Û‹ˆýÿA ©Ê y©}‘Þí9A¯5/²;Ý«s¥PÜ#¿ §i„êZÉ  xùÉs’`ÆRKMÚ®nÏK®4äÐÑu½šP¥¨zÆù”rVÉÝA©Ê y©}‘Þí9A¯5/²;Ý«¦1qtW6‘ä´—š^1© ƒûˆ¬8m3Ž72ÛrˆàglÂi¤§Z $·|/ à4ùA¯5/²;ݧ(5æ¥öG{µîÑwnîÃêLwã=âÃñä…´°°t’“”©$HÁVÚ·\š"ß80ãíGã¡؇ !;Õ¬ä¨ ¥$ÎF~PkÍKìŽ÷iÊ y©}‘ÞíAnás®‚Þí¶|œerãhBCÍ¥IJ”TJpVÊ >5Y»]—kB‹lÙÅAJ"(G€”ã%JZ’‘ÏÍœøƒÏ(5æ¥öG{´å¼Ô¾Èïv¨ÄP„ú-÷[æá¹û$¥­OéÙ‚ ‚ÎJÒ2@'ŒmN”aCr@Žü‚œa¦©k$€ãç$ÎH9A¯5/²;ݧ(5æ¥öG{µ“ÿ\ÅRÄvíW%Ï:Û€ghÖÍ-©d¨¹ €lø*'ÂæÜqÑA˜ÅÆiÑW´%¤¼ÒñHPÜE>PkÍKìŽ÷h. $ÈF¢ ‘ÜHÉ8ÊqÏZuFíú’}aµM´¥SºÜY³Ùç\ä%jbw$8–À*)BJˆ gËAr•;„(·ÜŽõºSÍ0f„'b—!(Õ¨ä©#!$w‘ƒ[4?!¸éIsW„t¤!Dœgp“¸ÝQrƒ^j_dw»_²?]·z¾ÉÊ´¹ÑÛ¸³NbSÍ8óhÒ|$  (ç›qq¿è49A¯5/²;ݧ(5æ¥öG{µ=ÖäÅ¢ÜìÙÅ!)m:–µ)A)JGŒ•ÒkðÒ>Ú-W7.ÇrÞ„6^kf”)E^Œ¸ÙÜ£iÆNê >PkÍKìŽ÷iÊ y©}‘Þí\…1‹Œó¢¹´%¤¼ÒñHPÜEs­ðòÚ¶òâOm¥³·ˆ¥4ŸûÔ¥°ZDïS€¤øi<Ç4ø5¹A¯5/²;ݧ(5æ¥öG{µîÑwnîÃêLwã=âÃñä…´°°t’“”©$HÁ¡AE‰ ÈJ‹z¼¥Ah) ã;ÁÄ~ú–«Gývãë û&êÍ•ƒ|álžd²úø“QsAm ‡ÝSH–¤¤aH$•ßš¿fº³{µ3pa »œ$ºÛ˜Á#ó›Ry³¹GŸËº‚ýU7”d/I)%¸î(dá8ç«U§õ%zÃÿjª¹A¯5/²;ݧ(5æ¥öG{µnè÷;tiðÜÚE”ÒezHÔ…RpwŒ‚9ë*O bE¼ -hCÍFzZ’Ë/9›j:µdêG2HÓ’3Ak”óRû#½Úrƒ^j_dw»Ulü)‰z––-ó&LW_BB%2\FN2¤þpIÂÆ X¼_[´9„—:SéZÑ"RW¡Ö¿ I’9òJ€ÓèõÊ y©}‘Þí9A¯5/²;ݬæøml~K ŽÌ·¢:¦g!±±mo©¤+$+* G2HÓ’3]%`¸0TS!ˆH.Gq#$ào)Ç=Z¨®ß©'ÖûTÔ´-_#Áõvþ¨«uRÕò<WoꊷAŽ¡Çü¿þ:Ñ»ÝÚ´0ÊÕù/Ht0Äxá%n¬‚¬ D$a)Q$³ô8ÿ—ÿÇV¸Cd7ȑЇšiøÏmš/±¶hå mIZ25$¡Å‚29è-Ú®l]íÍÍŽ—…•!Hu:V…¥E+J‡”)$î«•Ÿdµò=©Ëå÷6޼ë¥:u¸ãŠqdÔµ`oÀòÖ…”¥”ªó C¹ÃrøŒKŠæ5²ûaÄ+”Çþ”£ÜíѧÃsiSHy•é#RIÁÞ2笩<)‰ð`*4µ¡5éhBK,¼æ6m¨êÕ“©É kNHÍYà÷­¼³1kµÆm–BB””%*uA!:פ¥‘“õ—7‚]ýs„ÖÑé,Ëy“)Òã["4;«ÁA,2T':ñN‹v~ĽKK Æ–Èy“&+¯¡!™ .# 'R8$á@ã¬^/­ÚŽÂaK)ô­h)+ÐŒk_„¤Œ Iù%@k3ƒ¼6)̼©­¾ÔHʉŒR[;1øÅj;Eée¤…a;‘ÍVïö®²¡Ì‡1˜Òâ¥m¥OÆÛ ¥jBƒ©>SM©*ÎâžcN@ß ­Éa1Ù–ôGT ä66-­à•4…d…eAhæIZrFkbërbÑnvl€â‚”„6KZ” ”¥#ÆJˆé5ÌGüµ ø­Æœ”Û™TWӑžR˜KA:]ÈÒ“ÅØ*N“’¼WG{µòÅ©ÈaòÚÛy§Buhqµ¥Ä+0”œxéHÉ<4¤6‹UÍË€qÆÜ·¡ —šÙ¥ QW‡£.6w(çZq“º·áLbã<è®m#Éi/4¼cR÷\’8 !£Ü¢7r-K_'ƒ$¥”¥(g_£‹0Rug~q]MªÜꢄ Ù¨± †ã¶Tw”¡!#?N |<¶­…<¸“Ûilíâ)M'þõil€Q;Ôã`i>O1ÍlÚ.íÝØ}IŽüg£¼X~<€¶–V’Rr•$‚ "¹v?›&Ê®hÄVRͽMÄSZehS§QÚ¨qfŸÁF©¯uâëò<ïWsêš÷AÓÏõöh¯VßÕWë}ª«ÌÓÏõöh¯VßÕWë}ª¨*ß,_ØjÇ3oÕªDpãð<Tà»y oÆA¹‡âÁe‰2L§[N’ò“¤¬bG—ɉÉÀæiAZGë¶ïXWÙ9UdðBÃ3„¬pûdEÜB€qL •+-”¬’œ•£fNw¯-]‘o³!Õ´¶Õ­ F2ñ‚9‰ñWŽ/'Òrºw(&ºÃ]Â×"iäh%æCͨt©I# ŒÄïÉÆàÐXipî0˜”Û®­ M¸qVæÈ”¶Î¿ e·Ôp¬œâµ®wHV]—*ð¡6¹Ùñ§cµ¯Î5$g¼UúǃøöÝÛ¢ü(:kU¹›E¢²9Qb Çl¨ï)BBF~œ äÇàýj—2Zî}ð•%Èvô°Vò^CÈyðC« loÂw)~]ÓÖ<ÿǶîÝáOúǃøöÝÛ¢ü)±³Áë±Å—i×ä¼p°ÆÅ¤á´6”¡:RÚ2yª…ׂkºp–%ÙRa£‹:ÓˆX‚8ÒRƒš_ 6£«))9 PÎýÕë ÿãÛwn‹ð§ýcÁ¿ü{níÑ~Ø·ÁþÝm—iW­ÖÉùÐ^L´êFr”‚]RR¿ÁJFN $ç6xQÁåpŠQŠ­å¤(©MÏ€% ’0¤”¬pAþ±Ük/þ±àßþ=·vè¿ Ö<ÿǶîÝáA麦ëlyÛäy-Èe Ç™ n,$%Nk¤U¼…)Nw|ôwXk¸ZäCC ¼¼ÈyµΕ à)$d‘¸â¨Ây7(ˆ—ü¹QœÎ‡˜,­ Á áA;ÁéV8¼ŸIÊê5Ü æÀÛ³òsR¬ÁµI\‚•Ù‚ÛŽ¢”Å›.a¬i*߯*Q;¹_l·±iµC¶ÆÕ°ˆÂoQÉÒ„„Œý8_‹Éôœ®£]Êqy>“•Ôk¹A¥Tnß©'ÖûTÔ|^O¤åuîW•CuÍ!éÒ@RW¡A° Is$pXs[o4èN­6´¸…cÆ’“shà,†tJrˆÝÈ8µ-|ž p’–R”¡~Ž,ÁIÔpQùÅt\^O¤åuîS‹Éôœ®£]Ê íVæmˆVÈåEˆl7²£¼¥ úp+’cðy²a,ªæŒEe,ÛÔÜ@…5¡ÆV…:uª‡a9ð|cǚ鸼ŸIÊê5ܧ“é9]F»”ú!àõŒØâÈK4ëò^8XcbÒpÚJPŒ)m<Õ±Y¼^O¤åuîS‹Éôœ®£]Ê×n>°Ÿ²n¬Ô1ãì6„º·Vâµ­kÆIÀ 0*šƒ"EªZn· œ ¬3&TXñŽ]C{%º¢¢ÒUéÈÆ3¿š¿lVw- LSòQ"LÙ&Këi“zŠRŒ%8@ç$““õ­JRÎÌô9ñ—ÉkeöÈVQIÜp@?éWj¢aºÞ Ìé ©KÐÙ¨’yÒO9>:¸=màÅ™‹]®3l°Ò¤¡)Sª Ö½ ,„Œœo¬¹¼2ïëœ&¶ˆ¯If[̘ÁN—Ù¡Ý^ a’¤é9Ð7ŠÖâò}'+¨×rœ^O¤åuîPdðw‚Å9—•5·Ú‰Q"!ƒJKgf?­Gh½,´¬'r9ªÝþÀõÖT9æ3\T­´©øÛt­HQðu' iµ%YÜSÌjß“é9]F»”âò}'+¨×rŸ=ð~Ô7â·rSneQ\[NG yJa-éw#JO`©:NJñ]fñy>“•Ôk¹N/'Òrºw($»~¤ŸXcíSRÕECuÍ!éÒ@RW¡A° Is$p®ßÕnªZ¾GƒêíýQVè1Ïô8ÿ—ÿÇZ›w>w¸VYþ‡òÿøëð‰,Îܣȷ.{Î0êb6Ü%IR_-¬!@%*)9þ¾à3Î3AÖíÜùÞáM»Ÿ;Ü*¤)Oˆ‰,¥ô¶¼à>ÂÙ^ãèX Þ1ôÔômÜùÞáM»Ÿ;Ü*:PI·sç{…6î|ïp¨ê ¨–äE¦ ì1$ãC²]@ß¿) I;³ýaÿµ½»Ÿ;Ü)·sç{…`ðN5æ'-ì_d!éèa°áJHRHBA QZµ¯9ÊÁùs7K|§8f㢠똩ñ\‡-1Ö Üdì¶©¥±„ÈÊõmŽjt}nçÎ÷ mÜùÞá_;àM¾T[» \㼈 nèêã­ üMaEj8xä> ´î ZEhðÎ"dM¶®lgZЇƒ¬·rKz Bwç@y!\ÉR4æ×ºv{w>w¸SnçÎ÷ ùTKMÙ¹öþP‡%ÛÒWo(™°Rô4„0pt e2u$ïYq$WoÂÆ“Á¹ 0Ó¯eÆKÍ5n2Au r[ ñç¨ÞÛ¹ó½Â›w>w¸WÉŬ„¶¹vyðŒw¸Tt “nçÎ÷ mÜùÞáQÒ‚M»Ÿ;Ü)·sç{…GJ 6î|ïp¦ÝÏî(3ÔãC« ãM¬s†°j9;αìz§? ¹úÊ>£uV‚ݽo;qÚ<´¨†” oN|gèýÕq¿–$ú»_Yʧmýtÿ†ÜUÆþX“êí}g(_‘çz»ŸT׺ñuùw«¹õM{ ŠéçúÀû4W«oê«õ‡¾ÕUæéçúÀû4W«oê«õ‡¾ÕTé\ÿ Hh  ®¶à—þñ“þÀ×AARbvCd©iC¯¯BÊIµžqƒÎMÉ1¾t®Öïz£‘úí»ÖöNVlÈ|&_ `Épˆ‹*#º—ZTe’¦<øà²æ•é BµPS¸Äj/,û2éÕl£Ë_ÿ6'6¢q_±øGo–ä´G\â›]ªÓý¶¢•¥ Ñ…¨(¥$“ƒ€jk×ôòÉþY?íbVý?5#åHv›<4ãÎ#¾ äò¤¨%/a  ”Oã#v|a¨ï m,عinJâN!kL'Š›(* Ö€H (P%@î©®| ¶Ú ÍyÆÎjRXqim9#RÔ”„î;Ô@Ü|•Î.ÍÂg8x²˜v”½=RÂV.¥2êÔOâ3”—þ¶ó”ó!²ß8C¦fu©µ%{;‹å (žr€€™> Ò9Á ÜfýozEÁ€ã­¹oH\ôw A*@© )'f¿ 9¹ê¨áu›dµ—ä%hZPYT7’ñ* )ÒÑFµd%DæŸ!ªíDá8Sp¸¶ÄF‘¸Í¯¸¥§d§”…l€:‹ ê݃‚k!® \ÜÇ\…÷q•4Ó—™%l”pI(.äëÀ@À«„r8QjvcrKÏ<„,a¼à@R”­IA øHX:ˆÆ“œb§¶Ê¹./©O¥jo%•„)iüä¥diR†@$Œ!®MîJä†`5Òä½ &ðã‹"¸·Vá- D$¬”åÁŸ:LpfAácW5±Xò„35×¶ëZVEµ¡¢BÔ¥iÉ'üf¾ü€÷ùÃÿÞ=] sÜ ùïó;‡ÿ¼zºJRJRJV' ˜zWøA;Ky÷m²Ûm¤©KQm@òIñPmÒ¸À28iè¶õªB%ÆS s›B€¤êReä¡ „þsxXPþ°5ßPT˜£ÐÙ*ZPëÅ+в’@mgœ`óSrLo+µ»Þ¨ä~»nõ…}“•›2 —ÃX2c\""ʈî¥Ö•Dä©þ8,„¹¥zp¨­TÜ“çJín÷©É1¾t®Öïz¨ðÂ;òx3!¦uì¸Éy¦s­Æ¨. ¼’ØXÇ8®6’ÒæYd=ÁÞ0ùb-n”¡E¸À)1³­ T‰zsù…Ĩý%}3’c|é]­Þõ9&7ΕÚÝïT|fl~ ZY¹)JžÜ6Q$©Z‰t dø÷ç}pQµ9iá]®%ºåk€üæ¥GCv )mM†£$€Ðlj q @Á)Ôy²i|$}’c|é]­Þõ9&7ΕÚÝïVbK‰i·Ž#Gvj— ”Å1R†¶hO‚É$¶ Òâ‚IÏ…“Ï]]\4ìÞ˜ÈRÔ†ž Fµ• h<ç'œš·U£þ»qõ„ý“ufJâ8Oç"L&Ÿëu¹½¢¯ ‘ ¼””ï*Ù¨îIÏ„1Î+G lm[Mª5½±)[3¡ ÒŸÆWá$ç)ð‰'Fyˆ éª”(MKeo<䂲ó©ðd8‘€â€Ü0v©GDÇ,Ï&ì1(È{C²]B¬å!I'v¬<»ù¨,rLo+µ»Þ§$ÆùÒ»[½ê£Áר|·1 ¿pDvÒáJRHBAJÔV½¢õjÊÁùr÷kt·8nã‡&ªáÈsj ENÇjð:[L¤ëÚ'Ôèí¹&7ΕÚÝïS’c|é]­Þõq<·K‰x޵À‘ä[ÖÝÕ×#-¡"QSXQZŽ9L…§pJÒ+K†ðÓ&u­ÉÖ÷§ÚÛÁÖˆ¹?Ž%½ -£~t’Ì•(Nm{§IÉ1¾t®Öïzœ“çJín÷«æÐí†îîQ…%Ûâ\·æìæÍ”!€úvàé@ÊejAÞ²âH毫ÕÒ2fÂj#(y—$‡šO…!Å â¢9‰«µÛõ$úÃjš– ©jù«·õE[ª–¯‘àú»TUº sý?åÿñÖ·_•5’¡Çü¿þ:ѽ=2=¹OC•&ƒ©Ù’TÛM€IV“Ÿ:€ç9Ý‚ñeùSN,¿*j¯îR®ÖÓ¦2–žp¯óP¤¤-A+ Vô…¤%@à+«AS‹/ÊšqeùSVéAS‹/ÊšqeùSVê¼é­[á¹)ä>¶ÑŒ†[Ë9 nBQçñ ÜüÔ8²ü©§_•5K‚ü k„ü‡vj;ñöí!jiæ–*R¢V”ëHÕ€´'ÅXóøQqÂÚi¨üŸth¡M,¸âØaÀt$$ÈoÁ •i^ÅKÅ—åM8²ü©®k‚ü(¸ÝçBLÆ£†.PU>0i¥¡L¤lŽ…)D‡—Ñá$PÆE_á ÚããÛkâÈ‘%·^.ÈaÇ’…6:PAÞ§“ág DîæÆ·_•4âËò¦¸¸\;¸\x¥Á˜ÑÛ·-ÈLºÂÛZ*– à! ÓÆ[ðH%ZVF1»«á ÉëM™rc6Úä)æc´΀·]KI*Æü°OÐ(,ñeùSN,¿*kŽk…—ÉR…¡ 78æ¹.C{f´%ÔŸÄêÖ‚xÓ`êQÑ¥dónëlw!y°[n½›©2s§ZB±Ÿ£4qeùSN,¿*k†g‡wuDŠúãÃQºFmø) 8€ÁqØí¥.(œ8”Ù*F‘”­<ãwQÁ›´»£›œ2!I )Æ™[)p)¦ÝJ¶k%H:]¤’AƒG‹/ÊšqeùS\Ôþ\cðöšj?'ŨSK.8§v#Xp 2ðH%ZW‚1RpR÷~“+“øQîNFa¸¡ÂHéZ_t,-~ƒ¿8߸:,¿*iÅ—åM[¥N,¿*iÅ—åM[¥N,¿*iÅ—åM[¥N,¿*iÅ—åM[¥>âJº$ó‰(úUJ½#ÿªúËQª£AnÛúéÿ ÿ¸«ü±'ÕÚúÎU;oë§ü3þâ®7òÄŸWkë9@ºü;ÕÜú¦½×‹¯Èó½]ϪkÝP?O?ÖÙ¢½[U_¬=öª¯0?O?ÖÙ¢¢‹)[q§[u^ w0V¢7€G1Ÿ·Â•*<©#»"1Qa× [YÆt’2œàgJ±U9I7+²;ݧ)1æåvG{´¥‡±^m¥;±t­HAP¤îÉCÇ^ùEßFKë5ߨ¹I7+²;ݧ)1æåvG{´·Øwk…ÞÊÚ•Dz+°¤ÉŠ‡Ò´¸¦•‘¥ôAhxÏ=UâÜ0éôŸþöºNRcÍÊìŽ÷iÊLy¹]‘Þí7ŸaÓ ÿé?ýí8· :dý'ÿ½®“”˜ór»#½Úr“nWdw»AÍñntÈ?úOÿ{N-ÙÿIÿïk¤å&<Ü®Èïvœ¤Ç›•ÙîÐ`±oá{©Rœ»Zß„¥v— #çˆóã5'%ð¯Ó¶_ýßÿ“[\¤Ç›•ÙîÓ”˜ór»#½Ú ܵ;f´ÉD—‹ï¾ã­´[IS®­ÒJ”@xç<Õ©U9I7+²;ݧ)1æåvG{´éU9I7+²;ݧ)1æåvG{´éU9I7+²;ݧ)1æåvG{´éU9I7+²;ݧ)1æåvG{´éU9I7+²;ݧ)1æåvG{´¥‡±^m¥;±t­HAP¤îÉCÇ^ùEßFKë5ߨ¹I7+²;ݧ)1æåvG{´ò‹¾Œ—Ök¿NQwÑ’úÍwê.RcÍÊìŽ÷iÊLy¹]‘Þí¼¢ï£%õšïÓ”]ôd¾³]ú‹”˜ór»#½Úr“nWdw»A/(»èÉ}f»ôå}/¬×~¢å&<Ü®Èïvœ¤Ç›•ÙîÐzˆ.ÊyÆ”ÖÙд¡dBS¿ŽtŸYªœ¤Ç›•ÙîÓ”˜ór»#½Ú tªœ¤Ç›•ÙîÓ”˜ór»#½Ú uN+ïÃil˜2ük‹ mMà…-Jê˜ù+÷”˜ór»#½Úr“nWdw»A/(»èÉ}f»ôå}/¬×~¢å&<Ü®Èïvœ¤Ç›•ÙîÐKÊ.ú2_Y®ý9EßFKë5ߨ¹I7+²;ݧ)1æåvG{´ò‹¾Œ—Ök¿NQwÑ’úÍwê.RcÍÊìŽ÷iÊLy¹]‘Þíä§ß˜Òd7øÖÖVâ›À ZTy”O0òUÊ©ÊLy¹]‘Þí9I7+²;Ý Z¾GƒêíýQVêµ¹µµkˆÛ‰)ZBTˆ„гAŽ¡Çü¿þ:¿z±[øC ¸—&Þ[-º—’ã$-9ÁÔÚ’wg8Ï>8@ÿCùüu-Æå×/JS*V„%¦–êÖ¬„¡¨œw Ôƒ «|6â²·ÖÚ3‚ûëyg$ëY*<þ3»›š¬V, ñ®pÑ.»F‚A ‚ðAw‚«44¬êPhÒ³©Au†‹¨ñÚm–@Cm¶”¡ `à݊΃–©7t]ŠU-%*Èua R5J@:T¤ø”A#ÄwQ‡Ù•¹ÝC¬º¶ÜmAIZHÈ Äãªð†×ì‹c²Je(¥8Ù,¡*Wæ¥KJT|I$âí¼µZ%;& RÛ®œ—V°„“¨¥ Q! '~”€>Š’íb·^ÐÒg²µ‰([O-¥§# AÁˆÎ޳-Ü!µÝ¥9’ã­‚¬–€´ƒ¤©@§;µ$‘ô×»­î• ªs«NÔ„¶ÊÝQÀÉ:P Àç:pêÉൗ”š „:À@BPâÒ߀0‚[BŠFàH$`c­ Ðc\à»cAØî§JÐIÿQ¼w‚7ƒX„Ö~>Ì!4)ׂ „)Møc(À4¡Ì îÇ=^›65º³%ºa¡©k œ ÞOˆ¼š_¤D¾Øœ„ˆªŠö”8§6¢[Áå)C *t+Z²*9Ì+m–ZŒÃl0Ú[i´„! HÅr«áu‘¸h”©.é[Šof"º]J’2 ¦‚u§ä  ç²ËÍÈa·™q.4âBдœ…$Œ‚’‚³|°4‰HL ¢J kJžZ‚U«K`«ñcV§xœ ѶZ¡Ú"˜ð›RP¥—§S‹Z:”µ¥Ãy'˜y+Ÿo…Ö7Q%i„FAqjSKHRB´êA#ñƒVì£;ÈäUûmÎ%Ú1‘ Å) Ymi[jmhPçJ “͸Î)>aþZ¤ÝÑtv)T´”«!Õ„)IüÕ)éR“âQÝKomÖ©K•2\’¤löÒ¦=%aÉHSªQH$@Æp<•AþÚãÝ‘lvIL¥§%”%JüÔ©`iJ‰$‚|B£·p–Ût¸*~:‰Ikl[“øþ@È.! ï?ÿؤø:ŠVu(4iYԠѥgRƒF•J r?ú¯¬·õª5hþ‚çë(úÕZ vß×OøgýÅ\oå‰>®×Ör©Û]?áŸ÷q¿–$ú»_YÊ×äyÞ®çÕ5î¼]~Gêî}S^è"úyþ°>Ív©@ý<ÿXfŠ»@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)AŽ¡Çü¿þ:ñ}‹2m±LCJµ(kJ¥»©#~çZÊsŽ`r2"ã<§ÒÚñ’Ãëe{Žw-(sxÑZ\YUS‹#ʪ{ƒV¸7`‰kjCò6 ! u×V½JJBIHR•¡>BÀñVDî Ü$__q§#ñ ScÎujuaÄ)­‰ÐJâíøD‚KÀ9®ã‹#ʪqdyUAÃðkƒ7 LØj˜ärź Ç-:µ©äÖ¤¨ÙÒÂ<’ *9É«×ûUÂM ÆÙÅ×"3n²ZòÚIJÔÚõj@'ršOƒŒ(¸×UÅ‘åU8²<ª§4>síüVR#¹oKžqå8´¸, !°4«WoÂ$êXÎþ¢ÿnzéh\xëm¥Ö_h¹%m8—ø% Ö÷G•TâÈòªƒçmpZõPº²a*zÜs\uÌ{f”)ÒŸÇiÖ²8ª Ô‘«RçßÕÙmÂÑb·[›A3qõã´$'8úq[‡çöH F^ÿ`c˼b¯J‰tuÇ—© /šuiVFAÜw€j °Y“Š‹L^Ób##F¼cV1Œà ô`p—”ä·¶­Ì2‡¤>ûúV€¦ƒ£ 9(d•3ŠÈO n³®áÄ€Ãn‰<—^u´¸•4ò’[XËdä'ú©:Ž:Ç-–÷¤¢K°c.BP—TÒJ’’ d 1ôÔƒöaQÅ¢exÔßF•`’21Úï>Z Up¨ÆjYf¶áíÞ’]–u%÷[Ê2¢Kj:r)š®Å¿È~krŠüÇá¶èRŠÚ.o)Ò0i^<çvâZR£­´¸ÃgóÜNÑIIP€Ï9˜ˆÿCùüu»·oç{fHŸÀÊ–ãÛØ.)õ…­Ã xd‚s«ó·œïÞÈG·oç{6íüïq ’•Ý¿î4Û·ó½Æ‚J¯9s†â 0Ãò†46ûŤ+xÎT¢7gú§É»ž¤Û·ó½Æ›vþw¸ÐcðBMêgmÏð‚;l\µ8²T¢P’T´”#f½Z²€S\½Úå-¾¸ÈžûsSpˆÜ8i’´‡b«cµPd . *IRÎôlÓŽzúÝ¿î4Û·ó½Æ?à-Ê\»Ät.{ò^]½n]ZrJÝå5„”(a“•HHBw¡&´¸o11§ZÛqvßj[o_nZã~8ô$¸ùÐ^PG2”€ uÛvþw¸ÓnßÎ÷sGvùd;ÅáË…¸ÜfÉjø§-Á¸[u7´eh`¾­€V2©Z–w ¶+»á„‡âðfC¬:ë8q”¼óYÖÛÔVæ!²³Ÿ3[vþw¸ÓnßÎ÷_$|¥7bRÒ&^¤3ÁÞ0øbj.n„­A¸Ä%2q­Ð¹zsùå´¤×Ò8:ôÙ´¿rJ“=Èl®HRté@*ÈñoÎê½·oç{6íüïq ùKÕÉPu7t˜·— ½é’·U ÂüpáÒGâ”*^Ÿê¶•sów<”¹Véå2•*&h†ñ’©Mì›* y^‰—RyÂ~Šé6íüïq¦Ý¿î4…qòoˆ…(‘Mõ¶ß“ ôH†íÈ”‡µÆ €Ê—¥ )RðU’wï§ï‰7[m×Öîfh\d*äe¬3ÅØÔR¥-J(Ú)c9À$Šì6íüïq¦Ý¿î4R£Û·ó½Æ›vþw¸ÐIJnßÎ÷mÛùÞãA%*=»;Üi·oç{”¨öíüïq¦Ý¿î4Ò?ú¯¬·õª5uõ&êAÈ2QõªTí¿®ŸðÏûЏßË}]¯¬åS¶þºÃ?î*ã,Iõv¾³” ¯Èó½]ϪkÝxºü;ÕÜú¦½ÐEôóý`}š+Õ·õUúÃßjªóôóý`}š+Õ·õUúÃßjª t¬ø0Y¹FDÉ¨Ú©ß ^ô¡'˜S¥±pŒÙ;+JI΂’è:†ï ÐY¥`ßîÓa̋߱Cï0ü•¼ó |!¶´j i)k%Äá ?5[àýÈÝì¬ÌS¨qen6µ!‡µ xI ¤‚1yç Ó¥+> nQ‘2j6ªwÂB½(IæPhR«%±pŒÙ;+JI΂’è:†ï ×=›ýÂ×x¶A„êD˜òqÃj~z²Ú™2 @;C•Àxè:ªUx.­ë|g]V§ÒT¥lÎI“³Q*GþUŽc¾½É{‹Äyügf…/\ ÐKJù7 xuÿLÜœCðãÉ[!;C!*RœQBW„a@ ¤ŒïßâÝ_G³L"´âÃ/GjKAÕ!.BIñãƒJ•˜ÅÅçxQ>ؤ£aiPQS‹}*~1†“Þ3þštퟪ/ÖûUUʧlýQ~°ÿÚª«7 ,»ŒõHŽÛ¥.¤$­ àlÓºƒV•—&Û ;Hy˜­6â^k JpF\H>âköÿsvÓgrS ¡ÇË0ÒVpn8–ÒTGõAX'èƒN•Ì#„r­.\ؾ†^0!ra4P“«Z5) RŠtÔTu~Xêîýfè!•Í ¼¨ÐYkRQ­m$ ©A)ÇŒ?Ö¥ä«w@‹ìSð¯™_¯óÂk´;·”†æ#Ds5Ä´PÚÒ6aA'Âß¼s׎GƒÂ;”àãR¤E` ƒï>£°W´œø°G÷õäÿGúðü1¹Yé9ýçüGÓ×l·$|Ÿ?à§á^­™´ä‡]BrrBRµ3ýÀW7ÀûŒ‡yF×"Bäñ‚ygRŠÈøÈæÉß]%·õUúÃßjªô~yÏÓž>©–7ªZ¾GƒêíýQVꥫäx>®ßÕn¶Œsý?åÿñÕ^ÞfY!Æz±sÔëû%„ípÒt)ZÕ²mÅc) Üžu â­èqÿ/ÿŽ¥¸Ã~lt·å*‚µc%¢¢0|´BÆ7ç›;†úËUÁ»¥®4ÖÔÒƒ¨[%•%*æRA!'qoîÞÝW*®Úͦވl)Å!*ZÔ·©KZÔVµå*Q?ëW(¥(ÙÑ-±.t¦"ÆoÞ}À„''*;†òúÔô Ì°ß­Ü%´1s¶HC¬º”•%+J”ÒŠB´/I!+C#;«6g 8­õp„4.32YˆóÆ@KÇ6xÒÞ<$‚û!JÈÆ±¸ÖôQí¶øÐb7³¤²Ò2N”$Nó¸zË“Áˆ²nÆr¤ËJóRŠ…§bë­ãBÕàêÈÒŽet§ âl,å¹­2¨he¹Q•.*Ñ 8¥66¤NÍZ^iA9VåóÕ«íõë\˜âDjL¹)ZÒ—äì’„Ÿ J¼"§JF7•sŠZ81Ï)/µ&[Á–Lx­<´”ÆhJ„ƒŒ¥?œTp3SÝìÝ\aäÌ— KhCñT½ ƤøIPÁÒ“ÍR"œ^°ãðñ©Ær4 «{ªŒ…:¹.¥O†Štµƒ©#nÈQÔ0V7èo7>H¶.Xd¾½m´ÓAZu¸âÒ„ øR†ÿf7ÀÛsTw¥3¢ÂÌ$,l\[!!¥+ «)G2€:qZ÷;s7k{ä¥ )P[j¤¨)*Iò…GÒ)Q̧†ï½¢4{tW.%Å%Hãà0RÊ‚î Wd$i+Æìfº{dö®¶˜wƒ2ØCí… á+HPÏÓƒXÇÑô‡t¹7<¸âÜž…¶sZR•àhÁ ¶7$cBqƒ[¢1oƒdh¤´Ò3)HÀ¸PrLðÿjÂ]6ÔâS)v[”§u-¤!. #d£ÆVRVê𓤌%) HT«-¾7iz ŒüWd1! –vji* A@ Þîâ7Åš£eáR®·ÙµÆŠ—mKY‹4H,”¨'fð ·2N ¿5[÷U©<rG˜¼‹ÕÅ¥°’Ú#!,lƒj(+Föʰ¢ÚI:²7àŠýÁæá]yE˄饕GkŒ©4Ú”•‚”‚­éNõÜûÍÍ)J)J)J)J óú Ÿ¬£ê7UjÑýÏÖQõª´í¿®ŸðÏûЏßË}]¯¬åS¶þºÃ?î*ã,Iõv¾³” ¯Èó½]ϪkÝxºü;ÕÜú¦½ÐEôóý`}š+Õ·õUúÃßjªóôóý`}š+Õ·õUúÃßjªM¦T@[Ž–]g$¥( £> @9é^šiÂò¤HRTê†0”'È?÷5=((\ìðo ´™¬©¥kiÆž[N6q‚R´¡‘»qßS@Ù !·³eJ¨¨’¥(’I$’I$œ’MY¥«6™Qn:Yuœ’”8¢‚Œøä¥Y¥ 4áyR$)*uCH Jäûš§t°@¼H"WKñд6äiGPJÊJ-©$‚PÇÈ+N”°ÊcÇi„”6€„—RÔ@Þ¥T~’I>:ö¤¥h)P* øÅ~Òƒ˜»p2Õx–Ä‹¢ ÁØà%§ŸZа0PNåã鮂4}€QQIqxΔéH`<@ ž” [nW=ã9¹*i,©qnÇÔ„•‚ZAÁZ¹ü¦µéJ vÏÕëýª«Èf[ä¸ÓL¸‡”• N”„„ãóO’½[?T_¬?öª«”]DÉ Kka†Ó´BʃåG PW6äòÔóaƸÃv¶Rôw“¥m«˜Šž”ø?lƒTf£©mËd:·–èÆœ)k%Dcv À¨?é;2m°à5Ö†#ª<—Zq[Õ‡ ½çyÉÞwœÖÕ(3íœ>˜ZãÜ¢Xqõ­N’Y9QQVt!#9Îìó’j¼³ÏyןŒày×KËu©4²¢Ú>- ÇHÈÍlÒƒî XßjKN[šÑ& 8JFÁ9Òƒà¨ï<Û÷ ZÚvØÛi B)H ^*õT™úÕ¿ÖÙ.†–éJP)JP)JP*¥ËõTzÃ?jš·U._ª£ÖûTÐ[ªQ¡1q³=J¦—!섬 ‚Q)$A‚F*íVrÝ×㣭jÞT¦’Iÿ\PRWìKˆ#ª+ø©Òï{l¥)!**w^µe  ˆ â2¸+f\ÆdñU¥L–ÔÛH}IJØ Ùh%:S‚S‘¤yKÉVîاáNJ·t¾Å? Ëo-V‰NɃ¶ë€§%Õ¬!$ê)BTHBIߥ ¢µk/’­Ý/±Oœ•nè}Š~Jùb/«½õ›¨Üùb7«»õ›©X‡2‰b3-¸–ПÝPÊCÈ–Ä–š.„!m© +Â)9 ÍòŽz ®p2ËÂ]¡´‡Ü[kT–ÛHwÀRUùØÎý8þêÆGgÚ[Tkݸ°T­[ãí 3Π¡»ŸŸ5Õñ™•ûÚïÓŒHô|¯Þ×~¹þŸŽ¬þs›c•Æï+ ›2—–ûÎ(¸óÎ~rÔ|G÷V·õUúÃßjªŒH<öù]f»õ4œf(K ©kqI!%J*Æ|xÎ+rI5·o6¯‘àú»TUº©jù«·õE[ª1Ïô8ÿ—ÿÇ[2Ÿ‡3’eºÄx팭ה”¤Â±ô8ÿ—ÿÇQðÒÕ2éÞ¨iyÃjd­¦6[E€…¤hþ,¨)IPÕ»Áòâƒn ¸8mÌ"4¸®gCÌ-.!X$(n8 ô«4|ÄþêÎà÷*r³ž=•ëÎZu«F­­uiÝœãuiÐyÙ£æ'÷Sf˜ŸÝ^©Açf˜ŸÝMš>buzªó£».Œ35øN+}€‚´`ƒ¸-*NþmàóùwÐM³GÌO\-ŒÜZ·92"':mÆS©­>PœäÇ÷UYeð{‚¶ë\ÙîL~}²ÔÂ_¸Ë‰ ¥(!.Hq-¤¨óTFÿ¢¹Øn¶ë¿ŽÃS Ûm«‚§TãJV¥3á£G…§ñKYÚaZWŠ´¸Q{—[mÆ$.ŽËì9¥´•eÂÑ üoƒ§ © þ¶—7Ó›:Û]ÆÖÝÁ«{“!¢kÉÖÔe:âÓåJs’7ãÉVTxì-÷ÔÓM6’¥¸²”ÎI<¾q‚7¸NÜärøÛ[Ÿ\ä¸ÞÍ:#…¤ƒøÍ_ˆp'HÒCêÍv|*·È¹p}ØñZKÎ¥æ ©A!àÛ¨qMäîð‚Jwîß¾”‰W}°·njâ»­µ0]V†ä™ -^@¬àÇ÷VˆCd’Ñ_:nÅ{b,ªÓ"FÙçÉ‚]¶H[q‘­y;/Çs^“:wóvÜ€õ«ƒ6«t…‡‰ –ZNB”„’?ÔPznígxÌ \ ¬ÂÏ yaŒç^ÿ˜ó㚦…* Æ"%A~4¨ËüǘZV…x·¸×Í™àõP"G]» µÃC8ëZg”?§xJ„w Ú`ê|ø¹». À››”‰¬8ÂæÌÛ¥§”Ùq 2Ód¯gàjR›RÎÞ!ZmÜ­O]µµ6î £[±êK¨NíêFr„äxÇ–«ÛxCÁëÌ…GµÞ-“žJ5©¸²[uA9$$“Œ‘¿é¬Ù˹×Öé-X§;bu6hù‰ýÕê”vhù‰ýÔÙ£æ'÷WªPyÙ£æ'÷Sf˜ŸÝ^©Açf˜ŸÝMš>buz¥ €º€08ËQª¥W¤õ_Yoê5Th-Û]?áŸ÷q¿–$ú»_Yʧmýtÿ†ÜUÆþX“êí}g(_‘çz»ŸT׺ñuùw«¹õM{ ŠéçúÀû4W耴l¦Èi R—¡!²$“Î’yÉñ×äÓÏõöh«´8›þ’•Õk¹N&ÿ¤¥uZîUºPTâoúJWU®å8›þ’•Õk¹VéAS‰¿é)]V»”âoúJWU®å[¥N&ÿ¤¥uZîS‰¿é)]V»•n”8›þ’•Õk¹N&ÿ¤¥uZîUºPTâoúJWU®å8›þ’•Õk¹VéAS‰¿é)]V»”âoúJWU®å[¥N&ÿ¤¥uZîS‰¿é)]V»•n”8›þ’•Õk¹N&ÿ¤¥uZîUºPTâoúJWU®å8›þ’•Õk¹VéAS‰¿é)]V»”âoúJWU®å[¥N&ÿ¤¥uZîQ”mÇe¾öÌ•%+Ÿ#ÄM[¥”¥”¥”¥¢Âd²[R”éPRqAÿH-(*q7ý%+ª×rœMÿIJêµÜ«t ©Äßô”®«]Êq7ý%+ª×r­Ò‚§ÒRº­w)Äßô”®«]Ê·J œMÿIJêµÜ§ÒRº­w*Ý(*q7ý%+ª×rœMÿIJêµÜ«t ©Äßô”®«]Êq7ý%+ª×r­Ò‚6Dxí²Þt6„çÈ*JRƒÿCùüu³Æ¿±ï¬cý?åÿñÔ|!^ÂÌüµ]%[›Š•>ãÑPÒ–R”œ§!c÷ ä þPÝã_Ø÷ÓcßX|näßá »ê~à[ }kJA ;ôø'ÁΜ€3ŒÖ(³Æ¿±ï§þǾ«R‚ÏþǾœkûú­PMìX‹y˜oÌq8à «~7©)ÝϼŽoô Ðã_Ø÷Ócß\çï¯ü·ÜæA\G¤0ÛŠJŠt¯R­hÒ¥‚IÀQ ݼVÆùsg„r6RÔˆñn1! ”:—v:”¢«ñË)Óàþ%Y ïø×ö=ôã_Ø÷×Á;åÎápÇ%©öî6åÍSJC`GRTׂŸÆ©_…©£â­Μ‹ºßrà¡öŸyrCJWâË`Æx:pâ–¯–Î7Ó›5çN»cßN5ý}| ï3ø¥Áo–Sµ·²¸Im½šøÂ+$ŸÆjüzôé8•fºþÏ‘n±8ügR˪y–CÊH! ã¨l¯w‚U¿víõlÐè8×ö=ôã_Ø÷×ÌÛ¾^_Èêº?dóÀÍ-GÛ†ã¯Bóø¯Œ/V‘¼2tï®ÊÁ=ë§-w  ½*#O¸„Œ©H ©¨6¸×ö=ôã_Ø÷×ÊYá]í0b¾¹ù78ˆ|—kL§ã¶J4ï)H}`í2u2|U×ðZtÉLÜXšó®½‚]u-‡ M¹…ìü I.)Nã_Ø÷Ócß\ÂÝ™‡Q£òƒîB—CÆ*ÐÞ†–Ú㤽ûEçR?‹“Á»¥øp•6›ÒžS˄䇒½††Ö•¡#e³ðƒjÖ¼m<#£è4î‡{Æ¿±ï§þǾ«R‚ÏþǾœkûú­J ®×Ör©Û]?áŸ÷q¿–$ú»_YÊ×äyÞ®çÕ5î¼]~Gêî}S^è"úyþ°>Ív©@ý<ÿXfŠŽÝ:‚ä–/íÞR«ôŠüüÛ¨bÑlm%%öøŸÅ¨Ð\s ÞÚ|D ôñ\á-Êþ¨h¹ÜâÛSr×´8°„QmVä‚F‘¼,`iðCº¥|íÉÜ7bË[&D©³­\eèîÅKi†ð[Bp‚ ­s¼c}sÓ¬·5ßî*àþÜÊYš·e»nr3€©§†øÂÈ$:¦ÊF@9Ü2S¥|­ëL'cÊTKlÛuœ*)nÖgä6ô„¥í®Ò:@R’R¦²½É+BNN7×vÏs‚ÝÂ×1ùÎ[Ö›)n:•ĤÞR3§!’¨ûÉÊs»ëÉ;¹Jù¥¦Û)¿Â"d*Þê.ÖãÆ‰^ÉIsA\£à:ÙÊt´)ÊrNƒŸ¥ÔáÒ”¯›pºÜÛü8zD«tWØ6ØÈmÉ|~èAÇÊ‚KdÈ NAçÊ|”Emö^[¨iÔ-l¯C©J(V¬+Èt©'ÄAñÔ•ó«Ì›íº}åÈ—×2êD–:t¦d€÷‚U¨gHl‚¡Ì`³p‡„÷ Íí—pL¤É„‡ ‹x ! ÉÇ4å NÑÅTp0®`ƒé•ï³;²$:†Xin8â‚R„’I;€Ç_2E㆜‘-l›„—S!¹.CS-æ¢ËJ‹´Ø ¡íÊ<äC|›Â›%F–n%R-/¡´B¶-|iâ§RPî¶R¶üÞ–õ(ŒŒ «Ò«ÃV¦v¯¹ø×§ÛС…¨` )ðG2N7¤•gQ±@¥Wœ#ªß$Kgo´ ó[îÑ:“ U‘‘¤žlù»áIàX·ñ)ñ‰vóqàü—Yqµ¾úšB™N¦ô(HFpp}B•ò7l÷1h-Ü-sœå½i²–ã©\JA}å#:r! ¼l§;°lβÜ׸«ƒûs)fjÝ–í¹ÈΦœJã <ê›( çpÈ}N•òi¶¤8ËŠµØ¥E²í¢k"ÚëˆÚ%íV¸£ y>)8çP ÉÒsÜð";Ñx% —Øq…¥oÛˆ(ÂK«)Âô$‚ Pw¤“œU)\g ¸:÷8MgBcÁ[ B™­Ùöó)¤(®>œ I YDón>(;:Wcp‚Üô˜vùr_bÙd`DmæÐS2VO†á'Àh7y‰ÎZnœ#Ø9¢Mévý³ÙÎZ‚e´ ].†ÙÙøI ŒèVå«z´æƒè”¯Ÿp^ñ‚f\dI.Hî­–¶ÌÇ&Z3§r‚gp#~’yΪvk— .3Ù„ó×(Ñ\’Öf9¥µ3$¬¸Í$am³ýC‚¡½A@P}6•Ã2ï Xj,‰—+’Û\¹‘$%¸*m†ÒþÎ@J[$­E¦ÈÜR­ ;Æ{š)\¯á4Iœ¹Ç‘m\÷ÜŽêa¶Ü%ÉRdÖ •ŸÏÜyÆh:ªWÍxcW×Û›ijk—¢l¢7&Êÿâ­a.¡Õ„ëÕ½E[ÊR’6|½jqˬ„®Ê5ÁRgª}Ɉî*Ût2°ÐLiBrAAÝå¦R¾O Ñ!´­o[ï*>Þ#—#ÂPþµñRTµ kŽU‘•lÉÆPºÙn+ˆØ6™JÌGSAq÷I’òšm¥§tGE±´^GæŒxƒìô¥(*Z¾GƒêíýQVꥫäx>®ßÕnƒÿCùüu7 ì„Væbí˜@iô¼[“nÃØiq½IÔùÆFô¤øªý?åÿñÖ¦ÝÏîðzÐlV8öÒþÛc¬…hH QV”§'JS)8 Óª[w>w¸SnçÎ÷ ´ª[w>w¸SnçÎ÷ µ^tw8nCŸ‰q\ƶ_l8…`‚2“¸à€Ò¢Û¹ó½Â›w>w¸PAÁî[x1fb×kŒÛ,4„…)(JTê‚Bu¯HK!#'ë.o »úç ­¢+ÒY–ó&0S¥Æ¶DhwW‚‚Xd©:Nt â¶öî|ïp¦ÝÏîœà±NeåMmö¢FTHˆD`Ò’ÙÙÆ+QÚ/K-$+ ÜŽj·°=u•d9ŒÆ—+m*~6Ý+R|Ið‚šmIVwóÐÛ¹ó½Â›w>w¸SàæcþÚ†üVãNJm̪+‹iÈáO)L% .äiIâì'IÉ@Þ+£½ÚùbÔä0ùaÍm¼Ó¡:´8ÚÒâ JNÛ¸`ýÞ*ì7ÄF‚ê‚d6ë +`üôå9P8æ'9#~‚¶ô<ÍÇfò eJIBµ¼gÄ>ßWùbO«µõœ¨B›¸FBÝ[ªLe‚âÀ YÎ?@§oå‰>®×Öruùw«¹õM{¯_‘çz»ŸT׺ ~ž¬³EC|8í8ÓòØiÀûÄ¡n‘—FãôšéçúÀû4UÚ œ«néñ}²~4å[wO‹í“ñ«t  ÄëDXíG* ,4€†ÛmÄ%(H¸[l7„~,„Œç(Üw`0áSò{¾’—Õk¹^ù*ÝÐ"ûü)ÉVîاáAã“Ýô”¾«]Êr{¾’—Õk¹^ù*ÝÐ"ûü)ÉVîاáAã“Ýô”¾«]Êr{¾’—Õk¹^ù*ÝÐ"ûü)ÉVîاáA•ÇŽÛ¹Î(m! .) Qcz”’T~’I>: ÿ I»"êì‰Jž‚’‰F´iæ :w$äå#qÎðk[’­Ý/±Oœ•nè}Š~6î@´ÊrL™}ÐC«»“œ¯)ðÕŸëŸq^î¼…{CmÜß‘)¶É)mÀÙH$c:t`‘â<ãÅŠÓä«w@‹ìSð§%[º_bŸ…1àM´Ïfz¤L\ÆRâTâF )ÎŒs+'VjôÛn0‰*|ŰèÒ´‚„êL„ƒ(ñÕo’­Ý/±Oœ•nè}Š~ üÙ\†ˆK*n)ÄF:6HR† J4éFâI$ÖË6¥°Ãl¢ç7Ci N¢ÚŽÆòPI?IßSrU» Eö)øS’­Ý/±Oƒ¾ÚD”¶ì´ h(’RàðU¨ë8ÊÎ|g'Œà‘Wí¼hŒc[åI¬¬4€Þ„“Ï¥:0‘ô }Ûêÿ%[º_bŸ…9*ÝÐ"ûü(2$p2Û*曓Î>©ÉZ™8l8’œ`ä'vôÇ~AÉ¥³¶ë3¥Ûs²#¸¤iqiÑ—wç+%>¿´¬ç~óZü•nè}Š~ä«w@‹ìSð ñÉîúJ_U®å9=ßIKêµÜ¯|•nè}Š~ä«w@‹ìSð ñÉîúJ_U®å9=ßIKêµÜ¯|•nè}Š~ä«w@‹ìSð ñÉîúJ_U®å9=ßIKêµÜ¯|•nè}Š~ä«w@‹ìSð ñÉîúJ_U®å9=ßIKêµÜ¯|•nè}Š~ä«w@‹ìSð üM¹±æVë«/,-Nµ##Åâ¯Î ¾Ÿ'÷#»^¹*ÝÐ"ûü)ÉVîاáAéˆIeòòžu×4èÂ7 çp'î¯-ü±'ÕÚúÎS’­Ý/±O¦b4xÉ!†hä6€œþên¿#Îõw>©¯uâëò<ïWsêš÷AXÅXuŵ-æv‡R’€‚ Àð’|@Wï“é)=V»•]÷›f-Òá2àüX5-ÂÚ –ÒÚV¥R¢NóÍäæ¬ÇøKaŽÄ—Ïnµ–Ÿ¨ÐöÁ¦ÝB–…«C' )BŽNà1œdd6ø¼ŸIIêµÜ§“é)=V»•š«¥±¶Rë׋£ÚÚ¥!œRv½ÈS!DëRFœgÂNì(gUˆmÉ ,^_t!jme²Ê´¨œ#qq8¼ŸIIêµÜ§“é)=V»•NðêìÆœrìû$7O²#iaN8†ÐVˆ*XüЬ`ç©ÉNzNgU®å~/'ÒRz­w)ÅäúJOU®åXä§='3ª×r©¶„»y“kMÆ~Þ’“Õk¹G£´Ä¸Ñ»ÌÉÕ²@Cd«HÊŽæ÷»yÝ’9#6çARæÏd…©:V$€¢¼‘‚Gd>/'ÒRz­w)ÅäúJOU®åXä§='3ª×r«½¦%ƈåÞ`~N­’%ZFTw7¸ ÛÎì9È qy>’“Õk¹N/'ÒRz­w*Ç%9é9V»•–ç¶R™³Ü ^•)!Œ64“©YH8ÈvNT7c$|^O¤¤õZîS‹Éô”ž«]Ê=¦%ƈåÞ`~N­’%ZFTw7¸ ÛÎì9È«”ç¤æuZîPWâò}%'ª×rœ^O¤¤õZîV}¢t{Ôù°ãN¹¡È™ÚȾÆì$ÿZ:Ï÷øòƒÑÚb\hŽ]æäêÙ !²U¤eGs{€Ý¼îÉœŠ“é)=V»”âò}%'ª×r¬rSž“™Õk¹Xö‰ÑïSæÃ:æ‡"gh\C >û°“ýhë?ÜSãÈ¡ÅäúJOU®å8¼ŸIIêµÜ£ÑÚb\hŽ]æäêÙ !²U¤eGs{€Ý¼îÉœŠ±ÉNzNgU®å~/'ÒRz­w)ÅäúJOU®åXä§='3ª×r«Î…&$7eëœ×Œ0Ç ^HŠÂS»ŸyÞ]Ô/'ÒRz­w)ÅäúJOU®åGiBo6h7H÷éblvä6—ÈPJÒÂΔÕÎJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w(ôv˜—#—yù:¶Hl•iQÜÞà7o;²@ç"¬rSž“™Õk¹A_‹Éô”ž«]Êqy>’“Õk¹R9ny e)›=ÀµéR’ÃcI:•”ƒŒ€7dåCv2Dœ”ç¤æuZîPWâò}%'ª×rœ^O¤¤õZîUŽJsÒs:­w)ÉNzNgU®å~/'ÒRz­w)ÅäúJOU®åXä§='3ª×r£fÜó¨*\Ùìµ'JÃ@W‚’0@ÈñàŒ€rGÅäúJOU®åW‘ÆØq÷ÒÚ† l«V@ƒ|Û÷šÐä§='3ª×r£U-Àâ§Ê+ ) (k8<ãó(3üß\É€Jô¥Ã:q§ñ{Ó¿ž¤Ž©Ï8”ªséÂpßç`ñ{Æþzºž¶fÈPŸ­É>/Ì¢,l¶Q6JKiЂׂ<ƒÀú(<ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚¿“é)=V»”âò}%'ª×r¬rSž“™Õk¹NJsÒs:­w(+ñy>’“Õk¹N/'ÒRz­w*Ç%9é9V»”ä§='3ª×r‚£Ýy¥´ìù+m`¥I)ldq¹«u^t'¢[äÉEÆR”ËJp%Io€NÍV(2îׯ<áE®:›Kó[v;jp¥ÇJA8ã'ÈkçÀicp’?â[ÛjõnnL‰N#f¯û€¥þbòu°”îI›…Éë7øQtŽ–Ôü&ÝÚ\¤©Ò 8ÈòŠ£…³ãBŸ.íù1Yr3QÞbØô5¼ãÎlô_V¯”YÁÕ»x –ïd¾ÞÞ¶Luè²-Êã ²—”òö±à•–Òtl†tä)`ãÀé1Á¶Ç•{‘ ®P* ¥–Ã)Ðr^<'úÄŒï Iªr¸lÄ&Ö¹6{«e† ™¨(o0ÙÖ´…¹…àƒ³Y5œU†¸]ëÃ~ÊD·a50¡ºÚ\RÇçjݲZs§Ù!®Û¤Ý,刅¡%¹ä¶QJ¦^C¡$€HF3ƒŒç¹ÞðNé "NÂÚ^v #…<òɶ½•=„xJð†ó šwŒ‘V“ÃøÊ°7{UšäÌ˹%È̡Ĩ…8òS»N$ $j›¿…kqÛÔ;„†Á|ºÂZRRßPÎÓy+ç)È!;‰ÈÊ{8Γø>½¿Âiwò­öô>䬿 mÅ!ÖJJ‚YJÔ´­hQÔê «àV÷¸5&Éu¸Kvßk·³&,fQÜâ”M©â¥HO>Ñ>üçœô³£».Œ35øN+}€‚´`ƒ¸-*Nþmàóùw×=já+ðƒw­Hp¹ÅŽÔt -÷”ÎÑXÉJ¹+VòƒFãEÆ÷oCâÛ2–¢¡ø×†æÓŽ|'zÎGçc˜ãš{ð~ê˜ÚÅr4;£“n.½=­[@Ì'fp Ò§YVœ€ <ö®„»=®3fGÌwBõ-Ç£¡M© Sn ¶§BÔ¤© P>"kòíÃdG¹@SmKbÖÔé-Lš¶ÐZu,ǧåyJÚôŒè8$fœYïl‡àÖãp·>ÃQlÖä¯{pã8µ2—Y-%ìèYqö‰Ý*5ùsüÝ ¦,†6 ªBXŒ‡ÐÈŒ•ÉuÔ)µª;¥ д'À#@Á#èmß„«5Ù¥ˆ I•(:Û(ŠÃŒ:·´­IÂ’á@ðZp¥w‘n ܤݬj—/XtΘØK‰ R‰.¡ nÈJR?ÓœóÒÔž‘ˆY·‹¥æ&Ò9eQYŒ[Ûæ0_€Z‹ŠÎR%)@ÆwW4Ž É¹þ£Û¡[`°s•%¨³â¡ )÷”€”¸Ó¥iZ1–ÎFww·d±m”ô8üfSl­L°TµX¥9<Ù8úk‰W ï-N:äTMœ‰™\f¡.+!ç‚Ró€(éBҬਇÃë4~¯<”ÔGœ¶ËxGv;2qAVò_uhy€–ÀÖâl ’@8Ý[œ$µNbá„×c8¹.Û$B·Ç@Ö½žÍ[ÀN|'y†òÞFAjÿÃÈâÆíøÈy€ò”¹AoÊ’‚öµ©>=šVˆš¸xM®ï6ÝÍs”¸ny¤´ÚlRòR –7 H(Œ$0ÀyOC¸Gr5¶äÀY‰Å–Ô–$p’vŽ'w1üÔåGœY—aµBá_´ØÐËÐßuÕÈfJަd ]:@.¸ÌqŠØà…ê_x+nºM€ä7äGmÅ%E\Ô„«Z4­D ’pB·oªð›‡Þ Èm6œK+oi·#¤’[©qDc8JÎ1“º‚­‚uò ‹©m™3`½m·‡U”¶ÙAÉNq­g'ô¡V_ƒ™‘–YbÔôW$¥óouJK2–¤¡Ì àßc”2ÈÀµîÜ7DkŒ6Ô¶-mN’Ô¹«m§RÌy q)ÞW”­¡¿H΃‚Fhž¿ëuvu¶äÄV#[ÃP–ÓEâä‡ÞkPÒ¢8ov­ÚNàrd[¿·xoL$„´Ûҵϑ.SÚÊ5`&Bt‘œ(d¥ZFwî¶ ×È|&.¥¶dÍ‚õ¶ÞVRÛek%9ƵœœoÒ„ddP] vk˜jìĨRÙyÈòÂe°µ#QÏ% 7¬‘¿ÅOÿ_Ûêe°Bš\†.+S!D6’TRÑsl q€B9˜æ†˜ ~fDrYe‹SÑ\’—ͽÕ),ÈHzZ’‡0ƒ€}ŒnPË c[¿·xoL$„´Ûҵϑ.SÚÊ5`&Bt‘œ(d¥ZFzžð¾? #¾ôpË¡I2#-^Á$!ÕiÒ<"ƒŽ`£ºº*uËL«ƒ÷¹rØG˜\MËxgδ…¬ä J7db¸Ö¿÷6¬²¡¢Òˉem0áÂà'jb«Ã*id c>í«× ®V Ä–ä´ÃÑšjCÛ$Äy¢Û*u%/¯ñn¨é¡)É9:Mxs…·ÈÒ¥ñW­­œ†á½³BT™ WâukpŽ(àN’5êAûÚûÿ‚›¼˜·ä[ÞÜge×rÿ~[›ªDS€#à§;œàÄä_St\ÒÕÖâòäebL–Öóá ©% lü$¸¢@ß“áþÝÓSídž•Z£:üä–œX|¶ì†Ê[ þ(½C*Bw“¿è•M8)|¼Íà ³ƒî=·-ªi´†Ý nc-· 6Œ©)$¢’‡)Îr2&~ îr`ÛYmÎ?…7µ›-Þ]ZÀ *&‚ƒ²8Ây’ }R• âøIj:Åà ®Æqr]¶H…oŽ­{=š·€œøN,ó ä%¼Œ‚*²x)èwîF¶Ãb\˜ 1"¸²Ú’Ä€ã®RÑÄîæ?šœ¨óŽö”uÓƒrã\l+àí’ʘ¶‡Ý}½´¥0¡µC¨[h ezRK‰^㼤 #Ö'ÿ nõ*{¢Du÷¤¯Œ²UµFÔÏð‡‚<,H‹ãÿäþ sôÊP|­Á½É«,¸.ƈþÕö\Kfà†Ú:à+(D ‚£¨d)+Õ¸’ {Ž ÚæÙ,pm¯µ%¤:\TT†Ò•å!(J“¹GR€Nñ>Ó¹JAàÆÛ“}Ž›rÞŸ’\R šÕ8é*8ÏŠ ÁýçҜ؇ÁKØàƒ¶D³ÛÊf®DG¢I[‚*VúÝʲFØPJFp|x ïiKägX ¹l°Â„ó1šu†‚˜ÅE²G9[÷óœääçœèÒ” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R”¯?!Ü=YϪj:’óòÃÕœú¦£ ®Ì÷8—¨ÚE”â™yˆÔ…2€¡‘¼dÍZ3`Ǹ0–e7´m.¶ðˆÂÛZ\AÝäRR~œoÝ\Õù‡¥p+†1ã´ãÏ»Bm´•)j1’o$Ø®2õÁ.K·ð¶-Â<Ëá“hŒÕ¹Ãn\‚—ЉM¶¤+J’Œ¯w„¼:€ úUÓƒ6›Ì”¿>2œp#f­/-°â3¨’|7Ûë1< JxbÝìIm¸ì¼¹-ÅiÆ­µ6¥+.”oÖ²t¶’N2N7àÞ`D|ZUb°ÉjÖÒ35† .0r6Ý$µ²(«XSšq’”¬óFzhQ/há¯%Õ³i.8VħCËpœáMàe´çµnÝ¡>$ô_kopfÒýž ©QÜDH(jC­ Ð.%A`„’3àœóÕ%pƒkelªÜT…¥iP2$…‡Â·êÎþ4ÿ_èN-ðw$YG$8ãr×.+{FÚ”6§ÛKŠÒA+$ø€'v3\åæãÂ+{ÄT=t¹¾«IU²KVàá2‚Ÿ'VÍA , (­;†I;ºÄOìɵ¦Ú–LT<i"[ÁL( ’µjl¸'y¬›{œ%(dË–äyi±^ˆ¨¨JŒ“ ²æBB†vm¢pBÆâNOcAÎ?ÀNɰ\CF:£--ËyVÔT¢Ò±¯zÖr¬œ¨žsS¹Àû·5ÈEnt¡O¸ZÖ´) ;-Z2¤­@ø;ó“¿}nRƒ þ´ËŽ¡=ÆÊÒâv—) SJN@-¨¸Kg #À# àî«¶Û,C-3·Zi­©J6ëRrâö‹$u¬NHÉt)Aì5*;±ß@[N ¡h<ÊI#÷V:8!eDIQŒwÜL¢ÙuÇf<ã§f­MáÅ,­:U½8#x­ÊPa\8dº$&k]ÿµâk©¨è¯ÒÜ=d}“u£YÖ¯ÒÜ=d}“ud@†˜lÃYѲd647 ‚)æJRF9°1ÍAbª]n ÚlónO!kj$wZP2¢”$¨ôî©Ë ªB$)¦ËèB‡ F¤¥DyÀ%)$xô%{ )%*ƒ¸ƒã¡?o…wvxU%— Ç2eG‚ÌX‰¸•GJÖe¸V§4x$¡°I)H52¿3á)‹n5l†eÍ*!.Èmio:È1”RN wéñô¨à¿ÛŠôTX­‰ŒøHu”Äl!À #PÆ ”F|dùjÒmÔGr:mÑˬÎ6HJÚ°ÙÁHÖ¯›Â>SAÏ[xjåÏ….Zš³KâˆôS3dö”­­ZЉl6JH8NHðFwuµCíì.Æ×”“Í3‹£l7iüüjæ$sóUú)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J WŸî¬çÕ5IyùáêÎ}SQÐ-_¥¸zÈû&ëF³­_¥¸zÈû&ëFJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJR‚•çä;‡«9õMGR^~C¸z³ŸTÔt Wén²>ɺѬëWén²>ɺѠR” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” R” ¥yùáêÎ}SQÔ—Ÿî¬çÕ5Õú[‡¬²n´k:Õú[‡¬²n´h¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥()^~C¸z³ŸTÔu%çä;‡«9õMG@µ~–áë#ì›­ε~–áë#ì›­)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J WŸî¬çÕ5IyùáêÎ}SQÐ-_¥¸zÈû&ëF³­_¥¸zÈû&ëFJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJR‚•çä;‡«9õMGR^~C¸z³ŸTÔt Wén²>ɺѮ}¡vãS97‰l¶Ã_×[4siñcëš›òŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âPmR±)ü¶âSòŸËhþ%Õ+òŸËhþ%?)ü¶âP]¼ü‡põg>©¨ë:xá·JãFÙÅö+Úì¶šôàçNwgÙ­«ô·XdÝhÖu«ô·XdÝhÐ)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPR»ü‹?ÕÜú¦£©.ÿ"Ïõw>©¨è2݋ǥÈ;(_ŠXo/FÚ(ø)W>¡ó«ó’?elì?ÏUnoK`H1TûhTÔ¦C±ÙÚ¸Û{ïJpruiÇ“Õ'[n™(ñhî9"*?îKÒA~j'~ñ¼gxt ¶¶Ú›JÅ©*qZPGàx{Î?Ü {äÙ[;óÖ{Ž^b^[Š©2äCQBÜ|FI)©’4§ CDsœ¨NpH›|n¥¾ÓÊz;­©q[`«$`éÆr½åD¸¤'˜åA¡É²¶vç§$~ÊÙØž±s„¼VkæCí¼Í½2›a¸èP[ÅN«c$«6’þc‘ûVñ=›¤¸Ò¤;%€ËN¶ë%>‹i ”œo#Vó¼P~rGì­‡ùëÂ-­¸§jR›V•„ÃÉIÀ8>ã‚÷_——üšô†bf’Û aâè+Vå ߨŒ­eÆpµ?0ÁrB#·>+HŽ.µ³ŽÚÕ’3€5o ç;è69#öVÎÃüôäÙ[;óÖS¸Fâ”®`y{!'iÇp¾ÚT–Ο  „œ« äUì_uõqÙO¢<öBe{-kQ ›­{Ó€4oÎú Hý•³°ÿ=xnÚÛÉ*hZ–¥$”ÃÈÈ$ùüà‚Ò+—LëôÒm×d©j’ÂÚ-/ %iÖ­’S˜svµ“ƒ¸Ô×+åÿŠ)Vö¥:ëNË)SmjCºq)A¥ï @þ²3žryƒ¥äÙ[;óÓ’?elì?ÏX;¥ê2åáRµ•¼ÐiQ€e !IaIs”¢ÞF£ùÇpÅ{bEÂ-ÙËt'¥)ˆr£Æi„ÅŽÉ¢½NiÜ@Rˆð†ü üÀVɶ¶K$ZƒªIRPaøD @×Ì5Þ<µï’?elì?Ï\Ô‰7G!Ù-— NºõÞ/ýËN4”LkNAA{qñ“äi¡7ç]aF|¦Òüù -20Ë).”,e9É@䡸ä/»mm†VóÂÔÛM¤©k\<% o$’½ÂÛ[y%M RÒ¤’˜y‚??œAúEsw‡¯¯Ù§D|Ï:¢Ée­„ ³%An kÂNP ê8Îá_Š7,;j”ÛìÆ›=æ˜JZÊ^Bä­N¨Œ¤ìõÀùW0£’?elì?Ï^¶¶Ã+yájm¦ÒTµ®7’I^áT›ó®°£>Si~|†e”—J2œä„ rPÜNó•xzúýštGÌóª,–ZØB 2Tê¼$é²Ò£Œî#vÖÞISBÔ´…)$¦FA Ïç~‘^ù#öVÎÃüõ˨ܰíªSo³l÷ša)k)y ’µ8V¢2“³ÔR77å\ÂúîW–g]¼„–Ð…†Qöilë ÔÎT  9Ip’tïƒg’?elì?ÏNHý•³°ÿ=aZ_áÆBcÉ‘.#IÛþ?‹¤©` y+i#9[ƒó摌ŒÔr® ‰m)ÙuËa•¼ž*Ÿûwó (HÓœ”¸à‰9NìbƒxÛ[%’-AÕ$©(0ü" kæ‡ïZ÷ɲ¶vç®mç¯ÅÓ.+Rd-–$·éöKR ã©!;•¹Ü 9:?4øÿrá&4½´ÂàyÄèf›WŒ¥Æ %\èH;¼/T/$~ÊÙØž¼9mm”…:-HIRR ¡àdüþrHé5ωÒìwY•1–î\rZ•(}j [Hdà¥[´iÞ?8¿þ®;²d­æÞaµÅÂJT#—” :3œ È0œ‘û+gaþzrGì­‡ùë*Þß$7lL›œÆÌ¨%é*â­‚Ë£g„ £jÈVO‚qЧéÂw.6î0ÊØiÔF+NÁe'RR]ÔÒ´¨(¨ ­`dbƒ¡äÙ[;óÓ’?elì?ÏT87:àë’r\ljRRÓ®ESM“…„–¤îõ éY8¨míð‚CvÄɹÌlÊ‚^’®*Ø,º6x@Ê0 Ö¬…dø' ÒEµ·âP-JSjÒ°˜y)8ÃÜpAþâ+ß$~ÊÙØž±¢ÜxFõ·lXxLRC+¥!&3J_>7‡ ð3¼å'pÊz¦¨íKVR§¥Gw9?Fw$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØžœ‘û+gaþzÕ¥W$~ÊÙØž½‹!#;;gaþjÒ¯OÈn,pë„ãp HÊ”O0ÆM,«z`F\§k°TÒT@ÎÕÎq[‰t*r,¥>À~HaD¶4DAŽO:Žãå8ÝŒíÐgJ¶BCKâ®Ç ·“j’@HµýPy¹ëÛQ¥Çe 2ì6Ú@ÂPˆ¤ {©J 6w“³«¿MäÆìêïÒ” äÆìêïÓgpé1»:»ô¥gpé1»:»ôÙÜ:Lnήý)@ÙÜ:Lnήý6w“³«¿JP6w“³«¿Q1LVÄw!2ÊÛqJR‘ô½Ô¥»;‡IÙÕ߯1µ8¤= *qZ–S‚£€2|=çî” óÄä‰&NÒÜ 6]â§QH9ÓyÆI8©vw“³«¿JP6w“³«¿MäÆìêïÒ” äÆìêïÓgpé1»:»ô¥gpé1»:»ôÙÜ:Lnήý)@ÙÜ:Lnήýxr4Ç’ëÐÖ¤¨E$dAüþp@#饽äÆìêïÓgpé1»:»ô¥ƒay/¡—R’”¬Å:€8$¯˜é¸y+ÞÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]úlî&7gW~” lî&7gW~›;‡IÙÕߥ(;‡IÙÕߦÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]úlî&7gW~” lî&7gW~›;‡IÙÕߥ(;‡IÙÕߦÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]úlî&7gW~” lî&7gW~›;‡IÙÕߥ(;‡IÙÕߦÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]úlî&7gW~” lî&7gW~›;‡IÙÕߥ(;‡IÙÕߦÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]úlî&7gW~” lî&7gW~›;‡IÙÕߥ(;‡IÙÕߦÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]úlî&7gW~” lî&7gW~›;‡IÙÕߥ(;‡IÙÕߦÎáÒcvuwéJÎáÒcvuw鳸t˜Ý]úR³¸t˜Ý]ú…Q'ªO3+ÐÞc’ݼ¤kç>SŸÝº” ò›|¡ ȆS;7A+`u«<ä’¾¦´©JÿÙmdk-1.2.9/doc/img/Makefile.in0000644000175000017500000003417112636565536012634 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2001, 2004 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/img ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = ss_mix.jpg ss_mixal.jpg ss_devices.jpg ss_worddlg.jpg \ ss_mix.txt ss_devform.jpg ss_extprog.jpg ss_symbols.jpg \ ss_devdir.jpg ss_split.jpg all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/img/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/img/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/doc/img/ss_devices.jpg0000644000175000017500000022124410770465100013376 00000000000000ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ&Š"ÿÄÿÄa  !"1”Ó#AQRST‘“Ñ'2Udqt’•´Òã$35VacÔ467Brs„²³±%Cb¡De&v†–£¤¥µÁÂÕåñÿÄÿÄ+ð!1AQa‘ÁÑqᡱñ2B"ÿÚ ?ú­ŒÏÝPWdDDø}ôþÜýé—Ë9ôÙ†¾ýßøÿþÔÎmÚ´[»NÐtÅMH=!³ª³’ôdÔ“)Û%`ˆš¹HG¨H‚I¶ÆKº*w‡Ié—Ë9ôÙŽ™|³Ÿ@ý™óÔyg§¯õEÝ]-{fn³^é´Èx­…µè,—ÇšRV“’“­¢¸ê®ýüW²va¨%j _{4!‰T/’Óì—L„šqÀïAEQC>*ª*J¨«aé—Ë9ôÙŽ™|³Ÿ@ý™“9¿³Óv£oSëKkO@z±˜×E#tŸœŽ›qÀÐ_=”Ù@ý›wì²fƒ­tËåœúìÇL¾YÏ ~Ìâõ]i¥+ôÌyõ5ìM‘Alçlž§å’lìa7¤°-¨îª(ê§4ó;»ô*5ýõ+Úê'i-å7g©j¤#ºS#“R'>ÛÎñ=‰£p®(#º¸;®èš˜ ïÝ2ùg>û1Ó/–sè³9> ím§.¤ÇÓW:pé€+îßäôXE!gu åSÁYmlnùÅï%ϲ½C3TèÆ®g#x¦Îβ`Ì·™%UïÅ{×Ò«èôd^™|³Ÿ@ý˜é—Ë9ôÙ™3šëÍEu¤µÈPÕéŽêfºs‘·Å8²M¯Åk‚ƒû'¼Ô‚ô®Fé—Ë9ôÙŽ™|³Ÿ@ý™Âõ&½¹ÐNΤ­…Û‹fŸ»ŸÒUx›­€bR\~Lq7Üë¡«ˆ¼YDA-»¤¦v­©¢ï-Ú:ó…®%í‘G5|Y€óm¡ : á£žhc¸“qÕ7$,˜±F7bé—Ë9ôÙŽ™|³Ÿ@ý™£¥dØMÓS-Úe›á2ì¶ÙE@HMUQ•vÝUµrK5Š' ÒR&&+ }2ùg>û1Ó/–sè³9«µZÎØõ“E„&#Ô±nüY1@úbJ1©Lª©¸[(Šš!"‚&V;DíG[K‘¬t­[0*$5͘¨n²3„XaÓÙ–™8ùœXb|P£T} Ó/–sè³2ùg>û3]ëK†&jɳ5ƇԕŽèâ—ן‚Z«Cb®¶È¬³QVÇ­·>AÄU%³KíYÁ‹ã“Sc ûkªÈ•Ñcº2Œ¡ ãizŠd*¦¸( zO’/û©+•HŠÍ_¦_,çÐ?f:eòÎ}ög ÚýólŠ.¤ÐV Ån¸ÆÁ¯qeVG†u~P Žƒ uAvSUïN Ùô¤óµÒõ6Ž3™ ™^Ln¦J½2"Vý?z¤Jž…UÛ|¨Þé—Ë9ôÙŽ™|³Ÿ@ý™“8¦½½×Qi;a:fa»[¥5뷣ɃµÑ­ãPim>ܺn+Tu¬Õ«.ø|¦_Ü| Ÿšë™—˜©À6UÙI““è.™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“úeòÎ}öc¦_,çÐ?fdÆ>™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“úeòÎ}öc¦_,çÐ?fdÆ>™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“úeòÎ}öc¦_,çÐ?fdÆ>™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“úeòÎ}öc¦_,çÐ?fdÆ>™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“úeòÎ}öc¦_,çÐ?fdÆ>™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“úeòÎ}öc¦_,çÐ?fdÆ>™|³Ÿ@ý˜é—Ë9ôÙ™1¦_,çÐ?f:eòÎ}öfL`cé—Ë9ôÙŽ™|³Ÿ@ý™“]CÈÑãUUÙQ>Ì͘䣹ÿÿí™01! 8ç$.òÝ6_y> ƒÔ:f¢öhK›'P²à6 ÁºŸ ½‘UwPaÐ^õó•7ÛdßdM·Šuƒ³%3W3ˆÙÒ‰µRPîDl»¶4÷þÆÅœâ³:×`Æ "È¿æÉ"%O]÷EîÛÿ\ Ø Ì8LDeel6-¬¾ÌuGàsêËìÌ=KšÅõ’ýÌu,~kÖK÷03uGàsêËìÊ´íA2kòÞ›«EÇÜ' YÔÖ6ŠKº €>‚ ßÜ"ˆˆÈˆ™cêXüÖ/¬—îc©cóX¾²_¹€‚ ÄÄFVQ6ÃbØÄã®* lŠF{‘¯wyªª÷ªªæn¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}™Vƒ¡è!Íb[3ui8Âà ÚšÑÖÕEwD 7ÔM;»Ä‘QS¹QS,}KšÅõ’ýÌu,~kÖK÷03uGàsêËìÇT~>¬¾ÌÃÔ±ù¬_Y/ÜÇRÇæ±}d¿s3LéÊM:r¬fy?-CÂ$L—"[Î oÄULjψò-‡}“’ìë“=Qøú²û3RÇæ±}d¿sKšÅõ’ýÌ ÝQøú²û2­;CÐLšü·¦êÑq÷ Ãu5£M¢’î¨  ‚w÷¢"'r"&Xú–?5‹ë%û˜êXüÖ/¬—î` ƒ0á1•”M°Ø¶ñ8늂›"‘žäkÝÞDªª½êª¹Š¾ | v2¢Gq·¬¤¤©e±¯QÔi¶P¶^äóm6M“ÍßÒª«—©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`fêÀçÕ—ÙŽ¨ü}Y}™‡©cóX¾²_¹Ž¥ÍbúÉ~æn¨ü}Y}˜êÀçÕ—Ù˜z–?5‹ë%û˜êXüÖ/¬—î`dyÄ&ŒDOuDóìÌÙ¤ü™Ì0ãîEÁ±S.2WdM×o37p!â>Qå\:,ßËÛEATM‘Xe—uNäNüÁÖßÖÄû&†Û•-z ÓT\ý!Üî=ÍãÚÅ¥÷'8(ìË ÉWtóSÒ©¿£0Õ=XÕmÞT¬¯6Ó`/t.ñOyÞÀñ¨µ‹UvîTA£´¼œËü† œpè©#|‰÷[Ë숪¾jªì›oëHkú†|êÇjliì¡ n;r°F­žü\eÇETI>ûtQ]Ñ;·æz†ÆðûBÔ”ôQÚ~t›¥WÝ6Ùm¶ªàº¤á€€"™"/NF)é,П¦µüéÉ9øúu©HÏA‡ª¬"¹Óß~*MET߿Ӟ|_Í8qÒt@c8=whznþ¾á%Ö$8Æk5‰ZÎÖ`Èi[4ãÅöAPÔ’&þfÛìK«HÝ5¨´½më,8ÃsãiϾ$ßeþÔθ1Æ=®|¡iÛh¶Q¤êÊ àc¿:yÕÆ8a Ôú8D« »8LT¿o«u¦Z'^plSr3$DDþÕ\ùc¶=Ù´gõ—ÕÓíÊÅZv¢ŽÈ¦·)ãW‘ÁG:nt‰ãMÔZB@SN;ï©Fv}¨›Õš.§Q4Ù66€I²1BÙ{×áøW'³ãÆõ5ý=•Ôm/®.ŽÎ®#ªìqk›BÂ# ´‚É’°&„hØòWÜÙT>—ì“T°Ðw:Ã’k„¥e³lðUQÑ  Itô&"j7uõ¬š}>܈‹Åé0 !¦Û¶’e³M7ENBŽ©&詺&é¶Qä=`ħc¹ÚV°äѨ/ºÐz.Þ‚ŽŠŸ‘Q-=­ªð?üã£ÿù¬\…±—ÂÒXxLJÍ8ø¼åîÛÇoÉÄ"z2‘5}=¥ë¯ÓÞÃ'ô}½ƒ:ÒV–—k2á¡§‡hÌɉ^»’EA|µDFeDÿy{×»#ÚÿãOÿ‰þÃ2Swöå(¹så£ê——.[û¼þýùÿ—‘~UôàtLc8÷ovÁÖZZ<Ù÷qëÝ®²qÆ«l¤DSt]„€D¬¸ [!¸ˆŠª‰É{²bÅb²˜§úÅe{YQ±¯“DÉyÆ-\‚ÜÖ:³O‰“ÃÀЮ"0d »*Š*¦è'ÆÅŸ29c¢nb:ÝëïKDäʰ“%ðè‘JÛŽ¼DÚ¨*lK¿§:§ašÖÃVÓÌj{/HJ÷Ö;6½1ž)é.)èpU8ŸऋÅSÎm¾ÇüØqÍ!ÏòÆ9¤:>1œSµkxPûMžÍ¼ËôŠÝ5qFfÄȸôôp”Xy´"Ti´ÝwîÍâÅb²é‹aŠË¥Së k=_u¥qÖ­*\q·ƒŠ<$ËN©´¾ƒAGÛBÛ¼T‡tD RÕ Á ÕlÐ=Ko)L  Ó#ô:Öl“ŽÇ47EÅÜÛ-ølùÆ»Ò! ¼î¡L «bÕJvD–dô®¢:û†Kîm€(’¨¨"Š¢¢ª.©kyZžþ ÛzÇa˰‘¤Å—8³,¸–©!´URÍ;Å ¿Ó²˜ñ2ç‡ù°âÑÏòÆ-Qe´]NÖŽÑó5‘ b²L´Óâ6†ë΃-¡÷spy˰©²Ø3RæºÅ<Ú›•èsc¹Chd m˜¨’rEMÑW½=ììê‹Ðº™½OTûå È3¡I(vMT‘—ÄD•öDpLM7MÐKŒþ|ýuGe½¨+ õ#WêÄwUöÙ9-0ª­; ”UDØ'Q³!MŒ$!ˆ‘ 26NÍ»Q¶—*Ò£Y7På¤fèNU °ÄãC]ŒÑH> à>ã-!+‚„o l$ÙíŒ8ë”êÖ(ˆœw§PûÒ"¹Ô$’ø"ø#‘üÑtÄS‰ªªìˆ‰Í<ÓÛ˜¢ "fæm—ÓšÓYÙéª{YZÃGB~ƶ4⌺uÒèõ™xr[UÙmöMý;&H¦£Õ‹èך7ÿÕ·ÿ#š½™Îèö[£‘uX€nµU³¼þHÖû¯U?/¡2»´k(wm¿czã´ãxLyÍA9 Š£òÀ„M¥ÙŒ/njK·XùpàÎÌõeÕÖ°Ôt6¶4öMÕÅ‚ûRkà]Éõ„$$ûÛ쌊¢¢§ß/w£:r¾Ê,£[ö©¬,![±mêjrjCx¢§9QÎ/Ëé÷ýÕ05)d¹6žÇPEÇã¶é §r) *íýù·‘º[ýXªüÉŸû#»F³Õ:VD¦×P]š£q£†™lw÷Wà ÀvûÑ^D»'šŠ¤!ÆuWùGÙ@Ô7:j·E5"Å—§E¯tlÑêG|šê>×LTQa2߇Óu1èö–Þ³eú[¸iO«ë›B°®$QG¹Cª©4J©ïª‚ª"ª¢Ÿ(Ò_æ¿IÒ³©ï­“m¨k†ú|çë$¸\e‹è¦çƒ0m³»Eà…ÝÓTïM—1öݨ,J°u£šr= ”Ú‚}eEí}¯RcNÅ)ÆH¬ÉôŒTöT]—t"LÖ.1}AŒ®vsgª-´¬yËM®Ÿ»VäÆ <Ùªmî­«f{o÷¤¼…wO9²v޳‡³ÍHµ|ü=*e,^}Õè— ¿·}²²€kVê=O1öô=t/2á5ãIâfÛä+²ôš EENjB‹·r*wæ:ËSi9ñÛ×µPÒªC¢Ê[×! qÌ—aë4DJ ª¨œÐÉ~ôDïÊ®–•^ÖµVªgÚ½J]žÐZ­!ê²$àòdDOtTTUÝymß²"&¾«^šÁöoçÚÈ£ÿ7ªã¬\õX0:ˆˆžè¨Ú)ªîª[÷삈Û_ìÑg¯gem9øŠ"xW?¾êôGžÿÛË|°`R¢I×7Ú“SG¨¼ÓÕj,Û€Órh_˜éï4…20”Ú'{ꈜ}ë¾Hø‹´Î(^ZéEMûô¤”_Ûòƒ«,¯ë!kÇ(-X¥'up·"ÑöAÆ ¢ÐÅè¸ç01–JG Ax¶f^nÜÇ%§Ö®ö»"†æM\†:n˜5êǨQn:²úÇlÕ× ÂŒ€¸Šµ÷»îA#a¯ltn»ªÓ:ÒÚ¢Än_‘¯«~²ñª#|„Þu%áÈI qQU é¹Ì{_OSÐ ©*ùYL»*w'òö}jgNÀÔ%ÇåOhÐPcHFƒdïTV›>ÿíÜ×ÿ¶hë‹ uZJÊÂ62˜aI¢p9 ¼ª›¦ÿ“|ÏQý!sùèþÎÎGv™þ¡\~n¿û¦o»K ?UxõŽ˜Ù°r¸¯¦„DEÙ-—z쪉²÷â¯^êÊËFœÔ!_eVâpsÅ‘f†‰U ˜!ïïïݽ7ÛlŸÓr6Ò½™*¢…b.訊Ÿü<½õîÉ}O©J”˜«4šTè¶€m—2T"EÛàØ;×ÿ²÷àKÑÝV]Ç7ë%#âÙôÜEÙbDT]•½= ™!œ“L¿þÛ"Zל–Âæ‰Çd´o =°ìŠ»&Ü‹Ñð®u¼‹ûÖê‹`̘ìž\?OqAQEUæcÝç'£}×dMÉE9½\ᨠi›ÍQè…ܼ;Óg׿÷·ßdÛ~mó××kµåO¥}ÂOrjü ñ¶ûÕß–Þw.›•›ëW™o¯“½MÅEÙ6RßïOu^Iñ÷êó9ÿ* æšÔ•÷½VØæÄ¦vëFt\otEMÔ…{•qUM•eEY¬äýŸ¾{AðæÚÎ]Sfé &î/P‹uTûï¿ß}Ëï÷ßÏê?Ö0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ05n?¢fÈ?ûW6³Vãú&güƒÿµsk‚›¶â->êøÉ•Dhøª{‹ëÞ›¢zU7ôgˆ ãzϦñ85 !¨UG}“ÞOì̱¬kàÚ[7:|X¦r„Ä^xAHz &芽éº*oý‹šÑ§ÁwY=1©±œâðk¬.Ї>¡¯[í¾Ê‹¶9Õqu&Ÿ×Ú–Ò»GÙݹk%·¢ÉˆäqXX±Zq²êºÈœŠ» ¦Ârªª$S—Ý£/Þöoÿ¬˜^ß;¯Œk¾ë‡íÇŒk¾}ë‡íÎ8ÿƒ)¬ž®íXH )ºVÊ’ ²@•1ù1Õgýþ(Û¤\•7DîîUß>ˆ­ˆÄ BŒØ¶Ë £m€§p¢&È™ãÆ5ß>‰õÃöç¾ë‡íÍàÁ"9×ùLB³›ÙÜt‡ Û ÛÄzÖ ,#ÎIŒ'º"IÞb.ô\1✳Ó|ùZ¶‰;EÔÔá£bıv;n¤ÉÏÕô"(µÑ‹È’ 6@bm.(ÉŸv•…i"‰Nˆ¨¾”WGíÍhÅCÒu‡`6d»‘ ƒºÿ÷ÍP|Éq¢{]±‘i@švŠÎk›ö *r¾ñE® îÿ˜ª{)&Þç܃É8ýÙ6˜òGBÖÒqÁæyXdZso8иyå²|9bñwÏâýpý¸ñ•wÏâýpý¸ˆ ƒí6™š]¯hÝ(¶µ³œ"V£Îa÷8¢w‘pl¶DïUÙÓ”é:ëL¹1çRãR4†áé‹äâŠ»íæª'wö"'À‰7Æ5ß?‹õÃöæ%•P«ºÉƒõƒ”s×Z]=7Ú‘?ýÔ½›š6{Z‡µiÚ†¹©åX4k†D¸OÅ'^eÙFj€ú#›lðw®ûî½ê¨¹zðªœÁúÁÏA:¬>òd1üŽÛ»•>л<Ó:è ¹¨#IqØ"àÇq‰¯G!ÑzF<‘U°^ýþõ6ËŒ«¾ë‡íÇŒ«¾ë‡íÀà}‚ŸùÈHµ.L‡£Ž½‚”§`ëÏ>ú8÷6LÈ›—#ENí{ÕH;ÝTjÆ+ëã5; ‹m¶Ð ˆ &È(‰Üˆˆ›"&dñ•wÏâýpý¸ñ•wÏâýpý¹# F‰£k)ÚÓ³-¬.ßPVÊ‘4c„n£6rc"¶d(¢Ó‚‹²¸}ê›ùË–W|þ/×ÛW|þ/×Û—Uq ;ØLdí"íÛ&L4TyL¹YZì·$”ÅðvyõIÂ"FQÔsÌUó×tT@MœÚíkGjÛ~Ù)-iôû³*EÚ2~`É`:DžûÎò45ØN"»÷§§»;/Œ«¾ë‡íÇŒ«¾ë‡íÌÿHúÃk«ã*ïŸÅúáûqã*ïŸÅúáûsJã=¨SÜTké÷¶²%‘·FÎe„6œ)5­°Ê"Æ"՘峎õÓd7‘³0qyÞ¯c¯Ò-of°.\òF`K¢^“ 9Ç”-4ŠÙ£gÇtۆĨ®}Uã*ïŸÅúáûqã*ïŸÅúáûsŽ/áŒXÿ½ZŒTŠB§Ù¥¢ u­T,X8æÊÅb¸èÑô[1Qk¤ÆÄ¦œ#4¨»©ovÍ_W|þ/×ÛW|þ/×Û™qø1e]“%e ¸,ÈŸ¢cEi—wDB8 ;)!÷'Å_O¡r»?¶=ÊT;P8“H!Lyqú½Ê›÷r."*wlh¨ªˆ‹KüßvCýHпª¢þî`‡ÙïgZ«“cW¨njýO:+ )š™#m4øƒh¤D¼E~äÌâÃýšÃŠŠù&´øYê 2DÉÕ§tÉ6&ÅùÖŽˆ—ÿR!¦ÿîûn½ÿ*ú7Oh= aéjÚJ†É¶Ût£ " +‡÷Î*n¾qª¯z®ýë“Þ2®ùü_®·4Ë_K«_™3ÿbfž»Õt} ÝØD}èM.ϸÇdY߸T‰÷[8¸‚w¯œc¾Éº¤§Œ«¾ë‡íÌ2¤RË O×¾ HbŽ!'¡Sûp> Ôºš+šfÚ„X&Yð" ¹PÛ}€ “žhmäBX†Þj‚ŽÛ'}·´=kØåû>6«Ñ/A³Ÿjĉ³ä F]’Ç]J‚”ÒçÌz€ª‰Ä•M“bÛë¹0´”—AÙ(Þp;„œm¢QüоŒÙ C¬ÝQspRfcwLË‹8gL:w«G@j¦5–žföM­|9%g´ “ࢅÌPH·õD/Am¸ò["¨’"¢¦Ê‹ïæ·Œ«¾ë‡íÇŒ«¾ë‡í͹¹Œ«ô¼ÇϳûHÔ¾é;â{%&Â1’©EÐBP^þ $ˆª¼vNì¬ö…Ùßj:³KX¥Ý|bµá0ªë‘ /¶¨b.¸ò ¯¸¨ˆî¨«Élîž2®ùü_®·2®ùü_®·““ÿk³uœézSUÂn¦„Ú¼„ÃF,ÊdI‹bïmÁ?4À¶TUôw*cÈH14¤YvÐÙ¨a7‚I”Ú6޼‚› zWdUDßЙ#ã*ïŸÅúáûp8Ÿiöð«h{D‹náÇ¥²Ô‡ÒK`ãQ’‚+†óTuÅlXmIvGØ»„¡t¶¸‰iÛ%œÊXÓšM@á­œÚIÞj"(ÀÌFüÒÙy*¦ÿžKv‹HÕ7Uomã‰qÜçZ„¢äE⮢ «~(M¢®Ê¦‹±eûÊ(?®ý)ÃQCùýwéHö]’ÄÔ0tÔ¦5!ج…˜dÀNâ¦ÛJ°¡$©$CËšîn©nª›" æ®¶—C²h¨$Ej3¬ÄFÅû¡©º T¢tÔÐIv^/vë“QCùýwéHö¯]u|hž2®>ƒBß-ä&üQ}ºÙÏè/$ê:'`Õ^»éqár`W]Á yÈȇžìW´4yCÎCÛ-׿qø}¦ÂÓ7Q‡oa.΅ȵäÍ!×>ŽÌV•Ã7w:OFp9*“=ë²!eïÊ(?®ý)ÃQCùýwéHöyt¥ª_'oæH‘¨e=>#JÛÎWøD•a¸æ®³æ›¨$ ¢* ©²"GʧíËúÙ±]»b„NE”}8̶µ%Jp‹†ªŽrs§ ¶]Ä•Q/QCùýwéHöòŠÏë¿JG°ÅÇJª-ÝŽß6ÿsÙÊuŒûG,û@Ó ÖM}M5Eû¡¸}æXQâ:¶Ü%iÅ÷P4{ŠòïOMãLjš83&HizÍ´,¶ùýꚪ®íÇO£'|¼ÒŸ…ÕýÜ ßgWWݪB×±f+õ¯Èƒ-¦äº0¤Âi±o›".Bqî'ĈÚ걺™"n«™ãöYx?gøu3 mTÑb׳dÌÇ@û—Ý82Û#¶éņ÷Tä[^<¼ÒŸ…ÕýÜyy¥? /«;û¸Œ‰ÍÌåvE~þ…->Üm;sRã¿*Ê;¨Nê4l]ðäz+‚$ªà¹±$„å¾È=Ëž«;%¾g£eœ*g¤ ëÈb•¦Òc(2ÒÀlEP iXPóGb‡—JòóJ~_Vw÷qåæ”ü(¾¬ïîâ"‹3VýúËó9?÷±›YQ·ÖTgedîô™u£öþü›TTTh¾"ý9ËÈ_+]õÒ?Ãá,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,e7ËÈ_+]õÒ?ÃãËÈ_+]õÒ?Ãà\±”ß/!|­w×Hÿ/!|­w×HÿrÆS|¼…òµß]#ü><¼…òµß]#ü>ËMòòÊ×}tðøòòÊ×}tðø,eV6® ºû Cy¶„ˆ”}7â*j(¤Â —UDÝ7Û-X!ïí*±çÒcc#;6íNË^Uƒô»=z{õ­Îj±bOJk‘7¸H‡»³˜$µQ×Pꩬ8n5Vr6 Ƚ5dȉµwtV€•Á$UT]×tk™³÷Aj=Oy}]w¦i+¦’ÝzÃ’ÉÇɆD(Í'œ„Ü”·ä*œU<ìÓíO´ Ñw”µ|4»>3.G…_ßx®8t é‰ô\æe×Ýdî^ü·SREª±»ljۙÃ6B8¨¢&1ÙŽˆ"l<ïÝwRïÛdDšH¯ê¨ŒÜy%Áƒ&@Š5̓5TÛ~H±ƒm•e-ÑwM‚£Xjy¿OÓFÓš^T šÒ³ Ú…Çmb‹Ê‘6sΔ5äˆàŽê­ï²B[öƨ Áº"üfYñÍ´ðxðrÈkÐ{¤[6†2I\ãÜ,}ïÝp²ÑoÍ×°õrk AØm Ài¸~ Œ¸L“­/(êâ‹…µUçÉ;ø¢íšû-¡q½D±'ZWɽ³‰fì˜æÒœw£<·ÒG Aê8¢B[“Ž|=ÈÖïŸBtÊïN©>Î5(jÊ7¬zú^GNI1Ê‚ëÆqÓaØé7Äüîðâ»'ß¿d¯Üö±§jõ¦œíP]DÔÕ뜱l$Ë ~« TåÄ<(û‘ ^rn¼nºn²mT;PÙß:N©¤‰íÇ6DàˆÃMÙW¼Uw%ïÛdHÉš*ªWz’&§.á]¿ÄÇÍ~/‚ôÄ|Þà_k’.ê¼eMÓ`¥Þö¼åvÒwÑtÏQÒ±hÔ&¦"²kØFD”65ÞÃt%ã¿Om“–ã¾Ôg[ê‡)t~˜tH Ú¬t}†ãV¾„ÚtMËÆB($¢žæª¤œ¶I]’ÑÇH ¹u{*=RFn©‡g„•H²ßЈâ0*®)—Ù =9…®Çia\˵¤ÔZŽ‘ùr¦¾òCy”e Tu¡ê2Jü•*„>r!m²$šÓ#t-GmЭõLjÚ꺇bJ“^ÌvVáÕÖåÆ!$$.—{ 2<òêw#N/½¶ji¾ÛŸ½ÓQí ×hIRæ5X«‡¬ùlœ¹QãˆÈm"nÈ‚ÈNdœÕPv^[§@¬ìëLVÃrXïe²‡bÃ}OôW"±†…µÛtœPEEUUB4UضHx]•,m%Ky«^«‚Ô0¯mÀ¯åb<ˬEE"`SÝ9¢¢–諲¦¦b³D…—E^¹zÍ“3ê¶ΪjÁG›:M¼*q1VÞl‘TE{Õl¦Ùv®ûL—£üYHïƒ[D¬é Ïÿs®Ëx@Ãè÷²8úÈÙ®ÝÛeëIiØÚv–š—2t™’VTÉ“ Ié/(ˆs.""›¢Š" "&f¦¤‹Ucw:;·3†l„qQDLc³6DØx0 ߺî¥ß¶ÈŽ™ömÚÕž¼ŠØÒiý1&{õMÙ6ÔmHO³‘4‹cƒxïqp•òV7M·ÍW;l“YI¤­µŽf;:žªM¤TbR•¦Á˜æÃgɆýÑ×$ H‰º!¨")sóo{>®¬¦©…MkiW2¦•ºXÖLtJOƒ´©Ílš2÷MÔnnqARß<è~Ïaé_p¾ºµñkÕuþàéÒŠç‚ûšôš\|½‰w/8÷Rîã6»ûâ·wÙJѶ¥·¯…àš*£Âü]üšËUtgŸ…Ä'Ücø2õvðž˜ùãÌSÍߺÓÙ–¿=ga&;•5ÕèÓ=UŽ–häèÞr"¨ÊØ“&½þ…1ÜI9o¶ÿš?³ô‰°Ý´ÔÑ ‚u`(Âq©ˆÉÌŠ2¸œÚŒÚýÔxïÝ/§´[UZŒo¤ê ˉLÃrD°u¢HÌ8m™ˆ¨6$jªÓ~sŠeæú{×væË?øƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÏøƒôc€|Aú3Ö0<ðˆ?F8Ä£=cÀ¨#è_{*äÊÌ´°WäËAeÑi°nA¶"0%_5SuU%ôïèL´¹üÙ~EÊû4v){E|úYŽ :ß„› ãjÓh©ÌTWe⨨‹Þ›¢÷/xz¡›A©+§ï_·\Ž¯Ç±tÐÙS¼•>MÑQQESqTU±R<äšh2.N;³5ÛmÕEr…£´Çg:%Ùr´Ê3ä5Áá ;ÓÌ#$RNý—mÓuDô®÷­<*~¸I6$ŠÒ*|b`oæòâÈzK1ä²ó‘\F¤2jh&‰÷¥ÀÀ¶^ýˆWЩœGjžÓï4Ⱥ†[¶UõnØJ‘§Úi¸=2šÇÙ¡›(îJ3/=vþõ-Íh³»B—§|£½¯¥Ž’Q»4«Œ¤÷N-R´¼Éžžä볕v•QÁDN Á°êØÏž4„žÒàiý[n ¨ÝÕ–ÌÁ´ ùu"Ô4êD¯ . eT}ž/¶,©lÒ*´ánEcìÞÇ´›»º†.mlâ×6³Þ’y( Ã/ˆQöRêJMÛhy²­«´±´®1B8Vj‰ÞH1ËŽÿÜ‹oƒuørÛ•NÓ?¤ªÿ3±ýr×Rö•YùôŸØØÎ‘œÜÚUgçÒcc:FÆKµù“`ö6L)2b"?eIº:ÄB’ÐÉtU;ÅE…t¹'zmºz3Ž¡"m†­5tèº'Ã¥Œ;Fõ „ X€¢ØODêH7,ºh]Γ Ýèúò־ަMµ¬‘‹ 0suÂE]“}‘uUUTDDEUUDDU\®¿ÚVf¥«#²•Óu÷F¶IJm98‡ê‡T"RAB]‘SyÆ÷XÙÈéµ&©zîo­ì"ê×£j–cŒõ£:Ô5š~‰ÓtwrÁMÒïiXmmû¬ÝŽêJþѧ&’ÖÏ\UG¯t$·6ÿÃ#ªßò–ã©*°Ð"* ¶&®ŽÃ² -üµö’K¸”ãp.I–Œ«&Ó.ºœš|EZ4ï"E-Ód]Ó2iÍk¦õ™WUÍ|ä£+ èO0/´„"®2N‹ÀŠBŠM©'œ=ýé›tÞnû3ô¨öÝdÜ+>ÅÅìª=<ó2ÊL¶lÝ€‹$I„dæÓ—.™J1kÐá¶"¾œ¦EÕŒKÔ:.¦f³“_<ÕC÷Qf^x$x¨M²NÆHjB/<þä((B®rä€+Ú5f«¢ÒÌÇrêSÍ,…$e¶"»%ÓANFHÛBEÄS¼‹m‡»uMóIͤ‚Ö5o Ü”LƒO·㊦ò ² AZ40â*h¥ÈvEÝ38}_U— ªÔ –¤Ô™Õòªnç]}½Q&Fï$–E²–dÒ-Yª‰Mª›¥ºt‘rÿþO¶RlôÍÃŽØ,èìÜ8Ô3 ',XQ–U™ŽyòC’’ó$EBS ¶U˜ÓtQ7%µ} a”}êù øCjà6„Ç&ÓÂMÆÅ®{©‚'y&óºrö³PÀ)•n¼`ÛŠÓ­¿Èï4hˆª4à‰l¢»¢ìH¾…LÔiÓÍÂ_áÉueÝ›=­¿.¦±ju¬UV ÷dW‚øC‰ƒÃ±ÏSx»ÛVDô÷Dös}CÚŸEj(½¬Xø™n|[gÞä¶ãm½á3dÑ×TlÚ䌚qûÍ»íi¦¡jv´Ü›  ¶ø¤wI 7U¶Íä˜íæwl‹ºdlÓ´„Í0î¦a믇‚ðåæü#ÂLAŽ€“(Oó"Nšßû"¦f4—T•­Ÿa€òõ‚j†ïl©*_‘zìg¤H9î¶;àr8˜²‚¼…UPR;¼†Ä]êžVÔC®I2e$Vž¼—UÇ]â(<Œ×¼‰vÝU{ÕUW+özûOÖÒE¹™Q·Hºb©¦ì Ú×cW[ÙO}ÄIº¦éß– ‰ñmj¡ÚA2r$ÆCM)Šª‰"®Êʈ©ï¦#I»Þà›¾×/šÕ¾MH}Mläò§µ(%›Îxå—U³ÝÅè½IÍ’7÷Œ´Ž¢*¢&LÀx®»1¶q»»‰6EzuZp«µd÷££¯µBX8ÙÍe²æé‰¸qx6׬5Únˆq©ÎÒ£p… È¢<(ð«¨Ò‡ò„WA®h¤Bž•D_%Úv òM°7 çXO,¥6 NsŽuA]iUHßÎMѧO7Ãð³­ð¹WmtÓ!Ú6“¥¬¼Õ%.#Aahñê¤8 M ŒõzJO;ÅKpóÑ·ÕwUUËÞ¶:&ôijÔÖþ'©N3Ƈ_ÒóÇò€0 ܸ§q&ûñïEÙu©µ®œ¸½f–º\—¥Hãư_òclÒõ|u®Öü U9¢.Û.Ò·vq©êÞ±–Ü×Yg!‡ éN®ä‚œZdH˽S}…vMÕvDUË5Ý—NÐôk݆è9·:òD«gꙌŒÄÔþR,3$ï„ÉG@›RE>¡ó;ÄÉE3au-RêÍ!@Ïi¡;X*UŒ•Ô(Í{(4¦ Fä åê€Dd.Bœz¼½{¥ãQT]¬Ér!\EpV-t™:ˆŸS¦Ûdb(& ªBˆœ“}³Èö…¤|8mÚ›¾ÐF$7ãŠDú 2+!Z40Q$Ræ;'zb\ã°Û[Y:ð«ÚÕ5LêrÎÎãöQÞ—Öe=ŒzqL‡Â Ê¨¢"oþîY;}¹¢¡§¬lµWˆ§·w_ࢷg_agÅ\ÚGeK—1$%^íÕrç¤õ=F¨1ꃛüŠO‚ÉjdáºÓ½0s‰6ø¦àëd‹¶Ê„›cRjz;"¹›cš×Œd·;­@}æ‘ÓpqÆÀ®Fà +Š(ª½Þ…ÚmoW*²¸‡ µè÷tÝ¡Wjcµ°„Œé¸öÒ‰ØÑŸa–•ài©JÁ4€¥+sÞ„ª‡¿ÈžÍçÔúË=f—´ Q½&òê£UL}¢2M;Õ†D !U†ó·M³²Xk*Z™½6oÌ‘h}>lï‘)G`' !dWeóœQM‘W}“|ÒÚ>‘–3VÙÓõ"ÕJxÞ¢6®0 Ú”€CTE6Å=õDÄr×;èLqäÖìN¾l=ÌÉÒ-ËWܱm‹)ïËv#.®ì°¦ñ¢‹H‘WïÔ×ßÈ+=K¥ê?Ê"¶´µ›,K°¨–ÌÚÉäM¤®­zDŒn(4麢€FŠKçw®tj+H”p.êßðˆ›•Þ=Fœ -‰SqT]•~ÓkSÔ9«ÜÒhsBØ#¤`>ÛN´*Ò6ñ4çy¤TUE-—eEÚÉß>Ô\Ü›Vâö—Nüjz–ºˆ5KïÁrG†FFž$áÞmd‡M….„“u@Í´ÔR @É—:ü#Åy Òg6Y1Æ; D.´¥ è¶&¢Ž"š¦è·`Ún‰‘ LÖíÝHì6.£Ž@ ű8ü< TÌ®hª`‰ÞIº_i:V-HÚ8W‡“¢÷GOÏuÈÄÚ >Ø2¦Âñ1$GwEÝ7NüŸùéç[Óc~©>Ï$K— 4ì¹ïÊ~[ÕQ\}ÙL#/„Щ¢ªªªªŠ*컦qzU¦íìµÚk´i2i¢U82Ž^ª"zdž»(/ˆPáG9³xÙþB(€&½î¢|[Z¨vLœ‰1€Á“d @b„*¢H„+²§r¢*{镨ݥhÙ !BÎHôë§RºK~ß1m ŽM§\TÜEkžêbŸï&úŸú­4rj÷Ü»ìÂÕÁº¸‘dW§U¦Ê»UOr:8ûl (Jæ²ÚótÄÜx¼(›ëkjãKinܨtêëÃ9OPȇ6Ž£7‰ÉBuÁ“:¢¸ê§s‘—œª«–¹¦é&*–ÍNñÈí¸ãr::~{®E&Ä …öÁ•6‰'Qt]Ótß=/iZPfVE#»p„ùPNî“â$Òu•žš*¡&褜U eDœ¾>»çóÐû»òÞí*Ê–£CÙYj;¹4•L”™‘ÞVœæ)ÄL|äRU@óv/;¹QvTãñŸ}Ù\Û íMg6LË‚¦…¬d¼ì3|nSÑŸ÷bC’Bfâ¶Ù"슫Ýo-`ÒÕ½gdñ5ž<ˆ[' T‰DDQH‰IQUU+R;MÒLÕ-šÛ±›qÖättü÷N)¶ f/¶ ©°¼L :ˆ;¢î›¦ù.ï&¾G7[ÓvÁ )Û…¨ÏKÅ–­ÉIñÍ-ˆ«ä“ŽÉRy%m[؃½[t¼âV…pvkk'^{Z¢&©€ÝCÎYÙÀ¼~Ê;ÒúÌ£'±N)øBôUDMÿÝÎAÚ™¾¸ ª—-¥>BÙ+‰K0c·ÔŽMõil•§.$H^z"§%Û3éÍk¦õ™WUÍ|ä£+ èO0/´„"®2N‹ÀŠBŠM©'œ=ýé–”ÅÝšä«vùcºšŽÜ³åWzMÉÔÒ°ê §]"7xñeTPÐW~=Õ­«h¢v“¢Ø±×NxÚÛI’ZA²¸Vȧ‹| :­Ç|ÄÞTRä}Þ¹ÕµF¨¦ÓhÇ—ÎG%i¸°_–âˆíȸ2H#Èw%M“tÝ{ó>´Ó¶÷ÍRWË’ô§àxÆ1¬Æ<˜Û4ªã/#N¢uÚß*§4EÛeÙHâ=’[¥íŒ˜Ú‡TYœ'Þ—llêijón¶û%Ô’"@µ ó÷ID…]E]zÏbuóaèFfN‘lnZ¾å‹lYO~[±uwe…7ˆZ@䊿~¦¾þlBí#IN‹"LVRÁ–‘áF)æ8rZSêÇiJChD;›HbˆHª¨‹¾Xh­ ^QÀ»« XFnTWxõpP€¶$EMÅQvTEørFQºÎrÝÆ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1€Æ1åÏæËò.V¡ˆøÖÙÎ)Íd©mÞ¨Œ¶¨Ÿ“½~•Ë+ŸÍ—ä\­Ãþ’µüèð5°øŒ8Û‚&*„$›¢¢§¡sJšæ¦5-{­a2ðÄg; D“pEïE]ýüß?¼/Éz3ýïÊÇìŒ`HÁµÒð!1 •4X‘Û˜a—ÛÚM„DQvADDDDîDLÍåáºßZ·3c”?†ë}h>ÜyACøn·ÖƒíÌØÀ¦ëÉ‘l&Âz†¥4ÄIÂ댒 cQNIݺ w§»ûS.Y^×ÑÔ~ÈþXp*CþÒ«?>“ûÒ3›ûJ¬üúOìlgHÀcÀ¯ö‡G/PégkëÞa™­Ê‹62¿¿H!¹'·z H*©º¢*÷/£9ô^ÏuŒ!ÕÖ˧d>®ÁzÚ_A¶¨-‡ò® ëÄ>.d‹˜"8Ž8%Ü»¯Aíò^žÒÎØW²ÃÓ\•d}W¤.ÉÜp#Û¿ˆ“¨J‰²ª"÷§§9ü^еŒëÓÆ»¦¤>ŽÎzª_Aƨ.ò^hë$^1dK™ª6¸EÜ›$ãwûà±\¨ÇKÙ=í7‹©"σ"‘¹2¤KrCÁ N p‡€°ˆ­š8µìªhn¢"ò]ç´NÔp{F—ªnV `ì'£µm*z¼ã6ç6Æ@ÿ#m8tZ"Üwþlr—µ‹ËŸ]ůƒ‘É1dDr;Ç Žsp˘¾Š‚6¶ " “ˆª*q]§{)Õ:Òm‰;F¯fªõø 6£BE¸œf÷N&$bªˆ¹X…¢5ÄIšSO>Ý%–ÓlW´À­«Ñ¤>ìpmâÓ"óËÔuPS-•IW¹dÊž€í]ÞÑõ^«£ÒwZb;pãF‘Jûˆ³t:ï5!Ç™vÝ âˆB¢/4E¿4¿ökw+Röu¦µæÙn]­DY¯ƒ(¨Ø›¬‰’ *ª îK¶ê«·¾¸‰ÊþI…N÷AßLÖ²äF‘)ln`ÜItåQy ¦ÚÎgfÈTÕEN+µ~?iÚëOé¹¾^ÒÆ‰©œ‰Êø_ÑŽ¦rŒâõš•'ªì–7îlø®è+ËÍFQßõêëRuMWv{rÃKšTVA¹·¥×Ay½E´z,uP]N™ï涉á*"qD^¤ˆˆˆˆˆˆÈ‰œ–F¹ÔÍèÒ¸wW1Èó\ba³£-Øä‹ WU‰^p€Q ¿5y"¯EÑöo]é*{™,²Ãóà1)Æ™x^l ÆÄ”DǸÅvBNåNü¹Òïdr1ì—V5.M¨¨©ªÓIošËm†Jnrä„­ÁlS£Ï‹Ž¨¼½>ì§W,FO›‹6cå u$æl_f;c½µá/ñV TM Wfƒ=kz¨(¶zB…½HÚÖ‚D|#jô1Ps‘+$nsdœi—£Ë«ê´†ÛHUÀêM˜ÁK99×\ŽàïZ.xK«æŠFª‚€©³Á™Û§ŸMç[á~VJm5¯*µVx`i‰U´4ELü„±r3¯#¾®¼Â2¶V) ¶‡±!œm íËVjÞr’)³ÓI‰’Ê3Gç&üœÜQØwTØuDNí÷Nbïhš¥™šE÷£ÕkÑ­RŠÔ/6‰'‚8Ib„‘D€”øµçˆ!²îà¦të¶í^«yºI°¡O^='æD)-œ›òl\mKqÝcM•Q{öÙwŠ&³2ÄR™9l=9ÚÔÊ´ÖŒ¯gLDrºUÖ#Þ¾Û¯Ge–ÀI—VtŒÕ—˜J‰Ä”‹pرЂe®–Ðj++)J½[m›¹Žµ¨êL$BaõÝBA §â„ ›¾Xê)]éoãM5F“i£ØX½:#Ï¶ŽºÓd-2Ð8$¼ˆÉÏ"ûÔA5^íšûXB²Ò¾0¬‰.|\/Ö»Y-I•‘À]Bœª1Ûq³SDePŒøŠ&Êà¦L:åÆ>¯Á:fŸìê·Z@Ôºšn£ªÓñb]N(ïIq£±c#j'¤QTŽGϖ褃Å~û3v±Wª®ª W防xYC ìlÇÁe± @Pw—>‘ ªñãº.ÅèÍ}k­íâŽêÓOÙ×VCe^~KÐÌ%º¼…­ÎK¨\ZD2M‘}Õ¿íÍþÒ­¯è£TYÔI¬…oøò¡›®<f1vœA!GH¼áqvîM—xª«ÚX.½]IdzÿÏ…ab¬ÝÊâÇI¦~0ÇFÅ© `ÏuÎ<ÕPQS¿Æ‹ÐúÏK9CMQÏr‚˜éê›rÒCc4 ¢Šºê«&‘•†ß¹¶. *¢’®mÙv`½¨ÉÓmN¯¨¬¯Ÿ®Ê§•-f<óm;ÓÛ0f2¨¼Ø¸¤¤j» í²êh½q¬µKXiÚ8LwN¹W!Á„ØRVExJ«S÷FɱEQTÆþîÿdú[{ ©¿ÓÝRiÍG±™uX¯0ä6ø2È8ªm6 D¢^fĈ›yË¿v•Ån´wµš›øuZ}ÊXdדŽÛ¼L$¹ÃqHÄ(AàĈM’*z3k²[›ýA¥NÞùúÉ(üÇÒ½øÜŒÄàÛª늜ø‘¢¡l AïïžÎÚþ/k1($I¬z–Æ¢dØí· ÂKÈmªªê‹‚^kÜØ*l)º÷ª…ev©"\ùr…¶›­(ôa©§»9Èaâ4lòŒø;jØ2Ò ’oºw(ÊÔöovÖ‡´ —2 –¢¹ W"“dHFáôÚiÆçwqâ6˜#>?Ιwlˆ°ÐûO×Û?Fœºv¸ç$¤–ÊÀéÉŒÓÀ¼|;€ISBcŠID{É6Ê×izÒdRfÑaØ? mšé™Î ÇŒû"°‘ÄyŽi ‘MÂQŠªýò"H˜ˆ­ëïñ¦K5¿‹òí(ˆˆˆˆˆ‰Üˆ™Êj´ßi2ìî.u<=:夈C‚äKùbÔf ÀSa±í›*b;”„340AÙFý¡îÓShª=F‘Ö2Z×GÑRåÓê¶'Çn[o”€ÕšÙ«ûzBNXȇVsd9__-À«q ¾,8‚FR\&‰Ólˤ‰ÅÅsT˜ÅMÙÙ‚Ÿ³½@ÏMM~ -^]$‹IïÌ0€¢Ð¼Ï„ºìƒq ææÊ îÈ»6(·;JvZêšÖCŒ%M£“ &iëp€Ä»«QvþPÚ¹0æÆTm^K”0mFÄA½•tAÎ…|¶‰RúÓçl7&¡+ ›§"$E]‡uÛtÝQqßtå¯ë}j÷g¶úš¾šV꥽<¤£ó7žkHÊÆ O²‹ÉÄ2DQ]½3{¿m%õF‡™k¯¢ÛÀÓ:V©XŸQê&_?¼ÛJÚ›$À§VW“Äœ~;ì)ïDèýG´iz¦å`¶Âz1 VÒ§«Î8ónsldò6Ó'E¢ ]ÇæÇ#íPùtnÊ}5P×ȃÁ奙%¹“i—M¶ž¢‰u€ê‘‘¯rí²Ïh»]hÿhwVš~κ²*óð*^†a-Õä-nr]BâÒ!’l‹î­ÿnj+|³—éµÚ¥æ¡§f¾¡¦mHÕá+É•fŠ£ÄIŒ„¦)¹nÑ'ÜWtãßM¦µÝV«Ò 1*²†ˆ©ž–.FuäwÀ•ׂ8FVÊÅ$ö$!óƒm²wµKÛÍ=PÍ…KŒ4Ò£æT“-tB(ÌeE]‹wHGaM——u|µ¾¬BÒ3·ÓЇÀxRÇ$Ë6ÝÖKâøMe Ë~$ žz)¢dW¢ZºGBjm?~IC è•®WÖÒŽ£›"*#Ï2n/YÖ , M3Ç}ý÷[û ©¿ÓÝRiÍG±™uX¯0ä6ø2È8ªm6 D¢^fĈ›yË¿u3Lö‹«­â°úƪ¸¢vYF›X¤M˜Š‘K>”ÆÕ:(;¸ߥRÛÙ.¨²Õ4ÖOÙ£ ô#†.· Øjð‹mŸ#Œñ¬æ©À×uACNãLDe|oÆK:®XÆ21Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ.6_‘r°R®‰Ò¨¶åî w&ùgsù²ü‹•GG‘ÞM×7}ƒEÄ‹ÜîEÝ6\ †%Œ•qVÄœBE-Õ{—Ò›dfŒÿA{ò±û#³V¼Üæêç›Ç¨î}Ä^nÜ—ÎO}}ÿýõ´gú ß•ÙÀÆ1€Æ1^×ÑÔ~ÈþXr½®ÿ£ÿ¨ý‘ü°àT‡ý¥V~}'ö63¤g7ö•YùôŸØØÎ‘€Æ1¥{U_yQ&¦Ö0É…$8:Ù*¦é¾è¨©²¢¢¢*****"¢¢¦W^ìÓF½TÕi×Jé´û£ãe$e¸<\SŽuO¢ !¡ Š.艷®×âMÙüØÐ£I–ŠüR•6êëñKE%¡Dï%&Ñâë¾ÉéÎ8x…¶µÒSåhŸ–PêÛÓÒ2b ©HÛ²é©w4O¯w¦q½Ö6v¥Ð:GÇq-ÆœZ‘F[i÷>질˜FŒ;„ˆUGdÙSd̺oFPéû,`·`üçè,› I3÷BPá ª"ª ¢*¢*ú8­6œÕLÝÑ¥õEŒZÛÔdÍ¢ÃqîŒfš†“CÃzm&íØ!´]î«íªo·AìÓDQUv©5-N­ÓŒ…DâÖ„Ey TqçÕG’ª€Š»¢‹IÜ]ûÞsã}n¬åNË~¬Ò”Z¥¨íÝEyÅŽ¤¬¸Ä·c:IÄÅh„¸’wï±wn‹¶F5Ù¾’cS£‰Îñí¢D¹˜Ã ÛˆÓjÃn£JÚ"}âÝwEÝw®öÝZÜÛ>õÅ«Í:Ë2ÆLVkž‰$‰…dÕ–üíúC(ßCfà’ú2™»¨t]EƘ¸ª`µPíΨršd¢7Ûm•(ÌIm²l@Èx¼dbÚ!èD¤£œ;ô¾‹.Õk¦*,¤XI|&³&Â4x²dCžüWI¦qÆ„M£ ‰ç7QTRBT]Ó»7LTi 6é(‚kPÙjL÷åt…D@ã5ADTïÙuÎ-ÙÞšÒZe› hºfÞçB[if–Ú[’솞hcL"6ìÎâtȉ·P”ÓuΓØ‚>Ç´¬ ÙÁ—YQ¶'׿Ày¸í¡¢ À*B‹ÝÌwT]•v\ ‰Ú+MNÔíêI5Äv-›nrI.‹Fmî¸l¡tÌÃ4ÈT‡»eM“4âös¤˜ häK ÎJcÁÜ~ÂÚ\Ç…¾H|[uçHÛóÄKÌQó„WÒ(©Ïõe-›Ý­¿))g=jwu¯UYLcׂøKi)¦ÈìÐÚ.÷öÕ=õ:Ý"õ.˜·Ó½›@¾*7ë£ Œ« 3âÉ„Ja¡ éJQJg%âg¾Û#ÙQÿ=ÿW ¿gi^Ít€$1hìo€¹˜2]3ê>Žõ\EÛEC%M€Sm‘2ÑY%elZÚøíÆ‡b;-¦ÂÛ`ˆ"(žò""&|é*Šºf!;££Äsæ *ø]žË(–ÂMFþRqQbÈBl|ýeÞ‹ÝÝû>‰m@éè7î¶ñêã5<ÉÎjO‹BŽ*—ûʤ‹ßïåÛ³(¶û2Ñ ³9‘¥%nh ”ÇÉuAcsþNˆâ ¢5Á„WÒ‰·‚ìÃFVÙð+pqï ‰ƒ,ÉÁsœ„wªhBÓH¨F¨¨Ø&ÞjmÄYÓ7ɦ¤3LÛ€SƒZ”’±æü>w…Â%p÷Uñ‚'Ns…Òûö]F‘QU1=¦§øª:—ÿá^3±6EÝ-úôB&êQèꤠ™ ¼^‡…?ùéæçžÍS;àïcÙÞ Ðe7Vëi ±ã75ñŠ$Àˆ²K¤DĈUS€ì½É“×u‘®*Þ®–äÖ™{"‡5讦Ąœ]d„ǽ}‰7MÑwETÎIO k,ï;•µ‡bÅ„)2u/ˆ¦¿É€†,wÛl€$DHŒ#Ý””u9Î{Ýûf2…â'gZ^+SQ¹ð‰­/M;ÙÇ7¦Ì@$“Êóa˽D {÷Eß#B„.8ˆˆf‹º)l›®ëœ^†– ]¢.h` S‘RúbÁ²%}•ð¹|…´¢ ŠŒ‹„é¶On¾r‚jêbR4u2ìÃFVØH6à:ëÞݼ°–dà€¹ÎB:Žš´Ú***6 ·š›{o³}&ÍíuÌv-£J¬d#Â÷sZŽÃ "4, ¨Ò6½¹'Á—8CÚjÉj##ÚaV­,ìM{GË‘^(LDF•º‘Tz6ä. ™ ¼Kº<;X†oŽt"·¦¬š·Œ4Þ䊇ߜ(صÖ_¡+-¶"œ\e@UÕvïq$EŸDåùw-Y§êµNž—Avï×LÛjCŒŠÜÛ!$MÑ7ÙStÝtULЯÑZ~lZänÊ\h“‚{>ÖTµy<á/ÙWŠ!"rïÏÞÒ­cCÙ=oGc{UÊêøÎ>üŸòÈ}Çä»!çQS7]"3.")¹*÷ '¡>}¦ÒÒΙèö·U /KSÊkOJygؤ˜d `•€‘·1HÚîè¾€ª;*çSì ºÎ»MÛxl¯…"ØÝ«ŠË^ Fè² Â)NƒÆ€K¾Çºìª¸:y¹º¬êè¸Æ21Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ.6_‘r¨èò;Áéºæï¢ph¸‘{ƒ]È»¦Ë–·?›/ȹ[‡ý%kùÐÿàk&m÷Õàs’¶›.À©¹*&Ü—ÎMû×ßÍ-þ‚÷åcöF2pþð¿&AèÏô¿+²1;ŒcŒc½®ÿ£ÿ¨ý‘ü°å{]ÿF5ÿQû#ùaÀ©ûJ¬üúOìlgHÎn?í*³óé?±±#Œc3TÞCÓ”R-ç î4Ò€ L7qÃÛl»r#!ÝQ7$ÝSÓ•bí:Lc³¦µ‹¤}ö_¦i–\~ˆ6ã„kÕé( >¢‹…˪;ªí–-mBš“N=T“ Ýf$Ç ‡Ñ}‡æEväˆã`ª;¦èŠ›¦ûå®ÉæÅèÙ@¿«z¸n:´hPE²n(5«î}4›^¡q&·ïßdœW%¦‹\Á¹Ô*"ÕÙŒk:’¶¬³>‚ÍŽ>ÉAÅtU<)´ØÛüí·Û¿oEêqÔ£jKgM.ªrB•z°® « >ŠŠËŽŠƒà½Å¾û¢¢m•ª½¨)µ&™“Q©jZ¥Óµ>&‹ E;ŽÈ8¥à½NO¤‘¢ø ñ$oa仉úrKAiUG}cw¨élÙ¹’“f3± ·Å†E).§œtÜTwäJ¼‘<ÜÖ*W&cDŽ°ÕŒi×áC ‹[™ó×Z‡\ÛdïI¤«‹Ô0#ÌÓº©Š"*®F—hÕœë$µMvõ-‘Ãm‹¡a´ˆ¥/¦Œ&Ähê¡+­!mE¶UM—lÚûHËÔ–ÕV‘+¬«ÁÖ@åפÆI· —Üù†Æ.GaÀ>^iw.WáöguûN«ž¶NœÓ¬D[U:¡ÇIe±lG@>H‹ÅÃhº{ù£÷ܤs¾+-­ÚÍn¹Ó“.´Öžµœ±ÛaÀ†ÜúÓ’ò;ïqj§y ÊÚûÈŠ¨¨–=ªCVÖKœÖu> 9è&Ì8Òñ5eÇ…n…÷ÀIïdMv’Ô«¨ÞÔ×:’¦EÃuo×A84Å–‘ÓlÔÝ}ÂuPš “˜¢'$ÿ{|±hú(ÚgK×PÄ3u¨L jëŸ~ñúMÃøHÉH•}õ%\·w¹w{!ìõõ\ PTŽWÚ:ÓRãÁ•bÛ@±bɑǢɪš"ê5Þ B@䩾DhÖkuΜ™u¦´õ¬åŽÛ6çÖœ—‘ß{ˆËTh…;È^V×ÞDUEDÉsÙÂØk7nFÙ†«åXE²— !È'ãø:Š7#štÛ%‡L8%e6TÍší%©WQ½©®u%L‹†êß®‚piŠ3-#¦Ù©ºû„ê¡4'1DNIþöù#Næíh¨4ýt{4f¦ËĤ}פWÊCQ„„’ä ó¼7oš¢¶{¢l›ô ç·ŸÛ†¡ÒzkPW×F«~$—ÞŸVrÝ”ôi HUÚâ¦ëJ®oÉKšì¢½ë|€2‚ pœó/Ë…u–•¦ÌöóˆAH”EWuAR%DîÝ}9d…{^Óþs]ª»f;¬šÃq†Ñ-Z'Û`MœîEqöSÝz}Ή/›Þ›Ú}z‚GcNj 7"ûÌ¿NÀG9Qú ÓŽ¯[¤¢‚û æ¸J½QDE]Ñ!ê;&•Wã³qI,#VMcS¨z¬Œc(èi,áYNt¢°Òí¢#i¸¯£1Wv:u£É¥º«‡p2_y׌ΤdAj(¸(×MaE&×™(“[¯-×3µñõp¹U`{´†uÆÒ×ó*ïÞŒÕm³c¾5ÕC@'Ñô2-ÚÝ vTÙVÙw6M}[Ó"TÍ·y¾ë-+M™íç‚‘(Š®ê‚¤J‰Ýºús›Söuª[röMþ« »›oc9)í8j]>h½”m¬e`M‚—.J\·Un7¿Î­yšCcLêîù ¿V ެ6ËŽ‘>Œª Èe|× WžÈЍ[z­í_OXËŠàÚ¹] á2VJÛ`Ã/Lm§#´BN#¼ˆ^k¼[!E4ETÙv¬½Ø‡:XðÏO:ÛS$Éñt;Ô¨i^ƒÜaõÓ¤AÒRêÄóË·ŸÝ,}”«š v•S#R œ•¥OIX¨i¤á*ŠºÚ8¢-ŽýÉ¿¥Vƹòû'NÿN…y`µuoNl ¾(1¡¶†ëФ‚ˆ(ª‰é^õUDDÝUQW)³{MÔV6É¢õ+£NãÍÜ2ŽA®VÙmåê+’D ·D‘[#M·ßeîËV®…se§&ÁÓ÷MÒY¼,Or"IF;Óué© ñÝ¿¹U¿m–£SÙ̶´CzZÊÚµÖÐ&Ïrs­,æÄ…ÂmÕvC¦fáŠsp‰y¨qONA™¾Ô+VÆääïUËýý_úO¥Vj(ZhÙÓ÷$bfCÙ  ¹›®6 éM“—%ïÙeÚ{I­1ª˜ÕñÒÚ,!bÝc¶1åôú¨Fޝ%u±RÔEWeTT]¶;PÑÎkJ¸õêåGlÈÍ‹ŠQ±eISˆ¸"®ƒ‚ŠH$…è2Ý»h&;:ÔÍêJ ruŒZŠ6bµK¯:„Ób>®Œ{£†Ùpåæ§ß)"ü’°SkGíjnäÇÑú€li§ ).9 $‘“L¼Š’•›à]î"÷m¾È»zT†­¬—8)¬ê|sÐM™Ý"q¥âj*ËŽ  Ý ï€“ÞÈ}%¥µ=Ž¥›;UÑK;ÇZx= ¬x<¤ŽÄp4å(ù6UC¹T•|ôNì²hú(ÚgK×PÄ3u¨L jëŸ~ñúMÃøHÉH•}õ%\%qŒ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`ysù²ü‹•¸ÒV¿þ²Èçóeù)S¦Lƒu^o·ß~í²£-;!ò¿Â“Cy%×Oêø/‹úÛ–Ý-ýÏžü¾÷¿}ÿ·'®ˆ¨­5FŸ>ÞRÄÔÚ=Ûi$ËÄIâäN‘#hîßÊÝ Ï½{¶Ù<ö¨5#½¦¥´ùµò*Ÿ›ÉBå(>Ð#ÐÖ*’£\ïG˩緷 öžZžÊm»@wzÍ?YCF¥»îœ±aéº]ÊèñEk‰.Û"†ËèÏÍcÙD»©É çè§í$¿7įE'Ü$E7:KÉS‘'zûêŸngÿª³“W´ûk¦µ]ÓômM‹2[ÓXj9¸ŠÉGå¡ÁótöNj ~W*µFªº]a]}!Û[xÕ“gPG‚ÊÄ…Ðl¤¹!Âp ew§îƒÈ¸Š"gA×¾Dx¥Ÿ/<žño„KÇ][¿¯›ÏÓ¶ÝþœŠ±¬ìÍ{ìkôIë ¹Éöb­‰("tÌ7N¢¨ OB mèÌÅÝú² èmk©nê–eµæ¡¬¶·§+*øKµ!ðë2Š”—ŸXUÖÙ’àŠ›œ¸ª'uë±›«›z«¶odKvUm¹Ãœ ÆdÐ_ðtè)îâ’+[_9 ô²&lõ = ÜódÞ¿e*:M¡'3”>•"MÔû·$ßÓ“ú$4 éØë¢†”i IXñB4‘•wÙTz^o¥}±‡BusÝI«u$m}9cÚ8ÌÛúÊ­FXV¤·+Á9¸d^íÔþTê‡@Dˆ|½=þtKšö,Ç´V¼ÕÓBòeJX5k]" Ͱ,8ؾ ®—2tvGEäâ‹Ä…UovCysÆNy[Ð/ëô|aÒó·éïîœ~û~=ÞŸíÈMïc!KtºAÍ5bÊ%ÂÕDa$$Oéù¼UÓÏîTBþÜV‘Ýu•GÃu‰v8º«ËýIá³d¸T@1+…É!ÀjnïE9y†ª"*(ñ¡oÅ6ìTìK‹Q4ùÅ>c,oÊ&Ä÷Q ÅD仮Ȉ‰¿vV,5¯eíÖUOŸ«tp@WHë~Æ25Ôm8’²J[r=•G½öîß-peÅŸ ‰Ðd³*,†ÅÖdÐÛt 7NåEEENåEË,êát»´{šØ^*´rmõ ÛŒbf ,á£Æ_Gór_hRNëÕŒª¾j®û•Ú£VÌÓŽYyEqéuœ cÚ¯p§±"Dtd«M“|ÃÂoxä(÷î©—r‹Ù,¸ú•’¢g¨‡¨ÁB)1.H²ÓÑÉ ws½7Í9ìv%iW§aOg³Éµò ØÓì¾0ÜiÂR0Š+º*©("£~úŽýûd:y»ÉgTƒÒ-áöÏ_ofÈ©´¤Ÿ)kiŽ”wc»°&È[G{Ñ÷UPÌ“rîÙ,×p¤ØU½%´Ú‡œãÆd0dobE^(ðw¢*.â½Ê»l»*TœÓýÆÖp!¹I¡YÕ ƒ'’‹g²(c·Q±AQûÔÛm²Ã­¼•òb_–¾%ñ™á~7éx'ß}_3ïøm¿ûÛmß¶?oQÛLìoDj ºÂƺÒÊ–4ƒj²¾;ó-%¹³àÛf(›©© ‚""ïÈUs#‹®WShˆru}”[‹[›{RÄxG;,2€J½±¾m‚{®þèJ+°ì›öº{°ØrºE¥g1hä¿^䘂+¤è†æÒ’pU1ûÇïGÒˆ™/QöeMŠ=#À¹qÚ’*"°À6Š…ÇcEDÛÎM“¿J3@Ž¡^ÐõWµÍõ%S D1°wœhŽŸa†—`iZô’zG7ûV‘o]žÞ¦ömJî¶,ˆÍ4Áµ1©3ã0bçQ²4Ø öVÈrÝwÙ6™Ó6ÚNkö´Õ•$—£È#žÍ{í4ñ’©+¢ ºêª]ê»än¾‰Ù´ùÔðuìm%*\—Iš–.ÛŽn:d „ ½äJªÚ*zªöch7•>çWÝj³aÌŸ}Y§ëm V6µÑ¡¼ø0cá$òÜ\7Ѥè qâJ¤›î›p¤k¯kÊš«Ù·–õŒE&[QGƒ”H/º#ŶÙW‚˜ñä …º"å†ÍŽÌ)u6LèêÛ¶Ûn%(HÍJ߃mGBØ‘7^(!ù2šÏò‰䙯ìň‘ÀcÛ¨3[hUÐQöM‘:¢ÞÈïûè™#8¢ïTŸc‚Öú®ñ«g%¾uv秦x2ÈpQ†\.ªÆ÷17mz}ÉÃoJ*榮±Ô ö_OêYs%922¿JÌ& 4X<‡®ì‡TUÀ%q[ØÇ‘qD%˶›f‘ŠC§¯jœ™!¥x‚GV‰9 7ÃÍ⨻¢§rï¾Vík;)w´Ò¿E²pÛÁIf*Ø™'LÇ’uUEvTôqM½ªçwòÎÒ¥vw¨un©‘Wfª±‹å–êqãBC¬q·b{›¶h­¯„:ÉuÄ”sTÛ¹sn}Ö¥ŸþOú[W5«-à_ˤ„@X‡µŒùM²- £Ì8‚Šé§Þ ¢!¯r&Ör‹Ù,¸ú•’¢gª‡¨ÁB)PK’,´ôrBETW;ÑSNjÁ¶ìWLÑ×½ ϳêZ™Ž\eøqã» ÝiQPUÁRôEDUïɬD-i3+½;âÔC>qO˜ËÛò‰±}ÄBqDQy.ë²""oÝœ²%¾ªrÊáºíe:â­ˆ&/جm6fÄ#ARàD=`^©¸ â´Šj¼‡:¼qgÂbt,Ê‹!±u‡Ù46ÝMÄ„“¹EQQQS¹Qr…GWØŒT¹ZJîÏHñÊ=ºÃbô™RE Šw⊨}ÛŠ|kJeE*>¥íM4ÇÊÎáˆ4ÖrãY=µXYEb3ŒøJ¸ž GˆÕ׉5·œ†™´:×X<:.ô§Ía‹e§ìü]ÉH×R;¨ªS:ëÏpQAê5˹ rÕ&?aé§*gIg³´£aã§Ü~ Û¤¨¦Œù¨J¢;ñï^)¿£&¦gNkÈk4t©êõi 'Y#­‡M{ÛßÝ8í¿£»Ó–&ŸÆ½î©>Òº½ÕcMÍ}/Z¡Áì\$ŽIȶ?7~;¢)"¢*¢ªÛ/,°±Ö‹Ù½•ÚêÍM æç”m:¥ 2­‘äe¸ÞÛ‘‰yhœAµéªþŽ©«#iézz[:®=\Š^(rÂÌ(ÜD‘MóvED]×Ш‹•(6ÝŠéš:÷¡Yö}KS"QË€l¿ Ðìá;ñÛËÙÏ5ðbëxƒÁ:ýC¿.× ÷îß¿¶]‘±ÚÜÛÈU±Ž†uÀHAuËPK¢"‹ÔU˜H ]MUÀÛnýêÕÚ“TZ;£åUjµ²³b¶\ʸí$¡¸ ”™¸aÖo’uI­ÌW€ð-rõÚ h¯Œ½ &™XHòx?:>¯ÿG[»—äïÈÙ•}‘¹­áœºí Z­Î“ñÖb¬òà‰Ò6÷N¢ñA*ž„ÛшYBéÇuEÞ¥°«ƒ®î'T3IW,WÃl#N›âÔ5&H\ð¹Íâ¼Q–û[;'´ŸyÙf’»´Â'ØRB•)Þ=G\`ËaDDÜ•WdDOƒ+•Ô]„x=ËuÔý›tc5Ó¸#BâÓhb|_DM„PÛØû·_J&Z´=€\Ðqh¦’á<%JÛ#Óî4V¼Ò/5WÓæ¢{Ù67OãÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀòçóeù(÷?Ó¿âû/6_‘rsý1+þ!ÿ°p52OMz&ÿÍköfr3$ô×¢oüÖ¿fg_ÆÆ{]ÿF5ÿQû#ùaÊö»þŒkþ£öGòÃRö•YùôŸØØÎ‘œÜÚUgçÒcc:FÆ_µ:‰×š*D*èÍË¢KH¦h#$X’ÓÆÊª÷'P[ ïîó»û·ÎiIë—+«LÏŸá2¥©Õˆ ,Ö+Ú껺ø6î,'‘ÄmwA–\;ýg[_&›ÓZ¤Bš÷YˆÑ㉠uŸ}àe R_½EqÀE-—dU]—m²Œ×ke#5Ðh*ä^«î-â n)µ+¥îDŸ[N˜ò'vîÛu“¿ÃQ\šÚb³UéýQ  ?¤­ì"Piƒ£›lĘ}yߪ¼"o‹ªØø3¼·-öâ%¾ùrÓ¬õ§¸Ñuâ úÆÔÄ”!5ºóóUQÇMÂ_Š4Šˆ£²hému.÷RRF xÍRßÐÝ\ÔœE €<:ÇIµþV›(¸{ð]ößdìǵHúÎøjN ¿ Ù¬³ËÂ_`6€Ú–ßL|ôW›÷=ÏýîþîýÍgñ͈ÿ–Ïiõ7Oj:+êºGï…dG¡0ìpswŠ9!ÿ(Thö^h’~Tkô櫌æ‘Ñ“ôlä¦ —'ÜÀr-ŒÈÀÏ \x›6Ç’£dá qM‡¸ïúûWKÓö•5Uq,l¬×€%Ø$6Q¶Í¦×Ý8æNHa°>qw¦D—hóJ6¼gN²ºnýÊö¢IvÉc…1AB:¡u7=ÜBD$DÝs¾–}¨Ú_FkJÝ"zJæ«PϦ‰¥p"¹X¿bÜ–nL2RÅT\tü-w%Ù6]ÔW¢v9G}QYw/Q,¡—olS…©n²ä†ÛFdQÕ`E®eÑSTm8§=‘Wmó^»VëÙZ’×N–ÓI:{2ùµ©69:êˆ4d°TÓîûÑEDCBKF„½ò£CÐêoðOÖÇàýN}.«B|9lœ¶å¶û&ûz”_usÍI¤µ$;Áêœzýe°Ù#ÑјÍÅðNm˜—»õ?’º€€Š ’Ï—£ºVŠÔÎPË©ÒÚ[QÒQ1;lÕ]^50ÕöeFq“‰¼‡¥i¦žâ&bÙ´„*(Y|¹íkõ›´ÃRõñl"ÖË”SÐ$ ò<[ÅzŠÌІ|ÇŠ¼›"å~›¶Iîi[+[í(Ý-”XѤ·Rü‰m> ë‚Ù›Ë"#( ´N7ꈧ%ß¹9#(ïúY׳ò›Lë4 ¨z„yzšñL¹¯ÅI­Á6™mçÞðr製6Ül”Ù=ÉU7æ¹×"°ÌXÍEŒÐ2à ¶Ø&‰²"'¼ˆ™Ê¶6ü—väÒ 1l©2u85^®# ¾Ä…eIò6ÝEFÓïuM‘W¥iË%¸ÓÕ¶ëL%©+Hñuž`…ÀÓÞ$ßeO…-&#·ë+ùfµpê®Ïõ Sƒu¦n\jŠ‘+«å@GçÉI0œmøÜÌG€œC}|%P”Ÿ1Ø“ÍÍÒ¢×0t| {L^ÝØ[êØ7f_ÖŠÄGà‹åÔi®«ƒÉ” B-•Sï–X;iÿáZ9§XHò`%b·f†¤Â»9KÙ¿ä¼Bdg‹ùÍ›5-û¶Y*ŽÒ­.ôäËJJZ ¾,ë6R|¡A¯i–žCnOEUÄ&ÞEVÄQD·TDE)HéçÛSY›à‡ÔZZúï\Æ—UG©i£Íµ¬¶¶9’ëÖ”nª ¶NHWYE­Ð‹rO8ºµÜÙ5õoL‰S6Ýæøñ‡ Ù\Ü‘м`Ȫ«¹'r.ۮȼÆmq$]ÕÄr¢<ÓüZ"ÜËjÀ–p²­›qx/Q¡7Á³>¢q!4Ùx÷ôë·-Y«yÊHP¦ÏN=&&K(Íœ›òp[qGaÝS`]Õ;·Ý-)æšËÖŽ¿ªìGÐAìÖÄnàÕ·O2[ŽV¼ä&ێȸë"R\G 6SOæùì‚%l«ÒòJN†© Ép´Öš­mðjcÍË(FXeÎHJÐ+¤J›ŠŸMD—eÛakw?³ª aQ§kÉ«:–í%¤û„ŠÄ&ÉqE]é’ìK²ðóUG»zô>ÙÆf ¦®j…†FÍ+Õ¸Ò¬‘«#m¶}V¢ôתÓ]EG˜ñVî^=ò5¾töN—×ÓÇdÚBê¯YEœU÷Õ:~¦•êÈ®dÂuáG]`ÐA")'M±cnN™«ŸÙºÙ;eÉ4UÐhô½ã¾7¯šêÄ~+bÈEA¡uÞor lÐxî›§œ¢Š‹˜´?hnj-i;L½_VÛñ#¸ó¥_n3Š!‚Ú±-}T—`B=únwù½ó÷PÚé°ª™¢ø,¢AšnÏ&cÂd³³l£Gv'UU›Ù¹W~ë´¨¾%ב»O“¨ê`YÆjòm{òQÕ€LG† ²Ûñ¤*‘?Ô/# ­ósu%E\÷¤WT†§“©í»1¼®*êÓ¯§«‚íZ4ÍæT… %'7K¦ç#`Ùò%Üç¦vŠ‹Úaèºæ(º‘Ÿe™NY]¤Gœ3t†3Ù“ä-8»¨&ä‰ËÒ¨cYêÇ5 ºlô•C׌&½Uh^m²$ÉY5GGŠ:$­šrM•rG²[‰G·¯ì³NÒ^ÑM¦ŸQ[½æ¤ºÃBi†ÄœeÃN H¨œ• ¹wîÞYCÔ6ý¡Ã«ò{ze‹(V-a)Ò&Ͳs›âëm4@¶3@â;ßÚ{4Ô–z¦ŠM•D:ÒjÂDF|qJiñdúdè™4Úì¦."n=è(¨ªŠ™««5}¾ž½„Ô=©¥ØÅ®nZÙ¢Iu×ÈE ¸ý5BRU-ÌI Uup8¹Ö™ÒúËOÁ„ûšî$iʬj+²áZÈ'¢(:Ñnœ[Œãê¯ìâçÅdL›«Óúªgg—5îÔÙ×]j›„[§¤Fz,¸ÛM¼ó"Ãî Š0ßH™9Ïb$ÙT²CLvŸc¨Œ®Óv½li› aUy”(ûøO˜ž}9qÝâEà}ۮ±ó»b• RšJX³Û±“^û²¯ºUÝV[`Ô“ÐUqÂð„m[RiÔ]¸w¶‹ßÌ®u¾±†bÆj,f–m¶Á6M‘=äDÎ5W[ªm¬ìm­»8³¥rYÀ¤‚ÕjÌfUöMT ªâÚmÐGZã¿z‘u}+sQéz­C\¶™šÀ¸ˆ„€è!Š.ÞþÄ™QÑdUÝK¬©¢Q¶ÍK¶èã^m°Û€^lx8JâpWÔM•G¾ÌÌNz³…6Õ‘b?nº{V¿¨dXÍv4–¦UäËÌÅ܉XjÀŽñ€•¤^â"å’g޽=E5ãmÄz•û›%Cñl³‚Ü~N6>t¾d1Å®*‡¤—I[`v“y3FRj”Ò E.óÄöQeZ(I„Kf„E’W’©©Û!§,¾PÚ³Ú[:V]D 2¶LèSšžFéô082­"%6Tp÷@ïDßdDÓñøÑo»o];5+5úÍ4š–sH±]i´yÄ1Q^Nªñ]u]Óvë²g>«Óúªgg—5îÔÙ×]j›„[§¤Fz,¸ÛM¼ó"Ãî Š0ßH™9Ïb$ÙT³§ÞH°‹VóõUÃc58£QÉôdMT‘7#T^"ˆªª¨Š»"슻"òë^Ù_­ŽmΧ¢ƒ*=„˜¤ÍÔÁu–™qA¹J©¸H÷lW“O"íÿ9oz,WgM¢m$kÖXÓu7u•‡oY>{ç"Ö81:ŠØ')\ø0 ñÙ°ô—¤®úb¢Àµž¡Ô÷ú.¼A_XÚ˜’„&·^~jª"¸é¸KïñF‘QvJÔNÖNMŒòqcAqئ,©¨ÜØÒ%ŒeHÜW˜¶³b‹…Ìx«©².ÙiÐZ†Öðï¡ÝÔB¬ŸMd]sÊ[NrŒÄ„12i¥ûÙŠŠ>‘^õÍçóï“9S.HÞ×!]Í®Œ45÷Jâëk. «ÒKBB‰Ó_ N=#]””vÃmÓ}©p¨uHÈÒzN_gJ—æÏªv„™qž;“Ï‹ÂÃ$Ø¢¯pž)²}ý÷´ýbz2²4ònŒcºd"âèk˜Aä‰(„ˆJ"ƒþán©Ý¼lžÐ.#7Ae'I$J{— FmdØ Ne l)QQµ5绂H¸H*‰ºÈõôJ˜Tº•û Ú—³mGPà JZú§ê…leÇxTMdª¼ØiÍŒE¡ˆQ KϽö9G}QYw/Q,¡—olS…©n²ä†ÛFdQÕ`E®eÑSTm8§=‘Wmò/@ö©5Ut¶OI×Sê!ŠÌ¨ÔÖ3æÆp€‰Þ¡;:|…94/ ’ìª(¨«tЗ¾ThzMྠãzØó¼©Ï¥ÕhO‡-“–ܶßdßoBdŒ¯š¦qŒ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`ysù²ü‹”{Ÿé‰_ñýƒ—‡?›/ȹG¹þ˜•ÿÿØ8™'¦½æµû39’zkÑ7þk_³3/ŒcŒc½®ÿ£ÿ¨ý‘ü°å{]ÿF5ÿQû#ùaÀ©ûJ¬üúOìlgHÎn?í*³óé?±±#Œc3UQÃÔtR*'í´ê‹¬q³p¿b$Ý7ÝÑ•bì 62ÔºŠ=Ò¾ûÏÜ´ë .GXmÁ4étTa±ãÒ•7]þ׿MƒÙüÙ0¤ÉˆˆüQ•&6èë KC%ÑTïÒäé¶éèÎ8„‰¶´ÕӢ蟖0íÔ21b‹a=© Dܲé¡w:L/w¢NÿV+“¬Fìå˜z’šÚ³U_ׯ¥„•ðke¸žáÍÍ‚uDü¥RW9&Ëć|Óz8*¯œ¿°ÔZ‚Õb¬F¤Ø“ÐeI €†›äB «ÅIx~Éœ’.¬b^¡Ñu35œ˜:ù檺‹2óÁ#ÅBm’v2CRyç÷!A@"s— DY¾É®N_k3`AÔÙ×%cî8ƒzõ’“¨ûH$HñRÚ;cÅy9èé¦û˜Ÿíž¹ß†+—gFÖMDü)okM>:ÓS+œl]é:ƒÕiz€cĸú7ETTTÈ(}—Aªëoku-ôF«#1j GcGŽÐ+M«¬­¡ ùä&„[ýòl;GvÝdÜ+>ÅÅìª=<ó2ÊL¶lÝ€‹$I„dæÓ—.™J1kÐá¶"¾œ¦EÕŒKÔ:.¦f³“_<ÕC÷Qf^x$x¨M²NÆHjB/<þä((B®rä€+œ;ôj]…½*¢]mÝ¥|뙾ý‹HÁ¾° #|Q¶Å´Eó{÷åçg®Ï´Àèí+N3ugm @ÄCžŒud@Ee¶ÑE}$ŠJª»’÷mBÓú~¡Ûíe9ËíRÆ–¬`kŒžÕV$„óJÉ|\'ÔfÚÜ{Áñ]ÑU2ÏØ|Øz™“¤[–¯¹bÛSß–ìF]]ÙaMâ#E9"¯ß©¯¿ˆÓ§ùÞ4')¾½´lYè¹ú ®Ü±´i§¥Ç*µ·A"Ê“EãE>CÓk¸LEzaÉlÂ΃’2ݲ]jyW Q"غQØm¸à¶ØÆFWš´Ú›d» l©éÊ6¬»³gµ·â¥ÔÖ-BªÁžà Šãð_q"¢pxv9êo{jÃhžžêÍÖiûj îÖéïã­c%j’¿–,Æ6¤2ÞvL€ŽrE× •EETâ#L¹þ½®|q¾Î™Tä8:¯RÓ&C²,'Ì8ôót@I]&þõ°âÄGaÙw´éú¨tT5ôuÀa º+Q#‰’‘#m‚¢ª÷ªì‰ßŸ:.¡œZp'ÙkpiZ³˜ÝdGutÖ\±e‹î‘¥ xLÔiå( ;9Ôý3¾ö|õħ¤j 0¹v®1Ø ‡ Ыˆ¨ž…åË»-2íúðŸhžÍ"T -V§Ô1f"Á«q 3‹U\ –ÆHTK¦ØªºŽŠ"¦Éš6½‘WO­ u^¥eR{–3]åå²’H.H˜6Ë‚6 ";&ɏЧ/¦¿·™Löú÷Ųܥëêgìo+礘~àdIÿÃÉÅ9Ì·èmÄE-“6QH-&\ëðmä7HRuœØqdÇì)XtºÒ”d+¢ØšŠ8Šj› Ò4¯/>óýæ³­ðv)Zl-+åÝj½Am¬Hj½ÿn9HdGƒÇÑd ‹˜õx©pCïADAD°Ý“aVô8–ÓjsÁ’u½‰x£ÀaÞˆ¨»Š÷*í²ì©Éj+Þ»¾ìô‚çU%»µ‘®¯rÚ\p&[`AÈbê°Ù<òŠqÙQ§ý+ºçNÖÇDÞ˜–zšßÄõ)ÃÂ&xÐëú^xñþP—î$ß~=è»-˜¦W{tHšÝüõSì‡4•—=u« ¶‘E"¶a^bM€6 6èUE¾Ÿ!ä*¼‰UUUŒ“Ý™À~ì-$ê×ùʇ:lrXèÔÙQE´i÷8²„%î-ª‹dªŸ{²ª/3NÐôk݆è9·:òD«gꙌŒÄÔþR,3$ï„ÉG@›RE>¡ó;ÄÉE3ACtÖ»¤…+Y­¤ß £hdFºpcN3®ähî2ã8¤dr Q[Csd^ï#XùYÑÚôöŠb«RùA"úîâcpÎ _q¢Hì ƒbGº¶sŠeÝéï]òv¤Wǵ-Õ31¤µ)F¸c/UÖžmæH•æ\_1Æ„‘d^ô.IݜװÛ[Y:ð«ÚÕ5LêrÎÎãöQÞ—Öe=ŒzqL‡Â Ê¨¢"oþîY;}¹¢¡§¬lµWˆ§·w_ࢷg_agÅ\ÚGeK—1$%^íÕq´ÊVOfÕò­Ù±“yrêøL9³YþN-ØKŠô¤;Å”$4é6ª-“`¼SÍÛt_;³•Ó'nã:×RÏvÕ³ILJ÷T¾õî¨F#Ý ˆn;"mC¶ÕŠÿl`s,°­~µº°u3ÑUøÏ6Éx[qYD­u\s¨FjÛ]È©º.-!cÓ[ÝÖÊÕsŸÓÍÓÈ•5øº®cî µ!’dtйä/pka$WQ{ƒe‘1Ë5Î'žNÛ§ª`ÐÐÀ¤­iZ…3q˜]Õ7_}vOO¿•©ú%vˆÞµò®ý© P¸Cr3M¢"mõ#“£›yê$[ýòl;xìN¾l=ÌÉÒ-ËWܱm‹)ïËv#.®ì°¦ñ¢‹H‘WïÔ×ßʆºÔ”)Û nž¬ÖÏDÔÉaåÇ“àñcÇRXÃI÷_ÐQÈUÔ%!D]M¶z³¦Z,AÙ=k5²`ÃÕ¢¬®®q‰,‹•Q ÀpÙŒ].á.›c»œÉQ“d͈œ½KGÓQ5槉^ÏPb³]£AN–íÅ›¡ÝÂU%óxòݨ¦H†ñNÕVcÓî?©PîŸdŽÅ@iÂé—‹ÑLæ6¨Ø÷4Ú9éMÓA½Dñi±›;]Âbµ‹Y­F„zÆXxX#1T àE‘=%sÌQD#yA›YOþySÍù£_ú¾¤ª+áÔTê®`c„ÀGŽÐªìÛ`(")¿r"&Rt×eu5cjŽ͖¬…l¼çľ‹öä8†$8C Ô8¢ (Šz6¬Ÿ=q#@ééˆ .]«ŒvaĆB´*â*'¡yrîÎ7¥õ‚Ø\_Êì¦ýí`ìJ—[ur°˜¯4)(uÔFi9òÛ¤.sDÙ–â¬b–cH^²(Úi­;§­¬ôÍp[ÃUG„ô…”2ZRçüÖ¶Ä6óD¹"&I¹¡e¹«ë53ºïSšèÞ «P§Z%a^DËÝJ;dJ$Š‹º]“ÃÔÍÖöO§çk WsO{_¬Î$w­µÆvtp½m¹*ãl¾­¼ ²¤Ù¡! hÇ`Q"è7ЫïûOÓiëË’WÄo'? PKXg °AdE‘w ¢óРܶò÷ªªäh»U{ÕÔŨtäÚQ·³§ð°@Y•® rMÑW’&èŠ*»o²®Û.Ê•ý•DYY>¬¿aê°}˜r™bfÔw‘´q„lb£<ZåÓ纯²í–Ò¬©j4=•–£»“ITÀ I™åiÀbœDÇÎE%T7bó»•eN7T›”•òãkÜ¢—:À¢³'[¸ÈEf/I™L†R•Ç:‘¡#ÊŠ^æ;ÉÒV5vX•éø`$)öìVÄXFU‚ø,iÃï9¸+Š`5÷¦(]0ä‹¶Hh½þš¹µ³=a¨.JÕÔ~S3Û†“ÈÛM#©ÑŽÙ!#ll‹ÇmÕEIwÎAK¨ï]º£ðÍCpº€Þ£¤Ir;’á:Ô5”éÂÛs~¤õqÅUV‰D^ýÒÇÙ5ÉËífl:Û:ä¬}Ço^²Rui䃠 þ*[Glx¯'=4ßtšÏ̳_™«tû·ì4Û:†â™@L  *ŽíÈL^mÀ_Bl¼P“¿eM×zÕoe«5-UÍv©Ô1Û©‰(‘a˜í‚¶ ëè#ˆ>y ¡ÿ|›Ú½¾XÇ®¦„ã·,ÀyUÞ“ru#ô¬:¨)ß×dÄ^HrR^dˆ¨Ja¶ÀŠªe|R®‘Œc"˜Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0<¹üÙ~EÊ=Ïôįø‡þÁËß͗ä\£ÜÿLJÿˆì L“Ó^‰¿óZý™œŒÉ=5è›ÿ5¯Ù™À—Æ1€Æ1^×ÑÔ~ÈþXr½®ÿ£ÿ¨ý‘ü°àT‡ý¥V~}'ö63¤g7ö•YùôŸØØÎ‘€Æ1¥yk_GS&ÚÖHÅ…9ºá"®É¾Èˆ‰ºªªª"""ªª¢"*®W_í+F³RÕ‘ÙJéºûŒ#[$¥¶œœCŽõCˆª) ¡ ®È©¾ÿhtrõ–v¾½æšÜ¨³c+ûô‰ØÒ{w ‘4‚ª›ª"¯rú3ŸEì÷XÁ²Q iܺvCêì­¥ôhÚ‚Ø*஼CâæH¹‚#ˆã‚]˺Î+^\×úH-cVøÐÍÉDÈ4ûq8ªo « ²¡#C"¦Š\‡d]Ó3émk¦õ4’M9×Íë6®DyÒ*"ºÉ8/7ºŠsmH|áïïMè°´F¸‰3JiçÛ¤²ÑºmŠö˜µz4‡ÝŽ §„<ÒG4q@Ûm#¢<„T•Wn½›vcI¬ÓP̓]M5kµð« ÜJ±l×3T'À N€ ´Ø ¦ä¿&²¯¦v\õf«¢ÒÌÇrêSÍ,…$e¶"»%ÓANFHÛBEÄS¼‹m‡»uMóIͤ‚Ö5o Ü”LƒO·㊦ò ² AZ40â*h¥ÈvEÝ3O´-=>öŸPi¿½6¾<ˆ¥l·£6@ó‘ÝçÔhH·ŒÞà©ÄÄŒUQ+´F¸‰3JiçÛ¤²ÑºmŠö˜µz4‡ÝŽ §„<ÒG4q@Ûm#¢<„T•Wn9¬­P»MÑó›xà˳—ÓcÂ@cÓLp¤³Ì]Ž"Ò¬€Bp7&Ñ‘UQ;òÉEiòŽÝ[þÂ3r¢»À‡¨Ó‚„±"*n*‹²¢/Ü£³Ý­ô|õ²iŠ9òbÕœ[vêOJY›í¸"LÀ?p`H Tv@KÇd7ú{³ªM9¨ãV3.¢ àp&†ßYGM¦Ô”KÌØ‘o9wîmë-¹ÚÓMBÔíi¹6$.mñHî“@n"«m›È=03ÛÍ$"îÙtÍ6{GÒ7bûvŠpHâé>¼ !nGO¤éóT"%]Ñv\€½ÐwÓ5¬¹¤@J[˜7]9O ìœeˆ½!e¦âÁgg ÔD^K½n²}a[L¬ÜFn lX£µ•)©²"ÊŽüw\dÁ"m€…•=úª«ºŠnû\ ;FÒk„•cÒ8kÀ–¢Zt$“¶-H÷/äÄFëhˆ÷ ù"¦é–ÜätV¼ :üx0´ëólu ™a&òOàôšJ9›äa ÎpÐ÷Øó¬À)G9Îe–%“B¯´Ëªë`{yÂ&¢*B‹º!(Šªw잌²Š«]¦h‡œèÝ/N¡™GÅuBcpþPŠâˆ"µÍˆSÒ¨‹žghZB«§ÛŠòá1ÉQ^eÖÍó “tMy£º¡ ¢**e¯²ýC²<Tvñé©üQZÁÜJcÃ]ˆ¨ûŽ#D± $"Êu‹©*æ•ßa¶w}ŸÜÁ•¨äA¹œôéŒÆfZʇÖzDl^vSN<ê m÷ºœOw\QÙxí#Kãêö&•uƵ=Cš½Í&‡4-‚1J@ví´ëB­!“o#NqWšE@%TRÙvT]·.ìãSÕ½c-¹®²ÏCÒ]É8´È‘—z¦û 웪숫”É4úà;K¢·f--…M]kõŽÌ™lmÍ’2¸ù2ÜN’¬bØKš.í§v\îܵf­ç)!B›=8ô˜™,£4~roÉÁmŇuMwTDîßtYz÷KÆ¢¨»Y’äB¸Š2à¬Zé2u…>§M¶ÈÄPLT…9&ûg˜Ý¡é 6‘«¢Û,ƒ’Œôßf+Çw€M‘) 3"B.c²/$Þ“Nvµ²­5£+ÙÓ®†Õu„ˆ÷¯¶ëÑÙe°eÕ†]#5Cåæ‚"q%"Üva>Uå Æ£¥Óµp^¬‘ á_L}]XhÉI[m•Q&A¤|Ô[óEWˆ£\Étm'©ê5DyTßäR|KS ? Ö郜I·À 7[$]¶T$Û“SÔiÙÌÛÖ¼c%¸±Ýjï4Ž›€Ø Ž6 r7Q\QEUîô.ÕþΫu¤ K©¦ê:­?%Ôá°nô—1‹26¢qšEHä|ùnŠHýá² Ê⾕VБQWd]òªö…Ö ¯WRC™¿Æ3áXX«7r¸±Òi†ŸŒ1ѱjH3Ås5TTïÏ¢tMÅ¡—{_¥ô~•D«v+ut²Ü(Ó_"m×Õ#´ƒÃ *6E³§ß܉ˆÒ¦ë®Õú® ™”®L&âÉ(Œ¨Äq·EHT.îIß¶Þ÷¥5ì5¶›¯Ô!C.kíÌ'šËÀŸV×6é´O t€Ëì$H«ÈvNôÌÚ …tÖ’Nì ”Ø““$í·„Ip•ÇÛÞæámïo¶V5U¹»íȉG'G@•K1ünôwÍÐ!>³Í¤cG³NM¶Žªˆ©.ûp³”Ñ5Š·Ïµ-1æ>–ҤدNºI“ýGÆ8,qÕd ºbšCMÉ;ûózf»ÓÐê¡XÉñÃMÍê+ -$Ï Ql¶2(ý.¨ *¦äB‰± ï²¢¯?¥ìÊúÐíj4¾¢‰MNµðgÍx˜°r&ξ†ËƒD!4HÛb૊Eº)*ædìóT±£¤ÓC‡O‰–.˨‚utzÐ&[leöÛÜ]pš&ÄîAâ›Íª»ºÅlØ–UѬ`HnL9Lƒì<Ùn6H„$‹ï¢¢¢¦BiÝq¦oìNdçŠ@°RA„ôqy‘Tu¢p]m…ÁH|áïïLÞÑÕÒijiO0óð 1×elɶÄT„¸U7ANäNìæìè-gªä^œ7aA;(‰´7&áÃŽN¶e¦^ˆ ‚âu"2.(ˆˆ› ÜZäF™­­v™¢ßÓðo¡ZHŸ_`OŒW ×I’N#+nšm‘ &Êjœ{ÑwÙQW8ö…¤|8mÚ›¾ÐF$7ãŠDú 2+!Z40Q$Ræ;'ze>‡í+OhPÒÚræ¾krmì¥N“*rB}¸ÏI7n9± „ÔŒ”<Â#FÕ‡ «¨&Zéa¢²²”«Õ¶Ù»˜ëQšŽ DÂD F]Є$Šp.(@˜s'“¥^ZÁ¥«zÎÉâj+銚 MŠÜEnìÜÌlÌWvhZ†þí>ŸÓ~/jm„yŠDØIlA“Ž×›D%¹–÷5^ "d¨¨™_k_êYMhÛ˜©Gàšœ`9‘uÙäËàÙ>÷U ”2%ݵE@O8HÑó«4¥©j;wQ^qc©+.1-ØÎ‚q1G!.$Ä;ì]Û¢í‘vo¤˜ÔèâF³…î/ƒ6Û$F¸l ?6œÒúv§MBz%C6¼²qù.ÈyçTDTÍ×HŒËˆŠnJ½Â‰èDËgy“ª“{¯oakYqãG€´µ×0iä´qž'ÞrO‚'T^Bé¶€³™Ù²#@uQSŠí]¡írîÖnEú†ž²j1TÔ=Q-“•-ˆì¼rŒÑ¹ à´ ²’'4÷úlí¦§jvõ$šâ;Í·9$—E£6÷FÜ6Pºfa¿šd*Cݲ¦Éš-öi¢Á& Ô8èKŽQ‰·¦¾à2ÑšƒF©yÍ l *â›M»ª£?[kdÑwÖ±ìh#ÍÓÒ–+Âõ ’ñ“ŽÇŒô`i’’ÙÇp¼$P55æ¾öÛgS§ñ‡Š!øÝc-@<-c JïçÁ UPyo²*ªí·zä<¦¡WF€Ì ˜óÆÉéo<ã’Gï]tÌÔ$]•:Š[(Šÿº;X²ìŽ+´ým.¥‰±©àMræŸÆõŒG'©”v8œ·–¢ÌÐsÜxnM8Ú'$î‹Ö=½HÓ]žÜHyjTF›"$ÚÖ%t¢3(œV>¨*ÀÚ5ÉHœPDÛ—›Ô"öo¤b Ô…|5˜28Ö²™6C¨Ž+l8‹ÑA¥_B¢¦oFÑzf6Ÿ¤Ú¬Ú¢Å§ÛšÑ>á9!EHÝRê’*îj\¿·¹2F™Þ~¯ruÉ]¾Ô¥5†™oNÞé› kùë,%c®:A¤qé $$ð!]Å‘­·y´]ûÕn·mÚ½Vót“aBž¼zÖRZ97äØ¸Ú–ãº&Æ›*¢÷í²þx¢½oÒùcïb‘|^S%âÒŸ5ø¦äˆª¨›¯ÝWŠmûwYâ­êénMi—¸ò(s^ŠêlHIÅÖHL{Ñ7Ø“tÝtULln¡yc¨¥vC¦u¿4ÕM¦abôè>Ú:ëM´Ë@à’ò#$O<‹ïQÕ{¡×´­iÞ îôâÔĘíTr„ur\")p¼1 iZyâh…LºJ½ÈH©fNÈôBVTÖƒ¡˜ÈëP5%ˆ”]ÛölÑþB(‚"‹ÄQKŠ'"ÞT4›ñÌ+wÚ³*Mb¤ëyršhÁ´l\t›G8§{œy*ª’ª’ªª5%¢íu£ý \QÝZiû:êÈl«ÏÀ©z„·Wµ¹Éu ‹H†I²/º·ý¹¿ÚUµýj‹:‰5ƒ­àBŸT3uÇ‚LÆ#îÓ‚è#d(éœ."®Ýɲï=QQ_R³~‘M”rä’™:élŠJ¤ª¾Dô" """"dn³ÑÔz½˜¬Þ%™5Ôy ‰m*ó$aÀæBm –ê*›ŽË¾67Tl»@°^Ôdé¶§WÔVWω×eSÊ–³y¶é‹í˜3T^l\RR5]…vÙc4Gi:‡TÕJ´bmLW«+(NiùäðGæ ÕG¶˜¢Ù§&Øo~¡€sOJÞ\Ð]Û(v/DšìˆŠÁRÊIƒ¦ÎÝ'^s‹îÙÇqEßtLÂÏfÚ9“’MÖÉEÒ²ˆ¶2U#¶® œ#¢¹´qæØÍpÙ@WýÔÙÖy1öKª,µM5“öh½Èá‹­Ãv¼"ÛgÈããò]óΨˆ©›®‘—Ü•{…Љ‘’4›{Y9«ÔmÚ¸uYW]bêc-8mÀIu M»ÁEEw-Ñy.÷ƒ.n°ê8´1î&VÖ¾uAaPËq¤2±‰Çá4Ûo©uÓk¡EAU;¥äkLÞ+ˆ÷us5Æ&:2Ñ]ŽHаpÑÅxQH•ç›óW’*Ûbvo£"ŒáfPf¶­”·‰}N,"šø8óD4F¸"Чz"§…ì×HøCÖîÆñÈ ™ƒ%Ó1>£èïUÄQm´T2TØ6Ù&ÍN©½fõÞ’§¹’Ë,?>œi—…æÀœlIDL{ŒQWd$îTïÎ{;´»)gvºÆmÊÚš²›9ʦoÅï«qÇ\qÞ¢¨®ÍªpÝE‘s§ÖA‰Y[¶¾;q¡ÄdŽËi°¶Ø"Š'¼ˆˆ‰•í 4ÞyÇ4øÛ°.!¡3"êd¦w2C"Fžt I7æ‰Ë½{û×{‹9É#LÔ >Ôµ ßeqµ\Yšy%5c:ŠÖV˺m³eç Š\M¡WŒv0TœI†õFº—c¢‰;L¤}J Iz±+Ü}ØÑÒ8»%Ä–x¡*š5¶î·éNõ´ÏÐzbl†qf°ÐI•%%”˜Îs’é<þæÓ‚J&á)(*ñô&Û""HÖiº:Ù±f@¯n;°ëƶ/.,FEFÀwâ)æŽê‰ºñÕx¦È¤]òÿI«bùm¥õ¦8-ÎÙ:nMBVA7NDH*Š»ë¶éº¢&ã¾éÇev©ª‚teÚwšr\ÖÙ¸‡G2kSÚa¶ fN«½57]m^æmв‹º£ƒsViú­S§¥Ð]°ëõÓöÚãb„…·6ÈItMöTÝ7EÝS ³=&pcDp/H¤á0ùê å!¡p@M±}^ê#d†íòàª(¼wïÌÍvXU]íT³3H¾ôz z5ªQZƒ%æÑ$ðG ,P’(Ÿ¼âq6]ÜÉm¬uþÑ%ék¡‚hÔ'¤’µW* ²m¼Û}0) ü°™/Y¡N#º{ äÐöw¤tMÕºÚAè,xÍÍ|b‰0",’ÇCéq"Tà;/rfÎÑ:sOÚdI#)YXàoÎ~B0Ê’´Ðºd-¨ŠñóG»¹3s1^ìRZª^Þiê†l*\a¦2¤™h{ òFc*(Šì[ºD‚; l¼»«å­õb‘¾œPÔ>–8¹&Y¶è¶²_ÀúhÛ(f[ð!!óÑM.ú£KÓêQa-o&‘·"O~#ˆ%·!SdÀ”Wˆî*ª‹²nÙ³= P5{%œ Œµ—3c¥PZiXQ¥lPSÌQQ]×t]×y J—S¯;L‰G6&§Óí3«J 3!×±R½$l]i¹n31õ’u€¸'HÉsN7NÊuTÝQ]l– >Ub°Má€ô$v}ÁÞRq®çÐTIUw^íöOq»9ÓÂW½'ä´ŒÇu÷%ƒhb|O+­ Šª Ýû¦Mi?Q¦«<]KÁ£«¤ñòpÜq× w#7 TÌÕ}$Jª¿"ûú˜Æ21Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ.6_‘rsý1+þ!ÿ°rðçóeù(÷?Ó¿âûS$ô×¢oüÖ¿fg#2OMz&ÿÍköfp%ñŒ`1Œ`Wµßôc_õ²?–¯k¿èÆ¿ê?d,8!ÿiUŸŸIýŒéÍÇý¥V~}'ö63¤`1Œ`T»_‰6wgócB&Z+ñJThÛ«¯Ä-–…¼”˜GGŠw®û'§8àiâØv×IO•¢|:YC«oOHPlɈ.^¤q#n˦¥ÜÑ>½Þžûªo!éÊ)ó…÷i@¦›Ž¸á‹m¶ ݹŠn¨›’n©éʱv¦1ÙÓZŠEÒ>û/Ó4Ë .?DqÂ5êô”PaQEÂåÕÕvÉ;üyX™ÉÍœ ºK­ á´²žÔ‘F™-¥­+îI3lZð‡Ó™2Ó(ˆ¨ã (Nqqwq /}šhŠ*®Ð5&¥©Òºq€¨€ÜZЈ¯4 Ž<ú ˆòCuPWtQ`I;‹¾i{GÓ}¤é¢¿"cú©…“Ùkpzø8ꪢ‚¶h=ʤ¢]Û *Hh½N:”m@élé¥ÕNHR¢ÏVÁ5a§ÑQYqÀQP|¸·ßtTM³sŠk5çw͘Œ”þÛ«[›q§Þ¸¢•y§YfXÉŠÍc³Ñ$‘0¬š²ß¿He»èlÜ_FS"ÀWu‹¨¸ÓµLª¹ÕSL”Fûm²¥‰-¶MˆŒŒ[D#Ý””{°ÕŒi×áC ‹[™ó×Z‡\ÛdïI¤«‹Ô0#ÌÓº©Š"*®FhõHåSíÔÜ»Mhqp,¶1Håpè"!:\•ÀNBÙªª*¦Ë´ÃËŒ}_N+.I¤tÃßµ•v´ûtޱ.CúJ\'ì%† ‡$°nÓÌ'P9 ¨¢*š¦tò}¯•]¦nz¼ ÇráÇ!€Ö9\Á3Ñe™†çŸ¾HIÀ•UI ÷ØÑz§´¸–âIU¦5 ·ˆ³ªÛAŒÚÚÆG²y…qáê6JŽ«d¢B¨‹ºd΃Õ!«k%Î k:ŸœôfwEHœixšŠ²ã€B‡È7Bûà$÷±—O7¼Òc:Íäæz²–ÍîÖß””³žµ;º×ª¬‚¦1ëƒÁ|%´”‹Ódv èm{ŠûjžŽø>Í)ã×µ- bÜu*÷¿°sGÊ~[“œ¿ÁسìDVÊÓSÖʪ©ˆ·q¢çÏn+BaàÈ­’—8˜uÎÏÙãâè ;Á™lLfª+r–ú<ø8 ¸â"!š.襲n»®CXöˆÌ}W­ái{Û:yÕijáÇre …h]EuÚoÄ—ïþõ³{e<ű¨‡`±$ÃYLÞ$P]g¢ð4ETBMöTETݽrÆ“|Rv|ãM¥¥3Ñì+nª^–§”Öž”òϱI0ÈÀ7+#nb‘µÝÑ}TvUÏ ¡ªæÑÝUWuŸ9tì ý’c w†‡Ê¬HHˆO0DdÙláùÉȶêãÚöŸð#šíUÛ1Ý`$ÖŒ6‰jÑ>Ûllçr+²žëÓîtI|ÞôÙÿ9ÕÄD§ï¤Þœ·b#Ce4m6ÛŽ)ŸW ‚€ó+Ë«·º oÉvÉtóârýæN¹ÞNy]ug¬t…œÝ0LjEz¥ëbbòt :e#£eÌ™f8¦âl(¡8€â"ª¸…‹[šbXjjT¯‡â³°êùãÇù8‘ì\W¸Wm¹w"n–ZòUmÍ=tý ©˜i,DbOR¶.¸ßP„„d«žæˆç5T÷3QR•l÷sd×Õ½2%LÛw›ãÆ3d]srD^*ñ€w"ª®äÈ»n»"Ùš÷JQÂ<‹>Á4El­5=lªª˜€ëw.|ðaöâ´& ŠÙ!©qá#‰€ðqw\ÃO§¯›¼¤YÚ~çÊzŒàΓÉ.D„ÛPÒ[G8vl6á`Ž6¨Šé< ‰Ý²õ¿.ÙHQêj½7}kâX4ÔfÙa’lÝÒqÑlUÓÍCU]—ŠËšp»SÓó¥AðVÒ+e¬&ÊÐXÙ`§98†hë^€T¨!*oˆœúÅõ¼Ötî‡ì9Ê8WºÊ¦‡MYÐ×I·õ칦åVÆV|F¡Ôd ^|Îâ]ˆ¶TïÌý¾µPP4ô™:rm­´;ºùPdC¡~{±j|W$›M³»@»¦â¦‚¨œ•6ËžÖ±íµˆ_¢º¨–äC›Æ 6À 8D+渀^w£¹vÙÖ:œtÉVŠ[9±'Nb’¢«8†ûí0Òº†àš‰¢žæ&¨ˆª¨ÛÁÊm¢XËíŒ5,ÝëRì+N¡,´ä§N%mžn¶ùìÜ'Zq_tÀG PS¹xæ—euY°µ¾¯¹p©œzú|.òÊzX:Ñ“ óÜ’r¡8=$â*Ð""ù¹×Ö-®®wMÕÐ\Û½Ù QQ]D!ꮂ’ *‹hd‚©Ýº¢,C}¨W¹I#P7§5Їf¡Zžfø2Ð2 ò;ç™§0Û½IeYö¿MŽÄô«:SB2ÊTD§—dû–saEdZn;¯/.Š¢ #aÁ­Ñ;ú{úW*銛ØkaÇÒ¶°ìX°…&N¥ñ×ù ÅŽûmdˆ‚éƒb${¡’KÒ:Ž6£‰-ÆáË* ¥‰6®š»ä>­™‚ùŽn$I±'¿º&…î´fšñ¨h/’ãÂ[Te¿ß ƒ½Äp·7y¢®Ê©²í©Ö&ù3¶wÅ¡éSäûñë)m`Ù%8±ªžJ÷Ø+  ^.|·˜jØX’8×û'¶ûr¨¡»¦bº:<@‡>`¯…Ù첉l$Ôoå'U,„!VÁ×ÏÐ&]è½Ý@;]Óëæ¹SxÓÇ5†l7µ«$ûl ±³‹²+²žëÓîtIvÕ3'i±‘–wJj&nY¥°BðM뤼qÁ®®Ï¯1%”ÒîÏSdå¾Ê›fb+åçÆŸ¶¦f·Áaìú%´ § ß¸NÛÇ«ŒÔó'9©>- 8ª_ï*’/¿œoKÄcq;³m4þޱñK°àµoM:M2y®S%>ã è¯H}Ô×™©®ÊB?@eB³_׿hìj‹}=ÆÖM=j 4ÛÑY ]N.¶ƒÕoqu‘ ÑÜ»\SY™”ˆ¤RFóEö–ïù5Xé(4q˜UñJ‡ãYG6[HüƒŒ*Æä÷' ’"ñë4¼‘!ˆãõÐ{{¦´sJM‰m&’L©õÔߎrr½X˜1Ä]ÝDp•U ‚÷d´¾×ô¤NÉÏ´™ ZµVŽHi¸§c¦Ë®6b-)z}ÅÃÙU6U.;.ÒÚ‡Z»I©ëé¤é @ë3šƒÅ“†QÍÃ5^+!â&¤½>äl•7M•dk’Íß–ßiNÖ±¡ìž·£±½„*åu|g~Ož;6䊻rOGùy»ç›§œ‘I_%4MW½:Áâ¬GXK¯«3f(´ÃpI¶%^c%['ÓŸ²})y`µuoNl ¾(1¡¶†ëФ‚ˆ(ª‰é^õUDDÝUQW)eÚ¤wÀZÒúÛyödUÆGãô[e׌ŸFU$°IÅÂUçÜ‹±l$\èèføçB+zjÉ«xÃMáÎH¨}ù‹]eñª²Ûb)ÅÆT]Pwn÷rùÙ¦ˆ¢ªíRjZ![§ ˆ Å­Šó@¨ãϪ$7UwE“¸»æí+L¿q¤*£·äjÈÞƒ=Í2±Íñ7·TVù f‚›*ª‰wl$©³§µ¬{mGâ讪%¹æÅñƒM‡„°F(Êày® èî]·333Öÿùf”Ž×úW{|¯aM¨n{â®ôNF›‘tÃj¢ÊÃ**ñQxM;¹wÒ#Aˆþ¢ÑuR4~ ­½„ÝC¶:†]Lɯ¡¶Û+àËm¥m¸ð}Å mœUE%%Í«5”-4léû‹’13!€ lÐ܈Í×ô¦ÉË’÷싲í=¤Ö˜ÕLjŽøém±n±ÛÈrú}T#GW’ºØ© j"«²ª*.Ò'ÇÑ*^…е×:¿QXvs[ˆEš†+â鞪Ëi·ÇXÍ4Dêê‹À‘0šw.ùjìAcÚV Ðlàˬ¨‡[ë߈à<ÜvÐÑà!Eîæ;Šª.Ê».hÇí‹O;V–.U]GbDP—YÔT¬Ù7Ú` ¤WŽî>Èì÷MS¨Š»"¥·Hê8ÚŽ$·‡.¨2–$Ørºjìwø¶f æ8¸‘&ÄžþèˆÒ.óYÖïDÖ1ŒŒcŒcŒcŒcŒcŒcŒcŒcŒcŒcŒcŒcŒcŒcËŸÍ—ä\£ÜÿLJÿˆì¼9üÙ~EÊ=Ïôįø‡þÁÀÔÉ=5è›ÿ5¯Ù™ÈÌ“Ó^‰¿óZý™œ |c cíwý×ýGìå‡+Úïú1¯úÙËHÚUgçÒcc:FsqÿiUŸŸIýŒé cºÚ…5&œz©&'ºÌI A¢ûÍŠíÉÆÁTwMÑ7M÷Ê+]“͋ѲWõpÜuhР‹dÜPj/WÜúi!6½BâMoß¾ÉlíNÞu‹‘6ºKq$¨‘Q‚Æä´É¼¨½ËÓûû¼ÞþíóšGÕšÂ]Êé#ÔÓ x4©hv¥ Ë$iŠ÷zNîž »k5åq[MÔbÿLþŠä³Åì[KÀ¹ÒÖµ²m£I¡r*¸©e'Œ¶ãBr+ M‹¢Øª!‰* yȆ Š.žó: Lêª;ûë½GKfÍÌ”˜ë0éˆM¾,0Â(™Iu8tã¦â£¿"U䉿ç=¯í[SÙk.Ìâ½]gY[lÄUµQ¤ã3_•\óè =Ó dŵ%Båç–ÀÓ‹–>Ïõ¤w´Ã£´¶Ÿ6¾ESóc¹1¨BÜ¥ÚzÅRTc‹èùu<ööôÛ˜Ÿí1,l²kí#/PXV[UZD®²¯Y—^“&Ü6\_s湇ùy¤ ܹ]^ÈÚnÛL»ʹ¸šu¨,Ã|êm˜¨(Œ Ä4Thö.` [£Ž"*"÷HöŸmtÖ£¢ «º~©±fKzk G7Y(âü¡8 ¾nžÉÍA‚AïÊxk}] 4^ ñ„ÆcÜxœg2Û0ü]å£]FÝJg\º›‚Š iÔk—räÃZåÆ>—™óZt_f’ôÄ„z5ôS(NÕÓ(Õ + š2ˆrþRàŒXÁÉ:~kH›wî—ELézê†nµ m]sïÞ?I¸ )¯¾¤«•MÖ °kZéÙšÎé׫.Û‹×Áá$¶ÚXPä(ì‘ú+ç<ân­ªñ/…Rk²{I÷–i+»Gü"}…$)Rà#ÔuÆŒ¶DMÉUvDDø2mBsBÜöp¶ÍÛ‘¶aªùVl¥Å(r øþ¢Èæ6ÉaÅSÉYM•2+FvO;FKr^šº£†ó5É] VŒ¶6‘Æ•g²k€+|y—r¢í˜5&­Ô‘µôåhã0koë*µaZ’ܯæá‘{·SùSª!òô÷év]¨µ²[¹Ôº®ŽÎá4Ì:ÔŠË(ë<º Mºêu¢ëý÷2!ÑQîû,úYé;>µg³*] u¨¡N…XpÙ3XQü*a,“ÎyÆM§2EØ…Hx&ûçBÎ6õþºÙ>ƒÔìYMn<š§_M‚}8옸I)¡guyO‚rO3Šm¾tŽÏ­¦_h-=ybÀÇ›cW\†„U·hL…{ÓeUNüF“w¥æ“²QÙ4ª¸‡›ŠIa°ªkCÕdcGCI` Ês¥†·mMÅ} ]…ÀÆE©ØuäºøËÓâår‹áˆ.‚7ÀbG@^e²‚ªòUÝ"(5wh÷5°¼UhäÛê·ÄÌ@X ÃGŒ¾æä¾Ð¤×«U|Õ]óyKªì;>Ô›Õ:Š¾ÊšÜªkD¬7ìd:Ün‹rYužBûÄÚ«µuOjtö®}¼YÚr[òX~4fÛI1ŽhðtÚN}wH…H‡rîADDK…Ü)6oC‰m6¡ç8ñ™ '[Ø‘WŠ<芋¸¯r®Û.ÊšY‡7ÿ5·/öiI¢mn´­¼zvB+ ?KuÙ&›dlÕ²’ª2ýÐMg8wo™¢vLq¬¡”k&nÀ•1%BG&È‘c šIæœÅ…œÉZM•7ÍÔ:®Ã±­}ÖáÛyôLNšÕC5É&A”fÌÞT–¨Ø´$^r6*[¸qD\†¤íVX¹]rW!.ŽâÆi"M­B'÷DI«án“|v§Í7]•¯Xú_µçCöxîžÖÓµ;öFô¸î2ðVÓŒ–fฯÊQ2GÞEØÐCn£Þwt—išrÿS×BƒK{YRÓ£MyeÕœ²pãÈjCH<_kˆókbß’ªrЦë GP¯hz‚+ÚÎæú’©†¢ØG„;Î4GO‰0ÃK°4­zwEWI=#›ý«H·®OoS{6¿¥w[Dfš`Ú˜Ô™ñ˜1s¨Ùl{+d ¹n»ì›M Ý;²“­cê‡í*†aL‡a9öê$”† $Žò¼ªÃ. &Ú£Š¢¤œ—}ÓGNö2ºy¹MÕOÓ%«ñ[ ÈÓÊãO±ÔiP§ >>àƒ\·m™w*.Ùûs«îǵY°æO¾¬Óõ¶Ð+ZèЉ‡Þ|1ð’y î.èÒt8ñ%RM÷Hª]MÚk¹:oQYNhå+³žRÒFŸ Ûl! ¢ÝW¿ ^\„U{‘Xb³OŸ¿Ââšgðèݘh¸ú&–\&žŒëÓ¦É+ÄŽ&­ƒb-2*¨Ø m6(›’÷nªª«‘׺3RZö‹Q?©j_¦‚ëNC¨—NëžHˆŽ8. y|î.eÓÝ8§ß)zìfêæÞªí›ÙÝ•[npÄg1 FY4ü: {¸¤ŠÖãÄÎBDÓÕÖ:žÐ+àéýK.d§&FWéY„ÁF‹õÝꊸ¢Ž+{ò."€H„¹wމ´¢ìX’Ú³ÔlxÄǬ¯6`ÀbÚ\6Áç@ Ú8ãÈ©ÄQ&UïòM)+Éqk±Ú6¯tÅðÚ]­3Ñœ—(ìåocàðÜŒß0GQ±-ÜC%A^IÔEGO}ÍÙãº{[NÔïØUÒã¸ËÁ[N0VY›‚â¿)DÉyWcA ºŽwyÝÕ* A¯âLÓšÇPß³e¥ï±¨ìV¾ËAÎ\vä¬;!Y&nn’Pw „…o™H·ðý_Qo{6ïÅa4™0ôŠ7ø—A¶Áv7œÙxï²¢.ûfæ±3,Å(ÉÚ†ŽsZUǯW(Š;fFl\R‹*JœEÁpRA$/A–è½ÛA1ÙÖ¦oRPK“¬`ÚÔQ³¨¬ê]yÔ&›qõtd€”ƒØ•6ˇ/5>ùJWµ¹·«c 뀂뇠 ,—DE¨«0:@»! "š«¶ÝûÒWYjÂ]rÝóÒ¢Z;s‹"UJF¹¶hJ³QÓçɵADu®]Èk’"_DÊfeXŸkrìV³¡œ1m*W:ën>O±á o™ô7'QŠw/z-§³ DÒË„ÓÑzt™%bÑÄÕ°lE¦EUm¦År^íÕUUrƒÙÞ¡Õº¦E\IšªÆ/”T[©Ç ±ÆÝ‰îlnÙ¢¶¾ë%×>QÍSnå·Ù=¤ûÎË4•Ý£þ>Â’©Nðê:ãF[ "&䪻""|#H½ÖuY±Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`ysù²ü‹”{Ÿé‰_ñýƒ—‡?›/ȹG¹þ˜•ÿÿØ8™'¦½æµû39’zkÑ7þk_³3/ŒcŒc½®ÿ£ÿ¨ý‘ü°å{]ÿF5ÿQû#ùaÀ©ûJ¬üúOìlgHÎn?í*³óé?±±#ŒcRçž)—ãñwDü+Âøôz[/.|¼Þ;o¾ýÛeFZvCä-…&†òK®žÕð_õ·-º[ûŸ=ù}ï~ûÿnHö§Q:óEH…]¹rTIiÍd‹ZxÙU^äê dýÞwvùÍ#é=aåuaé™óü&Tµ:¢‘%‚:Å{]Ww_ÝÅ„ò8®è2ˇ¢qZhìSÝ£IÕLÎr¹%“ÄU`ñQ]F YEïä›ñïà¥ï*åoAXöQ.êrh9ú)ûI¯Íñ+ÑI÷ MÎ’òTäIÞ¾ú§Ã”ÞË5Ån¬ìÚäï«,ÓíD‚óN@"(,·Zû2WÇŸYÂDÝ䊬’ò”K¤éŠ‹Öz‡SÜGèºñ}cjbJšÝyùª¨Šã¦á/¿ÅEDQÙ5Jbž·~Úîù¶uï‘)gËÏ'¼[áÒñ×G£ÖïãÇ«æóôí·§5gg\ÂYÃ¥<­é§õ’?Œ8mÝÓßÝ6ÛGvEöŸStö£¢¾«¤~ñ¨QfDzÇ7x£’ò…@PQaÆeæ€ù(÷å84F®Š:.„kf¼ÅJÓ-ƒí½ +¥œDk©!ÕTqéì* ½6ùw)&0ëÖ‹MŸì.fž²¶£¤ìâE/a.XEˆ:­ºbœvEF‰/r /À¹gÐtTjz 6ŸfžC¤îô€ÈÇqÍH½ËÍRØE}=ÈžöQé‡TH=z²û=½„— ØÁ'äÖ'£§ë:ø›è!Š·æ"E]²w±Škºš«Ç¯£LfU•¹Ìœl·AYe´'üU?sQDkaâ ªœ”•P&,<†òæŒ<œò· ^×èøÃ¥çoÓßÝ8ýöü{½?Û³ØÓ³µ[íh%¸ "ú)ŒEp„W$‚÷ª ¨¯#NâT÷öÈI¤µ$;Áêœzýe°Ù#ÑјÍÅðNm˜—»õ?’º€€Š ’Ï—£º'@éŽÐ4ösMʬ°›[¯¦bêÖ"½=iFL%Ø·_çž_ MÕΟ¡9m#ÝÞ¤úZ¯ì"R4ÄÍ|l³Z`¡p~I+`k6'Q‘^¯p"ûÙÒ³…&¶ƒ£eÆ-o:ËWB¹7UpÊèF‘ÅY;> £¤1ÜFG`\UUW·@yÉ0cÈz#ÐÝu¡3Žò‚¸Êªn JB¤ž…âD›§rªwå”…8¢öK.>¥d£è‡Ùê!ê0PŠCÌK’,´ôrBE]ÜïEMðZ“²jj W ûDWSó7iÉfEj70ÜH£®è;QQT=ö÷ó›Uv¨Rž­3rãTT‰\…_*?>JI„ãoÆæb<âëá*„¤ùŽÄžnXiô¦´]¨+e ЛªîÑd¹"Lu“ ²Ë8á2‚ßU[dÕ¤Tt}(„¹"´‹Þ—Ãò³Jß ùMJ•Ølýml©=œÊÕRŒôWÜ8G=Ó!Ž`KîŠJ*Ú‚§z§>ö[5·’¾LKò׾ óôDä­**¨®Ö¹²kêÞ™¦m»Íñã².¹¹"/xÀ;‘UWrNä]·]‘n[ lúŽÅê´œ%W  éÙ ¸}hñ†û¦ÅÖ÷D"‰;Õ;öÛ%ãg¶ØŒZZ^ª¬ˆŠÚ°sâGT¶D÷@mQÁøcO…3žWUk&ûÒ”i¤µ-UÍE[uo»úƒ’œ#4Å_7ðw uBwh|Ý—$4ÜQM«4$cÐv>I¦N–\¸Râ,VÝ{ÅëÉ´vBŸƒm¿~þ·¿÷ßÎnCΕØ;:Z¶<é=›7§ÜuÇ+›xá$BpvêH¾b’rÔ{ÓtßÓœü{;ÖÎi¸•Ë@a"Š˜+…Ó“ùs£. ½xÜWÒžëÃá;{³ê„ЦZi´Î±sAj ‡¡XG—©¯$ËšüTšÜi–Þ}ï.Š;ÓmÆÁM“Ü•S~k’4¾7<šœ¦ø_ˬV? MlY5Gz ¬Ær9!4mª"‰rŠ¦ÊŠÛeOAVvSêihJýŤpXóV•˜¢ûB¤Š çI9"rî_|SàË„V‹¨±šXd¶ÛØ@Q6DD÷‘8Ä=­µTÛW¢ŸÙܤ¨vª•ájñ`Æ7š'ù<®©¼bØñTFÁ¤ÙU{Í:䑦k¦¢Ù,º×Z†>ˆ~¢4§Ö<Ùᣵ!ÇI_àg拄蒞˺®ý蹆=ÏcA­™Ÿ×@Žªœ,‹/·""O.¶Ê "õ ²oŽÛî*;nŠ™Î*»8×:~‹Oô˜2:K ćOƆӑÂL´8î€ÌuƸð?Þæ ¾²‘/If£SÝ[hÕÔñã£UFÂÈÙ1VŸ´Vѱ÷àž>ôDä­**¨®ÈáwþÆïýYõdm=/OKgUÇ«‘KÅXYƒeˆ’)£žnȨ‹ºúr˜äNÂãèøÆänÎÓ/ËWc‘!„äTƒýÅsaDÝ;öDO{-šéÙ¬iY¯Öi¤Ô³š@8õŠëM£Î!ŠŠòuPŠì{ªîœ{·]“8ËúK[º1µt:–Ô©VÚ¹j›•Ô}˜­‚2Û;"¨Ç.D¯nЪ}ñ)IXt¨‹Ù*v„ØD]å™6(ׂøÉAE¶÷]º(ŠŸýžököp‹øíåìçÈø1u¼Aà~‡!ß—GÎáˆû÷oÇßÛ*”>öšNžE¥ï),Ùñ_ì¼E¦tb;Rcƒ#^‹]%dKqçÝÉz˜¨°-g¨u=Ä~‹¯WÖ6¦$¡ ­×Ÿšªˆ®:nûüQ¤TE“s¯{¾|;AMµñ—´Ó+ OñçC§Õÿèëwrüù¯ ;4òÒ¿ÂHùSÑæ‘ü;¥·›ÒßÝ8íèãݶjö¹ îmta¡¯¸rW[Yu^’ZNšøjqé줠¨{¶n›íH]ªÁtm;:yø±k ÉÍÅ~ÕEF¹¸d[MW[áÅ´B Ti®]Êi“ x&W9¿æsÀu/†yàvü£êø'O«Ôó]_ô<¯Äyrèù¼øðß~ý¸ÿfP»/Òú«Oέ~}]9§$U¢øDeñ£ÄQ”I…E@%ŒãН¨’’ÿu;ºfÔr¨t”höd[Ê3›hàw¡Ëx•Çv_|P‹ˆü"žöHÒïÒÎR±ãÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀòçóeù(÷?Ó¿âû/6_‘rl’»š¡¿#"DUîÜ•7_Éð§Ã«’zkÑ7þk_³3‘Ž3`FUR¸Š*®ÄÙ.ß‘uü‰’Z\Âa î*ã*‹ðÿ%ccÆÆ{]ÿF5ÿQû#ùaÊö»þŒkþ£öGòÃRö•YùôŸØØÎ‘œÛ~=¤V—Á6Rÿû›s]GL‹²Ú@EOƃíÀ–ÆE¡¨$U(*‚›ª¤îÿïž|£¦ü)_ëAöàxÖ×ɦôãÖ©¦½Öb4xâhgßxh—ïQ\pKeÙWeÛl£5ÚÄÙHÍt ¹ªû€ãKxƒ€[Š`mJé{§Q'ÄÓ¦<‰Ý»¶Ým:©ý3¨è¤TN·ŒÛN¨ºÄÐq³p¿b$Ý7ÝÑ•bÒš] ë›8÷Jûï?rÔø©.GXmÁ4étTa±ãÒ•7YÅbÝ9ÚÓ·¢¾3š{ÅšzÌ"” IÇ)µ•áZy´oh«UMÞ—…È dUÙSCö†æ¢Ö“´ËÕõm¿;:Uöã8¢8-«ÐA‡ÕIv#ߦç›ß§â 3Ô¬ŠºÊ_ˆjŠ!B¢IqF#K‚³ç#Hùq6Àö'U“Ѷɛ:z·OÕj_($k)w†pbø|è䑨3 =Õ°óœS.ïOzï¹¥{ý3zûWKÓö•5Uq,l¬×€%Ø$6Q¶Í¦×Ý8æNHa°>qw¦W¿Îã.Ûi¦cVלMBÔá²và–n3)Qð† JL†åÌÔÇdmÅDTNùmaOê'áL Ví4ø`ëML®šÀ»ÒuªÒõljpônЍ¨©‘Žé­$NTÇoVJfš©ÈŽÅ§ì,Q8¼: ¹ºˆ=0UqUUrÞa¦ü¾Öy&tö¦ÕVõúŽ?“”¬ßÒYñË¥îQãÈç×ðd1ó$m·I|àÛ}—tÛìÓRYêš)6VuëI« ðIÅ)§Å“é“¢dÓk²˜¸‰¸÷ ¢¢ª*ewMS×ÒK½•þsmç¹wÈ䬗뇃êËL‹áÒŽ †-²Ø¢w‡rªŠªï–]=7LPÐÀ¤­Ÿ¨P#7€Y`ª€‚›®ýë²z}ü!n{GZýfí0Ô°í|[µ²åô üAVãñ^£b³"¡Ÿ1â¯&ȹ££{\®¿e~ùPÂÓð¡¬ÎAtØ‹j¨­±¿rGy u»Å8î½ÛtšJ~¨+·5+­4ô¸ó¥V·=”‹*L~=TùM®á1é‡$]³B«EvyÄnÂÊ-åkPо]›‘‰1:Û½!mÑ –•Õ2N ²úwGµÉ³´›Éš2“T¦b,ywž'²‹*ÑBL"[4€$",º¼•H…HvÙ½9Òó‘„Ñ1´ÓZwOj§4Íp[ÃUx#ÒPÉiK›æ´m¶ ‰·˜%É3 @½ª ß €¦‘‘°lX!ð~™ #i±¨«‰È¼ý—lÅ[£ôÅf¥ª¹®×¶QÛ©‰(& Ì3 VÁ]`qÏ!4"ßï“aÚBÊå µ ­áßC»¨…Y>šÉ ºç”¶œå‰bdÓK÷²}"½ë{¨mtØUL‰Q | Q Í7g“±á2YŽÙ¶Ñ£»ªªŠMìƒÜ«¿t‹®¬ÓW6¶gÚ%…ÉZºÊf{вyi¤u:,6HHÛ"ñÛuQR]ó7hj5|8q \ʦf4–¥(×H†½WZy·™"Wšq|ÇD‘{й'vAægh¨½¦‹®b‹©öY”å•ÚDyÃ0Hc0™>BÓ€Kº‚nHœ½*•x=»G~¾\ƒ¥ƒ×k1˜¬ÛuŽ)!†Lg'I<ÛY-™§ºq5ÿwe™“¦´¬«vldë .¯„Û5Ÿ ˆ-ØKŠô¤;Ť$4é6ª-“`¼SÍÛt_q©*Ú—&ÍÞÒíå]»"1hô˜XŒõÛF„æ <”›"TDïM“d{ú¿ñeaìÏY1­*gJh`£°&,7Êß ŠeÒmÔ&žâ@Px;ø~éïnºú³WÛéëØMHÓÑJš]ŒZæå­š$—]|„P›ÓT %RÜÄ@ÉQ7VŽ5¦`Iø'H™(¥Í™2sfô—‰TÉESÍAADDM²}%$®ÑÖ¾_ÏjCHÔ.¼#4Ú"!¶ßQ‚q´so=@Ä‹¾M‡k¼]ßÂ#Zí Š¥Û3ÓŒø<ŠïV«v‚jQú‘…N_™ü—‹s#¼_ÎlÑ©oݲâÿ=FUÑ ­>…&dˆÁ9ÍCÆ©þˆ2^á/ ½S5{€‡Lw&]MüÎüÉ¡42Á8.ꩯGj8Ƭ±cj¦EöŸc`ïDq†WÝzͯ›º.Èiºv«¥ÃÚeÜb±’ä«I Ë‚Î3m¶¼âF=ψ4"m{ÕUU{ÒmÓÏ«•Ê®¥nbê=/U¨`‹ƒÒ3X1EÛߨ“*!Ú,Š»©p5•4J6Ù©vÝbËÂͶp‹À \N ≢¨÷ÏÔY隊˜uUÓk£Â„ÀGŽÐÊ›lE7]û‘2•¦´v«V-õijÈVËÎ|Kï>܇ÄÇcš‡AB%O@¦ÃµrHÓ6uí'Q¿Ùqk¨ºBº3qJÁ,¡YÜ›GX²gˆôã:Ž+Eæù»* ¢žûæ{Òl*µ= µTi–~/AË'¶Cq¨ÈÞî0ÑsBuH;š2AÙ;ñÔiNÎê4ëZz®T5ƒvWNGŒôv÷ºêø Š"¶ÓADÙPYlUUQvïëtýÝì{ ÚÊZÃbdyÉV3£ø*¾Á 6{¨+£±ªˆ¸"ª‹º.ëº)¹+¥ä‹µo?U\63SŠ5ŸFDÕIr5Eâ(Šªªˆ«².È«²/.µí•úØæÜêz(2£ØI*LÝAѬYi—”¬*›„qVÅy4ò.Ü;îZºU>¡Ó“iGU¹Oá`€³+g4܆ÓtUàD„‰º"Š®Û쫶˲¥F>Óq«+"GíÁ‡ªÁöaÊdë[6£¼£Œ#càªÐ—.Ÿ=Õ|í—lÌ×eŠ6ê;W[UŠeTn!Kfêå!Ëy–ß&XŽ™<ãmº Hª ¹ òôªZt¡µ¼;èwu«'ÓY$Bò–Óœ£1! Lši~öB"¢¤W½rŸEhX@:èµðÎ ¥^c«2]„-Œw"w£-'šb‹Á7EÝw“ÑuÕšjæÖÌûD°¹+WQùLÏz6O#m4ާE†É `d^;nª*K¾ji²%;OÖ'£+#O&èÆ;¦@r..†¹$HØ’‘¸H„¢(?îêÛÀ½Ú£­^iØQÄŽ·Ú‚ý¨°Œ„ÜHH ªÛJ¦Ž˜íÒqQ¾kV]û 6ε‘L &P%ÆTtnBbð8 èM—Šw쩺ïšcIŠSD a4iê Æ©[ ?8ˆR WSelP\A%EUEÜ·E7åö“Tµf´º:W&Ö†ªŽœœ‘_h.yDQXÑä+Å!Ö›à7%P]‘²Û—rf÷fÁ5¥« ´0â£Ðfø\IÜyGMøR¿ÖƒíÈ%ñ‘QÓ~¯õ ûqå7áJÿZ·_å7áJÿZ·QÓ~¯õ ûp%ñ‘QÓ~¯õ ûqå7áJÿZ·_å7áJÿZ·QÓ~¯õ ûp%ñ‘QÓ~¯õ ûqå7áJÿZ·_å7áJÿZ·QÓ~¯õ ûp%ñ‘QÓ~¯õ ûs2\תn“"ª/÷ã#ŒŽñÍÎâýpãÇ5ÿ;‹õÃ#ŒŽñÍÎâýpãÇ5ÿ;‹õÃ#ŒŽñÍÎâýpãÇ5ÿ;‹õÃ#ŒŽñÍÎâýpãÇ5ÿ;‹õÃ#ŒŽñÍÎâýpãÇ5ÿ;‹õÃ#ŒŽñÍÎâýpãÇ5ÿ;‹õÃ#ŒŽñÍÎâýpæ2Ô4àJ%eI=(²A?ûàI¹üÙ~EÊm˜Û“éBììúâ±–kfl)£-w¡l¾Ñ{·ßbÛe°³wY)΄yÐÞp‘vß%ÿÑ2=úÙ‰9ùç´Ð¾¢FÛ±úˆ„‚ƒº*úQ¹wô`R{)³í.ታ5åUE;-‘±,v\GÜ1-‰Å%p…îT‘y}ò*;ŒÿA{ò±û#$ä ƒÄH©Èa.éý©»ŠŸý³^Ž8D‘eµUd6تúvHÌ¢í'ŒcŒc½®ÿ£ÿ¨ý‘ü°å{]ÿF5ÿQû#ùaÀ êUTÔª¨»*ÿØÏÎÚû@g³]£×™’ Á 6Gãº+„Â(‰º *m²lˆD>õê¡i†ÉÙ€Nº\@9B`QI}äÜ‘?õÍëË* úI÷p¡Ë‡)¾+Ê+ï÷/QP“eEDTÙSrݦœ±©'T’[) .Þäkÿ¸ŠþTOƒ$²­7PFzT7ZXh1ÝW Æ:*î*;&Æ¿W¿oFÞþéµåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀŸÆ@ySûŸ_‹íqåLî}~/µÀ›”Ng ‘pETPˈªÿjûÙ vNùý8éÞŠ-räžzrß—›æ›Ü^ÿþÚêJÇÙ6^n;šlBS¢ª*}ncrö™Î§8Ñ ªÙï6/œ)èOç=øgdïŸÓŽè¢×.Iç§-ùy¾hù½Åïÿí$;웢"ûû.Vœ½¦s©Î4Bê‚6{Í‹ç zùÏG~gQ^(ˆˆÊ"w"$ø½ßþ×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×åLî}~/µÇ•0?¹õø¾×)ñ@Š&ȈŽ"&HùSûŸ_‹ír"4¸ÂÙ+“k„ÍÃqE'²¨œ‰Kmùwí¾æ3†Ãùý¯3ûøðØ?¯õæ>3†Ãùý¯3ûøðØ?¯õæ>3†Ãùý¯3ûøðØ?¯õæ>3†Ãùý¯3ûøðØ?¯õæ>3†Ãùý¯3ûøðØ?¯õæ>3†Ãùý¯3ûøðØ?¯õæ>hkmLîˆì‹ÊXÙ’pÚˆdÁªŠ8Ž:عޞ‚T2T^ý—½Q} ±á°þ_ëÌþþc•*ŠËM³Ey ø Œ£,øäÛªÑ ª+‰ºnª*›/¡wOHIÀ¸…©tµ5ü&d7cÑ_`d²­¸N w¢ÿbªn›¢¢îЍ¨«oÊt‹èSN;=xqÁ$4á¸ìö6Bô ªª®Ûë“ÞPPþ­õ ûp$òô¥Ïçƒû;9±åáºßZ·5)ÞfLËYÝ™rX¨8Ù! "0Ò.ÊËÞŠŸ•GÆÆ{]ÿF5ÿQû#ùaÊö»þŒkþ£öGòÃcCkÎ †ŽdÃ.>(<“¨¨»§rûÙ©ä•wÆP‰ìsbt–cWj »[É••´ÜÜ|˜i³@e¸à隢¶dJˆEÜŸl›ú`gk}ù‹®o%1]4ɧ ­e$v$4n´éô£VÛ2R^áN<¶ä;„·’Uß=B'±Ç’Uß=B'±Íw/ôó1[‘/Uê8]Xë!¶¦T¬wŒ:ÂÇšÓ‘Ôº†€ƒÉzª&Æ*¶U¬ÎJ¬›$YtÙuY(¦€à®Ä ³]ÄŠŠŠ‹Þ‹ŽbÉ*ØãÉ*ØãXÈwL•aÈTM‰:sœ•`tâï´ÃJê ¨‘º)îbjˆŠª‰Ý½ƒÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–FFi·õTý8·‰. Ó]5n/MAó|z{òEŒ{(쫺ì^IW|`õžÇIW|`õžÇ%.âG¥«zÎÏTZ±”Nd0jªª‚"",©*ª" "ªª¢"*®`ÓM7\ìèw·´Ôép‰n*8ÒŽj›6¾j›D©ï쩺"÷ iy%]ñƒÔ"{y%]ñƒÔ"{°y>ÿõ†×ô#û,y>ÿõ†×ô#û, ÿ’Uß=B'±Ç’Uß=B'±ÉI‘#ijƒXþ¨µ“ÕÏi`”Б’ìÏš(›nK²nB›îH‹š4·Ù#vÚò)#®©IPME 86IÄ‘“¿}‰9 –â ä•wÆP‰ìqä•wÆP‰ìrÁäûÿÖ_Ðì³NdHñ,àÖ?ª-FdõsÁšF˜%4äd»3æŠ&ے웦û’"„_’Uß=B'±Ç’Uß=B'±Ë“ïÿXmB?²Ì2)¥´ô` kÇÅçT ÛHˆ,'.gÉ´UÅÍB]Ì{¸ò$_$«¾0z„Oc$«¾0z„Oc’“"G‰g±ýQj3'«ž Ò4Á) #%ÙŸ4Q6Ü—dÜ…7Ü‘sÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽaÒ6Ðu=Å¥\ DÓÕœºÄû1Ki“"/U}Ò «Þ‰æ/¥UjdHñ,àÖ?ª-FdõsÁšF˜%4äd»3æŠ&ے웦û’"„_’Uß=B'±Ç’Uß=B'±Ë“ïÿXmB?²ÊΑ¶ƒ©î-*à\ê&ž¬åÖ'Ùˆ‚[L™xì «î]^ôO4}*¨!›É*ØãÉ*Øä¤È‘âYÁ¬TZŒÉêçƒ40JhÈÉvgÍM·%Ù7!M÷$EÜò}ÿë ¯èGöXÿ$«¾0z„Oc$«¾0z„Oc–'ßþ°Úþ„ešWu“ëêÞ™^¢·y¾ÿõ†×ô#û, ÿ’Uß=B'±Ç’Uß=B'±É©ÒÚz0µãâóªm¤D3äÚ*Žâƒæ¡.æ=Üyfò}ÿë ¯èGöXÿ$«¾0z„Oc$«¾0z„Oc–'ßþ°Úþ„e'ßþ°Úþ„e_òJ»ã¨Dö8òJ»ã¨Dö9`ò}ÿë ¯èGöY†4·Ù#vÚò)#®©IPME 86IÄ‘“¿}‰9 –â ä•wÆP‰ìsJ~‡æüÆÍ“M•R U45!AóQ…ó{û×ÞËo“ïÿXmB?²ÌNiaqñ}Ë«tAA ZŒª‚»nŸÍzl cu}ϪÃ}È€÷Ë݇?Éüàó»ËÞÿß=uy/fÓÄ®©/qì*œ7a9ŽÅéOÿí¡­Ã].´ñè¶­7³Q¼Ð]·÷/Gv~±¤Y`™&mìXm[iE¨ÉÀWmÑ=ËûÉ*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`Wü’®øÁê=Ž<’®øÁê=ŽX<ŸúÃkúý–<ŸúÃkúý–É*ØãÉ*ØåƒÉ÷ÿ¬6¿¡ÙcÉ÷ÿ¬6¿¡Ù`A7¥¡6†€ù8Û8±›RMˆy H¨ŠÝÊ™=šW•r«©gX5{bã‘c8ðƒ€ÇQTEÙ¤]»½åLÝÀ¯_ÒJÔº ´ 9Æ[—kL& åTlMØ-€©*"ªä›ìŠ»{Ë•MÙLêøæ«£b6«¢f¨‚e‹ítiÈãÛ£N© ¤–M“ˆ(¢‚¢Ùïîåi­Ú£‚Û.Kª&kò*¶FÔÌP‘GqMöT]½ôȪ>Ñ.àÔÛÙêzɳëâȯ TM=&­ÙoJ ­ŒYn)ù„M*Ÿ-‰TDU•¹-_¥õž©“Am!ª É´gá¬En[’ZvZ<(€N“HÒ°&› n†êÛ´*S°´K®XNœNØ ¸,„V3hÒ¢ˆ‹¼|÷Õù„£ËÎÛhËNÔaV0ã³ô®¦ŽPáûfÉ–ªã#®¶=³Û—AÒN’¸ª"«¶mÅíºN¨‡JÕ-Ò±6ÒETk5i¤ˆä˜í¾o{§QV;¡º‚"’wnˆªˆ¤FWzÝóIvK>ûK¬*²Œ3™ { $È3-©B„¢…ÒãÉvß}—m²Úwgº‹XOÓÅ*M3p…É2Ý"¡”„á¸D{¡û ¦êŒªô[ïDUkµø¢ÙÕç¤õ J—ÚŠûÎ~¾ºÓàd&†ô 7‚"¢’ž (B¼²2_ù@èö ³>=UìøŽC)dü@Žm¶"³yŠ—Y”FºYn…Q´âEÈQQ­IÒˆK.ǵ|®Ð,¯`XÑQ51ë)u4ÃæÔ˜ÒlŠ› ëŒš©È1"4ATKdš~–ÔwV’)4ÕiõÐ"µ •÷m`å¸\Úoe>¸/r*î…ºªùÅz»…&­èq-¦Ô<ç3!ƒ$ë{*ñG€Ã½QwîUÛeÙR—¥uĆ;"Ð×¶ñç]]_×B@bM Ó%9¬{!6h:kºˆ¢ ÿbd]Sz†®}Ö®¦eö8ÑVªØ:Jc´™b¼XoŽûñ9ÕUDóÑ•E]‹jÞÇå4‘["¾ªýû{Çå[Ççá hÏ耖Ȫ rc†è(M’¢ªì¥#¨;qÒ´0!ØZÁŸ€{¨ëò ²l8ËÎ2óJË’ç ²EFÄ^î*KÝžu_j-B¾§6cYÂÓñîgÇ´´u†–4†â@œã퇜®¢ƒ±Ó¿€ïÓ$$Ý4¥.ö"µ­Þêv¡ìBöâŽdHÕÚF€MØ­!âˆÛã]a%òVEQâz\r]‡ty"où©» Ô’†0WN„±#à‰¹Åäù2q‡ƒ$›qy¦Õ[FÔzI±"muÓÝ·éMCÔ¤…ac`’YŒÍ|7áÈuótp8›o“#æGx• ÁQF×’&㽓²{» C¤´³ë#åohÀƒÍˆM5a!¦›$íŰ_NüwUUÝWS3Vb)`JŸµÔú‹VVuá¬S®‹Xðµ(<^!©“çËpDU EG’*e ­>÷±8T54ðÚCa>=}½sM#PÜ›,ÙFÛz;Ãún¶©É’Q!ØUwNÅ"|J+ uPRÂÁ˜®9"¸¤‡PUA¾KÜ<‰7_FùÊ\í7UWéÇä¿ZÕųVµ1]€ÅSµÏGn\¤h¹7)ôCEó·@ÔUÅó… RmN ÏŠ{ÕžNǬ–þŸ´’0dB‹6\‡ÊE)’]jTDPUÔiæEDQ”EŽ+Ç»-½¤P\ÚèîÓ-¤×<ìé:zuU$6“ªâ±à檢!¿žó«¿ïQQQ 2C^öµI¡|µ=dÚö¥DFnίcÓ͵l¤£Ž˜mÞŒƒˆ»¢ ’ä¡k¤sSÚÐ×éMEdå[ëD˜íÇF:Þ´#xWrUPÕ”QP•ïÇRnïE0;*²“Wuêý=SÊ}3…]_!ÒŽàCš/ÈD­Š£ï7æª"/{a¹®êI!k¤´Í_i.™ÑíD“U6D—fF© j4'"ÏEi$ðàˆ²F·N\¸¢l¹fìƒSÙëΩ5½+Õ2çAaóVúo)²®´€ãŠ*’ñCT4Dó…=øþÓ;S ìös êï7Ö:ë-&ÂET$F|p‘}›l÷Ý7]Ñ-k©¶M]W¤.u]V½) ÌYÖµh©÷7X&‰ÒPåǪér-·^ µºrEL§EìZÖ¹û"‰MK¯~À%­3î8ÜIÍŒ»3ŸÙ¢DAfd>>i§(¨;qU²jÎÔš…{NlF´‡§ãÜOihã ,i Ä9ÇÛ9]Ec§ä­’ ’o¸;M—Qê7‚|8‰­ÈñÊR¿6l¨üÇƒŠ„…³Ê{§óP·E‘9R.õ]&³w¢·§{Õ’ŠyXT´BëtͺeZ¥•Œ¤iõ&ùñæ·ÁS}œ"@î:¯H\꺭zRA˜³­j$ÑR în °M+¤¡ËUÒä[n¼kt䊙©ªûpÒzQÈ‘õ4+y¯G)OØôFŸŠÊ:m#Š*ÿº¢«f¨,+¤¨ˆ»w¦ûŸçz‰u]¦‹r~°d”ƒç ‘€"5n:½á."ñØTYT.B©æ¯,DÓNwà˜&ïU6/bÖµÏÙHšj]{ö-iŸqÆâNleÙ˜4þÍ" 3!ñóM9EAÛˆŠ«Nö9ª+%ò°¨h…Öé›tʵK+HÓêMóâ-Ío‚¦û8*D€;ôÏûGƒ­¡L•OK?ŒG˜hÅfÀtýжRTfI¨p<„ø’Þ‰—›—|i5MT‰:vÊâf¬³³†yp©©ŒSž1¸/#궆L“Î.êBŠH ²¼y ¦s‰ê(úR­ª} ÚIðŒìh—Áñ%Y Z‚§»£Å\ŽêŠuS—ºn6kÚ^ Ò:¢s3ãC™Ì–Þa±Π6¤ón*¡lªÚDJ§ù¼MW>î•]d‰’g»áÑHü%¤’W>zy©¹¢N¯UNIºÆ^ÿ0»Ö1Ébs«ç˜=‰ê4¥•<šú¹ž.#ÀÂÞ4ÌeVô'I¦ê…¥5êâãnóØUI¡åÖ{/¢¶ÒÚF£OÌL!© ù×€° ™=ɱ›e¶Ëq2æhîCºž¼-¸ÅQÄi;#½¤íµœ&è’6S' «î4Ouœ¸.hÑqä“kЗbÿG.âé‡-Ê~Ïõxöc#Ef•¢P·vmdªéï<•Àìפòi¿iÆEÁщl¼¸˜]‹˜®RFH=Týª¨•gâGFœ$dÊ’zLTÑ Î_9yn»’îD¾rÎcfk5"(cÈÆ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0"µú£sùƒÿøË0æmcþ¨Üþ`ÿþ2Ì80ªà^VjšKF<"ƒÇS\Èz9¡1ÜU7TÝàÉËš¸Û‰bÇ]–ä±(G™ΰð<Ñn*‹æ¸ØÞ…ÛeÝS(šö$©ý“vŸ g¥K“]5–eµ72¯Nò%UDDNõUÎ[­;ð²ŒN[Ì‹í!)#O f"ó{ª¯‡½{»× ìѰíE`6 ± ,·'G¯a§ÇùC‘Í—5'ÉŸ;ªá*¶Ëdª£È‹eU¨k:йI§F諺~3JVñ#Ó=ဥ#BDjâÜ8î­ƒ©¶ÒJûK_«ÛÖÒ%„§¡éÅ}åv%„‘”ëļ¶6vMØ-‰œ4ãæ£m¯¡‡JüÝïÜiñw²Bf†Ó2´½Fš8/µ[LŒ¥hÇšû.Åé6­ƒÀhâ*¨ïËuE]÷Ýr-ÎÉ»?r#±\¡#iàu·¦ÈU!u&#›¯=ûüc3¿Óî¿ý!ÆK´×uZQL>ü{'l«ØG™Œ“L¹5|ø*** $⪯¡WtÛt£ë;­w¤`êjÖ¥j=E,ôÉ9§æÇ£Élæ)#ºbH  O‚ñÔ‘C¯eT;=Ò§B€!Í ö¤¤¨À6rPâ8ƒÅ<Χ6tAiDQ‘9.õ­>ÿhOaagi"ÝKm_*¹ÊÖ¨Ð[)ËþBÚ8›ôcŠG¹H—§â…T‰ý“è9°¼ êyaA›)L¤† œ2¸8mÉ× w9/#"ßuUͧû7ÑÝ»õëäûÒ£–ñFê<Ó<~§ÒE0uÄ%áçrÝw]—-¸ÄæVŠù¸ÒËÈ. Û̓ͼڽ}9ÓŒãhH$Á“ÊL.ÆH½%Ñv]Ó»%t昦ӱcħbDhñü%[kÃ0R÷YÒ$"T2W7T"ÝG‘ ª!*,Î00Ï‹|f4/FÑ4óeè0$Ø‘±QW+ ös¤›­°€°¦¾*ÂÉzE¤§¤@ù³Åóq]™ùÁÄ“Šªªl¹mÆCPvm¤/›@¶…>Nõ©VéxÚX˜¨„ˆÛä.¢½·3^Nr-ÉW}ÕW,UÕp+æYK†ÇIë9)*as%ê:Œ¶ÊÊ»'¹²Øì›'›¿¥UWwONTéj¤ª¤jK0„ù6˳|YN(( õºm¢ lØì)ß²&둺»³ý)ªå=&ò—œ‘ `HèØHŽ/Ç^~æà´bŽ +†©ÉŠ’ªl¹iÆJOfÚ.MÉÚȨ'ž7ž|š9¬n£Í8ÓÅàê}$S\B^>w-×uÙqYÙÆ¯GúòÜ)Ý96Rd,7ÕøÉÉÇ QqUQvTóUQ-¸Å  5&£¿šÜéÃbİmðŠûI0]&ÑUP㸠bФ¨„ªˆ¤»mºæ«ÚN?ní´…º~Y“ÄíìÓÄè0*÷ ‹†(M ¨¢ì*™iÆ UÊ=AL²NÚ+ò‚~L‹yr$8Œ›@®¸áMKÌåÅPÍ‘lxÆ`´”;·-Þ®vDƒ'‹¥"cîÆxH] ŽF­™¡(Š*¡–þ•Íf;4ÑŒT½ZÝl®›®´ò¼VRJHH¨× çU´UA@$AB$M‘W{†0*2{4Ñ2Ê]™‚×E°nSÀ.·Ï¨ ò §\T÷%Gy¢’ª¯zª­»ÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀŠÖ?êÏæÿã,Ùµú£sùƒÿøË0àE•Ü]5§µŽ£œÛÎDªWf¾ ¢+„ ChÉQ¶ÛuDßßL˦µ¼[‰vÓ´õà ÎÐlÜÔuŒ:jË®ªŒw—Š$FÉU;óRÆ‹Ê!®4Ï…x'Áø>ÓçÒêÂl9ñÝ9mË}·Möô¦FÉì¦u“V:øaÈó™°+àƒâĈî²ßóHâ¼H{ÛôﺢÓ3Zèèr<Í[Câw¢-»bйÔq®Š[òê4èméäÙ§¤U4=S¦&Ü•,=GO&Ðz›ÂjkfútÍ@ýÍ —šBB½ÝÊ*‹Þ™B‡Øÿ -af jT½KQ&¸¥ø¹còì$“ˆ<×}Šz'Qþe;a˜k³Ç!Æ­:ÛX¬Ï¯Ô6—­¾ìbã“j‹‚ªáaºòE$eÍäŠ!7YiÂÓŒj šN³[%÷›5«VÜŠð8©ÅÕâ*]6ˆˆS~ &›’%÷7[èÈPaΙ«¨#DœÙ;÷l™ä¦ä@J["wª¦è™UÓ]]Ä:¿Ôu6lUj)WÌ„jcŽ¤ì‘š®)Èq6G&!¢"Š4ˆ¼”¹%;´^Ì5$Z{zÍ$d榇caœ(ý­?2L–¼ç$µÅf©6rF‘x àw¬c4…»_Æl¦ÂYãÑð—Ò!#NlCÕàßSpä(h;™pUE^{*nã0˜ÊYÍ<ÊDFiZUpTx-„QÑEEUT…QGŠ¡fÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀŠÖ?êÏæÿã,Ùµú£sùƒÿøË0à~i_ô›¯ÏÇövrs ô¯úM×çãû;9¾55CW¬k! ŠŒIž‰ 5À6ØxŽÉ樢¦Û&îF꫈ú{LZßËi×cÖBzc Ònd ‚š §¾ªƒÝ›‡)ÎjqÆd¥²Ñ²ÓêÚ+€¢¦^”VÁU¹TBfS0P1BM•7EL“¢Æ¹¸Ä~Ð5DnÑgÄ—OçØB§‹]\ÊäuÕ³x'º^b“l"/ÉIA´NH¢¹²}±ZeÍŒ-èôEelGoÇ€·&k;4]UE‚d ¼ГuÙú΃Ðì×J­gFiÆàÌ@I1‚±”iô"1Aض#5Mý J¾úæózwO· ø-ÑU„YÆ Ì FÑ·#>,í²¶G6îNeÝÞ¹QKÓ}¨H¼íý5IZx¹©Ò«ÖÍ#JàÛ±ùó' XFµ&ÔEEâ%R Å7]ºFC®•Òë©GS.›§[ÐEA²ðü(wÙÞ<þõT}>…TôdÆ6'SÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆV±ÿTn0ÿfͬÕŸÌÿÆY‡óJÿ¤Ý~~?³³“™¥Òn¿?ÙÙÉÌ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ1Œ­cþ¨Üþ`ÿþ2Ì9›Xÿª7?˜?ÿŒ³æ•ÿIºüügg'2Jÿ¤Ý~~?³³“˜ c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c cZÇýQ¹üÁÿüe˜s6±ÿTn0ÿfÍ+þ“uùøþÎÎNd•ÿIºüügg'0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0Æ0"µú£sùƒÿøË0æmcþ¨Üþ`ÿþ2Ì8šWý&ëóñýœœÈ=+þ“uùøþÎÎN`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`1Œ`EkõFçóÿñ–aÌÚÇýQ¹üÁÿüe˜p?4¯úM×çãû;99zWý&ëóñýœœÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀcÀŠÖ?êÏæÿã,Ùµú£sùƒÿøË0à~i_ô›¯ÏÇövrs)‘SSøÆÓÄ OÐY#ÕðäsŸS¢×Þðîãǧ¿}ÿ³6¾èŸ–úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü N2­÷Døt·Ðþ>蟖úÀ´ã*ßtO‡K}ãî‰ðéo¡ü Mcþ¨Üþ`ÿþ2Ì9 ~šÝh¬Åtïx3žÐGº>+ˆýܶßmû·É¼–ÿH¹üù?gg&òK¤\þ|Ÿ³³“x c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c cz¿ýS¸üÅÿüe˜3>¯ÿTî?1ÿf  P|ke0¼£ù;‚Ï)0:Æ^æ¿.i²yûmý™ãÉÏÅôïêâd~¥“ifs“YhíۯŠ’eä ¨—%æŠù¥²®ÝÙX©·×”76‘-¬M A}ø 5­-}¹s„ZTપ­´À¨†ÅÞ*ŠŠ¾p\Þ¤a—máÓ-›æ­²%Tˆ®."^õâ$»'¼*¾ödòsñ};úŸø™ !íY]ª™®rÂÎua“N½,`6ªQç)€ðom…Æ£*"¢–æ(ª\‘ñ«=dÍ3–scK9P¤2ãÕìÃðˆŠ; ·UwÎSQBî&Ðt^F¨šòsñ};úŸø˜òsñ};úŸø™W”ïh+_i5gMbLZFì#Ãf N ²ˆäšÅÝATøˆ²Ú ¯%óWtRïµiị¨l XΕc bÆ~<—£ƒhŽ<.6*(¨(Ûk²îIϽWtËD«Ï“Ÿ‹éßÔÿÄÌlÒ0ó6Èé— ƒFÞªEVËŠN¯rñ!]—Þ$_<ê++ÈzÚ\Ø¡YtɘaYHpÑ­È›mQUÂDÛe÷»ûöJýmEÞŸ™fTïÎjUÑš„‘D›‘cÂaÇ”TöCïDEl·ßeÚB¬ÞN~/§SÿN~/§Sÿ)Ñ­5ëí6Ø;l2]ðdŸÖ©n Å1€0ax'U¾‘>ª[žÈ\“|–DÖ1dËqmì¦5æ$V[8,§…Æucõ\5ÑW‡YÔäQ:KË}—¦üœü_Nþ§þ&cHÄ–ÕÈã¦^3mIº¤$BQ!Ýô¡"¢§¼¨©œù»]kh¥C©€ÙKcn#±Ê;¨ ¤ð+¢Óž Ûj=»ªê®È¨»"®mj=S­¼ZnQƳ“"<‹"Í™ÔÇ›m•AŒæê Чߵ˒yĽèŒÉÉ{òsñ};úŸø˜òsñ};úŸø™MÔ×úº¶*bŽ“Ò£Œs¯AˆÓd&mþ>{†â°Š<ËïËÍ;æh/ jW¨jeY9®ÊѼJ/‚x4ey\{†âB&d›š*®É±"ìˆÌœ–‚¤`eR2¸à4µIÌ„TP‰«º¢) *ûÜ“áLÉäçâúwõ?ñ2‰c;Q=W¤ôõÝŒ™µ=zø{Æm¢S…Õ"£Å¢“ܽûªïèö‡Z?"…sdÃs.gDu´€ÎÑbIV]EV÷ÝQ¦… ·G¹UQT&%R1+²¥™a†A\u×*@u"UwdDNõUÄjF$¶®G2ð!›jMÕ!"’‰èï¥ =åEL¢ë:Ê^•·«˜·„‡]>4o©GVÁÄzCHqmzhM $*<•ÅTUÙ<¸·üdé«óaÁ¶º•avå2ì÷MòtÕ7èóP5W’)ï°£9¡9:“Ÿ‹éßÔÿÄÌr©‰ÙR‡L°Ã ®:ë•H ‰º‘*»²"'zªä;C­‘ ¹²a¹—3¢:Ú@gh±@¤«.¢«{î¨ÓB†[Š£ƒÜª¨«]Ö2u”½+oW1o º|hÞ RŽ­ƒˆô†‘âÚôКHTx!+Ѝ«²ê5#[W#Ž™x͵&ê‘ID‡twÒ„ŠŠžò¢¦dòsñ};úŸø™ÏÜ[þ2tÕŒy°àÛ]J °»r™v{¦ù:j›ty¨š„+É÷Øf»Õq­õ"p¼±a¦H‰ ²Û*®€r*“†"J\€ž@%áÞ(£’Ñäçâúwõ?ñ1äçâúwõ?ñ2¥¤åkÛ©ÍÁ°ŸiW<-V_€‚›ˆƒ ™ÜŽÚo»¯§óCº&Ê£É0Z[ëŠê {ìÛ8q]–ß‹[þBùˆڴÃ~D¼œMUUCtÛeØ.HÀʤ:ep Àij“™¨¡'WuDRU÷¹'™“ÉÏÅôïêâe\­jRJζ5Œ÷cCœÌ S`ø;®2Nת‘‚6ˆ'Ý#Št÷$izËךïÄð«b}%¼=(µo$—›@iEÇ`£b¨D}êÐn‰Í8à^üœü_Nþ§þ&c“HÄfÑɦY0m ʤR"AÝ]ô©*"'¾ª‰”°¶²nD)1lmb1{ã;'º¼eºhÇn)qP5Aé("ì›yÝû}òLVÊ×NB~}ƒ“’3êã¤â6­‹n$%”h¼TˆQNHòå°§?|QE±ºÁäçâúwõ?ñ1äçâúwõ?ñ2½§Ø×  Ck¬)–T÷<\À”I"ŒlÒnÖÂ¥Ôsq4U÷5ãÇ¿hÊûîѽ¤YÑ]‡CP ÖÖÄÔmµ‘Í1ôÍ œäëHwdÆ03ônÿ×z‰û\ÆÌ+F\yÆeU6oš8ñ q"¸\Pyõ{׈Šn¾ð¢{ØÆ„­°Ië=§I„Ò2²÷ßñ†ëó#þ•;߯¯ÌúUÈébá®-öˆh‹T)Ï.å ¹EéKmhiRØJÀBXt)µ8YÚZFVˆÀƒjÍMkWJvk ZÀ[u‰™Ë”5êBˆ0Ú<2¸­°­‚S ÉOðŠÇ,”x .E¡Þûþ0Ý~dÒ§{ïøÃuù‘ÿJ¨ V§¿ªÐ\cR]’å­§5~˃¯®Ôñ™/… Cq 9q¶ùlavöm£P©M°ÕÓWN‹¢zô´Ãº7¨d8´±¥´O‰!)[—.W'TÂyvKÒþ×ù¯ŸékZ^ï¿ã ׿Gý*w¾ÿŒ7_™ô«ó£¹7yéÉwô-‡íQ\ž•£b“!M$¸ }£¸ž^Õpï.ÚéfÓo·Ù-ŽéW ÉT‰ žâTHr P”êBß ´ãzŠ‘° Ö(©¦bn-Ýï}ÿn¿2?éS½÷üaºüÈÿ¥\î—æMƒÑüÙ0¤ÉˆñS*Ll‡Xˆ©-&K©#šJX.«pæ1‘ÙTâ5 ”Û ]5tèº'¯KL;£z†@C‹K [Dð8’•¹rá…ruL!—fov©zw¾ÿŒ7_™ô©Þûþ0Ý~dүΎäÝæt§%ßд^µErzVŠL…4’à)öŽây{U@Úµ=ýV‚ã’ìì—-m9«ö\}v§ŒÈ)|„(bˆiˈ ·Ëcs·³SŠ¿ŸÂF±kÿ½÷üaºüÈÿ¥N÷ßñ†ëó#þ•FúžôûáH¸¹rµ3táÚå*zç%Æz³ p7%Á½öÓ!R—Ì„–*%«/w6z[~(½Mbê‹Ýµ‹U±3ÜBd[—ÕzÂ(N<­åsl°Ø¼•¬Guù8Ÿ²Ñï}ÿn¿2?éS½÷üaºüÈÿ¥UwAw»ÇTÂiëÔÛ„§¬Ž¿©c½=ÉÄ.6ÖÔÚÆØŠÜ¹¨ £‘C(Wiå"éòãÝf„ã·–`;(R–à;v²JB–NvòœYÍ%ýï¿ã ׿Gý*w¾ÿŒ7_™ôª«Ñú¶Å¤ÅÇ]9Ýk¶“PºA¹^ jTåw7«BS¥¸ï­+x„! «rýw3V¾¶]‰½1-zšïÜ{HÙÖ&wQvþ†¿â´)VÑÉC9ÛÌ1SIqoŽ÷ßñ†ëó#þ•;߯¯ÌúUD¯\;t軣I(Õ‘dÛM” ôµj…Û¸—ãÅ)ŒüÖ‚ÜC§ŠòË|”¥$dã5}è™MÎÑ–IÌÆ¹èî¡‰Î­É 6’êÖJ”±œ(¨’H$’jF«:1w¾ÿŒ7_™ô©Þûþ0Ý~dÒ®å(8}ï¿ã ׿Gý*w¾ÿŒ7_™ô«¹J{ïøÃuù‘ÿJï¿ã ׿Gý*îR‚1oã7.ã é.Id†Ðã!d›_= ÕŸk³¯ØÞÍß<µlÍ(9±5fŸ°Ýoî·®úå¥Ä§‚âò’ÃC9JHí·=QôgÃ?u{òUAÒ—üópÿF¿úÓ[7mÔ]Ž·1>œÉƒÁãpšqÍÍøgz¹czN uáðøç N)Ýˋ͎1La–·ª>Œøgî¯~Jz£èφ~ê÷䪂ӥzí¥»‡âîöо (acs£˜ÞžCÛÿ¬ó<ù¶¸ÌÚ¤ËjL¾û«ß’ž¨ú3៺½ù+ÏT­e0w,æ±õBú£èφ~ê÷䧪>Œøgî¯~J¢¬v[•å×[·ÄyîjZÔ†Ô œ%J 8[HHöÎlB³3!‰-®SìÜ#4ë®ÇTRØl¥k$¨ãm#$ ƒYŸ[ÇÊDZäžoª>Œøgî¯~Jz£èφ~ê÷äªnã§€’©– K&)ÂBÿáóþ ÜÒÓŸ˜þœëb>–‚è UáhK­4ìvÔËM¼âV\Ðãɸc±JÈZO·Sô<]ÏÏé_ÉÔ-ÏT}ðÏÝ^ü”õGÑŸ ýÕïÉ^|}§yl¼…6ãj)Z0RAÁZèǰ]äY¼5Bâ6  Ã+!IÂÉX8ÆÔì!G<‰¬·Ž9LÏ’x^^¨ú3៺½ù)ê£>û«ß’¨[D.èODn(i;V㎈BJÔqíá)<«²­2Ë{¤=:J!lJ’®¦KÁEN•7»ÁÛÁt“¸à&¤úÞ8ÞdcÉû«ß’ž¨ú3៺½ù*•¾Ø;™ÇD¥ºäwÄy S,ïõŠÉÞœ¶âsÍ=•ƒNÚ…ÚCŒL+H",BúÈÎ ˆÈ#–I>Øäi–ñÕÜ™%ÕBñõGÑŸ ýÕïÉOT}ðÏÝ^ü•HÏ´Æm—!©ê}è“SÔ¥¡ÂVî.Õ¡{‰PÃ^ÚGo·\è1_›-¨‘›.<ê‚P‘í“ÿëýjÇ­ãnIöqÆñ ÿÕF|3÷W¿%=QôgÃ?u{òU4öŸ†ÕÚe´ÝãCëQÜj8-¼rù•‚‘Ž@àç·£ô[Ç;L“ìù#x‡¡}QôgÃ?u{òSÕF|3÷W¿%yê•r˜;”Ícê…õGÑŸ ýÕïÉOT}ðÏÝ^ü•çªS)ƒ¹3Xú‡¡}QôgÃ?u{òSÕF|3÷W¿%yê”Ê`îLÖ>¡è ?r…w“w¸[ÞãFvjv/iNpÃ)<ˆ´T{¡ùVG–¯ÿ‚)\8ãéÅ0íÁ7†%éKþy¸£_ýi¬25\·dºûvø̇Ôü”¶!õ)+J·nYÀ)qc Çoù ¹ì–{EÂ}åéö¸2ÝLÔ¤-øèZ‚z»'#³™ùkz“HOƒtEŠTI-%æf3KmÔ(e+J€Â’Aȃ]8}Œ1†"aÏÁŠqLļýq½¿2P£GŠ e¶Ú ÃaR*Q<ËË'$žÊüwC6Gm}Ê‚â]PZÞRâ¤,%\–”…«þ ×¢;ØÓ~/Z~†ß¢ìi¿­?CoÑZÌá霶.Þd¥zo½7âõ§èmú)ÞÆ›ñzÓô6ýsxzg+=¼ÓKÑ]S±×±jmm“€|¤¡CŸõJˆÿÞº,ÞËVZ;™ M«%OeÔ¸¥áJÚ°•möéÛŸB÷±¦ü^´ý ¿Eq¸Ý÷ÏÞ·G÷à½Ñºß¬âÂõþ³Âìõ¼û*Oµ†xXõ±G*hêi }·¶Û<`ûé[j)’èIH[ƒwhÜ£„àdœƒX¤_‘=Ù²,–çp ñ 3ásw$œƒ‘àŒÏ7dcÑ´•\“é'«=Ñ õuu¤´QáÜL'”KøVùj·²ÐèžÓv·E¾Î»Ã‘ Ûµ×®7JÙSèH‹‚§xÂ-l­Ò;rçúŠ“õÿŠû_µ:ÿÅ}¯Ú‘§Ï½“«v ×|›ÒͧW1¬.q­ÐàÉapÜ] ¸äEp“º9Qiή²á+ÞÎ’ …K:ÿÅ}¯Úâ¾×íAÄéNÑ:ù¢¤B·Fn\„J‰,EZÂS%,Iiå²Iä8‰mHçËÂçË5ZGÒzÂ%äêÅé™óúÌ©ev¥H€% :Ž®+¹=[.Og!2Õ³ŸeÍ×þ+í~Ôëÿö¿j•ºÄÓŸÑå¢^ŸÐvÃ=ä?.Ûj ÷IJÜm¤¡Jó ”“TÄ>޵’ìÖØOXŠW§mLÃX~LnáMÌ€ú’ÑG„q0žQ/á[å¨zÞË߯üWÚý©×þ+í~Õ©™œ_RF‘HÇDö›µº-öuÞˆNÝ®½q¸òVÊŸBDXì;ÀþqkenÙÛ—?ÔT_Ri-I'_Îêö§…q¿Û.ɹ£†c7ªomiWñøŸá]K^îÎV_ø¯µûS¯üWÚý©zÇÚ¿jáý%©,×Ë7uíNBfÃ`zÒ¹ z:Ó=Å®)4ðøyŒã¤½…ï’°9vwzO´ÞžÔv+õ®Èýñ¨QfDzÇC™yQÔþ „°ãKÁÞúŠyÔ˯üWÚý©×þ+í~Õ™‹Š[ÖÐ];¤ol·Ñý†ì”;mÒÖ†\“ 8™WÙK €„R€^p’„Z#šN%![¢Ý4œ˜“,—;ÛaÖL;l±Jœmä8…6éu ‚…¥+Ï>·–O#Òëÿö¿juÿŠû_µjfÙ¥Fô~‘­šuQíú>ípvdé Â~lØs§Ù-êi¤-OÈHyŸ—a#nò­¡&ÒÑVÖ,ú6Éh‹\6 ÛØŒÔykBÞe(m)qH*IX¤H8$s­®¿ñ_kö§_ø¯µûTVí+K¯üWÚý©×þ+í~Ô´­.¿ñ_kö§_ø¯µûPnÒ´ºÿÅ}¯Úâ¾×íAÆìÝóËQæÌÒ¾-îqn·§1ŒÍO,ÿÛ³J vd/>ZŸ7f©¸ºëU³L\]Ô‚HÔQ Ü%2¨Ì%6À«œ]a$…¹O — ” D….k+kTûÉJ¡×SØ3ÿNÍcgHéö;£ÁÓ¶û¨I¸l€ØëyÎx¸Oñ;O®Ïi§6p®umÛSI^¡vÛ«®6¤[u}¶ÐÂbGˆ´©‰I¶!À¢ë+%IT‡Ô’•…n$~9zÔÖ½Esyz¶\æ-úžÙbnÝ*4P™-? uܶÒÅK®œ+f@@–d3fjjÓOÀ‹neÔ<ÔFa¡ ¡Ä,8•„´(-)P dh¯„iK5 õ4ݵ7§ ¸ˆ(TB@.íÜ|o`Å^`SÚ.ýÒ®‹{ë‘'X½4éÖ®­ª{6~¥%À–žRLqÇD…¥<@0•œáa8²º2½ÉÔ¶9zrƒðfÜd`&+ká ‚TÃS œœ;ŽÀÞÓúIéénL°hÛ%¦KVôcL-M’ AR I)œ‡ô®½¾Ú; `@n$Hí†Ùa†Bm`%)í ‘¼üùÿIãçÏø‰ô§ª®ÚNÕU«NL¼*EÆWÒ˜i.Êe’’y³½aÕ”…à¯jrk y·¤t§ieëÉ»}ÞÃ2c–yMÆ"̹ [I*'øîîËŽ$“àœSž Þô¿šk…3CiI—ôêz:Ë"ò—ênÛ\´`!\BÙNÔàç#”×CZ³SÞõïW)’"ܬ®Üë FK/©.²ä>â%€9Lœ9á·Éx·ëgÒÖ;<ÙS­rÝn•,æKña!§9ÎV¤€UÏŸ:êp^÷¥üÓN" Þ_ »ë Ô>”ízQ%r‘o— C뜅ÆÁ(r*x©ÜøPmu…‚äìØNx/{Òþi§ïz_Í4~“nÓlº9ù¶ù Ź1"‰+@Rc%ù-2§ˆ<ŽÄ¸¥óåàóåUÄ}S«eÝΕ^£›«J–tTxFRƒL@s†îGWËfcÅÂØÉLUlçÛuL€‰‘]‰.dGy·Zu­ÈZHÁJ h×%ݦ²1cwIY×j޾#Unl°ÒòNä··jO3ÌlÔíb_í*ý¡týòs)fUÆÙ[í¤·JÔ<Hª~H½6‹t×o{•¨-KQz4~¡NL‚”ØG2†ÄÇAå[â¨úÞÛù,8”„¥•€ ì®T})bޫУé«k&éžèABzÞsž.üLäúìöšÔÍÍÿ)CÑmÖëp{…v–üÇmW>¨‰Ê_ZLf)wƒü"´)å¶J<·ÿ½FµªÔQõÔî¯sq¨Vëí¶Ô-Á– R“Õw¸µ+øÛÿĺQ°„{»yÙÖ{,+5½«u¢ÓÝ ¬ðãÅŽm98J@™&±HÓ¶©¶/Ø¡;uŽ‚Û—*}¤œå)pÀs<öÍ9ëçÏÉÚ¶è›Uj+½êÏÝ[›“¾Xº®:Ùa)‚âÚ-ø{?Ä8Ùãe{㨎GŸo¤«­á­Ad±[/YZ™\§¦0Ôu¹–TÂB?Ž 6¼·W¸¡•ó©u¯NÚ­s&M¶X¡A“9|IoGˆ–×!\ü' 3Ìç¶¿oºz×~ˆˆ—Ë;¤t8CS"%ä%c±@(ÉçYŸÛKzÚš±t«.Ý;½4ÃA“eŠí© 3ÁtMjœZŠ¿Ž™n”l;@нÙ'Ëy‡"}µØ‘n³-O9²â%¥:Þ ÚBÑÌ ¤ò'8#åí7izóôõ† —HÍðØš¸i/´Ž~ \#rG3ÈlÖkÍ’ êÚí²óhr‚ö8±¥ÆK­9… ÈP à€FGhµ2Šzn¯Õ²´?GOĸÜܸ^t÷tg S0Ä·ÜKÖ\dÐSªÞ•£`ÀV,ý q~ï¡ì7iR#É‘6ÛC¯GB’ÓŠ[IQR€!$œ€@8í¬ èïE&Ô-)кx[ƒæHˆ-,ðC¤—6mÆì7c8úT‰¨ªi¤4ÔrÛhHJR”`$À´*G$ðü¥}ð^÷¥üÓN Þô¿šh>)_|½é4Ó‚÷½/暊Wßïz_Í4à½ïKù¦ƒ•höBóå©óvi_¶Sq¼…]O#äìÒƒ¡¥™½yz|Ýš…Åé¢Ôõ¢ ÷4–§Ž»¤8³mQœ˳ّ"ÑÄÓJÿ3zòôù»5 ·t/¤àôgoѬ[,©±k9ˆ´4“teÕ‡=w‚ w)XÞIÝØCnwJlƵ®jtV¨¶.­Ú&ÆlÂÔê˜K-¬ªHB·™-aM©i;ŠqXetÏ¥¡j4íÆÞá«­²Ôä7iJÏm.7á!Å$¥XYà¤ãvRUówèÆc.àhËͪÁi7¦né†ý¡R[޶^Žúd!öƒm—˜R”œ+X“!Q!ˆ±ÐRËL6ÛLîW i†’R» Ï<-磃pÖnÞSva«|«„[”¸ª€!OÇêå!¹Ç µqJѱ[‹#S˜þ¿÷çù8—OGkë^§¹7-¾é2¢*u¶D¶–®1’´¡O3µj;Aq¾KVI5·¬5cuøPÑhºÞgÌC®µÜÛjw„ÐOÃÄZµ;Ð;rJÒ$×£¾Ž“»Æ–åÙ‰‘í¶õÛm50´0¢ÀËë WÀˆ±› Â<ÀÁí®–¾Ò2õÂÙvµ]"[®Vô:Ê.Þ&2¦Ü[.áïF—#°â»ÁR#YŸÛ¦ëmHý(iésᢠ[œ»l•ÃiWf™OTeÙhBã¶¼¨9¹aÖ½jTn#5&Õ7ÈzrÅ"ï9/¸ÓEKL#{ޏâÒÛm rÊ”µ%#$ ¨dŽÚ€[úl™oo¼!HË·¼äg ¥ÉKr#%½’7 ˆWRˆV‡qh`§58ÖÖ©4ãÖ¡1Pžã1&<„ /‚û!æ–Rq¸A)ÈÈdg5©­i#„}}%EDhï¹¥õ cºìÙî PŠl’óŒ6Ðxqü$¯¬´ ¦x£iÉÅNª­“Ñ–¡Nîe³TX¡="ñï9}אּ\Ѝ¦3L4‰)à´”Ãi%K*ÁI«2e" tNy—奤‡Ýe¢Ók^<%%J)I9!%J rÉí¤ŒÔ¥*)J)JÌofïžZ6f”ìÝóËQæÌÒƒâÆû­N¼¥ Àë©=ƒûvk«Öä{çÔ+höBóå©óvj¥èËJZÕ~™b›¥;§h~Þ¾½*ó§W÷KÍ) É[„µ9g _)!%¾Gç"óër=óêër=óêçYú.ÿê¡´ŽŽÓlÚî²!G¹Ü÷4¨ID¦" …<¤¶O¬pµCrøJ€ li[Õó]M×(Óñ¢!íIj’CÖ•3wCNí’T¡†R½Éq­œÂ‚Ž'¿Ÿ5&î—ÿ[‘ïŸP§[‘ïŸPªß¢ýbÓš·ZM·i;m¡Kº¡¨OÇ·!‚¨¦ "¤¶¤¤e¾2\$xW¶ X4úÜ|ú…:Ü|ú…B:S­gÚ ·£.á<‹Œ5ÉÆZÖ¶“)•,…%ö€BP— Ðw”’raÚÑ1þ‘ì/·j2®­N·ªlØú~BàJ]q™Åŵ8Hð£«ÂPKƒq+ «Í²îër=óêër=óêæ{^œ¾¦Ô[cO][’ݱ¶õfȰ»›Â\%>Ôq1jm» o–ÇŽÞݤXT–Øvç¥gJÑvR¢[°H(mjf&æÚÖ˜n„ÈŽ¸.(‚\ŠBD”…¸ ‡Š á±¼¯x5©Ššf5„÷­È÷ϨS­È÷ϨT;¥˜“&èI‘áÆ“(ã*Txù.?2T–Ò52NÑÌ綪$XT–Øvç¥gJÑvR¢[°H(mjf&¡N·#ß>¡UçBÐ^ƒe»¥·Û¹ñ-‘•p’†z» p¢3žSé}iB¹€¯óÍEuMžä÷J¯Jy¯]y·=k¸¦ ‹Kôun°(Œ§œÒ¹¸^lŽÎjÖ#º;]½nG¾}BnG¾}B©.„¬÷(šYæÀ’Õ™Öu‡`¹L¸ÇÚ²âÎÙJÜ™‹£C¨OµÏ§ÿ‰›¯Ô=O¶i¨ñäÃ0¥9pŽ$ºÔ©,’Ël„4¾!âaENý‰Fp¥Tâ%y[]nG¾}BnG¾}B¨›¥ºüz\EÖõ¥m÷iNÏ·u&ݵ?9¸QÃl‡œ4„µ´ïXsÂ@[˜Nrš±ºW´Yïºu¶ýÝç­Øî»Ô ¯Ûí¸€á;ÄNä'rKjwdc$#kIÝ0ër=óêër=óêæÙÖK¬–˜k²qtº\äÁ/I:âdnLu2ä‹lPÙz¦¤„$x+RrFo]ÆBÊ$Z³=Üö8–æ@ ÃW 9e r AðF9`PwzÜ|ú…:Ü|ú…`¥~·#ß>¡N·#ß>¡X)AŸ­È÷ϨS­È÷ϨV PsíkS—;ÊÖrLÔäÿøìÒ¾mÈ^|µ>nÍ(3Øc-é·•$¤9#™ÿ·fº½Eït”ú+SJÿ3zòôù»5Ò³ºIºÜueºF¢ÒIvÍ9»|w[Ó²TµG‹$¸´™§)ØúÛØ9 Vìe&½Eït”ú)Ô^÷HùO¢«uWI/ôG¥uš/IïnÚˬ› ‚ÛhžìV‘þ0¦‹ëQQ8XÚF 3yºÜ§ê[uÝPzËrfz+ i/fGÖ½ŠZÊrãî`n8HH$TC«Ô^÷HùO¢Eït”ú*½è3[ê=gßp½LeI›hjiŒÎ¸ÛÛik œ&cî)—Ò76 ¬x@í­:wQ{Ý#å>Šu½Ò>Sè®'I𿆷B—.Ýsœ©“£EJb@úRÓ*R”Ók PîJ‚áNÄeG–š‚ö¾’í–Å= ËæÉ*å¥Û62™\4ít¸ç=Ýegiiµ'h$ Q{Ý#å>Šu½Ò>S誊IúûÁ‘§«Ó¶åÎD!d–ÉÓ§w,õ툒VÆÐ¾Jy¨céÿ¤û£ ïvÌÄÖí“$DºÌM…ip¨3æ aȚ킉… Î+-nÀF±d­¾¢÷ºGÊ}ê/{¤|§ÑYlWHW»$ Õ±î<„fåFsiÛq!IV1AçQ‹¯HVëIvíå²ôãÓ#<é”ݪZÚBÒ¸ÉBBÒÉBD‚Tè^ÆŠYC ÐHº‹Þé)ôS¨½î‘òŸEht‡|—§´³· {,=5ÉQaF“ÂK²d7 ^9íJ `1ÛUü^µŒëŠtÄ4ÙÛ½5!ðìç­Rø4† ¸ð»Ã¬©]Ñe*Þ² ¸¥r¥ŸÔ^÷HùO¢Eït”ú+ˆ½M¢ìz‘1Ìau·Gœ*Ü[â¶•íÏ·ØÍUpºXÕ ¶À˜ôJ΢€Ì»2gÚô˜,¶‡Ö¥øâ”¶ö ¶ê;FE˜©¤bÖßQ{Ý#å>Šu½Ò>Sè®'Fš†å}‰vbð˜ê›jž˜Ž<ÄWc!ô®3P¾ ¥Kh씩 $…%_è#÷Ý{}…­eDzۯ0lòZ\g”ûÎIꃊ—‚¸m„Ìáµ$©aFÓ‰Ðõ½Ò>Sè§Q{Ý#å>Š‚ta¯oºŽïknía߬Î^ &Šu½Ò>Sè¨~’ÕZšã«4Û7Y…¯Pi—níÇŠÊ”ìGšê!HëÕ6ú ”² PžIO3Úf—¶î¯ZÞnÉ6)ço ù‘%¤xC;›K•e9 $xÁ³4‘7«Q{Ý#å>Šu½Ò>Sè¨'~:ªGFZÆvÊÏuûÝhŽAu|N¼üV•ÀXy<-œu‘¸9œ$rÁ&̨®wQ{Ý#å>Šu½Ò>Sè®(9ÝEït”ú)Ô^÷HùO¢º4 çu½Ò>Sè§Q{Ý#å>ŠèÒ‚+mlµt½!D&§³ÉÙ¥dìÝóËQæÌÒƒkJÿ3zòôù»5÷/LZ$G»²67vd¢TçaÏ~3®:†Úm*K-+G€ÃI! „œçr³ñ¥™½yz|ÝšîPFlÚLÚ4Ä}3,ÕZcI&¦Ý £ÍÒ³ÛýMK©VÆ"Àƒ (íF‹¤´Ë-$% ¡# J@ä(¸‘W9©ËŒÊ¥²ÒÙiòØ.! )+@WhJ‹h$D¡9ìš•'Q¥}µ[ï–‰6›¬dÉ…%mDŒŒäF €A@ ‚*:÷Fš5ëSVÕÛ¥pÚ}ÇÃé¹IL¥­Äíp®@sнÉ* Y H9b_JPÅ 4xP؇ †ãÆa´´ËM¤%-¡# H°ÅE£ôk¢XjàÊ,»šžÑeÖÜ”òÒÛe|B†B–C ß…a­€($ö€Dº”fÈÓG/LØ-ZrÞ¨6–m§Sέé>ëÎ+[ޏ¥-jÀ*$àØiNÑZjv§oRI·)wÖÛ›„—RÒÖÞCn-®ÖŒø+RJ“Ë`T†”ûˆöšÑZkN\d\,öåGò yT—]KH*Þ[i+QK(*æPØJI—!YõF—³êT°.ˆ›¹€ Û‘'¿À•crJÙZRv§)$ƒ‘Ê»T§}Ñú7Ò_mרì]£J¶²ˆð‘÷5¨ì2€Ø %„: ž [‘·jö ªÞ푯·­ÒÜšÓ/mܨs^Šè‚†×YRVž`g  ‘[´ ƒ‰ôg{°tðF M®Þê‰:–â”´QÃ-€CùÚÙe²„ç#) $“3¸PcÃeO)¦KHSÏ-çHÀ*ZÉRÕËš”I'™$ÖjP)JP)JP)JPFc{7|òÔy³4¤ofïžZ6f”ZWù›×—§ÍÙ®åpô¯ó7¯/O›³]Ê)J)J)J)J)J)J)J)J)J)J)J)J)J)JÌofïžZ6f”ìÝóËQæÌÒƒkJÿ3zòôù»5Ü®•þfõåéóvk¹@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)AìÝóËQæÌÒ‘½›¾yj<ÙšPmi_æo^^Ÿ7f»•ÃÒ¿ÌÞ¼½>nÍw(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(#1½›¾yj<ÙšR7³wÏ-G›3J ­+üÍëËÓæì×r¸zWù›×—§Íٮ唥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥”¥f7³wÏ-G›3JFönùå¨ófiAµ¥™½yz|ÝšîT(\o¶›Á04ḱ%ô¼3[k„„ƒ“ÿ“·—og¶rwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÆ•ïŸTø“ø«^ŠwϪ|IüU¯EÜofïžZ6f•‚ƩϮtÛ„éRCœê\ÚM xIíÎÌöÿ¥AÒ¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@¥)@­¤Ü¥— e°‡TÐ[ò‹eJI)Q!\·9yvcïÖ /ìZü²Wœ9A‹ïƒí¿N_èÓïƒí¿N_è×f”l_¾¶ý9£L_¾¶ý9£\…t—£˜‡ª%\®¨¶#J¿Â»¦XÚ¶22ÚÂFJ’à#‡Œ•“´ ÙMtz>Õ–s£­úªÄ§•nž•©ž*BV6­HP ‚’;h3býð}·éËýbýð}·éËýìÖòâÈzK1ä²ó‘\ HB¦VP•„¬Z­‹B°yáI=„Ps1~ø>Ûôåþ1~ø>ÛôåþviAÆÅûàûoÓ—ú5ò%Nb[ \"0Т†ÖÄ‚àÜU…”‘•F{9ã–{G²¸·ŽsíYþôù»ÔÔ¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(ƒKû¿,•çVzÖÓkJ-KÉÿ¬•çPu«§Ø‹ÙRžm†Aq×\PJ2TIäÉ5óÆã tíeÔ½0j AÒFÒÉ{Miö)jy·/éeà·G ©M …vmW‚0J†Ôz[ÿºÖË®ú+·]¬6Ø!Ç&Páíi¥6CDŽ|”çyƒSþ0§PUššÙe:òù#[i ® /­“`‘ØìÄ0ÈeM¶¤#;ƨ­E G‡àø:çµ]§XêeÅ:ŠÕg{[ëj³uçÜZm–Ô0”¶¦ÜËJRd,'MîFI©¼îŽú7Ÿ5ùÓ´”•.CŠu÷Þ³Ç[Ž­G*R”Q’¢I$ždš’An$LAƒ˜±#¶–˜a”6Ò0”¥#H JÑoU:AÒÇ|M ǸȜ«tÛ·–`GÜò½Ž¾äb—Rdx µ)%%IIA Y©Awmtîº5{’TÌq&캕«‰Å× *ÏrÎSV?SŒ+S:ÚpÊ®ÊâÞ?žµyiów«¨^Ê»œÍµûÓæïTô¥(¥(¥(¥(¥(¥(¥(¥(¥(¥(¤í®"ÞqÐd²§¹| N´¬c$!@€9öò­ÚPhw&7÷/÷)žÉýÅËýÊGç­úPhw&7÷/÷)žÉýÅËýÊGç­úPhw&7÷/÷)žÉýÅËýÊGç­úPhw&7÷/÷)žÉýÅËýÊGç­úPhw&7÷/÷)ž¾ã[b± >ž;Ž¥%)Sòt¤Ý»Ôqœ ã·¹J)JÿÙmdk-1.2.9/doc/COPYING.MIX.DOC0000644000175000017500000000136312112755472012070 00000000000000The file MIX.DOC, as well as the samples in elevator.mixal and mistery.mixal are a contribution from Eric S. Raymond's MIXAL. They contain the actual text of TAOCP vol 1 describing MIXAL and two verbatim programs from the book. Donald Knuth and Addison Wesley granted Eric permission for distributing the under the following terms, which we inherit: The source code in prime.mix, mystery.mix, and elevator.mix and the text in MIX.DOC are excerpted from "The Art Of Computer Programming". Addison-Wesley and Donald Knuth have specifically granted permission for this material and all other MIX code examples from that book to be distributed in conjunction with any open-source implementation of MIX under the license(s) applying to that implementation. mdk-1.2.9/doc/texinfo.tex0000644000175000017500000116703612563613157012211 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2013-02-01.11} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\normaldash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % ctrl is no longer a Texinfo command, but leave this definition for fun. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = ectt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. Because % it is always used for titles, nothing else, we call \rmisbold. \par % should be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rmisbold \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\lbracechar{|a}% % \def\}{|b}% \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% \nobreak\bigskip \nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. Also revert - to its normal character, in % case the active - from code has slipped in. % {@catcode`- = @active @gdef@normalturnoffactive{% @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore mdk-1.2.9/doc/mdk_install.texi0000644000175000017500000002212012622455635013167 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2010, 2013 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Installing MDK, MIX and MIXAL tutorial, Acknowledgments, Top @comment node-name, next, previous, up @chapter Installing @sc{mdk} @menu * Download:: * Requirements:: * Basic installation:: * Emacs support:: * Special configure flags:: * Supported platforms:: @end menu @node Download, Requirements, Installing MDK, Installing MDK @comment node-name, next, previous, up @section Download the source tarball GNU @sc{mdk} is distributed as a source tarball available for download in the following @acronym{URL}s: @itemize @bullet @item @url{ftp://ftp.gnu.org/pub/gnu/mdk} @item @uref{http://www.gnu.org/prep/ftp.html, GNU mirrors} @end itemize The above sites contain the latest stable releases of @sc{mdk}. The development branch is available as a @uref{http://git-scm.com/,Git} repository located at@footnote{See @uref{https://savannah.gnu.org/git/?group=mdk, @sc{mdk}'s Git page} for more information on using the unstable source tree. Note, however, that the rest of this manual is about the @emph{stable} release.} @itemize @bullet @item @uref{git://git.savannah.gnu.org/mdk.git} @end itemize After you have downloaded the source tarball, unpack it in a directory of your choice using the command: @example tar xfvz mdk-X.Y.tar.gz @end example @noindent where @var{X.Y} stands for the downloaded version (the current stable release being version @value{VERSION}). @node Requirements, Basic installation, Download, Installing MDK @comment node-name, next, previous, up @section Requirements In order to build and install @sc{mdk}, you will need the following libraries installed in your system: @itemize @minus @item @uref{http://www.gtk.org, GLIB 2.16.0} (required) @item @uref{http://www.gnu.org/software/flex/flex.html, GNU Flex 2.5} (required) @item @uref{http://www.gtk.org, GTK 2.16.0} (optional) @item @uref{http://ftp.gnome.org/pub/GNOME/sources/libglade/2.6/, Libglade 2.6.0} (optional) @item @uref{http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html, GNU Readline} (optional) @item @uref{http://www.gnu.org/software/guile, GNU Libguile 2.0} (optional) @end itemize If present, readline and history are used to provide command completion and history management to the command line MIX virtual machine, @code{mixvm}. GTK+ and libglade are needed if you want to build the graphical interface to the MIX virtual machine, @code{gmixvm}. Finally, if libguile is found, the @sc{mdk} utilities will be compiled with Guile support and will be extensible using Scheme. @strong{Please note}: you need both the libraries @emph{and} the headers; this means both the library package and the @file{-dev} package if you do not compile your libraries yourself (ex: installing @file{libgtk2.0-0} and @file{libgtk2.0-0-dev} on Debian). @node Basic installation, Emacs support, Requirements, Installing MDK @comment node-name, next, previous, up @section Basic installation @sc{mdk} uses GNU Autoconf and Automake tools, and, therefore, should be built and installed without hassle using the following commands inside the source directory: @example ./configure make make install @end example @noindent where the last one must be run as root. The first command, @code{configure}, will setup the makefiles for your system. In particular, @code{configure} will look for GTK+ and libglade, and, if they are present, will generate the appropriate makefiles for building the @code{gmixvm} graphical user interface. Upon completion, you should see a message with the configuration results like the following: @example *** GNU MDK @value{VERSION} has been successfully configured. *** Type 'make' to build the following utilities: - mixasm (MIX assembler) - mixvm (MIX virtual machine, with readline support, with guile support) - gmixvm (mixvm GTK+ GUI, with guile support) - mixguile (the mixvm guile shell) @end example @noindent where the last lines may be missing if you lack the above mentioned libraries. The next command, @code{make}, will actually build the @sc{mdk} programs in the following locations: @itemize @minus @item @file{mixutils/mixasm} @item @file{mixutils/mixvm} @item @file{mixgtk/gmixvm} @item @file{mixguile/mixguile} @end itemize You can run these programs from within their directories, but I recommend you to install them in proper locations using @code{make install} from a root shell. @node Emacs support, Special configure flags, Basic installation, Installing MDK @comment node-name, next, previous, up @section Emacs support @sc{mdk} includes extensive support for Emacs. Upon installation, all the elisp code is installed in @file{PREFIX/share/mdk}, where @file{PREFIX} stands for your installation root directory (e.g. @file{/usr/local}). You can copy the elisp files to a directory that is in your load-path, or you can add the above directory to it. Assuming that the installing prefix is @file{/usr/local}, you can do it by adding to your @file{.emacs} file the following line: @lisp (setq load-path (cons "/usr/local/share/mdk" load-path)) @end lisp @code{MIXAL} programs can be written using Emacs and the elisp program @file{share/mdk/mixal-mode.el}, contributed by @value{PIETER}. It provides font locking, interactive help, compiling assistance and invocation of the @code{MIX} virtual machine via a new major mode called @code{mixal-mode}. To start @code{mixal-mode} automatically whenever you edit a @code{MIXAL} source file, add the following lines to your @file{.emacs} file: @lisp (autoload 'mixal-mode "mixal-mode" t) (add-to-list 'auto-mode-alist '("\\.mixal\\'" . mixal-mode)) @end lisp In addition, @code{mixvm} can be run within an Emacs @acronym{GUD} buffer using the elisp program @file{share/mdk/mixvm.el}, contributed by @value{PHILIP}. @file{mixvm.el} provides an interface between @sc{mdk}'s @code{mixvm} and Emacs, via @acronym{GUD}. Place this file in your load-path, optionally adding the following line to your @file{.emacs} file: @lisp (autoload 'mixvm "mixvm" "mixvm/gud interaction" t) @end lisp @node Special configure flags, Supported platforms, Emacs support, Installing MDK @comment node-name, next, previous, up @section Special configure flags You can fine-tune the configuration process using the following switches with configure: @defopt @w{--enable-gui[=yes|no]} @defoptx --disable-gui Enables/disables the build of the MIX virtual machine GUI (@code{gmixvm}). If the required libraries are missing (@pxref{Requirements}) the configure script with automatically disable this feature. @end defopt @defopt @w{--with-guile[=yes|no]} @defoptx --without-guile Enables/disables the Guile support for @code{mixvm} and @code{gmixvm}, and the build of @code{mixguile}. If the required libraries are missing (@pxref{Requirements}) the configure script with automatically disable this feature. @end defopt @defopt @w{--with-readline[=yes|no]} @defoptx --without-readline Enables/disables the GNU Readline support for @code{mixvm}. If the required libraries are missing (@pxref{Requirements}) the configure script with automatically disable this feature. @end defopt For additional, boilerplate configure options, see the @file{INSTALL} file, or run @example configure --help @end example @node Supported platforms, , Special configure flags, Installing MDK @comment node-name, next, previous, up @section Supported platforms GNU MDK has been tested in the following platforms: @itemize @item Debian GNU/Linux 2.2, 2.3, 3.0, 3.1, 3.2, 4.0, 5.0, 6.0, sid @item Redhat GNU/Linux 8.0 (Ronald Cole), 7.0 (Agustin Navarro), 6.2 (Roberto Ferrero) @item Mandrake 8.0 (Agustin Navarro) @item FreeBSD 4.2, 4.3, 4.4, 4.5 (Ying-Chieh Liao), 5.2 @item Solaris 2.8/gcc 2.95.3 (Stephen Ramsay) @item MS Windows 98 SE/Cygwin 1.1.8-2 (Christoph von Nathusius)@footnote{Caveats: Christoph has only tested @code{mixvm} and @code{mixasm} on this platform, using @code{gcc} 2.95.3-2, @code{GLIB} 1.2.10 and @code{GNU readline} 4.1-2. He has reported missing history functionalities on a first try. If you find problems with history/readline functionality, please try a newer/manually installed readline version.} @item Mac OS X 10.1.2 (Johan Swanljung), Mac OS X 10.4.x, 10.5 (Darwin Port by Aleix Conchillo). @item AMD Athlon, GNU/Linux version 2.4.2-2smp (Red Hat 7.1 (Seawolf)) (N. H. F. Beebe) @item Apple PowerPC G3, GNU/Linux 2.2.18-4hpmac (Red Hat Linux/PPC 2000 Q4) (N. H. F. Beebe) @item DEC Alpha, GNU/Linux 2.2.19-6.2.1 (Red Hat 6.2) (N. H. F. Beebe) @item Compaq/DEC Alpha OSF/1 4.0F [ONLY after adding rsync's snprintf() implementation] (N. H. F. Beebe) @item IBM PowerPC AIX 4.2 (N. H. F. Beebe) @item Intel Pentium III, GNU/Linux 2.4.9-31smp (Red Hat 7.2 (Enigma)) (N. H. F. Beebe) @item SGI Origin 200, IRIX 6.5 (N. H. F. Beebe) @item Sun SPARC, GNU/Linux 2.2.19-6.2.1 (Red Hat 6.2) (N. H. F. Beebe) @item Sun SPARC, Solaris 2.8 (N. H. F. Beebe) @end itemize @sc{mdk} will probably work on any GNU/Linux or BSD platform. If you try it in a platform not listed above, please send a mail to @email{jao@@gnu.org, the author}. mdk-1.2.9/doc/mdk_ack.texi0000644000175000017500000000536712636571173012276 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2013, 2014, 2015 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Acknowledgments, Installing MDK, Introduction, Top @comment node-name, next, previous, up @unnumbered Acknowledgements Many people have further contributed to @sc{mdk} by reporting problems, suggesting various improvements, or submitting actual code. Here is a list of these people. Please, help me keep it complete and exempt of errors. @itemize @bullet @item Philip Ellis King provided MIXAL test programs pinpointing bugs in the first @sc{mdk} release, and useful discussions as well. Philip has also contributed with the Emacs port of @code{mixvm} and influenced the @code{gmixvm} GUI design with insightful comments and prototypes. @item Aleix Conchillo has been following @sc{mdk}'s development for many years, indefatigably chasing and fixing bugs, and suggesting many improvements. He's also the original author of the Fink and Macports ports. @item Pieter E J Pareit is the author of the Emacs MIXAL mode, and has also contributed many bug fixes. @item Michael Scholz is the author of the German translation of @sc{mdk}'s user interface. @item Sergey Poznyakoff provided patches to mixlib/mix_scanner.l improving MIXAL compliance. @item Sergey Litvin implemented the instructions @code{SLB}, @code{SRB}, @code{JAE}, @code{JAO}, @code{JXE}, and @code{JXO} from volume 2 of TAOCP. @item Francesc Xavier Noria kindly and thoroughly reviewed the @sc{mdk} documentation, providing insightful advice. @item Eric S. Raymond contributed the documentation file @file{MIX.DOC} and the samples @file{elevator.mixal} and @file{mistery.mixal} from his MIXAL package. @item Nelson H. F. Beebe has tested @sc{mdk} in a lot of Unix platforms, suggesting portability enhancements to the source code. @item Ryan Schmidt, Agustin Navarro, Ying-Chieh Liao, Adrian Bunk, Baruch Even, and Ronald Cole ported @sc{mdk} to different platforms, and created and/or maintain packages for it. @item Jason Uhlenkott, Andrew Hood, Radu Butnaru, Ruslan Batdalov, WeiZheng, Sascha Wilde, Michael Vernov and Xiaofeng Zhao reported bugs and suggested fixes to them. @item Joshua Davies, Eli Bendersky, Milan Bella and Jens Seidel reported bugs on the documentation. @item Christoph von Nathusius, Stephen Ramsay and Johan Swanljung tested @sc{mdk} on different platforms, and helped fixing the configuration process in them. @item Richard Stallman suggested various improvements to the documentation and has always kept an eye on each @sc{mdk} release. @item @sc{mdk} was inspired by Darius Bacon's @uref{http://www.accesscom.com/@/~darius/, MIXAL program}. @end itemize mdk-1.2.9/doc/Makefile.am0000644000175000017500000000207412636564773012046 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2003, 2004, 2006, 2008, 2013 Free Software # Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. SUBDIRS = img SUFFIXES = .html info_TEXINFOS = mdk.texi mdk_TEXINFOS = mdk_intro.texi mdk_ack.texi mdk_tut.texi mdk_gstart.texi \ mdk_mixvm.texi mdk_emacs.texi mdk_mixasm.texi mdk_bugs.texi \ mdk_index.texi mdk_gmixvm.texi mdk_install.texi \ mdk_mixguile.texi mdk_copying.texi mdk_findex.texi EXTRA_DIST = MIX.DOC COPYING.MIX.DOC gendocs: $(mdk_TEXINFOS) (cd $(top_srcdir)/doc && \ ./gendocs.sh --email bug-mdk@gnu.org mdk 'GNU MDK Users Manual') mdk-1.2.9/doc/mdk_gmixvm.texi0000644000175000017500000003221212622455635013033 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node gmixvm, mixguile, mixvm, Top @comment node-name, next, previous, up @chapter @code{gmixvm}, the GTK virtual machine @cindex @code{gmixvm} @cindex GUI @cindex GTK+ This chapter describes the graphical MIX virtual machine emulator shipped with @sc{mdk}. In addition to having all the command-oriented functionalities of the other virtual machines (@code{mixvm} and @code{mixguile}), @code{gmixvm} offers you a graphical interface displaying the status of the virtual machine, the source code of the the downloaded programs and the contents of the MIX devices. @menu * Invoking gmixvm:: * MIXVM console:: Using @code{mixvm} commands. * MIX virtual machine:: The MIX virtual machine window. * MIXAL source view:: Viewing the MIXAL source code. * MIX devices view:: Device output. * Menu and status bars:: Available menu commands. @end menu @node Invoking gmixvm, MIXVM console, gmixvm, gmixvm @comment node-name, next, previous, up @section Invoking @code{gmixvm} If you have built @sc{mdk} with GTK+ support (@pxref{Installing MDK}), a graphical front-end for the MIX virtual machine will be available in your system. You can invoke it by typing @example gmixvm [-vhuq] [--version] [--help] [--usage] [--noinit] @end example @noindent at your command prompt, where the options have the following meanings: @defopt -v @defoptx --version Prints version and copyleft information and exits. @end defopt @defopt -h @defoptx --help @defoptx -u @defoptx --usage Prints a summary of available options and exits. @end defopt @defopt -q @defoptx --noinit Do not load the Guile initialisation file @code{~/.mdk/mixguile.scm} at startup. This file contains any local Scheme code to be executed by the embedded Guile interpreter at startup (@pxref{Using Scheme in mixvm and gmixvm}). @end defopt Typing @code{gmixvm} or @code{gmixvm -q} at your command prompt, the main window will appear, offering you a graphical interface to run and debug your MIX programs. @ifinfo @image{img/ss_mix, 400pt} @end ifinfo @ifhtml @image{../img/ss_mix, 400pt} @end ifhtml Apart from the menu and status bars, we can distinguish two zones (or halves) in this main window. In the upper half of @code{gmixvm}'s main window there is a notebook with three pages, namely, @itemize @item a MIX virtual machine view, which shows you the registers, flags, memory contents and time statistics of the virtual machine; @item a MIXAL source view, which shows the MIXAL file and lets you manage breakpoints; @item a Devices view, which shows you the output to character based MIX block devices. @end itemize @noindent These three windows can be detached from the notebook, using either the penultimate toolbar button (which detachs the currently visible notebook page) or the menu entries under @code{@w{View->Detached windows}}. @ifhtml Here is an screenshot showing how @code{gmixvm} looks like when running with a couple of detached windows: @image{../img/ss_split, 420pt} @end ifhtml On the other hand, the main window's lower half presents you a @code{mixvm} command prompt and a logging area where results of the issued commands are presented. These widgets implement a @code{mixvm} console which offers almost the same functionality as its @acronym{CLI} counterpart. When @code{gmixvm} is run, it creates a directory named @file{.mdk} in your home directory (if it does not already exist). The @file{.mdk} directory contains the program settings, the device files used by your MIX programs (@pxref{Devices}), and a command history file. The following sections describe the above mentioned components of @code{gmixvm}. @node MIXVM console, MIX virtual machine, Invoking gmixvm, gmixvm @comment node-name, next, previous, up @section MIXVM console In the lower half of the @code{gmixvm} main window, you will find a command text entry and, above it, an echo area. These widgets offer you the same functionality as its @acronym{CLI} counterpart, @code{mixvm} (@pxref{mixvm}). You can issue almost all @code{mixmv} commands at the @code{gmixvm}'s command prompt in order to manipulate the MIX virtual machine. Please refer to @xref{mixvm}, for a description of these commands, and to @xref{Getting started}, for a tutorial on using the MIX virtual machine. The command prompt offers command line completion for partially typed commands using the @key{TAB} key; e.g., if you type @example lo @key{TAB} @end example @noindent the command is automatically completed to @code{load}. If multiple completions are available, they will be shown in the echo area. Thus, typing @example p @key{TAB} @end example @noindent will produce the following output on the echo area: @example Completions: pc psym preg pflags pall pmem @end example @noindent which lists all the available commands starting with @code{p}. In addition, the command prompt maintains a history of typed commands, which can be recovered using the arrow up and down keys. As mentioned above, a file containing previous sessions' commands is stored in the configuration directory @file{~/.mdk}, and reloaded every time you start @code{gmixvm}. You can change the font used to display the issued commands and the messages in the echo area using the @code{@w{Settings->Change font->Command prompt}} and @code{@w{Settings->Change font->Command log}} menu commands. @node MIX virtual machine, MIXAL source view, MIXVM console, gmixvm @comment node-name, next, previous, up @section MIX virtual machine The first notebook's page displays the current status of the virtual machine. There you can find the registers' contents, the value of the comparison and overflow flags, the location pointer, a list with all MIX memory cells and their contents, and the time statistics (including total uptime, elapsed time since the last run command and total execution time for the currently loaded MIX program). If you click any register entry, you will be prompted for a new register's contents. @ifhtml The next figure shows the enter word dialog. @image{../img/ss_worddlg, 250pt} @end ifhtml In the same manner, click on any address of the memory cells list to be prompted for the new contents of the clicked cell. If you click the address column's title, a dialog asking you for a memory address will appear; if you introduce a valid address, this will be the first cell displayed in the scrollable list after you click the OK button. The register contents are shown as a list of MIX bytes plus sign. If you place the mouse pointer over any of them, the decimal value of this MIX word will appear inside a tooltip. You can change the font used to display the MIX virtual machine contents using the @code{@w{Settings->Change font->MIX}} menu command. @node MIXAL source view, MIX devices view, MIX virtual machine, gmixvm @comment node-name, next, previous, up @section MIXAL source view The second notebook's page, dubbed Source, shows you the MIXAL source of the currently loaded MIX file. @ifhtml @image{../img/ss_mixal, 400pt} @end ifhtml The information is presented in four columns. The first column displays little icons showing the current program pointer and any set breakpoints. The second and third columns show the address and memory contents of the compiled MIX instruction, while the last one displays its corresponding MIXAL representation, together with the source file line number. You can set/unset breakpoints by clicking on any line that has an associated memory address. You can change the font used to display the MIXAL source code using the @code{@w{Settings->Change font->MIXAL}} menu command. @node MIX devices view, Menu and status bars, MIXAL source view, gmixvm @comment node-name, next, previous, up @section MIX devices view The last notebook page, dubbed Devices, shows you the output/input to/from MIX block devices (the console, line printer, paper tape, disks, card and tapes @pxref{Devices}) produced by the running program. @ifhtml @image{../img/ss_devices, 400pt} @end ifhtml Input device contents is read from files located in the @file{~/.mdk} directory, and the output is also written to files at the same location. Note that device tabs will appear as they are used by the MIX program being run, and that loading a new MIX program will close all previously open devices. The input/output for binary block devices (tapes and disks) is a list of MIX words, which can be displayed either in decimal or word format (e.g. @w{- 67} or @w{- 00 00 00 01 03}). The format used by @code{gmixvm} can be configured using the @code{@w{Settings->Device output}} menu command for each binary device. You can change the font used to display the devices content using the @code{@w{Settings->Change font->Devices}} menu command. @node Menu and status bars, , MIX devices view, gmixvm @comment node-name, next, previous, up @section Menu and status bars The menu bar gives you access to the following commands: @deffn File Load... Opens a file dialog that lets you specify a binary MIX file to be loaded in the virtual machine's memory. It is equivalent to the @code{mixvm}'s @code{load} command (@pxref{File commands}). @end deffn @deffn File Edit... Opens a file dialog that lets your specify a MIXAL source file to be edited. It is equivalent to the @code{mixvm}'s @code{edit} command (@pxref{File commands}). The program used for editing can be specified using the menu entry @code{@w{Settings->External programs}}, or using the @code{mixvm} command @code{sedit}. @end deffn @deffn File Compile... Opens a file dialog that lets your specify a MIXAL source file to be compiled. It is equivalent to the @code{mixvm}'s @code{compile} command (@pxref{File commands}). The command used for compiling can be specified using the menu entry @code{@w{Settings->External programs}}, or using the @code{mixvm} command @code{sasm}. @end deffn @deffn File Exit Exits the application. @end deffn @deffn Debug Run Runs the currently loaded MIX program, up to the next breakpoint. It is equivalent to the @code{mixvm}'s @code{run} command (@pxref{Debug commands}). @end deffn @deffn Debug Next Executes the next MIX instruction. It is equivalent to the @code{mixvm}'s @code{next} command (@pxref{Debug commands}). @end deffn @deffn Debug @w{Clear breakpoints} Clears all currently set breakpoints. It is equivalent to the @code{mixvm}'s @code{cabp} command. @end deffn @deffn Debug Symbols... Opens a dialog showing the list of symbols defined in the currently loaded MIX program. The font used to display this list can be customised using the meny entry @code{@w{Settings->Change font->Symbol list}}. @ifhtml @image{../img/ss_symbols, 250pt} @end ifhtml @end deffn @deffn View @w{Toolbar(s)} Toggles the toolbar(s) in the @code{gmixvm} window(s) (when notebook pages are detached, each one has its own toolbar). @end deffn @deffn View @w{Detached windows} @w{Virtual machine} @deffnx View @w{Detached windows} Source @deffnx View @w{Detached windows} Devices These toggles let you detach (or re-attach) the corresponding notebook page. @end deffn @deffn Settings @w{Change font} Lets you change the font used in the various @code{gmixv} widgets (i.e. commad prompt, command log, Virtual machine, Source, Devices and Symbol list). There is also an entry (@code{All}) to change all fonts at once. @end deffn @deffn Settings @w{Device output...} Opens a dialog that lets you specify which format shall be used to show the contents of MIX binary block devices. @ifhtml @image{../img/ss_devform, 250pt} @end ifhtml The available formats are decimal (e.g. @w{-1234}) and MIX word (e.g. @w{- 00 00 00 19 18}). @end deffn @deffn Settings @w{Devices dir...} Opens a dialog that lets you choose where the MIX device files will be stored (@file{~/.mdk} is the default location). @ifhtml @image{../img/ss_devdir, 250pt} @end ifhtml You can also specify the devices directory using the @code{mixvm} command @code{sddir} (@pxref{Configuration commands}). @end deffn @deffn Settings @w{External programs...} This menu command opens a dialog that lets you specify the commands used for editing and compiling MIXAL source files. @ifhtml @image{../img/ss_extprog, 250pt} @end ifhtml The commands are specified as template strings, where the control substring @code{%s} will be substituted by the actual file name. Thus, if you want to edit programs using @code{vi} running in an @code{xterm}, you must enter the command template @code{@w{xterm -e vi %s}} in the corresponding dialog entry. These settings can also be changed using the @code{mixvm} commands @code{sedit} and @code{sasm} (@pxref{Configuration commands}). @end deffn @deffn Settings Save Saves the current settings. @end deffn @deffn Settings @w{Save on exit} Mark this checkbox if you want @code{gmixvm} to save its settings every time you quit the program. @end deffn @deffn Help About... Shows information about @code{gmixvm}'s version and copyright. @end deffn On the other hand, the status bar displays the name of the last loaded MIX file. In addition, when the mouse pointer is over a MIXAL source file line that contains symbols, a list of these symbols with their values will appear in the status bar. mdk-1.2.9/doc/mdk_mixasm.texi0000644000175000017500000000531512622455635013026 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node mixasm, mixvm, Emacs tools, Top @comment node-name, next, previous, up @chapter @code{mixasm}, the MIXAL assembler @cindex @code{mixasm} @cindex MIXAL @cindex assembler MIX programs, as executed by @code{mixvm}, are composed of binary instructions loaded into the virtual machine memory as MIX words. Although you could write your MIX programs directly as a series of words in binary format, you have at your disposal a more friendly assembly language, MIXAL (@pxref{MIXAL}) which is compiled into binary form by @code{mixasm}, the MIXAL assembler included in @sc{mdk}. In this chapter, you will find a complete description of @code{mixasm} options. @menu * Invoking mixasm:: @end menu @node Invoking mixasm, , mixasm, mixasm @comment node-name, next, previous, up @section Invoking @code{mixasm} In its simplest form, @code{mixasm} is invoked with a single argument, which is the name of the MIXAL file to be compiled, e.g. @example mixasm hello @end example @noindent will compile either @file{hello} or @file{hello.mixal}, producing a binary file named @file{hello.mix} if no errors are found. In addition, @code{mixasm} can be invoked with the following command line options (note, that, following GNU's conventions, we provide a long option name for each available single letter switch): @example mixasm [-vhulO] [-o OUTPUT_FILE] [--version] [--help] [--usage] [--ndebug] [--output=OUTPUT_FILE] [--list[=LIST_FILE]] file @end example @noindent The meaning of these options is as follows: @defopt -v @defoptx --version Prints version and copyleft information and exits. @end defopt @defopt -h @defoptx --help @defoptx -u @defoptx --usage Prints a summary of available options and exits. @end defopt @defopt -O @defoptx --ndebug Do not include debugging information in the compiled file, saving space but disallowing breakpoint setting at source level and symbol table inspection under @code{mixvm}. @end defopt @defopt -o output_file @defoptx --output=output_file By default, the given source file @var{file.mixal} is compiled into @var{file.mix}. You can provide a different name for the output file using this option. @end defopt @defopt -l @defoptx @w{--list[=list_file]} @cindex .mls file This option causes @code{mixasm} to produce, in addition to the @file{.mix} file, an ASCII file containing a summary of the compilation results. The file is named after the MIXAL source file, changing its extension to @file{.mls} if no argument is provided; otherwise, the listing file is named according to the argument. @end defopt mdk-1.2.9/doc/mdk_gstart.texi0000644000175000017500000010635112622455635013036 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Getting started, Emacs tools, MIX and MIXAL tutorial, Top @chapter Getting started @cindex tutorial In this chapter, you will find a sample code-compile-run-debug session using the @sc{mdk} utilities. Familiarity with the MIX mythical computer and its assembly language MIXAL (as described in Knuth's TAOCP) is assumed; for a compact reminder, see @ref{MIX and MIXAL tutorial}. @menu * Writing a source file:: A sample MIXAL source file. * Compiling:: Using @code{mixasm} to compile source files into binary format. * Running the program:: Running and debugging your programs. * Using mixguile:: Using the Scheme interpreter to run and debug your programs. * Using Scheme in mixvm and gmixvm:: @end menu @node Writing a source file, Compiling, Getting started, Getting started @section Writing a source file @cindex MIXAL @cindex source file @cindex .mixal file MIXAL programs can be written as ASCII files with your editor of choice. Here you have the mandatory @emph{hello world} as written in the MIXAL assembly language: @example * (1) * hello.mixal: say 'hello world' in MIXAL (2) * (3) * label ins operand comment (4) TERM EQU 19 the MIX console device number (5) ORIG 3000 start address (6) START OUT MSG(TERM) output data at address MSG (7) HLT halt execution (8) MSG ALF "MIXAL" (9) ALF " HELL" (10) ALF "O WOR" (11) ALF "LD " (12) END START end of the program (13) @end example @noindent MIXAL source files should have the extension @file{.mixal} when used with the @sc{mdk} utilities. As you can see in the above sample, each line in a MIXAL file can be divided into four fields separated by an arbitrary amount of whitespace characters (blanks and or tabs). While in Knuth's definition of MIXAL each field must start at a fixed pre-defined column number, the @sc{mdk} assembler loosens this requirement and lets you format the file as you see fit. The only restrictions retained are for comment lines (like 1-4) which must begin with an asterisk (*) placed at column 1, and for the label field (see below) which, if present, must also start at column 1. The four fields in each non-comment line are: @itemize @minus @item an optional label, which either refers to the current memory address (as @code{START} and @code{MSG} in lines 7 and 9) or a defined symbol (@code{TERM}) (if present, the label must always start at the first column in its line, for the first whitespace in the line marks the beginning of the second field), @item an operation mnemonic, which can represent either a MIX instruction (@code{OUT} and @code{HLT} in lines 7 and 8 above), or an assembly pseudoinstruction (e.g., the @code{ORIG} pseudoinstruction in line 6@footnote{If an @code{ORIG} directive is not used, the program will be loaded by the virtual machine at address 0. @code{ORIG} allows allocating the executable code where you see fit.}. @item an optional operand for the (pseudo)instruction, and @item an optional free text comment. @end itemize @noindent Lines 9-12 of the @file{hello.mixal} file above also show the second (and last) difference between Knuth's MIXAL definition and ours: the operand of the @code{ALF} pseudoinstruction (a word of five characters) must be quoted using ""@footnote{In Knuth's definition, the operand always starts at a fixed column number, and the use of quotation is therefore unnecessary. As @code{mixasm} releases this requirement, marking the beginning and end of the @code{ALF} operand disambiguates the parser's recognition of this operand when it includes blanks. Note that double-quotes (") are not part of the MIX character set, and, therefore, no escape characters are needed within @code{ALF}'s operands.}. The workings of this sample program should be straightforward if you are familiar with MIXAL. See TAOCP vol. 1 for a thorough definition or @ref{MIX and MIXAL tutorial}, for a tutorial. @node Compiling, Running the program, Writing a source file, Getting started @section Compiling @cindex compiling @cindex binary programs @cindex virtual machine @cindex assembler @cindex @code{mixasm} Three simulators of the MIX computer, called @code{mixvm}, @code{gmixvm} and @code{mixguile}, are included in the @sc{mdk} tools. They are able to run binary files containing MIX instructions written in their binary representation. You can translate MIXAL source files into this binary form using @code{mixasm}, the MIXAL assembler. So, in order to compile the @file{hello.mixal} file, you can type the following command at your shell prompt: @example mixasm hello @key{RET} @end example @cindex .mix file If the source file contains no errors, this will produce a binary file called @file{hello.mix} which can be loaded and run by the MIX virtual machine. Unless the @code{mixasm} option @code{-O} is provided, the assembler will include debug information in the executable file (for a complete description of all the compilation options, see @ref{mixasm}). Now, your are ready to run your first MIX program, as described in the following section. @node Running the program, Using mixguile, Compiling, Getting started @section Running the program @cindex @code{mixvm} @cindex non-interactive mode @cindex interactive mode MIX is a mythical computer, so it is no use ordering it from your favorite hardware provider. @sc{mdk} provides three software simulators of the computer, though. They are @itemize @bullet @item @code{mixvm}, a command line oriented simulator, @item @code{gmixvm}, a GTK based graphical interface to @code{mixvm}, and @item @code{mixguile}, a Guile shell with a built-in MIX simulator. @end itemize All three simulators accept the same set of user commands, but offer a different user interface, as noted above. In this section we shall describe some of these commands, and show you how to use them from @code{mixvm}'s command line. You can use them as well at @code{gmixvm}'s command prompt (@pxref{gmixvm}), or using the built-in Scheme primitives of @code{mixguile} (@pxref{Using mixguile}). Using the MIX simulators, you can run your MIXAL programs, after compiling them with @code{mixasm} into binary @file{.mix} files. @code{mixvm} can be used either in @dfn{interactive} or @dfn{non-interactive} mode. In the second case, @code{mixvm} will load your program into memory, execute it (producing any output due to MIXAL @code{OUT} instructions present in the program), and exit when it encounters a @code{HLT} instruction. In interactive mode, you will enter a shell prompt which allows you issuing commands to the running virtual machine. These commands will permit you to load, run and debug programs, as well as to inspect the MIX computer state (register contents, memory cells contents and so on). @menu * Non-interactive mode:: Running your programs non-interactively. * Interactive mode:: Running programs interactively. * Debugging:: Commands for debugging your programs. @end menu @node Non-interactive mode, Interactive mode, Running the program, Running the program @comment node-name, next, previous, up @subsection Non-interactive mode @cindex non-interactive mode To make @code{mixvm} work in non-interactive mode, use the @code{-r} flag. Thus, to run our @file{hello.mix} program, simply type @example mixvm -r hello @key{RET} @end example @noindent at your command prompt, and you will get the following output: @example MIXAL HELLO WORLD @end example @noindent Since our hello world program uses MIX's device number 19 as its output device (@pxref{Writing a source file}), the output is redirected to the shell's standard output. Had you used any other MIX output devices (disks, drums, line printer, etc.), @code{mixvm} would have created a file named after the device used (e.g. @file{disk4.dev}) and written its output there@footnote{The device files are stored, by default, in a directory called @file{.mdk}, which is created in your home directory the first time @code{mixvm} is run. You can change this default directory using the command @code{devdir} when running @code{mixvm} in interactive mode (@pxref{Configuration commands})}. The virtual machine can also report the execution time of the program, according to the (virtual) time spent in each of the binary instructions (@pxref{Execution times}). Printing of execution time statistics is activated with the @code{-t} flag; running @example mixvm -t -r hello @key{RET} @end example @noindent produces the following output: @example MIXAL HELLO WORLD ** Execution time: 11 @end example Sometimes, you will prefer to store the results of your program in MIX registers rather than writing them to a device. In such cases, @code{mixvm}'s @code{-d} flag is your friend: it makes @code{mixvm} dump the contents of its registers and flags after executing the loaded program. For instance, typing the following command at your shell's prompt @example mixvm -d -r hello @end example @noindent you will obtain the following output: @example MIXAL HELLO WORLD rA: + 00 00 00 00 00 (0000000000) rX: + 00 00 00 00 00 (0000000000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) Overflow: F Cmp: E @end example @noindent which, in addition to the program's outputs and execution time, gives you the contents of the MIX registers and the values of the overflow toggle and comparison flag (admittedly, rather uninteresting in our sample). As you can see, running programs non-interactively has many limitations. You cannot peek the virtual machine's memory contents, not to mention stepping through your program's instructions or setting breakpoints@footnote{The @code{mixguile} program allows you to execute arbitrary combinations of @code{mixvm} commands (using Scheme) non-interactively. @xref{Scheme scripts}.}. Enter interactive mode. @node Interactive mode, Debugging, Non-interactive mode, Running the program @comment node-name, next, previous, up @subsection Interactive mode @cindex interactive mode To enter the MIX virtual machine interactive mode, simply type @example mixvm @key{RET} @end example @noindent at your shell command prompt. This command enters the @code{mixvm} command shell. You will be presented the following command prompt: @example MIX > @end example @noindent The virtual machine is initialised and ready to accept your commands. The @code{mixvm} command shell uses GNU's readline, so that you have at your disposal command completion (using @key{TAB}) and history functionality, as well as other line editing shortcuts common to all utilities using this library (for a complete description of readline's line editing usage, see @ref{Command Line Editing,,,Readline}.) @cindex @code{load} Usually, the first thing you will want to do is loading a compiled MIX program into memory. This is accomplished by the @code{load} command, which takes as an argument the name of the @file{.mix} file to be loaded. Thus, typing @example MIX > load hello @key{RET} Program loaded. Start address: 3000 MIX > @end example @noindent will load @file{hello.mix} into the virtual machine's memory and set the program counter to the address of the first instruction. You can obtain the contents of the program counter using the command @code{pc}: @cindex @code{pc} @example MIX > pc Current address: 3000 MIX > @end example @cindex @code{run} After loading it, you are ready to run the program, using, as you surely have guessed, the @code{run} command: @example MIX > run Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) MIX > @end example @noindent Note that now the timing statistics are richer. You obtain the elapsed execution time (i.e., the time spent executing instructions since the last breakpoint), the total execution time for the program up to now (which in our case coincides with the elapsed time, since there were no breakpoints), and the total uptime for the virtual machine (you can load and run more than one program in the same session)@footnote{Printing of timing statistics can be disabled using the command @code{timing} (@pxref{Configuration commands}).}. After running the program, the program counter will point to the address after the one containing the @code{HLT} instruction. In our case, asking the value of the program counter after executing the program will give us @example MIX > pc Current address: 3002 MIX > @end example @cindex @code{pmem} @noindent You can check the contents of a memory cell giving its address as an argument of the command @code{pmem}, like this @example MIX > pmem 3001 3001: + 00 00 00 02 05 (0000000133) MIX > @end example @noindent and convince yourself that address 3001 contains the binary representation of the instruction @code{HLT}. An address range of the form FROM-TO can also be used as the argument of @code{pmem}: @example MIX > pmem 3000-3006 3000: + 46 58 00 19 37 (0786957541) 3001: + 00 00 00 02 05 (0000000133) 3002: + 14 09 27 01 13 (0237350989) 3003: + 00 08 05 13 13 (0002118477) 3004: + 16 00 26 16 19 (0268542995) 3005: + 13 04 00 00 00 (0219152384) 3006: + 00 00 00 00 00 (0000000000) MIX > @end example @cindex @code{preg} @noindent In a similar manner, you can look at the contents of the MIX registers and flags. For instance, to ask for the contents of the A register you can type @example MIX > preg A rA: + 00 00 00 00 00 (0000000000) MIX > @end example @cindex @code{help} @noindent Use the command @code{help} to obtain a list of all available commands, and @code{help COMMAND} for help on a specific command, e.g. @example MIX > help run run Run loaded or given MIX code file. Usage: run [FILENAME] MIX > @end example @noindent For a complete list of commands available at the MIX propmt, @xref{mixvm}. In the following subsection, you will find a quick tour over commands useful for debugging your programs. @node Debugging, , Interactive mode, Running the program @comment node-name, next, previous, up @subsection Debugging commands @cindex @code{next} The interactive mode of @code{mixvm} lets you step by step execution of programs as well as breakpoint setting. Use @code{next} to step through the program, running its instructions one by one. To run our two-instruction @file{hello.mix} sample you can do the following: @example MIX > load hello Program loaded. Start address: 3000 MIX > pc Current address: 3000 MIX > next MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 1) MIX > pc Current address: 3001 MIX > next End of program reached at address 3002 Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > pc Current address: 3002 MIX > next MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 12) MIX > MIX > run Running ... ... done Elapsed time: 10 /Total program time: 11 (Total uptime: 22) MIX > @end example @noindent (As an aside, the above sample also shows how the virtual machine handles cumulative time statistics and automatic program restart). @cindex @code{sbpa} @cindex breakpoints You can set a breakpoint at a given address using the command @code{sbpa} (set breakpoint at address). When a breakpoint is set, @code{run} will stop before executing the instruction at the given address. Typing @code{run} again will resume program execution. Coming back to our hello world example, we would have: @example MIX > sbpa 3001 Breakpoint set at address 3001 MIX > run Running ... MIXAL HELLO WORLD ... stopped: breakpoint at line 8 (address 3001) Elapsed time: 1 /Total program time: 1 (Total uptime: 23) MIX > run Running ... ... done Elapsed time: 10 /Total program time: 11 (Total uptime: 33) MIX > @end example @cindex @code{sbp} @cindex breakpoints @noindent Note that, since we compiled @file{hello.mixal} with debug info enabled, the virtual machine is able to tell us the line in the source file corresponding to the breakpoint we are setting. As a matter of fact, you can directly set breakpoints at source code lines using the command @code{sbp LINE_NO}, e.g. @example MIX > sbp 4 Breakpoint set at line 7 MIX > @end example @noindent @code{sbp} sets the breakpoint at the first meaningful source code line; thus, in the above example we have requested a breakpoint at a line which does not correspond to a MIX instruction and the breakpoint is set at the first line containing a real instruction after the given one. To unset breakpoints, use @code{cbpa ADDRESS} and @code{cbp LINE_NO}, or @code{cabp} to remove all currently set breakpoints. You can also set conditional breakpoints, i.e., tell @code{mixvm} to interrupt program execution whenever a register, a memory cell, the comparison flag or the overflow toggle change using the commands @w{@code{sbp[rmco]}} (@pxref{Debug commands}). @cindex @code{psym} MIXAL lets you define symbolic constants, either using the @code{EQU} pseudoinstruction or starting an instruction line with a label (which assigns to the label the value of the current memory address). Each MIXAL program has, therefore, an associated symbol table which you can inspect using the @code{psym} command. For our hello world sample, you will obtain the following output: @example MIX > psym START: 3000 TERM: 19 MSG: 3002 MIX > @end example Other useful commands for debugging are @code{strace} (which turns on tracing of executed instructions), @code{pbt} (which prints a backtrace of executed instructions) and @code{weval} (which evaluates w-expressions on the fly). For a complete description of all available MIX commands, @xref{mixvm}. @node Using mixguile, Using Scheme in mixvm and gmixvm, Running the program, Getting started @section Using @code{mixguile} With @code{mixguile} you can run a MIX simulator embedded in a Guile shell, that is, using Scheme functions and programs. As with @code{mixvm}, @code{mixguile} can be run both in interactive and non-interactive modes. The following subsections provide a quick tour on using this MIX emulator. @menu * The mixguile shell:: Using the Scheme MIX virtual machine. * Additional functions:: Scheme functions accessing the VM. * Defining new functions:: Defining your own Scheme functions. * Hook functions:: Using command and break hook functions. * Scheme scripts:: @end menu @node The mixguile shell, Additional functions, Using mixguile, Using mixguile @subsection The @code{mixguile} shell @cindex Scheme @cindex @code{mixguile} @cindex REPL If you simply type @example mixguile @key{RET} @end example @noindent at the command prompt, you'll be presented a Guile shell prompt like this @example guile> @end example @noindent At this point, you have entered a Scheme read-eval-print loop (REPL) which offers you all the Guile functionality plus a new set of built-in procedures to execute and debug MIX programs. Each of the @code{mixvm} commands described in the previous sections (and in @pxref{mixvm}) have a Scheme function counterpart named after it by prepending the prefix @code{mix-} to its name. Thus, to load our hello world program, you can simply enter @example guile> (mix-load "hello") Program loaded. Start address: 3000 guile> @end example @noindent and run it using @code{mix-run}: @example guile> (mix-run) Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) guile> @end example @noindent In the same way, you can execute it step by step using the Scheme function @code{mix-next} or set a breakpoint: @example guile> (mix-sbp 4) Breakpoint set at line 5 guile> @end example @noindent or, if you one to peek at a register contents: @example guile> (mix-preg 'A) rA: + 00 00 00 00 00 (0000000000) guile> @end example You get the idea: you have at your disposal all the @code{mixvm} and @code{gmixvm} commands by means of @code{mix-} functions. But, in case you are wondering, this is only the beginning. You also have at your disposal a whole Scheme interpreter, and you can, for instance, define new functions combining the @code{mix-} and all other Scheme primitives. In the next sections, you'll find examples of how to take advantage of the Guile interpreter. @node Additional functions, Defining new functions, The mixguile shell, Using mixguile @subsection Additional MIX Scheme functions The @code{mix-} function counterparts of the @code{mixvm} commands don't return any value, and are evaluated only for their side-effects (possibly including informational messages to the standard output and/or error stream). When writing your own Scheme functions to manipulate the MIX virtual machine within @code{mixguile} (@pxref{Defining new functions}), you'll probably need Scheme functions returning the value of the registers, memory cells and so on. Don't worry: @code{mixguile} also offers you such functions. For instance, to access the (numerical) value of a register you can use @code{mix-reg}: @example guile> (mix-reg 'I2) 0 guile> @end example @noindent Note that, unlike @code{(mix-preg 'I2)}, the expression @code{(mix-reg 'I2)} in the above example evaluates to a Scheme number and does not produce any side-effect: @example guile> (number? (mix-reg 'I2)) #t guile> (number? (mix-preg 'I2)) rI2: + 00 00 (0000) #f guile> @end example In a similar fashion, you can access the memory contents using @code{(mix-cell)}, or the program counter using @code{(mix-loc)}: @example guile> (mix-cell 3000) 786957541 guile> (mix-loc) 3002 guile> @end example Other functions returning the contents of the virtual machine components are @code{mix-cmp} and @code{mix-over}, which eval to the value of the comparison flag and the overflow toggle respectively. For a complete list of these additional functions, @xref{mixguile}. In the next section, we'll see a sample of using these functions to extend @code{mixguile}'s functionality. @node Defining new functions, Hook functions, Additional functions, Using mixguile @subsection Defining new functions @cindex Scheme functions Scheme is a powerful language, and you can use it inside @code{mixguile} to easily extend the MIX interpreter's capabilities. For example, you can easily define a function that loads a file, prints its name, executes it and, finally, shows the registers contents, all in one shot: @example guile> (define my-load-and-run @key{RET} (lambda (file) @key{RET} (mix-load file) @key{RET} (display "File loaded: ") @key{RET} (mix-pprog) @key{RET} (mix-run) @key{RET} (mix-preg))) @key{RET} guile> @end example @noindent and use it to run your programs: @example guile> (my-load-and-run "hello") Program loaded. Start address: 3000 File loaded: hello.mix Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 33) rA: + 00 00 00 00 00 (0000000000) rX: + 00 00 00 00 00 (0000000000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) guile> @end example Or, maybe, you want a function which sets a breakpoint at a specified line number before executing it: @example guile> (define my-load-and-run-with-bp (lambda (file line) (mix-load file) (mix-sbp line) (mix-run))) guile> (my-load-and-run-with-bp "samples/primes" 10) Program loaded. Start address: 3000 Breakpoint set at line 10 Running ... ... stopped: breakpoint at line 10 (address 3001) Elapsed time: 1 /Total program time: 1 (Total uptime: 45) guile> @end example As a third example, the following function loads a program, runs it and prints the contents of the memory between the program's start and end addresses: @example guile> (define my-run (lambda (file) (mix-load file) (let ((start (mix-loc))) (mix-run) (mix-pmem start (mix-loc))))) guile> (my-run "hello") Program loaded. Start address: 3000 Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) 3000: + 46 58 00 19 37 (0786957541) 3001: + 00 00 00 02 05 (0000000133) 3002: + 14 09 27 01 13 (0237350989) guile> @end example As you can see, the possibilities are virtually unlimited. Of course, you don't need to type a function definition each time you start @code{mixguile}. You can write it in a file, and load it using Scheme's @code{load} function. For instance, you can create a file named, say, @file{functions.scm} with your definitions (or any Scheme expression) and load it at the @code{mixguile} prompt: @example guile> (load "functions.scm") @end example Alternatively, you can make @code{mixguile} to load it for you. When @code{mixguile} starts, it looks for a file named @file{mixguile.scm} in your MDK configuration directory (@file{~/.mdk}) and, if it exists, loads it before entering the REPL. Therefore, you can copy your definitions in that file, or load the @file{functions.scm} file in @file{mixguile.scm}. @node Hook functions, Scheme scripts, Defining new functions, Using mixguile @subsection Hook functions @cindex hook function @cindex pre-hook @cindex post-hook Hooks are functions called before or after a given event occurs. In @code{mixguile}, you can define command and break hooks, which are associated, respectively, with command execution and program interruption events. The following sections give you a tutorial on using hook functions within @code{mixguile}. @menu * Command hooks:: * Break hooks:: @end menu @node Command hooks, Break hooks, Hook functions, Hook functions @subsubsection Command hooks In the previous section, we have seen how to extend @code{mixguile}'s functionality through the use of user defined functions. Frequently, you'll write new functions that improve in some way the workings of a built-in @code{mixvm} command, following this pattern: @enumerate a @item Prepare the command execution @item Execute the desired command @item Perform post execution operations @end enumerate We call the functions executed in step (a) @dfn{pre-hook}s, and those of step @dfn{post-hook}s of the given command. @code{mixguile} lets you specify pre- and post-hooks for any @code{mixvm} command using the @code{mix-add-pre-hook} and @code{mix-add-post-hook} functions, which take as arguments a symbol naming the command and a function to be executed before (resp. after) the command. In other words, @code{mixguile} will execute for you steps (a) and (c) above whenever you eval (b). The hook functions must take a single argument, which is a string list of the command's arguments. As an example, let us define the following hooks for the @code{next} command: @example (define next-pre-hook (lambda (arglist) (mix-slog #f))) (define next-post-hook (lambda (arglist) (display "Stopped at line ") (display (mix-src-line-no)) (display ": ") (display (mix-src-line)) (newline) (mix-slog #t))) @end example @noindent In these functions, we are using the function @code{mix-slog} to turn off the informational messages produced by the virtual machine, since we are providing our own ones in the post hook function. To install these hooks, we would write: @example (mix-add-pre-hook 'next next-pre-hook) (mix-add-post-hook 'next next-post-hook) @end example @noindent Assuming we have put the above expressions in @code{mixguile}'s initialisation file, we would obtain the following results when evaluating @code{mix-next}: @example guile> (mix-next) MIXAL HELLO WORLD Stopped at line 6: HLT guile> @end example As a second, more elaborate, example, let's define hooks which print the address and contents of a cell being modified using @code{smem}. The hook functions could be something like this: @example (define smem-pre-hook (lambda (arglist) (if (eq? (length arglist) 2) (begin (display "Changing address ") (display (car arglist)) (newline) (display "Old contents: ") (display (mix-cell (string->number (car arglist)))) (newline)) (error "Wrong arguments" arglist)))) (define smem-post-hook (lambda (arglist) (if (eq? (length arglist) 2) (begin (display "New contents: ") (display (mix-cell (string->number (car arglist)))) (newline))))) @end example @noindent and we can install them using @example (mix-add-pre-hook 'smem smem-pre-hook) (mix-add-post-hook 'smem smem-post-hook) @end example @noindent Afterwards, a sample execution of @code{mix-smem} would look like this: @example guile> (mix-smem 2000 100) Changing address 2000 Old contents: 0 New contents: 100 guile> @end example @cindex global hook You can add any number of hooks to a given command. They will be executed in the same order as they are registered. You can also define global post (pre) hooks, which will be called before (after) any @code{mixvm} command is executed. Global hook functions must admit two arguments, namely, a string naming the invoked command and a string list of its arguments, and they are installed using the Scheme functions @code{mix-add-global-pre-hook} and @code{mix-add-global-post-hook}. A simple example of global hook would be: @example guile> (define pre-hook (lambda (cmd args) (display cmd) (display " invoked with arguments ") (display args) (newline))) guile> (mix-add-global-pre-hook pre-hook) ok guile> (mix-pmem 120 125) pmem invoked with arguments (120-125) 0120: + 00 00 00 00 00 (0000000000) 0121: + 00 00 00 00 00 (0000000000) 0122: + 00 00 00 00 00 (0000000000) 0123: + 00 00 00 00 00 (0000000000) 0124: + 00 00 00 00 00 (0000000000) 0125: + 00 00 00 00 00 (0000000000) guile> @end example Note that if you invoke @code{mixvm} commands within a global hook, its associated command hooks will be run. Thus, if you have installed both the @code{next} hooks described earlier and the global hook above, executing @code{mix-next} will yield the following result: @example guile> (mix-next 5) next invoked with arguments (5) slog invoked with arguments (off) MIXAL HELLO WORLD Stopped at line 7: MSG ALF "MIXAL" slog invoked with arguments (on) guile> @end example Adventurous readers may see the above global hook as the beginning of a command log utility or a macro recorder that saves your commands for replay. @node Break hooks, , Command hooks, Hook functions @subsubsection Break hooks @cindex break hook We have seen in the previous section how to associate hooks to command execution, but they are not the whole story. You can also associate hook functions to program interruption, that is, specify functions that should be called every time the execution of a MIX program is stopped due to the presence of a breakpoint, either explicit or conditional. Break hooks take as arguments the line number and memory address at which the break occurred. A simple hook that logs the line and address of the breakpoint could be defined as: @example (define break-hook (lambda (line address) (display "Breakpoint encountered at line ") (display line) (display " and address ") (display address) (newline))) @end example @noindent and installed for explicit and conditional breakpoints using @example (mix-add-break-hook break-hook) (mix-add-cond-break-hook break-hook) @end example @noindent after that, every time the virtual machine encounters a breakpoint, @code{break-code} shall be evaluated for you@footnote{You may have noticed that break hooks can be implemented in terms of command hooks associated to @code{mix-run} and @code{mix-next}. As a matter of fact, they @emph{are} implemented this way: take a look at the file @file{@emph{install_dir}/share/mdk/mix-vm-stat.scm} if you are curious.}. @node Scheme scripts, , Hook functions, Using mixguile @subsection Scheme scripts @cindex Scheme script @cindex non-interactive Another useful way of using @code{mixguile} is writing executable scripts that perform a set of commands for you. This is done using the @code{mixguile} switch @code{-s} (being a Guile shell, @code{mixguile} accepts all the command options of @code{guile}; type @code{mixguile -h} for a list of all available command options). For instance, if you have a very useful MIX program @file{foo.mix} which you want to run often, you don't have to fire up a MIX virtual machine, load and run it every time; you can write a Scheme script instead: @example #! /usr/bin/mixguile -s !# ;;; runprimes: execute the primes.mix program ;; load the file you want to run (mix-load "../samples/primes") ;; execute it (mix-run) ;; print the contents of registers (mix-pall) ;; ... @end example Just save the above script to a file named, say, @file{runtest}, make it executable (@code{chmod +x runtest}), and, well, execute it from the Unix shell: @example $ ./runtest Program loaded. Start address: 3000 Running ... ... done Elapsed time: 190908 /Total program time: 190908 (Total uptime: 190908) rA: + 30 30 30 30 30 (0511305630) rX: + 30 30 32 32 39 (0511313959) rJ: + 47 18 (3026) rI1: + 00 00 (0000) rI2: + 55 51 (3571) rI3: + 00 19 (0019) rI4: + 31 51 (2035) rI5: + 00 00 (0000) rI6: + 00 00 (0000) Overflow: F Cmp: L $ @end example Note that this is far more flexible that running programs non-interactively using @code{mixvm} (@pxref{Non-interactive mode}), for you can execute any combination of commands you want from a Scheme script (not just running and dumping the registers). For additional @code{mixguile} command line options, see @ref{Invoking mixguile}. @node Using Scheme in mixvm and gmixvm, , Using mixguile, Getting started @section Using Scheme in @code{mixvm} and @code{gmixvm} @cindex @code{scmf} In the previous section (@pxref{Using mixguile}) we have seen how the Guile shell @code{mixguile} offers you the possibility of using Scheme to manipulate a MIX virtual machine and extend the set of commands offered by @code{mixvm} and @code{gmixvm}. This possibility is not limited to the @code{mixguile} shell. Actually, both @code{mixvm} and @code{gmixvm} incorporate an embedded Guile interpreter, and can evaluate Scheme expressions. To evaluate a single-line expression at the @code{mixvm} or @code{gmixvm} command prompt, simply write it and press return (the command parser will recognise it as a Scheme expression because it is parenthesized, and will pass it to the Guile interpreter). A sample @code{mixvm} session using Scheme expressions could be: @example MIX > load hello Program loaded. Start address: 3000 MIX > (define a (mix-loc)) MIX > run Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) MIX > (mix-pmem a) 3000: + 46 58 00 19 37 (0786957541) MIX > (mix-pmem (mix-loc)) 3002: + 14 09 27 01 13 (0237350989) MIX > @end example You can also load and evaluate a file, using the @code{scmf} command like this: @example MIX> scmf /path/to/file/file.scm @end example Therefore, you have at your disposal all the @code{mixguile} goodies described above (new functions, new command definitions, hooks...) inside @code{mixvm} and @code{gmixvm}. In other words, these programs are extensible using Scheme. See @ref{Using mixguile} for examples of how to do it. mdk-1.2.9/doc/mdk.texi0000644000175000017500000001644612636564664011467 00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename mdk.info @settitle GNU MIX Development Kit (mdk) @syncodeindex pg cp @finalout @setchapternewpage odd @c %**end of header @set UPDATED November, 2015 @set EDITION 1.2.9 @set VERSION 1.2.9 @set JAO Jose Antonio Ortega Ruiz @set PHILIP Philip E. King @set PIETER Pieter E. J. Pareit @set MIKE Michael Scholz @copying This manual is for GNU MDK (version @value{VERSION}, @value{UPDATED}), a set of utilities for developing programs using Donald Knuth's MIX mythical computer and MIXAL, its assembly language. Copyright @copyright{} 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013, 2014, 2015 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being ``GNU General Public License'', with the Front-Cover Texts being ``A GNU Manual,'' and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled ``GNU Free Documentation License''. (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.'' @end quotation @end copying @dircategory GNU programming tools @direntry * MDK: (mdk). The GNU MIX Development Kit. @end direntry @footnotestyle separate @titlepage @title GNU MDK @subtitle GNU MIX Development Kit @subtitle Edition @value{EDITION}, for GNU @sc{mdk} Version @value{VERSION} @subtitle @value{UPDATED} @author by @value{JAO} (@email{jao@@gnu.org}) @page @vskip 0pt plus 1filll @insertcopying @end titlepage @shortcontents @contents @ifnottex @node Top, Introduction, (dir), (dir) @insertcopying GNU MDK was written and designed by @value{JAO}. @value{PIETER} is the author of the Emacs @code{MIXAL} mode (@pxref{MIXAL mode}), and has also contributed many bug fixes. @value{PHILIP} has contributed to this package development with many helpful discussions, as well as actual code (@pxref{GUD integration}). @value{MIKE} is the author of the German translation of @sc{mdk}'s user interface. @end ifnottex @menu * Introduction:: * Acknowledgments:: * Installing MDK:: Installing GNU MDK from the source tarball. * MIX and MIXAL tutorial:: Learn the innards of MIX and MIXAL. * Getting started:: Basic usage of the @sc{mdk} tools. * Emacs tools:: Programming the MIX using Emacs. * mixasm:: Invoking the MIXAL assembler. * mixvm:: Invoking and using the MIX virtual machine. * gmixvm:: Invoking and using the GTK+ virtual machine. * mixguile:: Invoking and using the Scheme virtual machine. * Problems:: Reporting bugs. * Copying:: @sc{mdk} licensing terms. * Concept Index:: Index of concepts. * Instructions and commands:: Index of MIXAL instructions and MIXVM commands. @detailmenu --- The Detailed Node Listing --- Installing @sc{mdk} * Download:: * Requirements:: * Basic installation:: * Emacs support:: * Special configure flags:: * Supported platforms:: MIX and MIXAL tutorial * The MIX computer:: Architecture and instruction set of the MIX computer. * MIXAL:: The MIX assembly language. The MIX computer * MIX architecture:: * MIX instruction set:: MIX instruction set * Instruction structure:: * Loading operators:: * Storing operators:: * Arithmetic operators:: * Address transfer operators:: * Comparison operators:: * Jump operators:: * Input-output operators:: * Conversion operators:: * Shift operators:: * Miscellaneous operators:: * Execution times:: MIXAL * Basic structure:: Writing basic MIXAL programs. * MIXAL directives:: Assembler directives. * Expressions:: Evaluation of expressions. * W-expressions:: Evaluation of w-expressions. * Local symbols:: Special symbol table entries. * Literal constants:: Specifying an immediate operand. Getting started * Writing a source file:: A sample MIXAL source file. * Compiling:: Using @code{mixasm} to compile source files into binary format. * Running the program:: Running and debugging your programs. * Using mixguile:: Using the Scheme interpreter to run and debug your programs. * Using Scheme in mixvm and gmixvm:: Running the program * Non-interactive mode:: Running your programs non-interactively. * Interactive mode:: Running programs interactively. * Debugging:: Commands for debugging your programs. Using @code{mixguile} * The mixguile shell:: Using the Scheme MIX virtual machine. * Additional functions:: Scheme functions accessing the VM. * Defining new functions:: Defining your own Scheme functions. * Hook functions:: Using command and break hook functions. * Scheme scripts:: Hook functions * Command hooks:: * Break hooks:: Emacs tools * MIXAL mode:: Editing MIXAL files. * GUD integration:: Invoking @code{mixvm} within Emacs. MIXAL mode * Basics:: Editing code, font locking and indentation. * Help system:: Using the interactive help system. * Compiling and running:: Invoking compiler and/or virtual machine. @code{mixasm}, the MIXAL assembler * Invoking mixasm:: @code{mixvm}, the MIX computer simulator * Invocation:: * Commands:: Commands available in interactive mode. * Devices:: MIX block devices implementation. Interactive commands * File commands:: Loading and executing programs. * Debug commands:: Debugging programs. * State commands:: Inspecting the virtual machine state. * Configuration commands:: Changing and storing mixvm settings. * Scheme commands:: @code{gmixvm}, the GTK virtual machine * Invoking gmixvm:: * MIXVM console:: Using @code{mixvm} commands. * MIX virtual machine:: The MIX virtual machine window. * MIXAL source view:: Viewing the MIXAL source code. * MIX devices view:: Device output. * Menu and status bars:: Available menu commands. @code{mixguile}, the Scheme virtual machine * Invoking mixguile:: Command line options. * Scheme functions reference:: Scheme functions accessing the VM. Scheme functions reference * mixvm wrappers:: Functions invoking mixvm commands. * Hooks:: Adding hooks to mixvm commands. * Additional VM functions:: Functions accessing the MIX virtual machine. Copying * GNU General Public License:: * GNU Free Documentation License:: @end detailmenu @end menu @include mdk_intro.texi @include mdk_ack.texi @include mdk_install.texi @include mdk_tut.texi @include mdk_gstart.texi @include mdk_emacs.texi @include mdk_mixasm.texi @include mdk_mixvm.texi @include mdk_gmixvm.texi @include mdk_mixguile.texi @include mdk_bugs.texi @include mdk_copying.texi @include mdk_index.texi @include mdk_findex.texi @bye mdk-1.2.9/doc/MIX.DOC0000644000175000017500000006212712112755472010766 00000000000000This has been lifted verbatim from Knuth volume 1. (See README for the reference.) Some examples and witty but nonessential sections that I didn't feel like typing have been omitted. Copyright (C) 1973, 1968 by Addison-Wesley; used without permission. 1.3.1 Description of MIX. ... MIX has a peculiar property in that it is both binary and decimal at the same time. The programmer doesn't actually know whether he is programming a machine with base 2 or base 10 arithmetic. ... Words. The basic unit of information is a -byte-. Each byte contains an -unspecified- amount of information, but it must be capable of holding at least 64 distinct values. That is, we know that any number between 0 and 63, inclusive, can be contained in one byte. Furthermore, each byte contains -at-most- 100 distinct values. On a binary computer a byte must therefore be composed of six bits; on a decimal computer we have two digits per byte. ... An algorithm in MIX should work properly regardless of how big a byte is. Although it is quite possible to write programs which depend on the byte size, this is an illegal act which will not be tolerated; the only legitimate programs are those which would give correct results with all byte sizes. ... A computer word is five bytes plus a sign. The sign position has only two possible values, + and -. Registers. There are nine registers in MIX. The A-register (Accumulator) is five bytes plus sign. The X-register (Extension) is also five bytes plus sign. The I-registers (Index registers) I1, I2, I3, I4, I5, and I6 each hold two bytes plus sign. The J-register (Jump address) holds two bytes, and its sign is always +. We shall use a small letter ``r'' prefixed to the name, to identify a MIX register. Thus, ``rA'' means ``register A''. The A-register has many uses, especially for arithmetic and operating on data. The X-register is an etension on the ``right-hand side'' of rA, and it is used in connection with rA to hold ten bytes of a product or dividend, or it can be used to hold information shifted to the right out of rA. The index registers rI1, rI2, rI3, rI4, rI5, and rI6 are used primarily for counting and for referencing variable memory addresses. The J-register always hold the address of the instruction following the preceding ``JUMP'' intruction, and it is primarily used in connection with subroutines. Besides thesee registers, MIX contains an overflow toggle (a single bit which is either ``on'' or ``off''), a comparison indicator (which has three values: less, equal, or greater), memory (4000 words of storage, each word with five bytes plus sign), and input-output devices (cards, tapes, etc.). Partial fields of words. The five bytes and sign of a computer word are numbered as follows: 0 1 2 3 4 5 +/- Byte Byte Byte Byte Byte. Most of the instructions allow the programmer to use only part of a word if he chooses. In this case a ``field specification'' is given. The allowable fields are those which are adjacent in a computer word, and they are represented by (L:R), where L is the number of the left-hand part and R is the number of the right-hand part of the field. Examples of field specifications are: (0:0), the sign only. (0:2), the sign and first two bytes. (0:5), the whole word. This is the most common field specification. (1:5), the whole word except the sign. (4:4), the fourth byte only. (4:5), the two least significant bytes. The use of these field specifications varies slightly from instruction to instruction, and it will be explained in detail for each instruction where it applies. Although it is generally not important to the programmer, the field (L:R) is denoted in the machine by the single number 8L + R, and this number will fit in one byte. Instruction format. Computer words used for instructions have the following form: 0 1 2 3 4 5 (3) +/- A A I F C. The rightmost byte, C, is the operation code telling what operation is to be performed. For example, C=8 is the operation LDA, ``load the A register''. The F-byte holds a modification of the operation code. F is usually a field specification (L:R)=8L + R; for example, if C=8 and F=11, the operation is ``load the A-register with the (1:3) field''. Sometimes F is used for other purposes; on input-output instructions, for example, F is the number of the affected input or output unit. The left-hand portion of the instruction, +/-AA, is the ``address''. (Note that the sign is part of the address.) The I-field, which comes next to the address, is the ``index specification'', which may be used to modify the address of an instruction. If I=0, the address +/-AA is used without change; otherwise I should contain a number {i} between 1 and 6, and the contents of index register I{i} are added algebraically to +/-AA; the result is used as the address of the instruction. this indexing process takes place on -every- instruction. We will use the letter M to indicate the address after any specified indexing has occurred. (If the addition of the index register to the address +/-AA yields a result which does not fit in two bytes, the value of M is undefined.) In most instructions, M will refer to a memory cell. The terms ``memory cell'' and ``memory location'' are used almost interchangeably in this book. We assume that there are 4000 memory cells, numbered fro 0 to 3999; hence every memory location can be addressed with two bytes. For every instruction in which M is to refer to a memory cell we must have 0 <= M <= 3999, and in this case we will write CONTENTS(M) to denote the value stored in memory location M. On certain instructions, the ``address'' M has another significance, and it may even be negative. Thus, one instruction adds M to an index register, and this operation takes account of the sign of M. Notation. To discuss instructions in a readable manner, we will use the notation OP ADDRESS,I(F) (4) to denote an instruction like (3). Here OP is a symbolic name which is given to the operation code (the C-part) of the instruction; ADDRESS is the +/-AA portion; and I, F represent the I- and F-fields, respectively. If I is zero, the ``,I'' is omitted. If F is the -normal- F-specification for this particular operator, the ``(F)'' need not be written. The normal F- specification for almost all operators is (0:5), representing a whole word. If a different F is standard, it will be mentioned explicity when we discuss a particular operator. ... Rules for each instruction. The remarks following (3) above have defined the quantities M, F, and C for every word used as an instruction. We will now define the actions corresponding to each instruction. [Knuth gives C- and F- values in each instruction's entry; I'm omitting them since you can get them from the opcodes file in this distribution.] Loading operators * LDA (load A). The specified field of CONTENTS(M) replaces the previous contents of register A. On all operations where a partial field is used as an input, the sign is used if it is a part of the field, otherwise the sign + is understood. The field is shifted over to the right-hand part of the register as it is loaded. Examples: If F is the normal field specification (0:5), the entire contents of location M is loaded. If F is (1:5), the absolute value of CONTENTS(M) is loaded with a plus sign. If M contains an -instruction- word and if F is (0:2), the ``+/-AA'' field is loaded as 0 1 2 3 4 5 +/- 0 0 0 A A. ... * LDX (load X). This is the same as LDA, except that rX is loaded instead of rA. * LD{i} (load {i}). This is the same as LDA, except that rI{i} is loaded instead of rA. An index register contains only two bytes (not five) plus sign; bytes 1, 2, 3 are always assumed to be zero. The LD{i} instruction is considered undefined if it would result in setting bytes 1, 2, 3 to anything but zero. In the description of all instructions, ``{i}'' stands for an integer, 1 <= i <= 6. Thus, LD{i} stands for six different instructions: LD1, LD2, ..., LD6. * LDAN (load A negative). * LDXN (load X negative). * LD{i}N (load {i} negative). These eight instructions are the same as LDA, LDX, LD{i}, respectively, except that the -opposite- sign is loaded. Storing operators. * STA (store A). The contents of rA replaces the field of CONTENTS(M) specified by F. The other parts of CONTENTS(M) are unchanged. On a -store- operation the field F has the opposite significance from the -load- operation. The number of bytes in the field is taken from the right- hand side of the the register and shifted -left- if necessary to be inserted in the proper field of CONTENTS(M). The sign is not altered unless it is part of the field. The contents of the register is not affected. ... * STX (store X). Same as STA except rX is stored rather than rA. * ST{i} (store {i}). Same as STA except rI{i} is stored rather than rA. Bytes 1, 2, 3 of an index register are zero; thus if rI1 contains +/- m n this behaves as though it were 0 1 2 3 4 5 +/- 0 0 0 m n. * STJ (store J). Same as ST{i} except rJ is stored, and its sign is always +. On STJ the normal field specification for F is (0:2), -not- (0:5). This is natural, since STJ is almost always done into the address field of an instruction. * STZ (store zero). Same as STA except plus zero is stored. In other words, the specified field of CONTENTS(M) is cleared to zero. Arithmetic operators. On the add, subtract, multiply, and divide operations a field specification is allowed. A field specification of ``(0:6)'' can be used to indicate a ``floating-point'' operation (see Section 4.2 [in Volume 2]), but few of the programs we will write for MIX will use this feature... The standard field specification is, as usual, (0:5). Other fields are treated as in LDA. We will use the letter V to indicate the specified field of CONTENTS(M); thus, V is the value which would have been loaded into register A if the operation code were LDA. * ADD. V is added to rA. If the magnitude of the result is too large for register A, the overflow toggle is set on, and the remainder of the addition appearing in rA is as though a ``1'' had been carried into another register to the left of A. (Otherwise the setting of the overflow toggle is unchanged.) If the result is zero, the sign of rA is unchanged. Example: The sequence of instructions below gives the sum of the five bytes of register A. STA 2000 LDA 2000(5:5) ADD 2000(4:4) ADD 2000(3:3) ADD 2000(2:2) ADD 2000(1:1) This is sometimes called ``sideways addition''. * SUB (subtract). V is subtracted from rA. Overflow may occur as in ADD. Note that because of the variable definition of byte size, overflow will occur in some MIX computers when it would not occur in others... * MUL (multiply). The 10-byte product of V times (rA) replaces registers A and X. The signs of rA and rX are both set to the algebraic sign of the result (i.e., + if the signs of V and rA were the same, and - if they were different). * DIV (divide). The value of rA and rX, treated as a 10-byte number, with the sign of rA, is divided by the value V. If V=0 or if the quotient is more than five bytes in magnitude (this is equivalent to the condition that |rA| >= |V|), registers A and X are filled with undefined information and the overflow toggle is set on. Otherwise the quotient is placed in rA and the remainder is placed in rX. The sign of rA afterward is the algebraic sign of the quotient; the sign of rX afterward is the previous sign of rA. ... Address transfer operators. In the following operations, the (possibly indexed) ``address'' M is used as a signed number, not as the address of a cell in memory. * ENTA (enter A). The quantity M is loaded into rA. The action is equivalent to ``LDA'' from a memory word containing the signed value of M. If M=0, the sign of the instruction is loaded. [I don't think the simulator works that way. Better check...] Examples: ``ENTA 0'' sets rA to zeros. ``ENTA 0,1'' sets rA to the current contents of index register 1, except that -0 is changed to +0. * ENTX (enter X). * ENT{i} (enter {i}). Analogous to ENTA, loading the appropriate register. * ENNA (enter negative A). * ENNX (enter negative X). * ENN{i} (enter negative {i}). Same as ENTA, ENTX, and ENT{i}, except that the opposite sign is loaded. Example: ``ENN3 0,3'' replaces rI3 by its negative. * INCA (increase A). The quantity M is added to rA; the action is equivalent to ``ADD'' from a memory word containing the value of M. Overflow is possible and it is treated just as in ADD. Example: ``INCA 1'' increases the value of rA by one. * INCX (increase X). The quantity M is added to rX. If overflow occurs, the action is equivalent to ADD, except that rX is used instead of rA. Register A is never affected by this instruction. * INC{i} (increase {i}). Add M to rI{i}. Overflow must not occur; if the magnitude of the result is more than two bytes, the result of this instruction is undefined. * DECA (decrease A). * DECX (decrease X). * DEC{i} (decrease {i}). These eight instructions are the same as INCA, INCX, and INC{i}, respectively, except that M is subtracted from the register rather than added. Note that the operation code C is the same for ENTA, ENNA, INCA, AND DECA; the F-field is used to distinguish the various operations in this case. Comparison operators. The comparison operators all compare the value contained in a register with a value contained in memory. The comparison indicator is then set to LESS, EQUAL, or GREATER according to whether the value of the -register- is less than, equal to, or greater than the value of the -memory- -cell-. A minus zero is -equal-to- a plus zero. * CMPA (compare A). The specified field of A is compared with the -same- field of CONTENTS(M). If the field F does not include the sign position, the fields are both thought of as positive; otherwise the sign is taken into account in the comparison. (If F is (0:0) an equal comparison always occurs, since minus zero equals plus zero.) * CMPX (compare X). This is analogous to CMPA. * CMP{i} (compare {i}). Analogous to CMPA. Bytes 1, 2, and 3 of the index register are treated as zero in the comparison. (Thus if F = (1:2), the result cannot be GREATER.) Jump operators. Ordinarily, instructions are executed in sequential oder; i.e., the instruction executed after the one in location P is the instruction found in location P+1. Several ``jump'' instructions allow this sequence to be interrupted. When such a jump takes place, the J-register is normally set to the address of the next instruction (that is, the address of the instruction which would have been next if we hadn't jumped). A ``store J'' instruction then can be used by the programmer, if desired, to set the address field of another command which will later be used to return to the original place in the program. The J-register is changed whenever a jump actually occurs in a program (except JSJ), and it is never changed except when a jump occurs. * JMP (jump). Unconditional jump: the next instruction is taken from location M. * JSJ (jump, save J). Same as JMP except that the contents of rJ are unchanged. * JOV (jump on overflow). If the overflow toggle is on, it is turned off and a JMP occurs; otherwise nothing happens. * JNOV (jump on no overflow). If the overflow toggle is off, a JMP occurs; otherwise it is turned off. * JL, JE, JG, JGE, JNE, JLE (jump on less, equal, greater, greater-or-equal, unequal, less-or-equal). Jump if the comparison indicator is set to the condition indicated. For example, JNE will jump if the comparison indicator is LESS or GREATER. The comparison indicator is not changed by these instructions. * JAN, JAZ, JAP, JANN, JANZ, JANP (jump A negative, zero, positive, nonnegative, nonzero, nonpositive). If the contents of rA satisfy the stated condition, a JMP occurs, otherwise nothing happens. ``Positive'' means -greater- than zero (not zero); ``nonpositive'' means the opposite, i.e., zero or negative. * JXN, JXZ, JXP, JXNN, JXNZ, JXNP (jump X negative, zero, positive, nonnegative, nonzero, nonpositive). * J{i}N, J{i}Z, J{i}P, J{i}NN, J{i}NZ, J{i}NP (jump {i} negative, zero, positive, nonnegative, nonzero, nonpositive). These are analogous to the corresponding operations for rA. Miscellaneous operators. * MOVE. The number of words specified by F is moved, starting from location M to the location specified by the contents of index register 1. The transfer occurs one word at a time, and rI1 is increased by the value of F at the end of the operation. If F=0, nothing happens. Care must be taken when the groups of locations involved overlap... * SLA, SRA, SLAX, SRAX, SLC, SRC (shift left A, shift right A, shift left AX, shift right AX, shift left AX circularly, shift right AX circularly). These are the ``shift'' commands. Signs of registers A, X are not affected in any way. M specifies the number of -bytes- to be shifted left or right; M must be nonnegative. SLA and SRA do not affect rX; the other shifts affect both registers as though they were a single 10-byte register. With SLA, SRA, SLAX, and SRAX, zeros are shifted into the register at one side, and bytes disappear at the other side. The instructions SLC and SRC call for a ``circulating'' shift, in which the bytes that leave one end enter in at the other end. Both rA and rX participate in a circulating shift. Examples: Register A Register X Initial contents + 1 2 3 4 5 - 6 7 8 9 10 SRAX 1 + 0 1 2 3 4 - 5 6 7 8 9 SLA 2 + 2 3 4 0 0 - 5 6 7 8 9 SRC 4 + 6 7 8 9 2 - 3 4 0 0 5 SRA 2 + 0 0 6 7 8 - 3 4 0 0 5 SLC 501 + 0 6 7 8 3 - 4 0 0 5 0 * NOP (no operation). No operation occurs, and this instruction is bypassed. F and M are ignored. * HLT (halt). The machine stops. When the computer operator restarts it, the net effect is equivalent to NOP. Input-output operators. MIX has a fair amount of input-output equipment (all of which is optional at extra cost). Each device is given a number as follows: Unit number Peripheral device Block size t Tape unit no. t (0 <= t <= 7) 100 words d Disk or drum unit no. d (8 <= d <= 15) 100 words 16 Card reader 16 words 17 Card punch 16 words 18 Printer 24 words 19 Typewriter and paper tape 14 words Not every MIX installation will have all of this equipment available; we will occasionally make appropriate assumptions about the presence of certain devices. Some devices may not be used both for input and for output. The number of words mentioned in the above tble is a fixed block size associated with each unit. Input or output with magnetic tape, disk, or drum units reads or writes full words (five bytes plus sign). Input or output with units 16 through 19, however, is always done in a -character-code- where each byte represents one alphnumeric character. Thus, five characters per MIX word are transmitted. The character code is given [in charset.c]... It is not possible to read in or write out all possible values a byte may have, since certain combinations are undefined. Not all input-output devices are capable of handling all the symbols in the character set; for example, the symbols phi and pi which appear amid the letters will perhaps not be acceptable to the card reader. When input of character code is being done, the signs of all words are set to ``+''; on output, signs are ignored. The disk and drum units are large external memory devices each containing b^2 100-word blocks, where b is the byte size. On every IN, OUT, or IOC instruction as defined below, the particular 100-word block referred to by the instruction is specified by the current contents of the two least significant bytes of rX. * IN (input). C=36; F=unit. This instruction initiates the transfer of information from the input unit specified into consecutive locations starting with M. The number of locations transferred is the block size for this unit (see the table above). The machine will wait at this point if a preceding operation for the same unit is not yet complete. The transfer of information which starts with this instruction will not be complete until somewhat later, depending on the speed of the input device, so a program must not refer to the information in memory until then. It is improper to attempt to read any record from magnetic tape which follows the latest record written on that tape. * OUT (output). C=37; F=unit. This instruction starts the transfer of information from memory locations starting at M to the output unit specified. (The machine waits until the unit is ready, if it is not initially ready.) The transfer will not be complete until somewhat later, depending on the speed of the output device, so a program must not alter the information in memory until then. * IOC (input-output control). C=35; F=unit. The machine waits, if necessary, until the specified unit is not busy. Then a control operation is performed, depending on the particular device being used. The following examples are used in various parts of this book: Magnetic tape: If M=0, the tape is rewound. If M<0 the tape is skipped backward -M records, or to the beginning of the tape, whichever comes first. If M>0, the tape is skipped forward; it is improper to skip forward over any records following the one last written on that tape. For example, the sequence ``OUT 100(3); IOC -1(3); IN 2000(3)'' writes out one hundred words onto tape 3, then reads it back in again. Unless the tape reliability is questioned, the last two instructions of that sequence are only a slow way to move words 1000-1099 to locations 2000-2099. The sequence ``OUT 1000(3); IOC +1(3)'' is improper. Disk or drum: M should be zero. The effect is to position the device according to rX so that the next IN or OUT operation on this unit will take less time if it uses the same rX setting. Printer: M should be zero. ``IOC 0(18)'' skips the printer to the top of the following page. Paper tape reader: Rewind the tape. (M should be zero). * JRED (jump ready). C=38; F=unit. A jump occurs if the specified unit is ready, i.e., finished with the preceding operation initiated by IN, OUT, or IOC. * JBUS (jump busy). C=34; F=unit. Same as JRED except the jump occurs under the opposite circumstances, i.e., when the specified unit is -not- ready. Example: In location 1000, the instruction ``JBUS 1000(16)'' will be executed repeatedly until unit 16 is ready. The simple operations above complete MIX's repertoire of input-output instructions. There is no ``tape check'' indicator, etc... Conversion Operators. * NUM (convert to numeric). This operation is used to change the character code into numeric code. M is ignored. Registers A, X are assumed to contain a 10-byte number in character code; the NUM instruction sets the magnitude of rA equal to the numerical value of this number (treated as a decimal number). The value of rX and the sign of rA are unchanged. Bytes 00, 10, 20, 30, 40, ... convert to the digit zero; bytes 01, 11, 21, ... convert to the digit one; etc. Overflow is possible, and in this case the remainder modulo the word size is retained. * CHAR (convert to characters). This operation is used to change numeric code into character code suitable for output to cards or printer. The value in rA is converted into a 10-byte decimal number which is put into register A and X in character code. The signs of rA, rX are unchanged. M is ignored. ... Timing. To give quantitative information as to how ``good'' MIX programs are, each of MIX's operations is assigned an execution time typical for present-day computers. ADD, SUB, all LOAD operations, all STORE operations (including STZ), all shift commands, and all comparison operations take two units of time. MOVE requires one unit plus two for each word moved. MUL requires 10 and DIV requires 12 units. Execution time for floating-point operations is unspecified. All remaining operations take one unit of time, plus the time the computer may be idle on the IN, OUT, IOC, or HLT instructions. Note in particular that ENTA takes on unit of time, while LDA takes two units. The timing rules are easily remembered because of the fact that, except for shifts, MUL, and DIV, the number of units equals the number of references to memory (including the reference to the instruction itself). The ``unit'' of time is a relative measure which we will denote simply by u. It may be regarded as, say, 10 microseconds (for a relatively inexpensive computer) or as 1 microsecond (for a relatively high-priced machine). Example: the sequence LDA 1000; INCA 1; STA 1000 takes exactly 5u. mdk-1.2.9/doc/mdk_bugs.texi0000644000175000017500000000137612112755472012467 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Problems, Copying, mixguile, Top @chapter Reporting Bugs @cindex bugs @cindex problems @cindex questions @cindex suggestions If you have any questions, comments or suggestions, please send electronic mail to @email{jao@@gnu.org, the author}. If you find a bug in @sc{mdk}, please send electronic mail to @email{bug-mdk@@gnu.org, the @sc{mdk} bug list}. In your report, please include the version number, which you can find by running @w{@samp{mixasm --version}}. Also include in your message the output that the program produced and the output you expected. mdk-1.2.9/doc/mdk.info0000644000175000017500000100111712636571204011423 00000000000000This is mdk.info, produced by makeinfo version 6.0 from mdk.texi. This manual is for GNU MDK (version 1.2.9, November, 2015), a set of utilities for developing programs using Donald Knuth's MIX mythical computer and MIXAL, its assembly language. Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013, 2014, 2015 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being "GNU General Public License", with the Front-Cover Texts being "A GNU Manual," and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled "GNU Free Documentation License". (a) The FSF's Back-Cover Text is: "You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom." INFO-DIR-SECTION GNU programming tools START-INFO-DIR-ENTRY * MDK: (mdk). The GNU MIX Development Kit. END-INFO-DIR-ENTRY  File: mdk.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) This manual is for GNU MDK (version 1.2.9, November, 2015), a set of utilities for developing programs using Donald Knuth's MIX mythical computer and MIXAL, its assembly language. Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013, 2014, 2015 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being "GNU General Public License", with the Front-Cover Texts being "A GNU Manual," and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled "GNU Free Documentation License". (a) The FSF's Back-Cover Text is: "You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom." GNU MDK was written and designed by Jose Antonio Ortega Ruiz. Pieter E. J. Pareit is the author of the Emacs 'MIXAL' mode (*note MIXAL mode::), and has also contributed many bug fixes. Philip E. King has contributed to this package development with many helpful discussions, as well as actual code (*note GUD integration::). Michael Scholz is the author of the German translation of MDK's user interface. * Menu: * Introduction:: * Acknowledgments:: * Installing MDK:: Installing GNU MDK from the source tarball. * MIX and MIXAL tutorial:: Learn the innards of MIX and MIXAL. * Getting started:: Basic usage of the MDK tools. * Emacs tools:: Programming the MIX using Emacs. * mixasm:: Invoking the MIXAL assembler. * mixvm:: Invoking and using the MIX virtual machine. * gmixvm:: Invoking and using the GTK+ virtual machine. * mixguile:: Invoking and using the Scheme virtual machine. * Problems:: Reporting bugs. * Copying:: MDK licensing terms. * Concept Index:: Index of concepts. * Instructions and commands:: Index of MIXAL instructions and MIXVM commands. -- The Detailed Node Listing -- Installing MDK * Download:: * Requirements:: * Basic installation:: * Emacs support:: * Special configure flags:: * Supported platforms:: MIX and MIXAL tutorial * The MIX computer:: Architecture and instruction set of the MIX computer. * MIXAL:: The MIX assembly language. The MIX computer * MIX architecture:: * MIX instruction set:: MIX instruction set * Instruction structure:: * Loading operators:: * Storing operators:: * Arithmetic operators:: * Address transfer operators:: * Comparison operators:: * Jump operators:: * Input-output operators:: * Conversion operators:: * Shift operators:: * Miscellaneous operators:: * Execution times:: MIXAL * Basic structure:: Writing basic MIXAL programs. * MIXAL directives:: Assembler directives. * Expressions:: Evaluation of expressions. * W-expressions:: Evaluation of w-expressions. * Local symbols:: Special symbol table entries. * Literal constants:: Specifying an immediate operand. Getting started * Writing a source file:: A sample MIXAL source file. * Compiling:: Using 'mixasm' to compile source files into binary format. * Running the program:: Running and debugging your programs. * Using mixguile:: Using the Scheme interpreter to run and debug your programs. * Using Scheme in mixvm and gmixvm:: Running the program * Non-interactive mode:: Running your programs non-interactively. * Interactive mode:: Running programs interactively. * Debugging:: Commands for debugging your programs. Using 'mixguile' * The mixguile shell:: Using the Scheme MIX virtual machine. * Additional functions:: Scheme functions accessing the VM. * Defining new functions:: Defining your own Scheme functions. * Hook functions:: Using command and break hook functions. * Scheme scripts:: Hook functions * Command hooks:: * Break hooks:: Emacs tools * MIXAL mode:: Editing MIXAL files. * GUD integration:: Invoking 'mixvm' within Emacs. MIXAL mode * Basics:: Editing code, font locking and indentation. * Help system:: Using the interactive help system. * Compiling and running:: Invoking compiler and/or virtual machine. 'mixasm', the MIXAL assembler * Invoking mixasm:: 'mixvm', the MIX computer simulator * Invocation:: * Commands:: Commands available in interactive mode. * Devices:: MIX block devices implementation. Interactive commands * File commands:: Loading and executing programs. * Debug commands:: Debugging programs. * State commands:: Inspecting the virtual machine state. * Configuration commands:: Changing and storing mixvm settings. * Scheme commands:: 'gmixvm', the GTK virtual machine * Invoking gmixvm:: * MIXVM console:: Using 'mixvm' commands. * MIX virtual machine:: The MIX virtual machine window. * MIXAL source view:: Viewing the MIXAL source code. * MIX devices view:: Device output. * Menu and status bars:: Available menu commands. 'mixguile', the Scheme virtual machine * Invoking mixguile:: Command line options. * Scheme functions reference:: Scheme functions accessing the VM. Scheme functions reference * mixvm wrappers:: Functions invoking mixvm commands. * Hooks:: Adding hooks to mixvm commands. * Additional VM functions:: Functions accessing the MIX virtual machine. Copying * GNU General Public License:: * GNU Free Documentation License::  File: mdk.info, Node: Introduction, Next: Acknowledgments, Prev: Top, Up: Top Introduction ************ In his book series 'The Art of Computer Programming' (published by Addison Wesley), D. Knuth uses an imaginary computer, the MIX, and its associated machine-code and assembly languages to illustrate the concepts and algorithms as they are presented. The MIX's architecture is a simplified version of those found in real CISC CPUs, and the MIX assembly language (MIXAL) provides a set of primitives that will be very familiar to any person with a minimum experience in assembly programming. The MIX/MIXAL definition is powerful and complete enough to provide a virtual development platform for writing quite complex programs, and close enough to real computers to be worth using when learning programming techniques. At any rate, if you want to learn or improve your programming skills, a MIX development environment would come in handy. The MDK package aims at providing such virtual development environment on a GNU box. Thus, MDK offers you a set of utilities to simulate the MIX computer and to write, compile, run and debug MIXAL programs. As of version 1.2.9, MDK includes the following programs: 'mixasm' MIXAL assembler. Assembler which translates MIXAL source files into programs that can be run (and debugged) by 'mixvm', 'mixguile' or 'gmixvm'. 'mixvm' MIX virtual machine. Emulation of the MIX computer with a CLI. 'gmixvm' A GTK+ GUI for the MIX virtual machine. Provides all of 'mixvm' functionality accessible through a graphical interface. 'mixguile' A Guile shell, with an embedded MIX virtual machine and built-in commands to manipulate it using Scheme. 'mixal-mode.el' An Emacs major mode for MIXAL source files editing, providing syntax highlighting, documentation lookup and invocation of 'mixvm' within Emacs. 'mixvm.el' This elisp program allows running 'mixvm' inside an Emacs GUD buffer, providing concurrent edition and debugging of MIXAL programs. 'mixvm' and 'gmixvm' implement a simulator of the MIX computer, giving you a virtual machine for executing and debugging MIX programs. These binary programs could be written by hand, but it is easier to produce them compiling MIXAL source files, using the MIXAL assembler 'mixasm'. On the other hand, 'mixguile' offers you the possibility of manipulating a MIX virtual machine through a set of Scheme functions, so that you can use this programming language to interact with the virtual machine. In addition, 'mixvm' and 'gmixvm' are also able to interpret Scheme scripts (using an embedded Guile interpreter), that is, you can use Scheme as an extension language to add new functionalities to these programs. This manual gives you a tutorial of MIX and MIXAL, and a thorough description of the use of the MDK utilities.  File: mdk.info, Node: Acknowledgments, Next: Installing MDK, Prev: Introduction, Up: Top Acknowledgements **************** Many people have further contributed to MDK by reporting problems, suggesting various improvements, or submitting actual code. Here is a list of these people. Please, help me keep it complete and exempt of errors. * Philip Ellis King provided MIXAL test programs pinpointing bugs in the first MDK release, and useful discussions as well. Philip has also contributed with the Emacs port of 'mixvm' and influenced the 'gmixvm' GUI design with insightful comments and prototypes. * Aleix Conchillo has been following MDK's development for many years, indefatigably chasing and fixing bugs, and suggesting many improvements. He's also the original author of the Fink and Macports ports. * Pieter E J Pareit is the author of the Emacs MIXAL mode, and has also contributed many bug fixes. * Michael Scholz is the author of the German translation of MDK's user interface. * Sergey Poznyakoff provided patches to mixlib/mix_scanner.l improving MIXAL compliance. * Sergey Litvin implemented the instructions 'SLB', 'SRB', 'JAE', 'JAO', 'JXE', and 'JXO' from volume 2 of TAOCP. * Francesc Xavier Noria kindly and thoroughly reviewed the MDK documentation, providing insightful advice. * Eric S. Raymond contributed the documentation file 'MIX.DOC' and the samples 'elevator.mixal' and 'mistery.mixal' from his MIXAL package. * Nelson H. F. Beebe has tested MDK in a lot of Unix platforms, suggesting portability enhancements to the source code. * Ryan Schmidt, Agustin Navarro, Ying-Chieh Liao, Adrian Bunk, Baruch Even, and Ronald Cole ported MDK to different platforms, and created and/or maintain packages for it. * Jason Uhlenkott, Andrew Hood, Radu Butnaru, Ruslan Batdalov, WeiZheng, Sascha Wilde, Michael Vernov and Xiaofeng Zhao reported bugs and suggested fixes to them. * Joshua Davies, Eli Bendersky, Milan Bella and Jens Seidel reported bugs on the documentation. * Christoph von Nathusius, Stephen Ramsay and Johan Swanljung tested MDK on different platforms, and helped fixing the configuration process in them. * Richard Stallman suggested various improvements to the documentation and has always kept an eye on each MDK release. * MDK was inspired by Darius Bacon's MIXAL program (http://www.accesscom.com/~darius/).  File: mdk.info, Node: Installing MDK, Next: MIX and MIXAL tutorial, Prev: Acknowledgments, Up: Top 1 Installing MDK **************** * Menu: * Download:: * Requirements:: * Basic installation:: * Emacs support:: * Special configure flags:: * Supported platforms::  File: mdk.info, Node: Download, Next: Requirements, Prev: Installing MDK, Up: Installing MDK 1.1 Download the source tarball =============================== GNU MDK is distributed as a source tarball available for download in the following URLs: * * GNU mirrors (http://www.gnu.org/prep/ftp.html) The above sites contain the latest stable releases of MDK. The development branch is available as a Git (http://git-scm.com/) repository located at(1) (*note Download-Footnote-1::) * After you have downloaded the source tarball, unpack it in a directory of your choice using the command: tar xfvz mdk-X.Y.tar.gz where X.Y stands for the downloaded version (the current stable release being version 1.2.9).  File: mdk.info, Node: Download-Footnotes, Up: Download (1) See MDK's Git page (https://savannah.gnu.org/git/?group=mdk) for more information on using the unstable source tree. Note, however, that the rest of this manual is about the _stable_ release.  File: mdk.info, Node: Requirements, Next: Basic installation, Prev: Download, Up: Installing MDK 1.2 Requirements ================ In order to build and install MDK, you will need the following libraries installed in your system: - GLIB 2.16.0 (http://www.gtk.org) (required) - GNU Flex 2.5 (http://www.gnu.org/software/flex/flex.html) (required) - GTK 2.16.0 (http://www.gtk.org) (optional) - Libglade 2.6.0 (http://ftp.gnome.org/pub/GNOME/sources/libglade/2.6/) (optional) - GNU Readline (http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) (optional) - GNU Libguile 2.0 (http://www.gnu.org/software/guile) (optional) If present, readline and history are used to provide command completion and history management to the command line MIX virtual machine, 'mixvm'. GTK+ and libglade are needed if you want to build the graphical interface to the MIX virtual machine, 'gmixvm'. Finally, if libguile is found, the MDK utilities will be compiled with Guile support and will be extensible using Scheme. *Please note*: you need both the libraries _and_ the headers; this means both the library package and the '-dev' package if you do not compile your libraries yourself (ex: installing 'libgtk2.0-0' and 'libgtk2.0-0-dev' on Debian).  File: mdk.info, Node: Basic installation, Next: Emacs support, Prev: Requirements, Up: Installing MDK 1.3 Basic installation ====================== MDK uses GNU Autoconf and Automake tools, and, therefore, should be built and installed without hassle using the following commands inside the source directory: ./configure make make install where the last one must be run as root. The first command, 'configure', will setup the makefiles for your system. In particular, 'configure' will look for GTK+ and libglade, and, if they are present, will generate the appropriate makefiles for building the 'gmixvm' graphical user interface. Upon completion, you should see a message with the configuration results like the following: *** GNU MDK 1.2.9 has been successfully configured. *** Type 'make' to build the following utilities: - mixasm (MIX assembler) - mixvm (MIX virtual machine, with readline support, with guile support) - gmixvm (mixvm GTK+ GUI, with guile support) - mixguile (the mixvm guile shell) where the last lines may be missing if you lack the above mentioned libraries. The next command, 'make', will actually build the MDK programs in the following locations: - 'mixutils/mixasm' - 'mixutils/mixvm' - 'mixgtk/gmixvm' - 'mixguile/mixguile' You can run these programs from within their directories, but I recommend you to install them in proper locations using 'make install' from a root shell.  File: mdk.info, Node: Emacs support, Next: Special configure flags, Prev: Basic installation, Up: Installing MDK 1.4 Emacs support ================= MDK includes extensive support for Emacs. Upon installation, all the elisp code is installed in 'PREFIX/share/mdk', where 'PREFIX' stands for your installation root directory (e.g. '/usr/local'). You can copy the elisp files to a directory that is in your load-path, or you can add the above directory to it. Assuming that the installing prefix is '/usr/local', you can do it by adding to your '.emacs' file the following line: (setq load-path (cons "/usr/local/share/mdk" load-path)) 'MIXAL' programs can be written using Emacs and the elisp program 'share/mdk/mixal-mode.el', contributed by Pieter E. J. Pareit. It provides font locking, interactive help, compiling assistance and invocation of the 'MIX' virtual machine via a new major mode called 'mixal-mode'. To start 'mixal-mode' automatically whenever you edit a 'MIXAL' source file, add the following lines to your '.emacs' file: (autoload 'mixal-mode "mixal-mode" t) (add-to-list 'auto-mode-alist '("\\.mixal\\'" . mixal-mode)) In addition, 'mixvm' can be run within an Emacs GUD buffer using the elisp program 'share/mdk/mixvm.el', contributed by Philip E. King. 'mixvm.el' provides an interface between MDK's 'mixvm' and Emacs, via GUD. Place this file in your load-path, optionally adding the following line to your '.emacs' file: (autoload 'mixvm "mixvm" "mixvm/gud interaction" t)  File: mdk.info, Node: Special configure flags, Next: Supported platforms, Prev: Emacs support, Up: Installing MDK 1.5 Special configure flags =========================== You can fine-tune the configuration process using the following switches with configure: -- User Option: --enable-gui[=yes|no] -- User Option: --disable-gui Enables/disables the build of the MIX virtual machine GUI ('gmixvm'). If the required libraries are missing (*note Requirements::) the configure script with automatically disable this feature. -- User Option: --with-guile[=yes|no] -- User Option: --without-guile Enables/disables the Guile support for 'mixvm' and 'gmixvm', and the build of 'mixguile'. If the required libraries are missing (*note Requirements::) the configure script with automatically disable this feature. -- User Option: --with-readline[=yes|no] -- User Option: --without-readline Enables/disables the GNU Readline support for 'mixvm'. If the required libraries are missing (*note Requirements::) the configure script with automatically disable this feature. For additional, boilerplate configure options, see the 'INSTALL' file, or run configure --help  File: mdk.info, Node: Supported platforms, Prev: Special configure flags, Up: Installing MDK 1.6 Supported platforms ======================= GNU MDK has been tested in the following platforms: * Debian GNU/Linux 2.2, 2.3, 3.0, 3.1, 3.2, 4.0, 5.0, 6.0, sid * Redhat GNU/Linux 8.0 (Ronald Cole), 7.0 (Agustin Navarro), 6.2 (Roberto Ferrero) * Mandrake 8.0 (Agustin Navarro) * FreeBSD 4.2, 4.3, 4.4, 4.5 (Ying-Chieh Liao), 5.2 * Solaris 2.8/gcc 2.95.3 (Stephen Ramsay) * MS Windows 98 SE/Cygwin 1.1.8-2 (Christoph von Nathusius)(1) (*note Supported platforms-Footnote-1::) * Mac OS X 10.1.2 (Johan Swanljung), Mac OS X 10.4.x, 10.5 (Darwin Port by Aleix Conchillo). * AMD Athlon, GNU/Linux version 2.4.2-2smp (Red Hat 7.1 (Seawolf)) (N. H. F. Beebe) * Apple PowerPC G3, GNU/Linux 2.2.18-4hpmac (Red Hat Linux/PPC 2000 Q4) (N. H. F. Beebe) * DEC Alpha, GNU/Linux 2.2.19-6.2.1 (Red Hat 6.2) (N. H. F. Beebe) * Compaq/DEC Alpha OSF/1 4.0F [ONLY after adding rsync's snprintf() implementation] (N. H. F. Beebe) * IBM PowerPC AIX 4.2 (N. H. F. Beebe) * Intel Pentium III, GNU/Linux 2.4.9-31smp (Red Hat 7.2 (Enigma)) (N. H. F. Beebe) * SGI Origin 200, IRIX 6.5 (N. H. F. Beebe) * Sun SPARC, GNU/Linux 2.2.19-6.2.1 (Red Hat 6.2) (N. H. F. Beebe) * Sun SPARC, Solaris 2.8 (N. H. F. Beebe) MDK will probably work on any GNU/Linux or BSD platform. If you try it in a platform not listed above, please send a mail to the author .  File: mdk.info, Node: Supported platforms-Footnotes, Up: Supported platforms (1) Caveats: Christoph has only tested 'mixvm' and 'mixasm' on this platform, using 'gcc' 2.95.3-2, 'GLIB' 1.2.10 and 'GNU readline' 4.1-2. He has reported missing history functionalities on a first try. If you find problems with history/readline functionality, please try a newer/manually installed readline version.  File: mdk.info, Node: MIX and MIXAL tutorial, Next: Getting started, Prev: Installing MDK, Up: Top 2 MIX and MIXAL tutorial ************************ In the book series 'The Art of Computer Programming', by D. Knuth, a virtual computer, the MIX, is used by the author (together with the set of binary instructions that the virtual CPU accepts) to illustrate the algorithms and skills that every serious programmer should master. Like any other real computer, there is a symbolic assembler language that can be used to program the MIX: the MIX assembly language, or MIXAL for short. In the following subsections you will find a tutorial on these topics, which will teach you the basics of the MIX architecture and how to program a MIX computer using MIXAL. * Menu: * The MIX computer:: Architecture and instruction set of the MIX computer. * MIXAL:: The MIX assembly language.  File: mdk.info, Node: The MIX computer, Next: MIXAL, Prev: MIX and MIXAL tutorial, Up: MIX and MIXAL tutorial 2.1 The MIX computer ==================== In this section, you will find a description of the MIX computer, its components and instruction set. * Menu: * MIX architecture:: * MIX instruction set::  File: mdk.info, Node: MIX architecture, Next: MIX instruction set, Prev: The MIX computer, Up: The MIX computer 2.1.1 MIX architecture ---------------------- The basic information storage unit in the MIX computer is the "byte", which stores positive values in the range 0-63 . Note that a MIX byte can be then represented as 6 bits, instead of the common 8 bits for a _regular_ byte. Unless otherwise stated, we shall use the word "byte" to refer to a MIX 6-bit byte. A MIX "word" is defined as a set of 5 bytes plus a sign. The bytes within a word are numbered from 1 to 5, being byte number one the most significant one. The sign is denoted by index 0. Graphically, ----------------------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | ----------------------------------------------- | +/- | byte | byte | byte | byte | byte | ----------------------------------------------- Sample MIX words are '- 12 00 11 01 63' and '+ 12 11 34 43 00'. You can refer to subfields within a word using a "field specification" or "fspec" of the form "(L:R)", where L denotes the first byte, and R the last byte of the subfield. When L is zero, the subfield includes the word's sign. An fspec can also be represented as a single value 'F', given by 'F = 8*L + R' (thus the fspec '(1:3)', denoting the first three bytes of a word, is represented by the integer 11). The MIX computer stores information in "registers", that can store either a word or two bytes and sign (see below), and "memory cells", each one containing a word. Specifically, the MIX computer has 4000 memory cells with addresses 0 to 3999 (i.e., two bytes are enough to address a memory cell) and the following registers: 'rA' A register. General purpose register holding a word. Usually its contents serves as the operand of arithmetic and storing instructions. 'rX' X register. General purpose register holding a word. Often it acts as an extension or a replacement of 'rA'. 'rJ' J (jump) register. This register stores positive two-byte values, usually representing a jump address. 'rI1', 'rI2', 'rI3', 'rI4', 'rI5', 'rI6' Index registers. These six registers can store a signed two-byte value. Their contents are used as indexing values for the computation of effective memory addresses. In addition, the MIX computer contains: - An "overflow toggle" (a single bit with values "on" or "off"). In this manual, this toggle is denoted OV. - A "comparison indicator" (having three values: "EQUAL", "GREATER" or "LESS"). In this manual, this indicator is denoted CM, and its possible values are abbreviated as "E", "G" and "L". - Input-output block devices. Each device is labelled as 'un', where 'n' runs from 0 to 20. In Knuth's definition, 'u0' through 'u7' are magnetic tape units, 'u8' through '15' are disks and drums, 'u16' is a card reader, 'u17' is a card writer, 'u18' is a line printer and, 'u19' is a typewriter terminal, and 'u20', a paper tape. Our implementation maps these devices to disk files, except for 'u19', which represents the standard output. As noted above, the MIX computer communicates with the external world by a set of input-output devices which can be "connected" to it. The computer interchanges information using blocks of words whose length depends on the device at hand (*note Devices::). These words are interpreted by the device either as binary information (for devices 0-16), or as representing printable characters (devices 17-20). In the last case, each MIX byte is mapped onto a character according to the following table: 00 01 A 02 B 03 C 04 D 05 E 06 F 07 G 08 H 09 I 10 ~ 11 J 12 K 13 L 14 M 15 N 16 O 17 P 18 Q 19 R 20 [ 21 # 22 S 23 T 24 U 25 V 26 W 27 X 28 Y 29 Z 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 38 8 39 9 40 . 41 , 42 ( 43 ) 44 + 45 - 46 * 47 / 48 = 49 $ 50 < 51 > 52 @ 53 ; 54 : 55 ' The value 0 represents a whitespace. The characters '~', '[' and '#' correspond to symbols not representable as ASCII characters (uppercase delta, sigma and gamma, respectively), and byte values 56-63 have no associated character. Finally, the MIX computer features a virtual CPU which controls the above components, and which is able to execute a rich set of instructions (constituting its machine language, similar to those commonly found in real CPUs), including arithmetic, logical, storing, comparison and jump instructions. Being a typical von Neumann computer, the MIX CPU fetches binary instructions from memory sequentially (unless a jump instruction is found), and stores the address of the next instruction to be executed in an internal register called "location counter" (also known as program counter in other architectures). The next section, *Note MIX instruction set::, gives a complete description of the available MIX binary instructions.  File: mdk.info, Node: MIX instruction set, Prev: MIX architecture, Up: The MIX computer 2.1.2 MIX instruction set ------------------------- The following subsections fully describe the instruction set of the MIX computer. We begin with a description of the structure of binary instructions and the notation used to refer to their subfields. The remaining subsections are devoted to describing the actual instructions available to the MIX programmer. * Menu: * Instruction structure:: * Loading operators:: * Storing operators:: * Arithmetic operators:: * Address transfer operators:: * Comparison operators:: * Jump operators:: * Input-output operators:: * Conversion operators:: * Shift operators:: * Miscellaneous operators:: * Execution times::  File: mdk.info, Node: Instruction structure, Next: Loading operators, Prev: MIX instruction set, Up: MIX instruction set 2.1.2.1 Instruction structure ............................. MIX "instructions" are codified as words with the following subfield structure: _Subfield_ _fspec_ _Description_ ADDRESS (0:2) The first two bytes plus sign are the "address" field. Combined with the INDEX field, denotes the memory address to be used by the instruction. INDEX (3:3) The third byte is the "index", normally used for indexing the address(1) (*note Instruction structure-Footnote-1::). MOD (4:4) Byte four is used either as an operation code modifier or as a field specification. OPCODE (5:5) The last (least significant) byte in the word denotes the operation code. or, graphically, ------------------------------------------------ | 0 | 1 | 2 | 3 | 4 | 5 | ------------------------------------------------ | ADDRESS | INDEX | MOD | OPCODE | ------------------------------------------------ For a given instruction, 'M' stands for the memory address obtained after indexing the ADDRESS subfield (using its INDEX byte), and 'V' is the contents of the subfield indicated by MOD of the memory cell with address 'M'. For instance, suppose that we have the following contents of MIX registers and memory cells: [rI2] = + 00 63 [31] = - 10 11 00 11 22 where '[n]' denotes the contents of the nth memory cell and '[rI2]' the contents of register 'rI2'(2) (*note Instruction structure-Footnote-2::). Let us consider the binary instruction 'I = - 00 32 02 11 10'. For this instruction we have: ADDRESS = - 00 32 = -32 INDEX = 02 = 2 MOD = 11 = (1:3) OPCODE = 10 M = ADDRESS + [rI2] = -32 + 63 = 31 V = [M](MOD) = (- 10 11 00 11 22)(1:3) = + 00 00 10 11 00 Note that, when computing 'V' using a word and an fspec, we apply a left padding to the bytes selected by 'MOD' to obtain a complete word as the result. In the following subsections, we will assign to each MIX instruction a mnemonic, or symbolic name. For instance, the mnemonic of 'OPCODE' 10 is 'LD2'. Thus we can rewrite the above instruction as LD2 -32,2(1:3) or, for a generic instruction: MNEMONIC ADDRESS,INDEX(MOD) Some instructions are identified by both the OPCODE and the MOD fields. In these cases, the MOD will not appear in the above symbolic representation. Also when ADDRESS or INDEX are zero, they can be omitted. Finally, MOD defaults to (0:5) (meaning the whole word).  File: mdk.info, Node: Instruction structure-Footnotes, Up: Instruction structure (1) The actual memory address the instruction refers to, is obtained by adding to ADDRESS the value of the 'rI' register denoted by INDEX. (2) In general, '[X]' will denote the contents of entity 'X'; thus, by definition, 'V = [M](MOD)'.  File: mdk.info, Node: Loading operators, Next: Storing operators, Prev: Instruction structure, Up: MIX instruction set 2.1.2.2 Loading operators ......................... The following instructions are used to load memory contents into a register. 'LDA' Put in rA the contents of cell no. M. OPCODE = 8, MOD = fspec. 'rA <- V'. 'LDX' Put in rX the contents of cell no. M. OPCODE = 15, MOD = fspec. 'rX <- V'. 'LDi' Put in rIi the contents of cell no. M. OPCODE = 8 + i, MOD = fspec. 'rIi <- V'. 'LDAN' Put in rA the contents of cell no. M, with opposite sign. OPCODE = 16, MOD = fspec. 'rA <- -V'. 'LDXN' Put in rX the contents of cell no. M, with opposite sign. OPCODE = 23, MOD = fspec. 'rX <- -V'. 'LDiN' Put in rIi the contents of cell no. M, with opposite sign. OPCODE = 16 + i, MOD = fspec. 'rIi <- -V'. In all the above load instructions the 'MOD' field selects the bytes of the memory cell with address 'M' which are loaded into the requisite register (indicated by the 'OPCODE'). For instance, the word '+ 00 13 01 27 11' represents the instruction LD3 13,1(3:3) ^ ^ ^ ^ | | | | | | | --- MOD = 27 = 3*8 + 3 | | --- INDEX = 1 | --- ADDRESS = 00 13 --- OPCODE = 11 Let us suppose that, prior to this instruction execution, the state of the MIX computer is the following: [rI1] = - 00 01 [rI3] = + 24 12 [12] = - 01 02 03 04 05 As, in this case, 'M = 13 + [rI1] = 12', we have V = [M](3:3) = (- 01 02 03 04 05)(3:3) = + 00 00 00 00 03 (note that the specified subfield is left-padded with null bytes to complete a word). Hence, the MIX state, after the instruction execution, will be [rI1] = - 00 01 [rI3] = + 00 03 [12] = - 01 02 03 04 05 To further illustrate loading operators, the following table shows the contents of 'rX' after different 'LDX' instructions: 'LDX 12(0:0) [rX] = - 00 00 00 00 00' 'LDX 12(0:1) [rX] = - 00 00 00 00 01' 'LDX 12(3:5) [rX] = + 00 00 03 04 05' 'LDX 12(3:4) [rX] = + 00 00 00 03 04' 'LDX 12(0:5) [rX] = - 01 02 03 04 05'  File: mdk.info, Node: Storing operators, Next: Arithmetic operators, Prev: Loading operators, Up: MIX instruction set 2.1.2.3 Storing operators ......................... The following instructions are the inverse of the load operations: they are used to store a subfield of a register into a memory location. Here, MOD represents the subfield of the memory cell that is to be overwritten with bytes from a register. These bytes are taken beginning by the rightmost side of the register. 'STA' Store rA. OPCODE = 24, MOD = fspec. 'V <- rA'. 'STX' Store rX. OPCODE = 31, MOD = fspec. 'V <- rX'. 'STi' Store rIi. OPCODE = 24 + i, MOD = fspec. 'V <- rIi'. 'STJ' Store rJ. OPCODE = 32, MOD = fspec. 'V <- rJ'. 'STZ' Store zero. OPCODE = 33, MOD = fspec. 'V <- 0'. By way of example, consider the instruction 'STA 1200(2:3)'. It causes the MIX to fetch bytes no. 4 and 5 of register A and copy them to bytes 2 and 3 of memory cell no. 1200 (remember that, for these instructions, MOD specifies a subfield of _the memory address_). The other bytes of the memory cell retain their values. Thus, if prior to the instruction execution we have [1200] = - 20 21 22 23 24 [rA] = + 01 02 03 04 05 we will end up with [1200] = - 20 04 05 23 24 [rA] = + 01 02 03 04 05 As a second example, 'ST2 1000(0)' will set the sign of '[1000]' to that of '[rI2]'.  File: mdk.info, Node: Arithmetic operators, Next: Address transfer operators, Prev: Storing operators, Up: MIX instruction set 2.1.2.4 Arithmetic operators ............................ The following instructions perform arithmetic operations between rA and rX register and memory contents. 'ADD' Add and set OV if overflow. OPCODE = 1, MOD = fspec. 'rA <- rA +V'. 'SUB' Sub and set OV if overflow. OPCODE = 2, MOD = fspec. 'rA <- rA - V'. 'MUL' Multiply V times rA and store the 10-bytes product in rAX. OPCODE = 3, MOD = fspec. 'rAX <- rA x V'. 'DIV' rAX is considered a 10-bytes number, and it is divided by V. OPCODE = 4, MOD = fspec. 'rA <- rAX / V', 'rX' <- reminder. In all the above instructions, '[rA]' is one of the operands of the binary arithmetic operation, the other being 'V' (that is, the specified subfield of the memory cell with address 'M'), padded with zero bytes on its left-side to complete a word. In multiplication and division, the register 'X' comes into play as a right-extension of the register 'A', so that we are able to handle 10-byte numbers whose more significant bytes are those of 'rA' (the sign of this 10-byte number is that of 'rA': 'rX''s sign is ignored). Addition and subtraction of MIX words can give rise to overflows, since the result is stored in a register with room to only 5 bytes (plus sign). When this occurs, the operation result modulo 1,073,741,823 (the maximum value storable in a MIX word) is stored in 'rA', and the overflow toggle is set to TRUE.  File: mdk.info, Node: Address transfer operators, Next: Comparison operators, Prev: Arithmetic operators, Up: MIX instruction set 2.1.2.5 Address transfer operators .................................. In these instructions, 'M' (the address of the instruction after indexing) is used as a number instead of as the address of a memory cell. Consequently, 'M' can have any valid word value (i.e., it's not limited to the 0-3999 range of a memory address). 'ENTA' Enter 'M' in [rA]. OPCODE = 48, MOD = 2. 'rA <- M'. 'ENTX' Enter 'M' in [rX]. OPCODE = 55, MOD = 2. 'rX <- M'. 'ENTi' Enter 'M' in [rIi]. OPCODE = 48 + i, MOD = 2. 'rIi <- M'. 'ENNA' Enter '-M' in [rA]. OPCODE = 48, MOD = 3. 'rA <- -M'. 'ENNX' Enter '-M' in [rX]. OPCODE = 55, MOD = 3. 'rX <- -M'. 'ENNi' Enter '-M' in [rIi]. OPCODE = 48 + i, MOD = 3. 'rIi <- -M'. 'INCA' Increase [rA] by 'M'. OPCODE = 48, MOD = 0. 'rA <- rA + M'. 'INCX' Increase [rX] by 'M'. OPCODE = 55, MOD = 0. 'rX <- rX + M'. 'INCi' Increase [rIi] by 'M'. OPCODE = 48 + i, MOD = 0. 'rIi <- rIi + M'. 'DECA' Decrease [rA] by 'M'. OPCODE = 48, MOD = 1. 'rA <- rA - M'. 'DECX' Decrease [rX] by 'M'. OPCODE = 55, MOD = 1. 'rX <- rX - M'. 'DECi' Decrease [rIi] by 'M'. OPCODE = 48 + i, MaOD = 0. 'rIi <- rIi - M'. In the above instructions, the subfield 'ADDRESS' acts as an immediate (indexed) operand, and allow us to set directly the contents of the MIX registers without an indirection to the memory cells (in a real CPU this would mean that they are faster that the previously discussed instructions, whose operands are fetched from memory). So, if you want to store in 'rA' the value -2000 (- 00 00 00 31 16), you can use the binary instruction + 31 16 00 03 48, or, symbolically, ENNA 2000 Used in conjunction with the store operations ('STA', 'STX', etc.), these instructions also allow you to set memory cells contents to concrete values. Note that in these address transfer operators, the 'MOD' field is not a subfield specificator, but serves to define (together with 'OPCODE') the concrete operation to be performed.  File: mdk.info, Node: Comparison operators, Next: Jump operators, Prev: Address transfer operators, Up: MIX instruction set 2.1.2.6 Comparison operators ............................ So far, we have learned how to move values around between the MIX registers and its memory cells, and also how to perform arithmetic operations using these values. But, in order to write non-trivial programs, other functionalities are needed. One of the most common is the ability to compare two values, which, combined with jumps, will allow the execution of conditional statements. The following instructions compare the value of a register with 'V', and set the CM indicator to the result of the comparison (i.e. to 'E', 'G' or 'L', equal, greater or lesser respectively). 'CMPA' Compare [rA] with V. OPCODE = 56, MOD = fspec. 'CMPX' Compare [rX] with V. OPCODE = 63, MOD = fspec. 'CMPi' Compare [rIi] with V. OPCODE = 56 + i, MOD = fspec. As explained above, these instructions modify the value of the MIX comparison indicator; but maybe you are asking yourself how do you use this value: enter jump operators, in the next subsection.  File: mdk.info, Node: Jump operators, Next: Input-output operators, Prev: Comparison operators, Up: MIX instruction set 2.1.2.7 Jump operators ...................... The MIX computer has an internal register, called the "location counter", which stores the address of the next instruction to be fetched and executed by the virtual CPU. You cannot directly modify the contents of this internal register with a load instruction: after fetching the current instruction from memory, it is automatically increased in one unit by the MIX. However, there is a set of instructions (which we call jump instructions) which can alter the contents of the location counter provided some condition is met. When this occurs, the value of the next instruction address that would have been fetched in the absence of the jump is stored in 'rJ' (except for 'JSJ'), and the location counter is set to the value of 'M' (so that the next instruction is fetched from this new address). Later on, you can return to the point when the jump occurred reading the address stored in 'rJ'. The MIX computer provides the following jump instructions: With these instructions you force a jump to the specified address. Use 'JSJ' if you do not care about the return address. 'JMP' Unconditional jump. OPCODE = 39, MOD = 0. 'JSJ' Unconditional jump, but rJ is not modified. OPCODE = 39, MOD = 1. These instructions check the overflow toggle to decide whether to jump or not. 'JOV' Jump if OV is set (and turn it off). OPCODE = 39, MOD = 2. 'JNOV' Jump if OV is not set (and turn it off). OPCODE = 39, MOD = 3. In the following instructions, the jump is conditioned to the contents of the comparison flag: 'JL' Jump if '[CM] = L'. OPCODE = 39, MOD = 4. 'JE' Jump if '[CM] = E'. OPCODE = 39, MOD = 5. 'JG' Jump if '[CM] = G'. OPCODE = 39, MOD = 6. 'JGE' Jump if '[CM]' does not equal 'L'. OPCODE = 39, MOD = 7. 'JNE' Jump if '[CM]' does not equal 'E'. OPCODE = 39, MOD = 8. 'JLE' Jump if '[CM]' does not equal 'G'. OPCODE = 39, MOD = 9. You can also jump conditioned to the value stored in the MIX registers, using the following instructions: 'JAN' 'JAZ' 'JAP' 'JANN' 'JANZ' 'JANP' 'JAE' 'JAO' Jump if the content of rA is, respectively, negative, zero, positive, non-negative, non-zero, non-positive, even or odd. OPCODE = 40, MOD = 0, 1, 2, 3, 4, 5, 6, 7. 'JXN' 'JXZ' 'JXP' 'JXNN' 'JXNZ' 'JXNP' 'JXE' 'JXO' Jump if the content of rX is, respectively, negative, zero, positive, non-negative, non-zero, non-positive, even or odd. OPCODE = 47, MOD = 0, 1, 2, 3, 4, 5, 6, 7. 'JiN' 'JiZ' 'JiP' 'JiNN' 'JiNZ' 'JiNP' Jump if the content of rIi is, respectively, negative, zero, positive, non-negative, non-zero or non-positive. OPCODE = 40 + i, MOD = 0, 1, 2, 3, 4, 5.  File: mdk.info, Node: Input-output operators, Next: Conversion operators, Prev: Jump operators, Up: MIX instruction set 2.1.2.8 Input-output operators .............................. As explained in previous sections (*note MIX architecture::), the MIX computer can interact with a series of block devices. To that end, you have at your disposal the following instructions: 'IN' Transfer a block of words from the specified unit to memory, starting at address M. OPCODE = 36, MOD = I/O unit. 'OUT' Transfer a block of words from memory (starting at address M) to the specified unit. OPCODE = 37, MOD = I/O unit. 'IOC' Perform a control operation (given by M) on the specified unit. OPCODE = 35, MOD = I/O unit. 'JRED' Jump to M if the specified unit is ready. OPCODE = 38, MOD = I/O unit. 'JBUS' Jump to M if the specified unit is busy. OPCODE = 34, MOD = I/O unit. In all the above instructions, the 'MOD' subfile must be in the range 0-20, since it denotes the operation's target device. The 'IOC' instruction only makes sense for tape devices ('MOD' = 0-7 or 20): it shifts the read/write pointer by the number of words given by 'M' (if it equals zero, the tape is rewound)(1) (*note Input-output operators-Footnote-1::).  File: mdk.info, Node: Input-output operators-Footnotes, Up: Input-output operators (1) In Knuth's original definition, there are other control operations available, but they do not make sense when implementing the block devices as disk files (as we do in MDK simulator). For the same reason, MDK devices are always ready, since all input-output operations are performed using synchronous system calls.  File: mdk.info, Node: Conversion operators, Next: Shift operators, Prev: Input-output operators, Up: MIX instruction set 2.1.2.9 Conversion operators ............................ The following instructions convert between numerical values and their character representations. 'NUM' Convert rAX, assumed to contain a character representation of a number, to its numerical value and store it in rA. OPCODE = 5, MOD = 0. 'CHAR' Convert the number stored in rA to a character representation and store it in rAX. OPCODE = 5, MOD = 1. Digits are represented in MIX by the range of values 30-39 (digits 0-9). Thus, if the contents of 'rA' and 'rX' are, for instance, [rA] = + 30 30 31 32 33 [rX] = + 31 35 39 30 34 the represented number is 0012315904, and 'NUM' will store this value in 'rA' (i.e., we end up with '[rA]' = + 0 46 62 52 0 = 12315904). If any byte in 'rA' or 'rB' does not belong to the range 30-39, it is interpreted by 'NUM' as the digit obtained by taking its value modulo 10. E.g. values 0, 10, 20, 30, 40, 50, 60 all represent the digit 0; 2, 12, 22, etc. represent the digit 2, and so on. For instance, the number 0012315904 mentioned above could also be represented as [rA] = + 10 40 31 52 23 [rX] = + 11 35 49 20 54 'CHAR' performs the inverse operation, using only the values 30 to 39 for representing digits 0-9.  File: mdk.info, Node: Shift operators, Next: Miscellaneous operators, Prev: Conversion operators, Up: MIX instruction set 2.1.2.10 Shift operators ........................ The following instructions perform byte-wise shifts of the contents of 'rA' and 'rX'. 'SLA' 'SRA' 'SLAX' 'SRAX' 'SLC' 'SRC' Shift rA or rAX left, right, or rAX circularly (see example below) left or right. M specifies the number of bytes to be shifted. OPCODE = 6, MOD = 0, 1, 2, 3, 4, 5. The following instructions perform binary shifts of the contents of 'rA' and 'rX'. 'SLB' 'SRB' Shift rAX left or right binary. M specifies the number of binary places to shift. OPCODE = 6, MOD = 6, 7 If we begin with, say, '[rA]' = - 01 02 03 04 05, we would have the following modifications to 'rA' contents when performing the instructions on the left column: SLA 2 [rA] = - 03 04 05 00 00 SLA 6 [rA] = - 00 00 00 00 00 SRA 1 [rA] = - 00 01 02 03 04 Note that the sign is unaffected by shift operations. On the other hand, 'SLC', 'SRC', 'SLAX', 'SRAX', 'SLB' and 'SRB' treat 'rA' and 'rX' as a single 10-bytes register (ignoring again the signs). For instance, if we begin with '[rA]' = + 01 02 03 04 05 and '[rX]' = - 06 07 08 09 10, we would have: SLC 3 [rA] = + 04 05 06 07 08 [rX] = - 09 10 01 02 03 SLAX 3 [rA] = + 04 05 06 07 08 [rX] = - 09 10 00 00 00 SRC 4 [rA] = + 07 08 09 10 01 [rX] = - 02 03 04 05 06 SRAX 4 [rA] = + 00 00 00 00 01 [rX] = - 02 03 04 05 06 SLB 1 [rA] = + 02 04 06 08 10 [rX] = - 12 14 16 18 20  File: mdk.info, Node: Miscellaneous operators, Next: Execution times, Prev: Shift operators, Up: MIX instruction set 2.1.2.11 Miscellaneous operators ................................ Finally, we list in the following table three miscellaneous MIX instructions which do not fit in any of the previous subsections: 'MOVE' Move MOD words from M to the location stored in rI1. OPCODE = 7, MOD = no. of words. 'NOP' No operation. OPCODE = 0, MOD = 0. 'HLT' Halt. Stops instruction fetching. OPCODE = 5, MOD = 2. The only effect of executing 'NOP' is increasing the location counter, while 'HLT' usually marks program termination.  File: mdk.info, Node: Execution times, Prev: Miscellaneous operators, Up: MIX instruction set 2.1.2.12 Execution times ........................ When writing MIXAL programs (or any kind of programs, for that matter), we shall often be interested in their execution time. Loosely speaking, we will be interested in the answer to the question: how long does it take a program to execute? Of course, this execution time will be a function of the input size, and the answer to our question is commonly given as the asymptotic behaviour as a function of the input size. At any rate, to compute this asymptotic behaviour, we need a measure of how long execution of a single instruction takes in our (virtual) CPU. Therefore, each MIX instruction will have an associated execution time, given in arbitrary units (in a real computer, the value of this unit will depend on the hardware configuration). When our MIX virtual machine executes programs, it will (optionally) give you the value of their execution time based upon the execution time of each single instruction. In the following table, the execution times (in the above mentioned arbitrary units) of the MIX instructions are given. 'NOP' 1 'ADD' 2 'SUB' 2 'MUL' 10 'DIV' 12 'NUM' 10 'CHAR' 10 'HLT' 10 'SLx' 2 'SRx' 2 'LDx' 2 'STx' 2 'JBUS' 1 'IOC' 1 'IN' 1 'OUT' 1 'JRED' 1 'Jx' 1 'INCx' 1 'DECx' 1 'ENTx' 1 'ENNx' 1 'CMPx' 1 'MOVE' 1+2F In the above table, 'F' stands for the number of blocks to be moved (given by the 'FSPEC' subfield of the instruction); 'SLx' and 'SRx' are a short cut for the byte-shifting operations; 'LDx' denote all the loading operations; 'STx' are the storing operations; 'Jx' stands for all the jump operations, and so on with the rest of abbreviations.  File: mdk.info, Node: MIXAL, Prev: The MIX computer, Up: MIX and MIXAL tutorial 2.2 MIXAL ========= In the previous sections we have listed all the available MIX binary instructions. As we have shown, each instruction is represented by a word which is fetched from memory and executed by the MIX virtual CPU. As is the case with real computers, the MIX knows how to decode instructions in binary format (the so-called machine language), but a human programmer would have a tough time if she were to write her programs in machine language. Fortunately, the MIX computer can be programmed using an assembly language, MIXAL, which provides a symbolic way of writing the binary instructions understood by the imaginary MIX computer. If you have used assembler languages before, you will find MIXAL a very familiar language. MIXAL source files are translated to machine language by a MIX assembler, which produces a binary file (the actual MIX program) which can be directly loaded into the MIX memory and subsequently executed. In this section, we describe MIXAL, the MIX assembly language. The implementation of the MIX assembler program and MIX computer simulator provided by MDK are described later on (*note Getting started::). * Menu: * Basic structure:: Writing basic MIXAL programs. * MIXAL directives:: Assembler directives. * Expressions:: Evaluation of expressions. * W-expressions:: Evaluation of w-expressions. * Local symbols:: Special symbol table entries. * Literal constants:: Specifying an immediate operand.  File: mdk.info, Node: Basic structure, Next: MIXAL directives, Prev: MIXAL, Up: MIXAL 2.2.1 Basic program structure ----------------------------- The MIX assembler reads MIXAL files line by line, producing, when required, a binary instruction, which is associated to a predefined memory address. To keep track of the current address, the assembler maintains an internal location counter which is incremented each time an instruction is compiled. In addition to MIX instructions, you can include in MIXAL file assembly directives (or pseudoinstructions) addressed at the assembler itself (for instance, telling it where the program starts and ends, or to reposition the location counter; see below). MIX instructions and assembler directives(1) (*note Basic structure-Footnote-1::) are written in MIXAL (one per source file line) according to the following pattern: [LABEL] MNEMONIC [OPERAND] [COMMENT] where 'OPERAND' is of the form [ADDRESS][,INDEX][(MOD)] Items between square brackets are optional, and 'LABEL' is an alphanumeric identifier (a "symbol") which gets the current value of the location counter, and can be used in subsequent expressions, 'MNEMONIC' is a literal denoting the operation code of the instruction (e.g. 'LDA', 'STA'; see *note MIX instruction set::) or an assembly pseudoinstruction (e.g. 'ORG', 'EQU'), 'ADDRESS' is an expression evaluating to the address subfield of the instruction, 'INDEX' is an expression evaluating to the index subfield of the instruction, which defaults to 0 (i.e., no use of indexing) and can only be used when 'ADDRESS' is present, 'MOD' is an expression evaluating to the mod subfield of the instruction. Its default value, when omitted, depends on 'OPCODE', 'COMMENT' any number of spaces after the operand mark the beginning of a comment, i.e. any text separated by white space from the operand is ignored by the assembler (note that spaces are not allowed within the 'OPERAND' field). Note that spaces are _not_ allowed between the 'ADDRESS', 'INDEX' and 'MOD' fields if they are present. White space is used to separate the label, operation code and operand parts of the instruction(2) (*note Basic structure-Footnote-2::). We have already listed the mnemonics associated with each MIX instruction; sample MIXAL instructions representing MIX instructions are: HERE LDA 2000 HERE represents the current location counter LDX HERE,2(1:3) this is a comment JMP 1234  File: mdk.info, Node: Basic structure-Footnotes, Up: Basic structure (1) We shall call them, collectively, MIXAL instructions. (2) In fact, Knuth's definition of MIXAL restricts the column number at which each of these instruction parts must start. The MIXAL assembler included in MDK, 'mixasm', does not impose such restriction.  File: mdk.info, Node: MIXAL directives, Next: Expressions, Prev: Basic structure, Up: MIXAL 2.2.2 MIXAL directives ---------------------- MIXAL instructions can be either one of the MIX machine instructions (*note MIX instruction set::) or one of the following assembly pseudoinstructions: 'ORIG' Sets the value of the memory address to which following instructions will be allocated after compilation. 'EQU' Used to define a symbol's value, e.g. 'SYM EQU 2*200/3'. 'CON' The value of the given expression is copied directly into the current memory address. 'ALF' Takes as operand five characters, constituting the five bytes of a word which is copied directly into the current memory address. 'END' Marks the end of the program. Its operand gives the start address for program execution. The operand of 'ORIG', 'EQU', 'CON' and 'END' can be any expression evaluating to a constant MIX word, i.e., either a simple MIXAL expression (composed of numbers, symbols and binary operators, *note Expressions::) or a w-expression (*note W-expressions::). All MIXAL programs must contain an 'END' directive, with a twofold end: first, it marks the end of the assembler job, and, in the second place, its (mandatory) operand indicates the start address for the compiled program (that is, the address at which the virtual MIX machine must begin fetching instructions after loading the program). It is also very common (although not mandatory) to include at least an 'ORIG' directive to mark the initial value of the assembler's location counter (remember that it stores the address associated with each compiled MIX instruction). Thus, a minimal MIXAL program would be ORIG 2000 set the initial compilation address NOP this instruction will be loaded at address 2000 HLT and this one at address 2001 END 2000 end of program; start at address 2000 this line is not parsed by the assembler The assembler will generate two binary instructions ('NOP' (+ 00 00 00 00 00) and 'HLT' (+ 00 00 02 05)), which will be loaded at addresses 2000 and 2001. Execution of the program will begin at address 2000. Every MIXAL program should also include a 'HLT' instruction, which will mark the end of program execution (but not of program compilation). The 'EQU' directive allows the definition of symbolic names for specific values. For instance, we could rewrite the above program as follows: START EQU 2000 ORIG START NOP HLT END START which would give rise to the same compiled code. Symbolic constants (or symbols, for short) can also be implicitly defined placing them in the 'LABEL' field of a MIXAL instruction: in this case, the assembler assigns to the symbol the value of the location counter before compiling the line. Hence, a third way of writing our trivial program is ORIG 2000 START NOP HLT END START The 'CON' directive allows you to directly specify the contents of the memory address pointed by the location counter. For instance, when the assembler encounters the following code snippet ORIG 1150 CON -1823473 it will assign to the memory cell number 1150 the contents - 00 06 61 11 49 (which corresponds to the decimal value -1823473). Finally, the 'ALF' directive lets you specify the memory contents as a set of five (optionally quoted) characters, which are translated by the assembler to their byte values, conforming in that way the binary word that is to be stored in the corresponding memory cell. This directive comes in handy when you need to store printable messages in a memory address, as in the following example (1) (*note MIXAL directives-Footnote-1::): OUT MSG MSG is not yet defined here (future reference) MSG ALF "THIS " MSG gets defined here ALF "IS A " ALF "MESSA" ALF "GE. " The above snippet also shows the use of a "future reference", that is, the usage of a symbol ('MSG' in the example) prior of its actual definition. The MIXAL assembler is able to handle future references subject to some limitations which are described in the following section (*note Expressions::). Any line starting with an asterisk is treated as a comment and ignored by the assembler. * This is a comment: this line is ignored. * This line is an error: * must be in column 1. As noted in the previous section, comments can also be located after the 'OPERAND' field of an instruction, separated from it by white space, as in LABEL LDA 100 This is also a comment  File: mdk.info, Node: MIXAL directives-Footnotes, Up: MIXAL directives (1) In the original MIXAL definition, the 'ALF' argument is not quoted. You can write the operand (as the 'ADDRESS' field) without quotes, but, in this case, you must follow the alignment rules of the original MIXAL definition (namely, the 'ADDRESS' must start at column 17).  File: mdk.info, Node: Expressions, Next: W-expressions, Prev: MIXAL directives, Up: MIXAL 2.2.3 Expressions ----------------- The 'ADDRESS', 'INDEX' and 'MOD' fields of a MIXAL instruction can be expressions, formed by numbers, identifiers and binary operators ('+ - * / // :'). '+' and '-' can also be used as unary operators. Operator precedence is from left to right: there is no other operator precedence rule, and parentheses cannot be used for grouping. A stand-alone asterisk denotes the current memory location; thus, for instance, 4+2** evaluates to 6 (4 plus 2) times the current memory location. White space is not allowed within expressions. The special binary operator ':' has the same meaning as in fspecs, i.e., A:B = 8*A + B while 'A//B' stands for the quotient of the ten-byte number 'A' 00 00 00 00 00 (that is, A right-padded with 5 null bytes or, what amounts to the same, multiplied by 64 to the fifth power) divided by 'B'. Sample expressions are: 18-8*3 = 30 14/3 = 4 1+3:11 = 4:11 = 43 1//64 = (01 00 00 00 00 00)/(00 00 00 01 00) = (01 00 00 00 00) Note that all MIXAL expressions evaluate to a MIX word (by definition). All symbols appearing within an expression must be previously defined. Future references are only allowed when appearing standalone (or modified by an unary operator) in the 'ADDRESS' part of a MIXAL instruction, e.g. * OK: stand alone future reference STA -S1(1:5) * ERROR: future reference in expression LDX 2-S1 S1 LD1 2000  File: mdk.info, Node: W-expressions, Next: Local symbols, Prev: Expressions, Up: MIXAL 2.2.4 W-expressions ------------------- Besides expressions, as described above (*note Expressions::), the MIXAL assembler is able to handle the so called "w-expressions" as the operands of the directives 'ORIG', 'EQU', 'CON' and 'END' (*note MIXAL directives::). The general form of a w-expression is the following: WEXP = EXP[(EXP)][,WEXP] where 'EXP' stands for an expression and square brackets denote optional items. Thus, a w-expression is made by an expression, followed by an optional expression between parenthesis, followed by any number of similar constructs separated by commas. Sample w-expressions are: 2000 235(3) S1+3(S2),3000 S1,S2(3:5),23 W-expressions are evaluated from left to right as follows: * Start with an accumulated result 'w' equal to 0. * Take the first expression of the comma-separated list and evaluate it. For instance, if the w-expression is 'S1+2(2:4),2000(S2)', we evaluate first 'S1+2'; let's suppose that 'S1' equals 265230: then 'S1+2 = 265232 = + 00 01 00 48 16'. * Evaluate the expression within parenthesis, reducing it to an f-spec of the form 'L:R'. In our previous example, the expression between parenthesis already has the desired form: 2:4. * Substitute the bytes of the accumulated result 'w' designated by the f-spec using those of the previous expression value. In our sample, 'w = + 00 00 00 00 00', and we must substitute bytes 2, 3 and 4 of 'w' using values from 265232. We need 3 bytes, and we take the least significant ones: 00, 48, and 16, and insert them in positions 2, 3 and 4 of 'w', obtaining 'w = + 00 00 48 16 00'. * Repeat this operation with the remaining terms, acting on the new value of 'w'. In our example, if, say, 'S2 = 1:1', we must substitute the first byte of 'w' using one byte (the least significant) from 2000, that is, 16 (since 2000 = + 00 00 00 31 16) and, therefore, we obtain 'w = + 16 00 48 16 00'; summing up, we have obtained '265232(1:4),2000(1:1) = + 16 00 48 16 00 = 268633088'. As a second example, in the w-expression 1(1:2),66(4:5) we first take two bytes from 1 (00 and 01) and store them as bytes 1 and 2 of the result (obtaining '+ 00 01 00 00 00') and, afterwards, take two bytes from 66 (01 and 02) and store them as bytes 4 and 5 of the result, obtaining '+ 00 01 00 01 02' (262210). The process is repeated for each new comma-separated example. For instance: 1(1:1),2(2:2),3(3:3),4(4:4) = 01 02 03 04 00 As stated before, w-expressions can only appear as the operands of MIXAL directives taking a constant value ('ORIG', 'EQU', 'CON' and 'END'). Future references are _not_ allowed within w-expressions (i.e., all symbols appearing in a w-expression must be defined before it is used).  File: mdk.info, Node: Local symbols, Next: Literal constants, Prev: W-expressions, Up: MIXAL 2.2.5 Local symbols ------------------- Besides user defined symbols, MIXAL programmers can use the so called "local symbols", which are symbols of the form '[1-9][HBF]'. A local symbol 'nB' refers to the address of the last previous occurrence of 'nH' as a label, while 'nF' refers to the next 'nH' occurrence. Unlike user defined symbols, 'nH' can appear multiple times in the 'LABEL' part of different MIXAL instructions. The following code shows an instance of local symbols' usage: * line 1 1H LDA 100 * line 2: 1B refers to address of line 1, 3F refers to address of line 4 STA 3F,2(1B//2) * line 3: redefinition of 1H 1H STZ * line 4: 1B refers to address of line 3 3H JMP 1B Note that a 'B' local symbol never refers to a definition in its own line, that is, in the following program: ORIG 1999 ST NOP 3H EQU 69 3H ENTA 3B local symbol 3B refers to 3H in previous line HLT END ST the contents of 'rA' is set to 69 and _not_ to 2001. An specially tricky case occurs when using local symbols in conjunction with 'ORIG' pseudoinstructions. To wit(1) (*note Local symbols-Footnote-1::), ORIG 1999 ST NOP 3H CON 10 ENT1 * LDA 3B ** rI1 is 2001, rA is 10. So far so good! 3H ORIG 3B+1000 ** at this point 3H equals 2003 ** and the location counter equals 3000. ENT2 * LDX 3B ** rI2 contains 3000, rX contains 2003. HLT END ST  File: mdk.info, Node: Local symbols-Footnotes, Up: Local symbols (1) The author wants to thank Philip E. King for pointing these two special cases of local symbol usage to him.  File: mdk.info, Node: Literal constants, Prev: Local symbols, Up: MIXAL 2.2.6 Literal constants ----------------------- MIXAL allows the introduction of "literal constants", which are automatically stored in memory addresses after the end of the program by the assembler. Literal constants are denoted as '=wexp=', where 'wexp' is a w-expression (*note W-expressions::). For instance, the code L EQU 5 LDA =20-L= causes the assembler to add after the program's end an instruction with contents 15 ('20-L'), and to assemble the above code as the instruction ' LDA a', where 'a' stands for the address in which the value 15 is stored. In other words, the compiled code is equivalent to the following: L EQU 5 LDA a ... a CON 20-L END start  File: mdk.info, Node: Getting started, Next: Emacs tools, Prev: MIX and MIXAL tutorial, Up: Top 3 Getting started ***************** In this chapter, you will find a sample code-compile-run-debug session using the MDK utilities. Familiarity with the MIX mythical computer and its assembly language MIXAL (as described in Knuth's TAOCP) is assumed; for a compact reminder, see *note MIX and MIXAL tutorial::. * Menu: * Writing a source file:: A sample MIXAL source file. * Compiling:: Using 'mixasm' to compile source files into binary format. * Running the program:: Running and debugging your programs. * Using mixguile:: Using the Scheme interpreter to run and debug your programs. * Using Scheme in mixvm and gmixvm::  File: mdk.info, Node: Writing a source file, Next: Compiling, Prev: Getting started, Up: Getting started 3.1 Writing a source file ========================= MIXAL programs can be written as ASCII files with your editor of choice. Here you have the mandatory _hello world_ as written in the MIXAL assembly language: * (1) * hello.mixal: say 'hello world' in MIXAL (2) * (3) * label ins operand comment (4) TERM EQU 19 the MIX console device number (5) ORIG 3000 start address (6) START OUT MSG(TERM) output data at address MSG (7) HLT halt execution (8) MSG ALF "MIXAL" (9) ALF " HELL" (10) ALF "O WOR" (11) ALF "LD " (12) END START end of the program (13) MIXAL source files should have the extension '.mixal' when used with the MDK utilities. As you can see in the above sample, each line in a MIXAL file can be divided into four fields separated by an arbitrary amount of whitespace characters (blanks and or tabs). While in Knuth's definition of MIXAL each field must start at a fixed pre-defined column number, the MDK assembler loosens this requirement and lets you format the file as you see fit. The only restrictions retained are for comment lines (like 1-4) which must begin with an asterisk (*) placed at column 1, and for the label field (see below) which, if present, must also start at column 1. The four fields in each non-comment line are: - an optional label, which either refers to the current memory address (as 'START' and 'MSG' in lines 7 and 9) or a defined symbol ('TERM') (if present, the label must always start at the first column in its line, for the first whitespace in the line marks the beginning of the second field), - an operation mnemonic, which can represent either a MIX instruction ('OUT' and 'HLT' in lines 7 and 8 above), or an assembly pseudoinstruction (e.g., the 'ORIG' pseudoinstruction in line 6(1) (*note Writing a source file-Footnote-1::). - an optional operand for the (pseudo)instruction, and - an optional free text comment. Lines 9-12 of the 'hello.mixal' file above also show the second (and last) difference between Knuth's MIXAL definition and ours: the operand of the 'ALF' pseudoinstruction (a word of five characters) must be quoted using ""(2) (*note Writing a source file-Footnote-2::). The workings of this sample program should be straightforward if you are familiar with MIXAL. See TAOCP vol. 1 for a thorough definition or *note MIX and MIXAL tutorial::, for a tutorial.  File: mdk.info, Node: Writing a source file-Footnotes, Up: Writing a source file (1) If an 'ORIG' directive is not used, the program will be loaded by the virtual machine at address 0. 'ORIG' allows allocating the executable code where you see fit. (2) In Knuth's definition, the operand always starts at a fixed column number, and the use of quotation is therefore unnecessary. As 'mixasm' releases this requirement, marking the beginning and end of the 'ALF' operand disambiguates the parser's recognition of this operand when it includes blanks. Note that double-quotes (") are not part of the MIX character set, and, therefore, no escape characters are needed within 'ALF''s operands.  File: mdk.info, Node: Compiling, Next: Running the program, Prev: Writing a source file, Up: Getting started 3.2 Compiling ============= Three simulators of the MIX computer, called 'mixvm', 'gmixvm' and 'mixguile', are included in the MDK tools. They are able to run binary files containing MIX instructions written in their binary representation. You can translate MIXAL source files into this binary form using 'mixasm', the MIXAL assembler. So, in order to compile the 'hello.mixal' file, you can type the following command at your shell prompt: mixasm hello If the source file contains no errors, this will produce a binary file called 'hello.mix' which can be loaded and run by the MIX virtual machine. Unless the 'mixasm' option '-O' is provided, the assembler will include debug information in the executable file (for a complete description of all the compilation options, see *note mixasm::). Now, your are ready to run your first MIX program, as described in the following section.  File: mdk.info, Node: Running the program, Next: Using mixguile, Prev: Compiling, Up: Getting started 3.3 Running the program ======================= MIX is a mythical computer, so it is no use ordering it from your favorite hardware provider. MDK provides three software simulators of the computer, though. They are * 'mixvm', a command line oriented simulator, * 'gmixvm', a GTK based graphical interface to 'mixvm', and * 'mixguile', a Guile shell with a built-in MIX simulator. All three simulators accept the same set of user commands, but offer a different user interface, as noted above. In this section we shall describe some of these commands, and show you how to use them from 'mixvm''s command line. You can use them as well at 'gmixvm''s command prompt (*note gmixvm::), or using the built-in Scheme primitives of 'mixguile' (*note Using mixguile::). Using the MIX simulators, you can run your MIXAL programs, after compiling them with 'mixasm' into binary '.mix' files. 'mixvm' can be used either in "interactive" or "non-interactive" mode. In the second case, 'mixvm' will load your program into memory, execute it (producing any output due to MIXAL 'OUT' instructions present in the program), and exit when it encounters a 'HLT' instruction. In interactive mode, you will enter a shell prompt which allows you issuing commands to the running virtual machine. These commands will permit you to load, run and debug programs, as well as to inspect the MIX computer state (register contents, memory cells contents and so on). * Menu: * Non-interactive mode:: Running your programs non-interactively. * Interactive mode:: Running programs interactively. * Debugging:: Commands for debugging your programs.  File: mdk.info, Node: Non-interactive mode, Next: Interactive mode, Prev: Running the program, Up: Running the program 3.3.1 Non-interactive mode -------------------------- To make 'mixvm' work in non-interactive mode, use the '-r' flag. Thus, to run our 'hello.mix' program, simply type mixvm -r hello at your command prompt, and you will get the following output: MIXAL HELLO WORLD Since our hello world program uses MIX's device number 19 as its output device (*note Writing a source file::), the output is redirected to the shell's standard output. Had you used any other MIX output devices (disks, drums, line printer, etc.), 'mixvm' would have created a file named after the device used (e.g. 'disk4.dev') and written its output there(1) (*note Non-interactive mode-Footnote-1::). The virtual machine can also report the execution time of the program, according to the (virtual) time spent in each of the binary instructions (*note Execution times::). Printing of execution time statistics is activated with the '-t' flag; running mixvm -t -r hello produces the following output: MIXAL HELLO WORLD ** Execution time: 11 Sometimes, you will prefer to store the results of your program in MIX registers rather than writing them to a device. In such cases, 'mixvm''s '-d' flag is your friend: it makes 'mixvm' dump the contents of its registers and flags after executing the loaded program. For instance, typing the following command at your shell's prompt mixvm -d -r hello you will obtain the following output: MIXAL HELLO WORLD rA: + 00 00 00 00 00 (0000000000) rX: + 00 00 00 00 00 (0000000000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) Overflow: F Cmp: E which, in addition to the program's outputs and execution time, gives you the contents of the MIX registers and the values of the overflow toggle and comparison flag (admittedly, rather uninteresting in our sample). As you can see, running programs non-interactively has many limitations. You cannot peek the virtual machine's memory contents, not to mention stepping through your program's instructions or setting breakpoints(2) (*note Non-interactive mode-Footnote-2::). Enter interactive mode.  File: mdk.info, Node: Non-interactive mode-Footnotes, Up: Non-interactive mode (1) The device files are stored, by default, in a directory called '.mdk', which is created in your home directory the first time 'mixvm' is run. You can change this default directory using the command 'devdir' when running 'mixvm' in interactive mode (*note Configuration commands::) (2) The 'mixguile' program allows you to execute arbitrary combinations of 'mixvm' commands (using Scheme) non-interactively. *Note Scheme scripts::.  File: mdk.info, Node: Interactive mode, Next: Debugging, Prev: Non-interactive mode, Up: Running the program 3.3.2 Interactive mode ---------------------- To enter the MIX virtual machine interactive mode, simply type mixvm at your shell command prompt. This command enters the 'mixvm' command shell. You will be presented the following command prompt: MIX > The virtual machine is initialised and ready to accept your commands. The 'mixvm' command shell uses GNU's readline, so that you have at your disposal command completion (using ) and history functionality, as well as other line editing shortcuts common to all utilities using this library (for a complete description of readline's line editing usage, see *note (Readline)Command Line Editing::.) Usually, the first thing you will want to do is loading a compiled MIX program into memory. This is accomplished by the 'load' command, which takes as an argument the name of the '.mix' file to be loaded. Thus, typing MIX > load hello Program loaded. Start address: 3000 MIX > will load 'hello.mix' into the virtual machine's memory and set the program counter to the address of the first instruction. You can obtain the contents of the program counter using the command 'pc': MIX > pc Current address: 3000 MIX > After loading it, you are ready to run the program, using, as you surely have guessed, the 'run' command: MIX > run Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) MIX > Note that now the timing statistics are richer. You obtain the elapsed execution time (i.e., the time spent executing instructions since the last breakpoint), the total execution time for the program up to now (which in our case coincides with the elapsed time, since there were no breakpoints), and the total uptime for the virtual machine (you can load and run more than one program in the same session)(1) (*note Interactive mode-Footnote-1::). After running the program, the program counter will point to the address after the one containing the 'HLT' instruction. In our case, asking the value of the program counter after executing the program will give us MIX > pc Current address: 3002 MIX > You can check the contents of a memory cell giving its address as an argument of the command 'pmem', like this MIX > pmem 3001 3001: + 00 00 00 02 05 (0000000133) MIX > and convince yourself that address 3001 contains the binary representation of the instruction 'HLT'. An address range of the form FROM-TO can also be used as the argument of 'pmem': MIX > pmem 3000-3006 3000: + 46 58 00 19 37 (0786957541) 3001: + 00 00 00 02 05 (0000000133) 3002: + 14 09 27 01 13 (0237350989) 3003: + 00 08 05 13 13 (0002118477) 3004: + 16 00 26 16 19 (0268542995) 3005: + 13 04 00 00 00 (0219152384) 3006: + 00 00 00 00 00 (0000000000) MIX > In a similar manner, you can look at the contents of the MIX registers and flags. For instance, to ask for the contents of the A register you can type MIX > preg A rA: + 00 00 00 00 00 (0000000000) MIX > Use the command 'help' to obtain a list of all available commands, and 'help COMMAND' for help on a specific command, e.g. MIX > help run run Run loaded or given MIX code file. Usage: run [FILENAME] MIX > For a complete list of commands available at the MIX propmt, *Note mixvm::. In the following subsection, you will find a quick tour over commands useful for debugging your programs.  File: mdk.info, Node: Interactive mode-Footnotes, Up: Interactive mode (1) Printing of timing statistics can be disabled using the command 'timing' (*note Configuration commands::).  File: mdk.info, Node: Debugging, Prev: Interactive mode, Up: Running the program 3.3.3 Debugging commands ------------------------ The interactive mode of 'mixvm' lets you step by step execution of programs as well as breakpoint setting. Use 'next' to step through the program, running its instructions one by one. To run our two-instruction 'hello.mix' sample you can do the following: MIX > load hello Program loaded. Start address: 3000 MIX > pc Current address: 3000 MIX > next MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 1) MIX > pc Current address: 3001 MIX > next End of program reached at address 3002 Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > pc Current address: 3002 MIX > next MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 12) MIX > MIX > run Running ... ... done Elapsed time: 10 /Total program time: 11 (Total uptime: 22) MIX > (As an aside, the above sample also shows how the virtual machine handles cumulative time statistics and automatic program restart). You can set a breakpoint at a given address using the command 'sbpa' (set breakpoint at address). When a breakpoint is set, 'run' will stop before executing the instruction at the given address. Typing 'run' again will resume program execution. Coming back to our hello world example, we would have: MIX > sbpa 3001 Breakpoint set at address 3001 MIX > run Running ... MIXAL HELLO WORLD ... stopped: breakpoint at line 8 (address 3001) Elapsed time: 1 /Total program time: 1 (Total uptime: 23) MIX > run Running ... ... done Elapsed time: 10 /Total program time: 11 (Total uptime: 33) MIX > Note that, since we compiled 'hello.mixal' with debug info enabled, the virtual machine is able to tell us the line in the source file corresponding to the breakpoint we are setting. As a matter of fact, you can directly set breakpoints at source code lines using the command 'sbp LINE_NO', e.g. MIX > sbp 4 Breakpoint set at line 7 MIX > 'sbp' sets the breakpoint at the first meaningful source code line; thus, in the above example we have requested a breakpoint at a line which does not correspond to a MIX instruction and the breakpoint is set at the first line containing a real instruction after the given one. To unset breakpoints, use 'cbpa ADDRESS' and 'cbp LINE_NO', or 'cabp' to remove all currently set breakpoints. You can also set conditional breakpoints, i.e., tell 'mixvm' to interrupt program execution whenever a register, a memory cell, the comparison flag or the overflow toggle change using the commands 'sbp[rmco]' (*note Debug commands::). MIXAL lets you define symbolic constants, either using the 'EQU' pseudoinstruction or starting an instruction line with a label (which assigns to the label the value of the current memory address). Each MIXAL program has, therefore, an associated symbol table which you can inspect using the 'psym' command. For our hello world sample, you will obtain the following output: MIX > psym START: 3000 TERM: 19 MSG: 3002 MIX > Other useful commands for debugging are 'strace' (which turns on tracing of executed instructions), 'pbt' (which prints a backtrace of executed instructions) and 'weval' (which evaluates w-expressions on the fly). For a complete description of all available MIX commands, *Note mixvm::.  File: mdk.info, Node: Using mixguile, Next: Using Scheme in mixvm and gmixvm, Prev: Running the program, Up: Getting started 3.4 Using 'mixguile' ==================== With 'mixguile' you can run a MIX simulator embedded in a Guile shell, that is, using Scheme functions and programs. As with 'mixvm', 'mixguile' can be run both in interactive and non-interactive modes. The following subsections provide a quick tour on using this MIX emulator. * Menu: * The mixguile shell:: Using the Scheme MIX virtual machine. * Additional functions:: Scheme functions accessing the VM. * Defining new functions:: Defining your own Scheme functions. * Hook functions:: Using command and break hook functions. * Scheme scripts::  File: mdk.info, Node: The mixguile shell, Next: Additional functions, Prev: Using mixguile, Up: Using mixguile 3.4.1 The 'mixguile' shell -------------------------- If you simply type mixguile at the command prompt, you'll be presented a Guile shell prompt like this guile> At this point, you have entered a Scheme read-eval-print loop (REPL) which offers you all the Guile functionality plus a new set of built-in procedures to execute and debug MIX programs. Each of the 'mixvm' commands described in the previous sections (and in *note mixvm::) have a Scheme function counterpart named after it by prepending the prefix 'mix-' to its name. Thus, to load our hello world program, you can simply enter guile> (mix-load "hello") Program loaded. Start address: 3000 guile> and run it using 'mix-run': guile> (mix-run) Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) guile> In the same way, you can execute it step by step using the Scheme function 'mix-next' or set a breakpoint: guile> (mix-sbp 4) Breakpoint set at line 5 guile> or, if you one to peek at a register contents: guile> (mix-preg 'A) rA: + 00 00 00 00 00 (0000000000) guile> You get the idea: you have at your disposal all the 'mixvm' and 'gmixvm' commands by means of 'mix-' functions. But, in case you are wondering, this is only the beginning. You also have at your disposal a whole Scheme interpreter, and you can, for instance, define new functions combining the 'mix-' and all other Scheme primitives. In the next sections, you'll find examples of how to take advantage of the Guile interpreter.  File: mdk.info, Node: Additional functions, Next: Defining new functions, Prev: The mixguile shell, Up: Using mixguile 3.4.2 Additional MIX Scheme functions ------------------------------------- The 'mix-' function counterparts of the 'mixvm' commands don't return any value, and are evaluated only for their side-effects (possibly including informational messages to the standard output and/or error stream). When writing your own Scheme functions to manipulate the MIX virtual machine within 'mixguile' (*note Defining new functions::), you'll probably need Scheme functions returning the value of the registers, memory cells and so on. Don't worry: 'mixguile' also offers you such functions. For instance, to access the (numerical) value of a register you can use 'mix-reg': guile> (mix-reg 'I2) 0 guile> Note that, unlike '(mix-preg 'I2)', the expression '(mix-reg 'I2)' in the above example evaluates to a Scheme number and does not produce any side-effect: guile> (number? (mix-reg 'I2)) #t guile> (number? (mix-preg 'I2)) rI2: + 00 00 (0000) #f guile> In a similar fashion, you can access the memory contents using '(mix-cell)', or the program counter using '(mix-loc)': guile> (mix-cell 3000) 786957541 guile> (mix-loc) 3002 guile> Other functions returning the contents of the virtual machine components are 'mix-cmp' and 'mix-over', which eval to the value of the comparison flag and the overflow toggle respectively. For a complete list of these additional functions, *Note mixguile::. In the next section, we'll see a sample of using these functions to extend 'mixguile''s functionality.  File: mdk.info, Node: Defining new functions, Next: Hook functions, Prev: Additional functions, Up: Using mixguile 3.4.3 Defining new functions ---------------------------- Scheme is a powerful language, and you can use it inside 'mixguile' to easily extend the MIX interpreter's capabilities. For example, you can easily define a function that loads a file, prints its name, executes it and, finally, shows the registers contents, all in one shot: guile> (define my-load-and-run (lambda (file) (mix-load file) (display "File loaded: ") (mix-pprog) (mix-run) (mix-preg))) guile> and use it to run your programs: guile> (my-load-and-run "hello") Program loaded. Start address: 3000 File loaded: hello.mix Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 33) rA: + 00 00 00 00 00 (0000000000) rX: + 00 00 00 00 00 (0000000000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) guile> Or, maybe, you want a function which sets a breakpoint at a specified line number before executing it: guile> (define my-load-and-run-with-bp (lambda (file line) (mix-load file) (mix-sbp line) (mix-run))) guile> (my-load-and-run-with-bp "samples/primes" 10) Program loaded. Start address: 3000 Breakpoint set at line 10 Running ... ... stopped: breakpoint at line 10 (address 3001) Elapsed time: 1 /Total program time: 1 (Total uptime: 45) guile> As a third example, the following function loads a program, runs it and prints the contents of the memory between the program's start and end addresses: guile> (define my-run (lambda (file) (mix-load file) (let ((start (mix-loc))) (mix-run) (mix-pmem start (mix-loc))))) guile> (my-run "hello") Program loaded. Start address: 3000 Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) 3000: + 46 58 00 19 37 (0786957541) 3001: + 00 00 00 02 05 (0000000133) 3002: + 14 09 27 01 13 (0237350989) guile> As you can see, the possibilities are virtually unlimited. Of course, you don't need to type a function definition each time you start 'mixguile'. You can write it in a file, and load it using Scheme's 'load' function. For instance, you can create a file named, say, 'functions.scm' with your definitions (or any Scheme expression) and load it at the 'mixguile' prompt: guile> (load "functions.scm") Alternatively, you can make 'mixguile' to load it for you. When 'mixguile' starts, it looks for a file named 'mixguile.scm' in your MDK configuration directory ('~/.mdk') and, if it exists, loads it before entering the REPL. Therefore, you can copy your definitions in that file, or load the 'functions.scm' file in 'mixguile.scm'.  File: mdk.info, Node: Hook functions, Next: Scheme scripts, Prev: Defining new functions, Up: Using mixguile 3.4.4 Hook functions -------------------- Hooks are functions called before or after a given event occurs. In 'mixguile', you can define command and break hooks, which are associated, respectively, with command execution and program interruption events. The following sections give you a tutorial on using hook functions within 'mixguile'. * Menu: * Command hooks:: * Break hooks::  File: mdk.info, Node: Command hooks, Next: Break hooks, Prev: Hook functions, Up: Hook functions 3.4.4.1 Command hooks ..................... In the previous section, we have seen how to extend 'mixguile''s functionality through the use of user defined functions. Frequently, you'll write new functions that improve in some way the workings of a built-in 'mixvm' command, following this pattern: a. Prepare the command execution b. Execute the desired command c. Perform post execution operations We call the functions executed in step (a) "pre-hook"s, and those of step "post-hook"s of the given command. 'mixguile' lets you specify pre- and post-hooks for any 'mixvm' command using the 'mix-add-pre-hook' and 'mix-add-post-hook' functions, which take as arguments a symbol naming the command and a function to be executed before (resp. after) the command. In other words, 'mixguile' will execute for you steps (a) and (c) above whenever you eval (b). The hook functions must take a single argument, which is a string list of the command's arguments. As an example, let us define the following hooks for the 'next' command: (define next-pre-hook (lambda (arglist) (mix-slog #f))) (define next-post-hook (lambda (arglist) (display "Stopped at line ") (display (mix-src-line-no)) (display ": ") (display (mix-src-line)) (newline) (mix-slog #t))) In these functions, we are using the function 'mix-slog' to turn off the informational messages produced by the virtual machine, since we are providing our own ones in the post hook function. To install these hooks, we would write: (mix-add-pre-hook 'next next-pre-hook) (mix-add-post-hook 'next next-post-hook) Assuming we have put the above expressions in 'mixguile''s initialisation file, we would obtain the following results when evaluating 'mix-next': guile> (mix-next) MIXAL HELLO WORLD Stopped at line 6: HLT guile> As a second, more elaborate, example, let's define hooks which print the address and contents of a cell being modified using 'smem'. The hook functions could be something like this: (define smem-pre-hook (lambda (arglist) (if (eq? (length arglist) 2) (begin (display "Changing address ") (display (car arglist)) (newline) (display "Old contents: ") (display (mix-cell (string->number (car arglist)))) (newline)) (error "Wrong arguments" arglist)))) (define smem-post-hook (lambda (arglist) (if (eq? (length arglist) 2) (begin (display "New contents: ") (display (mix-cell (string->number (car arglist)))) (newline))))) and we can install them using (mix-add-pre-hook 'smem smem-pre-hook) (mix-add-post-hook 'smem smem-post-hook) Afterwards, a sample execution of 'mix-smem' would look like this: guile> (mix-smem 2000 100) Changing address 2000 Old contents: 0 New contents: 100 guile> You can add any number of hooks to a given command. They will be executed in the same order as they are registered. You can also define global post (pre) hooks, which will be called before (after) any 'mixvm' command is executed. Global hook functions must admit two arguments, namely, a string naming the invoked command and a string list of its arguments, and they are installed using the Scheme functions 'mix-add-global-pre-hook' and 'mix-add-global-post-hook'. A simple example of global hook would be: guile> (define pre-hook (lambda (cmd args) (display cmd) (display " invoked with arguments ") (display args) (newline))) guile> (mix-add-global-pre-hook pre-hook) ok guile> (mix-pmem 120 125) pmem invoked with arguments (120-125) 0120: + 00 00 00 00 00 (0000000000) 0121: + 00 00 00 00 00 (0000000000) 0122: + 00 00 00 00 00 (0000000000) 0123: + 00 00 00 00 00 (0000000000) 0124: + 00 00 00 00 00 (0000000000) 0125: + 00 00 00 00 00 (0000000000) guile> Note that if you invoke 'mixvm' commands within a global hook, its associated command hooks will be run. Thus, if you have installed both the 'next' hooks described earlier and the global hook above, executing 'mix-next' will yield the following result: guile> (mix-next 5) next invoked with arguments (5) slog invoked with arguments (off) MIXAL HELLO WORLD Stopped at line 7: MSG ALF "MIXAL" slog invoked with arguments (on) guile> Adventurous readers may see the above global hook as the beginning of a command log utility or a macro recorder that saves your commands for replay.  File: mdk.info, Node: Break hooks, Prev: Command hooks, Up: Hook functions 3.4.4.2 Break hooks ................... We have seen in the previous section how to associate hooks to command execution, but they are not the whole story. You can also associate hook functions to program interruption, that is, specify functions that should be called every time the execution of a MIX program is stopped due to the presence of a breakpoint, either explicit or conditional. Break hooks take as arguments the line number and memory address at which the break occurred. A simple hook that logs the line and address of the breakpoint could be defined as: (define break-hook (lambda (line address) (display "Breakpoint encountered at line ") (display line) (display " and address ") (display address) (newline))) and installed for explicit and conditional breakpoints using (mix-add-break-hook break-hook) (mix-add-cond-break-hook break-hook) after that, every time the virtual machine encounters a breakpoint, 'break-code' shall be evaluated for you(1) (*note Break hooks-Footnote-1::).  File: mdk.info, Node: Break hooks-Footnotes, Up: Break hooks (1) You may have noticed that break hooks can be implemented in terms of command hooks associated to 'mix-run' and 'mix-next'. As a matter of fact, they _are_ implemented this way: take a look at the file '_install_dir_/share/mdk/mix-vm-stat.scm' if you are curious.  File: mdk.info, Node: Scheme scripts, Prev: Hook functions, Up: Using mixguile 3.4.5 Scheme scripts -------------------- Another useful way of using 'mixguile' is writing executable scripts that perform a set of commands for you. This is done using the 'mixguile' switch '-s' (being a Guile shell, 'mixguile' accepts all the command options of 'guile'; type 'mixguile -h' for a list of all available command options). For instance, if you have a very useful MIX program 'foo.mix' which you want to run often, you don't have to fire up a MIX virtual machine, load and run it every time; you can write a Scheme script instead: #! /usr/bin/mixguile -s !# ;;; runprimes: execute the primes.mix program ;; load the file you want to run (mix-load "../samples/primes") ;; execute it (mix-run) ;; print the contents of registers (mix-pall) ;; ... Just save the above script to a file named, say, 'runtest', make it executable ('chmod +x runtest'), and, well, execute it from the Unix shell: $ ./runtest Program loaded. Start address: 3000 Running ... ... done Elapsed time: 190908 /Total program time: 190908 (Total uptime: 190908) rA: + 30 30 30 30 30 (0511305630) rX: + 30 30 32 32 39 (0511313959) rJ: + 47 18 (3026) rI1: + 00 00 (0000) rI2: + 55 51 (3571) rI3: + 00 19 (0019) rI4: + 31 51 (2035) rI5: + 00 00 (0000) rI6: + 00 00 (0000) Overflow: F Cmp: L $ Note that this is far more flexible that running programs non-interactively using 'mixvm' (*note Non-interactive mode::), for you can execute any combination of commands you want from a Scheme script (not just running and dumping the registers). For additional 'mixguile' command line options, see *note Invoking mixguile::.  File: mdk.info, Node: Using Scheme in mixvm and gmixvm, Prev: Using mixguile, Up: Getting started 3.5 Using Scheme in 'mixvm' and 'gmixvm' ======================================== In the previous section (*note Using mixguile::) we have seen how the Guile shell 'mixguile' offers you the possibility of using Scheme to manipulate a MIX virtual machine and extend the set of commands offered by 'mixvm' and 'gmixvm'. This possibility is not limited to the 'mixguile' shell. Actually, both 'mixvm' and 'gmixvm' incorporate an embedded Guile interpreter, and can evaluate Scheme expressions. To evaluate a single-line expression at the 'mixvm' or 'gmixvm' command prompt, simply write it and press return (the command parser will recognise it as a Scheme expression because it is parenthesized, and will pass it to the Guile interpreter). A sample 'mixvm' session using Scheme expressions could be: MIX > load hello Program loaded. Start address: 3000 MIX > (define a (mix-loc)) MIX > run Running ... MIXAL HELLO WORLD ... done Elapsed time: 11 /Total program time: 11 (Total uptime: 11) MIX > (mix-pmem a) 3000: + 46 58 00 19 37 (0786957541) MIX > (mix-pmem (mix-loc)) 3002: + 14 09 27 01 13 (0237350989) MIX > You can also load and evaluate a file, using the 'scmf' command like this: MIX> scmf /path/to/file/file.scm Therefore, you have at your disposal all the 'mixguile' goodies described above (new functions, new command definitions, hooks...) inside 'mixvm' and 'gmixvm'. In other words, these programs are extensible using Scheme. See *note Using mixguile:: for examples of how to do it.  File: mdk.info, Node: Emacs tools, Next: mixasm, Prev: Getting started, Up: Top 4 Emacs tools ************* Everyone writing code knows how important a good editor is. Most systems already come with Emacs, and excellent programmer's editor. MDK adds support to Emacs for both writing and debugging MIX programs. A major mode for MIXAL source files eases edition of your code, while integration with Emacs' debugging interface (GUD) lets you use 'mixvm' without leaving your favourite text editor. This chapter shows how to use the Elisp modules included in MDK, assuming that you have followed the installation instructions in *Note Emacs support::. * Menu: * MIXAL mode:: Editing MIXAL files. * GUD integration:: Invoking 'mixvm' within Emacs.  File: mdk.info, Node: MIXAL mode, Next: GUD integration, Prev: Emacs tools, Up: Emacs tools 4.1 MIXAL mode ============== The module 'mixal-mode.el' provides a new mode, mixal-mode, for editing MIXAL source files(1) (*note MIXAL mode-Footnote-1::). When everything is installed correctly, Emacs will select it as the major mode for editing files with extension '.mixal'. You can also activate mixal-mode in any buffer issuing the Emacs command 'M-x mixal-mode'. * Menu: * Basics:: Editing code, font locking and indentation. * Help system:: Using the interactive help system. * Compiling and running:: Invoking compiler and/or virtual machine.  File: mdk.info, Node: MIXAL mode-Footnotes, Up: MIXAL mode (1) mixal-mode has been developed and documented by Pieter E. J. Pareit  File: mdk.info, Node: Basics, Next: Help system, Prev: MIXAL mode, Up: MIXAL mode 4.1.1 Basics ------------ The mode for editing mixal source files is inherited from fundamental-mode, meaning that all your favorite editing operations will still work. If you want a short introduction to Emacs, type 'C-h t' inside Emacs to start the tutorial. Mixal mode adds font locking. If you do not have font locking globally enabled, you can turn it on for mixal-mode by placing the following line in your '.emacs' file: (add-hook 'mixal-mode-hook 'turn-on-font-lock) You can also customize the colors used to colour your mixal code by changing the requisite faces. This is the list of faces used by mixal-mode: * FONT-LOCK-COMMENT-FACE Face to use for comments. * MIXAL-FONT-LOCK-LABEL-FACE Face to use for label names. * MIXAL-FONT-LOCK-OPERATION-CODE-FACE Face to use for operation code names. * MIXAL-FONT-LOCK-ASSEMBLY-PSEUDOINSTRUCTION-FACE Face to use for assembly pseudo-instruction names.  File: mdk.info, Node: Help system, Next: Compiling and running, Prev: Basics, Up: MIXAL mode 4.1.2 Help system ----------------- When coding your program, you will be thinking, looking up documentation and editing files. Emacs already helps you with editing files, but Emacs can do much more. In particular, looking up documentation is one of its strong points. Besides the info system (which you are probably already using), mixal-mode defines commands for getting particular information about a MIX operation code. With 'M-x mixal-describe-operation-code' (or its keyboard shortcut 'C-h o') you will get the documentation about a particular MIX operation code. Keep in mind that these are not assembly (MIXAL) pseudoinstructions. When the 'point' is around a MIXAL pseudoinstruction in your source file, Emacs will recognize it and will suggest the right MIX operation code.  File: mdk.info, Node: Compiling and running, Prev: Help system, Up: MIXAL mode 4.1.3 Compiling and running --------------------------- After you have written your MIXAL program, you'll probably want to test it. This can be done with the MIX virtual machine. First you will need to compile your code into MIX byte code. This can be done within Emacs with the command 'M-x compile' ('C-c c'). In case of compilation errors, you can jump to the offending source code line with 'M-x next-error'. Once the program compiles without errors, you can debug or run it. To invoke the debugger, use 'M-x mixal-debug' ('C-c d'). Emacs will open a 'GUD' buffer where you can use the debugging commands described in *Note mixvm::. If you just want to execute the program, you can do so with 'M-x mixal-run' ('C-c r'). This will invoke mixvm, execute the program and show its output in a separate buffer.  File: mdk.info, Node: GUD integration, Prev: MIXAL mode, Up: Emacs tools 4.2 GUD integration =================== If you are an Emacs user and write your MIXAL programs using this editor, you will find the elisp program 'mixvm.el' quite useful(1) (*note GUD integration-Footnote-1::). 'mixvm.el' allows running the MIX virtual machine 'mixvm' (*note mixvm::) inside an Emacs GUD buffer, while visiting the MIXAL source file in another buffer. After installing 'mixvm.el' (*note Emacs support::), you can initiate an MDK/GUD session inside Emacs with the command M-x mixvm and you will have a 'mixvm' prompt inside a newly created GUD buffer. GUD will reflect the current line in the corresponding source file buffer.  File: mdk.info, Node: GUD integration-Footnotes, Up: GUD integration (1) 'mixvm.el' has been kindly contributed by Philip E. King. 'mixvm.el' is based on a study of gdb, perldb, and pdb as found in 'gud.el', and 'rubydb3x.el' distributed with the source code to the Ruby language.  File: mdk.info, Node: mixasm, Next: mixvm, Prev: Emacs tools, Up: Top 5 'mixasm', the MIXAL assembler ******************************* MIX programs, as executed by 'mixvm', are composed of binary instructions loaded into the virtual machine memory as MIX words. Although you could write your MIX programs directly as a series of words in binary format, you have at your disposal a more friendly assembly language, MIXAL (*note MIXAL::) which is compiled into binary form by 'mixasm', the MIXAL assembler included in MDK. In this chapter, you will find a complete description of 'mixasm' options. * Menu: * Invoking mixasm::  File: mdk.info, Node: Invoking mixasm, Prev: mixasm, Up: mixasm 5.1 Invoking 'mixasm' ===================== In its simplest form, 'mixasm' is invoked with a single argument, which is the name of the MIXAL file to be compiled, e.g. mixasm hello will compile either 'hello' or 'hello.mixal', producing a binary file named 'hello.mix' if no errors are found. In addition, 'mixasm' can be invoked with the following command line options (note, that, following GNU's conventions, we provide a long option name for each available single letter switch): mixasm [-vhulO] [-o OUTPUT_FILE] [--version] [--help] [--usage] [--ndebug] [--output=OUTPUT_FILE] [--list[=LIST_FILE]] file The meaning of these options is as follows: -- User Option: -v -- User Option: --version Prints version and copyleft information and exits. -- User Option: -h -- User Option: --help -- User Option: -u -- User Option: --usage Prints a summary of available options and exits. -- User Option: -O -- User Option: --ndebug Do not include debugging information in the compiled file, saving space but disallowing breakpoint setting at source level and symbol table inspection under 'mixvm'. -- User Option: -o output_file -- User Option: --output=output_file By default, the given source file FILE.MIXAL is compiled into FILE.MIX. You can provide a different name for the output file using this option. -- User Option: -l -- User Option: --list[=list_file] This option causes 'mixasm' to produce, in addition to the '.mix' file, an ASCII file containing a summary of the compilation results. The file is named after the MIXAL source file, changing its extension to '.mls' if no argument is provided; otherwise, the listing file is named according to the argument.  File: mdk.info, Node: mixvm, Next: gmixvm, Prev: mixasm, Up: Top 6 'mixvm', the MIX computer simulator ************************************* This chapter describes 'mixvm', the MIX computer simulator. 'mixvm' is a command line interface programme which simulates the MIX computer (*note The MIX computer::). It is able to run MIXAL programs (*note MIXAL::) previously compiled with the MIX assembler (*note mixasm::). The simulator allows inspection of the MIX computer components (registers, memory cells, comparison flag and overflow toggle), step by step execution of MIX programmes, and breakpoint setting to aid you in debugging your code. For a tutorial description of 'mixvm' usage, *Note Running the program::. * Menu: * Invocation:: * Commands:: Commands available in interactive mode. * Devices:: MIX block devices implementation.  File: mdk.info, Node: Invocation, Next: Commands, Prev: mixvm, Up: mixvm 6.1 Invoking 'mixvm' ==================== 'mixvm' can be invoked with the following command line options (note that, following GNU's conventions, we provide a long option name for each available single letter switch): mixvm [-vhurdtq] [--version] [--help] [--usage] [--run] [--dump] [--time] [--noinit] [FILE[.mix]] The meaning of these options is as follows: -- User Option: -v -- User Option: --version Prints version and copyleft information and exits. -- User Option: -h -- User Option: --help -- User Option: -u -- User Option: --usage Prints a summary of available options and exits. -- User Option: -r -- User Option: --run Loads the specified FILE and executes it. After the program execution, 'mixvm' exits. FILE must be the name of a binary '.mix' program compiled with 'mixasm'. If your program does not produce any output, use the '-d' flag (see below) to peek at the virtual machine's state after execution. -- User Option: -d -- User Option: --dump This option must be used in conjunction with '-r', and tells 'mixvm' to print the value of the virtual machine's registers, comparison flag and overflow toggle after executing the program named FILE. See *Note Non-interactive mode::, for sample usage. -- User Option: -t -- User Option: --time This option must be used in conjunction with '-r', and tells 'mixvm' to print virtual time statistics for the program's execution. When run without the '-r' flag, 'mixvm' enters its interactive mode, showing you a prompt like this one: MIX > and waiting for your commands (*note Commands::). If the optional FILE argument is given, the file 'FILE.mix' will be loaded into the virtual machine memory before entering the interactive mode. The first time 'mixvm' is invoked, a directory named '.mdk' is created in your home directory. It contains the 'mixvm' configuration file, the command history file and (by default) the block devices files (*note Devices::). Before showing you the command prompt, 'mixvm' looks in the '~/.mdk' directory for a file named 'mixguile.scm'; if it exists, it is read and evaluated by the embedded Guile interpreter (*note Defining new functions::). You can use the '-q' command line option to skip this file loading: -- User Option: -q -- User Option: --noinit Do not load the Guile initialisation file '~/.mdk/mixguile.scm' at startup.  File: mdk.info, Node: Commands, Next: Devices, Prev: Invocation, Up: mixvm 6.2 Interactive commands ======================== You can enter the interactive mode of the MIX virtual machine by simply invoking 'mixvm' without arguments. You will then be greeted by a shell prompt(1) (*note Commands-Footnote-1::) MIX > which indicates that a new virtual machine has been initialised and is ready to execute your commands. As we have already mentioned, this command prompt offers you command line editing facilities which are described in the Readline user's manual (chances are that you are already familiar with these command line editing capabilities, as they are present in many GNU utilities, e.g. the 'bash' shell)(2) (*note Commands-Footnote-2::). In a nutshell, readline provides command completion using the 'TAB' key and command history using the cursor keys. A history file containing the last commands typed in previous sessions is stored in the MDK configuration directory ('~/.mdk'). As a beginner, your best friend will be the 'help' command, which shows you a summary of all available MIX commands and their usage; its syntax is as follows: -- 'mixvm' command: help [command] Prints a short description of the given COMMAND and its usage. If COMMAND is omitted, 'help' prints the short description for all available commands. * Menu: * File commands:: Loading and executing programs. * Debug commands:: Debugging programs. * State commands:: Inspecting the virtual machine state. * Configuration commands:: Changing and storing mixvm settings. * Scheme commands::  File: mdk.info, Node: Commands-Footnotes, Up: Commands (1) The default command prompt, 'MIX > ', can be changed using the 'prompt' command (*note Configuration commands::) (2) The readline functionality will be available if you have compiled MDK with readline support, i.e., if GNU readline is installed in your system. This is often the case in GNU/Linux and BSD systems  File: mdk.info, Node: File commands, Next: Debug commands, Prev: Commands, Up: Commands 6.2.1 File commands ------------------- You have at your disposal a series of commands that let you load and execute MIX executable files, as well as manipulate MIXAL source files: -- file command: load file[.mix] This command loads a binary file, FILE.MIX into the virtual machine memory, and positions the program counter at the beginning of the loaded program. This address is indicated in the MIXAL source file as the operand of the 'END' pseudoinstruction. Thus, if your 'sample.mixal' source file contains the line: END 3000 and you compile it with 'mixasm' to produce the binary file 'sample.mix', you will load it into the virtual machine as follows: MIX > load sample Program loaded. Start address: 3000 MIX > -- file command: run [file[.mix]] When executed without argument, this command initiates or resumes execution of instructions from the current program counter address. Therefore, issuing this command after a successful 'load', will run the loaded program until either a 'HLT' instruction or a breakpoint is found. If you provide a MIX filename as argument, the given file will be loaded (as with 'load' FILE) and executed. If 'run' is invoked again after program execution completion (i.e., after the 'HLT' instruction has been found in a previous run), the program counter is repositioned and execution starts again from the beginning (as a matter of fact, a 'load' command preserving the currently set breakpoints is issued before resuming execution). -- file command: edit [file[.mixal]] The source file FILE.MIXAL is edited using the editor defined in the environment variable MDK_EDITOR. If this variable is not set, the following ones are tried out in order: X_EDITOR, EDITOR and VISUAL. If invoked without argument, the source file for the currently loaded MIX file is edited. The command used to edit source files can also be configured using the 'sedit' command (*note Configuration commands::). -- file command: compile file[.mixal] The source file FILE.MIXAL is compiled (with debug information enabled) using 'mixasm'. If invoked without argument, the source file for the currently loaded MIX file is recompiled. The compilation command can be set using the 'sasm' command (*note Configuration commands::). -- file command: pprog -- file command: psrc Print the path of the currently loaded MIX program and its source file: MIX > load ../samples/primes Program loaded. Start address: 3000 MIX > pprog ../samples/primes.mix MIX > psrc /home/jao/projects/mdk/gnu/samples/primes.mixal MIx> Finally, you can use the 'quit' command to exit 'mixvm': -- file command: quit Exit 'mixvm', saving the current configuration parameters in '~/.mdk/mixvm.config'.  File: mdk.info, Node: Debug commands, Next: State commands, Prev: File commands, Up: Commands 6.2.2 Debug commands -------------------- Sequential execution of loaded programs can be interrupted using the following debug commands: -- debug command: next [ins_number] This command causes the virtual machine to fetch and execute up to INS_NUMBER instructions, beginning from the current program counter position. Execution is interrupted either when the specified number of instructions have been fetched or a breakpoint is found, whatever happens first. If run without arguments, one instruction is executed. If 'next' is invoked again after program execution completion (i.e., after the 'HLT' instruction has been found in a previous run), the program counter is repositioned and execution starts again from the beginning (as a matter of fact, a 'load' command preserving the currently set breakpoints is issued before resuming execution). -- debug command: sbp line_number -- debug command: cbp line_no Sets a breakpoint at the specified source file line number. If the line specified corresponds to a command or to a MIXAL pseudoinstruction which does not produce a MIX instruction in the binary file (such as 'ORIG' or 'EQU') the breakpoint is set at the first source code line giving rise to a MIX instruction after the specified one. Thus, for our sample 'hello.mixal' file: * (1) * hello.mixal: say 'hello world' in MIXAL (2) * (3) * label ins operand comment (4) TERM EQU 19 the MIX console device number (5) ORIG 1000 start address (6) START OUT MSG(TERM) output data at address MSG (7) ... trying to set a breakpoint at line 5, will produce the following result: MIX > sbp 5 Breakpoint set at line 7 MIX > since line 7 is the first one compiled into a MIX instruction (at address 3000). The command 'cbp' clears a (previously set) breakpoint at the given source file line. -- debug command: spba address -- debug command: cbpa address Sets a breakpoint at the given memory ADDRESS. The argument must be a valid MIX memory address, i.e., it must belong into the range [0-3999]. Note that no check is performed to verify that the specified address is reachable during program execution. No debug information is needed to set a breakpoint by address with 'sbpa'. The command 'cbpa' clears a (previously set) breakpoint at the given memory address. -- debug command: sbpr A | X | J | Ii -- debug command: cbpr A | X | J | Ii Sets a conditional breakpoint on the specified register change. For instance, sbpr I1 will cause an interruption during program execution whenever the contents of register 'I1' changes. A previously set breakpoint is cleared using the 'cbpr' command. -- debug command: sbpm address -- debug command: cbpm address Sets a conditional breakpoint on the specified memory cell change. The argument must be a valid MIX memory address, i.e., it must belong into the range [0-3999]. For instance, sbpm 1000 will cause an interruption during program execution whenever the contents of the memory cell number 1000 changes. A previously set breakpoint is cleared using the 'cbpm' command. -- debug command: sbpo -- debug command: cbpo Sets/clears a conditional breakpoint on overflow toggle change. -- debug command: sbpc -- debug command: cbpc Sets/clears a conditional breakpoint on comparison flag change. -- debug command: cabp Clears all currently set breakpoints. -- debug command: psym [symbol_name] MIXAL programs can define symbolic constants, using either the 'EQU' pseudoinstruction or a label at the beginning of a line. Thus, in the program fragment VAR EQU 2168 ORIG 4000 START LDA VAR the symbol 'VAR' stands for the value 2168, while 'START' is assigned the value 4000. The symbol table can be consulted from the 'mixvm' command line using 'psym' followed by the name of the symbol whose contents you are interested in. When run without arguments, 'psym' will print all defined symbols and their values. The virtual machine can also show you the instructions it is executing, using the following commands: -- debug command: strace [on|off] 'strace on' enables instruction tracing. When tracing is enabled, each time the virtual machine executes an instruction (due to your issuing a 'run' or 'next' command), it is printed in its canonical form (that is, with all expressions evaluated to their numerical values) and, if the program was compiled with debug information, as it was originally typed in the MIXAL source file. Instruction tracing is disabled with 'strace off' command. A typical tracing session could be like this: MIX > strace on MIX > next 3000: [OUT 3002,0(2:3)] START OUT MSG(TERM) MIXAL HELLO WORLD Elapsed time: 1 /Total program time: 1 (Total uptime: 1) MIX > next 3001: [HLT 0,0] HLT End of program reached at address 3002 Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > strace off MIX > The executed instruction, as it was translated, is shown between square brackets after the memory address, and, following it, you can see the actual MIXAL code that was compiled into the executed instruction. The tracing behaviour is stored as a configuration parameter in '~/.mdk'. -- debug command: pline [LINE_NUMBER] Prints the requested source line (or the current one if LINE_NUMBER is omitted: MIX > load ../samples/hello Program loaded. Start address: 3000 MIX > pline Line 5: START OUT MSG(TERM) MIX > pline 6 Line 6: HLT MIX > -- debug command: pbt [INS_NUMBER] This command prints a backtrace of executed instructions. Its optional argument INS_NUMBER is the number of instructions to print. If it is omitted or equals zero, all executed instructions are printed. For instance, if you compile and load the following program ('bt.mixal'): ORIG 0 BEG JMP *+1 JMP *+1 FOO JMP BAR BAR HLT END BEG you could get the following traces: MIX > load bt Program loaded. Start address: 0 MIX > next MIX > pbt #0 BEG in bt.mixal:2 MIX > next MIX > pbt #0 1 in bt.mixal:3 #1 BEG in bt.mixal:2 MIX > run Running ... ... done MIX > pbt 3 #0 BAR in bt.mixal:5 #1 FOO in bt.mixal:4 #2 1 in bt.mixal:3 MIX > pbt #0 BAR in bt.mixal:5 #1 FOO in bt.mixal:4 #2 1 in bt.mixal:3 #3 BEG in bt.mixal:2 MIX > Note that the executed instruction trace gives you the label of the executed line or, if it has no label, its address. As you have probably observed, 'mixvm' prints timing statistics when running programs. This behaviour can be controlled using the 'stime' command (*note Configuration commands::). 'mixvm' is also able of evaluating w-expressions (*note W-expressions::) using the following command: -- debug command: weval WEXP Evaluates the given w-expression, WEXP. The w-expression can contain any currently defined symbol. For instance: MIX > psym START + 00 00 00 46 56 (0000003000) MIX > weval START(0:1),START(3:4) + 56 00 46 56 00 (0939716096) MIX > New symbols can be defined using the 'ssym' command: -- debug command: ssym SYM WEXP Defines the symbol named SYM with the value resulting from evaluating WEXP, a w-expression. The newly defined symbol can be used in subsequent 'weval' commands, as part of the expression to be evaluated. E.g., MIX > ssym S 2+23*START + 00 00 18 19 56 (0000075000) MIX > psym S + 00 00 18 19 56 (0000075000) MIX > weval S(3:4) + 00 00 19 56 00 (0000081408) MIX > Finally, if you want to discover which is the decimal value of a MIX word expressed as five bytes plus sign, you can use -- debug command: w2d WORD Computes the decimal value of the given word. WORD must be expressed as a sign (+/-) followed by five space-delimited, two-digit decimal values representing the five bytes composing the word. The reverse operation (showing the word representation of a decimal value) can be accomplished with 'weval'. For instance: MIX > w2d - 01 00 00 02 02 -16777346 MIX > weval -16777346 - 01 00 00 02 02 (0016777346) MIX >  File: mdk.info, Node: State commands, Next: Configuration commands, Prev: Debug commands, Up: Commands 6.2.3 State commands -------------------- Inspection and modification of the virtual machine state (memory, registers, overflow toggle and comparison flag contents) is accomplished using the following commands: -- state command: pstat This commands prints the current virtual machine state, which can be one of the following: - No program loaded - Program successfully loaded - Execution stopped ('next' executed) - Execution stopped: breakpoint encountered - Execution stopped: conditional breakpoint encountered - Program successfully terminated -- state command: pc Prints the current value of the program counter, which stores the address of the next instruction to be executed in a non-halted program. -- state command: sreg A | X | J | I[1-6] value -- state command: preg [A | X | J | I[1-6]] -- state command: pall 'preg' prints the contents of a given MIX register. For instance, 'preg' A will print the contents of the A-register. When invoked without arguments, all registers shall be printed: MIX > preg rA: - 00 00 00 00 35 (0000000035) rX: + 00 00 00 15 40 (0000001000) rJ: + 00 00 (0000) rI1: + 00 00 (0000) rI2: + 00 00 (0000) rI3: + 00 00 (0000) rI4: + 00 00 (0000) rI5: + 00 00 (0000) rI6: + 00 00 (0000) MIX > As you can see in the above sample, the contents are printed as the sign plus the values of the MIX bytes stored in the register and, between parenthesis, the decimal representation of its module. 'pall' prints the contents of all registers plus the comparison flag and overflow toggle. Finally, 'sreg' Sets the contents of the given register to VALUE, expressed as a decimal constant. If VALUE exceeds the maximum value storable in the given register, 'VALUE mod MAXIMUM_VALUE' is stored, e.g. MIX > sreg I1 1000 MIX > preg I1 rI1: + 15 40 (1000) MIX > sreg I1 1000000 MIX > preg I1 rI1: + 09 00 (0576) MIX > -- state command: pflags -- state command: scmp E | G | L -- state command: sover F | T 'pflags' prints the value of the comparison flag and overflow toggle of the virtual machine, e.g. MIX > pflags Overflow: F Cmp: E MIX > The values of the overflow toggle are either F (false) or T (true), and, for the comparison flag, E, G, L (equal, greater, lesser). 'scmp' and 'sover' are setters of the comparison flag and overflow toggle values. -- state command: pmem from[-to] -- state command: smem address value 'pmem' prints the contents of memory cells in the address range [FROM-TO]. If the upper limit TO is omitted, only the contents of the memory cell with address FROM is printed, as in MIX > pmem 3000 3000: + 46 58 00 19 37 (0786957541) MIX > The memory contents are displayed both as the set of five MIX bytes plus sign composing the stored MIX word and, between parenthesis, the decimal representation of the module of the stored value. 'smem' sets the content of the memory cell with address ADDRESS to VALUE, expressed as a decimal constant.  File: mdk.info, Node: Configuration commands, Next: Scheme commands, Prev: State commands, Up: Commands 6.2.4 Configuration commands ---------------------------- This section describes commands that allow you to configure the virtual machine behaviour. This configuration is stored in the MDK directory '~/.mdk'. As you can see in their description, some commands print, as a side effect, informational messages to the standard output (e.g. 'load' prints a message telling you the loaded program's start address): these messages can be enabled/disabled using 'slog': -- config command: slog on|off Turns on/off the logging of informational messages. Note that error messages are always displayed, as well as state messages required using commands prefixed with 'p' ('preg', 'pmem' and the like). -- config command: stime on|off -- config command: ptime The 'stime' command (un)sets the printing of timing statistics, and 'ptime' prints their current value: MIX > ptime Elapsed time: 10 /Total program time: 11 (Total uptime: 11) MIX > -- config command: sedit TEMPLATE -- config command: pedit 'sedit' sets the command to be used to edit MIXAL source files with the 'edit' command. TEMPLATE must contain the control characters '%s' to mark the place where the source's file name will be inserted. For instance, if you type MIX > sedit emacsclient %s MIX > issuing the 'mixvm' command 'edit foo.mixal' will invoke the operating system command 'emacsclient foo.mixal'. 'pedit' prints the current value of the edit command template. -- config command: sasm TEMPLATE -- config command: pasm 'sasm' sets the command to be used to compile MIXAL source files with the 'compile' command. TEMPLATE must contain the control characters '%s' to mark the place where the source's file name will be inserted. For instance, if you type MIX > sasm mixasm -l %s MIX > issuing the 'mixvm' command 'compile foo.mixal' will invoke the operating system command 'mixasm -l foo.mixal'. 'pasm' prints the current value of the compile command template. -- config command: sddir DIRNAME -- config command: pddir MIX devices (*note Devices::) are implemented as regular files stored, by default, inside '~/.mdk'. The 'sddir' command lets you specify an alternative location for storing these device files, while 'pddir' prints the current device directory. Finally, you can change the default command prompt, 'MIX > ', using the 'prompt' command: -- config command: prompt PROMPT Changes the command prompt to PROMPT. If you want to include white space(s) at the end of the new prompt, bracket PROMPT using double quotes (e.g., 'prompt ">> "').  File: mdk.info, Node: Scheme commands, Prev: Configuration commands, Up: Commands 6.2.5 Scheme commands --------------------- If you have compiled MDK with 'libguile' support (*note Special configure flags::), 'mixvm' will start and initialise an embedded Guile Scheme interpreter when it is invoked. That means that you have at your disposal, at 'mixvm''s command prompt, all the Scheme primitives described in *note Using mixguile:: and *note mixguile::, as well as any other function or hook that you have defined in the initialisation file '~/.mdk/mixguile.scm'. To evaluate a Scheme function, simply type it at the 'mixvm' command prompt (see *note Using Scheme in mixvm and gmixvm:: for a sample). Compared to the 'mixguile' program, this has only one limitation: the expressions used in 'mixvm' cannot span more than one line. You can get over this inconvenience writing your multiline Scheme expressions in a file and loading it using the 'scmf' command: -- scheme command: scmf FILE_NAME Loads the given Scheme file and evaluates it using the embedded Guile interpreter.  File: mdk.info, Node: Devices, Prev: Commands, Up: mixvm 6.3 MIX block devices ===================== The MIX computer comes equipped with a set of block devices for input-output operations (*note Input-output operators::). 'mixvm' implements these block devices as disk files, with the exception of block device no. 19 (typewriter terminal) which is redirected to standard input/output. When you request an output operation on any other (output) device, a file named according to the following table will be created, and the specified MIX words will be written to the file in binary form (for binary devices) or in ASCII (for char devices). Files corresponding to input block devices should be created and filled beforehand to be used by the MIX virtual machine (for input-output devices this creation can be accomplished by a MIXAL program writing to the device the required data, or, if you prefer, with your favourite editor). The device files are stored, by default, in the directory '~/.mdk'; this location can be changed using the 'mixvm' command 'devdir' (*note Configuration commands::). _Device_ _No._ _filename_ _type and block size_ Tape 0-7 'tape[0-7].dev' bin i/o - 100 words Disks 8-15 'disk[0-7].dev' bin i/o - 100 words Card reader 16 'cardrd.dev' char in - 16 words Card writer 17 'cardwr.dev' char out - 16 words Line printer 18 'printer.dev' char out - 24 words Terminal 19 'stdin/stdout' char i/o - 14 words Paper tape 20 'paper.dev' char in - 14 words Devices of type char are stored as ASCII files, using one line per block. For instance, since the card reader has blocks of size 16, that is, 80 characters, it will be emulated by an ASCII file consisting of lines with length 80. If the reader finds a line with less than the required number of characters, it pads the memory with zeroes (MIX character 'space') to complete the block size. Note that the virtual machine automatically converts between the MIX and ASCII character encodings, so that you can manipulate char device files with any ASCII editor. In addition, the reader is not case-sensitive, i.e., it automatically converts lowercase letters to their uppercase counterparts (since the MIX character set does not include the former). The typewriter (device no. 19) lets you use the standard input and output in your MIXAL programs. For instance, here is a simple 'echo' program: * simple echo program TERM EQU 19 the typewriter device BUF EQU 500 input buffer ORIG 1000 START IN BUF(TERM) read a block (70 chars) OUT BUF(TERM) write the read chars HLT END START Input lines longer than 70 characters (14 words) are trimmed. On the other hand, if you type less than a block of characters, whitespace (MIX character zero) is used as padding.  File: mdk.info, Node: gmixvm, Next: mixguile, Prev: mixvm, Up: Top 7 'gmixvm', the GTK virtual machine *********************************** This chapter describes the graphical MIX virtual machine emulator shipped with MDK. In addition to having all the command-oriented functionalities of the other virtual machines ('mixvm' and 'mixguile'), 'gmixvm' offers you a graphical interface displaying the status of the virtual machine, the source code of the the downloaded programs and the contents of the MIX devices. * Menu: * Invoking gmixvm:: * MIXVM console:: Using 'mixvm' commands. * MIX virtual machine:: The MIX virtual machine window. * MIXAL source view:: Viewing the MIXAL source code. * MIX devices view:: Device output. * Menu and status bars:: Available menu commands.  File: mdk.info, Node: Invoking gmixvm, Next: MIXVM console, Prev: gmixvm, Up: gmixvm 7.1 Invoking 'gmixvm' ===================== If you have built MDK with GTK+ support (*note Installing MDK::), a graphical front-end for the MIX virtual machine will be available in your system. You can invoke it by typing gmixvm [-vhuq] [--version] [--help] [--usage] [--noinit] at your command prompt, where the options have the following meanings: -- User Option: -v -- User Option: --version Prints version and copyleft information and exits. -- User Option: -h -- User Option: --help -- User Option: -u -- User Option: --usage Prints a summary of available options and exits. -- User Option: -q -- User Option: --noinit Do not load the Guile initialisation file '~/.mdk/mixguile.scm' at startup. This file contains any local Scheme code to be executed by the embedded Guile interpreter at startup (*note Using Scheme in mixvm and gmixvm::). Typing 'gmixvm' or 'gmixvm -q' at your command prompt, the main window will appear, offering you a graphical interface to run and debug your MIX programs. [image src="img/ss_mix.jpg" text="|-----------------------------------------------------------| | Menu | |-----------------------------------------------------------| | | | | | | | | | MIXVM / MIXAL / Devices | | | | | | | | | | | | | |-----------------------------------------------------------| | | | Command output | | | | | | | |-----------------------------------------------------------| | Command prompt | |-----------------------------------------------------------| | Status bar | |-----------------------------------------------------------| "] Apart from the menu and status bars, we can distinguish two zones (or halves) in this main window. In the upper half of 'gmixvm''s main window there is a notebook with three pages, namely, * a MIX virtual machine view, which shows you the registers, flags, memory contents and time statistics of the virtual machine; * a MIXAL source view, which shows the MIXAL file and lets you manage breakpoints; * a Devices view, which shows you the output to character based MIX block devices. These three windows can be detached from the notebook, using either the penultimate toolbar button (which detachs the currently visible notebook page) or the menu entries under 'View->Detached windows'. On the other hand, the main window's lower half presents you a 'mixvm' command prompt and a logging area where results of the issued commands are presented. These widgets implement a 'mixvm' console which offers almost the same functionality as its CLI counterpart. When 'gmixvm' is run, it creates a directory named '.mdk' in your home directory (if it does not already exist). The '.mdk' directory contains the program settings, the device files used by your MIX programs (*note Devices::), and a command history file. The following sections describe the above mentioned components of 'gmixvm'.  File: mdk.info, Node: MIXVM console, Next: MIX virtual machine, Prev: Invoking gmixvm, Up: gmixvm 7.2 MIXVM console ================= In the lower half of the 'gmixvm' main window, you will find a command text entry and, above it, an echo area. These widgets offer you the same functionality as its CLI counterpart, 'mixvm' (*note mixvm::). You can issue almost all 'mixmv' commands at the 'gmixvm''s command prompt in order to manipulate the MIX virtual machine. Please refer to *Note mixvm::, for a description of these commands, and to *Note Getting started::, for a tutorial on using the MIX virtual machine. The command prompt offers command line completion for partially typed commands using the key; e.g., if you type lo the command is automatically completed to 'load'. If multiple completions are available, they will be shown in the echo area. Thus, typing p will produce the following output on the echo area: Completions: pc psym preg pflags pall pmem which lists all the available commands starting with 'p'. In addition, the command prompt maintains a history of typed commands, which can be recovered using the arrow up and down keys. As mentioned above, a file containing previous sessions' commands is stored in the configuration directory '~/.mdk', and reloaded every time you start 'gmixvm'. You can change the font used to display the issued commands and the messages in the echo area using the 'Settings->Change font->Command prompt' and 'Settings->Change font->Command log' menu commands.  File: mdk.info, Node: MIX virtual machine, Next: MIXAL source view, Prev: MIXVM console, Up: gmixvm 7.3 MIX virtual machine ======================= The first notebook's page displays the current status of the virtual machine. There you can find the registers' contents, the value of the comparison and overflow flags, the location pointer, a list with all MIX memory cells and their contents, and the time statistics (including total uptime, elapsed time since the last run command and total execution time for the currently loaded MIX program). If you click any register entry, you will be prompted for a new register's contents. In the same manner, click on any address of the memory cells list to be prompted for the new contents of the clicked cell. If you click the address column's title, a dialog asking you for a memory address will appear; if you introduce a valid address, this will be the first cell displayed in the scrollable list after you click the OK button. The register contents are shown as a list of MIX bytes plus sign. If you place the mouse pointer over any of them, the decimal value of this MIX word will appear inside a tooltip. You can change the font used to display the MIX virtual machine contents using the 'Settings->Change font->MIX' menu command.  File: mdk.info, Node: MIXAL source view, Next: MIX devices view, Prev: MIX virtual machine, Up: gmixvm 7.4 MIXAL source view ===================== The second notebook's page, dubbed Source, shows you the MIXAL source of the currently loaded MIX file. The information is presented in four columns. The first column displays little icons showing the current program pointer and any set breakpoints. The second and third columns show the address and memory contents of the compiled MIX instruction, while the last one displays its corresponding MIXAL representation, together with the source file line number. You can set/unset breakpoints by clicking on any line that has an associated memory address. You can change the font used to display the MIXAL source code using the 'Settings->Change font->MIXAL' menu command.  File: mdk.info, Node: MIX devices view, Next: Menu and status bars, Prev: MIXAL source view, Up: gmixvm 7.5 MIX devices view ==================== The last notebook page, dubbed Devices, shows you the output/input to/from MIX block devices (the console, line printer, paper tape, disks, card and tapes *note Devices::) produced by the running program. Input device contents is read from files located in the '~/.mdk' directory, and the output is also written to files at the same location. Note that device tabs will appear as they are used by the MIX program being run, and that loading a new MIX program will close all previously open devices. The input/output for binary block devices (tapes and disks) is a list of MIX words, which can be displayed either in decimal or word format (e.g. - 67 or - 00 00 00 01 03). The format used by 'gmixvm' can be configured using the 'Settings->Device output' menu command for each binary device. You can change the font used to display the devices content using the 'Settings->Change font->Devices' menu command.  File: mdk.info, Node: Menu and status bars, Prev: MIX devices view, Up: gmixvm 7.6 Menu and status bars ======================== The menu bar gives you access to the following commands: -- File: Load... Opens a file dialog that lets you specify a binary MIX file to be loaded in the virtual machine's memory. It is equivalent to the 'mixvm''s 'load' command (*note File commands::). -- File: Edit... Opens a file dialog that lets your specify a MIXAL source file to be edited. It is equivalent to the 'mixvm''s 'edit' command (*note File commands::). The program used for editing can be specified using the menu entry 'Settings->External programs', or using the 'mixvm' command 'sedit'. -- File: Compile... Opens a file dialog that lets your specify a MIXAL source file to be compiled. It is equivalent to the 'mixvm''s 'compile' command (*note File commands::). The command used for compiling can be specified using the menu entry 'Settings->External programs', or using the 'mixvm' command 'sasm'. -- File: Exit Exits the application. -- Debug: Run Runs the currently loaded MIX program, up to the next breakpoint. It is equivalent to the 'mixvm''s 'run' command (*note Debug commands::). -- Debug: Next Executes the next MIX instruction. It is equivalent to the 'mixvm''s 'next' command (*note Debug commands::). -- Debug: Clear breakpoints Clears all currently set breakpoints. It is equivalent to the 'mixvm''s 'cabp' command. -- Debug: Symbols... Opens a dialog showing the list of symbols defined in the currently loaded MIX program. The font used to display this list can be customised using the meny entry 'Settings->Change font->Symbol list'. -- View: Toolbar(s) Toggles the toolbar(s) in the 'gmixvm' window(s) (when notebook pages are detached, each one has its own toolbar). -- View: Detached windows Virtual machine -- View: Detached windows Source -- View: Detached windows Devices These toggles let you detach (or re-attach) the corresponding notebook page. -- Settings: Change font Lets you change the font used in the various 'gmixv' widgets (i.e. commad prompt, command log, Virtual machine, Source, Devices and Symbol list). There is also an entry ('All') to change all fonts at once. -- Settings: Device output... Opens a dialog that lets you specify which format shall be used to show the contents of MIX binary block devices. The available formats are decimal (e.g. -1234) and MIX word (e.g. - 00 00 00 19 18). -- Settings: Devices dir... Opens a dialog that lets you choose where the MIX device files will be stored ('~/.mdk' is the default location). You can also specify the devices directory using the 'mixvm' command 'sddir' (*note Configuration commands::). -- Settings: External programs... This menu command opens a dialog that lets you specify the commands used for editing and compiling MIXAL source files. The commands are specified as template strings, where the control substring '%s' will be substituted by the actual file name. Thus, if you want to edit programs using 'vi' running in an 'xterm', you must enter the command template 'xterm -e vi %s' in the corresponding dialog entry. These settings can also be changed using the 'mixvm' commands 'sedit' and 'sasm' (*note Configuration commands::). -- Settings: Save Saves the current settings. -- Settings: Save on exit Mark this checkbox if you want 'gmixvm' to save its settings every time you quit the program. -- Help: About... Shows information about 'gmixvm''s version and copyright. On the other hand, the status bar displays the name of the last loaded MIX file. In addition, when the mouse pointer is over a MIXAL source file line that contains symbols, a list of these symbols with their values will appear in the status bar.  File: mdk.info, Node: mixguile, Next: Problems, Prev: gmixvm, Up: Top 8 'mixguile', the Scheme virtual machine **************************************** This chapter provides a reference to using 'mixguile' and the Scheme function library giving access to the MIX virtual machine in the MDK emulators ('mixguile', 'mixvm' and 'gmixvm'). See *note Using mixguile:: for a tutorial, step by step introduction to 'mixguile' and using Scheme as an extension language for the MDK MIX virtual machines. * Menu: * Invoking mixguile:: Command line options. * Scheme functions reference:: Scheme functions accessing the VM.  File: mdk.info, Node: Invoking mixguile, Next: Scheme functions reference, Prev: mixguile, Up: mixguile 8.1 Invoking 'mixguile' ======================= Invoking 'mixguile' without arguments will enter the Guile REPL (read-eval-print loop) after loading, if it exists, the user's initialisation file ('~/.mdk/mixguile.scm'). 'mixguile' accepts the same command line options than Guile: mixguile [-s SCRIPT] [-c EXPR] [-l FILE] [-e FUNCTION] [-qhv] [--help] [--version] The meaning of these options is as follows: -- User Option: -h -- User Option: --help Prints usage summary and exits. -- User Option: -v -- User Option: --version Prints version and copyleft information and exits. -- User Option: -s SCRIPT Loads Scheme code from SCRIPT, evaluates it and exits. This option can be used to write executable Scheme scripts, as described in *note Scheme scripts::. -- User Option: -c EXPR Evaluates the given Scheme expression and exits. -- User Option: -l FILE Loads the given Scheme file and enters the REPL (read-eval-print loop). -- User Option: -e FUNCTION After reading the script, executes the given function using the provided command line arguments. For instance, you can write the following Scheme script: #! /usr/bin/mixguile \ -e main -s !# ;;; execute a given program and print the registers. (define main (lambda (args) ;; load the file provided as a command line argument (mix-load (cadr args)) ;; execute it (mix-run) ;; print the contents of registers (mix-pall))) save it in a file called, say, 'foo', make it executable, and run it as $ ./foo hello This invocation will cause the evaluation of the 'main' function with a list of command line parameters as its argument ('("./foo" "hello")' in the above example. Note that command line options to mixguile must be written in their own line after the '\' symbol. -- User Option: -q Do not load user's initialisation file. When 'mixguile' starts up, it looks for a file named 'mixguile.scm' in the user's MDK configuration directory ('~/.mdk'), and loads it if it exists. This option tells 'mixguile' to skip this initialisation file loading.  File: mdk.info, Node: Scheme functions reference, Prev: Invoking mixguile, Up: mixguile 8.2 Scheme functions reference ============================== As we have previously pointed out, 'mixguile' embeds a MIX virtual machine that can be accessed through a set of Scheme functions, that is, of a Scheme library. Conversely, 'mixvm' and 'gmixvm' contain a Guile interpreter, and are able to use this same Scheme library, as well as all the other Guile/Scheme primitives and any user defined function. Therefore, you have at your disposal a powerful programming language, Scheme, to extend the MDK virtual machine emulators (see *note Using Scheme in mixvm and gmixvm:: for samples of how to do it). The following subsections describe available functions the MIX/Scheme library. * Menu: * mixvm wrappers:: Functions invoking mixvm commands. * Hooks:: Adding hooks to mixvm commands. * Additional VM functions:: Functions accessing the MIX virtual machine.  File: mdk.info, Node: mixvm wrappers, Next: Hooks, Prev: Scheme functions reference, Up: Scheme functions reference 8.2.1 'mixvm' command wrappers ------------------------------ For each of the 'mixvm' commands listed in *note Commands::, there is a corresponding Scheme function named by prefixing the command name with 'mix-' (e.g., 'mix-load', 'mix-run' and so on). These command wrappers are implemented using a generic command dispatching function: -- Function: mixvm-cmd command argument Dispatches the given COMMAND to the MIX virtual machine appending the provided ARGUMENT. Both COMMAND and 'argument' must be strings. The net result is as writing "COMMAND ARGUMENT" at the 'mixvm' or 'gmixvm' command prompt. For instance, you can invoke the 'run' command at the 'mixvm' prompt in three equivalent ways: MIX > run hello MIX > (mix-run "hello") MIX > (mixvm-cmd "run" "hello") (only the two last forms can be used at the 'mixguile' prompt or inside a Scheme script). The 'mix-' functions evaluate to a unspecified value. If you want to check the result of the last 'mixvm' command invocation, use the 'mix-last-result' function: -- Function: mix-last-result Returns #T if the last 'mixvm' command invocation was successful, #F otherwise. Using this function, we could improve the script for running a program presented in the previous section by adding error checking: #! /usr/bin/mixguile \ -e main -s !# ;;; Execute a given program and print the registers. (define main (lambda (args) ;; load the file provided as a command line argument (mix-load (cadr args)) ;; execute it if mix-load succeeded (if (mix-last-result) (mix-run)) ;; print the contents of registers if the above commands succeeded (if (mix-last-result) (mix-pall)))) Please, refer to *note Commands:: for a list of available commands. Given the description of a 'mixvm', it is straightforward to use its Scheme counterpart and, therefore, we shall not give a complete description of these functions here. Instead, we will only mention those wrappers that exhibit a treatment of their differing from that of their command counterpart. -- Function: mix-preg [register] -- Function: mix-sreg register value The argument REGISTER of these functions can be either a string or a symbol representing the desired register. For instance, the following invocations are equivalent: (mix-preg 'I1) (mix-preg "I1") -- Function: mix-pmem from [to] The command 'pmem' takes a single argument which can be either a cell number or a range of the form 'FROM-TO'. This function takes one argument to ask for a single memory cell contents, or two parameters to ask for a range. For instance, the following commands are equivalent: MIX > pmem 10-12 0010: + 00 00 00 00 00 (0000000000) 0011: + 00 00 00 00 00 (0000000000) 0012: + 00 00 00 00 00 (0000000000) MIX > (mix-pmem 10 12) 0010: + 00 00 00 00 00 (0000000000) 0011: + 00 00 00 00 00 (0000000000) 0012: + 00 00 00 00 00 (0000000000) MIX > -- Function: mix-sover #t|#f The command 'sover' takes as argument either the string 'T' or the string 'F', to set, respectively, the overflow toggle to true or false. Its Scheme counterpart, 'mix-sover', takes as argument a Scheme boolean value: '#t' (true) or '#f'. For the remaining functions, you simply must take into account that when the command arguments are numerical, the corresponding Scheme function takes as arguments Scheme number literals. On the other hand, when the command argument is a string, the argument of its associated Scheme function will be a Scheme string. By way of example, the following invocations are pairwise equivalent: MIX > load ../samples/hello MIX > (mix-load "../samples/hello") MIX > next 5 MIX > (mix-next 5)  File: mdk.info, Node: Hooks, Next: Additional VM functions, Prev: mixvm wrappers, Up: Scheme functions reference 8.2.2 Hook functions -------------------- Hooks are functions evaluated before or after executing a 'mixvm' command (or its corresponding Scheme function wrapper), or after an explicit or conditional breakpoint is found during the execution of a MIX program. The following functions let you install hooks: -- Function: mix-add-pre-hook command hook Adds a function to the list of pre-hooks associated with the given COMMAND. COMMAND is a string naming the corresponding 'mixvm' command, and HOOK is a function which takes a single argument: a string list of the commands arguments. The following scheme code defines a simple hook and associates it with the 'run' command: (define run-hook (lambda (args) (display "argument list: ") (display args) (newline))) (mix-add-pre-hook "run" run-hook) Pre-hooks are executed, in the order they are added, before invoking the corresponding command (or its associated Scheme wrapper function). -- Function: mix-add-post-hook command hook Adds a function to the list of pre-hooks associated with the given COMMAND. The arguments have the same meaning as in 'mix-add-pre-hook'. -- Function: mix-add-global-pre-hook hook -- Function: mix-add-global-post-hook hook Global pre/post hooks are executed before/after any 'mixvm' command or function wrapper invocation. In this case, HOOK takes two arguments: a string with the name of the command being invoked, and a string list with its arguments. -- Function: mix-add-break-hook hook -- Function: mix-add-cond-break hook Add a hook funtion to be executed when an explicit (resp. conditional) breakpoint is encountered during program execution. HOOK is a function taking two arguments: the source line number where the hook has occurred, and the current program counter value. The following code shows a simple definition and installation of a break hook: (define break-hook (lambda (line address) (display "Breakpoint at line ") (display line) (display " and address ") (display address) (newline))) (mix-add-break-hook break-hook) Break hook functions are entirely implemented in Scheme using regular post-hooks for the 'next' and 'run' commands. If you are curious, you can check the Scheme source code at '_prefix_/share/mdk/mixguile-vm-stat.scm' (where _prefix_ stands for your root install directory, usually '/usr' or '/usr/local'. See *note Hook functions:: for further examples on using hook functions.  File: mdk.info, Node: Additional VM functions, Prev: Hooks, Up: Scheme functions reference 8.2.3 Additional VM functions ----------------------------- When writing non-trivial Scheme extensions using the MIX/Scheme library, you will probably need to evaluate the contents of the virtual machine components (registers, memory cells and so on). For instance, you may need to store the contents of the 'A' register in a variable. The Scheme functions described so far are of no help: you can print the contents of 'A' using '(mix-preg 'A)', but you cannot define a variable containing the contents of 'A'. To address this kind of problems, the MIX/Scheme library provides the following additional functions: -- Function: mixvm-status -- Function: mix-vm-status Return the current status of the virtual machine, as a number ('mixvm-status') or as a symbol ('mix-vm-status'). Possible return values are: '(mixvm-status)' '(mix-vm-status)' 0 MIX_ERROR Loading or execution error 1 MIX_BREAK Breakpoint encountered 2 MIX_COND_BREAK Conditional breakpoint 3 MIX_HALTED Execution terminated 4 MIX_RUNNING Execution stopped after 'next' 5 MIX_LOADED Program successfully loaded 6 MIX_EMPTY No program loaded -- Function: mix-vm-error? -- Function: mix-vm-break? -- Function: mix-vm-cond-break? -- Function: mix-vm-halted? -- Function: mix-vm-running? -- Function: mix-vm-loaded? -- Function: mix-vm-empty? Predicates asking whether the current virtual machine status is 'MIX_ERROR', 'MIX_BREAK', etc. -- Function: mix-reg register -- Function: mix-set-reg! register value 'mix-reg' evaluates to a number which is the contents of the specified REGISTER. 'mix-set-reg' sets the contents of the given REGISTER to VALUE. The register can be specified either as a string ('"A"', '"X"', etc.) or as a symbol (''A', ''X', etc.). For instance, guile> (mix-reg 'A) 2341 guile> (mix-set-reg! "A" 2000) ok guile> (define reg-a (mix-reg 'A)) guile> (display reg-a) 2000 guile> -- Function: mix-cell cell_no -- Function: mix-set-cell! cell_no value Evaluate and set the contents of the memory cell number CELL_NO. Both CELL_NO and VALUE are Scheme numbers. -- Function: mix-loc Evaluates to the value of the location counter (i.e., the address of the next instruction to be executed). -- Function: mix-over -- Function: mix-set-over! #t|#f 'mix-over' evaluates to '#t' if the overflow toggle is set, and to '#f' otherwise. The value of the overflow toggle can be modified using 'mix-set-over!'. -- Function: mix-cmp -- Function: mix-set-cmp! 'L|'E|'G Evaluate and set the comparison flag. Possible values are the scheme symbols 'L' (lesser), 'E' (equal) and 'G' (greater). -- Function: mix-up-time Evaluates to the current virtual machine uptime. -- Function: mix-lap-time Evaluates to the current virtual machine lapsed time, i.e., the time elapsed since the last 'run' or 'next' command. -- Function: mix-prog-time Evaluates to the total time spent executing the currently loaded program. -- Function: mix-prog-name Evaluates to a string containing the basename (without any leading path) of the currently loaded MIX program. -- Function: mix-prog-path Evaluates to a string containing the full path to the currently loaded MIX program. -- Function: mix-src-path Evaluates to a string containing the full path to the source file of the currently loaded MIX program. -- Function: mix-src-line [lineno] -- Function: mix-src-line-no 'mix-src-line-no' evaluates to the current source file number during the execution of a program. 'mix-src-line' evaluates to a string containing the source file line number LINENO; when invoked without argument, it evaluates to '(mix-src-line (mix-src-line-no))'. -- Function: mix-ddir Evaluates to a string containing the full path of the current device directory.  File: mdk.info, Node: Problems, Next: Copying, Prev: mixguile, Up: Top 9 Reporting Bugs **************** If you have any questions, comments or suggestions, please send electronic mail to the author . If you find a bug in MDK, please send electronic mail to the MDK bug list . In your report, please include the version number, which you can find by running 'mixasm --version'. Also include in your message the output that the program produced and the output you expected.  File: mdk.info, Node: Copying, Next: Concept Index, Prev: Problems, Up: Top Appendix A Copying ****************** * Menu: * GNU General Public License:: * GNU Free Documentation License:: GNU MDK is distributed under the GNU General Public License (GPL) and this manual under the GNU Free Documentation License (GFDL).  File: mdk.info, Node: GNU General Public License, Next: GNU Free Documentation License, Prev: Copying, Up: Copying A.1 GNU General Public License ============================== Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS ==================== 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a. The work must carry prominent notices stating that you modified it, and giving a relevant date. b. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d. Limiting the use for publicity purposes of names of licensors or authors of the material; or e. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS =========================== How to Apply These Terms to Your New Programs ============================================= If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) YEAR NAME OF AUTHOR This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: PROGRAM Copyright (C) YEAR NAME OF AUTHOR This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free software, and you are welcome to redistribute it under certain conditions; type 'show c' for details. The hypothetical commands 'show w' and 'show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .  File: mdk.info, Node: GNU Free Documentation License, Prev: GNU General Public License, Up: Copying A.2 GNU Free Documentation License ================================== Version 1.2, November 2002 Copyright (C) 2000,2001,2002 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. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document 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. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: mdk.info, Node: Concept Index, Next: Instructions and commands, Prev: Copying, Up: Top Concept Index ************* [index] * Menu: * .mix file: Compiling. (line 16) * .mixal file: Writing a source file. (line 6) * .mls file: Invoking mixasm. (line 47) * address: MIX architecture. (line 6) * address transfer operators: Address transfer operators. (line 6) * arithmetic operators: Arithmetic operators. (line 6) * assembler: Compiling. (line 6) * assembler <1>: mixasm. (line 6) * assembly: MIXAL. (line 6) * binary operator: Expressions. (line 6) * binary programs: Compiling. (line 6) * break hook: Break hooks. (line 6) * breakpoints: Debugging. (line 37) * breakpoints <1>: Debugging. (line 56) * bugs: Problems. (line 6) * byte: MIX architecture. (line 6) * cell: MIX architecture. (line 6) * CM: MIX architecture. (line 51) * comments: MIXAL directives. (line 102) * comparison indicator: MIX architecture. (line 51) * comparison operators: Comparison operators. (line 6) * compiling: Compiling. (line 6) * conversion operators: Conversion operators. (line 6) * exection time: Execution times. (line 6) * FDL, GNU Free Documentation License: GNU Free Documentation License. (line 6) * field specification: MIX architecture. (line 6) * fspec: MIX architecture. (line 6) * global hook: Command hooks. (line 88) * 'gmixvm': gmixvm. (line 6) * GPL, GNU General Public License: GNU General Public License. (line 6) * GTK+: gmixvm. (line 6) * GUI: gmixvm. (line 6) * 'help': Interactive mode. (line 93) * hook function: Hook functions. (line 6) * index: MIX architecture. (line 6) * input-output devices: MIX architecture. (line 51) * input-output operators: Input-output operators. (line 6) * instruction: MIX architecture. (line 6) * instruction set: MIX instruction set. (line 6) * interactive mode: Running the program. (line 6) * interactive mode <1>: Interactive mode. (line 6) * Introduction: Introduction. (line 6) * jump operators: Jump operators. (line 6) * literal constants: Literal constants. (line 6) * 'load': Interactive mode. (line 22) * loading operators: Loading operators. (line 6) * local symbols: Local symbols. (line 6) * memory: MIX architecture. (line 6) * memory cell: MIX architecture. (line 6) * miscellaneous operators: Miscellaneous operators. (line 6) * MIX: MIX and MIXAL tutorial. (line 6) * MIX architecture: MIX architecture. (line 6) * MIX assembly language: MIXAL. (line 6) * MIX byte: MIX architecture. (line 6) * MIX computer: MIX architecture. (line 6) * MIX instruction: MIX architecture. (line 6) * MIX register: MIX architecture. (line 6) * MIX word: MIX architecture. (line 6) * MIXAL: MIX and MIXAL tutorial. (line 6) * MIXAL <1>: MIXAL. (line 6) * MIXAL <2>: Writing a source file. (line 6) * MIXAL <3>: mixasm. (line 6) * 'mixasm': Compiling. (line 6) * 'mixasm' <1>: mixasm. (line 6) * 'mixguile': The mixguile shell. (line 6) * 'mixguile' <1>: mixguile. (line 6) * 'mixguile' options: Invoking mixguile. (line 6) * 'mixvm': Running the program. (line 6) * mixvm: mixvm. (line 6) * 'next': Debugging. (line 6) * non-interactive: Scheme scripts. (line 6) * non-interactive mode: Running the program. (line 6) * non-interactive mode <1>: Non-interactive mode. (line 6) * operator: Expressions. (line 6) * OV: MIX architecture. (line 51) * overflow toggle: MIX architecture. (line 51) * 'pc': Interactive mode. (line 35) * 'pmem': Interactive mode. (line 64) * post-hook: Hook functions. (line 6) * pre-hook: Hook functions. (line 6) * 'preg': Interactive mode. (line 85) * problems: Problems. (line 6) * 'psym': Debugging. (line 77) * questions: Problems. (line 6) * rA: MIX architecture. (line 36) * register: MIX architecture. (line 6) * register <1>: MIX architecture. (line 36) * REPL: The mixguile shell. (line 6) * rIn: MIX architecture. (line 36) * rJ: MIX architecture. (line 36) * 'run': Interactive mode. (line 39) * rX: MIX architecture. (line 36) * 'sbp': Debugging. (line 56) * 'sbpa': Debugging. (line 37) * Scheme: The mixguile shell. (line 6) * Scheme functions: Defining new functions. (line 6) * Scheme script: Scheme scripts. (line 6) * 'scmf': Using Scheme in mixvm and gmixvm. (line 6) * shift: Shift operators. (line 6) * shift operators: Shift operators. (line 6) * source file: Writing a source file. (line 6) * storing operators: Storing operators. (line 6) * suggestions: Problems. (line 6) * tail recursion: Concept Index. (line 6) * time: Execution times. (line 6) * tutorial: Getting started. (line 6) * 'un': MIX architecture. (line 51) * unary operator: Expressions. (line 6) * virtual machine: Compiling. (line 6) * w-expressions: W-expressions. (line 6) * word: MIX architecture. (line 6)  File: mdk.info, Node: Instructions and commands, Prev: Concept Index, Up: Top Instructions and commands ************************* [index] * Menu: * About...: Menu and status bars. (line 99) * ADD: Arithmetic operators. (line 9) * ALF: MIXAL directives. (line 18) * cabp: Debug commands. (line 96) * cbp: Debug commands. (line 23) * cbpa: Debug commands. (line 54) * cbpc: Debug commands. (line 93) * cbpm: Debug commands. (line 77) * cbpo: Debug commands. (line 89) * cbpr: Debug commands. (line 66) * Change font: Menu and status bars. (line 60) * CHAR: Conversion operators. (line 13) * Clear breakpoints: Menu and status bars. (line 39) * CMPA: Comparison operators. (line 16) * CMPi: Comparison operators. (line 20) * CMPX: Comparison operators. (line 18) * compile: File commands. (line 47) * Compile...: Menu and status bars. (line 20) * CON: MIXAL directives. (line 15) * DECA: Address transfer operators. (line 30) * DECi: Address transfer operators. (line 34) * DECX: Address transfer operators. (line 32) * Detached windows: Menu and status bars. (line 53) * Detached windows <1>: Menu and status bars. (line 54) * Detached windows <2>: Menu and status bars. (line 55) * Device output...: Menu and status bars. (line 66) * Devices dir...: Menu and status bars. (line 73) * DIV: Arithmetic operators. (line 20) * edit: File commands. (line 38) * Edit...: Menu and status bars. (line 13) * END: MIXAL directives. (line 21) * ENNA: Address transfer operators. (line 17) * ENNi: Address transfer operators. (line 21) * ENNX: Address transfer operators. (line 19) * ENTA: Address transfer operators. (line 11) * ENTi: Address transfer operators. (line 15) * ENTX: Address transfer operators. (line 13) * EQU: MIXAL directives. (line 13) * Exit: Menu and status bars. (line 27) * External programs...: Menu and status bars. (line 80) * help: Commands. (line 27) * HLT: Miscellaneous operators. (line 14) * IN: Input-output operators. (line 10) * INCA: Address transfer operators. (line 23) * INCi: Address transfer operators. (line 27) * INCX: Address transfer operators. (line 25) * IOC: Input-output operators. (line 16) * JAE: Jump operators. (line 62) * JAN: Jump operators. (line 56) * JANN: Jump operators. (line 59) * JANP: Jump operators. (line 61) * JANZ: Jump operators. (line 60) * JAO: Jump operators. (line 63) * JAP: Jump operators. (line 58) * JAZ: Jump operators. (line 57) * JBUS: Input-output operators. (line 22) * JE: Jump operators. (line 42) * JG: Jump operators. (line 44) * JGE: Jump operators. (line 46) * JiN: Jump operators. (line 78) * JiNN: Jump operators. (line 81) * JiNP: Jump operators. (line 83) * JiNZ: Jump operators. (line 82) * JiP: Jump operators. (line 80) * JiZ: Jump operators. (line 79) * JL: Jump operators. (line 40) * JLE: Jump operators. (line 50) * JMP: Jump operators. (line 24) * JNE: Jump operators. (line 48) * JNOV: Jump operators. (line 34) * JOV: Jump operators. (line 32) * JRED: Input-output operators. (line 19) * JSJ: Jump operators. (line 26) * JXE: Jump operators. (line 73) * JXN: Jump operators. (line 67) * JXNN: Jump operators. (line 70) * JXNP: Jump operators. (line 72) * JXNZ: Jump operators. (line 71) * JXO: Jump operators. (line 74) * JXP: Jump operators. (line 69) * JXZ: Jump operators. (line 68) * LDA: Loading operators. (line 9) * LDAN: Loading operators. (line 18) * LDi: Loading operators. (line 15) * LDiN: Loading operators. (line 24) * LDX: Loading operators. (line 12) * LDXN: Loading operators. (line 21) * load: File commands. (line 9) * Load...: Menu and status bars. (line 8) * mix-add-break-hook: Hooks. (line 41) * mix-add-cond-break: Hooks. (line 42) * mix-add-global-post-hook: Hooks. (line 35) * mix-add-global-pre-hook: Hooks. (line 34) * mix-add-post-hook: Hooks. (line 29) * mix-add-pre-hook: Hooks. (line 11) * mix-cell: Additional VM functions. (line 56) * mix-cmp: Additional VM functions. (line 71) * mix-ddir: Additional VM functions. (line 107) * mix-lap-time: Additional VM functions. (line 79) * mix-last-result: mixvm wrappers. (line 30) * mix-loc: Additional VM functions. (line 61) * mix-over: Additional VM functions. (line 65) * mix-pmem: mixvm wrappers. (line 67) * mix-preg: mixvm wrappers. (line 58) * mix-prog-name: Additional VM functions. (line 87) * mix-prog-path: Additional VM functions. (line 91) * mix-prog-time: Additional VM functions. (line 83) * mix-reg: Additional VM functions. (line 39) * mix-set-cell!: Additional VM functions. (line 57) * mix-set-cmp!: Additional VM functions. (line 72) * mix-set-over!: Additional VM functions. (line 66) * mix-set-reg!: Additional VM functions. (line 40) * mix-sover: mixvm wrappers. (line 84) * mix-src-line: Additional VM functions. (line 99) * mix-src-line-no: Additional VM functions. (line 100) * mix-src-path: Additional VM functions. (line 95) * mix-sreg: mixvm wrappers. (line 59) * mix-up-time: Additional VM functions. (line 76) * mix-vm-break?: Additional VM functions. (line 30) * mix-vm-cond-break?: Additional VM functions. (line 31) * mix-vm-empty?: Additional VM functions. (line 35) * mix-vm-error?: Additional VM functions. (line 29) * mix-vm-halted?: Additional VM functions. (line 32) * mix-vm-loaded?: Additional VM functions. (line 34) * mix-vm-running?: Additional VM functions. (line 33) * mix-vm-status: Additional VM functions. (line 16) * mixvm-cmd: mixvm wrappers. (line 11) * mixvm-status: Additional VM functions. (line 15) * MOVE: Miscellaneous operators. (line 9) * MUL: Arithmetic operators. (line 16) * next: Debug commands. (line 9) * Next: Menu and status bars. (line 35) * NOP: Miscellaneous operators. (line 12) * NUM: Conversion operators. (line 9) * ORIG: MIXAL directives. (line 10) * OUT: Input-output operators. (line 13) * pall: State commands. (line 27) * pasm: Configuration commands. (line 47) * pbt: Debug commands. (line 156) * pc: State commands. (line 20) * pddir: Configuration commands. (line 63) * pedit: Configuration commands. (line 31) * pflags: State commands. (line 61) * pline: Debug commands. (line 144) * pmem: State commands. (line 77) * pprog: File commands. (line 54) * preg: State commands. (line 26) * prompt: Configuration commands. (line 72) * psrc: File commands. (line 55) * pstat: State commands. (line 10) * psym: Debug commands. (line 99) * ptime: Configuration commands. (line 22) * quit: File commands. (line 69) * run: File commands. (line 25) * Run: Menu and status bars. (line 30) * sasm: Configuration commands. (line 46) * Save: Menu and status bars. (line 92) * Save on exit: Menu and status bars. (line 95) * sbp: Debug commands. (line 22) * sbpc: Debug commands. (line 92) * sbpm: Debug commands. (line 76) * sbpo: Debug commands. (line 88) * sbpr: Debug commands. (line 65) * scmf: Scheme commands. (line 19) * scmp: State commands. (line 62) * sddir: Configuration commands. (line 62) * sedit: Configuration commands. (line 30) * SLA: Shift operators. (line 9) * SLAX: Shift operators. (line 11) * SLB: Shift operators. (line 22) * SLC: Shift operators. (line 13) * slog: Configuration commands. (line 15) * smem: State commands. (line 78) * sover: State commands. (line 63) * spba: Debug commands. (line 53) * SRA: Shift operators. (line 10) * SRAX: Shift operators. (line 12) * SRB: Shift operators. (line 23) * SRC: Shift operators. (line 14) * sreg: State commands. (line 25) * ssym: Debug commands. (line 217) * STA: Storing operators. (line 12) * STi: Storing operators. (line 16) * stime: Configuration commands. (line 21) * STJ: Storing operators. (line 18) * strace: Debug commands. (line 117) * STX: Storing operators. (line 14) * STZ: Storing operators. (line 20) * SUB: Arithmetic operators. (line 13) * Symbols...: Menu and status bars. (line 43) * Toolbar(s): Menu and status bars. (line 49) * w2d: Debug commands. (line 234) * weval: Debug commands. (line 205)  Tag Table: Node: Top1195 Node: Introduction7405 Node: Acknowledgments10309 Node: Installing MDK12843 Node: Download13117 Node: Download-Footnotes13925 Ref: Download-Footnote-113985 Node: Requirements14186 Node: Basic installation15479 Node: Emacs support17007 Node: Special configure flags18549 Node: Supported platforms19787 Node: Supported platforms-Footnotes21314 Ref: Supported platforms-Footnote-121396 Node: MIX and MIXAL tutorial21719 Node: The MIX computer22672 Node: MIX architecture22990 Node: MIX instruction set28169 Node: Instruction structure28929 Node: Instruction structure-Footnotes31774 Ref: Instruction structure-Footnote-131860 Ref: Instruction structure-Footnote-232003 Node: Loading operators32106 Node: Storing operators34286 Node: Arithmetic operators35702 Node: Address transfer operators37270 Node: Comparison operators39443 Node: Jump operators40597 Node: Input-output operators43462 Node: Input-output operators-Footnotes44751 Ref: Input-output operators-Footnote-144839 Node: Conversion operators45163 Node: Shift operators46564 Node: Miscellaneous operators48127 Node: Execution times48787 Node: MIXAL50657 Node: Basic structure52275 Node: Basic structure-Footnotes54880 Ref: Basic structure-Footnote-154954 Ref: Basic structure-Footnote-255016 Node: MIXAL directives55224 Node: MIXAL directives-Footnotes60053 Ref: MIXAL directives-Footnote-160129 Node: Expressions60410 Node: W-expressions61998 Node: Local symbols64943 Node: Local symbols-Footnotes66571 Ref: Local symbols-Footnote-166641 Node: Literal constants66757 Node: Getting started67609 Node: Writing a source file68450 Node: Writing a source file-Footnotes71473 Ref: Writing a source file-Footnote-171559 Ref: Writing a source file-Footnote-271732 Node: Compiling72178 Node: Running the program73201 Node: Non-interactive mode74990 Node: Non-interactive mode-Footnotes77386 Ref: Non-interactive mode-Footnote-177470 Ref: Non-interactive mode-Footnote-277760 Node: Interactive mode77914 Node: Interactive mode-Footnotes81575 Ref: Interactive mode-Footnote-181651 Node: Debugging81766 Node: Using mixguile85336 Node: The mixguile shell86097 Node: Additional functions87829 Node: Defining new functions89527 Node: Hook functions92776 Node: Command hooks93280 Node: Break hooks98199 Node: Break hooks-Footnotes99353 Ref: Break hooks-Footnote-199419 Node: Scheme scripts99691 Node: Using Scheme in mixvm and gmixvm101522 Node: Emacs tools103210 Node: MIXAL mode104002 Node: MIXAL mode-Footnotes104702 Ref: MIXAL mode-Footnote-1104766 Node: Basics104842 Node: Help system105878 Node: Compiling and running106773 Node: GUD integration107684 Node: GUD integration-Footnotes108420 Ref: GUD integration-Footnote-1108494 Node: mixasm108710 Node: Invoking mixasm109345 Node: mixvm111195 Node: Invocation112089 Node: Commands114638 Node: Commands-Footnotes116303 Ref: Commands-Footnote-1116363 Ref: Commands-Footnote-2116484 Node: File commands116689 Node: Debug commands119782 Node: State commands129292 Node: Configuration commands132745 Node: Scheme commands135617 Node: Devices136721 Node: gmixvm140140 Node: Invoking gmixvm140981 Node: MIXVM console144843 Node: MIX virtual machine146437 Node: MIXAL source view147746 Node: MIX devices view148583 Node: Menu and status bars149660 Node: mixguile153720 Node: Invoking mixguile154356 Node: Scheme functions reference156791 Node: mixvm wrappers157798 Node: Hooks161875 Node: Additional VM functions164694 Node: Problems169053 Node: Copying169574 Node: GNU General Public License169904 Node: GNU Free Documentation License207472 Node: Concept Index229871 Node: Instructions and commands239181  End Tag Table mdk-1.2.9/doc/mdk_copying.texi0000644000175000017500000015657712112755472013215 00000000000000@node Copying, Concept Index, Problems, Top @appendix Copying @menu * GNU General Public License:: * GNU Free Documentation License:: @end menu GNU MDK is distributed under the GNU General Public License (GPL) and this manual under the GNU Free Documentation License (GFDL). @node GNU General Public License, GNU Free Documentation License, Copying, Copying @appendixsec GNU General Public License @cindex GPL, GNU General Public License @lowersections @c The GNU General Public License. @center Version 3, 29 June 2007 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program---to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. @heading TERMS AND CONDITIONS @enumerate 0 @item Definitions. ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. @item Source Code. The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. @item Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. @item Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. @item Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. @item Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. @item You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. @item If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. @end enumerate A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. @item Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @enumerate a @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. @item Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. @item Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. @item Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. @end enumerate A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. @item Additional Terms. ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or @item Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. @end enumerate All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. @item Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. @item Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. @item Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. @item Patents. A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. @item No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. @item Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. @item Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. @item Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @item Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. @end enumerate @heading END OF TERMS AND CONDITIONS @heading How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{year} @var{name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see @url{http://www.gnu.org/licenses/}. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{show c} for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see @url{http://www.gnu.org/licenses/}. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. @raisesections @node GNU Free Documentation License @appendixsec GNU Free Documentation License @cindex FDL, GNU Free Documentation License @c The GNU Free Documentation License. @center Version 1.2, November 2002 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2000,2001,2002 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. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain @sc{ascii} without markup, Texinfo input format, La@TeX{} input format, @acronym{SGML} or @acronym{XML} using a publicly available @acronym{DTD}, and standard-conforming simple @acronym{HTML}, PostScript or @acronym{PDF} designed for human modification. Examples of transparent image formats include @acronym{PNG}, @acronym{XCF} and @acronym{JPG}. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, @acronym{SGML} or @acronym{XML} for which the @acronym{DTD} and/or processing tools are not generally available, and the machine-generated @acronym{HTML}, PostScript or @acronym{PDF} produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document 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. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. @end enumerate @page @heading ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with@dots{}Texts.'' line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: mdk-1.2.9/doc/Makefile.in0000644000175000017500000010020212636565535012044 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2000, 2001, 2003, 2004, 2006, 2008, 2013 Free Software # Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/mdk.info am__TEXINFO_TEX_DIR = $(srcdir) DVIS = mdk.dvi PDFS = mdk.pdf PSS = mdk.ps HTMLS = mdk.html TEXINFOS = mdk.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(mdk_TEXINFOS) $(srcdir)/Makefile.in \ $(top_srcdir)/mkinstalldirs texinfo.tex DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = img SUFFIXES = .html info_TEXINFOS = mdk.texi mdk_TEXINFOS = mdk_intro.texi mdk_ack.texi mdk_tut.texi mdk_gstart.texi \ mdk_mixvm.texi mdk_emacs.texi mdk_mixasm.texi mdk_bugs.texi \ mdk_index.texi mdk_gmixvm.texi mdk_install.texi \ mdk_mixguile.texi mdk_copying.texi mdk_findex.texi EXTRA_DIST = MIX.DOC COPYING.MIX.DOC all: all-recursive .SUFFIXES: .SUFFIXES: .html .dvi .info .pdf .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): .texi.info: $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@ && mv $(@:.html=.htp) $@; \ else \ rm -rf $(@:.html=.htp); exit 1; \ fi $(srcdir)/mdk.info: mdk.texi $(mdk_TEXINFOS) mdk.dvi: mdk.texi $(mdk_TEXINFOS) mdk.pdf: mdk.texi $(mdk_TEXINFOS) mdk.html: mdk.texi $(mdk_TEXINFOS) .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf mdk.t2d mdk.t2p clean-aminfo: -test -z "mdk.dvi mdk.pdf mdk.ps mdk.html" \ || rm -rf mdk.dvi mdk.pdf mdk.ps mdk.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-recursive all-am: Makefile $(INFO_DEPS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(infodir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-aminfo clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: $(DVIS) html: html-recursive html-am: $(HTMLS) info: info-recursive info-am: $(INFO_DEPS) install-data-am: install-info-am install-dvi: install-dvi-recursive install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-recursive install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-recursive install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-pdf: install-pdf-recursive install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-recursive install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-aminfo mostlyclean-generic pdf: pdf-recursive pdf-am: $(PDFS) ps: ps-recursive ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-pdf-am uninstall-ps-am .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-aminfo clean-generic cscopelist-am ctags \ ctags-am dist-info distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-aminfo \ maintainer-clean-generic mostlyclean mostlyclean-aminfo \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-dvi-am uninstall-html-am \ uninstall-info-am uninstall-pdf-am uninstall-ps-am .PRECIOUS: Makefile gendocs: $(mdk_TEXINFOS) (cd $(top_srcdir)/doc && \ ./gendocs.sh --email bug-mdk@gnu.org mdk 'GNU MDK Users Manual') # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/doc/mdk_findex.texi0000644000175000017500000000046112112755472012776 00000000000000@c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006 @c Free Software Foundation, Inc. @c See the file mdk.texi for copying conditions. @node Instructions and commands, , Concept Index, Top @unnumbered Instructions and commands @printindex fn mdk-1.2.9/INSTALL0000644000175000017500000003110312112755472010254 00000000000000Installing MDK ************** Download the source tarball =========================== GNU MDK is distributed as a source tarball available for download in the following URLs: * (or one of its mirrors (http://www.gnu.org/prep/ftp.html)) * `http://sourceforge.net/project/showfiles.php?group_id=13897' The above sites contain the latest stable releases of MDK. The development branch is available at: * `https://savannah.gnu.org/cvs/?group_id=118' After you have downloaded the source tarball, unpack it in a directory of your choice using the command: tar xfvz mdk-X.Y.tar.gz where X.Y stands for the downloaded version (the current stable release being version 1.2.1). Requirements ============ In order to build and install MDK, you will need the following libraries installed in your system: - GLIB 2.4.0 (http://www.gtk.org) (required) - GNU Flex 2.5 (http://www.gnu.org/software/flex/flex.html) (required) - GTK 2.4.0 (http://www.gtk.org) (optional) - Libglade 2.4.0 (http://ftp.gnome.org/pub/GNOME/sources/libglade/2.4/) (optional) - GNU Readline (http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) (optional) - GNU Libguile 2.0.x (http://www.gnu.org/software/guile) (optional) If present, readline and history are used to provide command completion and history management to the command line MIX virtual machine, `mixvm'. GTK+ and libglade are needed if you want to build the graphical interface to the MIX virtual machine, `gmixvm'. Finally, if libguile is found, the MDK utilities will be compiled with Guile support and will be extensible using Scheme. *Please note*: you need both the libraries _and_ the headers; this means both the library package and the `-dev' package if you do not compile your libraries yourself (ex: installing `libgtk2.0' and `libgtk2.0-dev' on Debian). Basic installation ================== MDK uses GNU Autoconf and Automake tools, and, therefore, should be built and installed without hassle using the following commands inside the source directory: ./configure make make install where the last one must be run as root. The first command, `configure', will setup the makefiles for your system. In particular, `configure' will look for GTK+ and libglade, and, if they are present, will generate the appropiate makefiles for building the `gmixvm' graphical user interface. Upon completion, you should see a message with the configuration results like the following: *** GNU MDK 1.2.1 has been successfully configured. *** Type 'make' to build the following utilities: - mixasm (MIX assembler) - mixvm (MIX virtual machine, with readline support, with guile support) - gmixvm (mixvm GTK+ GUI, with guile support) - mixguile (the mixvm guile shell) where the last lines may be missing if you lack the above mentioned libraries. The next command, `make', will actually build the MDK programs in the following locations: - `mixutils/mixasm' - `mixutils/mixvm' - `mixgtk/gmixvm' - `mixguile/mixguile' You can run these programs from within their directories, but I recommend you to install them in proper locations using `make install' from a root shell. Emacs support ============= `mixvm' can be run within an Emacs GUD buffer using the elisp program `misc/mixvm.el', kindly contributed by {No value for `PHILIP'}. `mixvm.el' provides an interface between MDK's `mixvm' and Emacs, via GUD. Place this file in your load-path, optionally adding the following line to your `.emacs' file: (autoload 'mixvm "mixvm" "mixvm/gud interaction" t) Special configure flags ======================= You can fine tunning the configuration process using the following switches with configure: - User Option: -enable-gui[=yes|no] - User Option: -disable-gui Enables/disables the build of the MIX virtual machine GUI (`gmixvm'). If the required libraries are missing (*note Requirements::) the configure script with automatically disable this feature. - User Option: -with-guile[=yes|no] - User Option: -without-guile Enables/disables the Guile support for `mixvm' and `gmixvm', and the build of `mixguile'. If the required libraries are missing (*note Requirements::) the configure script with automatically disable this feature. - User Option: -with-readline[=yes|no] - User Option: -without-readline Enables/disables the GNU Readline support for `mixvm'. If the required libraries are missing (*note Requirements::) the configure script with automatically disable this feature. For additional, boilerplate configure options, see the `Generic configure help' below, or run configure --help ------------------------------------------------------------------------ ------------------------------------------------------------------------ Generic configure help ********************** Basic Installation ================== For more information specific to this package, please read the README file. This source code distribution is autoconfiguring and you should be able to compile it and install it without manual interventions such as editing Makefiles, configuration files, and so on. These are generic instructions for people who are not familiar with installing autoconfiguring software. The simplest way to compile this package is to enter the source code main directory and do the following: 1. Configure the source code by typing: % sh ./configure If you're planning to install the package into your home directory or to a location other than `/usr/local' then add the flag `--prefix=PATH' to `configure'. For example, if your home directory is `/home/luser' you can configure the package to install itself there by invoking: % sh ./configure --prefix=/home/luser While running, `configure' prints some messages telling which features is it checking for. 2. Compile the package by typing: % make Running `make' takes a while. If this is a very large package, now is the time to go make some coffee. 3. Some packages are bundled with self-tests for source-code verification. If this package includes such tests, you can optionally run them after compilation by typing % make check 4. Type `make install' to install the programs and any data files and documentation. Type `make uninstall' to undo the installation. During installation, the following files go to the following directories: Executables -> /prefix/bin Libraries -> /prefix/lib Public header files -> /prefix/include Man pages -> /prefix/man/man? Info files -> /prefix/info where `prefix' is either `/usr/local' or the PATH that you specified in the `--prefix' flag. If any of these directories do not presently exist, they will be created on demand. If you are installing in your home directory make sure that `/home/luser/bin' is in your path. If you're using the bash shell add this line at the end of your .cshrc file: PATH="/home/luser/bin:${PATH}" export PATH If you are using csh or tcsh, then use this line instead: setenv PATH /home/luser/bin:${PATH} By prepending your home directory to the rest of the PATH you can override systemwide installed software with your own custom installation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. Compiler configuration ====================== The `configure' shell script is responsible for choosing and configuring the compiler(s). The following options allow you to specify whether you want to enable or disable various debugging mechanisms: `--with-warnings' Make the compilers very picky about warnings. Try this whenever you write new code since it may catch a few bugs. This is not active by default because all too often warnings can be too picky and scare the end-user. `--disable-assert' Compile without using assertions. This results in faster code, but should not be used during developerment, or to run `make check' which depends on assertions. It should only be used for production runs on code that you believe is bug free. All programs are compiled with optimization level 2 by default (-O2). Occasionally that confuses the debugger when code is inlined. To disable optimization and enable debugging, set the shell environment variables CFLAGS, CXXFLAGS, FFLAGS to `-g'. On the bash shell, you can do this like this: $ export CFLAGS="-g" $ export CXXFLAGS="-g" $ export FFLAGS="-g" On the tcsh shell, use the `setenv' command instead: % setenv CFLAGS "-g" ...etc... For other shell, please consult your shell's documentation. Similarly, you can increase the optimization level by assigning these variables to "-g -O3". The following options allow you to reconsider the `configure' shell script's choice of Fortran compilers. `--with-f2c' Compile the Fortran code by translating it to C, even if a native Fortran compiler is available. A copy of the f2c translator should be bundled in the distribution. It will be compiled and then used to compile your Fortran code. `--with-g77' Compile the Fortran code with g77 even if a proprietary Fortran compiler is available `--with-f77=F77' Compile the Fortran code with the specified Fortran compiler. Depending on what languages the package uses, some of these options may or may not be available. To see what is available, type: % sh ./configure --help About the configure script ========================== The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. Advanced installation options. ============================== The `configure' script also understands the following more advanced options, to handle situations for which `--prefix' alone is not sufficient. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. mdk-1.2.9/config.sub0000755000175000017500000010646012574644301011217 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mdk-1.2.9/ChangeLog.20000644000175000017500000003302112112755472011136 000000000000002006-03-16 Jose Antonio Ortega Ruiz * mixgtk/mixgtk.glade (Module): I1 and I2 in mixvm swapped to their correct position (closes #15746). * mixgtk/mixgtk_mixvm.c (init_mem_): fixed segfault when clicking Memory title bar (closes #15910). 2006-03-14 Jose Antonio Ortega Ruiz * configure.in: obsolete C flags for Darwin deleted. 2005-10-08 Jose Antonio Ortega Ruiz * misc/mixal-mode.el (Module): sync with Emacs CVS (Pieter). 2005-09-29 Jose Antonio Ortega Ruiz * mixlib/mix.c: copyright year in console message updated. * mixgtk/mixgtk_device.c (write_char_): buffer size was insufficient. 2005-09-20 Jose Antonio Ortega Ruiz * mdk: version 1.2.1 tagged (v1r2_1). * doc/mdk_copying.texi: FDL license updated to 1.2. * mdk (Module): FSF address updated. * mixguile/xmixguile_cmd_dispatcher.c (Module): use unsigned int for length parameters. * doc/mdk_tut.texi: compliance with 'traditional' ALF directive documented. 2005-09-19 Jose Antonio Ortega Ruiz * po/de.po: corrections by Jens Seidel. * mixgtk/Makefile.am (AM_LDFLAGS): fix libglade dynamic linking. * mixutils/mixasm.c:improve -g handling (accept it to not break potential user scripts) 2005-04-05 Pieter Pareit * mixutils/mixasm.c: make handeling of arguments somewhat robuster. * misc/mixal-mode.el: -g option no longer needed on compilation. * doc/mdk_mixasm.texi: fix of grammer mistake. 2005-03-26 Sergey Poznyakoff * mixlib/mix_scanner.l (ENTER_WEVAL) Accept an argument, specifying how many characters to exclude from yyless. (ws): Removed '+' closure. Throughout the code this macro is used as {ws}+ or {ws}*, so it is superfluous. (%{...%} block) [FLEX_DEBUG]: Set yy_flex_debug from the environment variable. Useful for debugging. (ALF): Pad with spaces arguments shorter than 5 characters Accept traditional ALF syntax (withoutq quotes) (
): Accept w-expressions in literals (between = =). 2004-08-05 Jose Antonio Ortega Ruiz * mdk: version 1.2 tagged (v1r2). * Makefile.am: distclean-local rule added to handle intltool products and make distcheck happy. 2004-08-03 Jose Antonio Ortega Ruiz * doc: documentation cleanup. 2004-08-02 Jose Antonio Ortega Ruiz * INSTALL: * doc/mdk_install.texi: new library dependencies. * doc/mdk_gmixvm.texi: new gui documentation. * configure.in: -fno-strict-aliasing. * mixgtk/mixgtk_cmd_dispatcher.c (on_external_programs_activate): new-style handling of the external programs dialog. * mixlib/mix_parser.c (mix_parser_delete): * mixlib/mix_vm.c (mix_vm_get_lineno_address): g_tree_foreach instead of deprecated g_tree_traverse. 2004-08-01 Jose Antonio Ortega Ruiz * mixutils/mixvm_command.c (init_dis_): * mixgtk/mixgtk_cmd_dispatcher.c (read_config_): -g option not needed by mixasm. (mixgtk_cmd_dispatcher_init): do not redirect stderr to the command log windows. * doc/mdk_mixasm.texi (Invoking @code{mixasm}): document -O option. 2004-07-30 Jose Antonio Ortega Ruiz * mixutils/mixasm.c (main): new option -O to disable debug, which is now enabled by default. * configure.in: check also for libpango. 2004-07-11 Jose Antonio Ortega Ruiz * mixgtk/mixgtk_cmd_dispatcher.c (complete_command_) (on_command_prompt_key_press_event): fixed cursor position after completion. 2004-07-10 Jose Antonio Ortega Ruiz * po/POTFILES.in: * configure.in: * autogen.sh: * Makefile.am: use intltool to allow glade file string translations. * mixgtk/Makefile.am (-DLOCAL_GLADE_FILE): really allow off-tree builds. 2004-07-05 Jose Antonio Ortega Ruiz * mixgtk/mixgtk_wm.c: preserve order of detachable windows when reatached. * mixgtk/mixgtk_mixvm.c: * mixgtk/mixgtk_mixal.{hc}: * mixgtk/mixgtk_fontsel.{hc}: * mixgtk/mixgtk_device.{hc}: * mixgtk/mixgtk_cmd_dispatcher.{hc}: * mixgtk/mixgtk.glade: new menu item to change all fonts at once, and the symbol list font. 2004-07-02 Jose Antonio Ortega Ruiz * mixgtk/mixgtk_wm.{hc}: toolbar visibility and new attach all toolbar button. * mixgtk/mixgtk_mixvm.c: go to dialog handling simplified. * mixgtk/mixgtk_cmd_dispatcher.c (log_command_): correctly place cursor before insertion. * mixgtk/mixgtk_device.c (write_char_): scroll on output and cursor placement. 2004-06-30 Jose Antonio Ortega Ruiz * autogen.sh: do not run configure. * mixgtk/Makefile.am (-DLOCAL_GLADE_FILE): allow off-tree builds. * mixgtk/mixgtk_wm.c (on_nb_switch_): warning on null widget page fixed. * mixgtk/*.xpm: * mixgtk/Makefile.am (Module): only stock icons are used now. * mixgtk/mixgtk_wm.{hc}: * mixgtk/mixgtk_widgets.{hc}: * mixgtk/mixgtk_mixvm.{hc}: * mixgtk/mixgtk_mixal.{hc}: * mixgtk/mixgtk_device.{hc}: * mixgtk/mixgtk_config.{hc}: * mixgtk/mixgtk.{hc}: * mixgtk/mixgtk.glade: all the old functionality, including slipit mode revamped as detachable windows in place using gtk+2. Still some rough borders to polish, probably. 2004-06-24 Jose Antonio Ortega Ruiz * mixgtk/mixgtk_widgets.{hc}: * mixgtk/mixgtk_mixvm.c: * mixgtk/mixgtk_mixal.c: * mixgtk/mixgtk_fontsel.{hc}: * mixgtk/mixgtk_device.{hc}: * mixgtk/mixgtk_cmd_dispatcher.c: * mixgtk/mixgtk.glade: * mixgtk/mixgtk.c: almost complete (barring bugs) reimplementation of all gmixvm functionality in non-split mode for gtk 2.4.x. 2004-06-23 Jose Antonio Ortega Ruiz * mixgtk (Module): first, incomplete port to gtk 2.4.x. Basic functionality in place. * mixguile/xmixguile_cmd_dispatcher.c (Module): * mixlib (Module): update to glib 2.x. * mixgtk/mixgtk_colorsel.h (Module): * mixgtk/mixgtk_colorsel.c (Module): removed (no longer used). * configure.in (Module): default help messages for disable/enable features (Adrian). Port to pkg-config and gtk+2. * mixlib/mix_vm.c (vm_reset_reload_): do not delete output char devices after reload. 2004-06-22 Jose Antonio Ortega Ruiz * mixlib/mix_parser.c: do not store bogus line number for added CON instructions. 2004-06-12 Jose Antonio Ortega Ruiz * mdk (Module): version 1.1 tagged (v1r1). * mixlib/xmix_parser.h (Module): * mixlib/mix_scanner.l (Module): * mixlib/mix_parser.c (Module): recognition of ALF in listings. * mixlib/mix_io.c (mix_io_write_word_array_as_char): drop bogus EOF comparison. 2004-06-12 Jose Antonio Ortega Ruiz * configure.in (Module): new version; fix guile checking. * doc/mdk_mixvm.texi (Devices): * mixlib/xmix_device.c: the paper tape is really an input device. * mixgtk/mixgtk_widgets.h (Module): * mixgtk/mixgtk_widgets.c (Module): * mixgtk/mixgtk_device.c (Module): * mixgtk/mixgtk.glade (Module): support for terminal device input in the form of a new dialog. 2004-06-10 Jose Antonio Ortega Ruiz * mixlib/mix_parser.c (mix_parser_compile): correctly set the loc pointer. * mixlib/mix_io.c (Module): allow truncated lines in char input device files. * mixlib/testsuite/mix_types_t.c (Module): test char to byte conversions. * mixlib/mix_types.c (Module): * doc/mdk_tut.texi (Module): new ASCII rep for delta, sigma and pi. * mixlib/testsuite/mix_vm_ins_t.c (Module): * mixlib/testsuite/mix_types_t.c (Module): adaptation to new character set and LDN instructions behaviour. 2004-06-09 Jose Antonio Ortega Ruiz * doc/mdk_mixvm.texi (Devices): documentation for the console i/o. * mixlib/mix_io.{hc}: * mixlib/mix_device.h: * mixlib/xmix_device.{hc}: the console is now in/out 2004-06-07 Jose Antonio Ortega Ruiz * mixlib/mix_symbol_table.c (print_sym_rows_): align symbol values. * mixutils/mixasm.c: correct usage message. * mixlib/mix_scanner.l (Module): fix for bug #5654, including support for both field specs and indexing in local constants. * mixlib/mix_parser.c (Module): produce better listings, identifying trailing CON instructions. * mixutils/mixvm_loop.c (Module): * mixlib/mix_config.c (Module): always use prompts ending in whitespace. * mixutils/mixvm_loop.c (mix_vmrun): do not save command line options when -r is passed to mixvm. * doc/mdk_mixvm.texi (Devices): documentation for the changes below. * mixlib/mix_types.c (mix_ascii_to_char): accept lower case characters. * mixlib/xmix_device.c (read_): blocks in input char devices must be separated by newline characters. * mixlib/mix_vm.c (Module): correct error tracking and reporting. * mixlib/mix_parser.{ch} (Module): properly treat undefined forward references, inserting new addresses at the program's end. 2004-06-06 Jose Antonio Ortega Ruiz * mixlib/xmix_vm_handlers.c (Module): * mixlib/xmix_vm.{hc} (Module): keep track of runtime errors and correctly report them. * mixlib/mix_io.c (Module): bug fix: read only worked in debug mode; more robust error reporting. * mixlib/xmix_parser.h (Module): * mixlib/mix_scanner.l (Module): keep track of program's end address. 2004-06-05 Jose Antonio Ortega Ruiz * THANKS: * doc/mdk_ack.texi (Acknowledgments): reorganisation. * mixlib/xmix_vm.c (lda_handler_): always reverse sign in LDAN, LDXN and LDiN, even if fspec is not zero (Ruslan Batdalov, closes Debian bug #247392). * autogen.sh: error messages improved and autotools versions updated. 2004-01-09 Jose Antonio Ortega Ruiz * configure.in: check for guile headers. 2003-06-09 Jose A Ortega Ruiz * mdk (Module): version 1.0.1 tagged (v1r0_1) and released. 2003-06-09 Jose A Ortega Ruiz * misc/Makefile.am (pkgdata_DATA): include mixal-mode.el in the distribution and install it. * doc/mdk_ack.texi: * THANKS: Eli added. 2003-06-06 Jose A Ortega Ruiz * doc/mdk_tut.texi (Shift operators): SLC and SRC act on AX, not on A. (Conversion operators): correct description of digit representation. 2003-06-04 Jose A Ortega Ruiz * doc: documentation for emacs support merged in one file (mdk_emacs.texi), substituting mdk_emixvm.texi and mdk_mixal-mode.texi. * mixlib/mix_code_file.c (mix_code_file_new_): properly initialise source_path pointer to NULL, preventing later deletion of an uninitialised pointer (which caused a segfault). 2003-06-03 Jose A Ortega Ruiz * AUTHORS: Added Pieter Pareit. * doc/mdk_ack.texi (Acknowledgments): * THANKS: Thanks to P. E. J. Pareit, N. H. F. Beebe and Ronald Cole. * doc/mdk_install.texi (Supported platforms): added platforms tested by N. H. F. Beebe. * doc/mdk_mixal-mode.texi (mixal-mode.el): minor editing of Pieter's original documentation. * doc/mdk_tut.texi (Address transfer operators): mixed bug in DECX's MOD value. 2003-05-28 Jose A Ortega Ruiz * mixlib/mix_scanner.l, mixlib/mix_parser.h, mixlib/mix_parser.c: new error message for missing ALF operand quotes (bug #3750 fixed) 2003-04-06 Jose A Ortega Ruiz * mixguile/xmixguile_cmd_dispatcher.c: Missing standard header for strlen #included. 2003-02-13 Pieter E J Pareit * mixguile/xmixguile_cmd_dispatcher.c: bug fix: mix_reg_() and mix_set_reg_() did not convert argument to string if it was a symbol. 2003-01-17 Pieter E J Pareit * misc/mixal-mode.el: bug fix: a regex was missing a '-'. * doc/mdk_mixal-mode.texi: added documentation for mixal-mode.el. * doc/mdk.texi: updated menu to include documentation for mixal-mode.el. * doc/mdk_emixvm.texi: updated nodes to include mixal-mode.el. * doc/mdk_egstart.texi: updated nodes to include mixal-mode.el. * doc/mdk_install.texi: added documentation to node 'Emacs support'. 2003-01-12 Jose A Ortega Ruiz * mixlib/xmix_vm.h (inc_loc_): Stop program execution if the program counter is incremented beyond the maximum address (3999). 2003-01-11 Jose A Ortega Ruiz * mixlib/xmix_vm_handlers.c: Bug #1704 fixed. * doc/mdk_mixguile.texi (mixvm wrappers): Bug #1703 fixed. * misc/mixal-mode.el (Module): new emacs mode written by Pieter Pareit. * misc/mixvm.el: bug fix: correctly detect the absence of menu bar. 2002-12-08 Jose A Ortega Ruiz * Makefile.am, aclocal.m4, configure.in, mixlib/gettext.h, mixlib/mix.h: corrections to gettext infrastructure. 2002-12-08 Jose A Ortega Ruiz * autogen.sh: use autopoint instead of gettextize. 2002-10-19 Jose A Ortega Ruiz * THANKS: Vasilij removed, as he requested. 2002-04-11 Jose A Ortega Ruiz * mixgtk/gmixvm.c, mixgtk/mixgtk.c, mixgtk/mixgtk_device.c, mixgtk/mixgtk_gen_handlers.c, mixgtk/mixgtk_mixal.c, mixgtk/mixgtk_mixvm.c, mixguile/mixguile.c, mixlib/mix.c, mixlib/mix_config.c, mixlib/mix_predicate.c, mixlib/mix_vm_command.c, mixutils/mixvm_command.c: _() i18n macro added to all strings missing it. 2002-04-11 Jose A Ortega Ruiz * po/POTFILES.in: file list updated. 2002-04-10 Jose A Ortega Ruiz * mixgtk/: mixgtk_mixal.c, mixgtk_mixvm.c: sprintf -> g_snprintf. 2002-04-10 Jose A Ortega Ruiz * mixlib/xmix_vm_handlers.c: bug fix in 'load' command. 2002-04-10 Jose A Ortega Ruiz * mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_device.c, mixgtk/mixgtk_input.c, mixgtk/mixgtk_mixal.c, mixgtk/mixgtk_mixvm.c, mixguile/xmixguile_cmd_dispatcher.c, mixlib/mix_predicate.c, mixlib/mix_vm_command.c, mixlib/xmix_vm_command.c, mixlib/xmix_vm_handlers.c: portability fix: snprintf -> g_snprintf. mdk-1.2.9/po/0000755000175000017500000000000012636571404007725 500000000000000mdk-1.2.9/po/de.po0000644000175000017500000011023210770465100010564 00000000000000# German translation for GNU MDK. # Copyright (C) 2000-2005 Free Software Foundation, Inc. # This file is distributed under the same license as the GNU MDK package. # Michael Scholz , 2003-2004 # msgid "" msgstr "" "Project-Id-Version: GNU MDK 1.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2004-08-02 10:21+0200\n" "PO-Revision-Date: 2005-09-19 22:56+0200\n" "Last-Translator: Michael Scholz \n" "Language-Team: German (no team)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: mixutils/mixasm.c:59 #, c-format msgid "" "Usage: %s [-vhulO] [-o OUTPUT_FILE] [--version] [--help]\n" "\t[--usage] [--ndebug] [--output=OUTPUT_FILE] [--list[=LIST_FILE]] file\n" msgstr "" "Aufruf: %s [-vhulO] [-o OUTPUT_FILE] [--version] [--help]\n" "\t[--usage] [--ndebug] [--output=OUTPUT_FILE] [--list[=LIST_FILE]] file\n" #: mixutils/mixasm.c:103 mixutils/mixvm.c:116 #, c-format msgid "(Try: %s -h)\n" msgstr "(Versuche: %s -h)\n" #: mixutils/mixasm.c:112 #, c-format msgid "*** Error: Missing source file.\n" msgstr "*** Fehler: Quelldatei fehlt.\n" #: mixutils/mixasm.c:117 mixutils/mixvm.c:131 #, c-format msgid "*** Error: Too many input files.\n" msgstr "*** Fehler: Zu viele Eingabedateien.\n" #: mixutils/mixasm_comp.c:38 #, c-format msgid "*** Unable to open source file %s\n" msgstr "*** Kann Quelldatei %s nicht öffnen\n" #: mixutils/mixasm_comp.c:45 #, c-format msgid "(%d warning(s))\n" msgstr "(%d Warnung(en))\n" #: mixutils/mixasm_comp.c:48 #, c-format msgid "*** Error writing output code file: %s\n" msgstr "*** Fehler beim Schreiben der Ausgabedatei: %s\n" #: mixutils/mixasm_comp.c:56 #, c-format msgid "*** Error writing listing file: %s\n" msgstr "*** Fehler beim Schreiben der Listingdatei: %s\n" #: mixutils/mixasm_comp.c:63 #, c-format msgid "(%d warning(s), %d error(s))\n" msgstr "(%d Warnungen, %d Fehler)\n" #: mixutils/mixvm.c:69 #, c-format msgid "" "Usage: %s [-vhurdqt] [--version] [--help] [--noinit] [--usage]\n" "\t[--run] [--dump] [--time] [MIX_FILE]\n" msgstr "" "Aufruf: %s [-vhurdqt] [--version] [--help] [--noinit] [--usage]\n" "\t[--run] [--dump] [--time] [MIX_FILE]\n" #: mixutils/mixvm_command.c:81 msgid "Set command prompt" msgstr "Kommandoprompt setzen" #: mixutils/mixvm_command.c:82 msgid "Execute shell command" msgstr "Shellkommando ausführen" #: mixutils/mixvm_command.c:83 msgid "Quit the program" msgstr "Programm beenden" #: mixutils/mixvm_command.c:166 msgid "Quitting ..." msgstr "Beenden ..." #: mixutils/mixvm_command.c:229 msgid "Failed initialisation (no memory resources)" msgstr "Initialisierungsfehler (keine Speicherressourcen)" #: mixlib/mix.c:66 #, c-format msgid "" "%s (GNU MDK %s)\n" "\n" msgstr "" "%s (GNU MDK %s)\n" "\n" #: mixlib/mix.c:84 #, c-format msgid "Error creating %s dir %s: %s" msgstr "Fehler beim Erzeugen von %s, Verzeichnis %s: %s" #: mixlib/mix.c:93 #, c-format msgid "Error setting %s dir: %s is not a directory" msgstr "Fehler beim Setzen von %s: %s ist kein Verzeichnis" #: mixlib/mix_config.c:216 #, c-format msgid "Unable to open config file %s (%s)" msgstr "Kann Konfigurationsdatei nicht öffnen %s (%s)" #: mixlib/mix_parser.c:37 msgid "successful compilation" msgstr "Kompilation erfolgreich" #: mixlib/mix_parser.c:38 msgid "file not yet compiled" msgstr "Datei ist noch nicht kompiliert" #: mixlib/mix_parser.c:39 msgid "internal error" msgstr "Interner Fehler" #: mixlib/mix_parser.c:40 msgid "unable to open MIX source file" msgstr "kann MIX-Quelldatei nicht öffnen" #: mixlib/mix_parser.c:41 msgid "unable to open MIX output file" msgstr "kann MIX-Ausgabedatei nicht öffnen" #: mixlib/mix_parser.c:42 msgid "unexpected end of file" msgstr "unerwartetes Dateiende" #: mixlib/mix_parser.c:43 msgid "invalid location field" msgstr "ungültiges Location-Feld" #: mixlib/mix_parser.c:44 msgid "duplicated symbol" msgstr "Symbol ist doppelt" #: mixlib/mix_parser.c:45 msgid "symbol too long" msgstr "Symbol ist zu lang" #: mixlib/mix_parser.c:46 msgid "missing operator field" msgstr "Operator-Feld fehlt" #: mixlib/mix_parser.c:47 msgid "unexpected location symbol" msgstr "unerwartetes Location-Symbol" #: mixlib/mix_parser.c:48 msgid "invalid address field" msgstr "ungültiges Adreßfeld" #: mixlib/mix_parser.c:49 msgid "invalid index field" msgstr "ungültiges Index-Feld" #: mixlib/mix_parser.c:50 msgid "invalid f-specification" msgstr "ungültige F-Spezifikation" #: mixlib/mix_parser.c:51 msgid "invalid operation field" msgstr "ungültiges Operation-Feld" #: mixlib/mix_parser.c:52 msgid "invalid expression" msgstr "ungültiger Ausdruck" #: mixlib/mix_parser.c:53 msgid "undefined symbol" msgstr "Symbol nicht definiert" #: mixlib/mix_parser.c:54 msgid "mismatched parenthesis" msgstr "Klammerfehler" #: mixlib/mix_parser.c:55 msgid "unexpected f-specfication" msgstr "unerwartete F-Spezifikation" #: mixlib/mix_parser.c:56 msgid "missing symbol name" msgstr "Symbolname fehlt" #: mixlib/mix_parser.c:57 msgid "symbol is an instruction name" msgstr "Symbol ist ein Instruktionsname" #: mixlib/mix_parser.c:58 msgid "failed write access to code file" msgstr "kein Schreibzugriff auf Code-Datei" #: mixlib/mix_parser.c:59 msgid "operand of ALF pseudo instruction has less than 5 chars" msgstr "Operand von ALF-Pseudoinstruktion hat weniger als 5 Zeichen" #: mixlib/mix_parser.c:60 msgid "operand of ALF pseudo instruction has more than 5 chars" msgstr "Operand von ALF-Pseudoinstruktion hat mehr als 5 Zeichen" #: mixlib/mix_parser.c:61 msgid "operand of ALF pseudo instruction must be quoted" msgstr "Operand von ALF-Pseudoinstruktion muß in Anführungszeichen" #: mixlib/mix_parser.c:136 msgid "No system resources" msgstr "Keine Systemressourcen" #: mixlib/mix_parser.c:381 #, c-format msgid "\t%s\n" msgstr "\t%s\n" #: mixlib/mix_parser.c:381 msgid "UNKNOWN" msgstr "UNBEKANNT" #: mixlib/mix_parser.c:406 #, c-format msgid "" "*** %s%s: compilation summary ***\n" "\n" msgstr "" "*** %s%s: Kompilerzusammenfassung ***\n" "\n" #: mixlib/mix_parser.c:410 msgid "Src Address Compiled word Symbolic rep\n" msgstr "Src Address Compiled word Symbolic rep\n" #: mixlib/mix_parser.c:415 #, c-format msgid "" "\n" "*** Start address:\t%d\n" "*** End address:\t%d\n" msgstr "" "\n" "*** Startadresse:\t%d\n" "*** Endadresse:\t%d\n" #: mixlib/mix_parser.c:418 #, c-format msgid "" "\n" "*** Symbol table\n" msgstr "" "\n" "*** Symboltabelle\n" #: mixlib/mix_parser.c:421 #, c-format msgid "" "\n" "*** End of summary ***\n" msgstr "" "\n" "*** Ende der Zusammenfassung ***\n" #: mixlib/mix_parser.c:598 msgid "warning" msgstr "Warnung" #: mixlib/mix_parser.c:598 msgid "error" msgstr "Fehler" #: mixlib/mix_predicate.c:176 #, c-format msgid "Register A changed to %s%ld" msgstr "Register A geändert zu %s%ld" #: mixlib/mix_predicate.c:181 #, c-format msgid "Register X changed to %s%ld" msgstr "Register X geändert zu %s%ld" #: mixlib/mix_predicate.c:186 #, c-format msgid "Register J changed to %d" msgstr "Register J geändert zu %d" #: mixlib/mix_predicate.c:191 #, c-format msgid "Register I%d changed to %s%d" msgstr "Register I%d geändert zu %s%d" #: mixlib/mix_predicate.c:197 #, c-format msgid "Comparison flag changed to %s" msgstr "Comparision Flag geändert zu %s" #: mixlib/mix_predicate.c:201 #, c-format msgid "Overflow toggled %s" msgstr "Overflow gewechselt zu %s" #: mixlib/mix_predicate.c:205 #, c-format msgid "Memory address %d changed to %s%ld" msgstr "Speicheradresse %d geändert zu %s%ld" #: mixlib/mix_vm_dump.c:113 #, c-format msgid "Overflow: %s\n" msgstr "Overflow: %s\n" #: mixlib/mix_vm_dump.c:134 #, c-format msgid "Cmp: %s\n" msgstr "Cmp: %s\n" #: mixlib/mix_vm_command.c:480 #, c-format msgid "Unknown command. Try: help\n" msgstr "Unbekanntes Kommando. Versuche: help\n" #: mixlib/mix_eval.c:29 msgid "Successful evaluation" msgstr "Erfolgreiche Berechnung" #: mixlib/mix_eval.c:30 msgid "Syntax error in expression" msgstr "Syntaxfehler im Ausdruck" #: mixlib/mix_eval.c:31 msgid "Out of range F-specification" msgstr "Außerhalb des Bereiches F-Spezifikation" #: mixlib/mix_eval.c:32 msgid "Mismatched parenthesis" msgstr "Klammerfehler" #: mixlib/mix_eval.c:33 msgid "Undefined symbol" msgstr "Undefiniertes Symbol" #: mixlib/mix_eval.c:34 msgid "Internal error" msgstr "Interner Fehler" #: mixlib/xmix_vm_handlers.c:29 msgid "Display this text" msgstr "Zeigt diesen Text" #: mixlib/xmix_vm_handlers.c:30 msgid "Load a MIX code file" msgstr "Eine MIX-Datei laden" #: mixlib/xmix_vm_handlers.c:31 mixgtk/mixgtk.glade:68 msgid "Edit a MIXAL source file" msgstr "Eine MIXAL-Quelldatei bearbeiten" #: mixlib/xmix_vm_handlers.c:32 msgid "Print the external editor command" msgstr "Externen Editor ausgeben" #: mixlib/xmix_vm_handlers.c:33 msgid "Set the external editor command" msgstr "Externen Editor setzen" #: mixlib/xmix_vm_handlers.c:35 mixgtk/mixgtk.glade:91 msgid "Compile a MIXAL source file" msgstr "Eine MIXAL-Quelldatei kompilieren" #: mixlib/xmix_vm_handlers.c:37 msgid "Print the compile command" msgstr "Kompilerkommando ausgeben" #: mixlib/xmix_vm_handlers.c:38 msgid "Set the compile command" msgstr "Kompilerkommando setzen" #: mixlib/xmix_vm_handlers.c:40 msgid "Run loaded or given MIX code file" msgstr "Starte geladene oder angegebene MIX-Datei" #: mixlib/xmix_vm_handlers.c:42 msgid "Execute next instruction(s)" msgstr "Nächste Instruktion(en) ausführen" #: mixlib/xmix_vm_handlers.c:44 msgid "Print current vm status" msgstr "Aktuellen VM-Status anzeigen" #: mixlib/xmix_vm_handlers.c:45 msgid "Print program counter value" msgstr "Programm-Zählerwert anzeigen" #: mixlib/xmix_vm_handlers.c:46 msgid "Print symbol value" msgstr "Symbolwert anzeigen" #: mixlib/xmix_vm_handlers.c:47 msgid "Print register value" msgstr "Registerwert anzeigen" #: mixlib/xmix_vm_handlers.c:49 msgid "Print comparison and overflow flags" msgstr "Comparison- und Overflow-Flag anzeigen" #: mixlib/xmix_vm_handlers.c:51 msgid "Print all registers and flags" msgstr "Alle Register und Flags anzeigen" #: mixlib/xmix_vm_handlers.c:52 msgid "Print memory contents in address range" msgstr "Speicherinhalt im Adreßbereich anzeigen" #: mixlib/xmix_vm_handlers.c:54 msgid "Set register value" msgstr "Registerwert setzen" #: mixlib/xmix_vm_handlers.c:56 msgid "Set comparison flag value" msgstr "Comparison-Flag setzen" #: mixlib/xmix_vm_handlers.c:57 msgid "Set overflow flag value" msgstr "Overflow-Flag setzen" #: mixlib/xmix_vm_handlers.c:58 msgid "Set memory contents in given address" msgstr "Speicherinhalt in angegebener Adresse setzen" #: mixlib/xmix_vm_handlers.c:60 msgid "Set a symbol's value" msgstr "Einen Symbolwert setzen" #: mixlib/xmix_vm_handlers.c:61 msgid "Set break point at given line" msgstr "Breakpoint bei angegebener Zeile setzen" #: mixlib/xmix_vm_handlers.c:62 msgid "Clear break point at given line" msgstr "Breakpoint bei angegebener Zeile löschen" #: mixlib/xmix_vm_handlers.c:63 msgid "Set break point at given address" msgstr "Breakpoint bei angegebener Adresse setzen" #: mixlib/xmix_vm_handlers.c:65 msgid "Clear break point at given address" msgstr "Breakpoint bei angegebener Adresse löschen" #: mixlib/xmix_vm_handlers.c:67 msgid "Set conditional breakpoint on register change" msgstr "Conditional Breakpoint bei Registeränderung setzen" #: mixlib/xmix_vm_handlers.c:69 msgid "Clear conditional breakpoint on register change" msgstr "Conditional Breakpoint bei Registeränderung löschen" #: mixlib/xmix_vm_handlers.c:71 msgid "Set conditional breakpoint on mem cell change" msgstr "Conditional Breakpoint bei Speicherzellenänderung setzen" #: mixlib/xmix_vm_handlers.c:73 msgid "Clear conditional breakpoint on mem cell change" msgstr "Conditional Breakpoint bei Speicherzellenänderung löschen" #: mixlib/xmix_vm_handlers.c:76 msgid "Set conditional breakpoint on comparison flag change" msgstr "Conditional Breakpoint bei Comparison-Flag-Änderung setzen" #: mixlib/xmix_vm_handlers.c:78 msgid "Clear conditional breakpoint on comparison flag change" msgstr "Conditional Breakpoint bei Comparison-Flag-Änderung löschen" #: mixlib/xmix_vm_handlers.c:80 mixlib/xmix_vm_handlers.c:82 msgid "Set conditional breakpoint on overflow toggled" msgstr "Conditional Breakpoint bei Overflow-Änderung setzen" #: mixlib/xmix_vm_handlers.c:83 msgid "Clear all breakpoints" msgstr "Alle Breakpoints löschen" #: mixlib/xmix_vm_handlers.c:84 msgid "Evaluate a given W-expression" msgstr "W-Ausdruck berechnen" #: mixlib/xmix_vm_handlers.c:85 msgid "Convert a MIX word to its decimal value" msgstr "MIX-Wort in seinen dezimalen Wert konvertieren" #: mixlib/xmix_vm_handlers.c:87 msgid "Turn on/off instruction tracing" msgstr "Instruktionsmitschnitt an/aus" #: mixlib/xmix_vm_handlers.c:89 msgid "Print backtrace of executed instructions" msgstr "Letzte ausgeführte Instruktionen anzeigen" #: mixlib/xmix_vm_handlers.c:91 msgid "Turn on/off timing statistics" msgstr "Zeitstatistik an/aus" #: mixlib/xmix_vm_handlers.c:93 msgid "Print current time statistics" msgstr "Aktuelle Zeitstatistik anzeigen" #: mixlib/xmix_vm_handlers.c:94 msgid "Set devices directory" msgstr "Device-Verzeichnis setzen" #: mixlib/xmix_vm_handlers.c:95 msgid "Print current devices directory" msgstr "Aktuelles Device-Verzeichnis anzeigen" #: mixlib/xmix_vm_handlers.c:96 msgid "Turn on/off message logging" msgstr "Message-Aufzeichnung an/aus" #: mixlib/xmix_vm_handlers.c:97 msgid "Print the current program path" msgstr "Aktuellen Programmpfad anzeigen" #: mixlib/xmix_vm_handlers.c:98 msgid "Print the current program source path" msgstr "Aktuellen Programmquellpfad anzeigen" #: mixlib/xmix_vm_handlers.c:100 msgid "Print the current (or a given) program source line" msgstr "Aktuelle (oder angegebene) Programmquellzeile anzeigen" #: mixlib/xmix_vm_handlers.c:167 #, c-format msgid "Elapsed time: %ld /Total program time: %ld (Total uptime: %ld)\n" msgstr "" "Vergangene Zeit: %ld /Gesamte Programmzeit: %ld (Gesamte Uptime: %ld)\n" #: mixlib/xmix_vm_handlers.c:194 #, c-format msgid "" "%-15s%s.\n" "%-15sUsage: %s\n" msgstr "" "%-15s%s.\n" "%-15sAufruf: %s\n" #: mixlib/xmix_vm_handlers.c:198 #, c-format msgid "No commands match `%s'\n" msgstr "Kein Kommando `%s'\n" #: mixlib/xmix_vm_handlers.c:204 #, c-format msgid "Possible commands are:\n" msgstr "Mögliche Kommandos sind:\n" #: mixlib/xmix_vm_handlers.c:218 msgid "Missing file name" msgstr "Dateiname fehlt" #: mixlib/xmix_vm_handlers.c:225 #, c-format msgid "Cannot load %s: " msgstr "Kann %s nicht laden: " #: mixlib/xmix_vm_handlers.c:227 msgid "Wrong file format" msgstr "Falsches Dateiformat" #: mixlib/xmix_vm_handlers.c:242 #, c-format msgid "Program loaded. Start address: %d" msgstr "Programm geladen. Startadresse: %d" #: mixlib/xmix_vm_handlers.c:254 msgid "Editor not specified (use sedit)" msgstr "Editor nicht angegeben (verwende sedit)" #: mixlib/xmix_vm_handlers.c:260 mixlib/xmix_vm_handlers.c:285 msgid "MIXAL source file path not found" msgstr "MIXAL Quelldateipfad nicht gefunden" #: mixlib/xmix_vm_handlers.c:268 msgid " ...done" msgstr " ...fertig" #: mixlib/xmix_vm_handlers.c:279 msgid "MIX assembler not specified (use sasm)" msgstr "MIX-Assembler nicht angegeben (verwende sasm)" #: mixlib/xmix_vm_handlers.c:293 msgid "Successful compilation" msgstr "Kompilation erfolgreich" #: mixlib/xmix_vm_handlers.c:307 msgid "Running ..." msgstr "Arbeite ..." #: mixlib/xmix_vm_handlers.c:312 msgid "... done" msgstr "... fertig" #: mixlib/xmix_vm_handlers.c:320 #, c-format msgid "... stopped: breakpoint at line %ld (address %d)" msgstr "... angehalten: Breakpoint bei Zeile %ld (Adresse %d)" #: mixlib/xmix_vm_handlers.c:323 #, c-format msgid "... stopped: breakpoint at address %d" msgstr "... angehalten: Breakpoint bei Adresse %d" #: mixlib/xmix_vm_handlers.c:332 #, c-format msgid "... stopped: %s (line %ld, address %d)" msgstr "... angehalten: %s (Zeile %ld, Adresse %d)" #: mixlib/xmix_vm_handlers.c:336 #, c-format msgid "... stopped: %s (address %d)" msgstr "... angehalten: %s (Adresse %d)" #: mixlib/xmix_vm_handlers.c:342 mixlib/xmix_vm_handlers.c:389 #, c-format msgid "%s:" msgstr "%s:" #: mixlib/xmix_vm_handlers.c:368 mixlib/xmix_vm_handlers.c:472 #: mixlib/xmix_vm_handlers.c:536 mixlib/xmix_vm_handlers.c:605 #: mixlib/xmix_vm_handlers.c:631 mixlib/xmix_vm_handlers.c:654 #: mixlib/xmix_vm_handlers.c:695 mixlib/xmix_vm_handlers.c:740 #: mixlib/xmix_vm_handlers.c:772 mixlib/xmix_vm_handlers.c:800 #: mixlib/xmix_vm_handlers.c:834 #, c-format msgid "Invalid argument: %s" msgstr "Ungültiges Argument: %s" #: mixlib/xmix_vm_handlers.c:383 #, c-format msgid "End of program reached at address %d" msgstr "Ende des Programmes erreicht bei Adresse %d" #: mixlib/xmix_vm_handlers.c:412 msgid "Symbol table not available" msgstr "Symboltabelle fehlt" #: mixlib/xmix_vm_handlers.c:423 #, c-format msgid "%s: symbol not defined\n" msgstr "%s: Symbol nicht definiert\n" #: mixlib/xmix_vm_handlers.c:464 #, c-format msgid "Invalid I index: %d" msgstr "Ungültiger I-Index: %d" #: mixlib/xmix_vm_handlers.c:505 msgid "Missing memory address" msgstr "Speicheradresse fehlt" #: mixlib/xmix_vm_handlers.c:540 #, c-format msgid "Invalid range: %ld-%ld" msgstr "Ungültiger Bereich: %ld-%ld" #: mixlib/xmix_vm_handlers.c:708 msgid "Missing arguments" msgstr "Argumente fehlen" #: mixlib/xmix_vm_handlers.c:725 msgid "Wrong argument number" msgstr "Falsche Argumenteanzahl" #: mixlib/xmix_vm_handlers.c:747 #, c-format msgid "Line number %ld too high" msgstr "Zeilennummer %ld zu hoch" #: mixlib/xmix_vm_handlers.c:750 mixlib/xmix_vm_handlers.c:782 #: mixlib/xmix_vm_handlers.c:810 msgid "Could not set breakpoint: internal error" msgstr "Kann Breakpoint nicht setzen: Interner Fehler" #: mixlib/xmix_vm_handlers.c:753 msgid "Could not set breakpoint: no debug info available" msgstr "Kann Breakpoint nicht setzen: Debuginformationen fehlen" #: mixlib/xmix_vm_handlers.c:758 #, c-format msgid "Breakpoint set at line %ld" msgstr "Breakpoint bei Zeile %ld gesetzt" #: mixlib/xmix_vm_handlers.c:779 mixlib/xmix_vm_handlers.c:841 #, c-format msgid "Invalid address %ld" msgstr "Ungültige Adresse %ld" #: mixlib/xmix_vm_handlers.c:786 #, c-format msgid "Breakpoint set at address %ld" msgstr "Breakpoint bei Adresse %ld gesetzt" #: mixlib/xmix_vm_handlers.c:807 #, c-format msgid "No breakpoint set at line %ld" msgstr "Kein Breakpoint bei Zeile %ld gesetzt" #: mixlib/xmix_vm_handlers.c:813 msgid "No debug info available" msgstr "Debuginformationen fehlen" #: mixlib/xmix_vm_handlers.c:817 #, c-format msgid "Breakpoint cleared at line %ld" msgstr "Breakpoint bei Zeile %ld gelöscht" #: mixlib/xmix_vm_handlers.c:844 msgid "Could not clear breakpoint: internal error" msgstr "Kann Breakpoint nicht löschen: Interner Fehler" #: mixlib/xmix_vm_handlers.c:848 #, c-format msgid "Breakpoint cleared at address %ld" msgstr "Breakpoint bei Adresse %ld gelöscht" #: mixlib/xmix_vm_handlers.c:860 mixlib/xmix_vm_handlers.c:1203 #: mixlib/xmix_vm_handlers.c:1218 mixlib/xmix_vm_handlers.c:1238 #: mixlib/xmix_vm_handlers.c:1253 #, c-format msgid "Unexpected argument: %s" msgstr "Unerwartetes Argument: %s" #: mixlib/xmix_vm_handlers.c:872 mixlib/xmix_vm_handlers.c:904 msgid "Missing expression" msgstr "Ausdruck fehlt" #: mixlib/xmix_vm_handlers.c:893 #, c-format msgid "" "\n" "Evaluation error: %s\n" msgstr "" "\n" "Ausführungsfehler: %s\n" #: mixlib/xmix_vm_handlers.c:920 #, c-format msgid "Incorrect byte specification: %s" msgstr "Falsche Bytespezifikation: %s" #: mixlib/xmix_vm_handlers.c:935 #, c-format msgid "The expression %s does not fit in a word" msgstr "Der Ausdruck %s paßt nicht in ein Wort" #: mixlib/xmix_vm_handlers.c:958 mixlib/xmix_vm_handlers.c:982 #: mixlib/xmix_vm_handlers.c:1022 mixlib/xmix_vm_handlers.c:1045 #: mixlib/xmix_vm_handlers.c:1055 msgid "Missing argument" msgstr "Argument fehlt" #: mixlib/xmix_vm_handlers.c:971 mixlib/xmix_vm_handlers.c:995 #: mixlib/xmix_vm_handlers.c:1320 msgid "Wrong argument: " msgstr "Falsches Argument: " #: mixlib/xmix_vm_handlers.c:1011 #, c-format msgid "Edit command: %s\n" msgstr "Editor: %s\n" #: mixlib/xmix_vm_handlers.c:1013 #, c-format msgid "Edit command not set (use sedit)\n" msgstr "Editor nicht gesetzt (verwende sedit)\n" #: mixlib/xmix_vm_handlers.c:1034 #, c-format msgid "Compile command: %s\n" msgstr "Kompiler: %s\n" #: mixlib/xmix_vm_handlers.c:1036 #, c-format msgid "Compile command not set (use sasm)\n" msgstr "Kompiler nicht gesetzt (verwende sasm)\n" #: mixlib/xmix_vm_handlers.c:1064 #, c-format msgid "Device directory: %s\n" msgstr "Device-Verzeichnis: %s\n" #: mixlib/xmix_vm_handlers.c:1111 #, c-format msgid "Conditional breakpoint on r%s change set" msgstr "Conditional Breakpoint bei r%s-Änderung gesetzt" #: mixlib/xmix_vm_handlers.c:1116 mixlib/xmix_vm_handlers.c:1140 #, c-format msgid "Invalid argument %s" msgstr "Ungültiges Argument %s" #: mixlib/xmix_vm_handlers.c:1131 #, c-format msgid "Conditional breakpoint on r%s change removed" msgstr "Conditional Breakpoint bei r%s-Änderung gelöscht" #: mixlib/xmix_vm_handlers.c:1135 #, c-format msgid "No breakpoint set on r%s change" msgstr "Keinen Breakpoint bei r%s-Änderung gesetzt" #: mixlib/xmix_vm_handlers.c:1152 mixlib/xmix_vm_handlers.c:1177 #, c-format msgid "Invalid memory address: %s" msgstr "Ungültige Speicheradresse: %s" #: mixlib/xmix_vm_handlers.c:1165 #, c-format msgid "Conditional breakpoint on mem cell no. %d set" msgstr "Conditional Breakpoint bei Speicherzelle %d gesetzt" #: mixlib/xmix_vm_handlers.c:1188 #, c-format msgid "Conditional breakpoint on mem cell no. %d removed" msgstr "Conditional Breakpoint bei Speicherzelle %d gelöscht" #: mixlib/xmix_vm_handlers.c:1193 #, c-format msgid "No conditional breakpoint set at address %d" msgstr "Keinen Conditional Breakpoint bei Adresse %d gesetzt" #: mixlib/xmix_vm_handlers.c:1209 msgid "Conditional breakpoint on overflow toggled set" msgstr "Conditional Breakpoint beim Overflow-Flag gesetzt" #: mixlib/xmix_vm_handlers.c:1226 msgid "Conditional breakpoint on overflow toggled removed." msgstr "Conditional Breakpoint beim Overflow-Flag gelöscht" #: mixlib/xmix_vm_handlers.c:1229 msgid "No breakpoint set on overflow toggle" msgstr "Keinen Breakpoint beim Overflow-Flag gesetzt" #: mixlib/xmix_vm_handlers.c:1244 msgid "Conditional breakpoint on comparison flag changed set" msgstr "Conditional Breakpoint beim Comparison-Flag gesetzt" #: mixlib/xmix_vm_handlers.c:1262 msgid "Conditional breakpoint on comparison flag changed removed." msgstr "Conditional Breakpoint beim Comparison-Flag gelöscht" #: mixlib/xmix_vm_handlers.c:1265 msgid "No breakpoint set on comparison flag change" msgstr "Keinen Breakpoint beim Comparison-Flag gesetzt" #: mixlib/xmix_vm_handlers.c:1328 #, c-format msgid "No program currently loaded" msgstr "Zur Zeit kein Programm geladen" #: mixlib/xmix_vm_handlers.c:1337 #, c-format msgid "No program currently loaded\n" msgstr "Zur Zeit kein Programm geladen\n" #: mixlib/xmix_vm_handlers.c:1352 msgid "Invalid argument" msgstr "Ungültiges Argument" #: mixlib/xmix_vm_handlers.c:1375 msgid "Error loading or executing file" msgstr "Fehler beim Laden oder Ausführen der Datei" #: mixlib/xmix_vm_handlers.c:1376 msgid "Execution stopped: breakpoint encountered" msgstr "Ausführung angehalten: auf Breakpoint gestoßen" #: mixlib/xmix_vm_handlers.c:1377 msgid "Execution stopped: conditional breakpoint encountered" msgstr "Ausführung angehalten: auf Conditional Breakpoint gestoßen" #: mixlib/xmix_vm_handlers.c:1378 msgid "Program successfully terminated" msgstr "Programm erfolgreich beendet" #: mixlib/xmix_vm_handlers.c:1379 msgid "Execution stopped" msgstr "Ausführung angehalten" #: mixlib/xmix_vm_handlers.c:1380 msgid "Program successfully loaded" msgstr "Programm erfolgreich geladen" #: mixlib/xmix_vm_handlers.c:1381 msgid "No program loaded" msgstr "Kein Programm geladen" #: mixgtk/mixgtk_device.c:543 msgid "Devices folder" msgstr "Device-Verzeichnis" #: mixgtk/mixgtk_gen_handlers.c:97 msgid "Load MIX program..." msgstr "MIX-Programm laden..." #: mixgtk/mixgtk_gen_handlers.c:110 msgid "Edit MIXAL source file..." msgstr "MIXAL-Quelldatei bearbeiten..." #: mixgtk/mixgtk_gen_handlers.c:124 msgid "Compile MIXAL source file..." msgstr "MIXAL-Quelldatei kompilieren..." #: mixgtk/mixgtk_mixal.c:340 mixgtk/mixgtk_mixal.c:341 msgid "N/A" msgstr "N/A" #: mixgtk/mixgtk_mixal.c:364 msgid "Source not available" msgstr "Quelle fehlt" #: mixgtk/mixgtk_mixvm.c:328 msgid "Register A" msgstr "Register A" #: mixgtk/mixgtk_mixvm.c:331 msgid "Register X" msgstr "Register X" #: mixgtk/mixgtk_mixvm.c:334 msgid "Register J" msgstr "Register J" #: mixgtk/mixgtk_mixvm.c:340 #, c-format msgid "Register I%d" msgstr "Register I%d" #: mixgtk/mixgtk_mixvm.c:456 #, c-format msgid "Memory cell no. %d" msgstr "Speicherzelle %d" #: mixgtk/gmixvm.c:97 msgid "gmixvm, GTK MIX virtual machine" msgstr "gmixvm, GTK MIX virtuelle Maschine" #: mixgtk/mixgtk.c:45 msgid "Unable to load gmixvm configuration" msgstr "Kann gmixvm-Konfiguration nicht laden" #: mixgtk/mixgtk.c:50 msgid "Unable to initialise application: missing glade file" msgstr "Kann Applikation nicht initialisieren: Glade-Datei fehlt" #: mixgtk/mixgtk.c:56 msgid "Unable to initialise application\n" msgstr "Kann Applikation nicht initialisieren\n" #: mixgtk/mixgtk.glade:7 msgid "gmixvm" msgstr "gmixvm" #: mixgtk/mixgtk.glade:36 msgid "_File" msgstr "Datei" #: mixgtk/mixgtk.glade:45 msgid "Load a MIX file" msgstr "Lade eine MIX-Datei" #: mixgtk/mixgtk.glade:46 msgid "_Load..." msgstr "_Laden..." #: mixgtk/mixgtk.glade:69 msgid "_Edit..." msgstr "Bearbeiten..." #: mixgtk/mixgtk.glade:92 msgid "_Compile..." msgstr "Kompilieren..." #: mixgtk/mixgtk.glade:120 msgid "Exit application" msgstr "Applikation beenden" #: mixgtk/mixgtk.glade:121 msgid "E_xit" msgstr "Beenden" #: mixgtk/mixgtk.glade:147 msgid "De_bug" msgstr "De_bug" #: mixgtk/mixgtk.glade:156 msgid "Run program" msgstr "Starte Programm" #: mixgtk/mixgtk.glade:157 msgid "_Run" msgstr "Starte" #: mixgtk/mixgtk.glade:179 msgid "Execute next instruction" msgstr "Führe nächste Instruktion aus" #: mixgtk/mixgtk.glade:180 msgid "_Next" msgstr "Weiter" #: mixgtk/mixgtk.glade:202 msgid "Clear all set breakpoints" msgstr "Alle gesetzten Breakpoints löschen" #: mixgtk/mixgtk.glade:203 msgid "_Clear breakpoints" msgstr "Breakpoints löschen" #: mixgtk/mixgtk.glade:225 msgid "Show the symbol table" msgstr "Zeige Symboltabelle" #: mixgtk/mixgtk.glade:226 msgid "_Symbols..." msgstr "_Symbole..." #: mixgtk/mixgtk.glade:252 msgid "Vie_w" msgstr "Ansicht" #: mixgtk/mixgtk.glade:261 msgid "_Toolbars" msgstr "_Toolbar" #: mixgtk/mixgtk.glade:270 msgid "_Detached windows" msgstr "_Detached Fenster" #: mixgtk/mixgtk.glade:291 mixgtk/mixgtk.glade:356 msgid "_Virtual machine" msgstr "_Virtuelle Maschine" #: mixgtk/mixgtk.glade:300 mixgtk/mixgtk.glade:365 msgid "_Source" msgstr "Quelle" #: mixgtk/mixgtk.glade:309 mixgtk/mixgtk.glade:392 msgid "_Devices" msgstr "_Devices" #: mixgtk/mixgtk.glade:326 msgid "S_ettings" msgstr "W_erte" #: mixgtk/mixgtk.glade:335 msgid "Change _font" msgstr "Font ändern" #: mixgtk/mixgtk.glade:374 msgid "Command _prompt" msgstr "Kommando_prompt" #: mixgtk/mixgtk.glade:383 msgid "Command l_og" msgstr "K_ommandoaufzeichnung" #: mixgtk/mixgtk.glade:401 msgid "Symbol _list" msgstr "Symbol_liste" #: mixgtk/mixgtk.glade:416 msgid "Change all fonts at once" msgstr "Alle Fonts auf einmal ändern" #: mixgtk/mixgtk.glade:417 msgid "_All" msgstr "_Alles" #: mixgtk/mixgtk.glade:430 msgid "Change format of binary devices output" msgstr "Format für binäre Device-Ausgabe ändern" #: mixgtk/mixgtk.glade:431 msgid "_Device output..." msgstr "_Device-Ausgabe..." #: mixgtk/mixgtk.glade:452 msgid "De_vices dir..." msgstr "De_vices-Verzeichnis..." #: mixgtk/mixgtk.glade:473 msgid "E_xternal programs..." msgstr "E_xterne Programm..." #: mixgtk/mixgtk.glade:500 msgid "Save current settings" msgstr "Aktuellen Werte speichern" #: mixgtk/mixgtk.glade:501 msgid "_Save" msgstr "_Speichern" #: mixgtk/mixgtk.glade:522 msgid "Toogle save settings on exit" msgstr "Speichern beim Beenden an/aus" #: mixgtk/mixgtk.glade:523 msgid "Save on _exit" msgstr "Speichern beim B_eenden" #: mixgtk/mixgtk.glade:537 msgid "_Help" msgstr "_Hilfe" #: mixgtk/mixgtk.glade:546 msgid "_About..." msgstr "Über..." #: mixgtk/mixgtk.glade:593 msgid "Load MIX program" msgstr "Lade MIX-Programm" #: mixgtk/mixgtk.glade:594 msgid "Open" msgstr "Öffnen" #: mixgtk/mixgtk.glade:611 msgid "Compile MIXAL source" msgstr "MIXAL-Quelle kompilieren" #: mixgtk/mixgtk.glade:612 msgid "Compile" msgstr "Kompilieren" #: mixgtk/mixgtk.glade:629 msgid "Edit MIXAL source" msgstr "MIXAL-Quelle bearbeiten" #: mixgtk/mixgtk.glade:630 msgid "Edit" msgstr "Bearbeiten" #: mixgtk/mixgtk.glade:647 mixgtk/mixgtk.glade:648 mixgtk/mixgtk.glade:2147 #: mixgtk/mixgtk.glade:2148 msgid "Run" msgstr "Start" #: mixgtk/mixgtk.glade:665 mixgtk/mixgtk.glade:666 mixgtk/mixgtk.glade:2165 msgid "Next" msgstr "Weiter" #: mixgtk/mixgtk.glade:683 mixgtk/mixgtk.glade:2183 msgid "Clear breakpoints" msgstr "Breakpoints löschen" #: mixgtk/mixgtk.glade:684 mixgtk/mixgtk.glade:2184 msgid "Clear" msgstr "Löschen" #: mixgtk/mixgtk.glade:701 mixgtk/mixgtk.glade:1969 mixgtk/mixgtk.glade:2201 msgid "Symbol table" msgstr "Symboltabelle" #: mixgtk/mixgtk.glade:702 mixgtk/mixgtk.glade:2202 msgid "Symbols" msgstr "Symbole" #: mixgtk/mixgtk.glade:732 mixgtk/mixgtk.glade:2362 msgid "Device directory" msgstr "Device-Verzeichnis" #: mixgtk/mixgtk.glade:733 msgid "Devdir" msgstr "Dev-Verz" #: mixgtk/mixgtk.glade:750 mixgtk/mixgtk.glade:2380 msgid "Output format" msgstr "Ausgabeformat" #: mixgtk/mixgtk.glade:751 mixgtk/mixgtk.glade:1683 msgid "Format" msgstr "Format" #: mixgtk/mixgtk.glade:768 mixgtk/mixgtk.glade:1785 msgid "External programs" msgstr "Externe Programme" #: mixgtk/mixgtk.glade:769 msgid "Programs" msgstr "Programme" #: mixgtk/mixgtk.glade:799 msgid "Detach window" msgstr "Detach-Fenster" #: mixgtk/mixgtk.glade:800 msgid "Detach" msgstr "Detach" #: mixgtk/mixgtk.glade:817 msgid "Attach all windows" msgstr "Alle Fenster zuordnen" #: mixgtk/mixgtk.glade:906 msgid "Enter MIXVM command here" msgstr "MIXVM-Kommando hier eingeben" #: mixgtk/mixgtk.glade:914 mixgtk/mixgtk.glade:1050 mixgtk/mixgtk.glade:1073 #: mixgtk/mixgtk.glade:1096 mixgtk/mixgtk.glade:1119 mixgtk/mixgtk.glade:1142 #: mixgtk/mixgtk.glade:1165 mixgtk/mixgtk.glade:1188 mixgtk/mixgtk.glade:1475 #: mixgtk/mixgtk.glade:1867 mixgtk/mixgtk.glade:1920 mixgtk/mixgtk.glade:2585 #: mixgtk/mixgtk.glade:2843 mixgtk/mixgtk.glade:2869 mixgtk/mixgtk.glade:2895 #: mixgtk/mixgtk.glade:3077 mixgtk/mixgtk.glade:3103 mixgtk/mixgtk.glade:3129 #: mixgtk/mixgtk.glade:3155 mixgtk/mixgtk.glade:3181 mixgtk/mixgtk.glade:3213 #: mixgtk/mixgtk.glade:3452 mixgtk/mixgtk.glade:3892 msgid "*" msgstr "*" #: mixgtk/mixgtk.glade:955 mixgtk/mixgtk.glade:1248 msgid "Enter value" msgstr "Wert eingeben" #: mixgtk/mixgtk.glade:1048 mixgtk/mixgtk.glade:1071 mixgtk/mixgtk.glade:1094 #: mixgtk/mixgtk.glade:1117 mixgtk/mixgtk.glade:1140 mixgtk/mixgtk.glade:1163 #: mixgtk/mixgtk.glade:3450 msgid "0" msgstr "0" #: mixgtk/mixgtk.glade:1186 msgid "+" msgstr "+" #: mixgtk/mixgtk.glade:1204 mixgtk/mixgtk.glade:1757 msgid "Decimal" msgstr "Dezimal" #: mixgtk/mixgtk.glade:1226 msgid "Bytes" msgstr "Bytes" #: mixgtk/mixgtk.glade:1276 msgid "MDK" msgstr "MDK" #: mixgtk/mixgtk.glade:1306 msgid "GNU MIX Development Kit" msgstr "GNU MIX Development Kit" #: mixgtk/mixgtk.glade:1328 msgid "label223" msgstr "Label 223" #: mixgtk/mixgtk.glade:1350 msgid "" " Copyright (C) 2001, 2002, 2003 , 2004\n" "Free Software Foundation, Inc.\n" "\n" "Please, send bug reports to\n" "bug-mdk@gnu.org" msgstr "" " Copyright (C) 2001, 2002, 2003, 2004\n" "Free Software Foundation, Inc.\n" "\n" "Bitte senden Sie Bug-Reports an\n" "bug-mdk@gnu.org" #: mixgtk/mixgtk.glade:1375 msgid "Go to memory cell" msgstr "Gehe zur Speicherzelle" #: mixgtk/mixgtk.glade:1447 msgid "Go to address:" msgstr "Gehe zu Adresse:" #: mixgtk/mixgtk.glade:1497 msgid "Select Font" msgstr "Wähle Font" #: mixgtk/mixgtk.glade:1546 msgid "abcdefghijk ABCDEFGHIJK" msgstr "abcdefghijk ABCDEFGHIJK" #: mixgtk/mixgtk.glade:1557 msgid "Device output format" msgstr "Device-Ausgabeformat" #: mixgtk/mixgtk.glade:1642 msgid "Set all devices to current format" msgstr "Alle Devices auf das aktuelle Format setzen" #: mixgtk/mixgtk.glade:1644 msgid "S_et all" msgstr "Alles S_etzen" #: mixgtk/mixgtk.glade:1661 msgid "Device" msgstr "Device" #: mixgtk/mixgtk.glade:1705 msgid "" "tape0\n" "tape1\n" "tape2\n" "tape3\n" "tape4\n" "tape5\n" "tape6\n" "tape7\n" "disk0\n" "disk1\n" "disk2\n" "disk3\n" "disk4\n" "disk5\n" "disk6\n" "disk7" msgstr "" "tape0\n" "tape1\n" "tape2\n" "tape3\n" "tape4\n" "tape5\n" "tape6\n" "tape7\n" "disk0\n" "disk1\n" "disk2\n" "disk3\n" "disk4\n" "disk5\n" "disk6\n" "disk7" #: mixgtk/mixgtk.glade:1734 msgid "Show output as MIX words" msgstr "Zeige Ausgabe als MIX-Wörter" #: mixgtk/mixgtk.glade:1736 msgid "Word" msgstr "Wort" #: mixgtk/mixgtk.glade:1755 msgid "Show output as decimal numbers" msgstr "Zeige Ausgabe als dezimale Zahlen" #: mixgtk/mixgtk.glade:1865 msgid "xterm -e vi %s" msgstr "xterm -e vi %s" #: mixgtk/mixgtk.glade:1881 msgid "Editor command (e.g xterm -e vi %s)" msgstr "Editor-Befehl (z.B. xterm -e vi %s)" #: mixgtk/mixgtk.glade:1918 msgid "mixasm %s" msgstr "mixasm %s" #: mixgtk/mixgtk.glade:1934 msgid "MIX sssembler command (e.g. mixasm %s)" msgstr "MIX-Assembler-Befehl (z.B. mixasm %s)" #: mixgtk/mixgtk.glade:2045 msgid "_Close" msgstr "Schließen" #: mixgtk/mixgtk.glade:2107 msgid "MIXAL source" msgstr "MIXAL Quelle" #: mixgtk/mixgtk.glade:2166 msgid "Step" msgstr "Schritt" #: mixgtk/mixgtk.glade:2232 msgid "Source code font" msgstr "Quellcodefont" #: mixgtk/mixgtk.glade:2233 mixgtk/mixgtk.glade:2412 mixgtk/mixgtk.glade:2662 msgid "Font" msgstr "Font" #: mixgtk/mixgtk.glade:2263 msgid "Attach window" msgstr "Attach-Fenster" #: mixgtk/mixgtk.glade:2319 msgid "Devices" msgstr "Devices" #: mixgtk/mixgtk.glade:2363 mixgtk/mixgtk.glade:2558 msgid "Directory" msgstr "Verzeichnis" #: mixgtk/mixgtk.glade:2381 msgid "Output" msgstr "Ausgabe" #: mixgtk/mixgtk.glade:2411 msgid "Output font" msgstr "Ausgabefont" #: mixgtk/mixgtk.glade:2485 msgid "Devices directory" msgstr "Device-Verzeichnis" #: mixgtk/mixgtk.glade:2623 msgid "Virtual machine" msgstr "Virtuelle Maschine" #: mixgtk/mixgtk.glade:2758 msgid "A" msgstr "A" #: mixgtk/mixgtk.glade:2784 msgid "I1" msgstr "I1" #: mixgtk/mixgtk.glade:2810 msgid "I2" msgstr "I2" #: mixgtk/mixgtk.glade:2915 msgid "X" msgstr "X" #: mixgtk/mixgtk.glade:2941 msgid "I3" msgstr "I3" #: mixgtk/mixgtk.glade:2967 msgid "I4" msgstr "I4" #: mixgtk/mixgtk.glade:2993 msgid "I5" msgstr "I5" #: mixgtk/mixgtk.glade:3019 msgid "I6" msgstr "I6" #: mixgtk/mixgtk.glade:3045 msgid "J" msgstr "J" #: mixgtk/mixgtk.glade:3244 msgid "Registers " msgstr "Register " #: mixgtk/mixgtk.glade:3294 msgid "Greater" msgstr "Größer" #: mixgtk/mixgtk.glade:3296 msgid "G" msgstr "G" #: mixgtk/mixgtk.glade:3318 msgid "Equal" msgstr "Gleich" #: mixgtk/mixgtk.glade:3320 msgid "E" msgstr "E" #: mixgtk/mixgtk.glade:3343 msgid "Lesser" msgstr "Kleiner" #: mixgtk/mixgtk.glade:3345 msgid "L" msgstr "L" #: mixgtk/mixgtk.glade:3378 msgid "Overflow" msgstr "Overflow" #: mixgtk/mixgtk.glade:3399 msgid "Flags " msgstr "Flags " #: mixgtk/mixgtk.glade:3466 msgid "View loc address" msgstr "Zeige Positionsadresse" #: mixgtk/mixgtk.glade:3496 msgid "Location " msgstr "Position " #: mixgtk/mixgtk.glade:3547 msgid "Uptime:" msgstr "Uptime:" #: mixgtk/mixgtk.glade:3570 msgid "00000000" msgstr "00000000" #: mixgtk/mixgtk.glade:3593 msgid "Elapsed:" msgstr "Verbraucht" #: mixgtk/mixgtk.glade:3616 mixgtk/mixgtk.glade:3662 msgid "000000" msgstr "000000" #: mixgtk/mixgtk.glade:3639 msgid "Program:" msgstr "Programm:" #: mixgtk/mixgtk.glade:3685 msgid "Times " msgstr "Times " #: mixgtk/mixgtk.glade:3750 msgid "Memory " msgstr "Speicher " #: mixgtk/mixgtk.glade:3779 msgid "MIX Virtual Machine " msgstr "MIX virtuelle Maschine" #: mixgtk/mixgtk.glade:3807 msgid "MIX Console input" msgstr "MIX-Konsoleeingabe" #: mixgtk/mixgtk.glade:3865 msgid "Enter up to 70 characters" msgstr "Bis zu 70 Zeichen eingeben" #: mixguile/mixguile.c:74 #, c-format msgid "mixguile bootstrap file %s not found\n" msgstr "Mixguile-Bootstrap-Datei %s nicht gefunden\n" #: mixguile/mixguile_cmd_dispatcher.c:52 msgid "Eval Scheme command using Guile" msgstr "Führe Scheme-Kommando aus mit Guile" #: mixguile/mixguile_cmd_dispatcher.c:53 msgid "Eval Scheme file using Guile" msgstr "Führe Scheme-Datei aus mit Guile" mdk-1.2.9/po/Makevars0000644000175000017500000000207310770465100011333 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = mdk-1.2.9/po/LINGUAS0000644000175000017500000000004310770465100010657 00000000000000# Set of available translations de mdk-1.2.9/po/ChangeLog0000644000175000017500000000665610770465100011424 000000000000002004-07-30 Jose Antonio Ortega Ruiz * de.po (Module): mike's german translation. 2002-03-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-03-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-03-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-03-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-03-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-03-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2001-09-26 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-27 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-26 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-25 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-25 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-25 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-22 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-22 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-22 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-22 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-08-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.39. 2001-07-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-18 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. 2001-07-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2000-02-08 jose antonio ortega ruiz * ca.po: New file mdk-1.2.9/po/Makefile.in.in0000644000175000017500000001604612636565532012333 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/po/POTFILES.in0000644000175000017500000000113412112755472011417 00000000000000# List of source files containing translatable strings. # Package source files lib/getopt_long.c mixutils/mixasm.c mixutils/mixasm_comp.c mixutils/mixvm.c mixutils/mixvm_command.c mixlib/mix.c mixlib/mix_config.c mixlib/mix_eval.c mixlib/mix_parser.c mixlib/mix_predicate.c mixlib/mix_vm.c mixlib/mix_vm_command.c mixlib/mix_vm_dump.c mixlib/xmix_vm_handlers.c mixgtk/gmixvm.c mixgtk/mixgtk.c mixgtk/mixgtk.glade mixgtk/mixgtk_device.c mixgtk/mixgtk_gen_handlers.c mixgtk/mixgtk_mixal.c mixgtk/mixgtk_mixvm.c mixgtk/mixgtk_wm.c mixguile/mixguile.c mixguile/mixguile_cmd_dispatcher.c intl/plural.c mdk-1.2.9/AUTHORS0000644000175000017500000000075412636565126010311 00000000000000Authors of GNU MDK. See also the files THANKS and ChangeLog. Jose A. Ortega Ruiz designed and implemented mdk. Pieter E. J. Pareit designed, implemented and documented mixal-mode.el, and fixed bugs in other mdk code. Philip E. King designed and implemented mixvm.el. Michael Scholz wrote the German translation po/de.po. Sergey Poznyakoff provided patches to mixlib/mix_scanner.l improving MIXAL compliance. Sergey Litvin implemented SLB, SRB, JAE, JAO, JXE, JXE instructions in mixvm. mdk-1.2.9/ChangeLog.10000644000175000017500000010274110770465100011135 00000000000000***** Changes up to version 1.0 ****** 2002-04-08 03:06 jao * NEWS: date added 2002-04-08 02:33 jao * mixutils/mixvm_loop.c: configurable prompt support 2002-04-08 02:32 jao * mixutils/mixvm_command.c: new command: prompt 2002-04-08 02:32 jao * mixutils/mixvm_command.h: $Id: ChangeLog.1,v 1.1 2003/02/01 23:07:02 jao Exp $ tag added 2002-04-08 02:31 jao * mixutils/mixvm.c: new option (-t/--time) 2002-04-08 02:30 jao * mixutils/Makefile.am: new file 2002-04-08 02:29 jao * INSTALL, NEWS, README, THANKS, aclocal.m4, configure.in: candidate release 1.0 2002-04-08 02:26 jao * doc/: mdk_mixvm.texi, mdk_tut.texi, mdk.texi, mdk_ack.texi, mdk_gstart.texi, mdk_install.texi: candidate release 1.0 2002-04-08 00:22 jao * mixutils/mixvm_loop.h: initial revision 2002-03-29 17:31 jao * mixgtk/mixgtk.c: $Id: ChangeLog.1,v 1.1 2003/02/01 23:07:02 jao Exp $ tag added 2002-03-29 17:30 jao * mixgtk/: gmixvm.c, mixgtk.c, mixgtk_config.c, mixgtk_device.c, mixgtk_wm.c: missing standard headers included 2002-03-24 02:22 jao * mixlib/mix_code_file.c: version compatibility check disabled 2002-03-24 01:23 jao * mixlib/xmix_vm.h: wrapping up location pointer when address 3999 is reached 2002-03-24 01:22 jao * samples/.cvsignore: new ignored files 2002-03-20 02:33 jao * configure.in: copyright an cvs Id 2002-03-20 02:31 jao * po/ChangeLog: new gettext version 2002-03-20 02:30 jao * mixutils/: mixasm.c, mixvm.c, mixvm_loop.c: new option -t (--time) 2002-03-20 02:28 jao * configure.in: correctly grouping commands inside [] 2002-03-19 23:55 jao * mixlib/mix_parser.c: comment corrected 2002-03-19 23:38 jao * doc/: mdk_gstart.texi, mdk_tut.texi: fxn suggestions 2002-03-19 23:36 jao * .cvsignore, mixgtk/.cvsignore, mixutils/.cvsignore, samples/.cvsignore: new ignored files 2001-09-30 22:29 jao * mixguile/Makefile.am: scm init file added 2001-09-29 04:11 jao * ChangeLog: release 0.5 2001-09-29 03:56 jao * NEWS: version 0.5 update 2001-09-29 03:55 jao * doc/mdk_gmixvm.texi: exclude images in dvi 2001-09-29 03:54 jao * mixlib/mix.h: CVS $Id: ChangeLog.1,v 1.1 2003/02/01 23:07:02 jao Exp $ added 2001-09-29 03:53 jao * doc/Makefile.am, mixgtk/Makefile.am, mixguile/Makefile.am, mixlib/Makefile.am, mixlib/testsuite/Makefile.am, mixutils/Makefile.am, samples/Makefile.am: INCLUDES fixed to allow VPATH builds 2001-09-29 01:29 jao * NEWS, NEWS: version 0.5 update 2001-09-29 01:11 jao * TODO, doc/Makefile.am, doc/mdk.texi, doc/mdk_gmixvm.texi, doc/mdk_mixguile.texi: version 0.5 update 2001-09-29 01:10 jao * mixgtk/gmixvm.c, mixguile/mixguile.c, mixguile/mixguile.h, mixguile/mixguile_main.c, mixlib/mix.c, mixlib/mix.h, mixutils/mixasm.c, mixutils/mixvm.c: uniform command line options handling 2001-09-27 01:15 jao * doc/: mdk.texi, mdk_gstart.texi, mdk_install.texi, mdk_mixasm.texi, mdk_mixvm.texi, mdk_tut.texi: minor cosmetic changes 2001-09-27 01:13 jao * doc/mdk_mixguile.texi: partial doc update 2001-09-26 00:46 jao * TODO: $Id: ChangeLog.1,v 1.1 2003/02/01 23:07:02 jao Exp $ cvs tag 2001-09-26 00:45 jao * TODO: new todo items 2001-09-26 00:43 jao * po/ChangeLog: gettextize new entry 2001-09-26 00:41 jao * mixguile/.cvsignore: new ignored files 2001-09-25 23:41 jao * mixguile/xmixguile_cmd_dispatcher.c: new scheme primitive (mix-last-result) 2001-09-25 01:27 jao * mixguile/: mixguile.c, mixguile.h, mixguile_main.c: optionally load local startup file 2001-09-25 01:27 jao * mixutils/: mixvm.c, mixvm_loop.c: -q option added 2001-09-25 01:26 jao * mixlib/mix.c: GPL notice shortened 2001-09-19 00:55 jao * TODO: new todo items 2001-09-19 00:53 jao * NEWS, doc/mdk.texi, doc/mdk_bugs.texi, doc/mdk_emixvm.texi, doc/mdk_gmixvm.texi, doc/mdk_gstart.texi, doc/mdk_mixasm.texi, doc/mdk_mixguile.texi, doc/mdk_mixvm.texi: partial doc update 2001-09-19 00:51 jao * doc/.cvsignore: new ignored file 2001-09-19 00:51 jao * mixgtk/mixgtk_fontsel.c: remove fonts that cannot be loaded from the config file 2001-09-19 00:50 jao * mixgtk/: mixgtk_config.c, mixgtk_config.h: (mixgtk_config_remove) new function to remove configuration items 2001-09-19 00:49 jao * mixlib/: mix_config.c, mix_config.h: (mix_config_remove) new function to remove configuration items 2001-09-18 23:49 jao * mixgtk/mixgtk_fontsel.c: use of $Id: ChangeLog.1,v 1.1 2003/02/01 23:07:02 jao Exp $ 2001-09-18 23:49 jao * mixgtk/mixgtk_fontsel.c: loc widget fonts are updated correctly 2001-09-18 01:36 jao * doc/mdk_mixvm.texi: new mixvm commands documented 2001-09-18 01:26 jao * mixlib/xmix_vm_handlers.c: (cmd_pstat_) alway print an endline character 2001-09-17 00:47 jao * mixguile/xmixguile_cmd_dispatcher.c: virtual machine status 2001-09-17 00:43 jao * mixguile/mixguile.scm: load mixguile-stat-vm.scm 2001-09-17 00:42 jao * mixguile/mixguile-vm-stat.scm: header corrected 2001-09-17 00:40 jao * mixguile/.cvsignore, samples/.cvsignore: new ignored files 2001-09-17 00:39 jao * mixlib/xmix_vm_command.h: minor changes 2001-09-17 00:38 jao * mixlib/xmix_vm.h: maintain virtual machine status 2001-09-17 00:37 jao * mixlib/xmix_vm_handlers.h: pstat command 2001-09-17 00:32 jao * mixlib/: mix_vm_command.c, mix_vm_command.h: minor changes 2001-09-17 00:29 jao * mixlib/: mix_vm.c, mix_vm.h: maintain virtual machine status 2001-09-17 00:28 jao * mixlib/: mix_predicate.c, mix_predicate.h, mix_predicate_list.h: access to the predicate type added 2001-09-17 00:17 jao * INSTALL, NEWS, doc/.cvsignore, doc/mdk.texi, doc/mdk_ack.texi, doc/mdk_copying.texi, doc/mdk_gstart.texi, doc/mdk_index.texi, doc/mdk_install.texi, doc/mdk_intro.texi: partial doc update 2001-09-15 04:14 jao * doc/mdk_gstart.texi: partial doc update 2001-09-15 04:12 jao * mixguile/mixguile-commands.scm: all commands implemented in terms of mixvm-cmd to allow hook calling 2001-09-14 02:48 jao * doc/mdk_ack.texi: typo 2001-09-14 02:41 jao * doc/mdk_gstart.texi: doc update for version 0.5 2001-09-14 02:08 jao * mixguile/mixguile-commands.scm: (mix-pmem) no accepts two arguments (from, to) 2001-09-13 02:13 jao * doc/: mdk.texi, mdk_bugs.texi, mdk_copying.texi, mdk_emixvm.texi, mdk_findex.texi, mdk_gmixvm.texi, mdk_gstart.texi, mdk_index.texi, mdk_install.texi, mdk_intro.texi, mdk_mixasm.texi, mdk_mixvm.texi, mdk_tut.texi: partial doc update for version 0.5 2001-09-13 01:14 jao * mixlib/xmix_vm_handlers.c: add a newline character to the output of psrc and pprog 2001-09-12 01:31 jao * doc/mdk_ack.texi: initial version (from the THANKS file) 2001-09-12 01:20 jao * THANKS: Vasilij contribution 2001-09-12 01:18 jao * THANKS: Radu Butnaru 2001-09-12 00:53 jao * mixlib/mix_vm_clock.c: (mix_vm_clock_add_lapse) fixed time del for the MOVE instruction 2001-09-11 01:42 jao * doc/mdk_intro.texi: version 0.5 update 2001-09-10 22:35 jao * doc/mdk_gmixvm.texi: version 0.5 update 2001-09-05 00:14 jao * doc/img/.cvsignore: ignore eps files 2001-09-05 00:13 jao * doc/Makefile.am: licenses in one appendix 2001-09-05 00:09 jao * doc/: .cvsignore, fdl.texi, gpl.texi, mdk.texi, mdk_copying.texi, mdk_gmixvm.texi, mdk_index.texi: licenses in one appendix 2001-09-04 04:36 jao * mixguile/mixguile-vm-stat.scm: using Id tag 2001-09-04 04:35 jao * mixguile/mixguile-vm-stat.scm: vm status guile commands 2001-09-04 04:31 jao * doc/Makefile.am: copyright notice updated 2001-09-04 04:30 jao * doc/Makefile.am: fdl.texi file added 2001-09-04 04:30 jao * doc/img/Makefile.am: missing files added 2001-09-02 02:49 jao * mixguile/xmixguile_cmd_dispatcher.c: new procedures mix-src-line, mix-src-line-no 2001-09-01 02:22 jao * mixguile/: mixguile-commands.scm, mixguile_cmd_dispatcher.c, mixguile_cmd_dispatcher.h, xmixguile_cmd_dispatcher.c, xmixguile_cmd_dispatcher.h: new mixguile commands 2001-09-01 02:21 jao * mixguile/.cvsignore: more ignored files 2001-09-01 02:21 jao * mixgtk/mixgtk_device.c: use of new command pddir 2001-09-01 02:19 jao * mixutils/.cvsignore, mixutils/mixvm_command.c, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixlib/xmix_vm_command.c, mixlib/xmix_vm_command.h, mixlib/xmix_vm_handlers.c, mixlib/xmix_vm_handlers.h: new commands: pddir, sddir, ptime, psrc, pprog, pline 2001-09-01 02:16 jao * mixguile/mixguile.c: using access to check for bootstrap files 2001-09-01 02:04 jao * mixgtk/mixgtk_widgets.c: using access to check for glade file 2001-08-29 04:14 jao * mixguile/xmixguile_cmd_dispatcher.c, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h: new mix-guile commands 2001-08-28 18:41 jao * mixguile/.cvsignore: more ignored files 2001-08-28 18:38 jao * NEWS, configure.in, mixgtk/Makefile.am, mixgtk/gmixvm.c, mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_mixvm.c, mixguile/Makefile.am, mixguile/mixguile.c, mixguile/mixguile.h, mixguile/mixguile_cmd_dispatcher.c, mixguile/mixguile_main.c, mixguile/xmixguile_cmd_dispatcher.c, mixlib/Makefile.am, mixlib/mix_config.c, mixlib/mix_config.h, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixlib/xmix_vm_command.c, mixlib/xmix_vm_command.h, mixlib/xmix_vm_handlers.c, mixlib/xmix_vm_handlers.h, mixutils/Makefile.am, mixutils/mixvm.c, mixutils/mixvm_command.c, mixutils/mixvm_command.h, mixutils/mixvm_loop.c, po/ChangeLog, .cvsignore: guile integration 2001-08-23 02:01 jao * configure.in, mixgtk/Makefile.am, mixguile/Makefile.am, mixguile/mixguile_main.c, mixutils/Makefile.am, po/ChangeLog, mixguile/.cvsignore, mixguile/mixguile-commands.scm, mixguile/mixguile.scm: mixguile commands 2001-08-23 01:45 jao * mixutils/mixguile.c: file moved to mixguile dir 2001-08-22 04:43 jao * mixguile/xmixguile_cmd_dispatcher.c: more commands 2001-08-22 02:44 jao * mixutils/.cvsignore: more ignored files 2001-08-22 02:42 jao * mixguile/Makefile.am, mixguile/mixguile.c, mixguile/mixguile.h, mixguile/mixguile_cmd_dispatcher.c, mixguile/mixguile_cmd_dispatcher.h, mixguile/xmixguile_cmd_dispatcher.c, mixguile/xmixguile_cmd_dispatcher.h, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixutils/Makefile.am, mixutils/mixguile.c: mixguile: first version 2001-08-21 02:31 jao * mixguile/.cvsignore: ignored files 2001-08-21 02:30 jao * Makefile.am, configure.in, mixguile/Makefile.am, mixguile/mixguile.c, mixguile/mixguile.h, mixguile/mixguile_cmd_dispatcher.c, mixguile/mixguile_cmd_dispatcher.h: initial guile support 2001-08-20 02:42 jao * mixlib/mix_vm_command.c: memory leak fixed 2001-08-20 02:36 jao * mixgtk/: mixgtk_fontsel.c, mixgtk_mixvm.c: memory leak fixed 2001-08-17 04:32 jao * ChangeLog, NEWS: version 0.4.2 2001-08-17 04:26 jao * NEWS, mdk.spec, doc/img/ss_devices.jpg, doc/img/ss_mix.jpg, doc/img/ss_mixal.jpg, doc/img/ss_split.jpg: version 0.4.2 2001-08-17 03:54 jao * mixgtk/mixgtk_device.c: devices destruction fixed 2001-08-17 03:05 jao * ChangeLog, NEWS: version 0.4.2 2001-08-17 02:07 jao * mixgtk/Makefile.am: data files always included in distribution 2001-08-17 02:06 jao * mixgtk/: Makefile.am, devdir.xpm, extern.xpm, mixgtk.glade: new toolbar buttons 2001-08-17 01:08 jao * mixgtk/mixgtk.glade: MIXAL status bar 2001-08-17 01:06 jao * mixgtk/mixgtk_mixal.c: display symbol values in MIXAL status bar when split 2001-08-17 00:38 jao * aclocal.m4, configure.in: version 0.4.2 2001-08-17 00:37 jao * po/ChangeLog: new gettext version 2001-08-17 00:32 jao * NEWS, mixgtk/.cvsignore, mixgtk/Makefile.am: toolbars added 2001-08-17 00:28 jao * mixgtk/: clear.xpm, colors.xpm, compile.xpm, edit.xpm, font.xpm, fontl.xpm, jump.xpm, mixgtk.glade, mixgtk_config.c, mixgtk_config.h, mixgtk_wm.c, mixgtk_wm.h, next.xpm, onew.xpm, open.xpm, output.xpm, run.xpm, splitw.xpm, symbols.xpm: toolbars added 2001-07-26 00:00 jao * aclocal.m4, configure.in, mixutils/mixvm_command.c, po/ChangeLog: rl_completion_matches check 2001-07-22 23:30 jao * mixgtk/mixgtk_mixal.c: release 0.4 2001-07-22 23:11 jao * NEWS: version 0.4 2001-07-22 23:08 jao * NEWS, doc/mdk_gstart.texi, doc/mdk_mixvm.texi, mixlib/mix_vm.c, mixlib/mix_vm.h, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, samples/.cvsignore, samples/bt.mixal, samples/cbp.mixal: version 0.4 2001-07-22 15:47 jao * mixlib/: mix_vm_command.c, xmix_vm.h: release 0.4 2001-07-22 01:02 jao * ChangeLog, mdk.spec: version 0.4 2001-07-22 00:54 jao * mixlib/: mix_predicate.c, mix_predicate_list.c, mix_predicate_list.h, mix_vm.c, mix_vm.h, mix_vm_command.c: conditional breakpoints finished 2001-07-22 00:09 jao * doc/: mdk_gstart.texi, mdk_mixvm.texi: conditional breakpoints 2001-07-21 23:21 jao * NEWS: conditional breakpoints 2001-07-21 23:14 jao * mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixutils/mixvm_command.c, samples/.cvsignore, samples/cbp.mixal: mem and register conditional breakpoints 2001-07-21 23:11 jao * aclocal.m4: new macros 2001-07-19 02:24 jao * mixlib/Makefile.am, mixlib/mix_config.c, mixlib/mix_predicate.c, mixlib/mix_predicate.h, mixlib/mix_predicate_list.c, mixlib/mix_predicate_list.h, mixlib/mix_vm.c, mixlib/mix_vm.h, mixlib/mix_vm_command.c, mixlib/xmix_vm.h, mixutils/mixvm_loop.c, po/ChangeLog: cond bp support 2001-07-13 22:17 jao * doc/: mdk_gmixvm.texi, mdk_gstart.texi, img/ss_devdir.jpg, img/ss_split.jpg: version 0.4 2001-07-11 01:04 jao * doc/: .cvsignore, mdk.texi, mdk_mixvm.texi: version 0.4 2001-07-10 00:55 jao * configure.in: version 0.4 2001-07-10 00:49 jao * NEWS, mixgtk/mixgtk.c, mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_cmd_dispatcher.h, mixlib/mix_config.c, mixlib/mix_config.h, mixlib/mix_vm_command.c, mixutils/mixvm_loop.c: history file 2001-07-08 23:55 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_device.c, mixgtk/mixgtk_gen_handlers.c, mixgtk/mixgtk_gen_handlers.h, mixgtk/mixgtk_widgets.c, mixgtk/mixgtk_widgets.h: devdir command via menu 2001-07-08 02:18 jao * mixgtk/: mixgtk_cmd_dispatcher.c, mixgtk_config.c, mixgtk_config.h, mixgtk_device.c: use of mix_config 2001-07-08 01:34 jao * mixlib/mix_config.c, mixlib/mix_device.c, mixlib/mix_device.h, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixutils/mixvm.c, mixutils/mixvm_command.c, mixutils/mixvm_command.h, mixutils/mixvm_loop.c: use of devdir command 2001-07-08 00:57 jao * mixlib/mix_config.h: (mix_config_get_filename) new function 2001-07-07 22:46 jao * mixlib/: mix_vm_command.c, mix_vm_command.h: timing command 2001-07-07 22:31 jao * mixlib/mix_vm_command.c: trace->tracing 2001-07-07 00:28 jao * mixlib/: mix_vm_command.c, mix_vm_command.h: (mix_vm_cmd_dispatcher_new_with_config) new constructor tron/troff substituted by trace on|off 2001-07-06 01:38 jao * mixlib/: mix_device.c, mix_device.h, xmix_device.c, xmix_device.h: externally provided device files directory 2001-07-06 01:37 jao * mixlib/mix_config.c: use mix_stat_dir 2001-07-06 01:37 jao * mixlib/: mix.c, mix.h: (mix_stat_dir) new function 2001-07-06 01:35 jao * mixgtk/: mixgtk.h, mixgtk_config.c, mixgtk_device.c: use of .mdk instead of .gmixvm 2001-07-03 00:56 jao * mixgtk/mixgtk_config.c: use of mix_config_t 2001-07-03 00:39 jao * mixlib/: mix_config.c, mix_config.h, Makefile.am: shared config handler 2001-07-01 15:33 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_device.c: split improved 2001-06-30 21:35 jao * mixgtk/: mixgtk.c, mixgtk_cmd_dispatcher.c, mixgtk_device.c, mixgtk_widgets.c, mixgtk_wm.c: split improved 2001-06-28 00:50 jao * mixgtk/: mixgtk.c, mixgtk.glade, mixgtk.h, mixgtk_fontsel.c, mixgtk_fontsel.h, mixgtk_mixal.c, mixgtk_mixvm.c, mixgtk_widgets.c, mixgtk_widgets.h, mixgtk_wm.c: hot split swap 2001-06-26 01:52 jao * mixgtk/: mixgtk.c, mixgtk.h, mixgtk_cmd_dispatcher.c, mixgtk_colorsel.c, mixgtk_colorsel.h, mixgtk_device.c, mixgtk_fontsel.c, mixgtk_gen_handlers.c, mixgtk_input.c, mixgtk_input.h, mixgtk_mixal.c, mixgtk_widgets.c, mixgtk_wm.c: hot split/unsplit 2001-06-24 18:58 jao * mixgtk/mixgtk.glade: split windows mode 2001-06-24 18:56 jao * NEWS: display file in title 2001-06-24 18:51 jao * mixgtk/mixgtk_cmd_dispatcher.c: display file in title 2001-06-24 15:06 jao * mixgtk/: .cvsignore, Makefile.am, mixgtk.c, mixgtk.glade, mixgtk_cmd_dispatcher.c, mixgtk_cmd_dispatcher.h, mixgtk_config.c, mixgtk_config.h, mixgtk_fontsel.c, mixgtk_fontsel.h, mixgtk_mixal.c, mixgtk_mixal.h, mixgtk_mixvm.c, mixgtk_mixvm.h, mixgtk_widgets.c, mixgtk_widgets.h, mixgtk_wm.c, mixgtk_wm.h: split windows mode 2001-06-23 10:05 jao * samples/.cvsignore: release 0.3.5 2001-06-22 04:16 jao * doc/img/Makefile.am, ChangeLog: version 0.3.5 2001-06-22 04:12 jao * README: url 2001-06-21 23:13 jao * mixgtk/mixgtk.glade: release 0.3.5 2001-06-21 22:47 jao * mixgtk/mixgtk_mixal.c: release 0.3.5 2001-06-21 22:27 jao * mdk.spec, doc/mdk.texi, doc/mdk_gmixvm.texi, doc/img/ss_colors.jpg, doc/img/ss_devform.jpg, doc/img/ss_devices.jpg, doc/img/ss_extprog.jpg, doc/img/ss_goto.jpg, doc/img/ss_mix.jpg, doc/img/ss_mixal.jpg, doc/img/ss_symbols.jpg, doc/img/ss_worddlg.jpg, mixgtk/mixgtk.glade, mdk.spec: release 0.3.5 2001-06-19 00:59 jao * NEWS: psym bugs fixed 2001-06-19 00:54 jao * mixlib/mix_symbol_table.c: (add_symbol_) symbol value correctly recovered (including sign) 2001-06-19 00:43 jao * mixlib/mix_vm_command.c: (cmd_psym_) symbols printed to the correct stream 2001-06-19 00:27 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_mixal.c, mixgtk/mixgtk_widgets.c, mixgtk/mixgtk_widgets.h: gmixvm symbols dialog 2001-06-18 01:26 jao * mixgtk/mixgtk.glade: minor change 2001-06-18 01:05 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_mixal.c: variables in status bar 2001-06-15 23:09 jao * configure.in: version 0.3.5 2001-06-15 23:08 jao * NEWS: font config bug fixed 2001-06-15 22:37 jao * mixgtk/mixgtk_fontsel.c: font config bug fixed 2001-06-15 17:00 jao * mixgtk/: mixgtk_gen_handlers.c, mixgtk_gen_handlers.c: bug corrected 2001-06-12 23:37 jao * doc/mdk.texi: version 0.3.4 2001-06-12 23:34 jao * NEWS: version 0.3.4 2001-06-12 23:28 jao * configure.in: version 0.3.4 2001-06-12 18:07 jao * mixgtk/mixgtk_device.c: segfault corrected 2001-06-11 22:39 jao * THANKS: adrian 2001-06-11 22:38 jao * THANKS: minor changes 2001-06-10 14:45 jao * doc/mdk_gmixvm.texi: minor changes 2001-06-10 14:15 jao * doc/mdk_gmixvm.texi: minor changes 2001-06-10 00:49 jao * ChangeLog, mdk.spec, doc/.cvsignore, doc/img/.cvsignore: version 0.3.3 2001-06-09 16:38 jao * NEWS, mdk.spec, doc/mdk.texi, doc/mdk_gmixvm.texi, doc/mdk_mixvm.texi, doc/img/.cvsignore, doc/img/Makefile.am, doc/img/ss_devform.jpg, doc/img/ss_extprog.jpg: version 0.3.3 2001-06-09 00:58 jao * aclocal.m4: version 0.3.3 2001-06-09 00:31 jao * configure.in: version 0.3.3 2001-06-09 00:29 jao * NEWS: minor changes 2001-06-09 00:27 jao * mixgtk/: mixgtk.glade, mixgtk_cmd_dispatcher.c, mixgtk_cmd_dispatcher.h, mixgtk_gen_handlers.c, mixgtk_gen_handlers.h: edit and compile menu entries added 2001-06-09 00:26 jao * mixlib/: mix_vm_command.c, mix_vm_command.h: src file path accessor added 2001-06-08 02:49 jao * THANKS: new guys 2001-06-08 02:08 jao * doc/mdk_tut.texi: minor correction 2001-06-07 00:49 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_cmd_dispatcher.c: command history and tab completion added 2001-06-07 00:48 jao * mixutils/.cvsignore: new ignored file 2001-06-05 23:26 jao * mixlib/mix_vm_command.c: (cmd_edit_) messages about executed command added 2001-06-05 23:23 jao * mixlib/mix_vm_command.c: (cmd_compile_) messages about executed command added 2001-06-05 23:17 jao * mixutils/mixvm_command.c: use of mix_vm_cmd_dispatcher edit and compile commands 2001-06-05 23:04 jao * mixlib/mix_parser.c: copyright notice 2001-06-05 23:03 jao * mixlib/mix_parser.c: the src path always correctly stored 2001-06-05 23:02 jao * mixlib/: mix_vm_command.c, mix_vm_command.h: edit and compile commands added 2001-06-05 22:15 jao * mixlib/: mix_vm_command.c, mix_vm_command.h: edit and compile commands added 2001-06-05 00:13 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_mixvm.h, mixgtk/mixgtk_widgets.c, mixgtk/mixgtk_widgets.h, mixlib/mix_file.c, mixlib/mix_file.h, samples/primes.mixal: edit and compile commands added to gmixvm 2001-06-05 00:05 jao * mixlib/mix_vm_command.c: (mix_vm_cmd_dispatch) \n added to unknown command message 2001-06-03 13:24 jao * mixgtk/mixgtk.glade: extern program dialog added 2001-06-03 13:19 jao * mixgtk/.cvsignore, mixlib/.cvsignore, samples/.cvsignore: new ignored files 2001-06-03 13:16 jao * NEWS: when a file is reloaded, breakpoints are no reset 2001-06-03 13:06 jao * mixlib/mix_vm.c: (mix_vm_load_file) when a file is reloaded, breakpoints are no reset 2001-06-03 11:04 jao * mixlib/mix_scanner.l: CON bug fixed 2001-05-31 00:15 jao * NEWS, mixgtk/mixgtk.glade, mixgtk/mixgtk_device.c, mixgtk/mixgtk_device.h, mixgtk/mixgtk_widgets.c, mixgtk/mixgtk_widgets.h, mixlib/mix_vm.c, mixlib/mix_vm.h: binary devices output formats added 2001-05-25 00:56 jao * doc/: fdl.texi, gpl.texi, mdk.texi, mdk_bugs.texi, mdk_emixvm.texi, mdk_gmixvm.texi, mdk_gstart.texi, mdk_index.texi, mdk_install.texi, mdk_intro.texi, mdk_mixasm.texi, mdk_mixvm.texi, mdk_tut.texi: license changed to gfdl 2001-05-24 02:38 jao * mixgtk/: mixgtk.c, mixgtk.glade, mixgtk.h, mixgtk_colorsel.c, mixgtk_colorsel.h, mixgtk_fontsel.c, mixgtk_fontsel.h, mixgtk_input.c, mixgtk_input.h, mixgtk_mixvm.c, mixgtk_widgets.c, mixgtk_widgets.h: deferred dialog creation 2001-05-19 20:53 jao * doc/img/ss_goto.jpg: 0.3.2 release 2001-05-19 16:58 jao * Makefile.am, mdk.spec: file mdk.spec added to the distribution 2001-05-19 16:55 jao * mixgtk/mixgtk_mixvm.c, doc/img/ss_colors.jpg, doc/img/ss_devices.jpg, doc/img/ss_goto.jpg, doc/img/ss_mix.jpg, doc/img/ss_mixal.jpg, doc/img/ss_worddlg.jpg: 0.3.2 release 2001-05-16 23:09 jao * ChangeLog: 0.3.2 release 2001-05-16 23:06 jao * samples/: stress5.mixal, stress6.mixal: 0.3.2 release 2001-05-16 23:02 jao * INSTALL, samples/.cvsignore: 0.3.2 release 2001-05-16 01:28 jao * doc/mdk_install.texi: CVS URL corrected 2001-05-16 01:20 jao * doc/img/Makefile.am: new figures added 2001-05-16 01:11 jao * ChangeLog: 0.3.2 release 2001-05-16 01:08 jao * .cvsignore, configure.in, updatelog, doc/mdk.texi, doc/mdk_gmixvm.texi, doc/mdk_install.texi, doc/img/ss_colors.jpg, doc/img/ss_goto.jpg, mixlib/mix.h, samples/.cvsignore: 0.3.2 release 2001-05-14 00:58 jao * THANKS, NEWS: name typo 2001-05-14 00:54 jao * NEWS, THANKS: 0.3.2 release 2001-05-11 00:10 jao * NEWS: 0.3.2 release 2001-05-10 23:48 jao * mixgtk/: mixgtk.glade, mixgtk_device.c, mixgtk_fontsel.c: devices font customisation added 2001-05-10 01:45 jao * mixlib/: mix_file.c, xmix_io.c: read/write files not truncated if they already exist 2001-05-10 01:17 jao * mixgtk/mixgtk_device.c: minor changes 2001-05-10 01:16 jao * mixlib/: mix_io.c, xmix_device.c, xmix_io.c: (mix_io_write_*_array) bug corrected 2001-05-08 01:03 jao * mixgtk/mixgtk_device.c: use of virtual device destructor to delete devices after program reload 2001-05-08 01:02 jao * mixlib/: mix_device.c, mix_vm.c, xmix_device.c, xmix_device.h: mix_device_t: virtual destructor added 2001-05-06 23:38 jao * mixgtk/mixgtk_device.c, mixlib/mix_device.c, mixlib/xmix_device.c, mixlib/xmix_device.h: support for gtk binary devices added 2001-05-04 01:48 jao * mixlib/: mix_vm.c, mix_vm.h, xmix_vm.c, xmix_vm.h: new devices are created by a (possibly externally provided) factory 2001-05-04 01:35 jao * mixgtk/mixgtk_fontsel.c: (change_font_) setting current font on fontsel dialog when available 2001-05-04 01:34 jao * mixgtk/mixgtk.c: (mixgtk_init) check for the existence of glade xml file(s) before using it 2001-04-30 01:28 jao * mixgtk/mixgtk.glade: minor changes 2001-04-29 22:40 jao * mixgtk/: mixgtk_fontsel.c, mixgtk_mixal.c: config file handling added 2001-04-29 14:56 jao * mixgtk/: Makefile.am, mixgtk.c, mixgtk.glade, mixgtk.h, mixgtk_config.c, mixgtk_config.h, mixgtk_fontsel.c, mixgtk_gen_handlers.c, mixgtk_gen_handlers.h, mixgtk_widgets.c: config file handling added 2001-04-28 22:54 jao * mixgtk/: Makefile.am, gmixvm.c, mixgtk.c, mixgtk.h: initialisation, clean-up and main functionality split 2001-04-28 00:54 jao * mixgtk/: .cvsignore, Makefile.am, mixgtk.c, mixgtk.glade, mixgtk_fontsel.c, mixgtk_fontsel.h, mixgtk_widgets.c, mixgtk_widgets.h: font customization added 2001-04-23 23:30 jao * mixutils/Makefile.am: intlibs recovered 2001-04-22 22:07 jao * mixlib/mix_vm_command.c: (cmd_pmem_) seg fault when freeing (changed) arg valued corrected 2001-04-22 02:04 jao * mixgtk/: Makefile.am, mixgtk.c, mixgtk.glade, mixgtk_colorsel.c, mixgtk_colorsel.h, mixgtk_mixal.c, mixgtk_mixal.h, mixgtk_widgets.c, mixgtk_widgets.h: color custumozation added 2001-04-21 23:59 jao * doc/mdk_install.texi: minor changes 2001-04-21 23:30 jao * mixgtk/mixgtk_mixal.c: (on_mixal_select_row) set/unset breakpoints on location line 2001-04-09 01:15 jao * INSTALL: release 0.3.1 2001-04-09 00:40 jao * .cvsignore: ignored files 2001-04-09 00:40 jao * doc/mdk.texi, doc/mdk_install.texi, ChangeLog: release 0.3.1 2001-04-09 00:19 jao * aclocal.m4, NEWS: release 0.3.1 2001-04-08 22:35 jao * aclocal.m4, configure.in: gtk test recovered 2001-04-08 22:23 jao * NEWS, THANKS, mixgtk/mixgtk_cmd_dispatcher.c: compilation on FreeBSD fixed 2001-04-08 00:13 jao * lib/.cvsignore, samples/.cvsignore: ignored files 2001-04-08 00:12 jao * Makefile.am, aclocal.m4, configure.in, lib/Makefile.am, lib/getopt.h, lib/getopt_long.c, mixgtk/Makefile.am, mixutils/Makefile.am, mixutils/mixasm.c, mixutils/mixvm.c: getopt and getopt_long provided if missing 2001-04-07 12:23 jao * mixlib/mix_file.h: minor changes 2001-04-03 00:19 jao * mixutils/mixvm_loop.c: use of gets avoided for FreeBSD portability 2001-04-03 00:11 jao * mixgtk/mixgtk_device.c: use of opem_memstream avoided for FreeBSD portability 2001-04-02 21:32 jao * misc/Makefile.am: mixvm.el installed as package data 2001-04-01 15:23 jao * mixgtk/: mixgtk_cmd_dispatcher.c, mixgtk_mixal.c, mixgtk_input.c: including prototype for strlen (string.h) 2001-04-01 15:22 jao * mixlib/mix_vm_command.c: (cmd_smem_) variables always initialised 2001-04-01 15:09 jao * mixlib/: mix_eval_scanner.l, mix_scanner.l: including prototype for strlen (string.h) 2001-04-01 15:06 jao * mixlib/: mix_code_file.c, mix_parser.c: including prototype for strlen (string.h) 2001-04-01 15:04 jao * mixlib/mix_file.c: including prototype for strlen and strcmp (string.h) 2001-04-01 15:01 jao * mixlib/mix_symbol_table.c: including prototype for strlen (string.h) 2001-04-01 14:59 jao * mixlib/xmix_vm.h: including prototype for memset (string.h) 2001-04-01 00:04 jao * configure.in, doc/mdk.texi, mixgtk/mixgtk_mixal.h: minor changes 2001-03-31 02:35 jao * doc/mdk.texi: direntry added 2001-03-30 23:09 jao * doc/Makefile.am: missing file 2001-03-30 02:23 jao * mixgtk/Makefile.am, mixutils/Makefile.am: included gettext libs properly used when specified in configuration 2001-03-28 01:20 jao * TODO: release 0.3 2001-03-28 01:16 jao * THANKS, NEWS: release 0.3 2001-03-28 01:12 jao * .cvsignore, NEWS, configure.in, doc/Makefile.am, doc/mdk.texi, doc/mdk_gmixvm.texi, doc/ss_devices.png, doc/ss_mix.png, doc/ss_mix.txt, doc/ss_mixal.png, doc/ss_mixal.txt, doc/ss_worddlg.png, doc/img/.cvsignore, doc/img/Makefile.am, samples/stress2.mixal: 0.3 release 2001-03-26 00:54 jao * doc/img/: ss_devices.jpg, ss_devices.png, ss_mix.jpg, ss_mix.png, ss_mixal.jpg, ss_mixal.png, ss_worddlg.jpg, ss_worddlg.png: images translated to jpg 2001-03-26 00:45 jao * doc/img/: Makefile.am, ss_devices.png, ss_mix.png, ss_mix.txt, ss_mixal.png, ss_mixal.txt, ss_worddlg.png, ss_mixal.txt: doc images 2001-03-26 00:06 jao * doc/ss_mixal.txt: info mode figure 2001-03-22 04:01 jao * .cvsignore, AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, THANKS, TODO, acconfig.h, aclocal.m4, autogen.sh, configure.in, doc/.cvsignore, doc/Makefile.am, doc/gpl.texi, doc/mdk.texi, doc/mdk_bugs.texi, doc/mdk_emixvm.texi, doc/mdk_gmixvm.texi, doc/mdk_gstart.texi, doc/mdk_index.texi, doc/mdk_install.texi, doc/mdk_intro.texi, doc/mdk_mixasm.texi, doc/mdk_mixvm.texi, doc/mdk_tut.texi, doc/ss_devices.png, doc/ss_mix.png, doc/ss_mix.txt, doc/ss_mixal.png, doc/ss_worddlg.png, misc/.cvsignore, misc/Makefile.am, misc/mixvm.el, mixgtk/.cvsignore, mixgtk/Makefile.am, mixgtk/mixgtk.c, mixgtk/mixgtk.glade, mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_cmd_dispatcher.h, mixgtk/mixgtk_device.c, mixgtk/mixgtk_device.h, mixgtk/mixgtk_gen_handlers.c, mixgtk/mixgtk_gen_handlers.h, mixgtk/mixgtk_input.c, mixgtk/mixgtk_input.h, mixgtk/mixgtk_mixal.c, mixgtk/mixgtk_mixal.h, mixgtk/mixgtk_mixvm.c, mixgtk/mixgtk_mixvm.h, mixgtk/mixgtk_widgets.c, mixgtk/mixgtk_widgets.h, mixlib/.cvsignore, mixlib/Makefile.am, mixlib/mix.c, mixlib/mix.h, mixlib/mix_code_file.c, mixlib/mix_code_file.h, mixlib/mix_device.c, mixlib/mix_device.h, mixlib/mix_eval.c, mixlib/mix_eval.h, mixlib/mix_eval_scanner.l, mixlib/mix_file.c, mixlib/mix_file.h, mixlib/mix_ins.c, mixlib/mix_ins.h, mixlib/mix_io.c, mixlib/mix_io.h, mixlib/mix_parser.c, mixlib/mix_parser.h, mixlib/mix_scanner.l, mixlib/mix_src_file.c, mixlib/mix_src_file.h, mixlib/mix_symbol_table.c, mixlib/mix_symbol_table.h, mixlib/mix_types.c, mixlib/mix_types.h, mixlib/mix_vm.c, mixlib/mix_vm.h, mixlib/mix_vm_clock.c, mixlib/mix_vm_clock.h, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixlib/mix_vm_dump.c, mixlib/mix_vm_dump.h, mixlib/xmix_device.c, mixlib/xmix_device.h, mixlib/xmix_eval.h, mixlib/xmix_io.c, mixlib/xmix_io.h, mixlib/xmix_parser.h, mixlib/xmix_vm.c, mixlib/xmix_vm.h, mixlib/testsuite/.cvsignore, mixlib/testsuite/Makefile.am, mixlib/testsuite/mix_device_t.c, mixlib/testsuite/mix_eval_t.c, mixlib/testsuite/mix_ins_t.c, mixlib/testsuite/mix_parser_t.c, mixlib/testsuite/mix_types_t.c, mixlib/testsuite/mix_vm_ins_t.c, mixlib/testsuite/test.h, mixutils/.cvsignore, mixutils/Makefile.am, mixutils/mixasm.c, mixutils/mixasm_comp.c, mixutils/mixasm_comp.h, mixutils/mixvm.c, mixutils/mixvm_command.c, mixutils/mixvm_command.h, mixutils/mixvm_loop.c, po/.cvsignore, po/ChangeLog, po/POTFILES.in, samples/.cvsignore, samples/Makefile.am, samples/hello.mixal, samples/primes.mixal, samples/primes.result, samples/stress1.mixal, samples/stress2.mixal, samples/stress4.mixal: Initial revision 2001-03-22 04:01 jao * .cvsignore, AUTHORS, COPYING, ChangeLog, INSTALL, Makefile.am, NEWS, README, THANKS, TODO, acconfig.h, aclocal.m4, autogen.sh, configure.in, doc/.cvsignore, doc/Makefile.am, doc/gpl.texi, doc/mdk.texi, doc/mdk_bugs.texi, doc/mdk_emixvm.texi, doc/mdk_gmixvm.texi, doc/mdk_gstart.texi, doc/mdk_index.texi, doc/mdk_install.texi, doc/mdk_intro.texi, doc/mdk_mixasm.texi, doc/mdk_mixvm.texi, doc/mdk_tut.texi, doc/ss_devices.png, doc/ss_mix.png, doc/ss_mix.txt, doc/ss_mixal.png, doc/ss_worddlg.png, misc/.cvsignore, misc/Makefile.am, misc/mixvm.el, mixgtk/.cvsignore, mixgtk/Makefile.am, mixgtk/mixgtk.c, mixgtk/mixgtk.glade, mixgtk/mixgtk_cmd_dispatcher.c, mixgtk/mixgtk_cmd_dispatcher.h, mixgtk/mixgtk_device.c, mixgtk/mixgtk_device.h, mixgtk/mixgtk_gen_handlers.c, mixgtk/mixgtk_gen_handlers.h, mixgtk/mixgtk_input.c, mixgtk/mixgtk_input.h, mixgtk/mixgtk_mixal.c, mixgtk/mixgtk_mixal.h, mixgtk/mixgtk_mixvm.c, mixgtk/mixgtk_mixvm.h, mixgtk/mixgtk_widgets.c, mixgtk/mixgtk_widgets.h, mixlib/.cvsignore, mixlib/Makefile.am, mixlib/mix.c, mixlib/mix.h, mixlib/mix_code_file.c, mixlib/mix_code_file.h, mixlib/mix_device.c, mixlib/mix_device.h, mixlib/mix_eval.c, mixlib/mix_eval.h, mixlib/mix_eval_scanner.l, mixlib/mix_file.c, mixlib/mix_file.h, mixlib/mix_ins.c, mixlib/mix_ins.h, mixlib/mix_io.c, mixlib/mix_io.h, mixlib/mix_parser.c, mixlib/mix_parser.h, mixlib/mix_scanner.l, mixlib/mix_src_file.c, mixlib/mix_src_file.h, mixlib/mix_symbol_table.c, mixlib/mix_symbol_table.h, mixlib/mix_types.c, mixlib/mix_types.h, mixlib/mix_vm.c, mixlib/mix_vm.h, mixlib/mix_vm_clock.c, mixlib/mix_vm_clock.h, mixlib/mix_vm_command.c, mixlib/mix_vm_command.h, mixlib/mix_vm_dump.c, mixlib/mix_vm_dump.h, mixlib/xmix_device.c, mixlib/xmix_device.h, mixlib/xmix_eval.h, mixlib/xmix_io.c, mixlib/xmix_io.h, mixlib/xmix_parser.h, mixlib/xmix_vm.c, mixlib/xmix_vm.h, mixlib/testsuite/.cvsignore, mixlib/testsuite/Makefile.am, mixlib/testsuite/mix_device_t.c, mixlib/testsuite/mix_eval_t.c, mixlib/testsuite/mix_ins_t.c, mixlib/testsuite/mix_parser_t.c, mixlib/testsuite/mix_types_t.c, mixlib/testsuite/mix_vm_ins_t.c, mixlib/testsuite/test.h, mixutils/.cvsignore, mixutils/Makefile.am, mixutils/mixasm.c, mixutils/mixasm_comp.c, mixutils/mixasm_comp.h, mixutils/mixvm.c, mixutils/mixvm_command.c, mixutils/mixvm_command.h, mixutils/mixvm_loop.c, po/.cvsignore, po/ChangeLog, po/POTFILES.in, samples/.cvsignore, samples/Makefile.am, samples/hello.mixal, samples/primes.mixal, samples/primes.result, samples/stress1.mixal, samples/stress2.mixal, samples/stress4.mixal: initial import (sf 0.3beta) mdk-1.2.9/config.rpath0000755000175000017500000003521312110326462011530 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2003 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $CC in icc|ecc) wl='-Wl,' ;; ccc) wl='-Wl,' ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi4*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then hardcode_direct=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10* | hpux11*) if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4.2uw2*) hardcode_direct=yes hardcode_minus_L=no ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ;; sysv5*) hardcode_libdir_flag_spec= ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi4*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; freebsd*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case "$host_cpu" in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; irix5* | irix6* | nonstopux*) case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux*) ;; netbsd*) ;; newsos6) ;; nto-qnx) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; sco3.2v5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ;; sysv4*MP*) ;; uts4*) ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <) provided MIXAL test programs pinpointing bugs in the first MDK release, and useful discussions as well. Philip has also contributed with the Emacs port of `mixvm' and influenced the `gmixvm' GUI design with insightful comments and prototypes. * Aleix Conchillo () has been following MDK's development for many years, indefatigably chasing and fixing bugs, and suggesting many improvements. He's also the original author of the Fink and Macports ports, and took care of keeping Guile support up to date. * Pieter E.J. Pareit () is the author of the Emacs MIXAL mode, and has also contributed many bug fixes. * Michael Scholz () is the author of the German translation of MDK's user interface. * Sergey Poznyakoff () provided patches to mixlib/mix_scanner.l improving MIXAL compliance. * Sergey Litvin (litvindev@gmail.com) implemented the instructions SLB, SRB, JAE, JAO, JXE, and JXO from volume 2 of TAOCP. * Francesc Xavier Noria () kindly and thoroughly reviewed the MDK documentation, providing insightful advice. * Eric S. Raymond contributed the documentation file doc/MIX.DOC and the samples sample/elevator.mixal, sample/mistery.mixal from his MIXAL package. * Ryan Schmidt, Agustin Navarro (), Ying-Chieh Liao (), Adrian Bunk (), Baruch Even () and Ronald Cole () created and/or maintain packages of MDK for different operating systems. * Jason Uhlenkott, Andrew Hood (), Radu Butnaru () Ruslan Batdalov (), WeiZheng (), Sascha Wilde, Michael Vernov and Xiaofeng Zhao reported (sometimes with suggested fixes) several bugs in MDK. * Nelson H. F. Beebe (, http://www.math.utah.edu/~beebe) has tested MDK in a lot of Unix platforms, suggesting portability enhancements to the source code. * Christoph von Nathusius (), Stephen Ramsay () and Johan Swanljung () tested MDK on different platforms. * Joshua Davies, Eli Bendersky (), Milan Bella () and Jens Seidel reported several documentation bugs. * Richard Stallman () suggested various improvements to the documentation and has always kept an eye on every MDK release. * MDK was inspired by Darius Bacon's MIXAL program (http://www.accesscom.com/~darius/). mdk-1.2.9/install-sh0000755000175000017500000003546312563613157011247 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mdk-1.2.9/ABOUT-NLS0000644000175000017500000015111612110326462010450 00000000000000Notes on the Free Translation Project ************************************* Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work at translations should contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. Quick configuration advice ========================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. INSTALL Matters =============== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the GNU `gettext' own library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will respectively bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might be not what is desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages have usually many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. Using This Package ================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your country by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. Translating Teams ================= For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of January 2004. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es +----------------------------------------------------+ a2ps | [] [] [] [] | aegis | () | ant-phone | () | anubis | | ap-utils | | aspell | [] | bash | [] [] [] [] | batchelor | | bfd | [] [] | binutils | [] [] | bison | [] [] [] | bluez-pin | [] [] [] | clisp | | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | [] [] [] | darkstat | [] () [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] [] | error | [] [] [] [] [] | fetchmail | [] () [] [] [] [] | fileutils | [] [] [] | findutils | [] [] [] [] [] [] [] | flex | [] [] [] [] | fslint | | gas | [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | [] [] | gettext | [] [] [] [] [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] [] [] [] | gliv | | glunarclock | [] [] | gnubiff | [] | gnucash | [] () [] [] | gnucash-glossary | [] () [] | gnupg | [] () [] [] [] [] | gpe-aerial | [] | gpe-beam | [] [] | gpe-calendar | [] [] | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] [] | gprof | [] [] [] | gpsdrive | () () () | gramadoir | [] | grep | [] [] [] [] [] [] | gretl | [] | gtick | [] () | hello | [] [] [] [] [] [] | id-utils | [] [] | indent | [] [] [] [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] | iso_3166_1 | [] [] [] [] [] [] | iso_3166_2 | | iso_3166_3 | [] | iso_4217 | [] [] [] [] | iso_639 | | jpilot | [] [] [] | jtag | | jwhois | [] | kbd | [] [] [] [] [] | latrine | () | ld | [] [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] | libiconv | [] [] [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lingoteach_lessons | () () | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] | man-db | [] () [] [] () | minicom | [] [] [] | mysecretdiary | [] [] [] | nano | [] () [] [] [] | nano_1_0 | [] () [] [] [] | opcodes | [] | parted | [] [] [] [] [] | ptx | [] [] [] [] [] | python | | radius | [] | recode | [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] | sed | [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | | sharutils | [] [] [] [] [] [] | silky | () | skencil | [] () [] | sketch | [] () [] | soundtracker | [] [] [] | sp | [] | tar | [] [] [] [] | texinfo | [] [] [] | textutils | [] [] [] [] | tin | () () | tp-robot | | tuxpaint | [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] [] [] [] | xchat | [] [] [] [] | xfree86_xkb_xml | [] [] | xpad | [] | +----------------------------------------------------+ af am ar az be bg bs ca cs da de el en en_GB eo es 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68 et eu fa fi fr ga gl he hr hu id is it ja ko lg +-------------------------------------------------+ a2ps | [] [] [] () () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] | aspell | [] [] | bash | [] [] | batchelor | [] [] | bfd | [] | binutils | [] [] | bison | [] [] [] [] | bluez-pin | [] [] [] [] [] | clisp | | clisp | [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] [] | darkstat | () [] [] [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] [] [] [] [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext | [] [] [] | gettext-examples | [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gliv | () | glunarclock | [] [] [] [] | gnubiff | [] | gnucash | () [] | gnucash-glossary | [] | gnupg | [] [] [] [] [] [] [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] [] [] | gpe-clock | [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] | gpe-sketchbook | [] | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] | gprof | [] [] | gpsdrive | () () () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] | gtick | [] [] [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] [] | iso_3166_1 | [] [] [] [] [] | iso_3166_2 | | iso_3166_3 | | iso_4217 | [] [] [] [] [] [] | iso_639 | | jpilot | [] () | jtag | [] | jwhois | [] [] [] [] | kbd | [] | latrine | [] | ld | [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] [] [] | libiconv | [] [] [] [] [] [] [] [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] | lingoteach_lessons | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] [] [] [] [] | man-db | () () | minicom | [] [] [] [] | mysecretdiary | [] [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] | sharutils | [] [] [] [] [] | silky | () [] () () | skencil | [] | sketch | [] | soundtracker | [] [] | sp | [] () | tar | [] [] [] [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] [] [] | tin | [] () | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] () [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] | xchat | [] [] [] | xfree86_xkb_xml | [] [] | xpad | [] [] | +-------------------------------------------------+ et eu fa fi fr ga gl he hr hu id is it ja ko lg 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0 lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru +-----------------------------------------------------+ a2ps | [] [] () () [] [] [] | aegis | () () () | ant-phone | [] [] | anubis | [] [] [] [] [] [] | ap-utils | [] () [] | aspell | [] | bash | [] [] [] | batchelor | [] | bfd | [] | binutils | [] | bison | [] [] [] [] [] | bluez-pin | [] [] [] | clisp | | clisp | [] | console-tools | [] | coreutils | [] [] | cpio | [] [] [] [] [] | darkstat | [] [] [] [] | diffutils | [] [] [] [] [] [] | e2fsprogs | [] | enscript | [] [] [] [] | error | [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] | fslint | [] [] | gas | | gawk | [] [] [] | gbiff | [] [] | gcal | | gcc | | gettext | [] [] [] | gettext-examples | [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] | gimp-print | [] | gliv | [] [] [] | glunarclock | [] [] [] [] | gnubiff | [] | gnucash | [] [] () [] | gnucash-glossary | [] [] | gnupg | [] | gpe-aerial | [] [] [] [] | gpe-beam | [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] [] | gpe-ownerinfo | [] [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] | gprof | [] [] | gpsdrive | () () [] | gramadoir | () [] | grep | [] [] [] [] [] | gretl | | gtick | [] [] [] | hello | [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | indent | [] [] [] [] | iso_3166 | [] [] [] | iso_3166_1 | [] [] | iso_3166_2 | | iso_3166_3 | [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] | jpilot | () () | jtag | | jwhois | [] [] [] [] () | kbd | [] [] [] | latrine | [] | ld | | libc | [] [] [] [] | libgpewidget | [] [] [] | libiconv | [] [] [] [] [] | lifelines | | lilypond | | lingoteach | | lingoteach_lessons | | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] [] [] [] | nano_1_0 | [] [] [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | ptx | [] [] [] [] [] [] [] [] | python | | radius | [] [] | recode | [] [] [] [] | rpm | [] [] [] | screem | | scrollkeeper | [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] | sharutils | [] [] | silky | () | skencil | [] [] | sketch | [] [] | soundtracker | | sp | | tar | [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] | tin | | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] | vorbis-tools | [] [] [] | wastesedge | | wdiff | [] [] [] [] [] | wget | [] [] [] | xchat | [] [] [] | xfree86_xkb_xml | [] [] | xpad | [] [] | +-----------------------------------------------------+ lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63 sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu +-----------------------------------------------------+ a2ps | [] [] [] [] | 16 aegis | | 0 ant-phone | | 3 anubis | [] [] | 9 ap-utils | () | 3 aspell | | 4 bash | | 9 batchelor | | 3 bfd | [] [] | 6 binutils | [] [] [] | 8 bison | [] [] | 14 bluez-pin | [] [] [] | 14 clisp | | 0 clisp | | 5 console-tools | | 3 coreutils | [] [] [] [] | 16 cpio | [] [] | 14 darkstat | [] [] [] () () | 12 diffutils | [] [] [] | 23 e2fsprogs | [] [] | 6 enscript | [] [] | 12 error | [] [] [] | 15 fetchmail | [] [] | 11 fileutils | [] [] [] [] [] | 17 findutils | [] [] [] [] [] [] | 29 flex | [] [] | 13 fslint | | 3 gas | [] | 3 gawk | [] [] | 12 gbiff | | 4 gcal | [] [] | 4 gcc | [] | 4 gettext | [] [] [] [] [] | 16 gettext-examples | [] [] [] [] [] | 14 gettext-runtime | [] [] [] [] [] [] [] [] | 22 gettext-tools | [] [] [] [] [] [] | 14 gimp-print | [] [] | 10 gliv | | 3 glunarclock | [] [] [] | 13 gnubiff | | 3 gnucash | [] [] | 9 gnucash-glossary | [] [] [] | 8 gnupg | [] [] [] [] | 17 gpe-aerial | [] | 7 gpe-beam | [] | 8 gpe-calendar | [] [] [] [] | 13 gpe-clock | [] [] [] | 10 gpe-conf | [] [] | 9 gpe-contacts | [] [] [] | 11 gpe-edit | [] [] [] [] [] | 12 gpe-go | | 5 gpe-login | [] [] [] [] [] | 13 gpe-ownerinfo | [] [] [] [] | 13 gpe-sketchbook | [] [] | 9 gpe-su | [] [] [] | 10 gpe-taskmanager | [] [] [] | 10 gpe-timesheet | [] [] [] [] | 12 gpe-today | [] [] [] [] [] | 13 gpe-todo | [] [] [] [] | 12 gphoto2 | [] [] [] | 11 gprof | [] [] | 9 gpsdrive | [] [] | 3 gramadoir | [] | 5 grep | [] [] [] [] | 26 gretl | | 3 gtick | | 7 hello | [] [] [] [] [] | 34 id-utils | [] [] | 12 indent | [] [] [] [] | 21 iso_3166 | [] [] [] [] [] [] [] | 27 iso_3166_1 | [] [] [] | 16 iso_3166_2 | | 0 iso_3166_3 | | 2 iso_4217 | [] [] [] [] [] [] | 24 iso_639 | | 1 jpilot | [] [] [] [] [] | 9 jtag | [] | 2 jwhois | () [] [] | 11 kbd | [] [] | 11 latrine | | 2 ld | [] [] | 5 libc | [] [] [] [] | 20 libgpewidget | [] [] [] [] | 13 libiconv | [] [] [] [] [] [] [] [] | 27 lifelines | [] | 2 lilypond | [] | 3 lingoteach | | 2 lingoteach_lessons | () | 0 lynx | [] [] [] | 14 m4 | [] [] | 15 mailutils | | 5 make | [] [] [] | 16 man-db | [] | 5 minicom | | 11 mysecretdiary | [] [] | 10 nano | [] [] [] [] | 17 nano_1_0 | [] [] [] | 17 opcodes | [] [] | 6 parted | [] [] [] | 15 ptx | [] [] | 22 python | | 0 radius | | 4 recode | [] [] [] | 20 rpm | [] [] | 9 screem | [] [] | 2 scrollkeeper | [] [] [] | 15 sed | [] [] [] [] [] [] | 24 sh-utils | [] [] | 14 shared-mime-info | [] [] | 7 sharutils | [] [] [] [] | 17 silky | () | 3 skencil | [] | 6 sketch | [] | 6 soundtracker | [] [] | 7 sp | [] | 3 tar | [] [] [] [] [] | 24 texinfo | [] [] [] | 14 textutils | [] [] [] [] | 16 tin | | 1 tp-robot | | 2 tuxpaint | [] [] [] [] [] | 29 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] | 15 vorbis-tools | | 8 wastesedge | | 0 wdiff | [] [] [] | 18 wget | [] [] [] [] [] [] [] [] | 24 xchat | [] [] [] [] [] | 15 xfree86_xkb_xml | [] [] [] [] [] | 11 xpad | | 5 +-----------------------------------------------------+ 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If January 2004 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. Using `gettext' in new packages =============================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. mdk-1.2.9/configure0000755000175000017500000132211612636565537011156 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for GNU MDK 1.2.9. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 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 # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -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 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 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 : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 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 and bug-mdk@gnu.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: 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_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_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; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } 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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU MDK' PACKAGE_TARNAME='mdk' PACKAGE_VERSION='1.2.9' PACKAGE_STRING='GNU MDK 1.2.9' PACKAGE_BUGREPORT='bug-mdk@gnu.org' PACKAGE_URL='http://www.gnu.org/software/mdk/' ac_unique_file="mixlib/mix.h" # 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_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS AM_CFLAGS LIBOBJS DARWIN_SYSTEM_FALSE DARWIN_SYSTEM_TRUE MAKE_GUI_FALSE MAKE_GUI_TRUE GTK_LIBS GTK_CFLAGS MAKE_GUILE_FALSE MAKE_GUILE_TRUE MAKE_GUILE GUILE_LIBS GUILE_CFLAGS GLIB_LIBS GLIB_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG GETTEXT_PACKAGE ALL_LINGUAS INTLTOOL_PERL INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE intltool__v_merge_options_0 intltool__v_merge_options_ INTLTOOL_V_MERGE_OPTIONS INTLTOOL__v_MERGE_0 INTLTOOL__v_MERGE_ INTLTOOL_V_MERGE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE POSUB LTLIBINTL LIBINTL INTLLIBS INTL_LIBTOOL_SUFFIX_PREFIX INTLOBJS GENCAT INSTOBJEXT DATADIRNAME CATOBJEXT USE_INCLUDED_LIBINTL BUILD_INCLUDED_LIBINTL INTLBISON LTLIBICONV LIBICONV HAVE_WPRINTF HAVE_SNPRINTF HAVE_ASPRINTF HAVE_POSIX_PRINTF GLIBC21 ALLOCA host_os host_vendor host_cpu host build_os build_vendor build_cpu build MSGMERGE XGETTEXT GMSGFMT MSGFMT USE_NLS MKINSTALLDIRS RANLIB LEXLIB LEX_OUTPUT_ROOT LEX EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_dependency_tracking with_werror enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_included_gettext with_libintl_prefix with_readline with_guile enable_gui ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GLIB_CFLAGS GLIB_LIBS GUILE_CFLAGS GUILE_LIBS GTK_CFLAGS GTK_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$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 runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $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 GNU MDK 1.2.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/mdk] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU MDK 1.2.9:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --disable-gui do not build the GTK+ GUI for mixvm (gmixvm) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-werror treat compilation warnings as errors --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-included-gettext use the GNU gettext library included here --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --without-readline build mixvm without readline support --without-guile build MDK without Guile support 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 PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config GLIB_LIBS linker flags for GLIB, overriding pkg-config GUILE_CFLAGS C compiler flags for GUILE, overriding pkg-config GUILE_LIBS linker flags for GUILE, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU MDK home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$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 GNU MDK configure 1.2.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 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 || 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_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_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_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { 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 eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=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 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_type # 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 # 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_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;} ( $as_echo "## ------------------------------ ## ## Report this to bug-mdk@gnu.org ## ## ------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&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_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GNU MDK $as_me 1.2.9, which was generated by GNU Autoconf 2.69. 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 as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # 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 am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; 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_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $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 STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; 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_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $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_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" 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 STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $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 AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='mdk' VERSION='1.2.9' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $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 as_fn_executable_p "$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 as_fn_executable_p "$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 as_fn_executable_p "$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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $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 as_fn_executable_p "$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 as_fn_executable_p "$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 struct stat; /* 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 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 whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror in -lcposix" >&5 $as_echo_n "checking for strerror in -lcposix... " >&6; } if ${ac_cv_lib_cposix_strerror+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcposix $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 strerror (); int main () { return strerror (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cposix_strerror=yes else ac_cv_lib_cposix_strerror=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_cposix_strerror" >&5 $as_echo "$ac_cv_lib_cposix_strerror" >&6; } if test "x$ac_cv_lib_cposix_strerror" = xyes; then : LIBS="$LIBS -lcposix" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $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 as_fn_executable_p "$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 as_fn_executable_p "$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 as_fn_executable_p "$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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $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 as_fn_executable_p "$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 as_fn_executable_p "$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 { $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 struct stat; /* 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 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 whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $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 as_fn_executable_p "$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 as_fn_executable_p "$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 as_fn_executable_p "$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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $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 as_fn_executable_p "$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 as_fn_executable_p "$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 { $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 struct stat; /* 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 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 whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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 depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc 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" as_fn_executable_p "$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" as_fn_executable_p "$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 for ac_prog in flex lex 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_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$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 LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" 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 "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi if test "$LEX" = :; then LEX=${am_missing_run}flex fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; 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_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $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 RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; 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_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $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_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" 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 RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi AM_CFLAGS="$AM_CFLAGS -Wall -fno-strict-aliasing" # Check whether --with-werror was given. if test "${with_werror+set}" = set; then : withval=$with_werror; case "${withval}" in yes) werr=true ;; no) werr=false ;; *) as_fn_error $? "bad value ${withval} for --with-werror" "$LINENO" 5 ;; esac else werr=false fi if test x$werr = xtrue; then AM_CFLAGS="$AM_CFLAGS -Werror" fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then case "$ac_aux_dir" in /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; esac fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; 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_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; 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_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $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 test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; 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_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; 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_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GMSGFMT" != ":"; then if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 $as_echo "found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; } GMSGFMT=":" fi fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi rm -f messages.po fi ac_config_commands="$ac_config_commands default-1" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signed" >&5 $as_echo_n "checking for signed... " >&6; } if ${bh_cv_c_signed+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { signed char x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : bh_cv_c_signed=yes else bh_cv_c_signed=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bh_cv_c_signed" >&5 $as_echo "$bh_cv_c_signed" >&6; } if test $bh_cv_c_signed = no; then $as_echo "#define signed /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac # 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 ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 $as_echo_n "checking for long long... " >&6; } if ${ac_cv_type_long_long+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ long long ll = 1LL; int i = 63; int main () { long long llmax = (long long) -1; return ll << i | ll >> i | llmax / ll | llmax % ll; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_long_long=yes else ac_cv_type_long_long=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long" >&5 $as_echo "$ac_cv_type_long_long" >&6; } if test $ac_cv_type_long_long = yes; then $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double" >&5 $as_echo_n "checking for long double... " >&6; } if ${gt_cv_c_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if test "$GCC" = yes; then gt_cv_c_long_double=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* The Stardent Vistra knows sizeof(long double), but does not support it. */ long double foo = 0.0; /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ int array [2*(sizeof(long double) >= sizeof(double)) - 1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_long_double=yes else gt_cv_c_long_double=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_long_double" >&5 $as_echo "$gt_cv_c_long_double" >&6; } if test $gt_cv_c_long_double = yes; then $as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 $as_echo_n "checking for wchar_t... " >&6; } if ${gt_cv_c_wchar_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wchar_t=yes else gt_cv_c_wchar_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 $as_echo "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then $as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 $as_echo_n "checking for wint_t... " >&6; } if ${gt_cv_c_wint_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wint_t foo = (wchar_t)'\0'; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_wint_t=yes else gt_cv_c_wint_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 $as_echo "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then $as_echo "#define HAVE_WINT_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${jm_ac_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : jm_ac_cv_header_inttypes_h=yes else jm_ac_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_inttypes_h" >&5 $as_echo "$jm_ac_cv_header_inttypes_h" >&6; } if test $jm_ac_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 $as_echo_n "checking for stdint.h... " >&6; } if ${jm_ac_cv_header_stdint_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { uintmax_t i = (uintmax_t) -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : jm_ac_cv_header_stdint_h=yes else jm_ac_cv_header_stdint_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_stdint_h" >&5 $as_echo "$jm_ac_cv_header_stdint_h" >&6; } if test $jm_ac_cv_header_stdint_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H_WITH_UINTMAX 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 $as_echo_n "checking for intmax_t... " >&6; } if ${gt_cv_c_intmax_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if HAVE_STDINT_H_WITH_UINTMAX #include #endif #if HAVE_INTTYPES_H_WITH_UINTMAX #include #endif int main () { intmax_t x = -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_c_intmax_t=yes else gt_cv_c_intmax_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 $as_echo "$gt_cv_c_intmax_t" >&6; } if test $gt_cv_c_intmax_t = yes; then $as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether printf() supports POSIX/XSI format strings" >&5 $as_echo_n "checking whether printf() supports POSIX/XSI format strings... " >&6; } if ${gt_cv_func_printf_posix+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ notposix #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "notposix" >/dev/null 2>&1; then : gt_cv_func_printf_posix="guessing no" else gt_cv_func_printf_posix="guessing yes" fi rm -f conftest* else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include /* The string "%2$d %1$d", with dollar characters protected from the shell's dollar expansion (possibly an autoconf bug). */ static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' }; static char buf[100]; int main () { sprintf (buf, format, 33, 55); return (strcmp (buf, "55 33") != 0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_func_printf_posix=yes else gt_cv_func_printf_posix=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_printf_posix" >&5 $as_echo "$gt_cv_func_printf_posix" >&6; } case $gt_cv_func_printf_posix in *yes) $as_echo "#define HAVE_POSIX_PRINTF 1" >>confdefs.h ;; esac # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in $ac_header_list 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_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2.1 or newer" >&5 $as_echo_n "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } if ${ac_cv_gnu_library_2_1+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Lucky GNU user" >/dev/null 2>&1; then : ac_cv_gnu_library_2_1=yes else ac_cv_gnu_library_2_1=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 $as_echo "$ac_cv_gnu_library_2_1" >&6; } GLIBC21="$ac_cv_gnu_library_2_1" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether integer division by zero raises SIGFPE" >&5 $as_echo_n "checking whether integer division by zero raises SIGFPE... " >&6; } if ${gt_cv_int_divbyzero_sigfpe+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : # Guess based on the CPU. case "$host_cpu" in alpha* | i3456786 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : gt_cv_int_divbyzero_sigfpe=yes else gt_cv_int_divbyzero_sigfpe=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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_int_divbyzero_sigfpe" >&5 $as_echo "$gt_cv_int_divbyzero_sigfpe" >&6; } case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac cat >>confdefs.h <<_ACEOF #define INTDIV0_RAISES_SIGFPE $value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5 $as_echo_n "checking for unsigned long long... " >&6; } if ${ac_cv_type_unsigned_long_long+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned long long ull = 1ULL; int i = 63; int main () { unsigned long long ullmax = (unsigned long long) -1; return ull << i | ull >> i | ullmax / ull | ullmax % ull; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_unsigned_long_long=yes else ac_cv_type_unsigned_long_long=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long" >&5 $as_echo "$ac_cv_type_unsigned_long_long" >&6; } if test $ac_cv_type_unsigned_long_long = yes; then $as_echo "#define HAVE_UNSIGNED_LONG_LONG 1" >>confdefs.h fi if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then test $ac_cv_type_unsigned_long_long = yes \ && ac_type='unsigned long long' \ || ac_type='unsigned long' cat >>confdefs.h <<_ACEOF #define uintmax_t $ac_type _ACEOF else $as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 $as_echo_n "checking for inttypes.h... " >&6; } if ${gt_cv_header_inttypes_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_header_inttypes_h=yes else gt_cv_header_inttypes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_header_inttypes_h" >&5 $as_echo "$gt_cv_header_inttypes_h" >&6; } if test $gt_cv_header_inttypes_h = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_INTTYPES_H 1 _ACEOF fi if test $gt_cv_header_inttypes_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the inttypes.h PRIxNN macros are broken" >&5 $as_echo_n "checking whether the inttypes.h PRIxNN macros are broken... " >&6; } if ${gt_cv_inttypes_pri_broken+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef PRId32 char *p = PRId32; #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gt_cv_inttypes_pri_broken=no else gt_cv_inttypes_pri_broken=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_inttypes_pri_broken" >&5 $as_echo "$gt_cv_inttypes_pri_broken" >&6; } fi if test "$gt_cv_inttypes_pri_broken" = yes; then cat >>confdefs.h <<_ACEOF #define PRI_MACROS_BROKEN 1 _ACEOF fi for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 $as_echo_n "checking for SIZE_MAX... " >&6; } result= cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if HAVE_STDINT_H #include #endif #ifdef SIZE_MAX Found it #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Found it" >/dev/null 2>&1; then : result=yes fi rm -f conftest* if test -z "$result"; then if ac_fn_c_compute_int "$LINENO" "~(size_t)0 / 10" "res_hi" "#include "; then : else result=? fi if ac_fn_c_compute_int "$LINENO" "~(size_t)0 % 10" "res_lo" "#include "; then : else result=? fi if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include "; then : else result=? fi if test "$fits_in_uint" = 1; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern size_t foo; extern unsigned long foo; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : fits_in_uint=0 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test -z "$result"; then if test "$fits_in_uint" = 1; then result="$res_hi$res_lo"U else result="$res_hi$res_lo"UL fi else result='~(size_t)0' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 $as_echo "$result" >&6; } if test "$result" != yes; then cat >>confdefs.h <<_ACEOF #define SIZE_MAX $result _ACEOF fi for ac_header in stdint.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDINT_H 1 _ACEOF fi done if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi LIBICONV= LTLIBICONV= INCICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : else $as_echo "#define ptrdiff_t long" >>confdefs.h fi for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.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 for ac_func in asprintf fwprintf getcwd getegid geteuid getgid getuid \ mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \ strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \ __fsetlocking do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _snprintf is declared" >&5 $as_echo_n "checking whether _snprintf is declared... " >&6; } if ${ac_cv_have_decl__snprintf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _snprintf char *p = (char *) _snprintf; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl__snprintf=yes else ac_cv_have_decl__snprintf=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snprintf" >&5 $as_echo "$ac_cv_have_decl__snprintf" >&6; } if test $ac_cv_have_decl__snprintf = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__SNPRINTF $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _snwprintf is declared" >&5 $as_echo_n "checking whether _snwprintf is declared... " >&6; } if ${ac_cv_have_decl__snwprintf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _snwprintf char *p = (char *) _snwprintf; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl__snwprintf=yes else ac_cv_have_decl__snwprintf=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snwprintf" >&5 $as_echo "$ac_cv_have_decl__snwprintf" >&6; } if test $ac_cv_have_decl__snwprintf = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL__SNWPRINTF $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether feof_unlocked is declared" >&5 $as_echo_n "checking whether feof_unlocked is declared... " >&6; } if ${ac_cv_have_decl_feof_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef feof_unlocked char *p = (char *) feof_unlocked; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl_feof_unlocked=yes else ac_cv_have_decl_feof_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_feof_unlocked" >&5 $as_echo "$ac_cv_have_decl_feof_unlocked" >&6; } if test $ac_cv_have_decl_feof_unlocked = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FEOF_UNLOCKED $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fgets_unlocked is declared" >&5 $as_echo_n "checking whether fgets_unlocked is declared... " >&6; } if ${ac_cv_have_decl_fgets_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef fgets_unlocked char *p = (char *) fgets_unlocked; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl_fgets_unlocked=yes else ac_cv_have_decl_fgets_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_fgets_unlocked" >&5 $as_echo "$ac_cv_have_decl_fgets_unlocked" >&6; } if test $ac_cv_have_decl_fgets_unlocked = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FGETS_UNLOCKED $gt_value _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getc_unlocked is declared" >&5 $as_echo_n "checking whether getc_unlocked is declared... " >&6; } if ${ac_cv_have_decl_getc_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef getc_unlocked char *p = (char *) getc_unlocked; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_decl_getc_unlocked=yes else ac_cv_have_decl_getc_unlocked=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_getc_unlocked" >&5 $as_echo "$ac_cv_have_decl_getc_unlocked" >&6; } if test $ac_cv_have_decl_getc_unlocked = yes; then gt_value=1 else gt_value=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETC_UNLOCKED $gt_value _ACEOF case $gt_cv_func_printf_posix in *yes) HAVE_POSIX_PRINTF=1 ;; *) HAVE_POSIX_PRINTF=0 ;; esac if test "$ac_cv_func_asprintf" = yes; then HAVE_ASPRINTF=1 else HAVE_ASPRINTF=0 fi if test "$ac_cv_func_snprintf" = yes; then HAVE_SNPRINTF=1 else HAVE_SNPRINTF=0 fi if test "$ac_cv_func_wprintf" = yes; then HAVE_WPRINTF=1 else HAVE_WPRINTF=0 fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${am_cv_proto_iconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_cv_proto_iconv_arg1="" else am_cv_proto_iconv_arg1="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- }$am_cv_proto_iconv" >&5 $as_echo "${ac_t:- }$am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 $as_echo_n "checking for nl_langinfo and CODESET... " >&6; } if ${am_cv_langinfo_codeset+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char* cs = nl_langinfo(CODESET); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_langinfo_codeset=yes else am_cv_langinfo_codeset=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 $as_echo "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi for ac_prog in bison 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_INTLBISON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$INTLBISON"; then ac_cv_prog_INTLBISON="$INTLBISON" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_INTLBISON="$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 INTLBISON=$ac_cv_prog_INTLBISON if test -n "$INTLBISON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLBISON" >&5 $as_echo "$INTLBISON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$INTLBISON" && break done if test -z "$INTLBISON"; then ac_verc_fail=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking version of bison" >&5 $as_echo_n "checking version of bison... " >&6; } ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5 $as_echo "$ac_prog_version" >&6; } fi if test $ac_verc_fail = yes; then INTLBISON=: fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no LIBINTL= LTLIBINTL= POSUB= if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether included gettext is requested" >&5 $as_echo_n "checking whether included gettext is requested... " >&6; } # Check whether --with-included-gettext was given. if test "${with_included_gettext+set}" = set; then : withval=$with_included_gettext; nls_cv_force_use_gnu_gettext=$withval else nls_cv_force_use_gnu_gettext=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nls_cv_force_use_gnu_gettext" >&5 $as_echo "$nls_cv_force_use_gnu_gettext" >&6; } nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if ${gt_cv_func_gnugettext1_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libc=yes else gt_cv_func_gnugettext1_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libc" >&5 $as_echo "$gt_cv_func_gnugettext1_libc" >&6; } if test "$gt_cv_func_gnugettext1_libc" != "yes"; then use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/lib" fi fi fi LIBINTL= LTLIBINTL= INCINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if ${gt_cv_func_gnugettext1_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (); int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libintl=yes else gt_cv_func_gnugettext1_libintl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (); int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext1_libintl=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 $as_echo "$gt_cv_func_gnugettext1_libintl" >&6; } fi if test "$gt_cv_func_gnugettext1_libc" = "yes" \ || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test "$gt_use_preinstalled_gnugettext" != "yes"; then nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV" LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then CATOBJEXT=.gmo fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi nls_cv_header_intl= nls_cv_header_libgt= DATADIRNAME=share INSTOBJEXT=.mo GENCAT=gencat if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi INTL_LIBTOOL_SUFFIX_PREFIX= INTLLIBS="$LIBINTL" case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.37 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "0.37"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.37" >&5 $as_echo_n "checking for intltool >= 0.37... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool 0.37 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; 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_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; 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_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; 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_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " $@;' INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< $@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.$$RANDOM && mkdir $$_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u $$_it_tmp_dir $< $@ && rmdir $$_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; 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_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; 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_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; 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_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; 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_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $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 test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; 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_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "xno-xml" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi GETTEXT_PACKAGE=mdk cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF test "x$prefix" = xNONE && prefix=$ac_default_prefix cat >>confdefs.h <<_ACEOF #define LOCALEDIR "${prefix}/share/locale" _ACEOF # Check whether --with-readline was given. if test "${with_readline+set}" = set; then : withval=$with_readline; case "${withval}" in yes) readl=true ;; no) readl=false ;; *) as_fn_error $? "bad value ${withval} for --with-readline" "$LINENO" 5 ;; esac else readl=true fi if test x$readl = xtrue; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 $as_echo_n "checking for initscr in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_initscr+:} 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 initscr (); int main () { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_initscr=yes else ac_cv_lib_ncurses_initscr=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_initscr" >&5 $as_echo "$ac_cv_lib_ncurses_initscr" >&6; } if test "x$ac_cv_lib_ncurses_initscr" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNCURSES 1 _ACEOF LIBS="-lncurses $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find ncurses lib" >&5 $as_echo "$as_me: WARNING: Cannot find ncurses lib" >&2;}; readl=false fi fi if test x$readl = xtrue; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 $as_echo_n "checking for readline in -lreadline... " >&6; } if ${ac_cv_lib_readline_readline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $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 readline (); int main () { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else ac_cv_lib_readline_readline=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_readline_readline" >&5 $as_echo "$ac_cv_lib_readline_readline" >&6; } if test "x$ac_cv_lib_readline_readline" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBREADLINE 1 _ACEOF LIBS="-lreadline $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GNU readline lib" >&5 $as_echo "$as_me: WARNING: Cannot find GNU readline lib" >&2;}; readl=false fi fi if test x$readl = xtrue; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for add_history in -lhistory" >&5 $as_echo_n "checking for add_history in -lhistory... " >&6; } if ${ac_cv_lib_history_add_history+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhistory $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 add_history (); int main () { return add_history (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_history_add_history=yes else ac_cv_lib_history_add_history=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_history_add_history" >&5 $as_echo "$ac_cv_lib_history_add_history" >&6; } if test "x$ac_cv_lib_history_add_history" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBHISTORY 1 _ACEOF LIBS="-lhistory $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GNU history lib" >&5 $as_echo "$as_me: WARNING: Cannot find GNU history lib" >&2;}; readl=false fi for ac_func in rl_completion_matches do : ac_fn_c_check_func "$LINENO" "rl_completion_matches" "ac_cv_func_rl_completion_matches" if test "x$ac_cv_func_rl_completion_matches" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RL_COMPLETION_MATCHES 1 _ACEOF fi done fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; 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_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; 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_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $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 ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" 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 PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5 $as_echo_n "checking for GLIB... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLIB_LIBS"; then pkg_cv_GLIB_LIBS="$GLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.0" 2>&1` else GLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLIB_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.0) were not met: $GLIB_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GLIB_CFLAGS and GLIB_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS GLIB_LIBS=$pkg_cv_GLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # Check whether --with-guile was given. if test "${with_guile+set}" = set; then : withval=$with_guile; case "${withval}" in yes) wguile=true ;; no) wguile=false ;; *) as_fn_error $? "bad value ${withval} for --with-guile" "$LINENO" 5 ;; esac else wguile=true fi if test x$wguile = xtrue; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5 $as_echo_n "checking for GUILE... " >&6; } if test -n "$GUILE_CFLAGS"; then pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.0 >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "guile-2.0 >= 2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-2.0 >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GUILE_LIBS"; then pkg_cv_GUILE_LIBS="$GUILE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.0 >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "guile-2.0 >= 2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-2.0 >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GUILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "guile-2.0 >= 2.0" 2>&1` else GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-2.0 >= 2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GUILE_PKG_ERRORS" >&5 wguile=false elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } wguile=false else GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS GUILE_LIBS=$pkg_cv_GUILE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } wguile=true fi fi if test x$wguile = xtrue; then LIBS="$LIBS $GUILE_LIBS" AM_CFLAGS="$AM_CFLAGS $GUILE_CFLAGS" fi if test x$wguile = xtrue; then MAKE_GUILE_TRUE= MAKE_GUILE_FALSE='#' else MAKE_GUILE_TRUE='#' MAKE_GUILE_FALSE= fi LIBS="$LIBS $GLIB_LIBS" AM_CFLAGS="$AM_CFLAGS $GLIB_CFLAGS -DG_DISABLE_DEPRECATED" # Check whether --enable-gui was given. if test "${enable_gui+set}" = set; then : enableval=$enable_gui; case "${enableval}" in yes) gui=true ;; no) gui=false ;; *) as_fn_error $? "bad value ${enableval} for --enable-gui" "$LINENO" 5 ;; esac else gui=true fi if test x$gui = xtrue; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&5 $as_echo "$as_me: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&2;} gui=false elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&5 $as_echo "$as_me: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&2;} gui=false else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } LIBS="$LIBS $GTK_LIBS" AM_CFLAGS="$AM_CFLAGS $GTK_CFLAGS" fi fi if test x$gui = xtrue; then AM_CFLAGS="$AM_CFLAGS -DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED" fi case "${host_os}" in darwin*) darwin_system=true;; *) darwin_system=false; esac if test x$gui = xtrue; then MAKE_GUI_TRUE= MAKE_GUI_FALSE='#' else MAKE_GUI_TRUE='#' MAKE_GUI_FALSE= fi if test x$darwin_system = xtrue; then DARWIN_SYSTEM_TRUE= DARWIN_SYSTEM_FALSE='#' else DARWIN_SYSTEM_TRUE='#' DARWIN_SYSTEM_FALSE= fi ac_fn_c_check_func "$LINENO" "getopt_long" "ac_cv_func_getopt_long" if test "x$ac_cv_func_getopt_long" = xyes; then : $as_echo "#define HAVE_GETOPT_LONG 1" >>confdefs.h else case " $LIBOBJS " in *" getopt_long.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext" ;; esac fi ac_config_files="$ac_config_files Makefile doc/Makefile doc/img/Makefile mixlib/Makefile mixlib/testsuite/Makefile mixguile/Makefile mixutils/Makefile mixgtk/Makefile lib/Makefile misc/Makefile samples/Makefile samples/tests/Makefile po/Makefile.in intl/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $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= 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${MAKE_GUILE_TRUE}" && test -z "${MAKE_GUILE_FALSE}"; then as_fn_error $? "conditional \"MAKE_GUILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKE_GUI_TRUE}" && test -z "${MAKE_GUI_FALSE}"; then as_fn_error $? "conditional \"MAKE_GUI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DARWIN_SYSTEM_TRUE}" && test -z "${DARWIN_SYSTEM_FALSE}"; then as_fn_error $? "conditional \"DARWIN_SYSTEM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${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 -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$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 # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU MDK $as_me 1.2.9, which was generated by GNU Autoconf 2.69. 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" config_commands="$ac_config_commands" _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 Configuration commands: $config_commands Report bugs to . GNU MDK home page: . General help using GNU software: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GNU MDK config.status 1.2.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $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 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/img/Makefile") CONFIG_FILES="$CONFIG_FILES doc/img/Makefile" ;; "mixlib/Makefile") CONFIG_FILES="$CONFIG_FILES mixlib/Makefile" ;; "mixlib/testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES mixlib/testsuite/Makefile" ;; "mixguile/Makefile") CONFIG_FILES="$CONFIG_FILES mixguile/Makefile" ;; "mixutils/Makefile") CONFIG_FILES="$CONFIG_FILES mixutils/Makefile" ;; "mixgtk/Makefile") CONFIG_FILES="$CONFIG_FILES mixgtk/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "misc/Makefile") CONFIG_FILES="$CONFIG_FILES misc/Makefile" ;; "samples/Makefile") CONFIG_FILES="$CONFIG_FILES samples/Makefile" ;; "samples/tests/Makefile") CONFIG_FILES="$CONFIG_FILES samples/tests/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "intl/Makefile") CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) 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 test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands 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 :C $CONFIG_COMMANDS" 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 # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $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 s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;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 # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; 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 if test x$readl = xtrue; then rlinfo=", with readline support" fi if test x$wguile = xtrue; then guileinfo=", with guile support" fi echo echo "*** $PACKAGE_NAME $VERSION has been successfully configured. ***" echo echo "Type 'make' to build the following utilities:" echo " - mixasm (MIX assembler)" echo " - mixvm (MIX virtual machine${rlinfo}${guileinfo})" if test x$gui = xtrue; then echo " - gmixvm (mixvm GTK+ GUI${guileinfo})" fi if test x$wguile = xtrue; then echo " - mixguile (the mixvm guile shell)" fi echo mdk-1.2.9/lib/0000755000175000017500000000000012636571405010056 500000000000000mdk-1.2.9/lib/getopt_long.c0000644000175000017500000007434210770465100012464 00000000000000/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. NOTE: The canonical source of this file is maintained with the GNU C Library. Bugs can be reported to bug-glibc@gnu.org. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ # ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) # else # define _(msgid) (msgid) # endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = NULL; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else # if HAVE_STRING_H # include # else # if HAVE_STRINGS_H # include # endif # endif /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } # ifdef text_set_element text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ mdk-1.2.9/lib/darwin.c0000644000175000017500000000175512262406153011426 00000000000000/* -*-c-*- -------------- darwin.c: * Dummy functions for darwin compatibility * ------------------------------------------------------------------ * Copyright (C) 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ int useless_function_to_ensure_darwin_compiles (void) { return 0; } mdk-1.2.9/lib/getopt.h0000644000175000017500000001052610770465100011444 00000000000000/* Declarations for getopt. Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if defined (__STDC__) && __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ mdk-1.2.9/lib/Makefile.am0000644000175000017500000000131512262424754012031 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2001, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EXTRA_DIST = getopt_long.c getopt.h noinst_LIBRARIES = libreplace.a if DARWIN_SYSTEM libreplace_a_SOURCES = darwin.c else libreplace_a_SOURCES = endif libreplace_a_LIBADD = @LIBOBJS@ mdk-1.2.9/lib/Makefile.in0000644000175000017500000004547512636565536012072 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2001, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libreplace_a_AR = $(AR) $(ARFLAGS) libreplace_a_DEPENDENCIES = @LIBOBJS@ am__libreplace_a_SOURCES_DIST = darwin.c @DARWIN_SYSTEM_TRUE@am_libreplace_a_OBJECTS = darwin.$(OBJEXT) libreplace_a_OBJECTS = $(am_libreplace_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libreplace_a_SOURCES) DIST_SOURCES = $(am__libreplace_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs getopt_long.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = getopt_long.c getopt.h noinst_LIBRARIES = libreplace.a @DARWIN_SYSTEM_FALSE@libreplace_a_SOURCES = @DARWIN_SYSTEM_TRUE@libreplace_a_SOURCES = darwin.c libreplace_a_LIBADD = @LIBOBJS@ all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu lib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libreplace.a: $(libreplace_a_OBJECTS) $(libreplace_a_DEPENDENCIES) $(EXTRA_libreplace_a_DEPENDENCIES) $(AM_V_at)-rm -f libreplace.a $(AM_V_AR)$(libreplace_a_AR) libreplace.a $(libreplace_a_OBJECTS) $(libreplace_a_LIBADD) $(AM_V_at)$(RANLIB) libreplace.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt_long.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/darwin.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf $(DEPDIR) ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/aclocal.m40000644000175000017500000020360312636565534011102 00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Copyright (C) 1998-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_LEX # ----------- # Autoconf leaves LEX=: if lex or flex can't be found. Change that to a # "missing" invocation, for better error output. AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # -*- Autoconf -*- # Obsolete and "removed" macros, that must however still report explicit # error messages when used, to smooth transition. # # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/codeset.m4]) m4_include([m4/gettext.m4]) m4_include([m4/glibc21.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intdiv0.m4]) m4_include([m4/intmax.m4]) m4_include([m4/inttypes-pri.m4]) m4_include([m4/inttypes.m4]) m4_include([m4/inttypes_h.m4]) m4_include([m4/isc-posix.m4]) m4_include([m4/lcmessage.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/longdouble.m4]) m4_include([m4/longlong.m4]) m4_include([m4/nls.m4]) m4_include([m4/po.m4]) m4_include([m4/printf-posix.m4]) m4_include([m4/progtest.m4]) m4_include([m4/signed.m4]) m4_include([m4/size_max.m4]) m4_include([m4/stdint_h.m4]) m4_include([m4/uintmax_t.m4]) m4_include([m4/ulonglong.m4]) m4_include([m4/wchar_t.m4]) m4_include([m4/wint_t.m4]) m4_include([m4/xsize.m4]) mdk-1.2.9/config.h.in0000644000175000017500000002066712110326464011254 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Package Name for Gettext */ #undef GETTEXT_PACKAGE /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ARGZ_H /* Define to 1 if you have the `asprintf' function. */ #undef HAVE_ASPRINTF /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FEOF_UNLOCKED /* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_FGETS_UNLOCKED /* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you don't. */ #undef HAVE_DECL_GETC_UNLOCKED /* Define to 1 if you have the declaration of `_snprintf', and to 0 if you don't. */ #undef HAVE_DECL__SNPRINTF /* Define to 1 if you have the declaration of `_snwprintf', and to 0 if you don't. */ #undef HAVE_DECL__SNWPRINTF /* Define to 1 if you have the `fwprintf' function. */ #undef HAVE_FWPRINTF /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `getegid' function. */ #undef HAVE_GETEGID /* Define to 1 if you have the `geteuid' function. */ #undef HAVE_GETEUID /* Define to 1 if you have the `getgid' function. */ #undef HAVE_GETGID /* Define to 1 if you have the `getopt_long' function. */ #undef HAVE_GETOPT_LONG /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define if you have the 'intmax_t' type in or . */ #undef HAVE_INTMAX_T /* Define if exists and doesn't clash with . */ #undef HAVE_INTTYPES_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_INTTYPES_H_WITH_UINTMAX /* Define if you have and nl_langinfo(CODESET). */ #undef HAVE_LANGINFO_CODESET /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the `history' library (-lhistory). */ #undef HAVE_LIBHISTORY /* Define to 1 if you have the `ncurses' library (-lncurses). */ #undef HAVE_LIBNCURSES /* Define to 1 if you have the `readline' library (-lreadline). */ #undef HAVE_LIBREADLINE /* 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 if you have the 'long double' type. */ #undef HAVE_LONG_DOUBLE /* Define if you have the 'long long' type. */ #undef HAVE_LONG_LONG /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mempcpy' function. */ #undef HAVE_MEMPCPY /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file. */ #undef HAVE_NL_TYPES_H /* Define if your printf() function supports format strings with positions. */ #undef HAVE_POSIX_PRINTF /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if you have the `rl_completion_matches' function. */ #undef HAVE_RL_COMPLETION_MATCHES /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define if exists, doesn't clash with , and declares uintmax_t. */ #undef HAVE_STDINT_H_WITH_UINTMAX /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `stpcpy' function. */ #undef HAVE_STPCPY /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* 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 `strtoul' function. */ #undef HAVE_STRTOUL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_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 `tsearch' function. */ #undef HAVE_TSEARCH /* Define if you have the 'uintmax_t' type in or . */ #undef HAVE_UINTMAX_T /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the 'unsigned long long' type. */ #undef HAVE_UNSIGNED_LONG_LONG /* Define if you have the 'wchar_t' type. */ #undef HAVE_WCHAR_T /* Define to 1 if you have the `wcslen' function. */ #undef HAVE_WCSLEN /* Define if you have the 'wint_t' type. */ #undef HAVE_WINT_T /* Define to 1 if you have the `__argz_count' function. */ #undef HAVE___ARGZ_COUNT /* Define to 1 if you have the `__argz_next' function. */ #undef HAVE___ARGZ_NEXT /* Define to 1 if you have the `__argz_stringify' function. */ #undef HAVE___ARGZ_STRINGIFY /* Define to 1 if you have the `__fsetlocking' function. */ #undef HAVE___FSETLOCKING /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Define if integer division by zero raises signal SIGFPE. */ #undef INTDIV0_RAISES_SIGFPE /* locale directory */ #undef LOCALEDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define if exists and defines unusable PRI* macros. */ #undef PRI_MACROS_BROKEN /* Define as the maximum value of type 'size_t', if the system doesn't define it. */ #undef SIZE_MAX /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `long int' if does not define. */ #undef off_t /* Define as the type of the result of subtracting two pointers, if the system doesn't define it. */ #undef ptrdiff_t /* Define to empty if the C compiler doesn't support this keyword. */ #undef signed /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to unsigned long or unsigned long long if and don't define. */ #undef uintmax_t mdk-1.2.9/missing0000755000175000017500000001533012563613157010631 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mdk-1.2.9/intltool-update.in0000644000175000017500000000000012636565532012676 00000000000000mdk-1.2.9/Makefile.am0000644000175000017500000000173212622454575011272 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2004, 2006, 2013, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EXTRA_DIST = config.rpath ABOUT-NLS intltool-extract.in intltool-merge.in \ autogen.sh intltool-update.in ChangeLog.1 ChangeLog.2 SUBDIRS = po intl doc lib mixlib mixguile mixutils mixgtk misc samples distclean-local: rm -f intltool-extract rm -f intltool-merge rm -f intltool-update dist-hook: $(SHELL) $(top_srcdir)/ChangeLog > $(top_distdir)/ChangeLog docdir = $(top_builddir)/doc ACLOCAL_AMFLAGS = -I m4 mdk-1.2.9/mixguile/0000755000175000017500000000000012636571405011133 500000000000000mdk-1.2.9/mixguile/mixguile_main.c0000644000175000017500000000444712112755472014054 00000000000000/* -*-c-*- -------------- mixguile_main.c : * Main function for mixguile, the MIX Guile shell * ------------------------------------------------------------------ * Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "mixguile.h" #ifdef HAVE_GETOPT_LONG # include #else # include #endif /* HAVE_GETOPT_LONG */ enum { VER_OPT = 'v', NOINIT_OPT = 'q', }; static const char *options_ = "vq"; static struct option long_options_[] = { {"version", no_argument, 0, VER_OPT}, {0, 0, 0, 0} }; int main (int argc, char *argv[]) { const gchar *CONFIG_FILE = "mixvm.config"; mix_config_t *config; mix_vm_cmd_dispatcher_t *dis; int c; gboolean initfile = TRUE; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* prevent getopt printing a message for unknown options (stored in optopt) */ opterr = 0; while (1) { c = getopt_long (argc, argv, options_, long_options_, (int*)0); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case VER_OPT: mix_print_license ("mixguile, Scheme MIX Virtual Machine"); return EXIT_SUCCESS; case NOINIT_OPT: initfile = FALSE; break; default: /* let guile try to understand the option */ break; } } mix_init_lib (); config = mix_config_new (NULL, CONFIG_FILE); dis = mix_vm_cmd_dispatcher_new_with_config (stdout, stderr, config); mixguile_init (argc, argv, initfile, mixguile_enter_repl, dis); return EXIT_SUCCESS; /* never reached */ } mdk-1.2.9/mixguile/mixguile.scm0000644000175000017500000000173312112755472013403 00000000000000;; -*-scheme-*- -------------- mixguile.scm : ; mixguile bootstrap file ; ------------------------------------------------------------------ ; Copyright (C) 2001, 2007 Free Software Foundation, Inc. ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ; ;; (load "mixguile-commands.scm") (load "mixguile-vm-stat.scm") mdk-1.2.9/mixguile/mixguile-vm-stat.scm0000644000175000017500000000452512112755472014776 00000000000000;; -*-scheme-*- -------------- mixguile-vm-stat.scm : ; mixvm status functions ; ------------------------------------------------------------------ ; Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc. ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ; ;; ;; possible status index (define mix-status-values (vector 'MIX_ERROR 'MIX_BREAK 'MIX_COND_BREAK 'MIX_HALTED 'MIX_RUNNING 'MIX_LOADED 'MIX_EMPTY)) ;; return status as a simbol (define mix-vm-status (lambda () (vector-ref mix-status-values (mixvm-status)))) ;; check for a given status (define mix-vm-status? (lambda (status) (eq? status (mix-vm-status)))) ;; predicates for each possible status (define mix-vm-error? (lambda () (mix-vm-status? 'MIX_ERROR))) (define mix-vm-break? (lambda () (mix-vm-status? 'MIX_BREAK))) (define mix-vm-cond-break? (lambda () (mix-vm-status? 'MIX_COND_BREAK))) (define mix-vm-halted? (lambda () (mix-vm-status? 'MIX_HALTED))) (define mix-vm-running? (lambda () (mix-vm-status? 'MIX_RUNNING))) (define mix-vm-loaded? (lambda () (mix-vm-status? 'MIX_LOADED))) (define mix-vm-empty? (lambda () (mix-vm-status? 'MIX_EMPTY))) ;; define hooks on break conditions (define mix-make-conditional-hook (lambda (test hook) (lambda (arglist) (if (test) (hook (mix-src-line-no) (mix-loc)))))) (define mix-add-run-next-hook (lambda (hook) (mix-add-post-hook 'run hook) (mix-add-post-hook 'next hook))) (define mix-add-break-hook (lambda (hook) (mix-add-run-next-hook (mix-make-conditional-hook mix-vm-break? hook)))) (define mix-add-cond-break-hook (lambda (hook) (mix-add-run-next-hook (mix-make-conditional-hook mix-vm-cond-break? hook)))) mdk-1.2.9/mixguile/mixguile-commands.scm0000644000175000017500000001263512112755472015205 00000000000000;; -*-scheme-*- -------------- mixguile-commands.scm : ; mixvm commands implementation using the mixvm-cmd primitive ; ------------------------------------------------------------------ ; Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc. ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ; ;; ;; auxiliar functions for argument conversion (define argsym->string (lambda (arg) (cond ((symbol? arg) (symbol->string arg)) ((string? arg) arg) (else (error "Wrong argument type" arg))))) (define argnsym->string (lambda (arg) (cond ((null? arg) "") ((pair? arg) (argsym->string (car arg))) (else (argsym->string arg))))) (define argnum->string (lambda (arg) (cond ((number? arg) (number->string arg)) ((string? arg) arg) (else (error "Wrong argument type" arg))))) (define argnnum->string (lambda (arg) (cond ((null? arg) "") ((pair? arg) (argnum->string (car arg))) (else (argnum->string arg))))) ;;; mixvm commands ; preg (define mix-preg (lambda (. reg) (mixvm-cmd "preg" (argnsym->string reg)))) ; sreg (define mix-sreg (lambda (reg val) (mixvm-cmd "sreg" (string-append (argsym->string reg) " " (argnum->string val))))) ; pmem (define mix-pmem (lambda (from . to) (cond ((null? to) (mixvm-cmd "pmem" (argnum->string from))) (else (mixvm-cmd "pmem" (string-append (argnum->string from) "-" (argnnum->string to))))))) ; smem (define mix-smem (lambda (cell val) (mixvm-cmd "smem" (string-append (argnum->string cell) " " (argnum->string val))))) ; pall (define mix-pall (lambda () (mixvm-cmd "pall" ""))) ; pc (define mix-pc (lambda () (mixvm-cmd "pc" ""))) ; pflags (define mix-pflags (lambda () (mixvm-cmd "pflags" ""))) ; sover (define mix-sover (lambda (val) (mixvm-cmd "sover" (if val "T" "F")))) ; psym (define mix-psym (lambda (. sym) (mixvm-cmd "psym" (argnsym->string sym)))) ; ssym (define mix-ssym (lambda (sym value) (mixvm-cmd "ssym" (string-append (argsym->string sym) " " (argnum->string value))))) ; run (define mix-run (lambda (. file) (mixvm-cmd "run" (argnsym->string file)))) ; next (define mix-next (lambda (. no) (mixvm-cmd "next" (argnnum->string no)))) ; load (define mix-load (lambda (file) (mixvm-cmd "load" (argsym->string file)))) ; pstat (define mix-pstat (lambda () (mixvm-cmd "pstat" ""))) ; compile (define mix-compile (lambda (. file) (mixvm-cmd "compile" (argnsym->string file)))) ; devdir (define mix-sddir (lambda (dir) (mixvm-cmd "sddir" dir))) (define mix-pddir (lambda () (mixvm-cmd "pddir" ""))) ; edit (define mix-edit (lambda (. file) (mixvm-cmd "edit" (argnsym->string file)))) ; help (define mix-help (lambda (. cmd) (mixvm-cmd "help" (argnsym->string cmd)))) ; pasm (define mix-pasm (lambda () (mixvm-cmd "pasm" ""))) ; sasm (define mix-sasm (lambda (path) (mixvm-cmd "sasm" (argsym->string path)))) ; pedit (define mix-pedit (lambda () (mixvm-cmd "pedit" ""))) ; sedit (define mix-sedit (lambda (path) (mixvm-cmd "sedit" (argsym->string path)))) ; sbp (define mix-sbp (lambda (line) (mixvm-cmd "sbp" (argnum->string line)))) ; sbp (define mix-pline (lambda (. no) (mixvm-cmd "pline" (argnnum->string no)))) ; cbp (define mix-cbp (lambda (line) (mixvm-cmd "cbp" (argnum->string line)))) ; sbpa (define mix-sbpa (lambda (addr) (mixvm-cmd "sbpa" (argnum->string addr)))) ; cbpa (define mix-cbpa (lambda (addr) (mixvm-cmd "cbpa" (argnum->string addr)))) ; sbpc (define mix-sbpc (lambda () (mixvm-cmd "sbpc" ""))) ; cbpc (define mix-cbpc (lambda () (mixvm-cmd "cbpc" ""))) ; sbpo (define mix-sbpo (lambda () (mixvm-cmd "sbpo" ""))) ; cbpo (define mix-cbpo (lambda () (mixvm-cmd "cbpo" ""))) ; sbpm (define mix-sbpm (lambda (cell) (mixvm-cmd "sbpm" (argnum->string cell)))) ; cbpm (define mix-cbpm (lambda (cell) (mixvm-cmd "cbpm" (argnum->string cell)))) ; sbpr (define mix-sbpr (lambda (reg) (mixvm-cmd "sbpr" (argsym->string reg)))) ; cbpr (define mix-cbpr (lambda (reg) (mixvm-cmd "cbpr" (argsym->string reg)))) ; pbt (define mix-pbt (lambda (. num) (mixvm-cmd "pbt" (argnnum->string num)))) ; timing (define mix-stime (lambda (on) (mixvm-cmd "stime" (if on "on" "off")))) (define mix-ptime (lambda () (mixvm-cmd "ptime" ""))) ; timing (define mix-strace (lambda (on) (mixvm-cmd "strace" (if on "on" "off")))) ; logging (define mix-slog (lambda (on) (mixvm-cmd "slog" (if on "on" "off")))) ; w2d (define mix-w2d (lambda (w) (mixvm-cmd "w2d" w))); ; weval (define mix-weval (lambda (exp) (mixvm-cmd "weval" (argsym->string exp)))) ; pprog (define mix-pprog (lambda () (mixvm-cmd "pprog" ""))) ; sprog (define mix-psrc (lambda () (mixvm-cmd "psrc" ""))) mdk-1.2.9/mixguile/xmixguile_cmd_dispatcher.h0000644000175000017500000000407612112755472016274 00000000000000/* -*-c-*- ---------------- xmixguile_cmd_dispatcher.h : * Internal declarations for mixguile_cmd_dispatcher_t * ------------------------------------------------------------------ * Copyright (C) 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIXGUILE_CMD_DISPATCHER_H #define XMIXGUILE_CMD_DISPATCHER_H #include #include #include #include "mixguile_cmd_dispatcher.h" /* the cmd dispatcher type */ struct mixguile_cmd_dispatcher_t { mix_vm_cmd_dispatcher_t *dispatcher; }; /* scm commands types */ /* prototype of a function implementing a new scm function */ typedef SCM (*scm_func_t) (); /* record for a new scm command */ typedef struct scm_command_t { gchar *name; /* name of the scheme command */ scm_func_t func; /* implementation of the command */ int argno; /* no. of arguments */ int opt_argno; /* no. of optional arguments */ int restp; /* if 1, receive a list of remaining args */ } scm_command_t; /* NULL-terminated list of available scm commands */ extern const scm_command_t DEFAULT_SCM_COMMANDS_[]; /* register a NULL-terminated list of scm commands */ extern void register_scm_commands_ (const scm_command_t *commands); /* register the mixvm cmd dispatcher to use with commands */ extern void register_cmd_dispatcher_ (mixguile_cmd_dispatcher_t *dis); #endif /* XMIXGUILE_CMD_DISPATCHER_H */ mdk-1.2.9/mixguile/mixguile.c0000644000175000017500000000651112112755472013042 00000000000000/* -*-c-*- -------------- mixguile.c : * Implementation of the functions declared in mixguile.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2006, 2007, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "mixguile_cmd_dispatcher.h" #include "mixguile.h" static mixguile_cmd_dispatcher_t *dispatcher_ = NULL; static mix_vm_cmd_dispatcher_t *vm_dispatcher_ = NULL; static main_func_t main_fun_; static gboolean init_file_; /* do local initialisation and enter the user provided main */ static void real_main_ (void *closure, int argc, char *argv[]) { if (vm_dispatcher_) { mixguile_set_cmd_dispatcher (vm_dispatcher_); mixguile_load_bootstrap (init_file_); } (*main_fun_)(NULL, argc, argv); } /* initialise the guile command dispatcher and enter the provided main function. */ void mixguile_init (int argc, char *argv[], gboolean initfile, main_func_t main_fun, mix_vm_cmd_dispatcher_t *dis) { main_fun_ = main_fun; vm_dispatcher_ = dis; init_file_ = initfile; scm_boot_guile (argc, argv, real_main_, 0); } /* load bootstrap file */ void mixguile_load_bootstrap (gboolean loadlocal) { const gchar *scmfile = SCM_FILE; gchar *lscmfile = g_strconcat (g_get_home_dir (), G_DIR_SEPARATOR_S, MIX_CONFIG_DIR, G_DIR_SEPARATOR_S, LOCAL_SCM_FILE, NULL); if (access (scmfile, R_OK) && access ((scmfile = LOCAL_SCM_FILE), R_OK)) { g_warning (_("mixguile bootstrap file %s not found\n"), SCM_FILE); scmfile = NULL; } else mixguile_interpret_file (scmfile); if (loadlocal && !access (lscmfile, R_OK)) { mixguile_interpret_file (lscmfile); } g_free (lscmfile); } /* enter the guile repl */ void mixguile_enter_repl (void *closure, int argc, char *argv[]) { scm_shell (argc, argv); } /* set the command dispatcher */ void mixguile_set_cmd_dispatcher (mix_vm_cmd_dispatcher_t *dis) { g_return_if_fail (dis != NULL); if (dispatcher_) mixguile_cmd_dispatcher_delete (dispatcher_); vm_dispatcher_ = dis; dispatcher_ = mixguile_cmd_dispatcher_new (dis); g_assert (dispatcher_); } /* access the mixguile comand dispatcher */ mix_vm_cmd_dispatcher_t * mixguile_get_cmd_dispatcher (void) { return mixguile_cmd_dispatcher_get_vm_dispatcher (dispatcher_); } /* execute a string or file using the guile interpreter */ void mixguile_interpret_file (const gchar *path) { mixguile_cmd_dispatcher_interpret_file (dispatcher_, path); } void mixguile_interpret_command (const gchar *command) { mixguile_cmd_dispatcher_interpret_command (dispatcher_, command); } mdk-1.2.9/mixguile/Makefile.am0000644000175000017500000000257712262422653013115 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2001, 2010, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. SCM_FILES = mixguile.scm mixguile-commands.scm mixguile-vm-stat.scm EXTRA_DIST = $(SCM_FILES) if MAKE_GUILE noinst_LIBRARIES = libmixguile.a SCM_PATHS = -DSCM_FILE=\""$(pkgdatadir)/mixguile.scm"\"\ -DLOCAL_SCM_FILE=\"mixguile.scm\" pkgdata_DATA = $(SCM_FILES) AM_CFLAGS += -I$(includedir) -I$(top_srcdir) $(SCM_PATHS) libmixguile_a_AM_CFLAGS = -I$(includedir) -I$(top_srcdir) \ -DG_LOG_DOMAIN=\"libmixguile\" libmixguile_a_SOURCES = mixguile.h mixguile.c \ mixguile_cmd_dispatcher.h mixguile_cmd_dispatcher.c \ xmixguile_cmd_dispatcher.h xmixguile_cmd_dispatcher.c bin_PROGRAMS = mixguile mixguile_LDADD = $(top_builddir)/mixlib/libmix.a \ $(top_builddir)/lib/libreplace.a \ libmixguile.a $(INTLLIBS) mixguile_SOURCES = mixguile_main.c endif mdk-1.2.9/mixguile/xmixguile_cmd_dispatcher.c0000644000175000017500000003375212262423556016273 00000000000000/* -*-c-*- -------------- xmixguile_cmd_dispatcher.c : * Implementation of the functions declared in xmixguile_cmd_dispatcher.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ #include #include #include #include "xmixguile_cmd_dispatcher.h" /* cmd dispatcher for use within the scm commands */ static mixguile_cmd_dispatcher_t *dispatcher_; static mix_vm_cmd_dispatcher_t *vm_dispatcher_; static mix_vm_t *vm_; static SCM mutex_; /* register a NULL-terminated list of scm commands */ void register_scm_commands_ (const scm_command_t *commands) { int k = 0; g_return_if_fail (commands != NULL); while (commands[k].name) { scm_c_define_gsubr (commands[k].name, commands[k].argno, commands[k].opt_argno, commands[k].restp, commands[k].func); ++k; } } /* register the mixvm cmd dispatcher to use with commands */ void register_cmd_dispatcher_ (mixguile_cmd_dispatcher_t *dis) { g_return_if_fail (dis != NULL); dispatcher_ = dis; vm_dispatcher_ = mixguile_cmd_dispatcher_get_vm_dispatcher (dis); vm_ = (mix_vm_t *) mix_vm_cmd_dispatcher_get_vm (vm_dispatcher_); mutex_ = scm_make_mutex (); } /* commands */ static SCM mixvm_cmd_ (SCM cmd, SCM arg) { char *com = NULL, *argu = NULL; SCM_ASSERT (scm_is_string (cmd) || scm_is_symbol (cmd), cmd, SCM_ARG1, "mixvm-cmd"); SCM_ASSERT (scm_is_string (arg) || scm_is_symbol (arg), arg, SCM_ARG2, "mixvm-cmd"); scm_lock_mutex (mutex_); com = scm_to_locale_string (cmd); argu = scm_to_locale_string (arg); (void) mix_vm_cmd_dispatcher_dispatch (vm_dispatcher_, mix_vm_command_from_string (com), argu); g_free (com); g_free (argu); scm_unlock_mutex (mutex_); return SCM_UNSPECIFIED; } static SCM mixvm_status_ (void) { return scm_from_long (mix_vm_get_run_status (vm_)); } static SCM mix_last_result_ (void) { return scm_from_bool (mix_vm_cmd_dispatcher_get_last_result (vm_dispatcher_)); } static long word_to_long_ (mix_word_t word) { long result = mix_word_magnitude (word); return mix_word_is_negative (word) ? -result : result; } static long short_to_long_ (mix_short_t s) { long result = mix_short_magnitude (s); return mix_short_is_negative (s) ? -result : result; } static SCM mix_reg_ (SCM reg) { char *regis; long val = MIX_WORD_MAX + 1; SCM_ASSERT (scm_is_string (reg) || scm_is_symbol (reg), reg, SCM_ARG1, "mix-reg"); scm_lock_mutex (mutex_); if (SCM_SYMBOLP (reg)) reg = scm_symbol_to_string (reg); regis = scm_to_locale_string (reg); switch (regis[0]) { case 'A': val = word_to_long_ (mix_vm_get_rA (vm_)); break; case 'X': val = word_to_long_ (mix_vm_get_rX (vm_)); break; case 'J': val = short_to_long_ (mix_vm_get_rJ (vm_)); break; case 'I': { int i = regis[1] - '0'; if (i > 0 && i < 7) val = short_to_long_ (mix_vm_get_rI (vm_, i)); } break; default: break; } g_free (regis); scm_unlock_mutex (mutex_); SCM_ASSERT (val <= MIX_WORD_MAX, reg, SCM_ARG1, "mix-reg"); return scm_from_long (val); } static SCM mix_set_reg_ (SCM reg, SCM value) { char *regis; long val; gboolean result = TRUE; SCM_ASSERT (scm_is_string (reg) || scm_is_symbol (reg), reg, SCM_ARG1, "mix-set-reg!"); SCM_ASSERT (scm_is_number (value), value, SCM_ARG2, "mix-set-reg!"); scm_lock_mutex (mutex_); if (SCM_SYMBOLP (reg)) reg = scm_symbol_to_string (reg); regis = scm_to_locale_string (reg); val = scm_to_long (value); switch (regis[0]) { case 'A': mix_vm_set_rA (vm_, mix_word_new (val)); break; case 'X': mix_vm_set_rX (vm_, mix_word_new (val)); break; case 'J': mix_vm_set_rJ (vm_, mix_short_new (val)); break; case 'I': { int i = regis[1] - '0'; if (i > 0 && i < 7) mix_vm_set_rI (vm_, i, mix_short_new (val)); else result = FALSE; } break; default: result = FALSE; break; } g_free (regis); scm_unlock_mutex (mutex_); SCM_ASSERT (result, reg, SCM_ARG1, "mix-set-reg!"); return SCM_BOOL_T; } static SCM mix_cell_ (SCM no) { int cell; long result; SCM_ASSERT (SCM_NUMBERP (no), no, SCM_ARG1, "mix-cell"); cell = scm_to_int (no); SCM_ASSERT (cell < MIX_VM_CELL_NO, no, SCM_ARG1, "mix-cell"); result = word_to_long_ (mix_vm_get_addr_contents (vm_, cell)); return scm_from_long (result); } static SCM mix_set_cell_ (SCM no, SCM val) { int cell; long result; SCM_ASSERT (SCM_NUMBERP (no), no, SCM_ARG1, "mix-set-cell!"); SCM_ASSERT (SCM_NUMBERP (val), no, SCM_ARG2, "mix-set-cell!"); cell = scm_to_int (no); SCM_ASSERT (cell < MIX_VM_CELL_NO, no, SCM_ARG1, "mix-set-cell!"); result = scm_to_long (val); mix_vm_set_addr_contents (vm_, cell, mix_word_new (result)); return SCM_BOOL_T; } static SCM mix_over_ (void) { return scm_from_bool (mix_vm_get_overflow (vm_)); } static SCM mix_set_over_ (SCM over) { mix_vm_set_overflow (vm_, scm_to_bool (over)); return SCM_BOOL_T; } static SCM mix_loc_ (void) { return scm_from_long (mix_vm_get_prog_count (vm_)); } static SCM mix_cmp_ (void) { gchar *result = NULL; switch (mix_vm_get_cmpflag (vm_)) { case mix_LESS: result = "L"; break; case mix_EQ: result = "E"; break; case mix_GREAT: result = "G"; break; default: g_assert_not_reached (); } return scm_from_locale_symbol (result); } static SCM mix_set_cmp_ (SCM value) { gchar *val = NULL; mix_cmpflag_t result = -1; SCM_ASSERT (scm_is_string (value) || scm_is_symbol (value), value, SCM_ARG1, "mix-set-cmp!"); scm_lock_mutex (mutex_); val = scm_to_locale_string (value); if (strlen (val) == 1) { switch (val[0]) { case 'L': result = mix_LESS; break; case 'E': result = mix_EQ; break; case 'G': result = mix_GREAT; break; default: break; } } g_free (val); scm_unlock_mutex (mutex_); SCM_ASSERT (result != -1, value, SCM_ARG1, "mix-set-cmp!"); mix_vm_set_cmpflag (vm_, result); return SCM_BOOL_T; } static SCM mix_src_name_ (void) { const gchar *path = mix_vm_cmd_dispatcher_get_src_file_path (vm_dispatcher_); return scm_from_locale_string (path? g_path_get_basename (path) : ""); } static SCM mix_src_path_ (void) { const gchar *path = mix_vm_cmd_dispatcher_get_src_file_path (vm_dispatcher_); return scm_from_locale_string (path? (char *)path : ""); } static SCM mix_prog_name_ (void) { const gchar *path = mix_vm_cmd_dispatcher_get_program_path (vm_dispatcher_); return scm_from_locale_string (path? g_path_get_basename (path) : ""); } static SCM mix_prog_path_ (void) { const gchar *path = mix_vm_cmd_dispatcher_get_program_path (vm_dispatcher_); return scm_from_locale_string (path? (char *)path : ""); } static SCM mix_ddir_ (void) { return scm_from_locale_string ((char *)mix_device_get_dir ()); } static SCM mix_uptime_ (void) { return scm_from_long (mix_vm_cmd_dispatcher_get_uptime (vm_dispatcher_)); } static SCM mix_progtime_ (void) { return scm_from_long (mix_vm_cmd_dispatcher_get_progtime (vm_dispatcher_)); } static SCM mix_laptime_ (void) { return scm_from_long (mix_vm_cmd_dispatcher_get_laptime (vm_dispatcher_)); } static SCM mix_src_line_ (SCM opt) { gulong no = 0; const gchar *line = ""; if (opt != SCM_UNDEFINED) { SCM_ASSERT (SCM_NUMBERP (opt), opt, SCM_ARG1, "mix-src-line"); no = scm_to_ulong (opt); } else no = mix_vm_cmd_dispatcher_get_src_file_lineno (vm_dispatcher_); SCM_ASSERT (line >= 0, opt, SCM_ARG1, "mix-src-line"); if (no > 0) line = mix_vm_cmd_dispatcher_get_src_file_line (vm_dispatcher_, no, FALSE); return scm_from_locale_string ((char *)line); } static SCM mix_src_line_no_ (void) { return scm_from_long (mix_vm_cmd_dispatcher_get_src_file_lineno (vm_dispatcher_)); } /* ----- hook functions ---- */ /* auxiliar arg list maker */ static SCM make_arg_list_ (const gchar *arg) { gchar **arglist = g_strsplit (arg, " ", -1); SCM argument = scm_list_n (SCM_UNDEFINED, SCM_EOL); if (arglist && arglist[0]) { int k = 0; while (arglist[k]) argument = scm_cons (scm_from_locale_string (arglist[k++]), argument); argument = scm_reverse (argument); } g_strfreev (arglist); return argument; } /* command hook auxiliar functions and types */ /* static SCM hook_error_handler_ (void *data, SCM tag, SCM args){} */ typedef struct { SCM function; SCM args; } hook_data_t; static SCM hook_catch_body_ (void *data) { hook_data_t *h = (hook_data_t *)data; return scm_call_1 (h->function, h->args); } static void scm_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { hook_data_t h; h.function = (SCM) data; g_assert (scm_is_true (scm_procedure_p (h.function))); h.args = make_arg_list_ (arg); g_assert (scm_is_true (scm_list_p (h.args))); scm_internal_catch (SCM_BOOL_T, hook_catch_body_, &h, scm_handle_by_message_noexit, dis); } /* global hook auxiliar functions and types */ typedef struct { SCM function; SCM cmd; SCM args; } global_hook_data_t; static SCM global_hook_catch_body_ (void *data) { global_hook_data_t *h = (global_hook_data_t *)data; return scm_call_2 (h->function, h->cmd, h->args); } static void scm_global_hook_ (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg, gpointer data) { global_hook_data_t h; h.function = (SCM) data; h.cmd = scm_from_locale_string ((char *)mix_vm_command_to_string (cmd)); h.args = make_arg_list_ (arg); scm_internal_catch (SCM_BOOL_T, global_hook_catch_body_, &h, scm_handle_by_message_noexit, NULL); } static SCM define_hook_procedure_ (SCM function) { enum {BUFF_SIZE = 128}; static gchar BUFFER[BUFF_SIZE]; static const gchar *PATTERN = "____mix__hook__%d____"; static int K = 0; g_snprintf (BUFFER, BUFF_SIZE, PATTERN, K++); /* scm_c__define (name, val) returns a pair: (symbol . symbol-value) */ return scm_cdr (scm_c_define ((char *)BUFFER, function)); } static SCM mix_add_hook_ (SCM cmd, SCM function, gboolean pre) { gchar *cmdstr = NULL; mix_vm_command_t command; const gchar *fun = pre? "mix-add-pre-hook" : "mix-add-post-hook"; SCM_ASSERT (scm_is_string (cmd) || scm_is_symbol (cmd), cmd, SCM_ARG1, fun); SCM_ASSERT (scm_is_true (scm_procedure_p (function)), function, SCM_ARG2, fun); scm_lock_mutex (mutex_); cmdstr = scm_to_locale_string (cmd); command = mix_vm_command_from_string (cmdstr); g_free (cmdstr); scm_unlock_mutex (mutex_); SCM_ASSERT (command != MIX_CMD_INVALID, cmd, SCM_ARG1, fun); scm_lock_mutex (mutex_); if (pre) mix_vm_cmd_dispatcher_pre_hook (vm_dispatcher_, command, scm_hook_, (gpointer) define_hook_procedure_ (function)); else mix_vm_cmd_dispatcher_post_hook (vm_dispatcher_, command, scm_hook_, (gpointer) define_hook_procedure_ (function)); scm_unlock_mutex (mutex_); return SCM_BOOL_T; } static SCM mix_add_global_hook_ (SCM function, gboolean pre) { const gchar *fun = pre? "mix-add-global-pre-hook" : "mix-add-global-post-hook"; SCM_ASSERT (scm_is_true (scm_procedure_p (function)), function, SCM_ARG1, fun); scm_lock_mutex (mutex_); if (pre) mix_vm_cmd_dispatcher_global_pre_hook (vm_dispatcher_, scm_global_hook_, (gpointer) define_hook_procedure_ (function)); else mix_vm_cmd_dispatcher_global_post_hook (vm_dispatcher_, scm_global_hook_, (gpointer) define_hook_procedure_ (function)); scm_unlock_mutex (mutex_); return SCM_BOOL_T; } static SCM mix_add_pre_hook_ (SCM cmd, SCM function) { return mix_add_hook_ (cmd, function, TRUE); } static SCM mix_add_post_hook_ (SCM cmd, SCM function) { return mix_add_hook_ (cmd, function, FALSE); } static SCM mix_add_global_pre_hook_ (SCM function) { return mix_add_global_hook_ (function, TRUE); } static SCM mix_add_global_post_hook_ (SCM function) { return mix_add_global_hook_ (function, FALSE); } /* NULL-terminated list of available scm commands */ const scm_command_t DEFAULT_SCM_COMMANDS_[] = { {"mixvm-cmd", mixvm_cmd_, 2, 0, 0}, {"mixvm-status", mixvm_status_, 0, 0, 0}, {"mix-last-result", mix_last_result_, 0, 0, 0}, {"mix-reg", mix_reg_, 1, 0, 0}, {"mix-set-reg!", mix_set_reg_, 2, 0, 0}, {"mix-cell", mix_cell_, 1, 0, 0}, {"mix-set-cell!", mix_set_cell_, 2, 0, 0}, {"mix-over", mix_over_, 0, 0, 0}, {"mix-loc", mix_loc_, 0, 0, 0}, {"mix-set-over!", mix_set_over_, 1, 0, 0}, {"mix-cmp", mix_cmp_, 0, 0, 0}, {"mix-up-time", mix_uptime_, 0, 0, 0}, {"mix-lap-time", mix_laptime_, 0, 0, 0}, {"mix-prog-time", mix_progtime_, 0, 0, 0}, {"mix-prog-name", mix_prog_name_, 0, 0, 0}, {"mix-prog-path", mix_prog_path_, 0, 0, 0}, {"mix-src-name", mix_src_name_, 0, 0, 0}, {"mix-src-path", mix_src_path_, 0, 0, 0}, {"mix-src-line-no", mix_src_line_no_, 0, 0, 0}, {"mix-src-line", mix_src_line_, 0, 1, 0}, {"mix-ddir", mix_ddir_, 0, 0, 0}, {"mix-set-cmp!", mix_set_cmp_, 1, 0, 0}, {"mix-add-pre-hook", mix_add_pre_hook_, 2, 0, 0}, {"mix-add-post-hook", mix_add_post_hook_, 2, 0, 0}, {"mix-add-global-pre-hook", mix_add_global_pre_hook_, 1, 0, 0}, {"mix-add-global-post-hook", mix_add_global_post_hook_, 1, 0, 0}, {NULL} }; mdk-1.2.9/mixguile/mixguile_cmd_dispatcher.c0000644000175000017500000000677312112755472016105 00000000000000/* -*-c-*- -------------- mixguile_cmd_dispatcher.c : * Implementation of the functions declared in mixguile_cmd_dispatcher.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2007, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include "mixguile.h" #include "xmixguile_cmd_dispatcher.h" #define SCM_CMD "scm" #define SCMF_CMD "scmf" /*local commands */ static SCM eval_ (void *code) { scm_c_eval_string ((char *)code); return SCM_BOOL_T; } static gboolean cmd_scm_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { scm_c_catch (SCM_BOOL_T, eval_, (void*) arg, scm_handle_by_message_noexit, NULL, NULL, NULL); return TRUE; } static SCM load_ (void *path) { scm_c_primitive_load ((char *)path); return SCM_BOOL_T; } static gboolean cmd_scmf_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { scm_c_catch (SCM_BOOL_T, load_, (void*) arg, scm_handle_by_message_noexit, NULL, NULL, NULL); return TRUE; } static mix_vm_command_info_t commands_[] = { { SCM_CMD, cmd_scm_, N_("Eval Scheme command using Guile"), "scm COMMAND"}, { SCMF_CMD, cmd_scmf_, N_("Eval Scheme file using Guile"), "scmf PATH"}, {NULL} }; /* create/destroy cmd dispatcher */ mixguile_cmd_dispatcher_t * mixguile_cmd_dispatcher_new (mix_vm_cmd_dispatcher_t *dis) { static gboolean REGISTERED = FALSE; mixguile_cmd_dispatcher_t *result = NULL; int k = 0; g_return_val_if_fail (dis != NULL, NULL); if (!REGISTERED) { register_scm_commands_ (DEFAULT_SCM_COMMANDS_); REGISTERED = TRUE; } result = g_new (mixguile_cmd_dispatcher_t, 1); result->dispatcher = dis; while (commands_[k].name) { mix_vm_cmd_dispatcher_register_new (dis, commands_ + k); ++k; } register_cmd_dispatcher_ (result); return result; } void mixguile_cmd_dispatcher_delete (mixguile_cmd_dispatcher_t *dis) { g_return_if_fail (dis != NULL); mix_vm_cmd_dispatcher_delete (dis->dispatcher); } /* get the underlying vm dispatcher */ mix_vm_cmd_dispatcher_t * mixguile_cmd_dispatcher_get_vm_dispatcher (const mixguile_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, NULL); return dis->dispatcher; } void mixguile_cmd_dispatcher_interpret_file (mixguile_cmd_dispatcher_t *dis, const gchar *path) { g_return_if_fail (dis != NULL); g_return_if_fail (path != NULL); mix_vm_cmd_dispatcher_dispatch_split_text (dis->dispatcher, SCMF_CMD, path); } void mixguile_cmd_dispatcher_interpret_command (mixguile_cmd_dispatcher_t *dis, const gchar *command) { g_return_if_fail (dis != NULL); g_return_if_fail (command != NULL); mix_vm_cmd_dispatcher_dispatch_split_text (dis->dispatcher, SCM_CMD, command); } mdk-1.2.9/mixguile/mixguile_cmd_dispatcher.h0000644000175000017500000000353312112755472016101 00000000000000/* -*-c-*- ---------------- mixguile_cmd_dispatcher.h : * Command dispatcher with guile support * ------------------------------------------------------------------ * Copyright (C) 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGUILE_CMD_DISPATCHER_H #define MIXGUILE_CMD_DISPATCHER_H #include #include /* the guile command dispatcher type */ typedef struct mixguile_cmd_dispatcher_t mixguile_cmd_dispatcher_t; /* create/destroy cmd dispatcher */ extern mixguile_cmd_dispatcher_t * mixguile_cmd_dispatcher_new (mix_vm_cmd_dispatcher_t *dis); extern void mixguile_cmd_dispatcher_delete (mixguile_cmd_dispatcher_t *dis); /* get the underlying vm dispatcher */ extern mix_vm_cmd_dispatcher_t * mixguile_cmd_dispatcher_get_vm_dispatcher (const mixguile_cmd_dispatcher_t *disp); /* interpret commands from file or string */ extern void mixguile_cmd_dispatcher_interpret_file (mixguile_cmd_dispatcher_t *dis, const gchar *path); extern void mixguile_cmd_dispatcher_interpret_command (mixguile_cmd_dispatcher_t *dis, const gchar *command); #endif /* MIXGUILE_CMD_DISPATCHER_H */ mdk-1.2.9/mixguile/Makefile.in0000644000175000017500000006127212636565536013140 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2001, 2010, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @MAKE_GUILE_TRUE@am__append_1 = -I$(includedir) -I$(top_srcdir) $(SCM_PATHS) @MAKE_GUILE_TRUE@bin_PROGRAMS = mixguile$(EXEEXT) subdir = mixguile ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libmixguile_a_AR = $(AR) $(ARFLAGS) libmixguile_a_LIBADD = am__libmixguile_a_SOURCES_DIST = mixguile.h mixguile.c \ mixguile_cmd_dispatcher.h mixguile_cmd_dispatcher.c \ xmixguile_cmd_dispatcher.h xmixguile_cmd_dispatcher.c @MAKE_GUILE_TRUE@am_libmixguile_a_OBJECTS = mixguile.$(OBJEXT) \ @MAKE_GUILE_TRUE@ mixguile_cmd_dispatcher.$(OBJEXT) \ @MAKE_GUILE_TRUE@ xmixguile_cmd_dispatcher.$(OBJEXT) libmixguile_a_OBJECTS = $(am_libmixguile_a_OBJECTS) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) am__mixguile_SOURCES_DIST = mixguile_main.c @MAKE_GUILE_TRUE@am_mixguile_OBJECTS = mixguile_main.$(OBJEXT) mixguile_OBJECTS = $(am_mixguile_OBJECTS) am__DEPENDENCIES_1 = @MAKE_GUILE_TRUE@mixguile_DEPENDENCIES = \ @MAKE_GUILE_TRUE@ $(top_builddir)/mixlib/libmix.a \ @MAKE_GUILE_TRUE@ $(top_builddir)/lib/libreplace.a \ @MAKE_GUILE_TRUE@ libmixguile.a $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmixguile_a_SOURCES) $(mixguile_SOURCES) DIST_SOURCES = $(am__libmixguile_a_SOURCES_DIST) \ $(am__mixguile_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ $(am__append_1) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SCM_FILES = mixguile.scm mixguile-commands.scm mixguile-vm-stat.scm EXTRA_DIST = $(SCM_FILES) @MAKE_GUILE_TRUE@noinst_LIBRARIES = libmixguile.a @MAKE_GUILE_TRUE@SCM_PATHS = -DSCM_FILE=\""$(pkgdatadir)/mixguile.scm"\"\ @MAKE_GUILE_TRUE@ -DLOCAL_SCM_FILE=\"mixguile.scm\" @MAKE_GUILE_TRUE@pkgdata_DATA = $(SCM_FILES) @MAKE_GUILE_TRUE@libmixguile_a_AM_CFLAGS = -I$(includedir) -I$(top_srcdir) \ @MAKE_GUILE_TRUE@ -DG_LOG_DOMAIN=\"libmixguile\" @MAKE_GUILE_TRUE@libmixguile_a_SOURCES = mixguile.h mixguile.c \ @MAKE_GUILE_TRUE@ mixguile_cmd_dispatcher.h mixguile_cmd_dispatcher.c \ @MAKE_GUILE_TRUE@ xmixguile_cmd_dispatcher.h xmixguile_cmd_dispatcher.c @MAKE_GUILE_TRUE@mixguile_LDADD = $(top_builddir)/mixlib/libmix.a \ @MAKE_GUILE_TRUE@ $(top_builddir)/lib/libreplace.a \ @MAKE_GUILE_TRUE@ libmixguile.a $(INTLLIBS) @MAKE_GUILE_TRUE@mixguile_SOURCES = mixguile_main.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mixguile/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu mixguile/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmixguile.a: $(libmixguile_a_OBJECTS) $(libmixguile_a_DEPENDENCIES) $(EXTRA_libmixguile_a_DEPENDENCIES) $(AM_V_at)-rm -f libmixguile.a $(AM_V_AR)$(libmixguile_a_AR) libmixguile.a $(libmixguile_a_OBJECTS) $(libmixguile_a_LIBADD) $(AM_V_at)$(RANLIB) libmixguile.a install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) mixguile$(EXEEXT): $(mixguile_OBJECTS) $(mixguile_DEPENDENCIES) $(EXTRA_mixguile_DEPENDENCIES) @rm -f mixguile$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixguile_OBJECTS) $(mixguile_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixguile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixguile_cmd_dispatcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixguile_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmixguile_cmd_dispatcher.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-pkgdataDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-pkgdataDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/mixguile/mixguile.h0000644000175000017500000000424212112755472013046 00000000000000/* -*-c-*- ---------------- mixguile.h : * Interface to the mixguile interpreter. * ------------------------------------------------------------------ * Copyright (C) 2001, 2006, 2007, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGUILE_H #define MIXGUILE_H #include #include #include /* the main function type */ typedef void (*main_func_t) (void *closure, int argc, char *argv[]); /* enter and do the initialisation manually inside the guile world */ #define mixguile_enter(argc,argv,main_fun) \ scm_boot_guile (argc, argv, main_fun, 0) /* load mixguile startup file */ extern void mixguile_load_bootstrap (gboolean localinit); /* initialise the guile command dispatcher and enter the provided main function. */ extern void mixguile_init (int argc, char *argv[], gboolean initfile, main_func_t main_fun, mix_vm_cmd_dispatcher_t *dis); /* set the command dispatcher */ extern void mixguile_set_cmd_dispatcher (mix_vm_cmd_dispatcher_t *dis); /* enter the guile repl */ extern void mixguile_enter_repl (void *closure, int argc, char *argv[]); /* access the comand dispatcher */ extern mix_vm_cmd_dispatcher_t * mixguile_get_cmd_dispatcher (void); /* execute a string or file using the guile interpreter */ extern void mixguile_interpret_file (const gchar *path); extern void mixguile_interpret_command (const gchar *command); #endif /* MIXGUILE_H */ mdk-1.2.9/configure.ac0000644000175000017500000001141012636564531011515 00000000000000# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, # 2010, 2013, 2014, 2015 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. AC_INIT([GNU MDK],1.2.9,[bug-mdk@gnu.org],mdk) AC_CONFIG_SRCDIR([mixlib/mix.h]) AM_INIT_AUTOMAKE AM_CONFIG_HEADER(config.h) AM_MAINTAINER_MODE AC_ISC_POSIX AC_PROG_CC AM_PROG_CC_STDC AC_HEADER_STDC AM_PROG_LEX AC_PROG_RANLIB dnl additional c flags AM_CFLAGS="$AM_CFLAGS -Wall -fno-strict-aliasing" AC_ARG_WITH(werror, [ --with-werror treat compilation warnings as errors], [case "${withval}" in yes) werr=true ;; no) werr=false ;; *) AC_MSG_ERROR(bad value ${withval} for --with-werror) ;; esac], [werr=false]) if test x$werr = xtrue; then AM_CFLAGS="$AM_CFLAGS -Werror" fi dnl i18n stuff AM_GNU_GETTEXT_VERSION(0.14) AM_GNU_GETTEXT AC_PROG_INTLTOOL([0.37], [no-xml]) GETTEXT_PACKAGE=mdk AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Package Name for Gettext]) test "x$prefix" = xNONE && prefix=$ac_default_prefix AH_TEMPLATE(LOCALEDIR,[locale directory]) AC_DEFINE_UNQUOTED(LOCALEDIR, "${prefix}/share/locale") dnl Check for readline and history AC_ARG_WITH(readline, [ --without-readline build mixvm without readline support], [case "${withval}" in yes) readl=true ;; no) readl=false ;; *) AC_MSG_ERROR(bad value ${withval} for --with-readline) ;; esac], [readl=true]) if test x$readl = xtrue; then AC_CHECK_LIB(ncurses, initscr, , [AC_MSG_WARN(Cannot find ncurses lib); readl=false]) fi if test x$readl = xtrue; then AC_CHECK_LIB(readline, readline, , [AC_MSG_WARN(Cannot find GNU readline lib); readl=false]) fi if test x$readl = xtrue; then AC_CHECK_LIB(history, add_history, , [AC_MSG_WARN(Cannot find GNU history lib); readl=false]) dnl old versions of readline use completion_matches instead dnl of rl_completion_matches AC_CHECK_FUNCS(rl_completion_matches,,) fi dnl Check for glib PKG_CHECK_MODULES(GLIB,glib-2.0 >= 2.0) dnl Check for guile AC_ARG_WITH(guile, [ --without-guile build MDK without Guile support], [case "${withval}" in yes) wguile=true ;; no) wguile=false ;; *) AC_MSG_ERROR(bad value ${withval} for --with-guile) ;; esac], [wguile=true]) if test x$wguile = xtrue; then PKG_CHECK_MODULES(GUILE,guile-2.0 >= 2.0,[wguile=true],[wguile=false]) fi if test x$wguile = xtrue; then LIBS="$LIBS $GUILE_LIBS" AM_CFLAGS="$AM_CFLAGS $GUILE_CFLAGS" AC_SUBST(MAKE_GUILE) fi AM_CONDITIONAL(MAKE_GUILE, test x$wguile = xtrue) LIBS="$LIBS $GLIB_LIBS" AM_CFLAGS="$AM_CFLAGS $GLIB_CFLAGS -DG_DISABLE_DEPRECATED" dnl Check if the gtk gui is required AC_ARG_ENABLE(gui, [ --disable-gui do not build the GTK+ GUI for mixvm (gmixvm)], [case "${enableval}" in yes) gui=true ;; no) gui=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-gui) ;; esac],[gui=true]) dnl Check for gtk+ if test x$gui = xtrue; then PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.6.0 libglade-2.0 >= 2.0.0 pango >= 1.4, [LIBS="$LIBS $GTK_LIBS" AM_CFLAGS="$AM_CFLAGS $GTK_CFLAGS"], [AC_MSG_WARN(Cannot find GTK+/Glade/Pango: the GUI shall not be built) gui=false]) fi if test x$gui = xtrue; then AM_CFLAGS="$AM_CFLAGS -DGTK_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED" fi dnl Are we in a darwin system? case "${host_os}" in darwin*) darwin_system=true;; *) darwin_system=false; esac AM_CONDITIONAL(MAKE_GUI, test x$gui = xtrue) AM_CONDITIONAL(DARWIN_SYSTEM, test x$darwin_system = xtrue) dnl use the provided getopt if gnu getopt is not available AC_REPLACE_FUNCS(getopt_long) AC_SUBST(AM_CFLAGS) AC_CONFIG_FILES([ Makefile doc/Makefile doc/img/Makefile mixlib/Makefile mixlib/testsuite/Makefile mixguile/Makefile mixutils/Makefile mixgtk/Makefile lib/Makefile misc/Makefile samples/Makefile samples/tests/Makefile po/Makefile.in intl/Makefile ]) AC_OUTPUT if test x$readl = xtrue; then rlinfo=", with readline support" fi if test x$wguile = xtrue; then guileinfo=", with guile support" fi echo echo "*** $PACKAGE_NAME $VERSION has been successfully configured. ***" echo echo "Type 'make' to build the following utilities:" echo " - mixasm (MIX assembler)" echo " - mixvm (MIX virtual machine${rlinfo}${guileinfo})" if test x$gui = xtrue; then echo " - gmixvm (mixvm GTK+ GUI${guileinfo})" fi if test x$wguile = xtrue; then echo " - mixguile (the mixvm guile shell)" fi echo mdk-1.2.9/compile0000755000175000017500000001624512563613157010616 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mdk-1.2.9/COPYING0000644000175000017500000010451312112755472010264 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mdk-1.2.9/config.guess0000755000175000017500000012475312574644301011561 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || \ echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp 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` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mdk-1.2.9/mixlib/0000755000175000017500000000000012636571405010574 500000000000000mdk-1.2.9/mixlib/mix_vm_dump.c0000644000175000017500000001001012112755472013171 00000000000000/* ---------------------- mix_vm_dump.c : * Implementation of the functions declared in mix_vm_dump.h * ------------------------------------------------------------------ ** Copyright (C) 2000, 2007 Free Software Foundation, Inc. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #include "mix.h" #include #include "xmix_vm.h" #include "mix_vm_dump.h" /* Create/destroy a dump context */ mix_dump_context_t * mix_dump_context_new(FILE *fd, mix_address_t begin, mix_address_t end, guint32 options) { mix_dump_context_t *result = NULL; g_return_val_if_fail (fd != NULL, NULL); if ( begin > end ) begin = end; if ( end >= MEM_CELLS_NO_ ) end = MEM_CELLS_NO_; result = g_new (mix_dump_context_t,1); result->options = options; result->begin = begin; result->end = end; result->channel = fd; return result; } void mix_dump_context_delete (mix_dump_context_t *dc) { g_return_if_fail (dc != NULL); g_free (dc); } /* Use the dump context */ #define WORD_FMT_ "%s %02d %02d %02d %02d %02d (%010ld)" #define SHORT_FMT_ "%s %02d %02d (%04d)" #define WORD_SIGN_(w) mix_word_is_negative (w)? "-":"+" #define SHORT_SIGN_(s) mix_short_is_negative (s)? "-":"+" #define WORD_ABS_(w) mix_word_magnitude (w) #define SHORT_ABS_(s) mix_short_magnitude (s) #define WORD_BYTE_(w,i) mix_byte_new (mix_word_magnitude (w)>>(6*(5-i))) #define SHORT_BYTE_(s,i) mix_byte_new (mix_short_magnitude (s)>>(6*(2-i))) #define WORD_ARGS_(w) WORD_SIGN_ (w), WORD_BYTE_ (w,1), WORD_BYTE_ (w,2), \ WORD_BYTE_ (w,3), WORD_BYTE_ (w,4), WORD_BYTE_ (w,5), WORD_ABS_ (w) #define SHORT_ARGS_(s) SHORT_SIGN_ (s), SHORT_BYTE_ (s,1), SHORT_BYTE_ (s,2), \ SHORT_ABS_ (s) void mix_vm_dump (const mix_vm_t *vm, const mix_dump_context_t *dc) { guint j, i; FILE *f; g_return_if_fail (vm != NULL); g_return_if_fail (dc != NULL); f = dc->channel; if ( (dc->options & MIX_DUMP_rA) == MIX_DUMP_rA ) { mix_word_t rA = get_rA_ (vm); fprintf (f, "rA: " WORD_FMT_ "\n", WORD_ARGS_ (rA)); } if ( (dc->options & MIX_DUMP_rX) == MIX_DUMP_rX ) { mix_word_t rX = get_rX_ (vm); fprintf (f, "rX: " WORD_FMT_ "\n", WORD_ARGS_ (rX)); } if ( (dc->options & MIX_DUMP_rJ) == MIX_DUMP_rJ ) { mix_short_t rJ = get_rJ_ (vm); fprintf (f, "rJ: " SHORT_FMT_ "\n", SHORT_ARGS_ (rJ)); } for (j = 0, i = 0; j < IREG_NO_; ++j) { if ( (dc->options & (MIX_DUMP_rI1<options & MIX_DUMP_OVER) == MIX_DUMP_OVER ) { fprintf (f, _("Overflow: %s\n"), get_over_ (vm)? "T":"F"); } if ( (dc->options & MIX_DUMP_CMP) == MIX_DUMP_CMP ) { const gchar *val = "?"; switch (get_cmp_ (vm)) { case mix_LESS: val = "L"; break; case mix_GREAT: val = "G"; break; case mix_EQ: val = "E"; break; default: g_assert_not_reached (); break; } fprintf (f, _("Cmp: %s\n"), val); } if ( (dc->options & MIX_DUMP_CELLS) == MIX_DUMP_CELLS ) { for (j = dc->begin; j < dc->end; ++j) { mix_word_t cell = get_cell_ (vm,j); fprintf (f, "%04d: " WORD_FMT_ "\n", j, WORD_ARGS_ (cell)); } } fflush (f); } mdk-1.2.9/mixlib/mix_src_file.h0000644000175000017500000000327412112755472013333 00000000000000/* -*-c-*- ---------------- mix_src_file.h : * Declaration of mix_src_file_t, a type representing a MIXAL source * file. * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_SRC_FILE_H #define MIX_SRC_FILE_H #include "mix_file.h" /* the MIXAL source file type */ typedef struct mix_src_file_t mix_src_file_t; /* create a new src file from an existing disk file */ extern mix_src_file_t * mix_src_file_new_for_read (const gchar *path); /* destroy a src file object */ extern void mix_src_file_delete (mix_src_file_t *src); /* get the source file path */ extern const gchar * mix_src_file_get_path (const mix_src_file_t *src); /* get a given line of the source file */ extern const gchar * mix_src_file_get_line (const mix_src_file_t *src, guint lineno); /* get the total no. of lines in the file */ extern guint mix_src_file_get_line_no (const mix_src_file_t *src); #endif /* MIX_SRC_FILE_H */ mdk-1.2.9/mixlib/mix_types.h0000644000175000017500000002277512622454575012726 00000000000000/* -*-c-*- --------------- mix_types.h: * This file contains declarations for the basic types used in MIX: * mix_byte_t, mix_char_t, mix_short_t and mix_word_t. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_TYPES_H #define MIX_TYPES_H #include #include "mix.h" /* Initialisation function to be called before using the other * functions in this file */ extern void mix_init_types(void); /*----------------- m_byte_t --------------------------------------------*/ /* MIX byte type */ typedef guint8 mix_byte_t; /* Maximum value stored in an mix_byte_t */ #define MIX_BYTE_MAX ((1L << 6) - 1) /* Zero mix byte */ #define MIX_BYTE_ZERO ((mix_byte_t)0) /* Create a mix_byte_t from any native type */ #define mix_byte_new(x) ((mix_byte_t)((x) & MIX_BYTE_MAX )) /* Operations */ /* Addition */ #define mix_byte_add(x,y) mix_byte_new((x) + (y)) /* Substraction */ #define mix_byte_sub(x,y) mix_byte_new((x) - (y)) /* Product */ #define mix_byte_mul(x,y) mix_byte_new((x) * (y)) /* Quotient */ #define mix_byte_div(x,y) mix_byte_new((x) / (y)) /*----------------- mix_char_t --------------------------------------------*/ /* MIX char type: chars are coded in MIX from 0 to MIX_CHAR_MAX */ typedef guint8 mix_char_t; #define MIX_CHAR_MAX 55 /* Conversions for mix_char_t's */ #define mix_char_new(l) (((l) < MIX_CHAR_MAX )? (l) : MIX_CHAR_MAX) #define mix_char_to_byte(mchar) mix_byte_new (mchar) #define mix_byte_to_char(byte) mix_char_new (byte) extern mix_char_t mix_ascii_to_char(guchar c); extern guchar mix_char_to_ascii(mix_char_t c); /*----------------- mix_word_t --------------------------------------------*/ /* * Represented as a gint32 (glib ensures that this type has 32 * bits). Bit 30 is the sign, higher bits are 0, * and bits 0-29 are the magnitude. * Each MIX 'byte' is a 6-bit substring of the magnitude. */ typedef guint32 mix_word_t; /* Maximum value stored in an mix_word_t */ #define MIX_WORD_MAX ((1L << 30) - 1) /* Sign bit in a word */ #define MIX_WORD_SIGN_BIT (1L << 30) /* Zero mix word */ #define MIX_WORD_ZERO ((mix_word_t)0) /* Negative zero mix word */ #define MIX_WORD_MINUS_ZERO (MIX_WORD_ZERO | MIX_WORD_SIGN_BIT) /* Create a mix_word_t from any native type */ #define mix_word_new(x) \ ( (x) < 0 \ ? ( MIX_WORD_SIGN_BIT | ((mix_word_t)(-(x)) & MIX_WORD_MAX) ) \ : ( (mix_word_t)(x) & MIX_WORD_MAX ) \ ) /* Create a mix_word_t from individual bytes */ #define mix_word_new_b(b1,b2,b3,b4,b5) \ ((mix_word_t)(mix_byte_new(b5) + (mix_byte_new(b4)<<6) + \ (mix_byte_new(b3)<<12) + (mix_byte_new(b2)<<18) + \ (mix_byte_new(b1)<<24))) /* Create a negative mix_word_t from individual bytes */ #define mix_word_new_bn(b1,b2,b3,b4,b5) \ mix_word_negative(mix_word_new_b(b1,b2,b3,b4,b5)) /* Create mix_word_t from an array of mix_byte_t */ extern mix_word_t mix_bytes_to_word(mix_byte_t *bytes, guint byteno); /* Access byte within a word */ extern mix_byte_t /* byte -idx- or MIX_BYTE_ZERO if -idx- out of range */ mix_word_get_byte(mix_word_t word, /* word parsed */ guint idx /* byte: 1 to 5 */); /* Set a byte within a mix_word_t */ extern void mix_word_set_byte(mix_word_t *into, /* word to be modified */ guint idx, /* byte: 1 to 5 */ mix_byte_t value /* byte's value */); /* Operations */ /* Sign-related definitions */ #define mix_word_negative(word) ( (word) ^ MIX_WORD_SIGN_BIT ) #define mix_word_reverse_sign(word) ( word ^= MIX_WORD_SIGN_BIT ) #define mix_word_sign(word) ( (word) & MIX_WORD_SIGN_BIT ) #define mix_word_magnitude(word) ( (word) & (MIX_WORD_SIGN_BIT - 1) ) #define mix_word_is_positive(word) ( mix_word_sign(word) == 0 ) #define mix_word_is_negative(word) ( mix_word_sign(word) != 0 ) #define mix_word_is_even(word) ( ((word) & 1) == 0 ) #define mix_word_is_odd(word) ( ((word) & 1) == 1 ) /* Arithmetic operations */ extern mix_word_t mix_word_add(mix_word_t x, mix_word_t y); #define mix_word_sub(x,y) ( mix_word_add((x),mix_word_negative(y)) ) /* Add two words filling a high word if needed. -high_word- and/or -low_word- can be NULL. */ extern gboolean /* TRUE if overflow */ mix_word_add_and_carry(mix_word_t x, mix_word_t y, mix_word_t *high_word, mix_word_t *low_word); /* Product, stored in -high_word- and -low_word-, which can be NULL. */ extern void mix_word_mul(mix_word_t x, mix_word_t y, mix_word_t *high_word, mix_word_t *low_word); /* Division. -quotient- and/or -remainder- can be NULL. */ extern gboolean /* TRUE if overflow */ mix_word_div(mix_word_t n1, mix_word_t n0, mix_word_t d, mix_word_t *quotient, mix_word_t *remainder); /* Shift operations */ extern void mix_word_shift_left(mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX); extern void mix_word_shift_right(mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX); extern void mix_word_shift_left_circular(mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX); extern void mix_word_shift_right_circular(mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX); extern void mix_word_shift_left_binary(mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX); extern void mix_word_shift_right_binary(mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX); /* * Fields within a word: a word containing the (L:R) * bytes of the original one. L and R (with 0 <= L <= R < 6) * are specified by a mix_fspec_t F = 8*L + R. */ typedef guint8 mix_fspec_t; #define mix_fspec_left(f) ( ((f)>>3) & 7 ) #define mix_fspec_right(f) ( (f) & 7 ) #define mix_fspec_new(L,R) ( mix_byte_new(8*(L) + (R)) ) extern gboolean mix_fspec_is_valid(mix_fspec_t f); extern mix_word_t /* the specified field or 0 if f is not valid */ mix_word_get_field(mix_fspec_t f, mix_word_t word); extern mix_word_t /* -to- with the field -f- from -from- or -to- if -f- is not a valid fspec */ mix_word_set_field(mix_fspec_t f, mix_word_t from, mix_word_t to); /* set field into a zero word */ #define mix_word_extract_field(fspec,from_word) \ mix_word_set_field(fspec,from_word,MIX_WORD_ZERO) /* Store operation: the no. of bytes determined by -f- is taken * from the right of -from- and stored into -to- in the location * specified by -f- */ extern mix_word_t mix_word_store_field(mix_fspec_t f, mix_word_t from, mix_word_t to); /* Printable representation */ #define mix_word_print(word,message) \ mix_word_print_to_file (word, message, stdout) extern void mix_word_print_to_file (mix_word_t word, const char *message, FILE *f); extern void mix_word_print_to_buffer (mix_word_t word, gchar *buf); /*----------------- mix_short_t ------------------------------------------*/ typedef guint16 mix_short_t; #define MIX_SHORT_MAX ((1L << 12) - 1) #define MIX_SHORT_SIGN_BIT ((mix_short_t)(1L << 12)) #define MIX_SHORT_ZERO ((mix_short_t)0) #define MIX_SHORT_MINUS_ZERO (MIX_SHORT_ZERO | MIX_SHORT_SIGN_BIT) /* Sign-related definitions */ #define mix_short_negative(s) ( (s) ^ MIX_SHORT_SIGN_BIT ) #define mix_short_sign(s) ( (s) & MIX_SHORT_SIGN_BIT ) #define mix_short_magnitude(s) \ ( (s) & (MIX_SHORT_SIGN_BIT - 1) ) #define mix_short_is_positive(s) ( mix_short_sign(s) == 0 ) #define mix_short_is_negative(s) ( mix_short_sign(s) != 0 ) #define mix_short_reverse_sign(s) ( (s) ^= MIX_SHORT_SIGN_BIT ) /* create short from a long */ #define mix_short_new(val) \ ((val)>= 0 ? (val)&MIX_SHORT_MAX : mix_short_negative(-(val))) /* Create shorts from individual bytes */ #define mix_short_new_b(b1,b2) \ ((mix_short_t)((mix_byte_new(b1)<<6) + mix_byte_new(b2))) #define mix_short_new_bn(b1,b2) mix_short_negative(mix_short_new_b(b1,b2)) /* Conversions between words and shorts. Arithmetic operations on shorts are not provided but for addition: use words instead. */ /* Make a short taking word's sign and its two least significant bytes (bytes no. 4 and 5) */ extern mix_short_t mix_word_to_short(mix_word_t word); extern mix_word_t mix_short_to_word(mix_short_t s); /* fast conversion (these macros' argument are evaluated twice */ #define mix_word_to_short_fast(w) \ ( mix_word_is_negative(w) ? \ ((w) & MIX_SHORT_MAX)|MIX_SHORT_SIGN_BIT : (w)&MIX_SHORT_MAX ) #define mix_short_to_word_fast(s) \ ( mix_short_is_negative(s) ? \ (mix_word_t) (mix_short_magnitude(s)|MIX_WORD_SIGN_BIT): (mix_word_t)(s) ) extern mix_short_t mix_short_add(mix_short_t x, mix_short_t y); /* printable representation */ extern void mix_short_print(mix_short_t s, const gchar *message); extern void mix_short_print_to_buffer (mix_short_t s, gchar *buf); #endif /* MIX_TYPES_H */ mdk-1.2.9/mixlib/mix_code_file.h0000644000175000017500000000633512112755472013457 00000000000000/* -*-c-*- ---------------- mix_code_file.h : * Declaration of mix_code_file_t, a file containing compiled mix * instructions. * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_CODE_FILE_H #define MIX_CODE_FILE_H #include "mix_file.h" #include "mix_ins.h" #include "mix_symbol_table.h" /* mix_code_file_t type */ typedef struct mix_code_file_t mix_code_file_t; /* instructions are loaded at specific memory addresses and related to source line numbers */ typedef struct mix_ins_desc_t mix_ins_desc_t; struct mix_ins_desc_t { mix_word_t ins; /* a mix instruction coded into a word */ mix_address_t address; /* the address of this instruction */ guint lineno; /* source file line no. */ }; /* mix code files have a default extension (.mix) which is customizable */ extern const gchar * mix_code_file_get_defext(void); extern gboolean mix_code_file_set_defext(const gchar *ext); /* create/destroy code files for read or write */ /* if -name- does not end with defext, it is automatically appended */ extern mix_code_file_t * mix_code_file_new_read(const gchar *name); /* open a code file for write with/out debug information */ extern mix_code_file_t * mix_code_file_new_write(const gchar *name, mix_address_t start, const gchar *source_path, gboolean debug, const mix_symbol_table_t *table); extern void mix_code_file_delete(mix_code_file_t *file); /* get general parameters from a code file */ extern gboolean mix_code_file_is_debug(const mix_code_file_t *file); extern gint mix_code_file_major_version(const mix_code_file_t *file); extern gint mix_code_file_minor_version(const mix_code_file_t *file); extern mix_address_t mix_code_file_get_start_addr(const mix_code_file_t *file); extern mix_symbol_table_t * mix_code_file_get_symbol_table(mix_code_file_t *file); /* read instructions from a code file */ extern gboolean mix_code_file_is_eof(mix_code_file_t *file); extern gboolean mix_code_file_get_ins(mix_code_file_t *file, mix_ins_desc_t *desc); /* write instructions to a code file */ extern gboolean mix_code_file_write_ins(mix_code_file_t *file, const mix_ins_desc_t *desc); extern gboolean mix_code_file_write_next_ins(mix_code_file_t *file, mix_word_t ins, guint lineno); extern gboolean mix_code_file_set_address(mix_code_file_t *file, mix_address_t address); /* get details about the source file */ extern const gchar * mix_code_file_get_source_path (const mix_code_file_t *file); #endif /* MIX_CODE_FILE_H */ mdk-1.2.9/mixlib/xmix_vm.h0000644000175000017500000001132512112755472012353 00000000000000/* ---------------------- xmix_vm.h : * This file contains internal declarations used in the implementation * of the mix_vm_t type. * ------------------------------------------------------------------ * Copyright (C) 2000, 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_VM_H #define XMIX_VM_H #include #include "mix_symbol_table.h" #include "mix_device.h" #include "mix_src_file.h" #include "mix_predicate_list.h" #include "mix_vm.h" /* The mix_vm_t type */ enum { IREG_NO_ = 6, BD_NO_ = 21, MEM_CELLS_NO_ = MIX_VM_CELL_NO, MEM_CELLS_MAX_ = MIX_VM_CELL_NO - 1 }; struct mix_vm_t { mix_word_t reg[IREG_NO_+3]; mix_word_t cell[MEM_CELLS_NO_]; gboolean overflow; mix_cmpflag_t cmpflag; mix_short_t loc_count; mix_vm_status_t status; mix_vm_error_t last_error; mix_device_t * devices[BD_NO_]; mix_address_t start_addr; /* start address of loaded file */ GTree *line_table; /* source line no -> address */ GTree *address_table; /* adress -> source line no */ gint8 bp[MEM_CELLS_NO_/8]; /* each bit signals a break point */ mix_vm_clock_t *clock; /* the vm clock */ mix_symbol_table_t *symbol_table; mix_src_file_t *src_file; /* source of last loaded code file */ mix_device_factory_t factory; /* the factory for new devices */ mix_predicate_list_t *pred_list; /* predicates for conditional bps */ GSList *address_list; /* list of executed addresses */ }; /* Macros for accessing/modifying the above structure. * Warning: the arguments of these macros must not have side-effects. */ #define IOK_(idx) ( (idx) > 0 && (idx) < IREG_NO_+1 ) #define MEMOK_(addr) ( mix_short_is_positive(addr) && (addr) < MEM_CELLS_NO_ ) #define REGOK_(r) ( (r) >= 0 && (r) < IREG_NO_ + 3 ) enum { A_ = 0, X_, J_, I1_, I2_, I3_, I4_, I5_, I6_ }; #define get_reg_(vm, r) ((vm)->reg[r]) #define get_rA_(vm) get_reg_(vm, A_) #define get_rX_(vm) get_reg_(vm, X_) #define get_rJ_(vm) get_reg_(vm, J_) #define get_rI_(vm,idx) get_reg_(vm, I1_ + (idx) - 1) #define get_cell_(vm,addr) ( MEMOK_(addr) ? vm->cell[addr] : MIX_WORD_ZERO ) #define get_cell_ptr_(vm,addr) ( MEMOK_(addr) ? (vm->cell) + addr : NULL ) #define get_cmp_(vm) (vm->cmpflag) #define get_over_(vm) (vm->overflow) #define get_loc_(vm) (vm->loc_count) #define get_clock_(vm) (vm->clock) #define get_pred_list_(vm) (vm->pred_list) #define get_address_list_(vm) (vm->address_list) #define get_status_(vm) (vm->status) #define get_last_error_(vm) (vm->last_error) #define set_last_error_(vm,error) ((vm)->last_error = (error)) #define set_reg_(vm,r,x) \ do { \ if ( REGOK_(r) ) vm->reg[r] = (x); \ } while (FALSE) #define set_rA_(vm,x) set_reg_(vm,A_,x) #define set_rX_(vm,x) set_reg_(vm,X_,x) #define set_rJ_(vm,x) set_reg_(vm,J_,(x)&MIX_SHORT_MAX) #define set_rI_(vm,idx,x) set_reg_(vm,(idx) + I1_ - 1,x) #define set_cell_(vm,addr,x) \ do { \ if ( MEMOK_(addr) ) (vm)->cell[addr] = (x); \ } while (FALSE) #define set_cmp_(vm,x) (vm)->cmpflag = (x) #define set_over_(vm,x) (vm)->overflow = (x) #define set_loc_(vm,x) (vm)->loc_count = (MEMOK_(x)? (x) : MIX_SHORT_ZERO) #define set_status_(vm,s) ((vm)->status = (s)) #define is_halted_(vm) ((vm)->status == MIX_VM_HALT) #define halt_(vm,val) ((vm)->status = (val)? MIX_VM_HALT : MIX_VM_RUNNING) #define inc_loc_(vm) \ do { \ if (++(vm->loc_count) == MEM_CELLS_NO_) \ { vm->loc_count--; halt_(vm, TRUE); } \ } while(FALSE) #define set_start_(vm,val) ((vm)->start_addr = (val)) #define reset_loc_(vm) set_loc_ (vm, vm->start_addr) #define update_time_(vm,ins) mix_vm_clock_add_lapse (get_clock_(vm), ins) /* Breakpoints handling */ #define bp_clear_all_(vm) memset (vm->bp, 0, MEM_CELLS_NO_/8) #define bp_set_(vm,addr) vm->bp[(addr)>>3] |= 1 << ((addr)&7) #define bp_clear_(vm,addr) vm->bp[(addr)>>3] &= ~(1 << ((addr)&7)) #define bp_is_set_(vm,addr) vm->bp[(addr)>>3] & (1 << ((addr)&7)) /* Instruction handlers */ typedef gboolean (*ins_handler_t_)(mix_vm_t *,const mix_ins_t *); extern ins_handler_t_ ins_handlers_[MIX_BYTE_MAX + 1]; #endif /* XMIX_VM_H */ mdk-1.2.9/mixlib/mix_vm_command.c0000644000175000017500000003724312262420271013653 00000000000000/* -*-c-*- -------------- mix_vm_command.c : * Implementation of the functions declared in mix_vm_command.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ #include "xmix_vm_command.h" #include "xmix_vm_handlers.h" #include "completion.h" #ifdef HAVE_LIBHISTORY # include #endif #ifdef HAVE_LIBREADLINE # include #endif /* hook execution */ static void exec_hook_list_ (GSList *list, mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { while (list) { hook_ *hook = (hook_ *)list->data; if (hook) (hook->func)(dis, arg, hook->data); list = list->next; } } static void exec_global_hook_list_ (GSList *list, mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg) { while (list) { global_hook_ *hook = (global_hook_ *)list->data; if (hook) (hook->func)(dis, cmd, arg, hook->data); list = list->next; } } /* conversion from/to commands to strings */ const gchar * mix_vm_command_to_string (mix_vm_command_t cmd) { if (cmd < MIX_CMD_INVALID) return commands_[cmd].name; else return NULL; } mix_vm_command_t mix_vm_command_from_string (const gchar *name) { gint cmd = 0; while (cmd < MIX_CMD_INVALID && strcmp (name, commands_[cmd].name)) ++cmd; return cmd; } /* get help string about a command */ const gchar * mix_vm_command_help (mix_vm_command_t cmd) { if (cmd < MIX_CMD_INVALID) return commands_[cmd].doc; else return NULL; } const gchar * mix_vm_command_usage (mix_vm_command_t cmd) { if (cmd < MIX_CMD_INVALID) return commands_[cmd].usage; else return NULL; } /* create a new command dispatcher */ static Completion * make_completions_ (void) { GList *cmds = NULL; gint k; Completion *completions = completion_new (NULL); for (k = 0; k < MIX_CMD_INVALID; ++k) cmds = g_list_append (cmds, (gpointer) mix_vm_command_to_string (k)); completion_add_items (completions, cmds); return completions; } mix_vm_cmd_dispatcher_t * mix_vm_cmd_dispatcher_new (FILE *out_fd, /* output messages file */ FILE *err_fd /* error messages file */) { mix_vm_cmd_dispatcher_t *result = NULL; int k; /* g_return_val_if_fail (out_fd && err_fd, NULL); */ result = g_new (mix_vm_cmd_dispatcher_t, 1); result->result = TRUE; result->out = out_fd; result->err = err_fd; result->log_msg = TRUE; result->uptime = result->laptime = result->progtime = 0; result->printtime = TRUE; result->trace = FALSE; result->program = NULL; result->editor = NULL; result->assembler = NULL; result->eval = mix_eval_new (); result->dump = mix_dump_context_new (out_fd, MIX_SHORT_ZERO, MIX_SHORT_ZERO, MIX_DUMP_ALL); result->vm = mix_vm_new (); result->global_pre = result->global_post = NULL; for (k =0; k < MIX_CMD_INVALID; ++k) result->pre_hooks[k] = result->post_hooks[k] = NULL; result->config = NULL; for (k = 0; k < PRNO_; ++k) result->preds[k] = mix_predicate_new (k); result->mem_preds = g_hash_table_new (NULL, NULL); result->commands = g_hash_table_new (g_str_hash, g_str_equal); result->completions = make_completions_ (); return result; } mix_vm_cmd_dispatcher_t * mix_vm_cmd_dispatcher_new_with_config (FILE *out, FILE *err, mix_config_t *config) { mix_vm_cmd_dispatcher_t *result = mix_vm_cmd_dispatcher_new (out, err); if (result != NULL && (result->config = config) != NULL) { #ifdef HAVE_LIBHISTORY gint hsize = 0; #endif const gchar *val = mix_config_get (result->config, TRACING_KEY_); if (val) cmd_strace_ (result, val); val = mix_config_get (result->config, EDITOR_KEY_); if (val) mix_vm_cmd_dispatcher_set_editor (result, val); val = mix_config_get (result->config, ASM_KEY_); if (val) mix_vm_cmd_dispatcher_set_assembler (result, val); val = mix_config_get (result->config, TIMING_KEY_); if (val) cmd_stime_ (result, val); val = mix_config_get_devices_dir (result->config); if (!val || !mix_stat_dir (val, "devices")) { gchar *dirname = g_path_get_dirname (mix_config_get_filename (config)); cmd_sddir_ (result, dirname); g_free (dirname); } else mix_device_set_dir (val); val = mix_config_get (result->config, LOGGING_KEY_); if (val) cmd_slog_ (result, val); #ifdef HAVE_LIBHISTORY val = mix_config_get_history_file (result->config); hsize = mix_config_get_history_size (result->config); using_history (); stifle_history (hsize); if (val) { read_history ((char *)val); history_set_pos (history_base + history_length - 1); } #endif } return result; } /* delete (does not close the fds in the constructor) */ static gboolean del_pred_ (gpointer key, gpointer val, gpointer data) { if (val) mix_predicate_delete ((mix_predicate_t *)val); return TRUE; } static void del_hook_ (gpointer data, gpointer ignored) { if (data) g_free (data); } static void del_hook_list_ (GSList *s) { if (s) { g_slist_foreach (s, del_hook_, NULL); g_slist_free (s); } } void mix_vm_cmd_dispatcher_delete (mix_vm_cmd_dispatcher_t *dis) { #ifdef HAVE_LIBHISTORY const gchar *hfile = NULL; #endif gint k; g_return_if_fail (dis != NULL); mix_eval_delete (dis->eval); mix_dump_context_delete (dis->dump); mix_vm_delete (dis->vm); if (dis->editor) g_free (dis->editor); if (dis->editor) g_free (dis->assembler); #ifdef HAVE_LIBHISTORY if (dis->config && (hfile = mix_config_get_history_file (dis->config))) write_history ((char *)hfile); #endif for (k = 0; k < PRNO_; ++k) mix_predicate_delete (dis->preds[k]); g_hash_table_foreach_remove (dis->mem_preds, del_pred_, NULL); g_hash_table_destroy (dis->mem_preds); g_hash_table_destroy (dis->commands); completion_free (dis->completions); for (k = 0; k < MIX_CMD_INVALID; ++k) { del_hook_list_ (dis->pre_hooks[k]); del_hook_list_ (dis->post_hooks[k]); } del_hook_list_ (dis->global_pre); del_hook_list_ (dis->global_post); g_free (dis); } /* register new commands for a dispatcher */ void mix_vm_cmd_dispatcher_register_new (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_info_t *cmd) { GList *list = NULL; g_return_if_fail (dis != NULL); g_return_if_fail (cmd != NULL); g_hash_table_insert (dis->commands, (gpointer)cmd->name, (gpointer)cmd); list = g_list_append (list, (gpointer)cmd->name); completion_add_items (dis->completions, list); } const GList * mix_vm_cmd_dispatcher_complete (const mix_vm_cmd_dispatcher_t *dis, const gchar *cmd, gchar **prefix) { char *cp; GList *result; g_return_val_if_fail (dis != NULL, NULL); g_return_val_if_fail (cmd != NULL, NULL); cp = g_strdup (cmd); result = completion_complete (dis->completions, cp, prefix); g_free (cp); return result; } /* set/get out/error streams */ FILE * mix_vm_cmd_dispatcher_get_out_stream (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis, NULL); return dis->out; } FILE * mix_vm_cmd_dispatcher_get_err_stream (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis, NULL); return dis->err; } FILE * /* old output stream */ mix_vm_cmd_dispatcher_set_out_stream (mix_vm_cmd_dispatcher_t *dis, FILE *out) { FILE *old = NULL; g_return_val_if_fail (dis != NULL, old); old = dis->out; dis->out = out; dis->dump->channel = out; return old; } FILE * /* old error stream */ mix_vm_cmd_dispatcher_set_error_stream (mix_vm_cmd_dispatcher_t *dis, FILE *err) { FILE *old = NULL; g_return_val_if_fail (dis != NULL, old); old = dis->err; dis->err = err; return old; } /* set editor and compiler templates */ void mix_vm_cmd_dispatcher_set_editor (mix_vm_cmd_dispatcher_t *dis, const gchar *edit_tplt) { g_return_if_fail (dis != NULL); if (dis->editor) g_free (dis->editor); dis->editor = (edit_tplt) ? g_strdup (edit_tplt) : NULL; if (dis->config && dis->editor) mix_config_update (dis->config, EDITOR_KEY_, dis->editor); } void mix_vm_cmd_dispatcher_set_assembler (mix_vm_cmd_dispatcher_t *dis, const gchar *asm_tplt) { g_return_if_fail (dis != NULL); if (dis->assembler) g_free (dis->assembler); dis->assembler = (asm_tplt) ? g_strdup (asm_tplt) : NULL; if (dis->config && dis->assembler) mix_config_update (dis->config, ASM_KEY_, dis->assembler); } const gchar * mix_vm_cmd_dispatcher_get_editor (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, NULL); return dis->editor; } const gchar * mix_vm_cmd_dispatcher_get_assembler (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, NULL); return dis->assembler; } const gchar * mix_vm_cmd_dispatcher_get_src_file_path (const mix_vm_cmd_dispatcher_t *dis) { static gchar *PATH = NULL; const mix_vm_t *vm = mix_vm_cmd_dispatcher_get_vm (dis); const mix_src_file_t *f = mix_vm_get_src_file (vm); if (PATH) { g_free (PATH); PATH = NULL; } if (f) PATH = mix_file_complete_name (mix_src_file_get_path (f), MIX_SRC_DEFEXT); return PATH; } const gchar * mix_vm_cmd_dispatcher_get_program_path (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, NULL); return dis->program; } /* install hooks */ void mix_vm_cmd_dispatcher_pre_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, mix_vm_cmd_hook_t hook, gpointer data) { hook_ *phook; g_return_if_fail (dis != NULL); g_return_if_fail (cmd < MIX_CMD_INVALID); phook = g_new (hook_, 1); phook->func = hook; phook->data = data; dis->pre_hooks[cmd] = g_slist_append (dis->pre_hooks[cmd], phook); } void mix_vm_cmd_dispatcher_post_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, mix_vm_cmd_hook_t hook, gpointer data) { hook_ *phook; g_return_if_fail (dis != NULL); g_return_if_fail (cmd < MIX_CMD_INVALID); phook = g_new (hook_, 1); phook->func = hook; phook->data = data; dis->post_hooks[cmd] = g_slist_append (dis->post_hooks[cmd], phook); } void mix_vm_cmd_dispatcher_global_pre_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_cmd_global_hook_t hook, gpointer data) { global_hook_ *phook; g_return_if_fail (dis != NULL); phook = g_new (global_hook_, 1); phook->func = hook; phook->data = data; dis->global_pre = g_slist_append (dis->global_pre, phook); } void mix_vm_cmd_dispatcher_global_post_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_cmd_global_hook_t hook, gpointer data) { global_hook_ *phook; g_return_if_fail (dis != NULL); phook = g_new (global_hook_, 1); phook->func = hook; phook->data = data; dis->global_post = g_slist_append (dis->global_post, phook); } /* dispatch a command */ gboolean /* TRUE if success, FALSE otherwise */ mix_vm_cmd_dispatcher_dispatch (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg) { g_return_val_if_fail (dis != NULL, FALSE); if (dis->global_pre) exec_global_hook_list_ (dis->global_pre, dis, cmd, arg); if (cmd < MIX_CMD_INVALID) { if (dis->pre_hooks[cmd]) exec_hook_list_ (dis->pre_hooks[cmd], dis, arg); fflush (dis->out); fflush (dis->err); dis->result = (commands_[cmd].func)(dis, arg); fflush (dis->out); fflush (dis->err); if (dis->post_hooks[cmd]) exec_hook_list_ (dis->post_hooks[cmd], dis, arg); fflush (dis->out); fflush (dis->err); } else { fprintf (dis->err, _("Unknown command. Try: help\n")); } if (dis->global_post) exec_global_hook_list_ (dis->global_post, dis, cmd, arg); fflush (dis->out); fflush (dis->err); return dis->result; } /* dispatch a command in text format */ gboolean mix_vm_cmd_dispatcher_dispatch_text (mix_vm_cmd_dispatcher_t *dis, const gchar *text) { gchar *cp, *arg = ""; int k = 0; g_return_val_if_fail (dis != NULL, FALSE); g_return_val_if_fail (text != NULL, FALSE); cp = g_strdup (text); while (cp[k] && !isspace (cp[k])) ++k; if (cp[k]) { cp[k] = '\0'; ++k; while (cp[k] && isspace (cp[k])) ++k; arg = cp + k; } (void) mix_vm_cmd_dispatcher_dispatch_split_text (dis, cp, arg); g_free (cp); return dis->result; } /* dispatch a command in text format, with command and arg split */ gboolean mix_vm_cmd_dispatcher_dispatch_split_text (mix_vm_cmd_dispatcher_t *dis, const gchar *command, const gchar *arg) { mix_vm_command_info_t *info; g_return_val_if_fail (dis, FALSE); if (!command) return FALSE; if (!arg) arg = ""; info = (mix_vm_command_info_t *)g_hash_table_lookup (dis->commands, command); if (info) { if (dis->global_pre) exec_global_hook_list_ (dis->global_pre, dis, MIX_CMD_LOCAL, arg); fflush (dis->out); fflush (dis->err); dis->result = info->func (dis, arg); fflush (dis->out); fflush (dis->err); if (dis->global_post) exec_global_hook_list_ (dis->global_post, dis, MIX_CMD_LOCAL, arg); fflush (dis->out); fflush (dis->err); } else dis->result = mix_vm_cmd_dispatcher_dispatch (dis, mix_vm_command_from_string (command), arg); return dis->result; } /* get the last dispatch's result */ gboolean mix_vm_cmd_dispatcher_get_last_result (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, FALSE); return dis->result; } /* get total uptime */ mix_time_t mix_vm_cmd_dispatcher_get_uptime (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, 0); return dis->uptime; } /* get program total time */ mix_time_t mix_vm_cmd_dispatcher_get_progtime (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, 0); return dis->progtime; } /* get time lapse */ mix_time_t mix_vm_cmd_dispatcher_get_laptime (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, 0); return dis->laptime; } /* toggle time printing */ void mix_vm_cmd_dispatcher_print_time (mix_vm_cmd_dispatcher_t * dis, gboolean print) { g_return_if_fail (dis != NULL); dis->printtime = print; } /* get the mix vm */ const mix_vm_t * mix_vm_cmd_dispatcher_get_vm (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, NULL); return dis->vm; } /* src file info */ gulong mix_vm_cmd_dispatcher_get_src_file_lineno (const mix_vm_cmd_dispatcher_t *dis) { g_return_val_if_fail (dis != NULL, 0); return mix_vm_get_break_lineno (dis->vm); } const gchar * mix_vm_cmd_dispatcher_get_src_file_line (const mix_vm_cmd_dispatcher_t *dis, gulong line, gboolean cr) { const mix_src_file_t *file; g_return_val_if_fail (dis != NULL, NULL); file = mix_vm_get_src_file (dis->vm); if (line == 0 || file == NULL) return cr? "" : "\n"; if (cr) return mix_src_file_get_line (file, line); else { enum {BUFF_SIZE = 256}; static gchar BUFFER[BUFF_SIZE]; int len = g_snprintf (BUFFER, BUFF_SIZE, "%s", mix_src_file_get_line (file, line)); if (len > 0 && BUFFER[len - 1] == '\n') BUFFER[len - 1] = '\0'; return BUFFER; } } mdk-1.2.9/mixlib/gettext.h0000644000175000017500000000576312112755472012361 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ mdk-1.2.9/mixlib/mix_predicate_list.c0000644000175000017500000000610512112755472014527 00000000000000/* -*-c-*- -------------- mix_predicate_list.c : * Implementation of the functions declared in mix_predicate_list.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix_predicate_list.h" /* the predicate list type */ struct mix_predicate_list_t { GSList *predicates; const mix_vm_t *vm; const mix_predicate_t *last; }; /* a list of predicates */ mix_predicate_list_t * mix_predicate_list_new (const mix_vm_t *vm) { mix_predicate_list_t *result; g_return_val_if_fail (vm != NULL, NULL); result = g_new (mix_predicate_list_t, 1); result->predicates = NULL; result->vm = vm; result->last = NULL; return result; } void mix_predicate_list_delete (mix_predicate_list_t *list) { g_return_if_fail (list != NULL); g_slist_free (list->predicates); g_free (list); } /* evaluate the predicate list */ gboolean mix_predicate_list_eval (mix_predicate_list_t *list) { GSList *node; g_return_val_if_fail (list != NULL, FALSE); node = list->predicates; while (node) { mix_predicate_t *pred = (mix_predicate_t *)(node->data); if (mix_predicate_eval (pred, list->vm)) { list->last = pred; return TRUE; } node = node->next; } list->last = NULL; return FALSE; } /* add/remove predicates to the list */ void mix_predicate_list_add (mix_predicate_list_t *list, mix_predicate_t *predicate) { g_return_if_fail (list != NULL); g_return_if_fail (predicate != NULL); if (!g_slist_find (list->predicates, predicate)) list->predicates = g_slist_append (list->predicates, (gpointer)predicate); (void)mix_predicate_eval (predicate, list->vm); } gboolean mix_predicate_list_remove (mix_predicate_list_t *list, mix_predicate_t *predicate) { g_return_val_if_fail (list != NULL, FALSE); g_return_val_if_fail (predicate != NULL, FALSE); if (g_slist_find (list->predicates, predicate)) { list->predicates = g_slist_remove (list->predicates, predicate); return TRUE; } else return FALSE; } void mix_predicate_list_clear (mix_predicate_list_t *list) { g_return_if_fail (list != NULL); g_slist_free (list->predicates); list->predicates = NULL; list->last = NULL; } const mix_predicate_t * mix_predicate_list_last_true_eval (const mix_predicate_list_t *list) { g_return_val_if_fail (list != NULL, NULL); return list->last; } mdk-1.2.9/mixlib/mix_io.c0000644000175000017500000001150112112755472012137 00000000000000/* -*-c-*- --------------- mix_io.c : * Implementation of the functions declared in mix_io.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "xmix_io.h" mix_iochannel_t * mix_io_new (FILE *file) { mix_iochannel_t *result; g_return_val_if_fail (file != NULL, NULL); result = g_new (mix_iochannel_t, 1); result->file = file; return result; } void mix_io_delete (mix_iochannel_t *ch) { if (ch != NULL) { fclose (ch->file); g_free (ch); } } FILE * mix_io_to_FILE (mix_iochannel_t *ioc) { if (ioc == NULL) return NULL; return ioc->file; } gboolean mix_io_eof (mix_iochannel_t *ioc) { if (ioc == NULL) return TRUE; return is_eof_ (ioc); } gboolean mix_io_is_ready (mix_iochannel_t *ioc) { if (ioc == NULL) return FALSE; return is_ready_ (ioc); } gboolean mix_io_write_byte (mix_iochannel_t *ioc, mix_byte_t b) { if (ioc == NULL) return FALSE; return write_data_ (ioc, &b, 1); } gboolean mix_io_write_byte_array (mix_iochannel_t *ioc, const mix_byte_t *b, size_t s) { if (ioc == NULL || b == NULL) return FALSE; return write_data_ (ioc, b, s); } mix_byte_t mix_io_read_byte (mix_iochannel_t *ioc) { mix_byte_t result = MIX_BYTE_ZERO; if (ioc != NULL) (void)read_data_ (ioc, &result, 1); return result; } gboolean mix_io_read_byte_array (mix_iochannel_t *ioc, mix_byte_t *b, size_t s) { return (ioc != NULL) && (b != NULL) && read_data_ (ioc, b, s); } gboolean mix_io_write_word (mix_iochannel_t *ioc, mix_word_t w) { return (ioc != NULL) && write_data_ (ioc, &w, 1); } gboolean mix_io_write_word_array (mix_iochannel_t *ioc, const mix_word_t *w, size_t s) { return (ioc != NULL) && (w != NULL) && write_data_ (ioc, w, s); } mix_word_t mix_io_read_word (mix_iochannel_t *ioc) { mix_word_t result = MIX_WORD_ZERO; if (ioc != NULL) (void)read_data_ (ioc, &result, 1); return result; } gboolean mix_io_read_word_array (mix_iochannel_t *ioc, mix_word_t *w, size_t s) { return (ioc != NULL) && (w != NULL) && read_data_ (ioc, w, s); } gboolean mix_io_write_short (mix_iochannel_t *ioc, mix_short_t w) { return (ioc != NULL) && write_data_ (ioc, &w, 1); } gboolean mix_io_write_short_array (mix_iochannel_t *ioc, const mix_short_t *w, size_t s) { return (ioc != NULL) && (w != NULL) && write_data_ (ioc, w, s); } mix_short_t mix_io_read_short (mix_iochannel_t *ioc) { mix_short_t result = MIX_SHORT_ZERO; if (ioc != NULL) (void)read_data_ (ioc, &result, 1); return result; } gboolean mix_io_read_short_array (mix_iochannel_t *ioc, mix_short_t *w, size_t s) { return (ioc != NULL) && (w != NULL) && read_data_ (ioc, w, s); } gboolean mix_io_write_char (mix_iochannel_t *ioc, mix_char_t c) { guchar value = mix_char_to_ascii (c); return (ioc != NULL) && write_data_ (ioc, &value, 1); } mix_char_t mix_io_read_char (mix_iochannel_t *ioc) { guchar value = MIX_CHAR_MAX; if (ioc != NULL) (void)read_data_ (ioc, &value, 1); return mix_ascii_to_char (value); } gboolean mix_io_write_word_array_as_char (mix_iochannel_t *ioc, const mix_word_t *w, size_t s) { guint k, j; guchar value; if ((ioc == NULL) || (w == NULL)) return FALSE; for (k = 0; k < s; k++) for (j = 1; j < 6; j++) { mix_char_t ch = mix_byte_to_char (mix_word_get_byte (w[k], j)); value = mix_char_to_ascii (ch); if (!write_data_ (ioc, &value, 1)) return FALSE; } value = '\n'; return write_data_ (ioc, &value, 1); } gboolean mix_io_read_word_array_as_char (mix_iochannel_t *ioc, mix_word_t *w, size_t s) { guint k, j; guchar value; gboolean eol = FALSE; mix_char_t spc = mix_ascii_to_char (' '); if ((ioc == NULL) || (w == NULL)) return FALSE; for (k = 0; k < s && !eol; k++) for (j = 1; j < 6; j++) { if (!eol && !read_data_ (ioc, &value, 1)) return FALSE; eol = eol || (value == '\n') || is_eof_ (ioc); mix_word_set_byte (&w[k], j, eol? spc : mix_ascii_to_char (value)); } for (; k < s; ++k) w[k] = MIX_WORD_ZERO; while (!eol && !is_eof_ (ioc) && value != '\n') if (!read_data_ (ioc, &value, 1)) return FALSE; return TRUE; } mdk-1.2.9/mixlib/xmix_device.h0000644000175000017500000000533212112755472013171 00000000000000/* -*-c-*- ---------------- xmix_device.h : * Protected declarations for mix_device_t * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_DEVICE_H #define XMIX_DEVICE_H #include "mix_file.h" #include "mix_device.h" /* device file directory */ extern gchar *DEV_DIR_; /* table of overridable device operations */ typedef gboolean (*mix_dev_write_func_t) (mix_device_t *, const mix_word_t *); typedef gboolean (*mix_dev_read_func_t) (mix_device_t *, mix_word_t *); typedef gboolean (*mix_dev_ioc_func_t) (mix_device_t *, mix_short_t); typedef gboolean (*mix_dev_busy_func_t) (const mix_device_t *); typedef void (*mix_dev_destroy_t) (mix_device_t *); typedef struct mix_device_vtable_t { mix_dev_write_func_t write; mix_dev_read_func_t read; mix_dev_ioc_func_t ioc; mix_dev_busy_func_t busy; mix_dev_destroy_t destroy; } mix_device_vtable_t; /* default vtables */ extern const mix_device_vtable_t *DEF_DEV_VTABLE_; extern const mix_device_vtable_t *CONSOLE_DEV_VTABLE_; /* Actual definition of a mix device, which can be cast to a mix file. */ struct mix_device_t { mix_iochannel_t *file; mix_device_type_t type; const mix_device_vtable_t *vtable; }; /* constructors */ extern void construct_device_ (mix_device_t *dev, mix_device_type_t type); extern void construct_device_with_name_ (mix_device_t *dev, mix_device_type_t type, const gchar *name); extern void construct_device_with_file_ (mix_device_t *dev, mix_device_type_t type, FILE *file); #define GET_CHANNEL_(dev) (dev->file) #define GET_FILE_(dev) ((mix_file_t *)(dev->file)) /* default extension for device files */ extern const char *DEV_EXT_; /* default names for device files */ extern const char *DEF_NAMES_[]; /* block sizes for devices */ extern const size_t SIZES_[]; /* io modes for devices */ extern const mix_device_mode_t MODES_[]; /* files modes for devices */ extern const mix_fmode_t FMODES_[]; #endif /* XMIX_DEVICE_H */ mdk-1.2.9/mixlib/mix_config.h0000644000175000017500000000562512112755472013014 00000000000000/* -*-c-*- ---------------- mix_config.h : * Basic config storage utility. * ------------------------------------------------------------------ * Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_CONFIG_H #define MIX_CONFIG_H #include "mix.h" /* default config dir */ extern const gchar *MIX_CONFIG_DIR; /* the config type */ typedef struct mix_config_t mix_config_t; /* create a new config handler, giving the dir and name of the config file */ extern mix_config_t * mix_config_new (const gchar *dirname, const gchar *filename); /* delete a config handler, saving the configuration if needed */ extern void mix_config_delete (mix_config_t *config); /* get the config filename (fully qualified) */ extern const gchar * mix_config_get_filename (const mix_config_t *config); /* get a config item's value from its key */ extern const gchar * mix_config_get (const mix_config_t *config, const gchar *key); extern gint mix_config_get_integer (const mix_config_t *config, const gchar *key); /* update (or create if it does not exist) a new config item */ extern void mix_config_update (mix_config_t *config, const gchar *key, const gchar *value); extern void mix_config_update_integer (mix_config_t *config, const gchar *key, gint value); extern void mix_config_remove (mix_config_t *config, const gchar *key); /* save the current configuration */ extern void mix_config_save (const mix_config_t *config); /** shared config params **/ /* set autosave on delete flag */ extern void mix_config_set_autosave (mix_config_t *config, gboolean autosave); extern gboolean mix_config_is_autosave (const mix_config_t *config); /* devices dir*/ extern void mix_config_set_devices_dir (mix_config_t *config, const gchar *dirname); extern const gchar * mix_config_get_devices_dir (const mix_config_t *config); /* history file. if relative path, config dir taken as root */ extern void mix_config_set_history_file (mix_config_t *config, const gchar *path); extern const gchar * mix_config_get_history_file (const mix_config_t *config); extern void mix_config_set_history_size (mix_config_t *config, gint s); extern gint mix_config_get_history_size (const mix_config_t *config); #endif /* MIX_CONFIG_H */ mdk-1.2.9/mixlib/mix_eval_scanner.c0000644000175000017500000016052412262430570014175 00000000000000#line 2 "mix_eval_scanner.c" #line 4 "mix_eval_scanner.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char yytext[]; static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( yytext, (yytext_ptr), yyleng + 1 ); \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 19 #define YY_END_OF_BUFFER 20 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_acclist[94] = { 0, 20, 2, 19, 1, 2, 19, 3, 19, 18, 19, 17, 18, 19, 17, 19, 14, 18, 19, 18, 19, 18, 19, 15, 18, 19, 18, 19, 16, 18, 19, 10, 19, 9, 10, 19, 9, 19, 10, 19,16391, 10, 19, 10, 19, 10, 19,16390,16391, 10, 19, 16391, 1, 13, 11, 12, 11, 15, 15, 16, 16, 16, 8199,16391,16390,16391,16391, 8, 8, 8, 8198, 8199, 4, 8198, 8199, 5, 8198, 8199,16391,16391, 12, 12,16391,16391,16391, 8, 8,16391,16391, 8, 8, 8, 8, 8 } ; static yyconst flex_int16_t yy_accept[73] = { 0, 1, 1, 1, 1, 1, 1, 1, 2, 4, 7, 9, 11, 14, 16, 19, 21, 23, 26, 28, 31, 33, 36, 38, 41, 43, 45, 49, 52, 53, 54, 55, 56, 58, 58, 59, 60, 61, 62, 62, 63, 63, 63, 64, 66, 67, 68, 68, 69, 70, 70, 72, 75, 78, 79, 80, 81, 82, 83, 84, 85, 85, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 1, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[14] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[73] = { 0, 0, 2, 5, 0, 18, 0, 63, 159, 59, 159, 159, 159, 159, 26, 49, 49, 29, 0, 32, 159, 159, 159, 44, 51, 59, 71, 74, 56, 159, 49, 77, 33, 0, 0, 0, 28, 0, 89, 159, 87, 28, 0, 0, 90, 98, 105, 108, 111, 123, 159, 159, 159, 116, 119, 23, 0, 0, 122, 125, 133, 25, 21, 0, 136, 139, 0, 142, 145, 20, 0, 159, 0 } ; static yyconst flex_int16_t yy_def[73] = { 0, 72, 72, 71, 3, 71, 5, 71, 71, 71, 71, 71, 71, 71, 71, 14, 14, 71, 14, 71, 71, 71, 71, 71, 71, 71, 71, 23, 71, 71, 14, 71, 30, 14, 17, 19, 19, 19, 71, 71, 71, 40, 23, 26, 23, 71, 71, 45, 45, 71, 71, 71, 71, 23, 23, 31, 31, 23, 23, 23, 71, 60, 48, 48, 23, 23, 45, 45, 45, 68, 68, 0, 71 } ; static yyconst flex_int16_t yy_nxt[173] = { 0, 8, 9, 10, 9, 10, 11, 12, 13, 12, 12, 14, 15, 12, 15, 16, 17, 18, 19, 20, 21, 22, 20, 20, 23, 24, 25, 24, 20, 26, 20, 27, 29, 69, 62, 60, 55, 30, 40, 31, 34, 36, 35, 36, 32, 37, 38, 39, 39, 39, 40, 40, 39, 40, 41, 71, 40, 42, 28, 33, 32, 28, 43, 71, 44, 45, 46, 71, 46, 71, 47, 71, 48, 49, 50, 51, 52, 40, 40, 50, 40, 41, 43, 40, 44, 53, 71, 54, 55, 71, 56, 38, 39, 57, 71, 71, 71, 71, 58, 71, 59, 53, 71, 54, 60, 60, 71, 60, 61, 71, 60, 45, 71, 71, 71, 71, 47, 71, 48, 47, 71, 48, 62, 71, 63, 49, 50, 53, 71, 53, 53, 71, 54, 58, 71, 59, 64, 71, 65, 66, 71, 71, 71, 71, 67, 71, 68, 64, 71, 64, 64, 71, 65, 67, 71, 68, 69, 71, 70, 7, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71 } ; static yyconst flex_int16_t yy_chk[173] = { 0, 72, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 14, 69, 62, 61, 55, 14, 41, 14, 17, 36, 17, 19, 32, 19, 23, 23, 23, 23, 23, 23, 23, 23, 23, 30, 23, 24, 28, 16, 15, 9, 24, 7, 24, 25, 25, 0, 25, 0, 25, 0, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 0, 27, 31, 0, 31, 38, 38, 40, 0, 0, 0, 0, 40, 0, 40, 44, 0, 44, 45, 45, 0, 45, 45, 0, 45, 46, 0, 0, 0, 0, 46, 0, 46, 47, 0, 47, 48, 0, 48, 49, 49, 53, 0, 53, 54, 0, 54, 58, 0, 58, 59, 0, 59, 60, 0, 0, 0, 0, 60, 0, 60, 64, 0, 64, 65, 0, 65, 67, 0, 67, 68, 0, 68, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71 } ; extern int yy_flex_debug; int yy_flex_debug = 0; static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; static char *yy_full_match; static int yy_lp; static int yy_looking_for_trail_begin = 0; static int yy_full_lp; static int *yy_full_state; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ (yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ (yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ ++(yy_lp); \ goto find_rule; \ } #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *yytext_ptr; #line 1 "../../mixlib/mix_eval_scanner.l" /* -*-c-*- ------------------ mix_eval_scanner.l : * scanner used by mix_eval_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #line 23 "../../mixlib/mix_eval_scanner.l" #include #include "mix.h" #include "xmix_eval.h" #define YY_DECL \ mix_eval_result_t mix_eval_expr (mix_eval_data_ *data) /* keep track of current position in buffer */ #define YY_USER_ACTION yypos += yyleng; #define RETURN_STATE(err) \ do { \ done = TRUE; \ state = err; \ BEGIN (INITIAL); \ } while (FALSE) #define CLEAN_UP() \ do { \ yy_delete_buffer (buffer); \ g_free (expr_cp); \ } while (FALSE) static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y); static int unput_word_ (mix_word_t word); #define YY_NO_INPUT 1 #line 604 "mix_eval_scanner.c" #define INITIAL 0 #define EVAL 1 #define WEVAL 2 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); int yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = NULL; static void yy_push_state (int new_state ); static void yy_pop_state (void ); /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 81 "../../mixlib/mix_eval_scanner.l" YY_BUFFER_STATE buffer; mix_word_t expr_val = MIX_WORD_ZERO, wexpr_val = MIX_WORD_ZERO; mix_word_t wexpr_val_tmp = MIX_WORD_ZERO; mix_eval_result_t state = MIX_EVAL_OK; gchar *expr_cp; gint yypos = -22; /* to account for padding */ gboolean is_fp = FALSE, done = FALSE; g_assert (data != NULL && data->expr != NULL); /* make room enough to unput computed values */ expr_cp = g_strdup_printf ("%-20s%s"," ", data->expr); buffer = yy_scan_string (expr_cp); data->errpos = -1; #line 820 "mix_eval_scanner.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif /* Create the reject buffer large enough to save one state per allowed character. */ if ( ! (yy_state_buf) ) (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); if ( ! (yy_state_buf) ) YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 72 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 159 ); yy_find_action: yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[(yy_lp)]; if ( yy_act & YY_TRAILING_HEAD_MASK || (yy_looking_for_trail_begin) ) { if ( yy_act == (yy_looking_for_trail_begin) ) { (yy_looking_for_trail_begin) = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; } else { (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); break; } ++(yy_lp); goto find_rule; } --yy_cp; yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(EVAL): case YY_STATE_EOF(WEVAL): #line 99 "../../mixlib/mix_eval_scanner.l" { CLEAN_UP (); return MIX_EVAL_INTERN; } YY_BREAK case 1: YY_RULE_SETUP #line 105 "../../mixlib/mix_eval_scanner.l" /* eat whitespace */ YY_BREAK case 2: YY_RULE_SETUP #line 106 "../../mixlib/mix_eval_scanner.l" { if (!done && state == MIX_EVAL_OK) { yypos -= yyleng; yyless (0); yy_push_state (WEVAL); } else { CLEAN_UP (); if (state == MIX_EVAL_OK) return (MIX_EVAL_SYNTAX); data->errpos = yypos; return state; } } YY_BREAK case 3: /* rule 3 can match eol */ YY_RULE_SETUP #line 117 "../../mixlib/mix_eval_scanner.l" { CLEAN_UP(); if (state == MIX_EVAL_OK) data->value = wexpr_val; else data->errpos = yypos; return state; } YY_BREAK case 4: YY_RULE_SETUP #line 128 "../../mixlib/mix_eval_scanner.l" { is_fp = TRUE; wexpr_val_tmp = mix_word_new (atol (yytext)); } YY_BREAK case 5: YY_RULE_SETUP #line 132 "../../mixlib/mix_eval_scanner.l" { glong val = atol (yytext); if ( !is_fp ) { RETURN_STATE (MIX_EVAL_MIS_PAREN); } else if ( val < 0 || val > MIX_BYTE_MAX || !mix_fspec_is_valid (mix_byte_new (val)) ) { RETURN_STATE (MIX_EVAL_INV_FSPEC); } else { is_fp = FALSE; wexpr_val = mix_word_store_field (mix_byte_new (val), wexpr_val_tmp, wexpr_val); } } YY_BREAK case 6: /* rule 6 can match eol */ YY_RULE_SETUP #line 146 "../../mixlib/mix_eval_scanner.l" { wexpr_val = mix_word_new (atol (yytext)); } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 149 "../../mixlib/mix_eval_scanner.l" { if (yytext[0] != '*') { yypos -= yyleng; yyless (0); } else { yypos -= yyleng - 1; expr_val = mix_short_to_word_fast (data->loc); yyless (1); } yy_push_state (EVAL); } YY_BREAK case 8: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 163 "../../mixlib/mix_eval_scanner.l" /* eat comma if followed by expression */ YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 164 "../../mixlib/mix_eval_scanner.l" { /* ok if not inside an f-part */ if ( is_fp ) { RETURN_STATE (MIX_EVAL_MIS_PAREN); } unput (yytext[yyleng-1]); --yypos; done = TRUE; yy_pop_state (); } YY_BREAK case 10: YY_RULE_SETUP #line 172 "../../mixlib/mix_eval_scanner.l" RETURN_STATE (MIX_EVAL_SYNTAX); YY_BREAK case 11: YY_RULE_SETUP #line 176 "../../mixlib/mix_eval_scanner.l" { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; mix_word_t value = mix_word_new (atol (s)); expr_val = eval_binop_ (yytext, expr_val, value); } YY_BREAK case 12: YY_RULE_SETUP #line 181 "../../mixlib/mix_eval_scanner.l" { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; if ( !mix_symbol_table_is_defined (data->table, s) ) { RETURN_STATE (MIX_EVAL_UNDEF_SYM); } expr_val = eval_binop_ (yytext, expr_val, mix_symbol_table_value (data->table, s)); } YY_BREAK case 13: YY_RULE_SETUP #line 189 "../../mixlib/mix_eval_scanner.l" { expr_val = eval_binop_ (yytext, expr_val, mix_short_to_word_fast (data->loc)); } YY_BREAK case 14: YY_RULE_SETUP #line 193 "../../mixlib/mix_eval_scanner.l" yypos -= unput_word_ (mix_short_to_word_fast (data->loc)); YY_BREAK case 15: YY_RULE_SETUP #line 194 "../../mixlib/mix_eval_scanner.l" expr_val = mix_word_new (atol (yytext)); YY_BREAK case 16: YY_RULE_SETUP #line 195 "../../mixlib/mix_eval_scanner.l" { if ( !mix_symbol_table_is_defined (data->table, yytext) ) { RETURN_STATE (MIX_EVAL_UNDEF_SYM); } expr_val = mix_symbol_table_value (data->table, yytext); } YY_BREAK case 17: /* rule 17 can match eol */ YY_RULE_SETUP #line 201 "../../mixlib/mix_eval_scanner.l" { unput (yytext[0]); --yypos; yypos -= unput_word_ (expr_val); yy_pop_state (); } YY_BREAK case 18: YY_RULE_SETUP #line 207 "../../mixlib/mix_eval_scanner.l" RETURN_STATE (MIX_EVAL_SYNTAX); YY_BREAK case 19: YY_RULE_SETUP #line 211 "../../mixlib/mix_eval_scanner.l" ECHO; YY_BREAK #line 1128 "mix_eval_scanner.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), (size_t) num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 72 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 72 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 71); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } static void yy_push_state (int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) yyalloc(new_size ); else (yy_start_stack) = (int *) yyrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } static void yy_pop_state (void) { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; (yy_start_stack_ptr) = 0; (yy_start_stack_depth) = 0; (yy_start_stack) = NULL; (yy_state_buf) = 0; (yy_state_ptr) = 0; (yy_full_match) = 0; (yy_lp) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Destroy the start condition stack. */ yyfree((yy_start_stack) ); (yy_start_stack) = NULL; yyfree ( (yy_state_buf) ); (yy_state_buf) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 211 "../../mixlib/mix_eval_scanner.l" static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y) { mix_word_t result = MIX_WORD_ZERO; switch (op[0]) { case '+': result = mix_word_add (x,y); break; case '-': result = mix_word_sub (x,y); break; case '*': mix_word_mul (x, y, NULL, &result); break; case ':': { mix_word_t a; mix_word_mul (x, 8, NULL, &a); result = mix_word_add (a, y); break; } case '/': if ( strlen (op) > 1 && op[1] == '/' ) { mix_word_div (x,MIX_WORD_ZERO,y, &result, NULL); } else { mix_word_div (MIX_WORD_ZERO, x, y, &result, NULL); } break; default: g_assert_not_reached (); } return result; } static int unput_word_ (mix_word_t word) { gchar *value; gint k, result; value = g_strdup_printf ("%s%ld", mix_word_is_negative (word)? "-":"+", mix_word_magnitude (word)); result = strlen (value); for (k = result - 1; k >= 0; --k) unput (value[k]); g_free (value); return result; } mdk-1.2.9/mixlib/xmix_parser.h0000644000175000017500000000741112112755472013226 00000000000000/* -*-c-*- ---------------- xmix_parser.h : * Declarations for the implementation of mix_parser_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_PARSER_H #define XMIX_PARSER_H #include "mix_ins.h" #include "mix_file.h" #include "mix_symbol_table.h" #include "mix_parser.h" /* mix_parser_t definition */ struct mix_parser_t { mix_file_t *in_file; /* the source file to be compiled */ mix_symbol_table_t *symbol_table; mix_symbol_table_t *ls_table; /* literal strings symbols */ guint cur_ls; /* current literal string symbol */ GHashTable *future_refs; /* a map from symbol name to list of addresses */ GTree *ins_table; /* a table of compiled instructions */ GSList *con_list; /* CON instructions */ GSList *alf_list; /* ALF instructions */ mix_address_t loc_count; /* current memory location during compilation */ mix_parser_err_t status; /* outcome of compilation */ guint err_line; /* line of the last error */ guint err_count; /* no. of errors during compilation */ guint warn_count; /* no. of warnings during compilation */ mix_address_t start; /* start address of the compiled code */ mix_address_t end; /* end address of the compiled code */ }; /* each node of the ins_table stores a mix_word_t with the instruction and a source code line (for debugging and listing) */ typedef struct ins_node_ { mix_word_t ins; guint lineno; } ins_node_; /* functions to manipulate mix_parser_t during compilation */ /* access loc counter */ #define get_ploc_(parser) ((parser)->loc_count) /* symbol table */ /* Define a new symbol with given value * and update previously set refs to this symbol */ extern mix_parser_err_t mix_parser_define_symbol_value (mix_parser_t *parser, const gchar *name, mix_word_t value); /* Define a new symbol with value equal to the current loc_count * and update previously set refs to this symbol */ extern mix_parser_err_t mix_parser_define_symbol_here (mix_parser_t *parser, const gchar *name); /* Set a reference to future symbol here */ extern void mix_parser_set_future_ref (mix_parser_t *parser, const gchar *name); /* Redefine the value of a local symbol as the current loc_count */ extern void mix_parser_manage_local_symbol (mix_parser_t *parser, const gchar *name, mix_short_t value); /* Literal strings symbols */ extern void mix_parser_define_ls (mix_parser_t *parser, mix_word_t value); /* Compilation */ /* Add instruction with address the current loc_count */ extern void mix_parser_add_ins (mix_parser_t *parser, const mix_ins_t *new_ins, guint lineno); extern void mix_parser_add_raw (mix_parser_t *parser, mix_word_t word, guint lineno, gboolean is_con); /* Error handling */ extern void mix_parser_log_error (mix_parser_t *parser, mix_parser_err_t error, gint lineno, const gchar *comment, gboolean warn); #endif /* XMIX_PARSER_H */ mdk-1.2.9/mixlib/xmix_device.c0000644000175000017500000001246712112755472013173 00000000000000/* -*-c-*- -------------- xmix_device.c : * Implementation of the functions declared in xmix_device.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "xmix_device.h" #include "mix_types.h" gchar *DEV_DIR_ = NULL; const char *DEV_EXT_ = ".dev"; const char *DEF_NAMES_[] = { "tape0", "tape1", "tape2", "tape3", "tape4", "tape5", "tape6", "tape7", "disk0", "disk1", "disk2", "disk3", "disk4", "disk5", "disk6", "disk7", "cardrd", "cardwr", "printer", "console", "paper" }; const size_t SIZES_[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 16, 16, 24, 14, 14 }; const mix_device_mode_t MODES_[] = { mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_BIN, mix_dev_CHAR, mix_dev_CHAR, mix_dev_CHAR, mix_dev_CHAR, mix_dev_CHAR }; const mix_fmode_t FMODES_[] = { mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_RDWRT, mix_io_READ, mix_io_WRITE, mix_io_WRITE, mix_io_RDWRT, mix_io_READ }; /* constructors */ void construct_device_ (mix_device_t *result, mix_device_type_t type) { gchar *name; name = DEV_DIR_ ? g_strdup_printf ("%s/%s", DEV_DIR_, DEF_NAMES_[type]) : g_strdup (DEF_NAMES_[type]); construct_device_with_name_ (result, type, name); g_free (name); } void construct_device_with_name_ (mix_device_t *result, mix_device_type_t type, const gchar *name) { result->type = type; if (type != mix_dev_CONSOLE) { result->file = MIX_IOCHANNEL(mix_file_new_with_def_ext (name, FMODES_[type], DEV_EXT_)); result->vtable = DEF_DEV_VTABLE_; } else { result->file = mix_io_new (stdout); result->vtable = CONSOLE_DEV_VTABLE_; } } void construct_device_with_file_ (mix_device_t *result, mix_device_type_t type, FILE *file) { result->type = type; result->file = mix_io_new (file); result->vtable = DEF_DEV_VTABLE_; } /* Write a block to the device. */ static gboolean write_ (mix_device_t *dev, const mix_word_t *block) { gboolean result; if (FMODES_[dev->type] == mix_io_READ) return FALSE; if (MODES_[dev->type] == mix_dev_CHAR) result = mix_io_write_word_array_as_char (GET_CHANNEL_ (dev), block, SIZES_[dev->type]); else result = mix_io_write_word_array (GET_CHANNEL_ (dev), block, SIZES_[dev->type]); fflush (mix_io_to_FILE (GET_CHANNEL_ (dev))); return result; } static gboolean read_cons_ (mix_device_t *dev, mix_word_t *block) { return mix_io_read_word_array_as_char (mix_io_new (stdin), block, SIZES_[mix_dev_CONSOLE]); } static gboolean read_ (mix_device_t *dev, mix_word_t *block) { gboolean result; if (FMODES_[dev->type] == mix_io_WRITE) return FALSE; if (MODES_[dev->type] == mix_dev_CHAR) { result = mix_io_read_word_array_as_char (GET_CHANNEL_ (dev), block, SIZES_[dev->type]); } else result = mix_io_read_word_array (GET_CHANNEL_ (dev), block, SIZES_[dev->type]); return result; } static gboolean ioc_ (mix_device_t *dev, mix_short_t arg) { int m; FILE *file; m = mix_short_magnitude(arg); if (mix_short_is_negative(arg)) m = -m; m *= sizeof (mix_word_t) * SIZES_[dev->type]; file = mix_io_to_FILE (GET_CHANNEL_(dev)); if (dev->type >= mix_dev_TAPE_0 && dev->type <= mix_dev_TAPE_7) { if (m == 0) rewind (file); else fseek (file, m, SEEK_CUR); } if (dev->type >= mix_dev_DISK_0 && dev->type <= mix_dev_DISK_7) { if (m == 0) return FALSE; // position disk } if (dev->type == mix_dev_PAPER_TAPE) { if (m == 0) return FALSE; rewind (file); } return TRUE; } static gboolean busy_ (const mix_device_t *dev) { return (!mix_io_is_ready (GET_CHANNEL_(dev))); } static void destroy_ (mix_device_t *dev) { if (dev->type != mix_dev_CONSOLE && GET_FILE_(dev) != NULL) mix_file_delete (GET_FILE_(dev)); } static mix_device_vtable_t VTABLE_ = { write_, read_, ioc_, busy_, destroy_ }; const mix_device_vtable_t * DEF_DEV_VTABLE_ = &VTABLE_; static mix_device_vtable_t CVTABLE_ = { write_, read_cons_, ioc_, busy_, destroy_ }; const mix_device_vtable_t * CONSOLE_DEV_VTABLE_ = &CVTABLE_; mdk-1.2.9/mixlib/xmix_vm_handlers.h0000644000175000017500000000404712112755472014236 00000000000000/* -*-c-*- ---------------- xmix_vm_handlers.h : * mix_vm_cmd_dispatcher command handlers * ------------------------------------------------------------------ * Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_VM_HANDLERS_H #define XMIX_VM_HANDLERS_H #include "xmix_vm_command.h" /* command handlers */ #define DEC_FUN(name) \ extern gboolean cmd_##name (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) DEC_FUN (help_); DEC_FUN (load_); DEC_FUN (run_); DEC_FUN (next_); DEC_FUN (pc_); DEC_FUN (psym_); DEC_FUN (preg_); DEC_FUN (pflags_); DEC_FUN (pall_); DEC_FUN (pmem_); DEC_FUN (sreg_); DEC_FUN (scmp_); DEC_FUN (sover_); DEC_FUN (smem_); DEC_FUN (ssym_); DEC_FUN (sbp_); DEC_FUN (sbpa_); DEC_FUN (cbp_); DEC_FUN (cbpa_); DEC_FUN (cabp_); DEC_FUN (weval_); DEC_FUN (w2d_); DEC_FUN (strace_); DEC_FUN (stime_); DEC_FUN (ptime_); DEC_FUN (edit_); DEC_FUN (compile_); DEC_FUN (pedit_); DEC_FUN (sedit_); DEC_FUN (pasm_); DEC_FUN (sasm_); DEC_FUN (pddir_); DEC_FUN (sddir_); DEC_FUN (sbpr_); DEC_FUN (sbpm_); DEC_FUN (sbpc_); DEC_FUN (sbpo_); DEC_FUN (cbpr_); DEC_FUN (cbpm_); DEC_FUN (cbpc_); DEC_FUN (cbpo_); DEC_FUN (pbt_); DEC_FUN (slog_); DEC_FUN (pprog_); DEC_FUN (psrc_); DEC_FUN (pline_); DEC_FUN (pstat_); /* default command structure */ extern mix_vm_command_info_t commands_[]; #endif /* XMIX_VM_HANDLERS_H */ mdk-1.2.9/mixlib/mix_ins.c0000644000175000017500000002211112622454575012326 00000000000000/* -*-c-*- ------------------ mix_ins.c : * Implementation of the functions declared in mix_ins.h * ------------------------------------------------------------------ * Copyright (C) 1999, 2003, 2007, 2010 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix_ins.h" struct mix_ins_desc_ { mix_opcode_t opcode; mix_fspec_t def_fspec; const gchar *string_rep; gboolean is_ext; }; #define IDES_(c,f,s) {c,f,#s,FALSE} #define IDESX_(c,f,s) {c,f,#s,TRUE} static const struct mix_ins_desc_ id_to_desc_[] = { IDES_(0,0,NOP), IDES_(1,5,ADD), IDES_(2,5,SUB), IDES_(3,5,MUL), IDES_(4,5,DIV), IDESX_(5,0,NUM), IDESX_(5,1,CHAR), IDESX_(5,2,HLT), IDESX_(6,0,SLA), IDESX_(6,1,SRA), IDESX_(6,2,SLAX), IDESX_(6,3,SRAX), IDESX_(6,4,SLC), IDESX_(6,5,SRC), IDESX_(6,6,SLB), IDESX_(6,7,SRB), IDES_(7,1,MOVE), IDES_(8,5,LDA), IDES_(9,5,LD1), IDES_(10,5,LD2), IDES_(11,5,LD3), IDES_(12,5,LD4), IDES_(13,5,LD5), IDES_(14,5,LD6), IDES_(15,5,LDX), IDES_(16,5,LDAN), IDES_(17,5,LD1N), IDES_(18,5,LD2N), IDES_(19,5,LD3N), IDES_(20,5,LD4N), IDES_(21,5,LD5N), IDES_(22,5,LD6N), IDES_(23,5,LDXN), IDES_(24,5,STA), IDES_(25,5,ST1), IDES_(26,5,ST2), IDES_(27,5,ST3), IDES_(28,5,ST4), IDES_(29,5,ST5), IDES_(30,5,ST6), IDES_(31,5,STX), IDES_(32,2,STJ), IDES_(33,5,STZ), IDES_(34,0,JBUS), IDES_(35,0,IOC), IDES_(36,0,IN), IDES_(37,0,OUT), IDES_(38,0,JRED), IDESX_(39,0,JMP), IDESX_(39,1,JSJ), IDESX_(39,2,JOV), IDESX_(39,3,JNOV), IDESX_(39,4,JL), IDESX_(39,5,JE), IDESX_(39,6,JG), IDESX_(39,7,JGE), IDESX_(39,8,JNE), IDESX_(39,9,JLE), IDESX_(40,0,JAN), IDESX_(40,1,JAZ), IDESX_(40,2,JAP), IDESX_(40,3,JANN), IDESX_(40,4,JANZ), IDESX_(40,5,JANP), IDESX_(40,6,JAE), IDESX_(40,7,JAO), IDESX_(41,0,J1N), IDESX_(41,1,J1Z), IDESX_(41,2,J1P), IDESX_(41,3,J1NN), IDESX_(41,4,J1NZ), IDESX_(41,5,J1NP), IDESX_(42,0,J2N), IDESX_(42,1,J2Z), IDESX_(42,2,J2P), IDESX_(42,3,J2NN), IDESX_(42,4,J2NZ), IDESX_(42,5,J2NP), IDESX_(43,0,J3N), IDESX_(43,1,J3Z), IDESX_(43,2,J3P), IDESX_(43,3,J3NN), IDESX_(43,4,J3NZ), IDESX_(43,5,J3NP), IDESX_(44,0,J4N), IDESX_(44,1,J4Z), IDESX_(44,2,J4P), IDESX_(44,3,J4NN), IDESX_(44,4,J4NZ), IDESX_(44,5,J4NP), IDESX_(45,0,J5N), IDESX_(45,1,J5Z), IDESX_(45,2,J5P), IDESX_(45,3,J5NN), IDESX_(45,4,J5NZ), IDESX_(45,5,J5NP), IDESX_(46,0,J6N), IDESX_(46,1,J6Z), IDESX_(46,2,J6P), IDESX_(46,3,J6NN), IDESX_(46,4,J6NZ), IDESX_(46,5,J6NP), IDESX_(47,0,JXN), IDESX_(47,1,JXZ), IDESX_(47,2,JXP), IDESX_(47,3,JXNN), IDESX_(47,4,JXNZ), IDESX_(47,5,JXNP), IDESX_(47,6,JXE), IDESX_(47,7,JXO), IDESX_(48,0,INCA), IDESX_(48,1,DECA), IDESX_(48,2,ENTA), IDESX_(48,3,ENNA), IDESX_(49,0,INC1), IDESX_(49,1,DEC1), IDESX_(49,2,ENT1), IDESX_(49,3,ENN1), IDESX_(50,0,INC2), IDESX_(50,1,DEC2), IDESX_(50,2,ENT2), IDESX_(50,3,ENN2), IDESX_(51,0,INC3), IDESX_(51,1,DEC3), IDESX_(51,2,ENT3), IDESX_(51,3,ENN3), IDESX_(52,0,INC4), IDESX_(52,1,DEC4), IDESX_(52,2,ENT4), IDESX_(52,3,ENN4), IDESX_(53,0,INC5), IDESX_(53,1,DEC5), IDESX_(53,2,ENT5), IDESX_(53,3,ENN5), IDESX_(54,0,INC6), IDESX_(54,1,DEC6), IDESX_(54,2,ENT6), IDESX_(54,3,ENN6), IDESX_(55,0,INCX), IDESX_(55,1,DECX), IDESX_(55,2,ENTX), IDESX_(55,3,ENNX), IDES_(56,5,CMPA), IDES_(57,5,CMP1), IDES_(58,5,CMP2), IDES_(59,5,CMP3), IDES_(60,5,CMP4), IDES_(61,5,CMP5), IDES_(62,5,CMP6), IDES_(63,5,CMPX) }; static const gsize ID_TO_DESC_SIZE_= sizeof(id_to_desc_)/sizeof(id_to_desc_[0]); /* To look for the mix_ins_id corresponding to a pair (fspec,opcode) we use an array indexed by opcode with values (initial_ins, final_ins - initial_ins) */ struct mix_opcode_desc_ { mix_ins_id_t init_id; guchar inc; /* when inc == 0, the id does not depend on fspec */ }; static struct mix_opcode_desc_ opcode_to_id_[MIX_BYTE_MAX + 1]; /* a hash table mapping strings to mix_ins_id's */ static GHashTable *string_to_id_ = NULL; void mix_init_ins (void) { guint k; g_assert (ID_TO_DESC_SIZE_ == mix_INVALID_INS); for ( k = 0; k < MIX_BYTE_MAX + 1; ++k ) { opcode_to_id_[k].init_id = mix_INVALID_INS; opcode_to_id_[k].inc = 0; } for ( k = 0; k < ID_TO_DESC_SIZE_; ++k ) { if ( opcode_to_id_[id_to_desc_[k].opcode].init_id == mix_INVALID_INS ) opcode_to_id_[id_to_desc_[k].opcode].init_id = k; else ++opcode_to_id_[id_to_desc_[k].opcode].inc; } if ( string_to_id_ == NULL ) { string_to_id_ = g_hash_table_new (g_str_hash, g_str_equal); for ( k = 0; k < ID_TO_DESC_SIZE_; ++k) g_hash_table_insert (string_to_id_, (gpointer)id_to_desc_[k].string_rep, GUINT_TO_POINTER (k)); } } void mix_release_ins (void) { g_hash_table_destroy (string_to_id_); } /* Conversions between words and ins */ mix_word_t mix_ins_to_word (const mix_ins_t *ins) { g_return_val_if_fail (ins != NULL, MIX_WORD_ZERO); return (mix_word_t)((ins->address<<18)| ((ins->index)<<12)|(ins->fspec<<6)|(ins->opcode)); } mix_ins_id_t mix_word_to_ins (mix_word_t word, mix_ins_t *ins) { mix_ins_id_t result = mix_get_ins_id (mix_get_ins_opcode (word), mix_get_ins_fspec (word)); g_return_val_if_fail (ins != NULL, result); mix_word_to_ins_uncheck (word,*ins); return result; } /* Getting ins parameters */ mix_opcode_t mix_get_opcode_from_id (mix_ins_id_t id) { g_return_val_if_fail (id < ID_TO_DESC_SIZE_, MIX_BYTE_ZERO); return id_to_desc_[id].opcode; } gboolean mix_ins_id_is_extended (mix_ins_id_t id) { g_return_val_if_fail (id < ID_TO_DESC_SIZE_, FALSE); return id_to_desc_[id].is_ext; } mix_fspec_t mix_get_fspec_from_id (mix_ins_id_t id) { g_return_val_if_fail (id < ID_TO_DESC_SIZE_, MIX_BYTE_ZERO); return id_to_desc_[id].def_fspec; } const gchar * mix_get_string_from_id (mix_ins_id_t id) { g_return_val_if_fail (id < ID_TO_DESC_SIZE_, NULL); return id_to_desc_[id].string_rep; } mix_ins_id_t mix_get_id_from_string (const gchar *name) { gpointer key, value; if ( !g_hash_table_lookup_extended (string_to_id_, (gpointer)name, &key, &value) ) return mix_INVALID_INS; return (mix_ins_id_t)GPOINTER_TO_UINT (value); } mix_ins_id_t mix_get_ins_id (mix_opcode_t code, mix_fspec_t fspec) { if ( opcode_to_id_[code].inc == 0 ) return opcode_to_id_[code].init_id; else if ( opcode_to_id_[code].inc < fspec ) return mix_INVALID_INS; else return (opcode_to_id_[code].init_id + fspec); } /* Printable representation */ extern gchar * /* this pointer must be freed by caller */ mix_ins_to_string (const mix_ins_t *ins) { gboolean needs_f; gchar *result; mix_ins_id_t id; g_return_val_if_fail (ins != NULL, NULL); id = mix_ins_id_from_ins (*ins); needs_f = ins->fspec != id_to_desc_[id].def_fspec; if ( needs_f ) result = g_strdup_printf ("%s\t%s%d,%d(%d:%d)", mix_get_string_from_id (id), mix_short_is_negative (ins->address) ? "-" : "", mix_short_magnitude (ins->address), ins->index, mix_fspec_left (ins->fspec), mix_fspec_right (ins->fspec)); else result = g_strdup_printf ("%s\t%s%d,%d", mix_get_string_from_id (id), mix_short_is_negative (ins->address) ? "-" : "", mix_short_magnitude (ins->address), ins->index); return result; } extern void mix_ins_to_string_in_buffer (const mix_ins_t *ins, gchar *buf, guint len) { gboolean needs_f; mix_ins_id_t id; g_return_if_fail (ins != NULL); g_return_if_fail (buf != NULL); id = mix_ins_id_from_ins (*ins); needs_f = ins->fspec != id_to_desc_[id].def_fspec; if ( needs_f ) g_snprintf (buf, len, "%s\t%s%d,%d(%d:%d)", mix_get_string_from_id (id), mix_short_is_negative (ins->address) ? "-" : "", mix_short_magnitude (ins->address), ins->index, mix_fspec_left (ins->fspec), mix_fspec_right (ins->fspec)); else g_snprintf (buf, len, "%s\t%s%d,%d", mix_get_string_from_id (id), mix_short_is_negative (ins->address) ? "-" : "", mix_short_magnitude (ins->address), ins->index); } void mix_ins_print (const mix_ins_t *ins) { g_return_if_fail (ins != NULL); g_print ("%s", mix_get_string_from_id (mix_ins_id_from_ins (*ins))); g_print (" %s%d,%d(%d:%d)", mix_short_is_negative (ins->address) ? "-" : "+", mix_short_magnitude (ins->address), ins->index, mix_fspec_left (ins->fspec), mix_fspec_right (ins->fspec)); } mdk-1.2.9/mixlib/mix_ins.h0000644000175000017500000001416712622454575012347 00000000000000/* -*-c-*- -------------------- mix_ins.h: * This file declares types and functions for manipulating MIX * instructions * ------------------------------------------------------------------ * Copyright (C) 2000, 2006, 2007, 2010 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_INS_H #define MIX_INS_H #include "mix_types.h" /* Initialise and free mix_ins data */ extern void mix_init_ins(void); extern void mix_release_ins(void); /* A MIX instruction is made up of address, index, fspec and op_code */ /*-- Address field: contains two bytes */ typedef mix_short_t mix_address_t; /*-- Index field: a value between 0 and 6 */ typedef enum { mix_I0, mix_I1, mix_I2, mix_I3, mix_I4, mix_I5, mix_I6 } mix_index_t; /*-- Instruction id: enumeration of MIX instruction set */ typedef enum { mix_NOP, mix_ADD, mix_SUB, mix_MUL, mix_DIV, mix_NUM, mix_CHAR, mix_HLT, mix_SLA, mix_SRA, mix_SLAX, mix_SRAX, mix_SLC, mix_SRC, mix_SLB, mix_SRB, mix_MOVE, mix_LDA, mix_LD1, mix_LD2, mix_LD3, mix_LD4, mix_LD5, mix_LD6, mix_LDX, mix_LDAN, mix_LD1N, mix_LD2N, mix_LD3N, mix_LD4N, mix_LD5N, mix_LD6N, mix_LDXN, mix_STA, mix_ST1, mix_ST2, mix_ST3, mix_ST4, mix_ST5, mix_ST6, mix_STX, mix_STJ, mix_STZ, mix_JBUS, mix_IOC, mix_IN, mix_OUT, mix_JRED, mix_JMP, mix_JSJ, mix_JOV, mix_JNOV, mix_JL, mix_JE, mix_JG, mix_JGE, mix_JNE, mix_JLE, mix_JAN, mix_JAZ, mix_JAP, mix_JANN, mix_JANZ, mix_JANP, mix_JAE, mix_JAO, mix_J1N, mix_J1Z, mix_J1P, mix_J1NN, mix_J1NZ, mix_J1NP, mix_J2N, mix_J2Z, mix_J2P, mix_J2NN, mix_J2NZ, mix_J2NP, mix_J3N, mix_J3Z, mix_J3P, mix_J3NN, mix_J3NZ, mix_J3NP, mix_J4N, mix_J4Z, mix_J4P, mix_J4NN, mix_J4NZ, mix_J4NP, mix_J5N, mix_J5Z, mix_J5P, mix_J5NN, mix_J5NZ, mix_J5NP, mix_J6N, mix_J6Z, mix_J6P, mix_J6NN, mix_J6NZ, mix_J6NP, mix_JXN, mix_JXZ, mix_JXP, mix_JXNN, mix_JXNZ, mix_JXNP, mix_JXE, mix_JXO, mix_INCA, mix_DECA, mix_ENTA, mix_ENNA, mix_INC1, mix_DEC1, mix_ENT1, mix_ENN1, mix_INC2, mix_DEC2, mix_ENT2, mix_ENN2, mix_INC3, mix_DEC3, mix_ENT3, mix_ENN3, mix_INC4, mix_DEC4, mix_ENT4, mix_ENN4, mix_INC5, mix_DEC5, mix_ENT5, mix_ENN5, mix_INC6, mix_DEC6, mix_ENT6, mix_ENN6, mix_INCX, mix_DECX, mix_ENTX, mix_ENNX, mix_CMPA, mix_CMP1, mix_CMP2, mix_CMP3, mix_CMP4, mix_CMP5, mix_CMP6, mix_CMPX, mix_INVALID_INS } mix_ins_id_t; /* each one of the above id's has associated an opcode, a default fspec and a string representation */ /* the opcode fits in a byte */ typedef mix_byte_t mix_opcode_t; /* labels for each opcode */ enum { mix_opNOP = 0, mix_opADD, mix_opSUB, mix_opMUL, mix_opDIV, mix_opSPC, mix_opSLx, mix_opMOVE, mix_opLDA, mix_opLD1, mix_opLD2, mix_opLD3, mix_opLD4, mix_opLD5, mix_opLD6, mix_opLDX, mix_opLDAN, mix_opLD1N, mix_opLD2N, mix_opLD3N, mix_opLD4N, mix_opLD5N, mix_opLD6N, mix_opLDXN, mix_opSTA, mix_opST1, mix_opST2, mix_opST3, mix_opST4, mix_opST5, mix_opST6, mix_opSTX, mix_opSTJ, mix_opSTZ, mix_opJBUS, mix_opIOC, mix_opIN, mix_opOUT, mix_opJRED, mix_opJMP, mix_opJAx, mix_opJ1x, mix_opJ2x, mix_opJ3x, mix_opJ4x, mix_opJ5x, mix_opJ6x, mix_opJXx, mix_opINCA, mix_opINC1, mix_opINC2, mix_opINC3, mix_opINC4, mix_opINC5, mix_opINC6, mix_opINCX, mix_opCMPA, mix_opCMP1, mix_opCMP2, mix_opCMP3, mix_opCMP4, mix_opCMP5, mix_opCMP6, mix_opCMPX }; extern mix_opcode_t mix_get_opcode_from_id(mix_ins_id_t id); extern mix_fspec_t mix_get_fspec_from_id(mix_ins_id_t id); /* For extended instructions, both the opcode and fspec determine the id (i.e., an explicit fspec cannot be used) */ extern gboolean mix_ins_id_is_extended(mix_ins_id_t id); extern const gchar * mix_get_string_from_id(mix_ins_id_t id); extern mix_ins_id_t mix_get_id_from_string(const gchar *name); extern mix_ins_id_t mix_get_ins_id(mix_opcode_t code, mix_fspec_t fspec); /*-- MIX instruction type */ typedef struct mix_ins_t mix_ins_t; struct mix_ins_t { mix_address_t address; mix_index_t index; mix_fspec_t fspec; mix_opcode_t opcode; }; #define mix_ins_fill_from_id(ins,id) \ do { \ (ins).opcode = mix_get_opcode_from_id(id); \ (ins).fspec = mix_get_fspec_from_id(id); \ } while(FALSE) /* A mix ins can be codified into a word */ extern mix_word_t mix_ins_to_word(const mix_ins_t *ins); extern mix_ins_id_t mix_word_to_ins(mix_word_t w, mix_ins_t *ins); #define mix_word_add_address(word,addr) (word) |= ((addr)<<18) /* decompose an instruction codified in a word into its parts */ #define mix_get_ins_address(word) ((mix_address_t)((word)>>18)) #define mix_get_ins_index(word) ((mix_index_t)(((word)>>12)&7)) #define mix_get_ins_fspec(word) ((mix_fspec_t)(mix_byte_new((word)>>6))) #define mix_get_ins_opcode(word) ((mix_opcode_t)(mix_byte_new(word))) /* unchecked versions for speed */ #define mix_ins_to_word_uncheck(ins) \ (mix_word_t)(((ins).address<<18)| \ (((ins).index)<<12)|((ins).fspec<<6)|((ins).opcode)) #define mix_word_to_ins_uncheck(word,ins) \ do { \ (ins).address = mix_get_ins_address(word); \ (ins).index = mix_get_ins_index(word); \ (ins).fspec = mix_get_ins_fspec(word); \ (ins).opcode = mix_get_ins_opcode(word); \ } while(FALSE) #define mix_ins_id_from_ins(ins) mix_get_ins_id((ins).opcode,(ins).fspec) /* Printable representation */ extern gchar * /* this pointer must be freed by caller */ mix_ins_to_string(const mix_ins_t *ins); extern void mix_ins_to_string_in_buffer (const mix_ins_t *ins, gchar *buf, guint len); extern void mix_ins_print(const mix_ins_t *ins); #endif /* MIX_INS_H */ mdk-1.2.9/mixlib/mix_parser.c0000644000175000017500000004430312112755472013032 00000000000000/* -*-c-*- -------------- mix_parser.c : * Implementation of the functions declared in mix_parser.h and * xmix_parser.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2003, 2004, 2006, 2007, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "mix.h" #include "mix_code_file.h" #include "xmix_parser.h" /* The flex-generated scanner, according to file mix_scanner.l */ extern mix_parser_err_t mix_flex_scan (mix_parser_t *parser); /*------------ mixparser.h functions -------------------------------------*/ /* error messages */ static const gchar * const ERR_MESSAGE_[] = { N_("successful compilation"), N_("file not yet compiled"), N_("internal error"), N_("unable to open MIX source file"), N_("unable to open MIX output file"), N_("unexpected end of file"), N_("invalid location field"), N_("duplicated symbol"), N_("symbol too long"), N_("missing operator field"), N_("unexpected location symbol"), N_("invalid address field"), N_("invalid index field"), N_("invalid f-specification"), N_("invalid operation field"), N_("invalid expression"), N_("undefined symbol"), N_("mismatched parenthesis"), N_("unexpected f-specfication"), N_("missing symbol name"), N_("symbol is an instruction name"), N_("failed write access to code file"), N_("operand of ALF pseudo instruction has less than 5 chars"), N_("operand of ALF pseudo instruction has more than 5 chars"), N_("operand of ALF pseudo instruction must be quoted") }; static const guint NO_OF_MESSAGES_ = sizeof(ERR_MESSAGE_)/sizeof (gchar*); const gchar * mix_parser_err_string (mix_parser_err_t error) { return (error < NO_OF_MESSAGES_) ? _(ERR_MESSAGE_[error]) : NULL; } guint mix_parser_err_count (const mix_parser_t *parser) { return (parser) ? parser->err_count : 0; } guint mix_parser_warning_count (const mix_parser_t *parser) { return (parser) ? parser->warn_count : 0; } const gchar * mix_parser_src_file_base_name (const mix_parser_t *parser) { return (parser) ? mix_file_base_name (parser->in_file) : NULL; } const gchar * mix_parser_src_file_extension (const mix_parser_t *parser) { return (parser) ? mix_file_extension (parser->in_file) : NULL; } /* Create/destroy a mix_parser */ /* compare function for the table of ins */ static gint compare_shorts_ (gconstpointer s1, gconstpointer s2) { mix_short_t a = (mix_short_t)GPOINTER_TO_UINT (s1); mix_short_t b = (mix_short_t)GPOINTER_TO_UINT (s2); if ( mix_short_sign (a) == mix_short_sign (b) ) return mix_short_magnitude (a) - mix_short_magnitude (b); else if ( mix_short_magnitude (a) == 0 && mix_short_magnitude (b) == 0 ) return 0; else if ( mix_short_is_positive (a) ) return 1; return -1; } mix_parser_t * mix_parser_new (const gchar *in_file) { mix_parser_t *result; mix_file_t *f = mix_file_new_with_def_ext (in_file, mix_io_READ, MIX_SRC_DEFEXT); if ( f == NULL ) return NULL; result = g_new (mix_parser_t, 1); result->symbol_table = mix_symbol_table_new (); result->ls_table = mix_symbol_table_new (); result->cur_ls = 0; result->future_refs = g_hash_table_new (g_str_hash, g_str_equal); result->ins_table = g_tree_new (compare_shorts_); if ( result->symbol_table == NULL || result->future_refs == NULL || result->ins_table == NULL || result->ls_table == NULL ) { mix_symbol_table_delete (result->symbol_table); mix_symbol_table_delete (result->ls_table); g_hash_table_destroy (result->future_refs); g_tree_destroy (result->ins_table); mix_file_delete (f); g_free (result); g_warning (_("No system resources")); return NULL; } result->con_list = NULL; result->alf_list = NULL; result->in_file = f; result->loc_count = MIX_SHORT_ZERO; result->start = MIX_SHORT_ZERO; result->end = MIX_SHORT_ZERO; result->status = MIX_PERR_NOCOMP; result->err_line = 0; result->err_count = 0; result->warn_count = 0; return result; } static void delete_list_vals_ (gpointer key, gpointer value, gpointer data) { g_free (key); g_slist_free ((GSList*)value); } static int delete_tree_vals_ (gpointer key, gpointer value, gpointer data) { g_free (value); return FALSE; } void mix_parser_delete (mix_parser_t *parser) { g_return_if_fail (parser != NULL); /* clear the GSList values of future_refs and its keys */ g_hash_table_foreach (parser->future_refs, delete_list_vals_, NULL); /* clear the ins_node_'s of the ins tree */ g_tree_foreach (parser->ins_table, delete_tree_vals_, NULL); /* destroy the tree and hash tables */ g_tree_destroy (parser->ins_table); mix_symbol_table_delete (parser->symbol_table); mix_symbol_table_delete (parser->ls_table); g_hash_table_destroy (parser->future_refs); g_slist_free (parser->con_list); g_slist_free (parser->alf_list); mix_file_delete (parser->in_file); g_free (parser); } /* Compile a mix source file */ static void update_future_refs_value_ (mix_parser_t *parser, const gchar *name, mix_short_t value, gboolean remove) { GSList *list = NULL; gpointer *plist = (gpointer *)(&list); gpointer key; g_assert (parser != NULL && name != NULL); if ( g_hash_table_lookup_extended (parser->future_refs, name, &key, plist) ) { GSList *tmp = list; ins_node_ *node; while ( tmp != NULL ) { node = (ins_node_ *)g_tree_lookup (parser->ins_table, tmp->data); g_assert (node); if (mix_get_ins_address (node->ins) == 1) { value = mix_short_negative (value); node->ins = mix_word_set_field (node->ins, MIX_WORD_ZERO, mix_fspec_new (1,2)); } mix_word_add_address (node->ins, value); g_tree_insert (parser->ins_table, tmp->data, (gpointer)node); tmp = g_slist_next (tmp); } if (remove) { g_hash_table_remove (parser->future_refs, name); g_free (key); } g_slist_free (list); } } #define update_future_refs_(parser,name,rem) \ update_future_refs_value_(parser, name, (parser)->loc_count, rem) static void update_ls_ (gpointer symbol, gpointer value, gpointer parser) { /* add an instruction on current location and update refs to it */ mix_ins_t ins; mix_word_t w = (mix_word_t) GPOINTER_TO_UINT (value); mix_parser_t *par = (mix_parser_t *) parser; mix_word_to_ins_uncheck (w, ins); update_future_refs_ (par, (const gchar *)symbol, TRUE); mix_parser_add_ins (par, &ins, 0); par->loc_count++; } static gboolean undef_warning_ (gpointer symbol, gpointer value, gpointer data) { mix_parser_t *parser = (mix_parser_t *)data; const gchar *name = (const gchar *)symbol; mix_ins_t ins; mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, 0, name, TRUE); mix_word_to_ins_uncheck (MIX_WORD_ZERO, ins); update_future_refs_ (parser, name, FALSE); mix_parser_add_ins (parser, &ins, 0); mix_symbol_table_insert (parser->symbol_table, name, mix_short_to_word_fast (parser->loc_count)); parser->loc_count++; return TRUE; } mix_parser_err_t mix_parser_compile (mix_parser_t *parser) { g_return_val_if_fail (parser != NULL, MIX_PERR_INTERNAL); g_return_val_if_fail (parser->in_file != NULL, MIX_PERR_NOIN); g_return_val_if_fail (parser->symbol_table != NULL, MIX_PERR_INTERNAL); g_return_val_if_fail (parser->future_refs != NULL, MIX_PERR_INTERNAL); g_return_val_if_fail (parser->ins_table != NULL, MIX_PERR_INTERNAL); parser->status = mix_flex_scan (parser); if ( parser->status == MIX_PERR_OK ) { parser->loc_count = parser->end; mix_symbol_table_foreach (parser->ls_table, update_ls_, (gpointer)parser); if ( g_hash_table_size (parser->future_refs) > 0) { g_hash_table_foreach_remove (parser->future_refs, undef_warning_, (gpointer)parser); } } return parser->status; } /* Write a compiled source to a code file */ struct write_code_context_ { mix_code_file_t *file; mix_parser_t *parser; }; static gint write_code_ (gpointer address, gpointer ins_node, gpointer context) { mix_ins_desc_t desc; struct write_code_context_ *cntx = (struct write_code_context_ *)context; desc.ins = ((ins_node_ *)ins_node)->ins; desc.lineno = ((ins_node_ *)ins_node)->lineno; desc.address = (mix_address_t)GPOINTER_TO_UINT (address); if ( mix_code_file_write_ins (cntx->file, &desc) ) return FALSE; else { cntx->parser->status = MIX_PERR_NOWRITE; return TRUE; } } mix_parser_err_t mix_parser_write_code (mix_parser_t *parser, const gchar *code_file, gboolean debug) { struct write_code_context_ context; const gchar *cfname = (code_file) ? code_file : mix_file_base_name (parser->in_file); gchar *source_path; g_return_val_if_fail (parser != NULL, MIX_PERR_INTERNAL); if (parser->status != MIX_PERR_OK ) return parser->status; context.parser = parser; if (!g_path_is_absolute (mix_file_base_name (parser->in_file))) { gchar *dir = g_get_current_dir (); source_path = g_strconcat (dir, G_DIR_SEPARATOR_S, mix_file_base_name (parser->in_file), NULL); g_free (dir); } else source_path = g_strdup (mix_file_base_name (parser->in_file)); context.file = mix_code_file_new_write (cfname, parser->start, source_path, debug, parser->symbol_table); g_free (source_path); if (context.file == NULL) return MIX_PERR_NOOUT; g_tree_foreach (parser->ins_table, write_code_, (gpointer)&context); mix_code_file_delete (context.file); return parser->status; } /* Produce a listing file summarising the compilation */ typedef struct { FILE *file; mix_parser_t *parser; } listing_context_t; static gint write_listing_ (gpointer address, gpointer ins, gpointer context) { guint k; FILE *file = ((listing_context_t *)context)->file; mix_parser_t *parser = ((listing_context_t *)context)->parser; guint end = parser->end; ins_node_ *ins_node = (ins_node_ *)ins; mix_ins_t instruct; fprintf (file, "%03d %05d %s ", ins_node->lineno, GPOINTER_TO_INT (address), mix_word_is_negative (ins_node->ins)? "-":"+"); for ( k = 1; k < 6; ++k ) fprintf (file, "%02d ", mix_word_get_byte (ins_node->ins, k)); if (g_slist_find (parser->con_list, GUINT_TO_POINTER (ins_node->lineno)) || GPOINTER_TO_UINT (address) >= end) fprintf (file, "\tCON\t%04d\n", (int)(ins_node->ins)); else if (g_slist_find (parser->alf_list, GUINT_TO_POINTER (ins_node->lineno))) { size_t i; fprintf (file, "\tALF\t\""); for (i = 1; i < 6; ++i) fprintf (file, "%c", mix_char_to_ascii (mix_byte_to_char (mix_word_get_byte (ins_node->ins, i)))); fprintf (file, "\"\n"); } else if (GPOINTER_TO_UINT (address) < end) { gchar *instext = NULL; mix_ins_id_t id = mix_word_to_ins (ins_node->ins, &instruct); if (id != mix_INVALID_INS) instext = mix_ins_to_string (&instruct); fprintf (file, _("\t%s\n"), instext? instext : _("UNKNOWN")); if (instext) g_free (instext); } else g_assert_not_reached (); return FALSE; } mix_parser_err_t mix_parser_write_listing (mix_parser_t *parser, const gchar *list_file) { mix_file_t *mfile; const gchar *name; listing_context_t context; static const char *sep = "-----------------------------------------------------------------\n"; g_return_val_if_fail (parser != NULL, MIX_PERR_INTERNAL); if (parser->status != MIX_PERR_OK ) return parser->status; name = (list_file) ? list_file : mix_file_base_name (parser->in_file); mfile = mix_file_new_with_def_ext (name, mix_io_WRITE, MIX_LIST_DEFEXT); if ( mfile == NULL ) return MIX_PERR_NOOUT; context.file = mix_file_to_FILE (mfile); context.parser = parser; fprintf (context.file, _("*** %s%s: compilation summary ***\n\n"), mix_file_base_name (parser->in_file), mix_file_extension (parser->in_file)); fputs (sep, context.file); fputs ( _("Src Address Compiled word Symbolic rep\n"), context.file); fputs (sep, context.file); g_tree_foreach (parser->ins_table, write_listing_, (gpointer)(&context)); fputs (sep, context.file); fprintf (context.file, _("\n*** Start address:\t%d\n*** End address:\t%d\n"), mix_short_magnitude (parser->start), mix_short_magnitude (parser->end)); fprintf (context.file, _("\n*** Symbol table\n")); mix_symbol_table_print (parser->symbol_table, MIX_SYM_ROWS, context.file, TRUE); fprintf (context.file, _("\n*** End of summary ***\n")); mix_file_delete (mfile); return parser->status; } /* load a virtual machine's memory with the contents of a compiled file */ static gint load_vm_ (gpointer address, gpointer ins, gpointer vm) { mix_vm_set_addr_contents ((mix_vm_t*)vm, (mix_address_t)GPOINTER_TO_UINT (address), ((ins_node_ *)ins)->ins); return FALSE; } mix_parser_err_t mix_parser_load_vm (const mix_parser_t *parser, mix_vm_t *vm) { g_return_val_if_fail (parser != NULL, MIX_PERR_INTERNAL); g_return_val_if_fail (vm != NULL, MIX_PERR_INTERNAL); g_return_val_if_fail (parser->status == MIX_PERR_OK, parser->status); mix_vm_reset (vm); g_tree_foreach (parser->ins_table, load_vm_, (gpointer)vm); mix_vm_set_start_addr (vm, parser->start); return parser->status; } /*------------ xmiparser.h functions -------------------------------------*/ /* functions to manipulate mix_parser_t during compilation */ /* symbol table */ /* Define a new symbol with value equal to the current loc_count * and update future refs to this symbol */ mix_parser_err_t mix_parser_define_symbol_here (mix_parser_t *parser, const gchar *name) { mix_word_t value = mix_short_to_word_fast (parser->loc_count); return mix_parser_define_symbol_value (parser, name, value); } mix_parser_err_t mix_parser_define_symbol_value (mix_parser_t *parser, const gchar *name, mix_word_t value) { g_assert (parser != NULL); if (NULL == name || strlen (name) == 0) return MIX_PERR_MIS_SYM; switch (mix_symbol_table_add (parser->symbol_table, name, value)) { case MIX_SYM_OK: if (parser->status == MIX_PERR_NOCOMP) update_future_refs_value_ (parser, name, value, TRUE); return MIX_PERR_OK; case MIX_SYM_LONG: return MIX_PERR_LONG_SYMBOL; case MIX_SYM_DUP: return MIX_PERR_DUP_SYMBOL; default: return MIX_PERR_INTERNAL; } } /* Obtain the value of a symbol */ void mix_parser_set_future_ref (mix_parser_t *parser, const gchar *name) { const gchar *nname = name; GSList *list; g_assert (parser != NULL && name != NULL); if ( parser->status == MIX_PERR_NOCOMP ) { list = g_hash_table_lookup (parser->future_refs, name); if ( list == NULL ) nname = g_strdup (name); list = g_slist_prepend (list, GUINT_TO_POINTER ((guint)parser->loc_count)); g_hash_table_insert (parser->future_refs, (gpointer)nname, list); } } /* Redefine the value of a local symbol as the current loc_count */ void mix_parser_manage_local_symbol (mix_parser_t *parser, const gchar *name, mix_short_t value) { gchar ref[3]; ref[2] = 0; g_assert (parser != NULL && name != NULL); g_assert (strlen(name) == 2); switch (name[1]) { case 'f': case 'F': mix_parser_set_future_ref (parser, name); break; case 'h': case 'H': ref[0] = name[0]; ref[1] = 'F'; if ( parser->status == MIX_PERR_NOCOMP ) update_future_refs_value_ (parser, ref, value, TRUE); ref[1] = 'B'; mix_symbol_table_insert (parser->symbol_table, ref, mix_short_to_word_fast (value)); break; default: return; } } /* Literal strings symbols */ void mix_parser_define_ls (mix_parser_t *parser, mix_word_t value) { gchar *name = g_strdup_printf ("%05d", parser->cur_ls++); mix_symbol_table_add (parser->ls_table, name, value); mix_parser_set_future_ref (parser, name); g_free (name); } /* Compilation */ static void add_raw_ (mix_parser_t *parser, mix_word_t word, guint lineno) { if ( parser->status == MIX_PERR_NOCOMP || parser->status == MIX_PERR_OK ) { ins_node_ *node = g_new (ins_node_, 1); node->ins = word; node->lineno = lineno; g_tree_insert (parser->ins_table, GUINT_TO_POINTER ((guint)parser->loc_count), (gpointer)node); } } void mix_parser_add_ins (mix_parser_t *parser, const mix_ins_t *new_ins, guint lineno) { g_assert (parser != NULL && new_ins != NULL); add_raw_ (parser, mix_ins_to_word_uncheck (*new_ins), lineno); } void mix_parser_add_raw (mix_parser_t *parser, mix_word_t word, guint lineno, gboolean is_con) { g_assert (parser != NULL); add_raw_ (parser, word, lineno); if ( parser->status == MIX_PERR_NOCOMP || parser->status == MIX_PERR_OK ) { if (is_con) parser->con_list = g_slist_append (parser->con_list, GUINT_TO_POINTER (lineno)); else parser->alf_list = g_slist_append (parser->alf_list, GUINT_TO_POINTER (lineno)); } } /* Error handling */ void mix_parser_log_error (mix_parser_t *parser, mix_parser_err_t error, gint lineno, const gchar *comment, gboolean warn) { g_assert (parser != NULL); if ( warn ) parser->warn_count += 1; else { parser->err_count += 1; parser->err_line = lineno; parser->status = error; } fprintf (stderr, "%s%s:%d: %s: %s", mix_file_base_name (parser->in_file), mix_file_extension (parser->in_file), lineno, warn ? _("warning"):_("error"), _(ERR_MESSAGE_[error])); if (comment != NULL) fprintf (stderr, ": %s\n", comment); else fputs ("\n", stderr); } mdk-1.2.9/mixlib/xmix_io.c0000644000175000017500000000327612112755472012341 00000000000000/* -*-c-*- ------------------ xmix_io.c : * Implementation of the functions declared in xmix_io.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "xmix_io.h" const char *io_OPENTYPE_[5] = { "r", "w", "w+", "a", "a+" }; /* initialise a mix_iochannel from a file descriptor */ gboolean io_init_from_fdesc_(mix_iochannel_t *ioc, int fdesc) { FILE *file; mix_fmode_t mode; int flags = fcntl(fdesc, F_GETFL); if ( (flags&O_RDONLY) == O_RDONLY ) mode = mix_io_READ; else if ( (flags&O_WRONLY) == O_WRONLY ) mode = mix_io_WRITE; else if ( (flags&O_RDWR) == O_RDWR ) mode = mix_io_RDWRT; else return FALSE; file = fdopen(fdesc, fmode_to_type_(mode)); g_return_val_if_fail(file != NULL, FALSE); if (mode == mix_io_RDWRT) rewind (file); io_init_from_file_(ioc, file); return TRUE; } mdk-1.2.9/mixlib/xmix_vm_command.c0000644000175000017500000000353412112755472014047 00000000000000/* -*-c-*- -------------- xmix_vm_command.c : * Implementation of the functions declared in xmix_vm_command.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "xmix_vm_command.h" /* configuration keys */ const gchar *TRACING_KEY_ = "Tracing"; const gchar *TIMING_KEY_ = "Timing"; const gchar *EDITOR_KEY_ = "Editor"; const gchar *ASM_KEY_ = "Assembler"; const gchar *LOGGING_KEY_ = "Logs"; void log_message_ (mix_vm_cmd_dispatcher_t *dis, const gchar *fmt, ...) { if (dis && fmt && dis->log_msg && dis->out) { va_list args; va_start (args, fmt); vfprintf (dis->out, fmt, args); fprintf (dis->out, "\n"); va_end (args); } } extern void log_error_ (mix_vm_cmd_dispatcher_t *dis, const gchar *fmt, ...) { enum {BUFF_SIZE = 256}; static gchar BUFFER[256]; if (dis && fmt && dis->err) { va_list args; va_start (args, fmt); g_snprintf (BUFFER, BUFF_SIZE, "ERROR: %s\n", fmt); vfprintf (dis->err, BUFFER, args); va_end (args); } } mdk-1.2.9/mixlib/mix_eval.h0000644000175000017500000000614512112755472012474 00000000000000/* -*-c-*- ---------------- mix_eval.h : * mix_eval_t is an evaluator of MIX W-expressions * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_EVAL_H #define MIX_EVAL_H #include "mix.h" #include "mix_types.h" #include "mix_symbol_table.h" /* the evaluator type */ typedef struct mix_eval_t mix_eval_t; /* possible evaluation outcomes*/ typedef enum { MIX_EVAL_OK, /* sucess*/ MIX_EVAL_SYNTAX, /* syntax error */ MIX_EVAL_INV_FSPEC, /* out of range fspec */ MIX_EVAL_MIS_PAREN, /* mismatched parenthesis */ MIX_EVAL_UNDEF_SYM, /* undefined symbol */ MIX_EVAL_INTERN /* internal error */ } mix_eval_result_t; /* create a new evaluator */ extern mix_eval_t * mix_eval_new (void); /* create a new evaluator with an external symbol table */ extern mix_eval_t * mix_eval_new_with_table (mix_symbol_table_t *table); /* delete */ extern void mix_eval_delete (mix_eval_t *eval); /* provide a new symbol table to be used */ extern void mix_eval_use_symbol_table (mix_eval_t *eval, mix_symbol_table_t *table); extern const mix_symbol_table_t * mix_eval_symbol_table (const mix_eval_t *eval); /* eval an expression providing a value for loc counter */ extern mix_eval_result_t mix_eval_expression_with_loc (mix_eval_t *eval, const gchar *expr, mix_short_t loc); /* eval an expression with null loc*/ #define mix_eval_expression (eval,expr) \ mix_eval_expression_with_loc (eval, expr, MIX_SHORT_ZERO) /* get the result of the last evaluation */ extern mix_word_t mix_eval_value (const mix_eval_t *eval); /* get the last eval result code */ extern mix_eval_result_t mix_eval_last_error (const mix_eval_t *eval); /* get the last error string */ extern const gchar* mix_eval_last_error_string (const mix_eval_t *eval); /* get the position of last error */ extern guint mix_eval_last_error_pos (const mix_eval_t *eval); /* add, or redefine, a symbol. see mix_symbol_table.h for possible outcomes. */ extern gint mix_eval_set_symbol (mix_eval_t *eval, const gchar *symbol, mix_word_t value); extern gboolean mix_eval_set_symbols_from_table (mix_eval_t *eval, const mix_symbol_table_t *table); extern void mix_eval_remove_symbol (mix_eval_t *eval, const gchar *symbol); extern gboolean mix_eval_remove_symbols_from_table (mix_eval_t *eval, const mix_symbol_table_t *table); #endif /* MIX_EVAL_H */ mdk-1.2.9/mixlib/mix_file.h0000644000175000017500000000372012112755472012460 00000000000000/* -*-c-*- ---------------- mix_file.h : * Declarations for the mix_file_t type. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_FILE_H #define MIX_FILE_H #include "mix_io.h" /* The mix_file_t type, deriving from mix_iochannel_t and representing a disk file */ typedef struct mix_file_t mix_file_t; /* Creation/destruction of files */ extern mix_file_t * mix_file_new(const gchar *name, mix_fmode_t mode); /* creates a file adding to its name the defext if missing */ extern mix_file_t * mix_file_new_with_def_ext(const gchar *name, mix_fmode_t mode, const gchar *defext); extern void mix_file_delete(mix_file_t *file); /* convert to a standard FILE */ extern FILE * mix_file_to_FILE(const mix_file_t *file); /* standard default extensions */ extern const gchar *MIX_SRC_DEFEXT, *MIX_LIST_DEFEXT, *MIX_CODE_DEFEXT; /* complete a name with an extension, if needed */ extern gchar * mix_file_complete_name (const gchar *name, const gchar *extension); /* Get the base name and extension of file */ extern const gchar * mix_file_base_name(const mix_file_t *file); extern const gchar * mix_file_extension(const mix_file_t *file); #endif /* MIX_FILE_H */ mdk-1.2.9/mixlib/mix_vm_clock.c0000644000175000017500000000356312112755472013336 00000000000000/* -*-c-*- -------------- mix_vm_clock.c : * Implementation of the functions declared in mix_vm_clock.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix_vm_clock.h" static const mix_time_t exec_times_[] = { 1, 2, 2, 10, 12, 10, 2, 1, 2, 2, 2, 2 , 2, 2, 2, 2, 2, 2, 2, 2 , 2, 2, 2, 2, 2, 2, 2, 2 , 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2 , 2, 2, 2, 2 }; /* Create/delete a clock */ mix_vm_clock_t * mix_vm_clock_new () { mix_vm_clock_t *result = g_new (mix_vm_clock_t, 1); result->time = 0; return result; } void mix_vm_clock_delete (mix_vm_clock_t *clock) { g_return_if_fail (clock != NULL); } /* Increase time with the units needed to execute ins */ mix_time_t mix_vm_clock_add_lapse (mix_vm_clock_t *clock, const mix_ins_t *ins) { mix_time_t t = 0; g_return_val_if_fail (clock != NULL, 0); if (ins != NULL) { t = exec_times_[ins->opcode]; if (ins->opcode == mix_opMOVE) { t += 2 * (ins->fspec); } } clock->time += t; return t; } mdk-1.2.9/mixlib/mix_file.c0000644000175000017500000001020412112755472012446 00000000000000/* -*-c-*- -------------- mix_file.c : * Implementation of the functions declared in mix_file.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "xmix_io.h" #include "mix_file.h" const gchar *MIX_SRC_DEFEXT = ".mixal", *MIX_LIST_DEFEXT = ".mls", *MIX_CODE_DEFEXT = ".mix"; /* file names completions */ #define needs_completion_(name,defext) \ ( strcmp(name + strlen(name) - strlen(defext), defext) != 0 ) #define add_completion_(name, defext) \ g_strconcat(name, defext, NULL) /* The actual definition of mix_file_t */ struct mix_file_t { mix_iochannel_t parent; gchar *base_name; gchar *ext; }; /* Creation/destruction of files */ static mix_file_t * open_file_(const gchar *name, mix_fmode_t mode) { mix_file_t *result; FILE *file; const gchar *fmode = fmode_to_type_ (mode); /* if the read/write file already exists, open in r+ mode */ if (mode == mix_io_RDWRT && (file = fopen (name, "r"))) { fmode = "r+"; fclose (file); } result = g_new(mix_file_t, 1); file = fopen(name, fmode); if ( file == NULL ) { g_free (result); return NULL; } io_init_from_file_(MIX_IOCHANNEL(result), file); return result; } mix_file_t * mix_file_new(const gchar *name, mix_fmode_t mode) { mix_file_t *result; gchar *bname; if ( name == NULL ) return NULL; bname = g_strdup(name); if ( bname == NULL ) return NULL; result = open_file_(name, mode); if ( result == NULL ) { g_free(bname); return NULL; } result->base_name = bname; result->ext = NULL; return result; } /* creates a file adding to its name the defext if missing */ mix_file_t * mix_file_new_with_def_ext(const gchar *name, mix_fmode_t mode, const gchar *defext) { const gchar *real_name; mix_file_t *result; if ( name == NULL ) return NULL; if ( defext == NULL ) return mix_file_new(name, mode); real_name = needs_completion_(name, defext) ? add_completion_(name, defext) : name; result = open_file_(real_name, mode); if ( real_name != name ) g_free((void *)real_name); if ( result == NULL ) return NULL; result->ext = g_strdup(defext); if ( needs_completion_(name, defext) ) result->base_name = g_strdup(name); else result->base_name = g_strndup(name, strlen(name) - strlen(defext)); if ( result->ext == NULL || result->base_name == NULL ) { mix_file_delete(result); return NULL; } return result; } void mix_file_delete(mix_file_t *file) { g_return_if_fail(file != NULL); io_close_(MIX_IOCHANNEL(file)); if (file->base_name) g_free(file->base_name); if (file->ext) g_free(file->ext); g_free(file); } /* convert to a standard FILE */ extern FILE * mix_file_to_FILE(const mix_file_t *file) { if ( file == NULL ) return NULL; return io_get_FILE_(file); } /* complete a name with an extension, if needed */ gchar * mix_file_complete_name (const gchar *name, const gchar *extension) { if (!name) return NULL; if (!extension || !needs_completion_ (name, extension)) return g_strdup (name); return add_completion_ (name, extension); } /* Get the base name and extension of file */ const gchar * mix_file_base_name(const mix_file_t *file) { g_return_val_if_fail(file != NULL, NULL); return file->base_name; } const gchar * mix_file_extension(const mix_file_t *file) { g_return_val_if_fail(file != NULL, NULL); return file->ext; } mdk-1.2.9/mixlib/mix_scanner.l0000644000175000017500000004051512112755472013201 00000000000000/* -*-c-*- -------------- mix_scanner.l : * Lexical scanner used by mix_parser_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ %{ #include #include #include "mix.h" #include "xmix_parser.h" #define YY_DECL mix_parser_err_t mix_flex_scan (mix_parser_t *parser) #define RESET() \ do { \ mix_ins_fill_from_id (ins, mix_NOP); \ ins.address = 0; \ ins.index = 0; \ nof = FALSE; \ lsf = FALSE; \ if (symbol != NULL ) \ { \ g_free (symbol); \ symbol = NULL; \ } \ if (lsymbol != NULL) \ { \ g_free (lsymbol); \ lsymbol = NULL; \ } \ } while (FALSE) #define NEXT() \ do { \ if (lsymbol != NULL) \ mix_parser_manage_local_symbol (parser,lsymbol, \ loc); \ parser->loc_count++; \ RESET (); \ ++lineno; \ BEGIN (INITIAL); \ } while (FALSE) #define ADD_INS() \ do { \ mix_parser_add_ins (parser, &ins, lineno); \ NEXT (); \ } while (FALSE) #define ADD_RAW(value,is_con) \ do { \ mix_parser_add_raw (parser, value, lineno, is_con); \ NEXT (); \ } while (FALSE) #define ENTER_EVAL() \ do { \ if (yytext[0] != '*') \ { \ expr_val = MIX_WORD_ZERO; \ yyless (0); \ } \ else \ { \ expr_val = mix_short_to_word_fast (parser->loc_count); \ yyless (1); \ } \ yy_push_state (EVAL); \ } while (FALSE) #define ENTER_WEVAL(s) \ do { \ wexpr_val = MIX_WORD_ZERO; \ wexpr_val_tmp = MIX_WORD_ZERO; \ is_fp = FALSE; \ yyless (s); \ yy_push_state (WEVAL); \ } while (FALSE) #define RETURN_ERROR(error, comment) \ do { \ int c; \ mix_parser_log_error (parser, error, lineno, comment, FALSE); \ while ( (c = input ()) != '\n' && c != EOF ) ; \ if ( c == EOF ) return error; else ++lineno; \ RESET (); \ BEGIN (INITIAL); \ } while (FALSE) static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y); static void unput_word_ (mix_word_t word); %} %option nomain %option caseless %option array %option stack %option noyywrap %option noyy_top_state %option noreject %option outfile="lex.yy.c" %s LOC %s OP %s ADDRESS %s INDEX %s FSPEC %s EVAL %s WEVAL %s ORIG %s CON %s EQU %s END ws [ \t] digit [0-9] letter [A-Z] number [+-]?{digit}+ mixchar [0-9A-Z .,'')(+*/=$<>@;:\-] locsymbol {digit}H flocsymbol {digit}F blocsymbol {digit}B symbol {digit}*{letter}+[A-Z0-9]* binop "+"|"-"|"*"|"/"|"//"|":" atexpr {digit}+|{symbol}|\* expr [+-]?{atexpr}({binop}{1}{atexpr})* fpart \({expr}\) wexpr {expr}({fpart})?(,{expr}({fpart})?)* %% %{ mix_ins_t ins; gboolean nof = FALSE, is_fp = FALSE, end = FALSE, lsf = FALSE; mix_word_t expr_val = MIX_WORD_ZERO, wexpr_val = MIX_WORD_ZERO, wexpr_val_tmp = MIX_WORD_ZERO; gchar *symbol = NULL, *lsymbol = NULL; mix_address_t loc = MIX_SHORT_ZERO; guint lineno = 1; mix_ins_fill_from_id (ins, mix_NOP); ins.address = 0; ins.index = 0; parser->err_line = 0; #ifdef FLEX_DEBUG yy_flex_debug = getenv("FLEX_DEBUG"); #endif yyin = mix_file_to_FILE (parser->in_file); yyrestart (yyin); %} <*><> { mix_parser_log_error (parser, MIX_PERR_UNEX_EOF, lineno, NULL, FALSE); return MIX_PERR_UNEX_EOF; } { ^\*.* /* eat comments */ . { if (end) { return parser->status; } yyless (0); BEGIN (LOC); } \n { ++lineno; if (end) { return parser->status; } } } { {ws}+ BEGIN (OP); /* LOC field is empty */ {locsymbol} { /* manage local symbol */ loc = get_ploc_ (parser); lsymbol = g_strdup (yytext); if ( lsymbol == NULL ) { mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); return MIX_PERR_INTERNAL; } BEGIN (OP); } {locsymbol}/({ws}+EQU) {/* local symbol with value */ loc = get_ploc_ (parser); symbol = g_strdup (yytext); lsymbol = g_strdup (yytext); if ( symbol == NULL || lsymbol == NULL) { mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); return MIX_PERR_INTERNAL; } symbol[1] = 'B'; /* this will be referred as nB afterwards */ BEGIN (OP); } {flocsymbol}|{blocsymbol} RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext); {symbol}/({ws}+EQU) { /* store symbol name for future definition */ symbol = g_strdup (yytext); if ( symbol == NULL ) { mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); return MIX_PERR_INTERNAL; } BEGIN (OP); } {symbol} { /* define a new symbol */ mix_parser_err_t err; if ( mix_get_id_from_string (yytext) != mix_INVALID_INS ) mix_parser_log_error (parser, MIX_PERR_SYM_INS, lineno, yytext, TRUE); if ( (err = mix_parser_define_symbol_here (parser,yytext)) != MIX_PERR_OK ) mix_parser_log_error (parser, err, lineno, yytext, FALSE); BEGIN (OP); } . RETURN_ERROR (MIX_PERR_INV_LOC, yytext); \n ++lineno; /* empty line */ } { {ws}+ /* eat leading whitespace */ \n RETURN_ERROR (MIX_PERR_NOOP, NULL); ORIG{ws}+ BEGIN (ORIG); CON{ws}+ BEGIN (CON); EQU{ws}+ BEGIN (EQU); END{ws}+ BEGIN (END); ALF{ws}+\"{mixchar}{0,5}\"{ws}+.*\n | ALF{ws}+\"{mixchar}{0,5}\"{ws}*\n { mix_byte_t bytes[5]; mix_word_t value; guint k, j = 4; while ( yytext[j++] != '\"' ) ; for ( k = j; k < 5+j && yytext[k] != '\"'; ++k ) bytes[k-j] = mix_ascii_to_char (yytext[k]); if ( k-j < 5 ) { mix_parser_log_error (parser, MIX_PERR_SHORT_ALF, lineno, NULL, TRUE); /* Fill with spaces */ for (; k < 5+j; k++) bytes[k-j] = mix_ascii_to_char (' '); } else if ( yytext[k] != '\"' ) mix_parser_log_error (parser, MIX_PERR_LONG_ALF, lineno, NULL, TRUE); value = mix_bytes_to_word (bytes, 5); ADD_RAW (value, FALSE); } ALF{ws}*\n { mix_byte_t bytes[5]; memset (bytes, mix_ascii_to_char (' '), 5); mix_word_t value = mix_bytes_to_word (bytes, 5); ADD_RAW (value, FALSE); } ALF{ws}+({mixchar}{1,5}) { mix_byte_t bytes[5]; mix_word_t value; int i, n; for (n = 3; n < yyleng; n++) if (!isspace (yytext[n])) break; for (i = 0; i < 5 && n < yyleng; i++, n++) bytes[i] = mix_ascii_to_char (yytext[n]); for (; i < 5; i++) bytes[i] = mix_ascii_to_char (' '); value = mix_bytes_to_word (bytes, 5); ADD_RAW (value, FALSE); } /* ALF " " */ [A-Z0-9]+{ws}*/\n | [A-Z0-9]+{ws}+ { mix_ins_id_t id = mix_get_id_from_string (g_strchomp (yytext)); if ( id == mix_INVALID_INS ) mix_parser_log_error (parser, MIX_PERR_INV_OP, lineno, yytext, FALSE); else { mix_ins_fill_from_id (ins, id); nof = mix_ins_id_is_extended (id); } BEGIN (ADDRESS); } {expr} RETURN_ERROR (MIX_PERR_INV_OP, yytext); . RETURN_ERROR (MIX_PERR_INV_OP, yytext); } { {number}{ws}*\n | {number}{ws}+.*\n { mix_word_t value = mix_word_new (atol (yytext)); parser->loc_count = mix_word_to_short_fast (value); ++lineno; BEGIN (INITIAL); } } { {number}{ws}*\n | {number}{ws}+.*\n { mix_word_t value = mix_word_new (atol (yytext)); ADD_RAW (value, TRUE); } } { {number}{ws}*\n | {number}{ws}+.*\n { gint def = MIX_PERR_MIS_SYM; if (symbol) { mix_word_t value = mix_word_new (atol (yytext)); def = mix_parser_define_symbol_value (parser, symbol, value); } switch (def) { case MIX_SYM_DUP: RETURN_ERROR (MIX_PERR_DUP_SYMBOL, symbol); break; case MIX_SYM_LONG: RETURN_ERROR (MIX_PERR_LONG_SYMBOL, symbol); break; case MIX_PERR_MIS_SYM: mix_parser_log_error (parser, def, lineno, NULL, TRUE); break; default: break; } ++lineno; BEGIN (INITIAL); } } { {number}{ws}*\n | {number}{ws}+.*\n { parser->start = mix_short_new (atol (yytext)); parser->end = parser->loc_count; end = TRUE; if ( parser->status == MIX_PERR_NOCOMP ) parser->status = MIX_PERR_OK; RESET (); BEGIN (INITIAL); return parser->status; } } { {wexpr} ENTER_WEVAL (0); . RETURN_ERROR (MIX_PERR_INV_OP, yytext); } {locsymbol} RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext);
{ =/[+-]?{number}= lsf = TRUE; =/{expr}= lsf = TRUE; ={wexpr}= { lsf = TRUE; ENTER_WEVAL (1); } [+-]?{number}={ws}*\n | [+-]?{number}={ws}+.*\n { if (!lsf) RETURN_ERROR (MIX_PERR_INV_ADDRESS, yytext); mix_parser_define_ls (parser, mix_word_new (atol (yytext))); lsf = FALSE; ADD_INS (); } [+-]?{number}=[(,] { int pos = yyleng - 3; if (!lsf) RETURN_ERROR (MIX_PERR_INV_ADDRESS, yytext); unput (yytext[yyleng - 1]); while (pos >= 0) { unput (yytext[pos]); --pos; } } [+-]?{number}{ws}+.*\n | [+-]?{number}[(,\n] { ins.address = mix_short_new (atol (yytext)); switch ( yytext[yyleng-1] ) { case '(' : BEGIN (FSPEC); break; case ',' : BEGIN (INDEX); break; case '\n' : ADD_INS (); break; default: g_assert_not_reached (); } } ([+-]?{symbol})/[(,\n\t ] { gboolean neg = (yytext[0] == '-'); const gchar *s = (neg || yytext[0] == '+')? yytext+1 : yytext; if ( !mix_symbol_table_is_defined (parser->symbol_table, s) ) { mix_parser_set_future_ref (parser, s); if (neg) mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, lineno, s, TRUE); unput (neg? '1':'0'); } else { mix_word_t v = mix_symbol_table_value (parser->symbol_table, s); if ( neg ) mix_word_reverse_sign (v); unput_word_ (v); } } {expr}/[(,=\n\t ] ENTER_EVAL (); \n ADD_INS (); . RETURN_ERROR (MIX_PERR_INV_ADDRESS, yytext); } { {number}[\n(\t ] { int end = yytext[yyleng-1]; ins.index = mix_byte_new (atol (yytext)); if ( end == '\n' ) ADD_INS (); else if ( end == '(' ) BEGIN (FSPEC); else { /* eat rest of line (comment) */ while ( (end = input()) != '\n' && end != EOF ) ; if ( end == '\n' ) ADD_INS (); else RETURN_ERROR (MIX_PERR_UNEX_EOF, NULL); } } {expr}/[\n(\t ] ENTER_EVAL (); \n { mix_parser_log_error (parser, MIX_PERR_INV_IDX, lineno++, NULL, FALSE); RESET (); BEGIN (INITIAL); } . RETURN_ERROR (MIX_PERR_INV_IDX, yytext); } { {number}")"(({ws}+.*\n)|\n) { glong val = atol (yytext); if (val < 0 || val > MIX_BYTE_MAX) RETURN_ERROR (MIX_PERR_INV_FSPEC, NULL); if (ins.opcode != mix_opMOVE && ins.opcode != mix_opNOP && ( ins.opcode < mix_opJBUS || ins.opcode > mix_opJXx ) && !mix_fspec_is_valid (mix_byte_new (val)) ) { gchar *spec = g_strdup_printf ("%d", (int)val); mix_parser_log_error (parser, MIX_PERR_INV_FSPEC, lineno, spec, TRUE); g_free (spec); } if (nof) { mix_parser_log_error (parser, MIX_PERR_INV_FSPEC, lineno, "ignored", TRUE); } else { ins.fspec = mix_byte_new (val); if (lsf) { mix_parser_define_ls (parser, mix_short_to_word_fast (ins.address)); ins.address = MIX_WORD_ZERO; lsf = FALSE; } ADD_INS (); } } {expr}/")" { ENTER_EVAL (); } . RETURN_ERROR (MIX_PERR_INV_FSPEC, yytext); } { {binop}{digit}+ { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; mix_word_t value = mix_word_new (atol (s)); expr_val = eval_binop_ (yytext, expr_val, value); } {binop}{symbol} { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; if ( !mix_symbol_table_is_defined (parser->symbol_table, s) ) { mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, lineno, s, FALSE); yy_pop_state (); } expr_val = eval_binop_ (yytext, expr_val, mix_symbol_table_value (parser->symbol_table, s)); } {binop}"*" { expr_val = eval_binop_ (yytext, expr_val, mix_short_to_word_fast (parser->loc_count)); } "*" unput_word_ (mix_short_to_word_fast (parser->loc_count)); {number} expr_val = mix_word_new (atol (yytext)); {symbol} { if ( !mix_symbol_table_is_defined (parser->symbol_table, yytext) ) { mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, lineno, yytext, FALSE); yy_pop_state (); } expr_val = mix_symbol_table_value (parser->symbol_table, yytext); } [,)(=\n\t ] unput (yytext[0]); unput_word_ (expr_val); yy_pop_state (); . RETURN_ERROR (MIX_PERR_INV_EXPR, yytext); } { {number}"(" { is_fp = TRUE; wexpr_val_tmp = mix_word_new (atol (yytext)); } {number}")" { glong val = atol (yytext); if ( !is_fp ) { mix_parser_log_error (parser, MIX_PERR_MIS_PAREN, lineno, NULL, FALSE); yy_pop_state (); } if ( val < 0 || val > MIX_BYTE_MAX || !mix_fspec_is_valid (mix_byte_new (val)) ) { mix_parser_log_error (parser, MIX_PERR_INV_FSPEC, lineno, NULL, FALSE); yy_pop_state (); } is_fp = FALSE; wexpr_val = mix_word_store_field (mix_byte_new (val), wexpr_val_tmp, wexpr_val); } {number}/[,()\n\t ] wexpr_val = mix_word_new (atol (yytext)); {expr}/[,()\n\t ] ENTER_EVAL (); ,/{expr} /* eat comma if followed by expression */ [=\n\t ] { /* ok if not inside an f-part */ if ( is_fp ) { mix_parser_log_error (parser, MIX_PERR_MIS_PAREN, lineno, NULL, FALSE); yy_pop_state (); } unput (yytext[yyleng-1]); unput_word_ (wexpr_val); yy_pop_state (); } . RETURN_ERROR (MIX_PERR_INV_EXPR, NULL); } %% static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y) { mix_word_t result = MIX_WORD_ZERO; switch (op[0]) { case '+': result = mix_word_add (x,y); break; case '-': result = mix_word_sub (x,y); break; case '*': mix_word_mul (x, y, NULL, &result); break; case ':': { mix_word_t a; mix_word_mul (x, 8, NULL, &a); result = mix_word_add (a, y); break; } case '/': if ( strlen (op) > 1 && op[1] == '/' ) { mix_word_div (x,MIX_WORD_ZERO,y, &result, NULL); } else { mix_word_div (MIX_WORD_ZERO, x, y, &result, NULL); } break; default: g_assert_not_reached (); } return result; } static void unput_word_ (mix_word_t word) { gchar *value; gint k; value = g_strdup_printf ("%s%ld", mix_word_is_negative (word)? "-":"+", mix_word_magnitude (word)); for (k = strlen (value) - 1; k >= 0; --k) unput (value[k]); g_free (value); } mdk-1.2.9/mixlib/testsuite/0000755000175000017500000000000012636571405012625 500000000000000mdk-1.2.9/mixlib/testsuite/test.h0000644000175000017500000000247310770465100013672 00000000000000/* ** Copyright (C) 1999 Free Software Foundation, Inc. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ /* Common definitions for test programs */ #ifndef TEST_H #define TEST_H #include #include #define PRINT_BYTE(byte) g_print("%s = %02d",#byte,byte) #ifdef VERBOSE_TEST /* get printed information */ #define INIT_TEST \ do { g_set_print_handler(NULL); mix_init_lib(); } while(FALSE); #else /* no printed information */ static void dummy_print_f_(const gchar *m) { /* no output */ } #define INIT_TEST \ do { g_set_print_handler(dummy_print_f_); mix_init_lib(); } while(FALSE); #endif /* VERBOSE_TEST */ #endif /* TEST_H */ mdk-1.2.9/mixlib/testsuite/mix_types_t.c0000644000175000017500000002705310770465100015253 00000000000000/*----------------------- mix_types_t.c ----------------------------- * Tests for mix_types.h * ------------------------------------------------------------------ * ** Copyright (C) 1999, 2004 Free Software Foundation, Inc. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #include #include /* Define VERBOSE_TEST if you want to get prints of the test */ /* #define VERBOSE_TEST */ #include "test.h" /* compare two words */ static gboolean word_compare_(mix_word_t w1, mix_word_t w2) { if ( mix_word_magnitude(w1) == 0 ) return ( mix_word_magnitude(w2) == 0 ); else return ( w1 == w2 ); } /* create a word from an array of bytes and check the result */ static void test_word_from_bytes_(mix_word_t *word, mix_byte_t *bytes, unsigned byteno, const char *message) { mix_byte_t r; unsigned int k; *word = mix_bytes_to_word(bytes,byteno); mix_word_print(*word,message); g_print("\n"); for ( k = 5-byteno; k < 5; ++k ) { PRINT_BYTE(r = mix_word_get_byte(*word,k+1)); g_print(" (k = %d)\n",k); g_assert( r == bytes[k-5+byteno] ); } } /* test field access */ static void test_field_access_(mix_fspec_t l, mix_fspec_t r, mix_word_t from, mix_word_t to) { mix_fspec_t f = mix_fspec_new(l,r); mix_word_t result; PRINT_BYTE(l); g_print(", "); PRINT_BYTE(r); g_print(", "); PRINT_BYTE(f); g_print("\n "); mix_word_print(from, "from: "); mix_word_print(to, " to: "); g_assert( mix_fspec_left(f) == l ); g_assert( mix_fspec_right(f) == r ); result = mix_word_set_field(f,from,to); mix_word_print(result,"\n\tresult: "); g_assert( mix_word_get_field(f,from) == mix_word_get_field(f,result) ); g_print("\n"); } /* test word addition */ static void test_word_add_(mix_word_t w1, mix_word_t w2) { mix_word_t r; r = mix_word_add(w1,w2); mix_word_print(w1,"\n"); mix_word_print(w2,NULL); mix_word_print(r," = "); g_assert( word_compare_(mix_word_sub(r,w1), w2) ); g_assert( word_compare_(mix_word_sub(r,w2), w1) ); /* while asserting the following, take into account that 0 != -0 for mix words, although they are logically equivalent */ g_assert( word_compare_(mix_word_sub(w1,r), mix_word_negative(w2)) ); g_assert( word_compare_(mix_word_sub(w2,r), mix_word_negative(w1)) ); g_assert( word_compare_(mix_word_add(w2,w1), r) ); } /* test word multiplication */ static void test_word_mul_(mix_word_t w1, mix_word_t w2) { mix_word_t h, l, q, r = 0; mix_word_mul(w1,w2,&h,&l); mix_word_print(w1,"\n"); mix_word_print(w2,"*"); mix_word_print(h,"\n ="); mix_word_print(l,NULL); if ( w1 != 0 ) { g_assert( mix_word_div(h,l,w1,&q,&r) == FALSE ); g_assert( mix_word_magnitude(r) == 0 ); g_assert( q == w2 ); } else { g_assert( mix_word_magnitude(l) == 0 && mix_word_magnitude(h) == 0 ); } if ( w2 != 0 ) { g_assert( mix_word_div(h,l,w2,&q,&r) == FALSE ); g_assert( mix_word_magnitude(r) == 0 ); g_assert( q == w1 ); } else { g_assert( mix_word_magnitude(l) == 0 && mix_word_magnitude(h) == 0 ); } } /* test word division */ static void test_word_div_(mix_word_t h, mix_word_t l, mix_word_t by) { mix_word_t q,r; gboolean overflow; overflow = mix_word_div(h,l,by,&q,&r); mix_word_print(h,"\n\n"); mix_word_print(l,NULL); mix_word_print(by,"\n div by "); if ( !overflow ) { mix_word_t h1, l1, h2; mix_word_print(q,"\n q = "); mix_word_print(r," r = "); mix_word_mul(by,q,&h1,&l1); mix_word_add_and_carry(l1,r,&h2,&l1); h1 = mix_word_add(h1,h2); g_assert( mix_word_magnitude(r) < mix_word_magnitude(by) ); g_assert( word_compare_(h1,h) ); g_assert( mix_word_magnitude(l1) == mix_word_magnitude(l) ); } else g_print("\n\t = overflow"); } static void test_mix_char_(void) { mix_char_t mchar; guchar achar; guint k; g_print("\nTesting mix_char_t. Table of mix_chars:\n"); for (k = 0; k < MIX_CHAR_MAX + 1; ++k) { mchar = k; achar = mix_char_to_ascii(mchar); g_print("%02d: %c, ", k, achar); if ( (k+1)%5 == 0 ) g_print("\n"); g_assert( mchar == mix_ascii_to_char(achar) ); } g_print("\nchar <-> byte conversions...\n"); for (k = 0; k < MIX_CHAR_MAX + 1; ++k) { mix_byte_t c = mix_byte_new (k); g_assert (c == mix_byte_to_char (mix_char_to_byte (c))); } g_print("\n"); } /* main test driver for mix_types.h/c */ int main(int argc, char **argv) { unsigned int j,k; mix_byte_t bytes[5] = { 0, 3, 20, 30, 40 }; mix_byte_t r; mix_short_t ss[6]; mix_word_t words[6]; INIT_TEST; g_print("Testing mix_byte_t arithmetics...\n"); PRINT_BYTE(bytes[0]); g_print(", "); PRINT_BYTE(bytes[1]); g_print(", "); PRINT_BYTE(bytes[2]); g_print(", "); PRINT_BYTE(bytes[3]); g_print(", "); PRINT_BYTE(bytes[4]); g_print("\n"); PRINT_BYTE(r = mix_byte_add(bytes[1],bytes[2])); g_print("\n"); g_assert(r == 23); PRINT_BYTE(r = mix_byte_add(bytes[3],bytes[4])); g_print("\n"); g_assert(r == 6); PRINT_BYTE(r = mix_byte_sub(bytes[0],bytes[1])); g_print("\n"); g_assert(r == 61); PRINT_BYTE(r = mix_byte_sub(bytes[4],bytes[3])); g_print("\n"); g_assert(r == 10); PRINT_BYTE(r = mix_byte_sub(bytes[1],bytes[4])); g_print("\n"); g_assert(r == 27); PRINT_BYTE(r = mix_byte_mul(bytes[0],bytes[1])); g_print("\n"); g_assert(r == 0); PRINT_BYTE(r = mix_byte_mul(bytes[1],bytes[2])); g_print("\n"); g_assert(r == 60); PRINT_BYTE(r = mix_byte_mul(bytes[1],bytes[4])); g_print("\n"); g_assert(r == 56); PRINT_BYTE(r = mix_byte_mul(bytes[4],bytes[1])); g_print("\n"); g_assert(r == 56); PRINT_BYTE(r = mix_byte_div(bytes[4],bytes[2])); g_print("\n"); g_assert(r == 2); PRINT_BYTE(r = mix_byte_div(bytes[3],bytes[2])); g_print("\n"); g_assert(r == 1); test_mix_char_(); g_print("\nTesting word<->short conversions..."); words[0] = mix_bytes_to_word(bytes+1,5); words[1] = mix_word_negative(words[0]); ss[0] = mix_word_to_short(words[0]); ss[1] = mix_word_to_short(words[1]); mix_word_print(words[0],"\nwords[0]="); mix_word_print(words[1],"\nwords[1]="); mix_short_print(ss[0],"\nss[0]="); mix_short_print(ss[1],"\nss[1]="); g_assert(mix_short_is_positive(ss[0])); g_assert(mix_short_is_negative(ss[1])); words[2] = mix_short_to_word(ss[0]); words[3] = mix_short_to_word(ss[1]); mix_word_print(words[2],"\nwords[2]="); mix_word_print(words[3],"\nwords[3]="); g_assert(mix_word_sign(words[0]) == mix_word_sign(words[2])); g_assert(mix_word_sign(words[1]) == mix_word_sign(words[3])); g_assert(mix_short_magnitude(ss[0]) == mix_word_magnitude(words[2])); g_assert(mix_short_magnitude(ss[1]) == mix_word_magnitude(words[3])); g_assert(mix_word_get_byte(words[0],4) == mix_word_get_byte(words[2],4)); g_assert(mix_word_get_byte(words[0],5) == mix_word_get_byte(words[2],5)); g_assert(mix_word_get_byte(words[1],4) == mix_word_get_byte(words[3],4)); g_assert(mix_word_get_byte(words[1],5) == mix_word_get_byte(words[3],5)); words[4] = mix_word_extract_field(mix_fspec_new(4,5),words[0]); words[5] = mix_word_extract_field(mix_fspec_new(4,5),words[1]); mix_word_reverse_sign(words[5]); g_assert(words[4] == words[2]); g_assert(words[5] == words[3]); g_print("Testing mix_word_t creation and byte access...\n"); test_word_from_bytes_(words,bytes,5,"word[0] created from bytes[0-4]"); test_word_from_bytes_(words+1,bytes,4,"\nword[1] created from bytes[0-3]"); test_word_from_bytes_(words+2,bytes,3,"\nword[2] created from bytes[0-2]"); words[3] = mix_word_negative(words[2]); g_assert( mix_word_negative(words[3]) == words[2] ); g_assert( mix_word_is_negative(words[3]) && !mix_word_is_negative(words[2])); mix_word_print(words[3],"\nword[3] created from -word[2]"); test_word_from_bytes_(words+4,bytes+2,2,"\nword[2] created from bytes[2-3]"); g_print("\nTesting mix_word_t field access...\n"); mix_word_set_byte(words+3,1,12); mix_word_set_byte(words+3,2,58); g_assert( mix_word_get_byte(words[3],1) == 12 ); g_assert( mix_word_get_byte(words[3],2) == 58 ); test_field_access_(0,5,words[3],words[4]); test_field_access_(1,5,words[3],words[4]); test_field_access_(2,5,words[3],words[4]); test_field_access_(3,5,words[3],words[4]); test_field_access_(4,5,words[3],words[4]); test_field_access_(5,5,words[3],words[4]); test_field_access_(0,0,words[3],words[4]); g_print("\n\nTesting mix_word_t arithmetics...\n"); words[0] = MIX_WORD_MAX; words[1] = mix_word_negative(words[0]); for ( k = 1; k < 6; ++k ) { mix_word_set_byte(words+2,k,5*k); mix_word_set_byte(words+4,k,10*(5-k)); mix_word_set_byte(words+3,k,21 + 3*k); } words[5] = 0; g_print("\n***addition***"); for ( k = 0; k < 6; ++k ) for ( j = 0; j <= k; ++j ) { test_word_add_(words[k],mix_word_negative(words[j])); test_word_add_(words[k],words[j]); } g_print("\n***product***"); for ( k = 0; k < 6; ++k ) for ( j = 0; j <= k; ++j ) { test_word_mul_(words[k],words[j]); } g_print("\n***division***"); for ( k = 0; k < 6; ++k ) { test_word_div_(words[k],0,words[0]); for ( j = 0; j <= k; ++j ) { test_word_div_(k,words[j],words[j]); test_word_div_(0,mix_word_add(mix_word_magnitude(words[j]),j),words[j]); test_word_div_(mix_word_negative(k),words[j],words[j]); } } g_print("\nTesting shift operations...\n"); for ( k = 0; k < 10; ++k ) mix_word_set_byte(words+(k/5),1+(k%5),k+1); mix_word_print(words[0],"A = "); mix_word_print(words[1],"X = "); for ( k = 0; k < 11; ++k ) { mix_word_t A, X; unsigned int m; mix_word_shift_left(words[0],words[1],k,&A,&X); g_print("\nShift left %d:\n",k); mix_word_print(A,"A "); mix_word_print(X,"X "); for ( m = 0; m < 10 - k; ++m ) g_assert( mix_word_get_byte( m < 5 ? A:X, (m%5)+1 ) == mix_word_get_byte(words[(m+k)/5], ((m+k)%5)+1) ); for ( ; m < 10; ++m ) g_assert( mix_word_get_byte( m < 5 ? A:X, (m%5)+1 ) == 0 ); mix_word_shift_right(words[0],words[1],k,&A,&X); g_print("\nShift right %d:\n",k); mix_word_print(A,"A "); mix_word_print(X,"X "); for ( m = 0; m < k; ++m ) g_assert( mix_word_get_byte( m < 5 ? A:X, (m%5)+1 ) == 0 ); for ( ; m < 10; ++m ) g_assert( mix_word_get_byte( m < 5 ? A:X, (m%5)+1 ) == mix_word_get_byte(words[(m-k)/5], ((m-k)%5)+1) ); mix_word_shift_left_circular(words[0],words[1],k,&A,&X); g_print("\nShift left circular %d:\n",k); mix_word_print(A,"A "); mix_word_print(X,"X "); for ( m = 0; m < 10 - k; ++m ) g_assert( mix_word_get_byte( m < 5 ? A:X, (m%5)+1 ) == mix_word_get_byte(words[(m+k)/5], ((m+k)%5)+1) ); for ( ; m < 10; ++m ) g_assert( mix_word_get_byte( m < 5 ? A:X, (m%5)+1 ) == mix_word_get_byte(words[(m-10+k)/5], 1+((m-10+k)%5)) ); mix_word_shift_right_circular(A, X, k, &A, &X); g_print("\nRe-shiftting right...\n"); mix_word_print(A, "A "); mix_word_print(X, "X "); g_assert(A == words[0]); g_assert(X == words[1]); } g_print("\n"); return EXIT_SUCCESS; } mdk-1.2.9/mixlib/testsuite/mix_ins_t.c0000644000175000017500000000477210770465100014703 00000000000000/*----------------------- mix_ins_t.c ------------------------------- * Tests for mix_ins.h *------------------------------------------------------------------- ** Copyright (C) 1999 Free Software Foundation, Inc. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #include #include /* Define VERBOSE_TEST if you want to get prints of the test */ /* #define VERBOSE_TEST */ #include "test.h" int main(int argc, const char**argv) { mix_word_t words[6]; mix_ins_t ins[3]; guint k; INIT_TEST; g_print("\n...ok.\nTesting mix_ins_id_t properties...\n"); for ( k = 0; k < mix_INVALID_INS; ++k ) { mix_opcode_t c = mix_get_opcode_from_id(k); mix_fspec_t f = mix_get_fspec_from_id(k); mix_ins_id_t id = mix_get_ins_id(c,f); g_print("%02d:%s (%1d:%1d), ", c, mix_get_string_from_id(k), mix_fspec_left(f), mix_fspec_right(f)); if ( (k+1)%3 == 0 ) g_print("\n"); g_assert(id==k); } g_print("\n...ok.\nTesting mix_ins_t properties...\n"); for ( k = 1; k < mix_INVALID_INS; ++k ) { g_print("%d ",k); mix_ins_fill_from_id(ins[0], k); g_assert(mix_ins_id_from_ins(ins[0]) == k); ins[0].address = 0x0123; ins[0].index = mix_I2; words[2] = mix_ins_to_word(ins); g_assert(ins[0].address == mix_get_ins_address(words[2])); g_assert(ins[0].index == mix_get_ins_index(words[2])); g_assert(ins[0].fspec == mix_get_ins_fspec(words[2])); g_assert(ins[0].opcode == mix_get_ins_opcode(words[2])); g_assert(mix_word_to_ins(words[2],ins+1) == k); g_assert(ins[0].address == ins[1].address); g_assert(ins[0].index == ins[1].index); g_assert(ins[0].fspec == ins[1].fspec); g_assert(ins[0].opcode == ins[1].opcode); } g_print("\n...ok.\n"); return EXIT_SUCCESS; } mdk-1.2.9/mixlib/testsuite/mix_device_t.c0000644000175000017500000000375710770465100015353 00000000000000/* -*-c-*- -------------- mix_device_t.c : * Implementation of the functions declared in mix_device_t.h * ------------------------------------------------------------------ * Copyright (C) 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include /* Define VERBOSE_TEST if you want to get prints of the test */ /* #define VERBOSE_TEST */ #include "test.h" static int S_ = MIX_CHAR_MAX +1; int main (int argc, char **argv) { mix_device_t *console; size_t s; mix_word_t **block; mix_char_t mchars[S_]; gchar chars[S_]; int i, j; int bno; INIT_TEST; console = mix_device_new (mix_dev_CONSOLE); s = mix_device_block_size (console); bno = S_/(s*5); if (bno == 0) bno = 1; block = g_new (mix_word_t *, bno); for (i = 0; i < bno; ++i) block[i] = g_new (mix_word_t, s); for (i = 0; i < S_; ++i) { chars[i] = mix_char_to_ascii (i); mchars[i] = mix_ascii_to_char (chars[i]); g_assert (mchars[i] == i); } for (i = 0; i < bno; ++i) { for (j = 0; j < s; ++j) { int n = i*s + 5*j; if (n < S_) block[i][j] = mix_bytes_to_word (mchars + n, 5); else block[i][j] = 0; } } for (i = 0; i < bno; ++i) { mix_device_write (console, block[i]); } return EXIT_SUCCESS; } mdk-1.2.9/mixlib/testsuite/mix_eval_t.c0000644000175000017500000000655510770465100015042 00000000000000/* -*-c-*- -------------- mix_eval_t.c : * Test of mix_eval_t * ------------------------------------------------------------------ * Last change: Time-stamp: "01/02/20 00:26:15 jose" * ------------------------------------------------------------------ * Copyright (C) 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include /* Define VERBOSE_TEST if you want to get prints of the test */ /* #define VERBOSE_TEST */ #include "test.h" typedef struct test_case_t { const gchar *expr; gint value; mix_eval_result_t result; } test_case_t; #define ok_case(exp,val) {exp, val, MIX_EVAL_OK} #define err_case(exp,err) {exp, 0, err} typedef struct sym_val_t { const gchar *sym; mix_word_t value; } sym_val_t; #define new_symbol(sym,val) {sym, mix_word_new (val)} int main(int argc, char **argv) { size_t k; mix_eval_t *eval; mix_short_t loc = mix_short_new (30); sym_val_t symbols[] = { new_symbol ("s0", 43), new_symbol ("s1", -1234), new_symbol ("s2", 0), new_symbol ("s3", -20), new_symbol (NULL, 0) }; test_case_t cases[] = { ok_case ("2343", 2343), ok_case ("-890", -890), ok_case ("15+1015", 1030), ok_case ("1-481", -480), ok_case ("2300/10", 230), ok_case ("24*3", 72), ok_case ("2:5", 21), ok_case ("1//3", 357913941), ok_case ("12+*", 42), ok_case ("***", 900), ok_case ("1:3*2-4", 18), ok_case ("-1+5*20/6", 13), ok_case ("-1000(0,2),1", 1), ok_case ("s0-s2*3", 129), ok_case ("s3**", -600), ok_case ("s3(3:5)", 20), ok_case ("-s1", 1234), ok_case ("s1/10+s0", 166), err_case ("foo", MIX_EVAL_UNDEF_SYM), err_case ("11--2", MIX_EVAL_SYNTAX), err_case ("s2*foo*3", MIX_EVAL_UNDEF_SYM), err_case ("12/32),1", MIX_EVAL_MIS_PAREN), err_case ("2000(88)", MIX_EVAL_INV_FSPEC), ok_case (NULL, 0) }; INIT_TEST; g_print ("Entering mix_eval test..."); eval = mix_eval_new (); for (k = 0; symbols[k].sym; ++k) mix_eval_set_symbol (eval, symbols[k].sym, symbols[k].value); for (k = 0; cases[k].expr; ++k) { mix_eval_result_t r = cases[k].result, s; g_print ("Evaluating \"%s\" = %d ...", cases[k].expr, cases[k].value); s = mix_eval_expression_with_loc (eval, cases[k].expr, loc); g_assert (s == r); if ( s == MIX_EVAL_OK ) { mix_word_print (mix_eval_value (eval), "... "); g_print ("\n"); g_assert (mix_eval_value (eval) == mix_word_new(cases[k].value)); } else { g_print ("\n------->%s, at pos %d\n", mix_eval_last_error_string (eval), mix_eval_last_error_pos (eval)); } } mix_eval_delete (eval); return EXIT_SUCCESS; } mdk-1.2.9/mixlib/testsuite/Makefile.am0000644000175000017500000000257612262422647014611 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2006, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. AM_CFLAGS += -I$(includedir) -I$(top_srcdir) -I$(top_srcdir)/mixlib LDADD = $(top_builddir)/mixlib/libmix.a check_PROGRAMS = mixtypest mixinstest mixvminstest mixparsertest mixdevtest mixevaltest TESTS = $(check_PROGRAMS) MIXAL_FILES= "\"tests/bt\",\"tests/cbp\",\"tests/stress0\",\"tests/stress1\",\"tests/stress2\",\"tests/stress4\",\"tests/stress5\",\"tests/stress6\",\"tests/ldan\",\"tests/lockonw\",\"tests/negwrite\",\"hello\",\"echo\",\"primes\",\"isains\"" AM_CFLAGS += -DMIX_TEST_MIXAL_FILES=$(MIXAL_FILES) -DMIX_TEST_SAMPLES_DIR="\"$(top_srcdir)/samples\"" mixtypest_SOURCES = test.h mix_types_t.c mixinstest_SOURCES = test.h mix_ins_t.c mixvminstest_SOURCES = test.h mix_vm_ins_t.c mixdevtest_SOURCES = test.h mix_device_t.c mixevaltest_SOURCES = test.h mix_eval_t.c mixparsertest_SOURCES = test.h mix_parser_t.c distclean-local: rm -f *.mix mdk-1.2.9/mixlib/testsuite/mix_parser_t.c0000644000175000017500000000402312112755472015401 00000000000000/* -*-c-*- -------------- mix_parser_t.c : * Test of mix_parser_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2006 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include /* Define VERBOSE_TEST if you want to get prints of the test */ /* #define VERBOSE_TEST */ #include "test.h" static const gchar * const FILES_[] = {MIX_TEST_MIXAL_FILES}; static const size_t FILE_NO_ = sizeof(FILES_)/sizeof(FILES_[0]); static void test_code_ (const gchar *name) { mix_code_file_t *code; mix_parser_err_t err; gchar *real_name = g_strdup_printf ("%s/%s", MIX_TEST_SAMPLES_DIR, name); gchar *code_name = g_path_get_basename (name); mix_parser_t *parser = mix_parser_new (real_name); g_assert (parser); err = mix_parser_compile (parser); if (err != MIX_PERR_OK) { g_print (mix_parser_err_string (err)); g_print ("\n"); } g_assert (err == MIX_PERR_OK); err = mix_parser_write_code (parser, code_name, FALSE); code = mix_code_file_new_read (code_name); g_assert (code); mix_parser_delete (parser); mix_code_file_delete (code); g_free (real_name); g_free (code_name); } int main(int argc, char **argv) { size_t k; INIT_TEST; for (k = 0; k < FILE_NO_; ++k) test_code_(FILES_[k]); return EXIT_SUCCESS; } mdk-1.2.9/mixlib/testsuite/mix_vm_ins_t.c0000644000175000017500000003336012622454575015414 00000000000000/* ---------------------- mix_vm_ins_t.c : * Tests for the virtual machine instruction handlers. * ------------------------------------------------------------------ ** Copyright (C) 2000, 2004 Free Software Foundation, Inc. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #include /* #define VERBOSE_TEST */ #include "test.h" #include "mix_vm.h" #include "mix_vm_dump.h" typedef struct { mix_word_t rA_b, rA_a; mix_word_t rX_b, rX_a; mix_short_t rJ_b, rJ_a; mix_short_t rI_b[6], rI_a[6]; gboolean over_b, over_a; mix_cmpflag_t cmp_b, cmp_a; mix_address_t begin, end; mix_word_t *cells_b, *cells_a; const mix_ins_t *ins; } test_desc_t; static void set_cells_(test_desc_t *t, mix_address_t begin, mix_address_t end) { g_assert(begin <= end); t->begin = begin; t->end = end; t->cells_b = g_new(mix_word_t,end-begin); t->cells_a = g_new(mix_word_t,end-begin); } static void free_cells_(test_desc_t *t) { g_assert(t); g_free(t->cells_a); g_free(t->cells_b); t->cells_a = t->cells_b = NULL; t->begin = t->end = 0; } static void fill_test_desc_(test_desc_t *t, const mix_vm_t *vm, const mix_ins_t *ins) { guint k; g_assert(t); g_assert(vm); t->rA_b = t->rA_a = mix_vm_get_rA(vm); t->rX_b = t->rX_a = mix_vm_get_rX(vm); t->rJ_b = t->rJ_a = mix_vm_get_rJ(vm); for ( k = 0; k < 6; ++k ) t->rI_b[k] = t->rI_a[k] = mix_vm_get_rI(vm,k+1); t->cmp_b = t->cmp_a = mix_vm_get_cmpflag(vm); t->over_b = t->over_a = mix_vm_get_overflow(vm); for (k = 0; k < t->end-t->begin; ++k) t->cells_a[k] = t->cells_b[k] = mix_vm_get_addr_contents(vm,t->begin+k); t->ins = ins; } static void run_test_(test_desc_t *t, mix_vm_t *vm, mix_dump_context_t *dc) { guint k; g_assert(t); g_assert(vm); mix_vm_set_rA(vm, t->rA_b); mix_vm_set_rX(vm, t->rX_b); mix_vm_set_rJ(vm, t->rJ_b); for (k = 0; k < 6; ++k) mix_vm_set_rI(vm, k+1, t->rI_b[k]); for (k = t->begin; k < t->end; ++k) mix_vm_set_addr_contents(vm, k, t->cells_b[k-t->begin]); mix_vm_set_cmpflag(vm, t->cmp_b); mix_vm_set_overflow(vm, t->over_b); mix_ins_print(t->ins); if (dc) { mix_dump_context_range(dc, t->begin, t->end); mix_vm_dump(vm,dc); } k = mix_vm_exec_ins(vm, t->ins); if (dc) mix_vm_dump(vm, dc); g_assert(k == TRUE); g_assert(mix_vm_get_rA(vm) == t->rA_a); g_assert(mix_vm_get_rX(vm) == t->rX_a); for (k = 0; k < 6; ++k) g_assert(mix_vm_get_rI(vm, k+1) == t->rI_a[k]); g_assert(mix_vm_get_cmpflag(vm) == t->cmp_a); g_assert(mix_vm_get_overflow(vm) == t->over_a); for (k = t->begin; k < t->end; ++k) g_assert(mix_vm_get_addr_contents(vm, k) == t->cells_a[k-t->begin]); } static void test_arithmetics_(mix_vm_t *vm, mix_dump_context_t *dc) { test_desc_t test; mix_ins_t ins; g_print("\nTesting arithmetic instructions...\n"); mix_vm_reset(vm); mix_ins_fill_from_id(ins,mix_ADD); ins.index = 0; ins.address = 1000; mix_vm_set_rA(vm,mix_word_new_b(19,18,1,2,22)); mix_vm_set_addr_contents(vm,1000,mix_word_new_b(1,36,5,0,50)); set_cells_(&test,1000,1001); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(20,54,6,3,8); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins,mix_SUB); mix_vm_set_rA(vm,mix_word_new_bn(19,18,0,0,9)); mix_vm_set_addr_contents(vm,1000,mix_word_new_bn(31,16,2,22,0)); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(11,62,2,21,55); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins,mix_MUL); mix_vm_set_rA(vm,mix_word_new_b(1,1,1,1,1)); mix_vm_set_addr_contents(vm,1000, mix_word_new_b(1,1,1,1,1)); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(0,1,2,3,4); test.rX_a = mix_word_new_b(5,4,3,2,1); run_test_(&test, vm, dc); ins.fspec = mix_fspec_new(1,1); mix_vm_set_rA(vm,mix_word_new_bn(0,0,0,1,48)); mix_vm_set_addr_contents(vm,1000,mix_word_new_bn(2,16,2,22,0)); fill_test_desc_(&test,vm,&ins); test.rA_a = MIX_WORD_MINUS_ZERO; test.rX_a = mix_word_new_bn(0,0,0,3,32); run_test_(&test, vm, dc); mix_vm_set_rA(vm,mix_word_new_bn(0,0,0,1,48)); mix_vm_set_addr_contents(vm,1000,mix_word_new_b(2,0,34,33,1)); fill_test_desc_(&test,vm,&ins); test.rA_a = MIX_WORD_MINUS_ZERO; test.rX_a = mix_word_new_bn(0,0,0,3,32); run_test_(&test, vm, dc); ins.fspec = mix_fspec_new(0,5); mix_vm_set_rA(vm,mix_word_new_bn(50,0,1,48,4)); mix_vm_set_addr_contents(vm,1000,mix_word_new_bn(2,0,0,0,0)); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(1,36,0,3,32); test.rX_a = mix_word_new_b(8,0,0,0,0); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins,mix_DIV); mix_vm_set_rA(vm,MIX_WORD_ZERO); mix_vm_set_rX(vm,mix_word_new_b(0,0,0,0,17)); mix_vm_set_addr_contents(vm,1000, mix_word_new_b(0,0,0,0,3)); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(0,0,0,0,5); test.rX_a = mix_word_new_b(0,0,0,0,2); run_test_(&test, vm, dc); mix_vm_set_rA(vm,MIX_WORD_ZERO); mix_vm_set_rX(vm,mix_word_new_bn(0,0,0,0,17)); mix_vm_set_addr_contents(vm,1000, mix_word_new_b(0,0,0,0,3)); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(0,0,0,0,5); test.rX_a = mix_word_new_b(0,0,0,0,2); run_test_(&test, vm, dc); mix_vm_set_rA(vm, MIX_WORD_MINUS_ZERO); mix_vm_set_rX(vm, mix_word_new_b(19,19,0,3,1)); mix_vm_set_addr_contents(vm,1000, mix_word_new_bn(0,0,0,2,0)); fill_test_desc_(&test,vm,&ins); test.rA_a = mix_word_new_b(0,9,41,32,1); test.rX_a = mix_word_new_bn(0,0,0,1,1); run_test_(&test, vm, dc); free_cells_(&test); } static void test_shift_(mix_vm_t *vm, mix_dump_context_t *dc) { test_desc_t test; mix_ins_t ins; g_print("Testing shift instructions...\n"); mix_vm_reset(vm); set_cells_(&test,0,0); fill_test_desc_(&test,vm,&ins); mix_ins_fill_from_id(ins,mix_SRAX); ins.index = 0; ins.address = 1; test.rA_b = mix_word_new_b(1,2,3,4,5); test.rX_b = mix_word_new_bn(6,7,8,9,10); test.rA_a = mix_word_new_b(0,1,2,3,4); test.rX_a = mix_word_new_bn(5,6,7,8,9); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_SLA); ins.address = 2; fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_new_b(2,3,4,0,0); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_SRC); ins.address = 4; fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_new_b(6,7,8,9,2); test.rX_a = mix_word_new_bn(3,4,0,0,5); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_SRA); ins.address = 2; fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_new_b(0,0,6,7,8); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_SLC); ins.address = 501; fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_new_b(0,6,7,8,3); test.rX_a = mix_word_new_bn(4,0,0,5,0); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_SLB); ins.index = 0; ins.address = 3; fill_test_desc_(&test, vm, &ins); test.rA_b = mix_word_new(06543217654); test.rX_b = mix_word_new(03217654321); test.rA_a = mix_word_new(05432176543); test.rX_a = mix_word_new(02176543210); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_SRB); ins.address = 6; fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_new(00054321765); test.rX_a = mix_word_new(04321765432); run_test_(&test, vm, dc); } static void test_spc_(mix_vm_t *vm, mix_dump_context_t *dc) { test_desc_t test; mix_ins_t ins; g_print("Testing special instructions...\n"); mix_vm_reset(vm); set_cells_(&test,0,0); fill_test_desc_(&test,vm,&ins); mix_ins_fill_from_id(ins,mix_NUM); ins.index = 0; ins.address = 0; test.rA_b = mix_word_new_bn(0,0,31,32,39); test.rX_b = mix_word_new_b(37,57,47,30,30); test.rA_a = mix_word_negative(12977700); test.rX_a = test.rX_b; run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_INCA); ins.address = 1; fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_negative(12977699); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_CHAR); fill_test_desc_(&test, vm, &ins); test.rA_a = mix_word_new_bn(30,30,31,32,39); test.rX_a = mix_word_new_b(37,37,36,39,39); run_test_(&test, vm, dc); mix_ins_fill_from_id(ins, mix_HLT); fill_test_desc_(&test, vm, &ins); run_test_(&test, vm, dc); g_assert(mix_vm_is_halted(vm)); } static void test_move_(mix_vm_t *vm, mix_dump_context_t *dc) { test_desc_t test; mix_ins_t ins; guint k; g_print("Testing move instruction...\n"); mix_vm_reset(vm); set_cells_(&test,0,10); fill_test_desc_(&test,vm,&ins); mix_ins_fill_from_id(ins,mix_MOVE); ins.index = 0; ins.address = 0; ins.fspec = 5; for ( k = 0; k < 5; ++k ) test.cells_b[k] = test.cells_a[k+5] = test.cells_a[k] =mix_word_new(100*k); test.rI_b[0] = 5; test.rI_a[0] = 10; run_test_(&test,vm,dc); free_cells_(&test); } static void test_load_(mix_vm_t *vm, mix_dump_context_t *dc) { test_desc_t test; mix_ins_t ins; mix_ins_id_t ids[4] = {mix_LDA, mix_LDX, mix_LDAN, mix_LDXN}; mix_word_t r_a[14] = { mix_word_new_bn(1,16,3,5,4), mix_word_new_b(1,16,3,5,4), mix_word_new_b(0,0,3,5,4), mix_word_new_bn(0,0,1,16,3), mix_word_new_b(0,0,0,0,5), mix_word_new_b(0,0,0,0,1), MIX_WORD_MINUS_ZERO, mix_word_new_b(1,16,3,5,4), mix_word_new_bn(1,16,3,5,4), mix_word_new_bn(0,0,3,5,4), mix_word_new_b(0,0,1,16,3), mix_word_new_bn(0,0,0,0,5), mix_word_new_bn(0,0,0,0,1), MIX_WORD_ZERO }; mix_fspec_t fs[11] = {5,13,29,3,36,9,0,0,0,0,0}; mix_address_t a_a[11] = { MIX_SHORT_MINUS_ZERO, mix_short_new_bn(0,1), mix_short_new_bn(1,16), mix_short_new_bn(16,3), mix_short_new_bn(3,5), mix_short_new_bn(5,4), mix_short_new_b(1,16), mix_short_new_b(16,3), mix_short_new_b(5,4), mix_short_new_b(5,4), mix_short_new_b(3,5) }; mix_word_t val = mix_word_new_bn(1,16,3,5,4); gint j; g_print("Testing load instructions...\n"); set_cells_(&test,2000,2001); ins.index = 1; ins.address = mix_short_negative(50); mix_vm_reset(vm); mix_vm_set_addr_contents(vm, 2000, val); for (j = 0; j < 4; ++j) { gint k; mix_ins_fill_from_id(ins,ids[j]); for ( k = 0; k < 7; ++k ) { fill_test_desc_(&test,vm,&ins); ins.fspec = fs[k]; switch (ids[j]) { case mix_LDA: test.rA_a = r_a[k]; break; case mix_LDX: test.rX_a = r_a[k]; break; case mix_LDAN: test.rA_a = r_a[k + 7]; break; case mix_LDXN: test.rX_a = r_a[k + 7]; break; default: g_assert_not_reached(); } test.rI_b[0] = test.rI_a[0] = 2050; run_test_(&test, vm, dc); } } ins.index = 0; ins.address = 2000; fs[0] = 0; fs[1] = 1; fs[2] = 2; fs[3] = 3; fs[4] = 4; fs[5] = 5; fs[6] = 10; fs[7] = 11; fs[8] = 37; fs[9] = 29; fs[10] = 12; mix_vm_reset(vm); mix_vm_set_addr_contents(vm, 2000, val); for ( j = 0; j < 14; j++ ) { guint k; if (j == 6 || j == 7 ) continue; /* mix_LDX, mix_LDAN */ mix_ins_fill_from_id(ins, mix_LD1 + j); for (k = 0; k < 11; ++k) { fill_test_desc_(&test, vm, &ins); ins.fspec = fs[k]; if ( j < 6 ) test.rI_a[j] = a_a[k]; else /* mix_LDiN */ test.rI_a[j-8] = mix_short_negative (a_a[k]); run_test_(&test, vm, dc); } } free_cells_(&test); } static void test_store_(mix_vm_t *vm, mix_dump_context_t *dc) { test_desc_t test; mix_ins_t ins; mix_word_t reg = mix_word_new_b(6,7,8,9,0); mix_word_t add = mix_word_new_bn(1,2,3,4,5); mix_word_t addr[6] = { mix_word_new_b(6,7,8,9,0), mix_word_new_bn(6,7,8,9,0), mix_word_new_bn(1,2,3,4,0), mix_word_new_bn(1,0,3,4,5), mix_word_new_bn(1,9,0,4,5), mix_word_new_b(0,2,3,4,5)}; mix_word_t addri[6] = { mix_word_new_b(0,0,0,9,0), mix_word_new_bn(0,0,0,9,0), mix_word_new_bn(1,2,3,4,0), mix_word_new_bn(1,0,3,4,5), mix_word_new_bn(1,9,0,4,5), mix_word_new_b(0,2,3,4,5)}; mix_word_t addrz[6] = { mix_word_new_b(0,0,0,0,0), mix_word_new_bn(0,0,0,0,0), mix_word_new_bn(1,2,3,4,0), mix_word_new_bn(1,0,3,4,5), mix_word_new_bn(1,0,0,4,5), mix_word_new_b(0,2,3,4,5)}; mix_fspec_t fs[6] = {5,13,45,18,19,1}; gint i,j; g_print("Testing store instructions...\n"); set_cells_(&test,2000,2001); ins.index = 0; ins.address = 2000; mix_vm_reset(vm); fill_test_desc_(&test,vm,&ins); test.rA_a = test.rA_b = test.rX_a = test.rX_b = reg; test.rJ_a = test.rJ_b = mix_word_to_short(reg); for (j = 0; j < 6; ++j) test.rI_a[j] = test.rI_b[j] = test.rJ_a; test.cells_b[0] = add; for (i = 0; i < 10; ++i) { mix_ins_fill_from_id(ins,mix_STA+i); for (j = 0; j < 6; ++j) { ins.fspec = fs[j]; if (i == 0 || i == 7 ) /* mix_STA, mix_STX */ test.cells_a[0] = addr[j]; else if ( i < 9 ) /* mix_STi, mix_STJ */ test.cells_a[0] = addri[j]; else /* mix_STZ */ test.cells_a[0] = addrz[j]; run_test_(&test,vm,dc); } } free_cells_(&test); } int main(int argc, const char **argv) { mix_vm_t *vm; mix_dump_context_t *dc; INIT_TEST; vm = mix_vm_new(); #ifdef VERBOSE_TEST dc = mix_dump_context_new(MIX_DUMP_DEF_CHANNEL, 0, 0, MIX_DUMP_ALL); #else dc = NULL; #endif test_arithmetics_(vm, dc); test_shift_(vm, dc); test_spc_(vm,dc); test_move_(vm,dc); test_load_(vm,dc); test_store_(vm,dc); mix_vm_delete(vm); #ifdef VERBOSE_TEST mix_dump_context_delete(dc); #endif return EXIT_SUCCESS; } mdk-1.2.9/mixlib/testsuite/Makefile.in0000644000175000017500000011130012636565536014616 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2000, 2001, 2006, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = mixtypest$(EXEEXT) mixinstest$(EXEEXT) \ mixvminstest$(EXEEXT) mixparsertest$(EXEEXT) \ mixdevtest$(EXEEXT) mixevaltest$(EXEEXT) subdir = mixlib/testsuite ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am_mixdevtest_OBJECTS = mix_device_t.$(OBJEXT) mixdevtest_OBJECTS = $(am_mixdevtest_OBJECTS) mixdevtest_LDADD = $(LDADD) mixdevtest_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a am_mixevaltest_OBJECTS = mix_eval_t.$(OBJEXT) mixevaltest_OBJECTS = $(am_mixevaltest_OBJECTS) mixevaltest_LDADD = $(LDADD) mixevaltest_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a am_mixinstest_OBJECTS = mix_ins_t.$(OBJEXT) mixinstest_OBJECTS = $(am_mixinstest_OBJECTS) mixinstest_LDADD = $(LDADD) mixinstest_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a am_mixparsertest_OBJECTS = mix_parser_t.$(OBJEXT) mixparsertest_OBJECTS = $(am_mixparsertest_OBJECTS) mixparsertest_LDADD = $(LDADD) mixparsertest_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a am_mixtypest_OBJECTS = mix_types_t.$(OBJEXT) mixtypest_OBJECTS = $(am_mixtypest_OBJECTS) mixtypest_LDADD = $(LDADD) mixtypest_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a am_mixvminstest_OBJECTS = mix_vm_ins_t.$(OBJEXT) mixvminstest_OBJECTS = $(am_mixvminstest_OBJECTS) mixvminstest_LDADD = $(LDADD) mixvminstest_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mixdevtest_SOURCES) $(mixevaltest_SOURCES) \ $(mixinstest_SOURCES) $(mixparsertest_SOURCES) \ $(mixtypest_SOURCES) $(mixvminstest_SOURCES) DIST_SOURCES = $(mixdevtest_SOURCES) $(mixevaltest_SOURCES) \ $(mixinstest_SOURCES) $(mixparsertest_SOURCES) \ $(mixtypest_SOURCES) $(mixvminstest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ -I$(includedir) -I$(top_srcdir) \ -I$(top_srcdir)/mixlib -DMIX_TEST_MIXAL_FILES=$(MIXAL_FILES) \ -DMIX_TEST_SAMPLES_DIR="\"$(top_srcdir)/samples\"" AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LDADD = $(top_builddir)/mixlib/libmix.a TESTS = $(check_PROGRAMS) MIXAL_FILES = "\"tests/bt\",\"tests/cbp\",\"tests/stress0\",\"tests/stress1\",\"tests/stress2\",\"tests/stress4\",\"tests/stress5\",\"tests/stress6\",\"tests/ldan\",\"tests/lockonw\",\"tests/negwrite\",\"hello\",\"echo\",\"primes\",\"isains\"" mixtypest_SOURCES = test.h mix_types_t.c mixinstest_SOURCES = test.h mix_ins_t.c mixvminstest_SOURCES = test.h mix_vm_ins_t.c mixdevtest_SOURCES = test.h mix_device_t.c mixevaltest_SOURCES = test.h mix_eval_t.c mixparsertest_SOURCES = test.h mix_parser_t.c all: all-am .SUFFIXES: .SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mixlib/testsuite/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu mixlib/testsuite/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) mixdevtest$(EXEEXT): $(mixdevtest_OBJECTS) $(mixdevtest_DEPENDENCIES) $(EXTRA_mixdevtest_DEPENDENCIES) @rm -f mixdevtest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixdevtest_OBJECTS) $(mixdevtest_LDADD) $(LIBS) mixevaltest$(EXEEXT): $(mixevaltest_OBJECTS) $(mixevaltest_DEPENDENCIES) $(EXTRA_mixevaltest_DEPENDENCIES) @rm -f mixevaltest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixevaltest_OBJECTS) $(mixevaltest_LDADD) $(LIBS) mixinstest$(EXEEXT): $(mixinstest_OBJECTS) $(mixinstest_DEPENDENCIES) $(EXTRA_mixinstest_DEPENDENCIES) @rm -f mixinstest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixinstest_OBJECTS) $(mixinstest_LDADD) $(LIBS) mixparsertest$(EXEEXT): $(mixparsertest_OBJECTS) $(mixparsertest_DEPENDENCIES) $(EXTRA_mixparsertest_DEPENDENCIES) @rm -f mixparsertest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixparsertest_OBJECTS) $(mixparsertest_LDADD) $(LIBS) mixtypest$(EXEEXT): $(mixtypest_OBJECTS) $(mixtypest_DEPENDENCIES) $(EXTRA_mixtypest_DEPENDENCIES) @rm -f mixtypest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixtypest_OBJECTS) $(mixtypest_LDADD) $(LIBS) mixvminstest$(EXEEXT): $(mixvminstest_OBJECTS) $(mixvminstest_DEPENDENCIES) $(EXTRA_mixvminstest_DEPENDENCIES) @rm -f mixvminstest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixvminstest_OBJECTS) $(mixvminstest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_device_t.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_eval_t.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_ins_t.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_parser_t.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_types_t.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_ins_t.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? mixtypest.log: mixtypest$(EXEEXT) @p='mixtypest$(EXEEXT)'; \ b='mixtypest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mixinstest.log: mixinstest$(EXEEXT) @p='mixinstest$(EXEEXT)'; \ b='mixinstest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mixvminstest.log: mixvminstest$(EXEEXT) @p='mixvminstest$(EXEEXT)'; \ b='mixvminstest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mixparsertest.log: mixparsertest$(EXEEXT) @p='mixparsertest$(EXEEXT)'; \ b='mixparsertest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mixdevtest.log: mixdevtest$(EXEEXT) @p='mixdevtest$(EXEEXT)'; \ b='mixdevtest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) mixevaltest.log: mixevaltest$(EXEEXT) @p='mixevaltest$(EXEEXT)'; \ b='mixevaltest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-local \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am .PRECIOUS: Makefile distclean-local: rm -f *.mix # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/mixlib/mix_symbol_table.h0000644000175000017500000000645212112755472014222 00000000000000/* -*-c-*- ---------------- mix_symbol_table.h : * Type mix_symbol_table_t and functions to manipulate it. * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_SYMBOL_TABLE_H #define MIX_SYMBOL_TABLE_H #include #include "mix_types.h" /* A symbol table shall be implemented as a hash table */ typedef GHashTable mix_symbol_table_t ; /* Maximum length of stored symbols */ #define MIX_SYM_MAX_LEN 10 /* Create an empty table */ extern mix_symbol_table_t * mix_symbol_table_new (void); /* Create a table and populate it with the contents of a table stored in -file- using mix_symbol_table_print (table, MIX_SYM_LINE, file) */ extern mix_symbol_table_t * mix_symbol_table_new_from_file (FILE *file); /* Delete a table */ extern void mix_symbol_table_delete (mix_symbol_table_t *table); /* add/remove symbols from other table */ extern gboolean mix_symbol_table_merge_table (mix_symbol_table_t *table, const mix_symbol_table_t *from); extern gboolean mix_symbol_table_substract_table (mix_symbol_table_t *table, const mix_symbol_table_t *other); /* Add/remove symbols one by one */ /* possible outcomes: */ enum { MIX_SYM_FAIL, /* attempt failed */ MIX_SYM_OK, MIX_SYM_DUP, /* duplicated symbol */ MIX_SYM_LONG /* symbol too long: only MIX_SYM_MAX_LEN chars used */ }; extern gint mix_symbol_table_add (mix_symbol_table_t *table, const gchar *sym, mix_word_t value); #define mix_symbol_table_remove(table, sym) \ g_hash_table_remove (table, sym) /* Add or modify symbol if it exists */ extern gint mix_symbol_table_insert (mix_symbol_table_t *table, const gchar *sym, mix_word_t new_value); /* Add or modify symbol if it exists, without copying sym */ #define mix_symbol_table_insert_static(table,sym,value)\ g_hash_table_insert (table,(gpointer)sym,GUINT_TO_POINTER (value)) /* Symbols lookup */ extern gboolean mix_symbol_table_is_defined (const mix_symbol_table_t *table, const gchar *sym); #define mix_symbol_table_value(table,sym) \ (mix_word_t)GPOINTER_TO_UINT (g_hash_table_lookup ((GHashTable *)table, \ (gpointer)sym)) /* Traverse the table */ #define mix_symbol_table_foreach(table,func,data) \ g_hash_table_foreach (table,func,data) /* Print the table */ enum { MIX_SYM_ROWS, /* each symbol/value in a row */ MIX_SYM_LINE /* {,symbol =value}*; in a single row */ }; extern void mix_symbol_table_print (const mix_symbol_table_t *table, gint mode, FILE *file, gboolean skiplocal); #endif /* MIX_SYMBOL_TABLE_H */ mdk-1.2.9/mixlib/xmix_eval.h0000644000175000017500000000312112112755472012653 00000000000000/* -*-c-*- ---------------- xmix_eval.h : * Definition of opaque types in mix_eval.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_EVAL_H #define XMIX_EVAL_H #include "mix_eval.h" /* the evaluator type */ struct mix_eval_t { mix_symbol_table_t *table; /* symbol table */ gboolean towner; /* true if owns the table */ mix_eval_result_t result; /* last evaluation result */ gint errpos; /* location of last error */ mix_word_t value; /* last computed value */ }; /* flex scanner data/result struct */ typedef struct mix_eval_data_ { gchar *expr; const mix_symbol_table_t *table; mix_word_t value; mix_short_t loc; gint errpos; } mix_eval_data_; /* flex scanner prototype */ extern mix_eval_result_t mix_eval_expr (mix_eval_data_ *data); #endif /* XMIX_EVAL_H */ mdk-1.2.9/mixlib/xmix_vm.c0000644000175000017500000004273212622454575012362 00000000000000/* ---------------------- xmix_vm.c : * Implementation of the functions declared in xmix_vm.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2003, 2004, 2007, 2010, 2013 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "xmix_vm.h" /* auxiliar functions */ G_INLINE_FUNC mix_address_t get_M_ (const mix_vm_t *vm, const mix_ins_t *ins); G_INLINE_FUNC mix_word_t get_V_ (const mix_vm_t *vm, const mix_ins_t *ins); G_INLINE_FUNC mix_device_t * get_dev_ (mix_vm_t *vm, mix_fspec_t type); G_INLINE_FUNC mix_address_t get_M_ (const mix_vm_t *vm, const mix_ins_t *ins) { if ( ins->index == 0 ) return ins->address; else return mix_short_add (ins->address, mix_word_to_short_fast (get_rI_ (vm, ins->index))); } G_INLINE_FUNC mix_word_t get_V_ (const mix_vm_t *vm, const mix_ins_t *ins) { return mix_word_get_field (ins->fspec, get_cell_ (vm, get_M_ (vm,ins))); } G_INLINE_FUNC mix_device_t * get_dev_ (mix_vm_t *vm, mix_fspec_t type) { if (type >= BD_NO_) return NULL; if (vm->devices[type] == NULL) vm->devices[type] = vm->factory (type); return vm->devices[type]; } /* error macro */ #define fail_if_not_(vm,cond,error) \ do { \ if (!(cond)) \ { \ set_last_error_ (vm, error); \ return FALSE; \ } \ } while (FALSE) #define fail_(vm,error) fail_if_not_ (vm, FALSE, error) #define fail_unexpected_(vm) fail_ (vm, MIX_VM_ERROR_UNEXPECTED) /* Instruction handlers */ static gboolean nop_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opNOP); inc_loc_ (vm); return TRUE; } static gboolean add_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_word_t val = get_V_ (vm, ins); g_assert (ins->opcode == mix_opADD || ins->opcode == mix_opSUB); if ( ins->opcode == mix_opSUB ) mix_word_reverse_sign (val); if ( mix_word_add_and_carry (get_rA_ (vm), val, NULL, &get_rA_ (vm)) ) set_over_ (vm,TRUE); inc_loc_ (vm); return TRUE; } static gboolean mul_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opMUL); mix_word_mul (get_rA_ (vm), get_V_ (vm,ins), &get_rA_ (vm), &get_rX_ (vm)); inc_loc_ (vm); return TRUE; } static gboolean div_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opDIV); if ( mix_word_div (get_rA_ (vm), get_rX_ (vm), get_V_ (vm,ins), &get_rA_ (vm), &get_rX_ (vm)) ) set_over_ (vm,TRUE); inc_loc_ (vm); return TRUE; } static gboolean spc_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opSPC); switch (mix_ins_id_from_ins (*ins)) { case mix_HLT: halt_ (vm, TRUE); break; case mix_CHAR: { guint32 num = mix_word_magnitude (get_rA_ (vm)); mix_char_t z = mix_ascii_to_char ('0'); guint i; for (i = 5; 0 < i; --i, num /= 10) mix_word_set_byte (&get_rX_ (vm), i, z + num % 10); for (i = 5; 0 < i; --i, num /= 10) mix_word_set_byte (&get_rA_ (vm), i, z + num % 10); break; } case mix_NUM: { guint i; mix_word_t num = MIX_WORD_ZERO; mix_word_t ten = 10; for (i = 1; i <= 5; ++i) { mix_word_mul (ten, num, NULL, &num); mix_word_add_and_carry (num, mix_word_get_byte (get_rA_ (vm),i)%10, NULL, &num); } for (i = 1; i <= 5; ++i) { mix_word_mul (ten, num, NULL, &num); mix_word_add_and_carry (num, mix_word_get_byte (get_rX_ (vm),i)%10, NULL, &num); } set_rA_ (vm, mix_word_is_negative (get_rA_ (vm)) ? mix_word_negative (num) : num); break; } default: fail_ (vm, MIX_VM_ERROR_BAD_FSPEC); } inc_loc_ (vm); return TRUE; } static gboolean sla_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_short_t n = get_M_ (vm,ins); g_assert (ins->opcode == mix_opSLx); fail_if_not_ (vm, mix_short_is_positive (n), MIX_VM_ERROR_BAD_M); switch ( mix_ins_id_from_ins (*ins) ) { case mix_SLA: mix_word_shift_left (get_rA_ (vm), MIX_WORD_ZERO, n, &get_rA_ (vm), NULL); break; case mix_SRA: mix_word_shift_right (get_rA_ (vm), MIX_WORD_ZERO, n, &get_rA_ (vm), NULL); break; case mix_SLAX: mix_word_shift_left (get_rA_ (vm), get_rX_ (vm), n, &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SRAX: mix_word_shift_right (get_rA_ (vm), get_rX_ (vm), n, &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SLC: mix_word_shift_left_circular (get_rA_ (vm), get_rX_ (vm), n, &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SRC: mix_word_shift_right_circular (get_rA_ (vm), get_rX_ (vm), n, &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SLB: mix_word_shift_left_binary (get_rA_ (vm), get_rX_ (vm), n, &get_rA_ (vm), &get_rX_ (vm)); break; case mix_SRB: mix_word_shift_right_binary (get_rA_ (vm), get_rX_ (vm), n, &get_rA_ (vm), &get_rX_ (vm)); break; default: fail_unexpected_ (vm); } inc_loc_ (vm); return TRUE; } static gboolean mov_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_short_t from = get_M_ (vm,ins); mix_short_t to = mix_word_to_short_fast (get_rI_ (vm,1)); guint k, delta = ins->fspec; g_assert (ins->opcode == mix_opMOVE); gboolean result = (delta == 0) || (mix_short_is_positive (from) && mix_short_is_positive (to) && MEMOK_ (from + delta -1) && MEMOK_ (to + delta - 1)); if (result && delta > 0) { for (k = 0; k < delta; ++k) set_cell_ (vm, to+k, get_cell_ (vm, from+k)); set_rI_ (vm, 1, to+delta); } if (result) inc_loc_ (vm); return result; } static gboolean lda_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { gint r = 0; mix_word_t val; mix_ins_id_t id = mix_ins_id_from_ins (*ins); g_assert (id >= mix_LDA && id <= mix_LDXN); val = get_V_ (vm, ins); if (id > mix_LDX) mix_word_reverse_sign (val); if ( (id > mix_LDA && id < mix_LDX) || (id > mix_LDAN && id < mix_LDXN) ) /* Bytes 1-3 of I regs are always null */ val = mix_word_set_field (mix_fspec_new (1,3),MIX_WORD_ZERO,val); switch (id) { case mix_LDA: case mix_LDAN: r = A_; break; case mix_LDX: case mix_LDXN: r = X_; break; case mix_LD1: case mix_LD1N: r = I1_; break; case mix_LD2: case mix_LD2N: r = I2_; break; case mix_LD3: case mix_LD3N: r = I3_; break; case mix_LD4: case mix_LD4N: r = I4_; break; case mix_LD5: case mix_LD5N: r = I5_; break; case mix_LD6: case mix_LD6N: r = I6_; break; default: g_assert_not_reached (); } set_reg_ (vm, r, val); inc_loc_ (vm); return TRUE; } static gboolean sta_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr = get_M_ (vm, ins); mix_ins_id_t id = mix_ins_id_from_ins (*ins); mix_word_t from; g_assert (id >= mix_STA && id <= mix_STZ); switch (id) { case mix_STA: from = get_rA_ (vm); break; case mix_STX: from = get_rX_ (vm); break; case mix_STJ: from = get_rJ_ (vm); break; case mix_STZ: from = MIX_WORD_ZERO; break; default: from = get_rI_ (vm, id - mix_ST1 + 1); break; } set_cell_ (vm, addr, mix_word_store_field (ins->fspec, from, get_cell_ (vm, addr))); inc_loc_ (vm); return TRUE; } static gboolean jbs_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opJBUS); fail_if_not_ (vm, ins->fspec < BD_NO_, MIX_VM_ERROR_BAD_DEVICE_NO); fail_if_not_ (vm, get_dev_ (vm, ins->fspec) != NULL, MIX_VM_ERROR_BAD_DEVICE_NO); if ( mix_device_busy (get_dev_ (vm, ins->fspec)) ) { set_rJ_ (vm, get_loc_ (vm)); set_loc_ (vm, get_M_ (vm, ins)); } else inc_loc_ (vm); return TRUE; } static gboolean ioc_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr; mix_device_t *dev; g_assert (ins->opcode == mix_opIOC); addr = get_M_ (vm, ins); fail_if_not_ (vm, ins->fspec < BD_NO_, MIX_VM_ERROR_BAD_DEVICE_NO); dev = get_dev_ (vm, ins->fspec); fail_if_not_ (vm, dev != NULL, MIX_VM_ERROR_BAD_DEVICE_NO); fail_if_not_ (vm, mix_device_ioc (dev, addr), MIX_VM_ERROR_DEV_CTL); inc_loc_ (vm); return TRUE; } static gboolean inp_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr; mix_device_t *dev; g_assert (ins->opcode == mix_opIN); fail_if_not_ (vm, ins->fspec < BD_NO_, MIX_VM_ERROR_BAD_DEVICE_NO); addr = get_M_ (vm, ins); fail_if_not_ (vm, MEMOK_ (addr), MIX_VM_ERROR_BAD_ACCESS); dev = get_dev_ (vm, ins->fspec); fail_if_not_ (vm, dev != NULL, MIX_VM_ERROR_BAD_DEVICE_NO); fail_if_not_ (vm, MEM_CELLS_NO_ - addr > mix_device_block_size (dev), MIX_VM_ERROR_BAD_ACCESS); fail_if_not_ (vm, mix_device_read (dev, get_cell_ptr_ (vm, addr)), MIX_VM_ERROR_DEV_READ); inc_loc_ (vm); return TRUE; } static gboolean out_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_address_t addr; mix_device_t *dev; g_assert (ins->opcode == mix_opOUT); fail_if_not_ (vm, ins->fspec < BD_NO_, MIX_VM_ERROR_BAD_DEVICE_NO); addr = get_M_ (vm, ins); fail_if_not_ (vm, MEMOK_ (addr), MIX_VM_ERROR_BAD_ACCESS); dev = get_dev_ (vm, ins->fspec); fail_if_not_ (vm, dev != NULL, MIX_VM_ERROR_BAD_DEVICE_NO); fail_if_not_ (vm, MEM_CELLS_NO_ - addr > mix_device_block_size (dev), MIX_VM_ERROR_BAD_ACCESS); fail_if_not_ (vm, mix_device_write (dev, get_cell_ptr_ (vm, addr)), MIX_VM_ERROR_DEV_WRITE); inc_loc_ (vm); return TRUE; } static gboolean jrd_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode == mix_opJRED); fail_if_not_ (vm, ins->fspec < BD_NO_, MIX_VM_ERROR_BAD_DEVICE_NO); fail_if_not_ (vm, get_dev_ (vm, ins->fspec) != NULL, MIX_VM_ERROR_BAD_DEVICE_NO); inc_loc_ (vm); if ( !mix_device_busy (get_dev_ (vm, ins->fspec)) ) { set_rJ_ (vm, get_loc_ (vm)); set_loc_ (vm, get_M_ (vm, ins)); } return TRUE; } static gboolean jmp_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { gboolean jump = FALSE; mix_address_t addr = get_M_ (vm, ins); mix_ins_id_t id = mix_ins_id_from_ins (*ins); g_assert (ins->opcode == mix_opJMP); fail_if_not_ (vm, MEMOK_ (addr), MIX_VM_ERROR_BAD_ACCESS); switch ( id ) { case mix_JMP: case mix_JSJ: jump = TRUE; break; case mix_JOV: jump = get_over_ (vm); if (jump) set_over_ (vm, FALSE); break; case mix_JNOV: jump = !get_over_ (vm); set_over_ (vm, FALSE); break; case mix_JL: jump = ( get_cmp_ (vm) == mix_LESS ); break; case mix_JE: jump = ( get_cmp_ (vm) == mix_EQ ); break; case mix_JG: jump = ( get_cmp_ (vm) == mix_GREAT ); break; case mix_JGE: jump = ( get_cmp_ (vm) != mix_LESS ); break; case mix_JNE: jump = ( get_cmp_ (vm) != mix_EQ ); break; case mix_JLE: jump = ( get_cmp_ (vm) != mix_GREAT ); break; default: fail_unexpected_ (vm); } inc_loc_ (vm); if ( jump ) { if ( id != mix_JSJ ) set_rJ_ (vm, get_loc_ (vm)); set_loc_ (vm, addr); } return TRUE; } static gboolean jpx_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { gboolean jump = FALSE; mix_address_t addr = get_M_ (vm, ins); mix_ins_id_t id = mix_ins_id_from_ins (*ins); mix_word_t val; g_assert (ins->opcode >= mix_opJAx && ins->opcode <= mix_opJXx); fail_if_not_ (vm, MEMOK_ (addr), MIX_VM_ERROR_BAD_ACCESS); switch (ins->opcode) { case mix_opJAx: val = get_rA_ (vm); break; case mix_opJXx: val = get_rX_ (vm); break; default: val = get_rI_ (vm, ins->opcode - mix_opJAx); } switch (id) { case mix_JAN: case mix_JXN: case mix_J1N: case mix_J2N: case mix_J3N: case mix_J4N: case mix_J5N: case mix_J6N: jump = mix_word_is_negative (val) && val != MIX_WORD_MINUS_ZERO; break; case mix_JAZ: case mix_JXZ: case mix_J1Z: case mix_J2Z: case mix_J3Z: case mix_J4Z: case mix_J5Z: case mix_J6Z: jump = mix_word_magnitude (val) == MIX_WORD_ZERO; break; case mix_JAP: case mix_JXP: case mix_J1P: case mix_J2P: case mix_J3P: case mix_J4P: case mix_J5P: case mix_J6P: jump = mix_word_is_positive (val) && val != MIX_WORD_ZERO; break; case mix_JANN: case mix_JXNN: case mix_J1NN: case mix_J2NN: case mix_J3NN: case mix_J4NN: case mix_J5NN: case mix_J6NN: jump = mix_word_magnitude (val) == MIX_WORD_ZERO || mix_word_is_positive (val); break; case mix_JANZ: case mix_JXNZ: case mix_J1NZ: case mix_J2NZ: case mix_J3NZ: case mix_J4NZ: case mix_J5NZ: case mix_J6NZ: jump = mix_word_magnitude (val) != MIX_WORD_ZERO; break; case mix_JANP: case mix_JXNP: case mix_J1NP: case mix_J2NP: case mix_J3NP: case mix_J4NP: case mix_J5NP: case mix_J6NP: jump = mix_word_magnitude (val) == MIX_WORD_ZERO || mix_word_is_negative (val); break; case mix_JAE: case mix_JXE: jump = mix_word_is_even (val); break; case mix_JAO: case mix_JXO: jump = mix_word_is_odd (val); break; default: fail_unexpected_ (vm); } inc_loc_ (vm); if ( jump ) { set_rJ_ (vm, get_loc_ (vm)); set_loc_ (vm, addr); } return TRUE; } static gboolean ina_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { mix_word_t val = mix_short_to_word_fast (get_M_ (vm, ins)); mix_ins_id_t id = mix_ins_id_from_ins (*ins); gint r; g_assert (id >= mix_INCA && id <= mix_ENNX); switch (ins->opcode) { case mix_opINCA: r = A_; break; case mix_opINCX: r = X_; break; default: r = I1_ + ins->opcode - mix_opINC1; } switch (id) { case mix_ENTA: case mix_ENTX: break; case mix_ENT1: case mix_ENT2: case mix_ENT3: case mix_ENT4: case mix_ENT5: case mix_ENT6: val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); break; case mix_INCA: case mix_INCX: if ( mix_word_add_and_carry (val, get_reg_ (vm, r), NULL, &val) ) set_over_ (vm, TRUE); break; case mix_INC1: case mix_INC2: case mix_INC3: case mix_INC4: case mix_INC5: case mix_INC6: mix_word_add_and_carry (val, get_reg_ (vm,r), NULL, &val); val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); break; case mix_DECA: case mix_DECX: if ( mix_word_add_and_carry (mix_word_negative (val), get_reg_ (vm, r), NULL, &val) ) set_over_ (vm, TRUE); break; case mix_DEC1: case mix_DEC2: case mix_DEC3: case mix_DEC4: case mix_DEC5: case mix_DEC6: mix_word_add_and_carry (mix_word_negative (val), get_reg_ (vm,r), NULL, &val); val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); break; case mix_ENN1: case mix_ENN2: case mix_ENN3: case mix_ENN4: case mix_ENN5: case mix_ENN6: val = mix_word_set_field (mix_fspec_new (1,3), MIX_WORD_ZERO, val); /* fallthrough */ case mix_ENNA: case mix_ENNX: mix_word_reverse_sign (val); break; default: fail_unexpected_ (vm); } set_reg_ (vm, r, val); inc_loc_ (vm); return TRUE; } static gboolean cmp_handler_ (mix_vm_t *vm, const mix_ins_t *ins) { g_assert (ins->opcode >= mix_opCMPA && ins->opcode <= mix_opCMPX); if ( ins->fspec == 0 ) { /* shortcut: +0 == -0 */ set_cmp_ (vm, mix_EQ); } else { mix_word_t v = get_V_ (vm, ins); mix_word_t reg; mix_cmpflag_t flag; switch (ins->opcode) { case mix_opCMPA: reg = get_rA_ (vm); break; case mix_opCMPX: reg = get_rX_ (vm); break; default: reg = get_rI_ (vm, ins->opcode - mix_opCMPA); break; } reg = mix_word_get_field (ins->fspec, reg); mix_word_add_and_carry (reg, mix_word_negative (v), NULL, ®); if ( mix_word_magnitude (reg) == MIX_WORD_ZERO ) flag = mix_EQ; else if ( mix_word_is_positive (reg) ) flag = mix_GREAT; else flag = mix_LESS; set_cmp_ (vm, flag); } inc_loc_ (vm); return TRUE; } ins_handler_t_ ins_handlers_[MIX_BYTE_MAX + 1] = { nop_handler_, add_handler_, add_handler_, mul_handler_, div_handler_, spc_handler_, sla_handler_, mov_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, lda_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, sta_handler_, jbs_handler_, ioc_handler_, inp_handler_, out_handler_, jrd_handler_, jmp_handler_, jpx_handler_, jpx_handler_, jpx_handler_, jpx_handler_, jpx_handler_, jpx_handler_, jpx_handler_, jpx_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, ina_handler_, cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, cmp_handler_, }; mdk-1.2.9/mixlib/mix_io.h0000644000175000017500000000637712112755472012163 00000000000000/* -*-c-*- ------------------ mix_io.h : * Declarations for mix_iochannel_t and mix_file_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_IOCHANNEL_H #define MIX_IOCHANNEL_H #include #include "mix_types.h" /* mix_iochannel_t: an object for input/output of mix types */ typedef struct mix_iochannel_t mix_iochannel_t; /* Cast to mix_iochannel_t */ #define MIX_IOCHANNEL(file) (mix_iochannel_t *)(file) /* I/O channels can be created in different modes: */ typedef enum { mix_io_READ, /* read existing file */ mix_io_WRITE, /* write new file */ mix_io_RDWRT, /* read/write existing from beginning */ mix_io_APPEND, /* append to existing or new file */ mix_io_RAPPEND /* read from beginning, append to end */ } mix_fmode_t; /* Create from a file handle */ extern mix_iochannel_t * mix_io_new (FILE *file); /* Delete */ extern void mix_io_delete (mix_iochannel_t *ch); /* Convert to a FILE * */ extern FILE * mix_io_to_FILE (mix_iochannel_t *ioc); /* Read/write from/to an iochannel */ extern gboolean mix_io_eof (mix_iochannel_t *ioc); extern gboolean mix_io_is_ready (mix_iochannel_t *ioc); extern gboolean mix_io_write_byte (mix_iochannel_t *ioc, mix_byte_t b); extern gboolean mix_io_write_byte_array (mix_iochannel_t *ioc, const mix_byte_t *b, size_t s); extern mix_byte_t mix_io_read_byte (mix_iochannel_t *ioc); extern gboolean mix_io_read_byte_array (mix_iochannel_t *ioc, mix_byte_t *b, size_t s); extern gboolean mix_io_write_word (mix_iochannel_t *ioc, mix_word_t w); extern gboolean mix_io_write_word_array (mix_iochannel_t *ioc, const mix_word_t *w, size_t s); extern mix_word_t mix_io_read_word (mix_iochannel_t *ioc); extern gboolean mix_io_read_word_array (mix_iochannel_t *ioc, mix_word_t *w, size_t s); extern gboolean mix_io_write_short (mix_iochannel_t *ioc, mix_short_t w); extern gboolean mix_io_write_short_array (mix_iochannel_t *ioc, const mix_short_t *w, size_t s); extern mix_short_t mix_io_read_short (mix_iochannel_t *ioc); extern gboolean mix_io_read_short_array (mix_iochannel_t *ioc, mix_short_t *w, size_t s); extern gboolean mix_io_write_char (mix_iochannel_t *ioc, mix_char_t c); extern mix_char_t mix_io_read_char (mix_iochannel_t *ioc); extern gboolean mix_io_write_word_array_as_char (mix_iochannel_t *ioc, const mix_word_t *w, size_t s); extern gboolean mix_io_read_word_array_as_char (mix_iochannel_t *ioc, mix_word_t *w, size_t s); #endif /* MIX_IOCHANNEL_H */ mdk-1.2.9/mixlib/xmix_vm_command.h0000644000175000017500000000631012262420755014046 00000000000000/* -*-c-*- ---------------- xmix_vm_command.h : * Private type declarations form mix_vm_command * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2007, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_VM_COMMAND_H #define XMIX_VM_COMMAND_H #include #include #include #include #include #include "mix.h" #include "mix_device.h" #include "mix_vm.h" #include "mix_vm_dump.h" #include "mix_eval.h" #include "mix_predicate.h" #include "mix_vm_command.h" #include "completion.h" /* configuration keys */ extern const gchar *TRACING_KEY_; extern const gchar *TIMING_KEY_; extern const gchar *EDITOR_KEY_; extern const gchar *ASM_KEY_; extern const gchar *LOGGING_KEY_; /* hooks */ typedef struct { mix_vm_cmd_hook_t func; gpointer data; } hook_; typedef struct { mix_vm_cmd_global_hook_t func; gpointer data; } global_hook_; enum {PRNO_ = MIX_PRED_MEM, HOOKNO_ = MIX_CMD_INVALID}; struct mix_vm_cmd_dispatcher_t { mix_vm_t *vm; /* the virtual machine */ gboolean result; /* last command's outcome */ gchar *program; /* the name of the last loaded program */ gchar *editor; /* edit command line template */ gchar *assembler; /* compile command line template */ FILE *out; /* message output file */ FILE *err; /* error output file */ mix_dump_context_t *dump; /* dump context for output */ mix_eval_t *eval; /* evaluator for w-expressions */ gboolean trace; /* tracing flag */ gboolean printtime; /* printing times flag */ mix_time_t uptime; /* total running time */ mix_time_t laptime; /* last run time */ mix_time_t progtime; /* current program running time */ GHashTable *commands; /* local commands */ Completion *completions; /* command completion list */ GSList *pre_hooks[HOOKNO_]; /* Pre-command hooks */ GSList *post_hooks[HOOKNO_]; /* Post-command hooks */ GSList *global_pre; /* global pre-command hook */ GSList *global_post; /* global post-command hook */ mix_config_t *config; /* externally provided configuration */ mix_predicate_t *preds[PRNO_]; /* predicates for conditional breakpoints */ GHashTable *mem_preds; /* predicates for memory conditional bps */ gboolean log_msg; /* message logging activation flag*/ }; extern void log_message_ (mix_vm_cmd_dispatcher_t *dis, const gchar *fmt, ...); extern void log_error_ (mix_vm_cmd_dispatcher_t *dis, const gchar *fmt, ...); #define wants_logs_(dis) (dis)->log_msg #endif /* XMIX_VM_COMMAND_H */ mdk-1.2.9/mixlib/mix_types.c0000644000175000017500000003723112622454575012712 00000000000000/* -*-c-*- ------------------ mix_types.c : * Implementation file for mix_types.h declarations. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix.h" #include #include #include "mix_types.h" /*------------------------ initialisation stuff ------------------------*/ /* flag telling whether a field spec is valid */ static gboolean is_bad_field_[MIX_BYTE_MAX + 1]; /* shift associated with a fspec */ static guint shift_[MIX_BYTE_MAX + 1]; /* mask associated with a fspec */ static glong mask_[MIX_BYTE_MAX + 1]; /* maps from gchar's to mix_char_t */ #define NONP_ (guchar)('?') static mix_char_t ascii_to_mix_char_[UCHAR_MAX + 1]; static guchar mix_char_to_ascii_[MIX_CHAR_MAX + 1] = { ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', '~', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', '[', '#', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '(', ')', '+', '-', '*', '/', '=', '$', '<', '>', '@', ';', ':', '\'' }; /* initialise the above arrays */ void mix_init_types (void) { guint lt, rt; for (lt = 0; lt < 8; ++lt) for (rt = 0; rt < 8; ++rt) { guint F = 8 * lt + rt; is_bad_field_[F] = rt < lt || 5 < rt; if ( is_bad_field_[F] ) shift_[F] = 0, mask_[F] = 0; else { guint width = rt - (lt == 0 ? 1 : lt) + 1; shift_[F] = 6 * (5 - rt); mask_[F] = ((1L << (6 * width)) - 1) << shift_[F]; } } for ( lt = 0; lt < UCHAR_MAX + 1; ++lt ) ascii_to_mix_char_[lt] = NONP_; for ( lt = 0; lt < MIX_CHAR_MAX + 1; ++lt ) ascii_to_mix_char_[mix_char_to_ascii_[lt]] = (guchar)lt; } mix_char_t mix_ascii_to_char (guchar c) { return ascii_to_mix_char_[toupper (c)]; } guchar mix_char_to_ascii (mix_char_t c) { return c > MIX_CHAR_MAX ? NONP_ : mix_char_to_ascii_[c]; } /*---------------------------- m_word_t --------------------------------- */ /* Create mix_word_t from an array of mix_byte_t */ mix_word_t mix_bytes_to_word (mix_byte_t *bytes, guint byteno) { mix_word_t result = 0; guint k; g_return_val_if_fail (bytes != NULL, MIX_WORD_ZERO); g_return_val_if_fail (byteno != 0, MIX_WORD_ZERO); if ( byteno > 5 ) byteno = 5; for ( k = 0; k < byteno; k++ ) result |= ((gulong)bytes[k]) << (6*(byteno-k-1)); return result; } /* Field operations */ mix_word_t /* the specified field or 0 if f is not valid */ mix_word_get_field (mix_fspec_t f, mix_word_t word) { mix_word_t result; g_return_val_if_fail (!is_bad_field_[f],MIX_WORD_ZERO); result = ( (word & mask_[f]) >> shift_[f] ); if (f < 8) /* if f is of the form (0:R), retain the sign of word */ result |= mix_word_sign (word); return result; } mix_word_t mix_word_set_field (mix_fspec_t f, mix_word_t from, mix_word_t to) { mix_word_t result; glong m = mask_[f]; g_return_val_if_fail (!is_bad_field_[f],to); if (f < 8) /* if F is of the form (0:R), use the sign of -from- */ result = (to & ~m & ~MIX_WORD_SIGN_BIT) | ((from /*<< shift_[f]*/) & m) | mix_word_sign (from); else result = (to & ~m) | ((from /*<< shift_[f]*/) & m); return result; } mix_word_t mix_word_store_field (mix_fspec_t f, mix_word_t from, mix_word_t to) { mix_word_t result; glong m = mask_[f]; g_return_val_if_fail (!is_bad_field_[f],to); if (f < 8) /* if F is of the form (0:R), use the sign of -from- */ result = (to & ~m & ~MIX_WORD_SIGN_BIT) | ((from << shift_[f]) & m) | mix_word_sign (from); else result = (to & ~m) | ((from << shift_[f]) & m); return result; } gboolean mix_fspec_is_valid (mix_fspec_t f) { return !(is_bad_field_[f]); } mix_byte_t mix_word_get_byte (mix_word_t word, /* word parsed */ guint idx /* byte: 1 to 5 */ ) { mix_byte_t fspec = mix_fspec_new (idx,idx); g_return_val_if_fail ((idx > 0 && idx < 6), MIX_BYTE_ZERO); return mix_byte_new (mix_word_get_field (fspec,word)); } extern void mix_word_set_byte (mix_word_t *into, guint idx, mix_byte_t value) { mix_word_t from = value; mix_byte_t fspec = mix_fspec_new (idx,idx); g_return_if_fail (into != NULL); g_return_if_fail (idx > 0 && idx < 6); from <<= shift_[fspec]; *into = mix_word_set_field (fspec,from,*into); } /* Arithmetic operations */ mix_word_t mix_word_add (mix_word_t x, mix_word_t y) { static const gulong MIX_WORD_MAX_SIM = 2*MIX_WORD_MAX + 1; gint32 result; if ( mix_word_sign (x) == mix_word_sign (y) ) { result = (mix_word_magnitude (x) + mix_word_magnitude (y)); if ( result > MIX_WORD_MAX ) { /* for instance MIX_WORD_MAX + 1 = - MIX_WORD_MAX */ result = MIX_WORD_MAX_SIM - result; result |= mix_word_sign (mix_word_negative (x)); } else if ( result != 0 ) result |= mix_word_sign (x); /* keep positive sign for 0 so that w - w == -w + w */ } else { result = mix_word_magnitude (x) - mix_word_magnitude (y); if (result < 0) result = -result|mix_word_sign (y); else if (result > 0) result = result|mix_word_sign (x); /* keep positive sign for 0 so that w - w == -w + w */ } g_assert ( result >= 0 ); return (mix_word_t)result; } gboolean /* TRUE if overflow */ mix_word_add_and_carry (mix_word_t x, mix_word_t y, mix_word_t *h, mix_word_t *l) { gboolean result; if ( mix_word_sign (x) == mix_word_sign (y) ) { guint32 sum = (mix_word_magnitude (x) + mix_word_magnitude (y)); if ( sum > MIX_WORD_MAX ) { result = TRUE; if ( l != NULL ) { *l = sum - MIX_WORD_MAX -1; *l |= mix_word_sign (x); } if ( h != NULL ) { *h = sum >> 30; *h |= mix_word_sign (x); } } else /* sum <= MIX_WORD_MAX */ { result = FALSE; if ( h != NULL ) *h = 0; if ( l != NULL ) { *l = sum; if ( sum != 0 ) *l |= mix_word_sign (x); /* keep positive sign for 0 so that w - w == -w + w */ } } } else /* mix_word_sign (x) != mix_word_sign (y) */ { result = FALSE; if ( h != NULL ) *h = 0; if ( l != NULL ) { gint32 dif = mix_word_magnitude (x) - mix_word_magnitude (y); if ( dif < 0) *l = (-dif)|mix_word_sign (y); else if ( dif > 0) *l = dif|mix_word_sign (x); else /* keep positive sign for 0 so that w - w == -w + w */ *l = MIX_WORD_ZERO; } } return result; } void mix_word_mul (mix_word_t x, mix_word_t y, mix_word_t *high_word, mix_word_t *low_word) { guint32 sign = mix_word_sign (x) ^ mix_word_sign (y); /* x = x0 + x1 * 2 ^ 10 + x2 * 2 ^ 20 y = y0 + y1 * 2 ^ 10 + y2 * 2 ^ 20 x0, x1, x2, y0, y1, y2 are < 2 ^ 10 */ guint32 x0 = (x & 0x000003FF); guint32 x1 = (x & 0x000FFC00) >> 10; guint32 x2 = (x & 0x3FF00000) >> 20; guint32 y0 = (y & 0x000003FF); guint32 y1 = (y & 0x000FFC00) >> 10; guint32 y2 = (y & 0x3FF00000) >> 20; /* x * y = partial0 + partial1 * 2 ^ 10 + partial2 * 2 ^ 20 + partial3 * 2 ^ 30 + partial4 * 2 ^ 40 partial0 and partial4 are < 2 ^ 20 partial1 and partial3 are < 2 ^ 21 partial2 is < 3 * 2 ^ 20 */ guint32 partial0 = x0 * y0; guint32 partial1 = x0 * y1 + x1 * y0; guint32 partial2 = x0 * y2 + x1 * y1 + x2 * y0; guint32 partial3 = x1 * y2 + x2 * y1; guint32 partial4 = x2 * y2; /* sum1 has a place value of 1 and is < 2 ^ 32 */ guint32 sum1 = partial0 + (partial1 << 10); guint32 carry1 = (sum1 & 0xFFF00000) >> 20; /* sum2 has a place value of 2 ^ 20 and is < 2 ^ 32 */ guint32 sum2 = partial2 + (partial3 << 10) + carry1; guint32 carry2 = (sum2 & 0xFFF00000) >> 20; /* sum3 has a place value of 2 ^ 40 and is < 2 ^ 20 */ guint32 sum3 = partial4 + carry2; sum1 &= ~0xFFF00000; sum2 &= ~0xFFF00000; /* Now paste the three values back into two. */ if ( low_word != NULL ) { *low_word = sum1 | ((sum2 & 0x000003FF) << 20); *low_word |= sign; } if ( high_word != NULL ) { *high_word = ((sum2 & 0x000FFC00) >> 10) | (sum3 << 10); *high_word |= sign; } } gboolean mix_word_div (mix_word_t n1, mix_word_t n0, mix_word_t d, mix_word_t *quotient, mix_word_t *remainder) { gboolean overflow = FALSE; long magn1 = mix_word_magnitude (n1); long magd = mix_word_magnitude (d); if (magd == 0) { overflow = TRUE; /* just so they have -some- valid value */ if ( quotient != NULL ) *quotient = 0; if ( remainder != NULL ) *remainder = 0; } else if (magn1 == 0) { /* special-cased for speed */ if ( quotient != NULL ) *quotient = (mix_word_sign (n1) ^ mix_word_sign (d)) | (mix_word_magnitude (n0) / magd); if ( remainder != NULL ) *remainder = mix_word_sign (n1) | (mix_word_magnitude (n0) % magd); } else if (magd <= magn1) { overflow = TRUE; if ( quotient != NULL ) *quotient = 0; if ( remainder != NULL ) *remainder = 0; } else { long q = mix_word_magnitude (n0); long r = magn1; unsigned i; for (i = 30; i != 0; --i) { r <<= 1; if ( (q & (1L << 29)) != 0 ) ++r; q = (q << 1) & ((1L << 30) - 1); if (magd <= r) ++q, r -= magd; } if ( quotient != NULL ) *quotient = (mix_word_sign (n1) ^ mix_word_sign (d)) | q; if ( remainder != NULL ) *remainder = mix_word_sign(n1) | r; } return overflow; } void mix_word_shift_right (mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX) { if ( pX != NULL ) *pX = mix_word_sign (X); if ( pA != NULL ) *pA = mix_word_sign (A); if (count < 5) { if ( pA != NULL ) *pA |= mix_word_magnitude (A) >> (6 * count); if ( pX != NULL ) *pX |= MIX_WORD_MAX & ( (mix_word_magnitude (X) >> (6 * count)) | (A << (30 - 6 * count)) ); } else if (count < 10 && pX != NULL) *pX |= mix_word_magnitude (A) >> (6 * count - 30); else ; } void mix_word_shift_left (mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX) { if ( pX != NULL ) *pX = mix_word_sign (X); if ( pA != NULL ) *pA = mix_word_sign (A); if (count < 5) { if ( pX != NULL ) *pX |= MIX_WORD_MAX & (X << (6 * count)); if ( pA != NULL ) *pA |= MIX_WORD_MAX & ( (A << (6 * count)) | (mix_word_magnitude (X) >> (30 - 6 * count)) ); } else if (count < 10 && pA != NULL) *pA |= MIX_WORD_MAX & (X << (6 * count - 30)); else ; } void mix_word_shift_left_circular (mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX) { mix_word_t A1, X1; guint c; count %= 10; A1 = count < 5 ? A : X; X1 = count < 5 ? X : A; c = 6 * (count < 5 ? count : count - 5); if ( pX != NULL ) *pX = mix_word_sign (X) | ( MIX_WORD_MAX & (X1 << c) ) | ( mix_word_magnitude (A1) >> (30 - c) ); if ( pA != NULL ) *pA = mix_word_sign (A) | ( MIX_WORD_MAX & (A1 << c) ) | ( mix_word_magnitude (X1) >> (30 - c) ); } void mix_word_shift_right_circular (mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX) { mix_word_t A1, X1; guint c; count %= 10; A1 = count < 5 ? A : X; X1 = count < 5 ? X : A; c = 6 * (count < 5 ? count : count - 5); if ( pX != NULL ) *pX = mix_word_sign (X) | ( mix_word_magnitude (X1) >> c ) | ( MIX_WORD_MAX & (A1 << (30 - c)) ); if ( pA != NULL ) *pA = mix_word_sign (A) | ( mix_word_magnitude (A1) >> c ) | ( MIX_WORD_MAX & (X1 << (30 - c)) ); } void mix_word_shift_left_binary (mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX) { if ( pX != NULL ) *pX = mix_word_sign (X); if ( pA != NULL ) *pA = mix_word_sign (A); if (count < 30) { if ( pX != NULL ) *pX |= MIX_WORD_MAX & (X << count); if ( pA != NULL ) *pA |= MIX_WORD_MAX & ( (A << count) | (mix_word_magnitude (X) >> (30 - count)) ); } else if (count < 60 && pA != NULL) *pA |= MIX_WORD_MAX & (X << (count - 30)); else ; } void mix_word_shift_right_binary (mix_word_t A, mix_word_t X, gulong count, mix_word_t *pA, mix_word_t *pX) { if ( pX != NULL ) *pX = mix_word_sign (X); if ( pA != NULL ) *pA = mix_word_sign (A); if (count < 30) { if ( pA != NULL ) *pA |= mix_word_magnitude (A) >> count; if ( pX != NULL ) *pX |= MIX_WORD_MAX & ( (mix_word_magnitude (X) >> count) | (A << (30 - count)) ); } else if (count < 60 && pX != NULL) *pX |= mix_word_magnitude (A) >> (count - 30); else ; } /* Printable representation */ void mix_word_print_to_file (mix_word_t word, const char *message, FILE *f) { guint k; if ( message ) fprintf (f, "%s ", message); fprintf (f, "%s ", mix_word_sign (word) == 0 ? "+" : "-"); for ( k = 1; k < 6; ++k ) { fprintf (f, "%02d ", mix_word_get_byte (word,k)); } fprintf (f, "(%010ld)", mix_word_magnitude (word)); } void mix_word_print_to_buffer (mix_word_t word, gchar *buf) { g_return_if_fail (buf != NULL); sprintf (buf, "%s %02d %02d %02d %02d %02d", mix_word_sign (word) == 0 ? "+" : "-", mix_word_get_byte (word, 1), mix_word_get_byte (word, 2), mix_word_get_byte (word, 3), mix_word_get_byte (word, 4), mix_word_get_byte (word, 5)); } /* Conversions between words and shorts */ mix_short_t mix_word_to_short (mix_word_t word) { if ( mix_word_is_negative (word) ) return ( (word & MIX_SHORT_MAX) | MIX_SHORT_SIGN_BIT ); else return (word & MIX_SHORT_MAX); } mix_word_t mix_short_to_word (mix_short_t s) { if ( mix_short_is_negative (s) ) return ((mix_word_t) (mix_short_magnitude (s) | MIX_WORD_SIGN_BIT)); else return ((mix_word_t)s); } mix_short_t mix_short_add (mix_short_t x, mix_short_t y) { static const guint16 MIX_SHORT_MAX_SIM = 2*MIX_SHORT_MAX + 1; gint16 result; if ( mix_short_sign (x) == mix_short_sign (y) ) { result = (mix_short_magnitude (x) + mix_short_magnitude (y)); if ( result > MIX_SHORT_MAX ) { /* for instance MIX_SHORT_MAX + 1 = - MIX_SHORT_MAX */ result = MIX_SHORT_MAX_SIM - result; result |= mix_short_sign (mix_short_negative (x)); } else if ( result != 0 ) result |= mix_short_sign (x); /* keep positive sign for 0 so that w - w == -w + w */ } else { result = mix_short_magnitude (x) - mix_short_magnitude (y); if (result < 0) result = -result|mix_short_sign (y); else if (result > 0) result = result|mix_short_sign (x); /* keep positive sign for 0 so that w - w == -w + w */ } g_assert ( result >= 0 ); return (mix_short_t)result; } /* Printable representation */ void mix_short_print (mix_short_t s, const gchar *message) { if ( message ) g_print ("%s ", message); g_print ("%s ", mix_short_sign (s) == 0 ? "+" : "-"); g_print ("%02d %02d ", mix_byte_new (s>>6), mix_byte_new (s)); g_print ("(%04d)", mix_short_magnitude (s)); } void mix_short_print_to_buffer (mix_short_t s, gchar *buf) { g_return_if_fail (buf != NULL); sprintf (buf, "%s %02d %02d", mix_short_sign (s) == 0 ? "+" : "-", mix_byte_new (s>>6), mix_byte_new (s)); /* g_print ("(%04d)", mix_short_magnitude (s));*/ } mdk-1.2.9/mixlib/completion.h0000644000175000017500000000476412262421405013036 00000000000000/* Adapted from GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * 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 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * Modified by Jose Antonio Ortega Ruiz 2014, for inclusion in MDK due * to deprecation in new versions of Glib. Only changes are renaming * GCompletion to Completion and g_completion to completion. */ #ifndef __COMPLETION_H__ #define __COMPLETION_H__ #include typedef struct _Completion Completion; typedef gchar* (*CompletionFunc) (gpointer); /* Completion */ typedef gint (*CompletionStrncmpFunc) (const gchar *s1, const gchar *s2, gsize n); struct _Completion { GList* items; CompletionFunc func; gchar* prefix; GList* cache; CompletionStrncmpFunc strncmp_func; }; Completion* completion_new (CompletionFunc func); void completion_add_items (Completion* cmp, GList* items); void completion_remove_items (Completion* cmp, GList* items); void completion_clear_items (Completion* cmp); GList* completion_complete (Completion* cmp, const gchar* prefix, gchar** new_prefix); GList* completion_complete_utf8 (Completion *cmp, const gchar* prefix, gchar** new_prefix); void completion_set_compare (Completion *cmp, CompletionStrncmpFunc strncmp_func); void completion_free (Completion* cmp); #endif /* __COMPLETION_H__ */ mdk-1.2.9/mixlib/xmix_vm_handlers.c0000644000175000017500000010732112622454575014236 00000000000000/* -*-c-*- -------------- xmix_vm_handlers.c : * Implementation of the functions declared in xmix_vm_handlers.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007, 2010, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "xmix_vm_handlers.h" /* available commands (in the same order as the type enum) */ mix_vm_command_info_t commands_[] = { { "help", cmd_help_, N_("Display this text"), "help [COMMAND]"}, { "load", cmd_load_, N_("Load a MIX code file"), "load FILENAME"}, { "edit", cmd_edit_, N_("Edit a MIXAL source file"), "edit [FILENAME]"}, { "pedit", cmd_pedit_, N_("Print the external editor command"), "pedit"}, { "sedit", cmd_sedit_, N_("Set the external editor command"), "sedit COMMAND (e.g. emacs %s)"}, { "compile", cmd_compile_, N_("Compile a MIXAL source file"), "compile [FILENAME]"}, { "pasm", cmd_pasm_, N_("Print the compile command"), "pasm"}, { "sasm", cmd_sasm_, N_("Set the compile command"), "sasm COMMAND (e.g. mixasm -g -l %s)"}, { "run", cmd_run_, N_("Run loaded or given MIX code file"), "run [FILENAME]"}, { "next", cmd_next_, N_("Execute next instruction(s)"), "next [NO_OF_INS]"}, { "pstat", cmd_pstat_, N_("Print current vm status"), "pstat"}, { "pc", cmd_pc_, N_("Print program counter value"), "pc" }, { "psym", cmd_psym_, N_("Print symbol value"), "psym [SYMBOLNAME]"}, { "preg", cmd_preg_, N_("Print register value"), "preg [A | X | J | I[1-6]]"}, { "pflags", cmd_pflags_, N_("Print comparison and overflow flags"), "pflags"}, { "pall", cmd_pall_, N_("Print all registers and flags"), "pall"}, { "pmem", cmd_pmem_, N_("Print memory contents in address range"), "pmem FROM[-TO]"}, { "sreg", cmd_sreg_, N_("Set register value"), "sreg A | X | J | I[1-6] VALUE"}, { "scmp", cmd_scmp_, N_("Set comparison flag value"), "scmp L | E | G"}, { "sover", cmd_sover_, N_("Set overflow flag value"), "sover T | F" }, { "smem", cmd_smem_, N_("Set memory contents in given address"), "smem ADDRESS VALUE"}, { "ssym", cmd_ssym_, N_("Set a symbol\'s value"), "ssym SYMBOL WEXPR"}, { "sbp", cmd_sbp_, N_("Set break point at given line"), "sbp LINENO"}, { "cbp", cmd_cbp_, N_("Clear break point at given line"), "cbp LINENO"}, { "sbpa", cmd_sbpa_, N_("Set break point at given address"), "sbpa ADDRESS"}, { "cbpa", cmd_cbpa_, N_("Clear break point at given address"), "cbpa ADDRESS"}, { "sbpr", cmd_sbpr_, N_("Set conditional breakpoint on register change"), "sbpr A | X | J | I[1-6]"}, { "cbpr", cmd_cbpr_, N_("Clear conditional breakpoint on register change"), "sbpr A | X | J | I[1-6]"}, { "sbpm", cmd_sbpm_, N_("Set conditional breakpoint on mem cell change"), "sbpm ADDRESS"}, { "cbpm", cmd_cbpm_, N_("Clear conditional breakpoint on mem cell change"), "cbpm ADDRESS"}, { "sbpc", cmd_sbpc_, N_("Set conditional breakpoint on comparison flag change"), "sbpc"}, { "cbpc", cmd_cbpc_, N_("Clear conditional breakpoint on comparison flag change"), "cbpc"}, { "sbpo", cmd_sbpo_, N_("Set conditional breakpoint on overflow toggled"), "sbpo"}, { "cbpo", cmd_cbpo_, N_("Clear conditional breakpoint on overflow toggled"), "cbpo"}, { "cabp", cmd_cabp_, N_("Clear all breakpoints"), "cabp"}, { "weval", cmd_weval_, N_("Evaluate a given W-expression"), "weval WEXPR"}, { "w2d", cmd_w2d_, N_("Convert a MIX word to its decimal value"), "w2d WORD"}, { "strace", cmd_strace_, N_("Turn on/off instruction tracing"), "strace on|off"}, { "pbt", cmd_pbt_, N_("Print backtrace of executed instructions"), "pbt [INS_NO] (e.g pbt 5)"}, { "stime", cmd_stime_, N_("Turn on/off timing statistics"), "stime on|off"}, { "ptime", cmd_ptime_, N_("Print current time statistics"), "ptime"}, { "sddir", cmd_sddir_, N_("Set devices directory"),"sddir NEWDIR"}, { "pddir", cmd_pddir_, N_("Print current devices directory"),"pddir"}, { "slog", cmd_slog_, N_("Turn on/off message logging"), "slog on|off"}, { "pprog", cmd_pprog_, N_("Print the current program path"), "pprog"}, { "psrc", cmd_psrc_, N_("Print the current program source path"), "psrc"}, { "pline", cmd_pline_, N_("Print the current (or a given) program source line"), "pline [LINENO]"}, { NULL, NULL, NULL, NULL}, }; /* trace current instruction */ static void do_trace_ (mix_vm_cmd_dispatcher_t *dis, gboolean error) { enum {BUFFER_LEN = 128}; static gchar STRINS[BUFFER_LEN]; const mix_src_file_t *file = mix_vm_get_src_file (dis->vm); const gchar *line = "\n"; mix_address_t loc = mix_vm_get_prog_count (dis->vm); mix_word_t ins = mix_vm_get_addr_contents (dis->vm, loc); mix_ins_t fins; mix_word_to_ins_uncheck (ins, fins); mix_ins_to_string_in_buffer (&fins, STRINS, BUFFER_LEN); if (file != NULL) { gulong b = mix_vm_get_break_lineno (dis->vm); if (b > 0) line = mix_src_file_get_line (file, b); } if (!error) log_message_ (dis, "%d: [%-15s]\t%s", (gint)loc, STRINS, line); else log_error_ (dis, "%d: [%-15s]\t%s", (gint)loc, STRINS, line); } static void trace_ (mix_vm_cmd_dispatcher_t *dis) { if (wants_logs_ (dis)) { do_trace_ (dis, FALSE); } } #define trace_error_(dis) do_trace_ (dis, TRUE) /* run a program tracing executed instructions */ static int run_and_trace_ (mix_vm_cmd_dispatcher_t *dis) { int k = MIX_VM_RUNNING; if (!dis->trace) return mix_vm_run (dis->vm); else while (k == MIX_VM_RUNNING) { trace_ (dis); k = mix_vm_exec_next (dis->vm); } return k; } /* print time statistics */ static void print_time_ (mix_vm_cmd_dispatcher_t *dis) { dis->laptime = mix_vm_get_uptime (dis->vm) - dis->uptime; dis->uptime += dis->laptime; dis->progtime += dis->laptime; if (dis->printtime) fprintf (dis->out, _("Elapsed time: %ld /Total program time: %ld (Total uptime: %ld)\n"), dis->laptime, dis->progtime, dis->uptime); } /* commands */ static void print_help_ (gpointer key, gpointer val, gpointer data) { mix_vm_command_info_t *info = (mix_vm_command_info_t *)val; if (info) fprintf ((FILE *)data, "%-15s%s\n", info->name, info->doc); } gboolean cmd_help_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (arg && strlen (arg) > 0) { int i; mix_vm_command_info_t *info = (mix_vm_command_info_t *)g_hash_table_lookup (dis->commands, (gpointer)arg); for (i = 0; info == NULL && commands_[i].name; i++) if (!strcmp (commands_[i].name, arg)) info = commands_ + i; if (info) { fprintf (dis->out , _("%-15s%s.\n%-15sUsage: %s\n"), info->name, info->doc, "", info->usage); return TRUE; } fprintf (dis->out, _("No commands match `%s'\n"), arg); return FALSE; } else { int i = 0; fprintf (dis->out, _("Possible commands are:\n")); for (i = 0; commands_[i].name; ++i) fprintf (dis->out, "%-15s%s\n", commands_[i].name, commands_[i].doc); g_hash_table_foreach (dis->commands, print_help_, (gpointer)dis->out); return TRUE; } } gboolean cmd_load_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { errno = 0; if (arg == NULL || *arg == '\0') { log_error_ (dis, _("Missing file name")); return FALSE; } mix_eval_remove_symbols_from_table (dis->eval, mix_vm_get_symbol_table (dis->vm)); if (!mix_vm_load_file (dis->vm, arg) ) { log_error_ (dis, _("Cannot load %s: "), arg); if ( errno == 0 ) log_error_ (dis, _("Wrong file format")); else log_error_ (dis, "%s", strerror (errno)); return FALSE; } if (dis->program != arg) { if (dis->program) g_free (dis->program); dis->program = mix_file_complete_name (arg, MIX_CODE_DEFEXT); } mix_eval_set_symbols_from_table (dis->eval, mix_vm_get_symbol_table (dis->vm)); if (wants_logs_ (dis)) log_message_ (dis, _("Program loaded. Start address: %d"), mix_vm_get_prog_count (dis->vm)); dis->laptime = dis->progtime = 0; return TRUE; } gboolean cmd_edit_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (dis->editor == NULL) { log_error_ (dis, _("Editor not specified (use sedit)")); return FALSE; } if (!arg || *arg == '\0') arg = mix_vm_cmd_dispatcher_get_src_file_path (dis); if (!arg) { log_error_ (dis, _("MIXAL source file path not found")); return FALSE; } else { gchar *cmd = g_strdup_printf (dis->editor, arg); if (wants_logs_ (dis)) log_message_ (dis, cmd); system (cmd); if (wants_logs_ (dis)) log_message_ (dis, _(" ...done")); g_free (cmd); return TRUE; } } gboolean cmd_compile_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (dis->assembler == NULL) { log_error_ (dis, _("MIX assembler not specified (use sasm)")); return FALSE; } if (!arg || *arg == '\0') arg = mix_vm_cmd_dispatcher_get_src_file_path (dis); if (!arg) { log_error_ (dis, _("MIXAL source file path not found")); return FALSE; } else { gchar *cmd = g_strdup_printf (dis->assembler, arg); gchar *errors = NULL; gchar *output = NULL; gint exit_status; gboolean result; GError *gerr = NULL; if (wants_logs_ (dis)) log_message_ (dis, cmd); result = g_spawn_command_line_sync (cmd, &output, &errors, &exit_status, &gerr); if (output) { log_message_ (dis, output); } if (errors != NULL) { log_message_ (dis, errors); } else if ((exit_status != 0) || !result) { log_error_ (dis, _("Compilation failed")); if (gerr && gerr->message) log_error_ (dis, gerr->message); } if (gerr) g_free (gerr); if (output) g_free (output); if (errors) g_free (errors); g_free (cmd); return TRUE; } } gboolean cmd_run_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (arg != NULL && *arg != '\0' && cmd_load_ (dis, arg) != TRUE) return FALSE; if (mix_vm_is_halted (dis->vm)) cmd_load_ (dis, dis->program); if (wants_logs_ (dis)) log_message_ (dis, _("Running ...")); switch (run_and_trace_ (dis)) { case MIX_VM_HALT: if (wants_logs_ (dis)) log_message_ (dis, _("... done")); break; case MIX_VM_BREAK: if (wants_logs_ (dis)) { gulong line = mix_vm_get_break_lineno (dis->vm); if (line != 0) log_message_ (dis, _("... stopped: breakpoint at line %ld (address %d)"), line, mix_vm_get_prog_count (dis->vm)); else log_message_ (dis, _("... stopped: breakpoint at address %d"), mix_vm_get_prog_count (dis->vm)); } break; case MIX_VM_COND_BREAK: if (wants_logs_ (dis)) { gulong line = mix_vm_get_break_lineno (dis->vm); if (line != 0) log_message_ (dis, _("... stopped: %s (line %ld, address %d)"), mix_vm_get_last_breakpoint_message (dis->vm), line, mix_vm_get_prog_count (dis->vm)); else log_message_ (dis, _("... stopped: %s (address %d)"), mix_vm_get_last_breakpoint_message (dis->vm), mix_vm_get_prog_count (dis->vm)); } break; case MIX_VM_ERROR: log_error_ (dis, _("%s:"), mix_vm_get_last_error_string (dis->vm)); trace_error_ (dis); break; default: g_assert_not_reached (); break; } if (wants_logs_ (dis)) print_time_ (dis); return TRUE; } gboolean cmd_next_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { int ins_no = 1; int k; if ( strlen (arg) != 0 ) { int k = 0; while (isdigit (arg[k])) k++; if (arg[k] != '\0') { log_error_ (dis, _("Invalid argument: %s"), arg); return FALSE; } ins_no = atoi (arg); } if (mix_vm_is_halted (dis->vm)) cmd_load_ (dis, dis->program); while ( ins_no-- > 0 ) { if (dis->trace) trace_ (dis); k = mix_vm_exec_next (dis->vm); if (k == MIX_VM_HALT) { if (wants_logs_ (dis)) log_message_(dis, _("End of program reached at address %d"), mix_vm_get_prog_count (dis->vm)); break; } else if (k == MIX_VM_ERROR) { log_error_ (dis, _("%s:"), mix_vm_get_last_error_string (dis->vm)); trace_error_ (dis); break; } } if (wants_logs_ (dis)) print_time_ (dis); return TRUE; } gboolean cmd_pc_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { fprintf (dis->out, "Current address: %d\n", mix_vm_get_prog_count (dis->vm)); return TRUE; } gboolean cmd_psym_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gboolean result = FALSE; const mix_symbol_table_t *table = mix_eval_symbol_table (dis->eval); if ( table == NULL ) log_error_ (dis, _("Symbol table not available")); else if (arg != NULL && *arg != '\0') { if ( mix_symbol_table_is_defined (table, arg) ) { mix_word_print_to_file (mix_symbol_table_value (table, arg), NULL, dis->out); putc ('\n', dis->out); result = TRUE; } else fprintf (dis->out, _("%s: symbol not defined\n"), arg); } else { mix_symbol_table_print (table, MIX_SYM_ROWS, dis->out, TRUE); result = TRUE; } return result; } gboolean cmd_preg_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { mix_dump_context_set_opt (dis->dump, MIX_DUMP_NONE); if ( strlen (arg) == 0 ) mix_dump_context_add_opt (dis->dump, MIX_DUMP_rALL); else switch (*arg) { case 'A': mix_dump_context_add_opt (dis->dump, MIX_DUMP_rA); break; case 'X': mix_dump_context_add_opt (dis->dump, MIX_DUMP_rX); break; case 'J': mix_dump_context_add_opt (dis->dump, MIX_DUMP_rJ); break; case 'I': { if ( strlen (arg) == 1 ) mix_dump_context_add_opt (dis->dump, MIX_DUMP_rIa); else { static gint32 opt[] = { MIX_DUMP_rI1, MIX_DUMP_rI2, MIX_DUMP_rI3, MIX_DUMP_rI4, MIX_DUMP_rI5, MIX_DUMP_rI6 }; int i = arg[1] - '1'; if ( i < 0 || i > 5 ) { log_error_ (dis, _("Invalid I index: %d"), i); return FALSE; } mix_dump_context_add_opt (dis->dump, opt[i]); } } break; default: log_error_ (dis, _("Invalid argument: %s"), arg); return FALSE; } mix_vm_dump (dis->vm, dis->dump); return TRUE; } gboolean cmd_pflags_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { mix_dump_context_set_opt (dis->dump, MIX_DUMP_CMP | MIX_DUMP_OVER); mix_vm_dump (dis->vm, dis->dump); return TRUE; } gboolean cmd_pall_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { mix_dump_context_set_opt (dis->dump, MIX_DUMP_ALL_NOMEM); mix_vm_dump (dis->vm, dis->dump); return TRUE; } gboolean cmd_pmem_ (mix_vm_cmd_dispatcher_t *dis, const gchar *carg) { glong begin = MIX_SHORT_ZERO, end = MIX_SHORT_ZERO; int i = 0; gboolean error = FALSE; gchar *arg = NULL; if ( strlen (carg) == 0 ) { log_error_ (dis, _("Missing memory address")); return FALSE; } arg = g_strdup (carg); while (isdigit (arg[i])) i++; while (isspace (arg[i])) i++; if (arg[i] == '\0') begin = end = atol (arg); else if (arg[i] == '-') { gchar *narg; arg[i++] = '\0'; begin = atol (arg); narg = arg + i; i = 0; while (isdigit (narg[i])) i++; while (isspace (narg[i])) i++; if (narg[i] != '\0') error = TRUE; else end = atol (narg); } else error = TRUE; if (error) { log_error_ (dis, _("Invalid argument: %s"), arg); } else if ( end < begin || end > MIX_VM_CELL_NO - 1 ) { log_error_ (dis, _("Invalid range: %ld-%ld"), begin, end); error = TRUE; } else { mix_dump_context_set_opt (dis->dump, MIX_DUMP_CELLS); mix_dump_context_range (dis->dump, mix_short_new (begin), mix_short_new (end + 1)); mix_vm_dump (dis->vm, dis->dump); } g_free (arg); return !error; } gboolean cmd_sreg_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { int i = 0; char reg = arg[0]; gboolean ok = TRUE; long value; i = (reg == 'I') ? 2 : 1; ok = strlen (arg) > 2 && isspace (arg[i]); if (ok) { while (isspace (arg[i])) i++; ok = isdigit (arg[i]) || arg[i] == '+' || arg[i] == '-'; if (ok) { value = atol (arg + i); if (arg[i] == '+' || arg[i] == '-') i++; while (isdigit (arg[i])) i++; ok = (arg[i] == '\0'); if (ok) switch (reg) { case 'A': mix_vm_set_rA (dis->vm, mix_word_new (value)); break; case 'X': mix_vm_set_rX (dis->vm, mix_word_new (value)); break; case 'J': if ( value >= 0 ) mix_vm_set_rJ (dis->vm, mix_short_new (value)); else ok = FALSE; break; case 'I': { guint k = arg[1] - '0'; if ( k < 7 ) mix_vm_set_rI (dis->vm, k, mix_short_new (value)); else ok = FALSE; } break; default: ok = FALSE; } } } if (!ok) { log_error_ (dis, _("Invalid argument: %s"), arg); } return ok; } gboolean cmd_scmp_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gboolean ok = (strlen (arg) == 1); if (ok) switch (arg[0]) { case 'L': mix_vm_set_cmpflag (dis->vm, mix_LESS); break; case 'E': mix_vm_set_cmpflag (dis->vm, mix_EQ); break; case 'G': mix_vm_set_cmpflag (dis->vm, mix_GREAT); break; default: ok = FALSE; } if (!ok) { log_error_ (dis, _("Invalid argument: %s"), arg); } return ok; } gboolean cmd_sover_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gboolean ok = (strlen (arg) == 1); if (ok) switch (arg[0]) { case 'T': mix_vm_set_overflow (dis->vm, TRUE); break; case 'F': mix_vm_set_overflow (dis->vm, FALSE); break; default: ok = FALSE; } if (!ok) { log_error_ (dis, _("Invalid argument: %s"), arg); } return ok; } gboolean cmd_smem_ (mix_vm_cmd_dispatcher_t *dis, const gchar *carg) { gboolean ok = (strlen (carg) > 2 && isdigit (carg[0])); glong addr = -1; glong value = 0; int k = 0; gchar *arg = NULL; mix_word_t wval; if (ok) { arg = g_strdup (carg); while (isdigit (arg[k])) k++; ok = isspace (arg[k]); if (ok) { arg[k++] = '\0'; addr = atol (arg); ok = addr < MIX_VM_CELL_NO; } if (ok) { while (isspace (arg[k])) k++; value = atol (arg + k); if ((value == 0) && (arg[k] == '-')) wval = MIX_WORD_MINUS_ZERO; else wval = mix_word_new (value); if ( arg[k] == '+' || arg[k] == '-' ) k++; while (isdigit (arg[k])) k++; ok = arg[k] == '\0'; } } if (ok) { mix_vm_set_addr_contents (dis->vm, mix_short_new (addr), wval); } else { log_error_ (dis, _("Invalid argument: %s"), arg); } if (arg) g_free (arg); return ok; } gboolean cmd_ssym_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gboolean result = FALSE; if (arg == NULL || strlen(arg) == 0) { log_error_ (dis, _("Missing arguments")); } else { gchar *a = g_strdup (arg); gchar *s = strtok (a, " \t"); gchar *w = strtok (NULL, " \t"); if (w != NULL && strtok (NULL, " \t") == NULL) { cmd_weval_ (dis, w); if (mix_eval_last_error (dis->eval) == MIX_EVAL_OK) { mix_eval_set_symbol (dis->eval, s, mix_eval_value (dis->eval)); result = TRUE; } } else { log_error_ (dis, _("Wrong argument number")); } g_free (a); } return result; } gboolean cmd_sbp_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { glong lineno; glong k = 0; while (isdigit (arg[k])) k++; if (arg[k] != '\0') { log_error_ (dis, _("Invalid argument: %s"), arg); return FALSE; } lineno = atol (arg); switch (k = mix_vm_set_breakpoint (dis->vm, lineno)) { case MIX_VM_BP_INV_LINE: log_error_ (dis, _("Line number %ld too high"), lineno); break; case MIX_VM_BP_ERROR: log_error_ (dis, _("Could not set breakpoint: internal error")); break; case MIX_VM_BP_NDEBUG: log_error_ (dis, _("Could not set breakpoint: no debug info available"), dis->err); break; default: if (wants_logs_ (dis)) log_message_ (dis, _("Breakpoint set at line %ld"), k); return TRUE; } return FALSE; } gboolean cmd_sbpa_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { glong address; glong k = 0; while (isdigit (arg[k])) k++; if (arg[k] != '\0') { log_error_ (dis, _("Invalid argument: %s"), arg); return FALSE; } address = atol (arg); switch (mix_vm_set_breakpoint_address (dis->vm, address)) { case MIX_VM_BP_INV_ADDRESS: log_error_ (dis, _("Invalid address %ld"), address); break; case MIX_VM_BP_ERROR: log_error_ (dis, _("Could not set breakpoint: internal error")); break; default: if (wants_logs_ (dis)) log_message_ (dis, _("Breakpoint set at address %ld"), address); return TRUE; } return FALSE; } gboolean cmd_cbp_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { glong lineno; int k = 0; while (isdigit (arg[k])) k++; if (arg[k] != '\0') { log_error_ (dis, _("Invalid argument: %s"), arg); return FALSE; } lineno = atol (arg); switch (mix_vm_clear_breakpoint (dis->vm, lineno)) { case MIX_VM_BP_INV_LINE: log_error_ (dis, _("No breakpoint set at line %ld"), lineno); break; case MIX_VM_BP_ERROR: log_error_ (dis, _("Could not set breakpoint: internal error")); break; case MIX_VM_BP_NDEBUG: log_error_ (dis, _("No debug info available")); break; case MIX_VM_BP_OK: if (wants_logs_ (dis)) log_message_ (dis, _("Breakpoint cleared at line %ld"), lineno); return TRUE; default: g_assert_not_reached (); break; } return FALSE; } gboolean cmd_cbpa_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { glong address; glong k = 0; while (isdigit (arg[k])) k++; if (arg[k] != '\0') { log_error_ (dis, _("Invalid argument: %s"), arg); return FALSE; } address = atol (arg); switch (mix_vm_clear_breakpoint_address (dis->vm, address)) { case MIX_VM_BP_INV_ADDRESS: log_error_ (dis, _("Invalid address %ld"), address); break; case MIX_VM_BP_ERROR: log_error_ (dis, _("Could not clear breakpoint: internal error")); break; default: if (wants_logs_ (dis)) log_message_ (dis, _("Breakpoint cleared at address %ld"), address); return TRUE; } return FALSE; } gboolean cmd_cabp_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (strlen (arg) != 0) { log_error_ (dis, _("Unexpected argument: %s"), arg); return FALSE; } mix_vm_clear_all_breakpoints (dis->vm); return TRUE; } gboolean cmd_weval_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if ( strlen (arg) == 0 ) { log_error_ (dis, _("Missing expression")); return FALSE; } if (mix_eval_expression_with_loc (dis->eval, arg, mix_vm_get_prog_count (dis->vm)) == MIX_EVAL_OK) { mix_word_print_to_file (mix_eval_value (dis->eval), NULL, dis->out); putc ('\n', dis->out); return TRUE; } else { gint pos = mix_eval_last_error_pos (dis->eval); gint k, len = strlen (arg); g_assert(pos > -1 && pos <= len); for (k = 0; kerr); fputc ('\n', dis->err); for (k = 0; kerr); for (k = pos; k < len; ++k) fputc (arg[k], dis->err); fprintf (dis->err, _("\nEvaluation error: %s\n"), mix_eval_last_error_string (dis->eval)); return FALSE; } } gboolean cmd_w2d_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if ( strlen (arg) == 0 ) { log_error_ (dis, _("Missing expression")); return FALSE; } else { gchar *cp = g_strdup (arg), *a = cp; mix_byte_t bytes[5] = {0, 0, 0, 0, 0}; gchar *b; guint k = 0; gboolean is_n = (a[0] == '-'), success = TRUE; if (a[0] == '+' || a[0] == '-') ++a; b = strtok (a, " \t"); while (b != NULL && k < 5) { if (strlen (b) != 2 || !isdigit(b[0]) || !isdigit(b[1])) { log_error_ (dis, _("Incorrect byte specification: %s"), b); success = FALSE; b = NULL; } else { bytes[k++] = mix_byte_new (atoi (b)); b = strtok (NULL, " \t"); } } if (success) { if (strtok (NULL, "\t") != NULL) { log_error_ (dis, _("The expression %s does not fit in a word"), arg); success = FALSE; } else { mix_word_t w = mix_bytes_to_word (bytes, k); fprintf (dis->out, "%s%ld\n", is_n? "-":"+", mix_word_magnitude (w)); } } g_free (cp); return success; } } gboolean cmd_strace_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { static const gchar *ON = "on"; static const gchar *OFF = "off"; if (!arg || !strlen (arg)) { log_error_ (dis, _("Missing argument")); } else if (!strcmp (arg, ON)) { dis->trace = TRUE; if (dis->config) mix_config_update (dis->config, TRACING_KEY_, ON); } else if (!strcmp (arg, OFF)) { dis->trace = FALSE; if (dis->config) mix_config_update (dis->config, TRACING_KEY_, OFF); } else log_error_ (dis, _("Wrong argument: "), arg); return TRUE; } gboolean cmd_stime_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { static const gchar *ON = "on"; static const gchar *OFF = "off"; if (!arg || !strlen (arg)) { log_error_ (dis, _("Missing argument")); } else if (!strcmp (arg, ON)) { dis->printtime = TRUE; if (dis->config) mix_config_update (dis->config, TIMING_KEY_, ON); } else if (!strcmp (arg, OFF)) { dis->printtime = FALSE; if (dis->config) mix_config_update (dis->config, TIMING_KEY_, OFF); } else log_error_ (dis, _("Wrong argument: "), arg); return TRUE; } gboolean cmd_ptime_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { print_time_ (dis); return TRUE; } gboolean cmd_pedit_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { const gchar *ed = mix_vm_cmd_dispatcher_get_editor (dis); if (dis) fprintf (dis->out, _("Edit command: %s\n"), ed); else fprintf (dis->out, _("Edit command not set (use sedit)\n")); return TRUE; } gboolean cmd_sedit_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (!arg || !strlen (arg)) { log_error_ (dis, _("Missing argument")); return FALSE; } mix_vm_cmd_dispatcher_set_editor (dis, arg); return TRUE; } gboolean cmd_pasm_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { const gchar *ed = mix_vm_cmd_dispatcher_get_assembler (dis); if (dis) fprintf (dis->out, _("Compile command: %s\n"), ed); else fprintf (dis->out, _("Compile command not set (use sasm)\n")); return TRUE; } gboolean cmd_sasm_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (!arg || !strlen (arg)) { log_error_ (dis, _("Missing argument")); return FALSE; } mix_vm_cmd_dispatcher_set_assembler (dis, arg); return TRUE; } gboolean cmd_sddir_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (!arg || !strlen (arg)) log_error_ (dis, _("Missing argument")); else if (mix_device_set_dir (arg) && dis->config) mix_config_set_devices_dir (dis->config, arg); return TRUE; } gboolean cmd_pddir_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { fprintf (dis->out, _("Device directory: %s\n"), mix_device_get_dir ()); return TRUE; } static const gint INVALID_REG_ = -2; static mix_predicate_type_t get_reg_pred_ (const gchar *arg) { mix_predicate_type_t pred = INVALID_REG_; switch (*arg) { case 'A': pred = MIX_PRED_REG_A; break; case 'X': pred = MIX_PRED_REG_X; break; case 'J': pred = MIX_PRED_REG_J; break; case 'I': { if ( strlen (arg) == 2 ) { int i = arg[1] - '1'; if (i >= 0 && i < 6) pred = MIX_PRED_REG_I1 + i; } } break; default: break; } return pred; } gboolean cmd_sbpr_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { mix_predicate_type_t pred = get_reg_pred_ (arg); if (pred != INVALID_REG_) { mix_vm_set_conditional_breakpoint (dis->vm, dis->preds[pred]); if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on r%s change set"), arg); return TRUE; } else { log_error_ (dis, _("Invalid argument %s"), arg); return FALSE; } } gboolean cmd_cbpr_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { mix_predicate_type_t pred = get_reg_pred_ (arg); if (pred != INVALID_REG_) { if (mix_vm_clear_conditional_breakpoint (dis->vm, dis->preds[pred])) { if (wants_logs_(dis)) log_message_ (dis, _("Conditional breakpoint on r%s change removed"), arg); } else log_error_ (dis, _("No breakpoint set on r%s change"), arg); return TRUE; } else { log_error_ (dis, _("Invalid argument %s"), arg); return FALSE; } } gboolean cmd_sbpm_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gint add = atoi (arg); gpointer key, value; if (add < 0 || add > MIX_VM_CELL_NO) { log_error_ (dis, _("Invalid memory address: %s"), arg); return FALSE; } if (!g_hash_table_lookup_extended (dis->mem_preds, GINT_TO_POINTER (add), &key, &value)) { mix_predicate_t *new_pred = mix_predicate_new (MIX_PRED_MEM); mix_predicate_set_mem_address (new_pred, add); g_hash_table_insert (dis->mem_preds, GINT_TO_POINTER (add), (gpointer)new_pred); mix_vm_set_conditional_breakpoint (dis->vm, new_pred); } if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on mem cell no. %d set"), add); return TRUE; } gboolean cmd_cbpm_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gint add = atoi (arg); gpointer key, value; if (add < 0 || add > MIX_VM_CELL_NO) { log_error_ (dis, _("Invalid memory address: %s"), arg); return FALSE; } if (g_hash_table_lookup_extended (dis->mem_preds, GINT_TO_POINTER (add), &key, &value)) { g_hash_table_remove (dis->mem_preds, key); mix_vm_clear_conditional_breakpoint (dis->vm, (mix_predicate_t *)value); mix_predicate_delete ((mix_predicate_t *)value); if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on mem cell no. %d removed"), add); } else { log_error_ (dis, _("No conditional breakpoint set at address %d"), add); } return TRUE; } gboolean cmd_sbpo_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (arg && strlen (arg)) log_error_ (dis, _("Unexpected argument: %s"), arg); else { mix_vm_set_conditional_breakpoint (dis->vm, dis->preds[MIX_PRED_OVER]); if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on overflow toggled set")); } return TRUE; } gboolean cmd_cbpo_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (arg && strlen (arg)) log_error_ (dis, _("Unexpected argument: %s"), arg); else { if (mix_vm_clear_conditional_breakpoint (dis->vm, dis->preds[MIX_PRED_OVER])) { if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on overflow toggled removed.")); } else log_error_ (dis, _("No breakpoint set on overflow toggle")); } return TRUE; } gboolean cmd_sbpc_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (arg && strlen (arg)) log_error_ (dis, _("Unexpected argument: %s"), arg); else { mix_vm_set_conditional_breakpoint (dis->vm, dis->preds[MIX_PRED_CMP]); if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on comparison flag changed set")); } return TRUE; } gboolean cmd_cbpc_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { if (arg && strlen (arg)) log_error_ (dis, _("Unexpected argument: %s"), arg); else { if (mix_vm_clear_conditional_breakpoint (dis->vm, dis->preds[MIX_PRED_CMP])) { if (wants_logs_ (dis)) log_message_ (dis, _("Conditional breakpoint on comparison flag changed removed.")); } else log_error_ (dis, _("No breakpoint set on comparison flag change")); } return TRUE; } gboolean cmd_pbt_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { enum {SIZE = 256}; static gchar BUFFER[SIZE]; gint no = atoi (arg); gint k = 0, address; guint line; const mix_src_file_t *file = mix_vm_get_src_file (dis->vm); char *name = file ? g_path_get_basename (mix_src_file_get_path (file)) : NULL; const GSList *add = mix_vm_get_backtrace (dis->vm); while (add && (no == 0 || k < no)) { BUFFER[0] = '\0'; address = GPOINTER_TO_INT (add->data); line = mix_vm_get_address_lineno (dis->vm, address); if (line && file) { int j = 0; g_snprintf (BUFFER, SIZE, "%s", mix_src_file_get_line (file, line)); while (!isspace (BUFFER[j])) j++; BUFFER[j] = '\0'; } if (strlen (BUFFER) == 0) g_snprintf (BUFFER, SIZE, "%d", address); fprintf (dis->out, "#%d\t%s\tin %s%s:%d\n", k, BUFFER, name, MIX_SRC_DEFEXT, line); ++k; add = add->next; } return TRUE; } gboolean cmd_slog_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { static const gchar *ON = "on"; static const gchar *OFF = "off"; if (arg && !strcmp (arg, ON)) { dis->log_msg = TRUE; if (dis->config) mix_config_update (dis->config, LOGGING_KEY_, ON); } else if (arg && !strcmp (arg, OFF)) { dis->log_msg = FALSE; if (dis->config) mix_config_update (dis->config, LOGGING_KEY_, OFF); } else log_error_ (dis, _("Wrong argument: "), arg); return TRUE; } gboolean cmd_pprog_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { const gchar *path = mix_vm_cmd_dispatcher_get_program_path (dis); fprintf (dis->out, "%s", path? path : _("No program currently loaded")); fprintf (dis->out, "%s", "\n"); return (path != NULL); } gboolean cmd_psrc_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { const gchar *path = mix_vm_cmd_dispatcher_get_src_file_path (dis); fprintf (dis->out, "%s", path? path : _("No program currently loaded\n")); fprintf (dis->out, "%s", "\n"); return (path != NULL); } gboolean cmd_pline_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { glong line = 0; const gchar *txt; if (arg && strlen (arg)) line = atoi (arg); if (line < 0) { log_error_ (dis, _("Invalid argument")); return FALSE; } if (line == 0) line = mix_vm_cmd_dispatcher_get_src_file_lineno (dis); if (line == 0) txt = "No such line (debug info not available)\n"; else txt = mix_vm_cmd_dispatcher_get_src_file_line (dis, line, FALSE); if (txt == NULL || strlen (txt) == 0) txt = "No such line\n"; fprintf (dis->out, "Line %ld: %s\n", line, txt); return TRUE; } gboolean cmd_pstat_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { static const gchar *MSGS[MIX_VM_EMPTY + 1] = { N_("Error loading or executing file"), N_("Execution stopped: breakpoint encountered"), N_("Execution stopped: conditional breakpoint encountered"), N_("Program successfully terminated"), N_("Execution stopped"), N_("Program successfully loaded"), N_("No program loaded") }; mix_vm_status_t status = mix_vm_get_run_status (mix_vm_cmd_dispatcher_get_vm (dis)); fprintf (dis->out, "VM status: %s\n", MSGS[status]); return TRUE; } mdk-1.2.9/mixlib/mix_parser.h0000644000175000017500000000743512112755472013044 00000000000000/* -*-c-*- ---------------- mix_parser.h : * Declarations for mix_parser_t, which compiles a source file into * a mix code file. * ------------------------------------------------------------------ * Copyright (C) 2000, 2003, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_PARSER_H #define MIX_PARSER_H #include #include "mix_vm.h" /* The parser type */ typedef struct mix_parser_t mix_parser_t; /* Create/destroy a mix_parser */ extern mix_parser_t * mix_parser_new (const gchar *in_file); extern void mix_parser_delete (mix_parser_t *parser); /* Access source file name */ extern const gchar * mix_parser_src_file_base_name (const mix_parser_t *parser); extern const gchar * mix_parser_src_file_extension (const mix_parser_t *parser); /* Compile a mix source file */ /* compilation errors */ typedef enum { MIX_PERR_OK, /* no error */ MIX_PERR_NOCOMP, /* file not yet compiled */ MIX_PERR_INTERNAL, /* internal error */ MIX_PERR_NOIN, /* unable to open input file */ MIX_PERR_NOOUT, /* unable to open output file */ MIX_PERR_UNEX_EOF, /* unexpected end of file */ MIX_PERR_INV_LOC, /* invalid loc field */ MIX_PERR_DUP_SYMBOL, /* duplicated symbol */ MIX_PERR_LONG_SYMBOL, /* symbol name too long */ MIX_PERR_NOOP, /* missing op field */ MIX_PERR_UNEX_LOC, /* unexpected location symbol */ MIX_PERR_INV_ADDRESS, /* invalid address field */ MIX_PERR_INV_IDX, /* invalid index field */ MIX_PERR_INV_FSPEC, /* invalid fspec */ MIX_PERR_INV_OP, /* invalid operation */ MIX_PERR_INV_EXPR, /* invalid expression */ MIX_PERR_UNDEF_SYM, /* undefined symbol */ MIX_PERR_MIS_PAREN, /* mismatched parenthesis */ MIX_PERR_UNEX_FSPEC, /* unexpected f-spec */ MIX_PERR_MIS_SYM, /* missing symbol name */ MIX_PERR_SYM_INS, /* symbol has the same name as instruction */ MIX_PERR_NOWRITE, /* failed code write */ MIX_PERR_SHORT_ALF, /* short ALF operand */ MIX_PERR_LONG_ALF, /* too long ALF operand */ MIX_PERR_UNQUOTED_ALF /* unquoted ALF operand */ } mix_parser_err_t; extern const gchar * mix_parser_err_string (mix_parser_err_t error); extern mix_parser_err_t mix_parser_compile (mix_parser_t *parser); extern guint mix_parser_warning_count (const mix_parser_t *parser); extern guint mix_parser_err_count (const mix_parser_t *parser); /* Write the compilation result to a code file with the given name. code_file is completed, if required, with the requisite extension; if code_file == NULL [source_file_name].[extension] is used. If debug == TRUE, debug information is written. */ extern mix_parser_err_t mix_parser_write_code (mix_parser_t *parser, const gchar *code_file, gboolean debug); /* Write a "canonical" listing of a compiled source, i.e. a source file with all symbols substituted by their actual values after compilation. */ extern mix_parser_err_t mix_parser_write_listing (mix_parser_t *parser, const gchar *list_file); /* load a virtual machine's memory with the contents of a compiled file */ extern mix_parser_err_t mix_parser_load_vm (const mix_parser_t *parser, mix_vm_t *vm); #endif /* MIX_PARSER_H */ mdk-1.2.9/mixlib/mix_config.c0000644000175000017500000001725412112755472013010 00000000000000/* -*-c-*- -------------- mix_config.c : * Implementation of the functions declared in mix_config.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "mix_config.h" const gchar *MIX_CONFIG_DIR = ".mdk"; static const gchar COMMENT_PREFIX_ = '#'; static const gchar *AUTOSAVE_KEY_ = "Autosave"; static const gchar *AUTOSAVE_YES_ = "True"; static const gchar *AUTOSAVE_NO_ = "False"; static const gchar *DEVICES_KEY_ = "Devices.dir"; static const gchar *HISTORY_KEY_ = "History.file"; static const gchar *HISTORY_SIZE_KEY_ = "History.size"; /* the config type */ struct mix_config_t { gchar *filename; /* full path to configuration file */ gboolean autosave; /* whether save on destroy */ GHashTable *items; /* configuration items */ }; /* create a new config handler, giving the dir and name of the config file */ mix_config_t * mix_config_new (const gchar *dirname, const gchar *filename) { static const gchar *DEF_DIRNAME_ = NULL; static const gchar *DEF_FILENAME_ = "config"; const gchar *autosave; FILE *f; mix_config_t *result = NULL; if (DEF_DIRNAME_ == NULL) DEF_DIRNAME_ = g_strconcat (g_get_home_dir (), G_DIR_SEPARATOR_S, MIX_CONFIG_DIR, NULL); if (dirname == NULL) dirname = DEF_DIRNAME_; if (filename == NULL) filename = DEF_FILENAME_; if (!mix_stat_dir (dirname, "configuration")) return NULL; result = g_new (mix_config_t, 1); result->filename = g_strdup_printf ("%s/%s", dirname, filename); result->items = g_hash_table_new (g_str_hash, g_str_equal); f = fopen (result->filename, "r"); if (f != NULL) { enum {LEN = 256}; gchar buffer[LEN]; gchar *line = buffer; while (!feof (f)) { line = fgets (line, LEN, f); if (line) line = g_strstrip (line); if (line && line[0] != COMMENT_PREFIX_) { gchar **vals = g_strsplit (line, "=", 2); g_hash_table_insert (result->items, (gpointer) g_strstrip (vals[0]), (gpointer) g_strstrip (vals[1])); } } fclose (f); } autosave = mix_config_get (result, AUTOSAVE_KEY_); result->autosave = autosave && !g_ascii_strcasecmp (autosave, AUTOSAVE_YES_); return result; } /* delete a config handler, saving the configuration if needed */ void mix_config_delete (mix_config_t *config) { g_return_if_fail (config != NULL); if (mix_config_is_autosave (config)) mix_config_save (config); g_free (config->filename); g_hash_table_destroy (config->items); g_free (config); } /* get the config filename */ const gchar * mix_config_get_filename (const mix_config_t *config) { g_return_val_if_fail (config != NULL, NULL); return config->filename; } /* get a config item's value from its key */ const gchar * mix_config_get (const mix_config_t *config, const gchar *key) { g_return_val_if_fail (config != NULL, NULL); g_return_val_if_fail (key != NULL, NULL); return (const gchar*)g_hash_table_lookup (config->items, key); } gint mix_config_get_integer (const mix_config_t *config, const gchar *key) { const gchar *val; g_return_val_if_fail (config != NULL, 0); g_return_val_if_fail (key != NULL, 0); val = mix_config_get (config, key); if (!val) return 0; return atoi (val); } /* update (or create if it does not exist) a new config item */ void mix_config_update (mix_config_t *config, const gchar *key, const gchar *value) { gpointer okey = NULL; gpointer oval = NULL; g_return_if_fail (config != NULL); g_return_if_fail (key != NULL); g_return_if_fail (value != NULL); if (g_hash_table_lookup_extended (config->items, key, &okey, &oval)) { if (oval != value) { g_free (oval); oval = (gpointer)g_strdup (value); } } else { okey = (gpointer)g_strdup (key); oval = (gpointer)g_strdup (value); } g_hash_table_insert (config->items, okey, oval); } void mix_config_update_integer (mix_config_t *config, const gchar *key, gint value) { gchar *val; g_return_if_fail (config != NULL); g_return_if_fail (key != NULL); val = g_strdup_printf ("%d", value); mix_config_update (config, key, val); g_free (val); } void mix_config_remove (mix_config_t *config, const gchar *key) { gchar *val; g_return_if_fail (config != NULL); g_return_if_fail (key != NULL); val = g_hash_table_lookup (config->items, key); if (val != NULL) { g_hash_table_remove (config->items, key); g_free (val); } } /* save the current configuration */ static void save_ (gpointer key, gpointer value, gpointer file) { fprintf ((FILE *)file, "%s=%s\n", (char *)key, (char *)value); } void mix_config_save (const mix_config_t *config) { FILE *f; g_return_if_fail (config != NULL); f = fopen (config->filename, "w"); if (!f) { g_warning (_("Unable to open config file %s (%s)"), config->filename, g_strerror (errno)); return; } g_hash_table_foreach (config->items, save_, (gpointer)f); fclose (f); } /* set autosave on delete flag */ void mix_config_set_autosave (mix_config_t *config, gboolean autosave) { mix_config_update (config, AUTOSAVE_KEY_, autosave? AUTOSAVE_YES_ : AUTOSAVE_NO_); config->autosave = autosave; } gboolean mix_config_is_autosave (const mix_config_t *config) { g_return_val_if_fail (config != NULL, FALSE); return config->autosave; } /* devices dir*/ void mix_config_set_devices_dir (mix_config_t *config, const gchar *dirname) { g_return_if_fail (config != NULL); g_return_if_fail (dirname != NULL); if (mix_stat_dir (dirname, "devices")) mix_config_update (config, DEVICES_KEY_, dirname); } extern const gchar * mix_config_get_devices_dir (const mix_config_t *config) { g_return_val_if_fail (config != NULL, NULL); return mix_config_get (config, DEVICES_KEY_); } /* history file. if relative path, config dir taken as root */ void mix_config_set_history_file (mix_config_t *config, const gchar *path) { g_return_if_fail (config != NULL); g_return_if_fail (path != NULL); if (g_path_is_absolute (path)) { mix_config_update (config, HISTORY_KEY_, path); } else { gchar *base = g_path_get_dirname (config->filename); gchar *hf = g_strconcat (base, G_DIR_SEPARATOR_S, path, NULL); mix_config_update (config, HISTORY_KEY_, hf); g_free (hf); g_free (base); } } const gchar * mix_config_get_history_file (const mix_config_t *config) { g_return_val_if_fail (config != NULL, NULL); return mix_config_get (config, HISTORY_KEY_); } void mix_config_set_history_size (mix_config_t *config, gint s) { g_return_if_fail (config != NULL); g_return_if_fail (s >= 0); mix_config_update_integer (config, HISTORY_SIZE_KEY_, s); } gint mix_config_get_history_size (const mix_config_t *config) { g_return_val_if_fail (config != NULL, 0); return mix_config_get_integer (config, HISTORY_SIZE_KEY_); } mdk-1.2.9/mixlib/mix_symbol_table.c0000644000175000017500000001252412112755472014212 00000000000000/* -*-c-*- -------------- mix_symbol_table.c : * Implementation of the functions declared in mix_symbol_table.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include /* isdigit */ #include #include "mix_symbol_table.h" /* Create an empty table */ mix_symbol_table_t * mix_symbol_table_new (void) { return g_hash_table_new (g_str_hash, g_str_equal); } /* Create a table and populate it with the contents of a table stored in -file- using mix_symbol_table_print (table, MIX_SYM_LINE, file) */ mix_symbol_table_t * mix_symbol_table_new_from_file (FILE *file) { mix_symbol_table_t *result = mix_symbol_table_new (); if ( result != NULL ) { gchar sym[MIX_SYM_MAX_LEN + 1]; glong val; while ( getc (file) == ',' ) { if ( fscanf (file, "%s =%ld", sym, &val) != EOF ) mix_symbol_table_add (result, sym, mix_word_new (val)); } } return result; } /* Delete a table */ static void delete_hash_keys_ (gpointer key, gpointer value, gpointer data) { g_free (key); } void mix_symbol_table_delete (mix_symbol_table_t *table) { g_hash_table_foreach (table, delete_hash_keys_, NULL); g_hash_table_destroy (table); } /* add/remove symbols from other table */ static void add_symbol_ (gpointer symbol, gpointer value, gpointer target) { mix_symbol_table_t *t = (mix_symbol_table_t *)target; gchar *s = (gchar *)symbol; mix_word_t v = (mix_word_t)GPOINTER_TO_UINT (value); mix_symbol_table_insert (t, s, v); } static void remove_symbol_ (gpointer symbol, gpointer value, gpointer target) { mix_symbol_table_t *t = (mix_symbol_table_t *)target; gchar *s = (gchar *)symbol; mix_symbol_table_remove (t, s); } gboolean mix_symbol_table_merge_table (mix_symbol_table_t *table, const mix_symbol_table_t *from) { g_return_val_if_fail (table != NULL, FALSE); if (from != NULL) { mix_symbol_table_foreach ((gpointer)from, add_symbol_, table); } return TRUE; } gboolean mix_symbol_table_substract_table (mix_symbol_table_t *table, const mix_symbol_table_t *other) { g_return_val_if_fail (table != NULL, FALSE); if (other != NULL) { mix_symbol_table_foreach ((gpointer)other, remove_symbol_, table); } return TRUE; } /* Add/remove symbols one by one */ gint mix_symbol_table_add (mix_symbol_table_t *table, const gchar *sym, mix_word_t value) { gpointer key, val; if ( table == NULL || sym == NULL ) return MIX_SYM_FAIL; if ( strlen (sym) > MIX_SYM_MAX_LEN ) return MIX_SYM_LONG; if ( !g_hash_table_lookup_extended (table, sym, &key, &val) ) { key = g_strdup (sym); g_hash_table_insert (table, key, GUINT_TO_POINTER (value)); return MIX_SYM_OK; } else return MIX_SYM_DUP; } /* Add or modify symbol if it exists */ gint mix_symbol_table_insert (mix_symbol_table_t *table, const gchar *sym, mix_word_t new_value) { gpointer key, val; if ( table == NULL || sym == NULL ) return MIX_SYM_FAIL; if ( strlen (sym) > MIX_SYM_MAX_LEN ) return MIX_SYM_LONG; if ( !g_hash_table_lookup_extended (table, sym, &key, &val) ) key = g_strdup (sym); g_hash_table_insert (table, key, GUINT_TO_POINTER (new_value)); return MIX_SYM_OK; } /* Symbols lookup */ gboolean mix_symbol_table_is_defined (const mix_symbol_table_t *table, const gchar *sym) { gpointer key, val; return g_hash_table_lookup_extended((GHashTable *)table, sym, &key, &val); } /* Print table */ #define is_local_sym_(sym) \ ((sym) && (strlen (sym)==2) && (sym[1] == 'B') && isdigit (sym[0])) static gboolean skip_ = FALSE; static void print_sym_rows_ (gpointer symbol, gpointer value, gpointer file) { char *s = (char *)symbol; if (skip_ && !is_local_sym_ (s)) { mix_word_t word = (mix_word_t)GPOINTER_TO_UINT (value); fprintf((FILE *)file, "%-20s: %s%ld\n", s, mix_word_is_negative (word)? "-":"", mix_word_magnitude (word)); } } static void print_sym_line_ (gpointer symbol, gpointer value, gpointer file) { char *s = (char *)symbol; if (skip_ && !is_local_sym_ (s)) { mix_word_t word = (mix_word_t)GPOINTER_TO_UINT (value); fprintf((FILE *)file, ",%s =%s%ld", s, mix_word_is_negative (word)? "-":"", mix_word_magnitude (word)); } } void mix_symbol_table_print (const mix_symbol_table_t *table, gint mode, FILE *file, gboolean skiplocal) { GHFunc func = (mode == MIX_SYM_LINE)? print_sym_line_ : print_sym_rows_; skip_ = skiplocal; if ( table != NULL ) g_hash_table_foreach ((GHashTable *)table, func, (gpointer)file); if ( mode == MIX_SYM_LINE ) putc (';', file); /* to mark end-of-table */ } mdk-1.2.9/mixlib/mix_predicate.h0000644000175000017500000000424112112755472013500 00000000000000/* -*-c-*- ---------------- mix_predicate.h : * Predicates and lists of predicates testing vm status. * ------------------------------------------------------------------ * Copyright (C) 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_PREDICATE_H #define MIX_PREDICATE_H #include "mix.h" #include "mix_types.h" #include "mix_ins.h" /* the predicate type */ typedef struct mix_predicate_t mix_predicate_t; /* predicate types */ typedef enum { MIX_PRED_REG_A, MIX_PRED_REG_X, MIX_PRED_REG_J, MIX_PRED_REG_I1, MIX_PRED_REG_I2, MIX_PRED_REG_I3, MIX_PRED_REG_I4, MIX_PRED_REG_I5, MIX_PRED_REG_I6, MIX_PRED_OVER, MIX_PRED_CMP, MIX_PRED_MEM, MIX_PRED_INVALID } mix_predicate_type_t; /* create predicates based on vm status */ extern mix_predicate_t * mix_predicate_new (mix_predicate_type_t type); /* delete a predicate */ extern void mix_predicate_delete (mix_predicate_t *predicate); /* return the predicate's type */ extern mix_predicate_type_t mix_predicate_get_type (const mix_predicate_t *pred); /* change mem address of a MIX_PRED_MEM predicate */ extern void mix_predicate_set_mem_address (mix_predicate_t *predicate, mix_address_t address); /* get message about predicate evaluation */ extern const gchar * mix_predicate_get_message (const mix_predicate_t *predicate); /* test a predicate */ #include "mix_vm.h" extern gboolean mix_predicate_eval(mix_predicate_t *pred, const mix_vm_t *vm); #endif /* MIX_PREDICATE_H */ mdk-1.2.9/mixlib/Makefile.am0000644000175000017500000000322612262422644012546 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2006, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. SUBDIRS = testsuite AM_CFLAGS += -I$(includedir) -I$(top_srcdir) -DG_LOG_DOMAIN=\"libmix\" noinst_LIBRARIES = libmix.a libmix_a_SOURCES = gettext.h \ completion.h completion.c \ mix.h mix.c \ mix_types.h mix_types.c \ mix_ins.h mix_ins.c \ mix_vm.h mix_vm.c xmix_vm.h xmix_vm.c \ mix_vm_dump.h mix_vm_dump.c \ mix_io.h mix_io.c xmix_io.h xmix_io.c \ mix_symbol_table.h mix_symbol_table.c \ mix_file.h mix_file.c \ mix_code_file.h mix_code_file.c \ mix_parser.h xmix_parser.h mix_parser.c mix_scanner.l \ mix_device.h mix_device.c xmix_device.h xmix_device.c \ mix_eval.h mix_eval.c xmix_eval.h mix_eval_scanner.l \ mix_src_file.c mix_src_file.h \ mix_vm_clock.c mix_vm_clock.h \ mix_vm_command.c mix_vm_command.h \ xmix_vm_command.c xmix_vm_command.h \ xmix_vm_handlers.h xmix_vm_handlers.c \ mix_config.c mix_config.h \ mix_predicate.c mix_predicate.h \ mix_predicate_list.c mix_predicate_list.h mdk-1.2.9/mixlib/mix_device.h0000644000175000017500000000665312112755472013010 00000000000000/* -*-c-*- ---------------- mix_device.h : * Declaration of mix_device_t and associated methods. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_DEVICE_H #define MIX_DEVICE_H #include #include #include "mix.h" #include "mix_types.h" /* A mix device, which derives from mix_io_channel_t */ typedef struct mix_device_t mix_device_t; /* The device type */ typedef enum { mix_dev_TAPE_0, mix_dev_TAPE_1, mix_dev_TAPE_2, mix_dev_TAPE_3, mix_dev_TAPE_4, mix_dev_TAPE_5, mix_dev_TAPE_6, mix_dev_TAPE_7, mix_dev_DISK_0, mix_dev_DISK_1, mix_dev_DISK_2, mix_dev_DISK_3, mix_dev_DISK_4, mix_dev_DISK_5, mix_dev_DISK_6, mix_dev_DISK_7, mix_dev_CARD_RD, mix_dev_CARD_WR, mix_dev_PRINTER, mix_dev_CONSOLE, mix_dev_PAPER_TAPE, mix_dev_INVALID } mix_device_type_t; /* The device io mode */ typedef enum { mix_dev_BIN, mix_dev_CHAR } mix_device_mode_t; /* Set the directory for mix device files (by default, it's ".") If the dir does not exist, it is created. */ extern gboolean mix_device_set_dir (const gchar *dirname); extern const gchar * mix_device_get_dir (void); /* Create a new device with default name and given type. */ extern mix_device_t * mix_device_new (mix_device_type_t type); /* Create a new device with a given type and name. */ extern mix_device_t * mix_device_new_with_name (mix_device_type_t type, const gchar *name); /* Create a new device with a given type and stream */ extern mix_device_t * mix_device_new_with_file (mix_device_type_t type, FILE *file); /* Delete a device. */ extern void mix_device_delete (mix_device_t *dev); /* Get a device type */ extern mix_device_type_t mix_device_type (const mix_device_t *dev); /* Get a device name */ extern const char * mix_device_get_name (const mix_device_t *dev); /* Get the device block size */ extern size_t mix_device_block_size (const mix_device_t *dev); /* Get the device io mode */ extern mix_device_mode_t mix_device_mode (const mix_device_t *dev); /* Write a block to the device. */ extern gboolean mix_device_write (mix_device_t *dev, const mix_word_t *block); /* Read a block from the device. */ extern gboolean mix_device_read (mix_device_t *dev, mix_word_t *block); /* Perform an io control operation on the device. The parameter _arg_ is the operation's argument: 0- rewind to beginning <0 - rewind the given number of blocks >0 - skip forward the given number of blocks */ extern gboolean mix_device_ioc (mix_device_t *dev, mix_short_t arg); /* Check if a device is busy */ extern gboolean mix_device_busy (const mix_device_t *dev); #endif /* MIX_DEVICE_H */ mdk-1.2.9/mixlib/mix_predicate_list.h0000644000175000017500000000373212112755472014537 00000000000000/* -*-c-*- ---------------- mix_predicate_list.h : * A list of predicates. * ------------------------------------------------------------------ * Copyright (C) 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_PREDICATE_LIST_H #define MIX_PREDICATE_LIST_H #include "mix.h" #include "mix_vm.h" #include "mix_predicate.h" /* the predicate list type */ typedef struct mix_predicate_list_t mix_predicate_list_t; /* create/destroy a list of predicates */ extern mix_predicate_list_t * mix_predicate_list_new (const mix_vm_t *vm); extern void mix_predicate_list_delete (mix_predicate_list_t *list); /* evaluate the predicate list */ extern gboolean mix_predicate_list_eval (mix_predicate_list_t *list); extern const mix_predicate_t * mix_predicate_list_last_true_eval (const mix_predicate_list_t *list); #define mix_predicate_list_last_true_eval_type(list) \ mix_predicate_get_type (mix_predicate_list_last_true_eval (list)) /* add/remove predicates to the list */ extern void mix_predicate_list_add (mix_predicate_list_t *list, mix_predicate_t *predicate); extern gboolean mix_predicate_list_remove (mix_predicate_list_t *list, mix_predicate_t *predicate); extern void mix_predicate_list_clear (mix_predicate_list_t *list); #endif /* MIX_PREDICATE_LIST_H */ mdk-1.2.9/mixlib/completion.c0000644000175000017500000003117112262421371013023 00000000000000/* Adapted from GLIB - Library of useful routines for C programming * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * 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 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GLib Team and others 1997-2000. See the AUTHORS * file for a list of people on the GLib Team. See the ChangeLog * files for a list of changes. These files are distributed with * GLib at ftp://ftp.gtk.org/pub/gtk/. */ /* * Modified by Jose Antonio Ortega Ruiz 2014, for inclusion in MDK due * to deprecation in new versions of Glib. Only changes are renaming * GCompletion to Completion and g_completion to completion. */ /* * MT safe */ #include "config.h" #include "completion.h" #include #include /** * SECTION:completion * @title: Automatic String Completion * @short_description: support for automatic completion using a group * of target strings * * #Completion provides support for automatic completion of a string * using any group of target strings. It is typically used for file * name completion as is common in many UNIX shells. * * A #Completion is created using completion_new(). Target items are * added and removed with completion_add_items(), * completion_remove_items() and completion_clear_items(). A * completion attempt is requested with completion_complete() or * completion_complete_utf8(). When no longer needed, the * #Completion is freed with completion_free(). * * Items in the completion can be simple strings (e.g. filenames), or * pointers to arbitrary data structures. If data structures are used * you must provide a #CompletionFunc in completion_new(), which * retrieves the item's string from the data structure. You can change * the way in which strings are compared by setting a different * #CompletionStrncmpFunc in completion_set_compare(). * * Completion has been marked as deprecated, since this API is rarely * used and not very actively maintained. **/ /** * Completion: * @items: list of target items (strings or data structures). * @func: function which is called to get the string associated with a * target item. It is %NULL if the target items are strings. * @prefix: the last prefix passed to completion_complete() or * completion_complete_utf8(). * @cache: the list of items which begin with @prefix. * @strncmp_func: The function to use when comparing strings. Use * completion_set_compare() to modify this function. * * The data structure used for automatic completion. **/ /** * CompletionFunc: * @Param1: the completion item. * * Specifies the type of the function passed to completion_new(). It * should return the string corresponding to the given target item. * This is used when you use data structures as #Completion items. * * Returns: the string corresponding to the item. **/ /** * CompletionStrncmpFunc: * @s1: string to compare with @s2. * @s2: string to compare with @s1. * @n: maximal number of bytes to compare. * * Specifies the type of the function passed to * completion_set_compare(). This is used when you use strings as * #Completion items. * * Returns: an integer less than, equal to, or greater than zero if * the first @n bytes of @s1 is found, respectively, to be * less than, to match, or to be greater than the first @n * bytes of @s2. **/ static void completion_check_cache (Completion* cmp, gchar** new_prefix); /** * completion_new: * @func: the function to be called to return the string representing * an item in the #Completion, or %NULL if strings are going to * be used as the #Completion items. * * Creates a new #Completion. * * Returns: the new #Completion. **/ Completion* completion_new (CompletionFunc func) { Completion* gcomp; gcomp = g_new (Completion, 1); gcomp->items = NULL; gcomp->cache = NULL; gcomp->prefix = NULL; gcomp->func = func; gcomp->strncmp_func = strncmp; return gcomp; } /** * completion_add_items: * @cmp: the #Completion. * @items: (transfer none): the list of items to add. * * Adds items to the #Completion. * * Deprecated: 2.26: Rarely used API **/ void completion_add_items (Completion* cmp, GList* items) { GList* it; g_return_if_fail (cmp != NULL); /* optimize adding to cache? */ if (cmp->cache) { g_list_free (cmp->cache); cmp->cache = NULL; } if (cmp->prefix) { g_free (cmp->prefix); cmp->prefix = NULL; } it = items; while (it) { cmp->items = g_list_prepend (cmp->items, it->data); it = it->next; } } /** * completion_remove_items: * @cmp: the #Completion. * @items: (transfer none): the items to remove. * * Removes items from a #Completion. The items are not freed, so if the memory * was dynamically allocated, free @items with g_list_free_full() after calling * this function. * * Deprecated: 2.26: Rarely used API **/ void completion_remove_items (Completion* cmp, GList* items) { GList* it; g_return_if_fail (cmp != NULL); it = items; while (cmp->items && it) { cmp->items = g_list_remove (cmp->items, it->data); it = it->next; } it = items; while (cmp->cache && it) { cmp->cache = g_list_remove(cmp->cache, it->data); it = it->next; } } /** * completion_clear_items: * @cmp: the #Completion. * * Removes all items from the #Completion. The items are not freed, so if the * memory was dynamically allocated, it should be freed after calling this * function. * * Deprecated: 2.26: Rarely used API **/ void completion_clear_items (Completion* cmp) { g_return_if_fail (cmp != NULL); g_list_free (cmp->items); cmp->items = NULL; g_list_free (cmp->cache); cmp->cache = NULL; g_free (cmp->prefix); cmp->prefix = NULL; } static void completion_check_cache (Completion* cmp, gchar** new_prefix) { register GList* list; register gsize len; register gsize i; register gsize plen; gchar* postfix; gchar* s; if (!new_prefix) return; if (!cmp->cache) { *new_prefix = NULL; return; } len = strlen(cmp->prefix); list = cmp->cache; s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; postfix = s + len; plen = strlen (postfix); list = list->next; while (list && plen) { s = cmp->func ? cmp->func (list->data) : (gchar*) list->data; s += len; for (i = 0; i < plen; ++i) { if (postfix[i] != s[i]) break; } plen = i; list = list->next; } *new_prefix = g_new0 (gchar, len + plen + 1); strncpy (*new_prefix, cmp->prefix, len); strncpy (*new_prefix + len, postfix, plen); } /** * completion_complete_utf8: * @cmp: the #Completion * @prefix: the prefix string, typically used by the user, which is compared * with each of the items * @new_prefix: if non-%NULL, returns the longest prefix which is common to all * items that matched @prefix, or %NULL if no items matched @prefix. * This string should be freed when no longer needed. * * Attempts to complete the string @prefix using the #Completion target items. * In contrast to completion_complete(), this function returns the largest common * prefix that is a valid UTF-8 string, omitting a possible common partial * character. * * You should use this function instead of completion_complete() if your * items are UTF-8 strings. * * Return value: (element-type utf8) (transfer none): the list of items whose strings begin with @prefix. This should * not be changed. * * Since: 2.4 * * Deprecated: 2.26: Rarely used API **/ GList* completion_complete_utf8 (Completion *cmp, const gchar *prefix, gchar **new_prefix) { GList *list; gchar *p, *q; list = completion_complete (cmp, prefix, new_prefix); if (new_prefix && *new_prefix) { p = *new_prefix + strlen (*new_prefix); q = g_utf8_find_prev_char (*new_prefix, p); switch (g_utf8_get_char_validated (q, p - q)) { case (gunichar)-2: case (gunichar)-1: *q = 0; break; default: ; } } return list; } /** * completion_complete: * @cmp: the #Completion. * @prefix: the prefix string, typically typed by the user, which is * compared with each of the items. * @new_prefix: if non-%NULL, returns the longest prefix which is * common to all items that matched @prefix, or %NULL if * no items matched @prefix. This string should be freed * when no longer needed. * * Attempts to complete the string @prefix using the #Completion * target items. * * Returns: (transfer none): the list of items whose strings begin with * @prefix. This should not be changed. * * Deprecated: 2.26: Rarely used API **/ GList* completion_complete (Completion* cmp, const gchar* prefix, gchar** new_prefix) { gsize plen, len; gboolean done = FALSE; GList* list; g_return_val_if_fail (cmp != NULL, NULL); g_return_val_if_fail (prefix != NULL, NULL); len = strlen (prefix); if (cmp->prefix && cmp->cache) { plen = strlen (cmp->prefix); if (plen <= len && ! cmp->strncmp_func (prefix, cmp->prefix, plen)) { /* use the cache */ list = cmp->cache; while (list) { GList *next = list->next; if (cmp->strncmp_func (prefix, cmp->func ? cmp->func (list->data) : (gchar*) list->data, len)) cmp->cache = g_list_delete_link (cmp->cache, list); list = next; } done = TRUE; } } if (!done) { /* normal code */ g_list_free (cmp->cache); cmp->cache = NULL; list = cmp->items; while (*prefix && list) { if (!cmp->strncmp_func (prefix, cmp->func ? cmp->func (list->data) : (gchar*) list->data, len)) cmp->cache = g_list_prepend (cmp->cache, list->data); list = list->next; } } if (cmp->prefix) { g_free (cmp->prefix); cmp->prefix = NULL; } if (cmp->cache) cmp->prefix = g_strdup (prefix); completion_check_cache (cmp, new_prefix); return *prefix ? cmp->cache : cmp->items; } /** * completion_free: * @cmp: the #Completion. * * Frees all memory used by the #Completion. The items are not freed, so if * the memory was dynamically allocated, it should be freed after calling this * function. * * Deprecated: 2.26: Rarely used API **/ void completion_free (Completion* cmp) { g_return_if_fail (cmp != NULL); completion_clear_items (cmp); g_free (cmp); } /** * completion_set_compare: * @cmp: a #Completion. * @strncmp_func: the string comparison function. * * Sets the function to use for string comparisons. The default string * comparison function is strncmp(). * * Deprecated: 2.26: Rarely used API **/ void completion_set_compare(Completion *cmp, CompletionStrncmpFunc strncmp_func) { cmp->strncmp_func = strncmp_func; } #ifdef TEST_COMPLETION #include int main (int argc, char* argv[]) { FILE *file; gchar buf[1024]; GList *list; GList *result; GList *tmp; Completion *cmp; gint i; gchar *longp = NULL; if (argc < 3) { g_warning ("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]); return 1; } file = fopen (argv[1], "r"); if (!file) { g_warning ("Cannot open %s\n", argv[1]); return 1; } cmp = completion_new (NULL); list = g_list_alloc (); while (fgets (buf, 1024, file)) { list->data = g_strdup (buf); completion_add_items (cmp, list); } fclose (file); for (i = 2; i < argc; ++i) { printf ("COMPLETING: %s\n", argv[i]); result = completion_complete (cmp, argv[i], &longp); g_list_foreach (result, (GFunc) printf, NULL); printf ("LONG MATCH: %s\n", longp); g_free (longp); longp = NULL; } g_list_foreach (cmp->items, (GFunc) g_free, NULL); completion_free (cmp); g_list_free (list); return 0; } #endif mdk-1.2.9/mixlib/xmix_io.h0000644000175000017500000000354712112755472012347 00000000000000/* -*-c-*- ------------------ xmix_io.h : * Implementation of mix_iochannel_t and mix_file_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef XMIX_IOCHANNEL_H #define XMIX_IOCHANNEL_H #include #include "mix_io.h" /* the actual definition of mix_iochannel_t */ struct mix_iochannel_t { FILE *file; }; extern const char * io_OPENTYPE_[5]; #define fmode_to_type_(mode) ( (mode) < 6 ? io_OPENTYPE_[(mode)]:NULL ) /* initialisation */ extern gboolean io_init_from_fdesc_(mix_iochannel_t *ioc, int fdesc); #define io_init_from_file_(ioc,f) (ioc)->file = f #define io_close_(ioc) fclose((ioc)->file) /* write/read data */ #define write_data_(ioc,data,no) \ ( (no) == fwrite((const void*)(data), sizeof(*(data)), (no), (ioc)->file) ) #define read_data_(ioc,data,no) \ ( (no) == fread((void*)(data), sizeof(*(data)), (no), (ioc)->file) ) /* state */ #define is_eof_(ioc) ( feof((ioc)->file) != 0 ) #define is_ready_(ioc) ( ferror((ioc)->file) == 0 ) /* conversions */ #define io_get_FILE_(ioc) (MIX_IOCHANNEL(ioc))->file #endif /* XMIX_IOCHANNEL_H */ mdk-1.2.9/mixlib/mix_vm.c0000644000175000017500000004240612622454575012170 00000000000000/* -*-c-*- ------------------ mix_vm.c : * Implementation of the functions declared in mix_vm.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2004, 2007, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix.h" #include "xmix_vm.h" #define vm_reset_(vm) vm_reset_reload_ (vm, FALSE); static void vm_reset_reload_ (mix_vm_t *vm, gboolean is_reload) { guint k; set_status_ (vm, MIX_VM_EMPTY); set_rA_ (vm, MIX_WORD_ZERO); set_rX_ (vm, MIX_WORD_ZERO); set_rJ_ (vm, MIX_WORD_ZERO); for ( k = 1; k < IREG_NO_+1; ++k ) set_rI_ (vm, k, MIX_WORD_ZERO); set_over_ (vm, FALSE); set_cmp_ (vm, mix_EQ); set_loc_ (vm, MIX_WORD_ZERO); set_last_error_ (vm, MIX_VM_ERROR_NONE); for ( k = 0; k < MEM_CELLS_NO_; ++k) set_cell_ (vm, k, MIX_WORD_ZERO); if (vm->symbol_table != NULL ) { mix_symbol_table_delete (vm->symbol_table); vm->symbol_table = NULL; } if (vm->line_table != NULL) { g_tree_destroy (vm->line_table); vm->line_table = NULL; } if (vm->address_table != NULL) { g_tree_destroy (vm->address_table); vm->address_table = NULL; } if (vm->src_file != NULL) { mix_src_file_delete (vm->src_file); vm->src_file = NULL; } for (k = 0; k < BD_NO_; ++k) if (vm->devices[k] != NULL) { mix_device_type_t type = mix_device_type (vm->devices[k]); if (!is_reload || (type != mix_dev_CONSOLE && type != mix_dev_PRINTER && type != mix_dev_CARD_WR)) { mix_device_delete (vm->devices[k]); vm->devices[k] = NULL; } } if (!is_reload) mix_vm_clear_all_breakpoints (vm); if (vm->address_list) { g_slist_free (vm->address_list); vm->address_list = NULL; } } /* Create/destroy a mix vm */ mix_vm_t * mix_vm_new (void) { int i; mix_vm_t *vm = g_new (struct mix_vm_t,1); vm->line_table = NULL; vm->address_table = NULL; vm->symbol_table = NULL; vm->src_file = NULL; vm->pred_list = mix_predicate_list_new (vm); vm->address_list = NULL; vm->last_error = MIX_VM_ERROR_NONE; for (i = 0; i < BD_NO_; ++i) vm->devices[i] = NULL; vm->clock = mix_vm_clock_new (); vm->factory = mix_device_new; vm_reset_ (vm); return vm; } void mix_vm_delete (mix_vm_t * vm) { int i; g_return_if_fail (vm != NULL); if (vm->line_table != NULL) g_tree_destroy (vm->line_table); if (vm->address_table != NULL) g_tree_destroy (vm->address_table); if (vm->symbol_table != NULL) mix_symbol_table_delete (vm->symbol_table); if (vm->src_file != NULL) mix_src_file_delete (vm->src_file); if (vm->pred_list != NULL) mix_predicate_list_delete (vm->pred_list); if (vm->address_list != NULL) g_slist_free (vm->address_list); for (i = 0; i < BD_NO_; ++i) mix_device_delete (vm->devices[i]); mix_vm_clock_delete (vm->clock); g_free (vm); } /* connect devices to a virtual machine */ mix_device_t * mix_vm_connect_device (mix_vm_t *vm, mix_device_t *device) { mix_device_t *old; mix_device_type_t type; g_return_val_if_fail (vm != NULL, NULL); g_return_val_if_fail (device != NULL, NULL); type = mix_device_type (device); old = vm->devices[type]; vm->devices[type] = device; return old; } /* get device */ mix_device_t * mix_vm_get_device (const mix_vm_t *vm, mix_device_type_t dev) { g_return_val_if_fail (vm != NULL, NULL); g_return_val_if_fail (dev < mix_dev_INVALID, NULL); return vm->devices[dev]; } /* install a device factory for automatic connection */ void mix_vm_set_device_factory (mix_vm_t *vm, mix_device_factory_t factory) { g_return_if_fail (vm != NULL); g_return_if_fail (factory != NULL); vm->factory = factory; } /* Reset a vm (set state as of a newly created one) */ void mix_vm_reset (mix_vm_t * vm) { g_return_if_fail (vm != NULL); vm_reset_ (vm); } /* Set start address for execution */ void mix_vm_set_start_addr (mix_vm_t *vm, mix_address_t addr) { g_return_if_fail (vm != NULL); set_loc_ (vm, addr); } /* Access to the vm's registers */ mix_word_t mix_vm_get_rA (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, MIX_WORD_ZERO); return get_rA_ (vm); } mix_word_t mix_vm_get_rX (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, MIX_WORD_ZERO); return get_rX_ (vm); } mix_short_t mix_vm_get_rJ (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, MIX_SHORT_ZERO); return mix_word_to_short_fast (get_rJ_ (vm)); } mix_short_t mix_vm_get_rI (const mix_vm_t *vm, guint idx) { g_return_val_if_fail (vm != NULL, MIX_SHORT_ZERO); g_return_val_if_fail (IOK_ (idx), MIX_SHORT_ZERO); return mix_word_to_short_fast (get_rI_ (vm, idx)); } void mix_vm_set_rA (mix_vm_t *vm, mix_word_t value) { g_return_if_fail (vm != NULL); set_rA_ (vm, value); } void mix_vm_set_rX (mix_vm_t *vm, mix_word_t value) { g_return_if_fail (vm != NULL); set_rX_ (vm, value); } void mix_vm_set_rJ (mix_vm_t *vm, mix_short_t value) { g_return_if_fail (vm != NULL); g_return_if_fail (mix_short_is_positive (value)); set_rJ_ (vm, mix_short_to_word_fast (value)); } void mix_vm_set_rI (mix_vm_t *vm, guint idx, mix_short_t value) { g_return_if_fail (vm != NULL); g_return_if_fail (IOK_ (idx)); set_rI_ (vm, idx, mix_short_to_word_fast (value)); } /* Access to the comparison flag and overflow toggle */ mix_cmpflag_t mix_vm_get_cmpflag (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, mix_EQ); return get_cmp_ (vm); } void mix_vm_set_cmpflag (mix_vm_t *vm, mix_cmpflag_t value) { g_return_if_fail (vm != NULL); set_cmp_ (vm, value); } gboolean mix_vm_get_overflow (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, TRUE); return get_over_ (vm); } void mix_vm_set_overflow (mix_vm_t *vm, gboolean value) { g_return_if_fail (vm != NULL); set_over_ (vm, value); } void mix_vm_toggle_overflow (mix_vm_t *vm) { g_return_if_fail (vm != NULL); set_over_ (vm, !get_over_ (vm)); } /* Access to memory cells */ mix_word_t mix_vm_get_addr_contents (const mix_vm_t *vm, mix_address_t addr) { g_return_val_if_fail (vm != NULL, MIX_WORD_ZERO); return (MEMOK_ (addr))? get_cell_ (vm, addr) : MIX_WORD_ZERO; } void mix_vm_set_addr_contents (mix_vm_t *vm, mix_address_t addr, mix_word_t value) { g_return_if_fail (vm != NULL); if (MEMOK_ (addr)) set_cell_ (vm, addr, value); } gboolean mix_vm_is_halted (const mix_vm_t *vm) { return is_halted_ (vm); } /* Execution of instructions */ gboolean /* TRUE if success */ mix_vm_exec_ins (mix_vm_t *vm, const mix_ins_t *ins) { g_return_val_if_fail (vm != NULL, FALSE); g_return_val_if_fail (ins != NULL, FALSE); return (*ins_handlers_[ins->opcode]) (vm,ins); } /* comparison function for the line and address tables tree */ static gint cmp_uint_ (gconstpointer a, gconstpointer b) { return GPOINTER_TO_UINT (a) - GPOINTER_TO_UINT (b); } gboolean mix_vm_load_file (mix_vm_t *vm, const gchar *name) { mix_code_file_t *file; mix_src_file_t *sfile = NULL; mix_ins_desc_t ins; const gchar *sp; gboolean reload = FALSE; g_return_val_if_fail (vm != NULL, FALSE); file = mix_code_file_new_read (name); if (file == NULL) { set_status_ (vm, MIX_VM_ERROR); return FALSE; } sp = mix_code_file_get_source_path (file); if (sp != NULL) { sfile = mix_src_file_new_for_read (sp); reload = (vm->src_file && !strcmp (mix_src_file_get_path (vm->src_file), mix_src_file_get_path (sfile))); } vm_reset_reload_ (vm, reload); if ( mix_code_file_is_debug (file) ) { vm->symbol_table = mix_code_file_get_symbol_table (file); vm->line_table = g_tree_new (cmp_uint_); vm->address_table = g_tree_new (cmp_uint_); } vm->src_file = sfile; while ( mix_code_file_get_ins (file, &ins) ) { set_cell_ (vm, ins.address, ins.ins); if ( vm->line_table != NULL ) { g_tree_insert (vm->line_table, GUINT_TO_POINTER (ins.lineno), GUINT_TO_POINTER ((guint)ins.address)); g_tree_insert (vm->address_table, GUINT_TO_POINTER ((guint)ins.address), GUINT_TO_POINTER (ins.lineno)); } } set_loc_ (vm, mix_code_file_get_start_addr (file)); set_start_ (vm, get_loc_ (vm)); mix_code_file_delete (file); set_status_ (vm, MIX_VM_LOADED); return TRUE; } const mix_src_file_t * mix_vm_get_src_file (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, NULL); return vm->src_file; } const mix_symbol_table_t * mix_vm_get_symbol_table (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, NULL); return vm->symbol_table; } mix_address_t mix_vm_get_prog_count (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, MIX_SHORT_ZERO); return get_loc_ (vm); } /* Get the source line number for a given address */ guint mix_vm_get_address_lineno (const mix_vm_t *vm, mix_address_t addr) { gpointer gp_addr = GUINT_TO_POINTER ((guint)addr); guint lineno; g_return_val_if_fail (vm != NULL, 0); if (!(MEMOK_ (addr))) return 0; lineno = GPOINTER_TO_UINT (g_tree_lookup (vm->address_table, gp_addr)); return lineno; } /* Get the address for a given source line number */ typedef struct { guint lineno; mix_address_t result; } addr_traverse_t; static gint get_address_ (gpointer key, gpointer value, gpointer data) { addr_traverse_t *tr = (addr_traverse_t *)data; if (GPOINTER_TO_UINT (key) == tr->lineno) { tr->result = mix_short_new (GPOINTER_TO_UINT (value)); return TRUE; } return (GPOINTER_TO_UINT (key) < tr->lineno)? FALSE:TRUE; } mix_address_t mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno) { addr_traverse_t tr; g_return_val_if_fail (vm != NULL, MIX_VM_CELL_NO); if (!vm->line_table) return MIX_VM_CELL_NO; tr.lineno = lineno; tr.result = MIX_VM_CELL_NO; g_tree_foreach (vm->line_table, get_address_, (gpointer)&tr); return tr.result; } /* continue execution of instructions in memory */ mix_vm_status_t mix_vm_run (mix_vm_t *vm) { mix_ins_t ins; g_return_val_if_fail (vm != NULL, MIX_VM_ERROR); while ( !is_halted_ (vm) ) { mix_word_to_ins_uncheck (get_cell_ (vm, get_loc_ (vm)), ins); vm->address_list = g_slist_prepend (vm->address_list, GINT_TO_POINTER ((gint)get_loc_ (vm))); if ( !(*ins_handlers_[ins.opcode]) (vm,&ins) ) return set_status_ (vm, MIX_VM_ERROR); else update_time_ (vm, &ins); if (bp_is_set_ (vm, get_loc_ (vm))) return set_status_ (vm, MIX_VM_BREAK); if (mix_predicate_list_eval (get_pred_list_ (vm))) return set_status_ (vm, MIX_VM_COND_BREAK); if (get_loc_ (vm) >= MIX_VM_CELL_NO) halt_ (vm, TRUE); } return set_status_ (vm, MIX_VM_HALT); } /* execute next memory instruction */ mix_vm_status_t mix_vm_exec_next (mix_vm_t *vm) { mix_ins_t ins; g_return_val_if_fail (vm != NULL, MIX_VM_ERROR); if (get_loc_ (vm) >= MIX_VM_CELL_NO) halt_ (vm, TRUE); if (is_halted_ (vm)) return set_status_ (vm, MIX_VM_HALT); vm->address_list = g_slist_prepend (vm->address_list, GINT_TO_POINTER ((gint)get_loc_ (vm))); mix_word_to_ins_uncheck (get_cell_ (vm, get_loc_ (vm)), ins); if (!(*ins_handlers_[ins.opcode]) (vm, &ins)) return set_status_ (vm, MIX_VM_ERROR); else update_time_ (vm, &ins); if (is_halted_ (vm)) return set_status_ (vm, MIX_VM_HALT); if (bp_is_set_ (vm, get_loc_ (vm))) return set_status_ (vm, MIX_VM_BREAK); if (mix_predicate_list_eval (get_pred_list_ (vm))) return set_status_ (vm, MIX_VM_COND_BREAK); return set_status_ (vm, MIX_VM_RUNNING); } /* get the current execution status */ mix_vm_status_t mix_vm_get_run_status (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, MIX_VM_ERROR); return get_status_ (vm); } mix_vm_error_t mix_vm_get_last_error (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, MIX_VM_ERROR_UNEXPECTED); return get_last_error_ (vm); } const gchar * mix_vm_get_last_error_string (const mix_vm_t *vm) { return mix_vm_get_error_string (mix_vm_get_last_error (vm)); } const gchar * mix_vm_get_error_string (mix_vm_error_t code) { static const gchar *errors[] = { N_("No error"), N_("Invalid memory address"), N_("Invalid device number"), N_("Invalid fspec"), N_("Invalid M-value"), N_("Cannot access device"), N_("Cannot access device for reading"), N_("Cannot access device for writing"), N_("Unexpected error"), N_("Unknow error code") }; return errors[code > MIX_VM_ERROR_UNEXPECTED ? MIX_VM_ERROR_UNEXPECTED + 1 : code]; } /* Breakpoints */ gulong mix_vm_get_break_lineno (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, 0); if (vm->address_table == NULL) return 0; else { gpointer loc = GUINT_TO_POINTER ((guint)get_loc_ (vm)); return GPOINTER_TO_UINT (g_tree_lookup (vm->address_table,loc)); } } typedef struct { mix_vm_t *vm; guint lineno; gint result; } bp_traverse_t; static gint set_break_ (gpointer key, gpointer value, gpointer data) { bp_traverse_t *tr = (bp_traverse_t *)data; if (GPOINTER_TO_UINT (key) >= tr->lineno) { bp_set_ (tr->vm, mix_short_new (GPOINTER_TO_UINT (value))); tr->lineno = GPOINTER_TO_UINT (key); tr->result = MIX_VM_BP_OK; return TRUE; } return FALSE; } gint /* if >0 the line no. of the break point */ mix_vm_set_breakpoint (mix_vm_t *vm, guint lineno) { bp_traverse_t tr; g_return_val_if_fail (vm != NULL, MIX_VM_BP_ERROR); if (!vm->line_table) return MIX_VM_BP_NDEBUG; tr.lineno = lineno; tr.vm = vm; tr.result = MIX_VM_BP_INV_LINE; g_tree_foreach (vm->line_table, set_break_, (gpointer)&tr); if (tr.result == MIX_VM_BP_OK) return tr.lineno; else return tr.result; } gint mix_vm_set_breakpoint_address (mix_vm_t *vm, guint address) { g_return_val_if_fail (vm != NULL, MIX_VM_BP_ERROR); if (address >= MIX_VM_CELL_NO) return MIX_VM_BP_INV_ADDRESS; else bp_set_ (vm, mix_short_new (address)); return MIX_VM_BP_OK; } gboolean mix_vm_has_breakpoint_at_address (const mix_vm_t *vm, guint address) { g_return_val_if_fail (vm != NULL, FALSE); if (address >= MIX_VM_CELL_NO) return FALSE; return (bp_is_set_ (vm, address)); } static gint clear_break_ (gpointer key, gpointer value, gpointer data) { bp_traverse_t *tr = (bp_traverse_t *)data; if (GPOINTER_TO_UINT (key) == tr->lineno) { bp_clear_ (tr->vm, mix_short_new (GPOINTER_TO_UINT (value))); tr->result = MIX_VM_BP_OK; return TRUE; } else if (GPOINTER_TO_UINT (key) > tr->lineno) return TRUE; return FALSE; } gint /* one of MIX_VM_BP_ */ mix_vm_clear_breakpoint (mix_vm_t *vm, guint lineno) { bp_traverse_t tr; g_return_val_if_fail (vm != NULL, MIX_VM_BP_ERROR); if (!vm->line_table) return MIX_VM_BP_NDEBUG; tr.lineno = lineno; tr.vm = vm; tr.result = MIX_VM_BP_INV_LINE; g_tree_foreach (vm->line_table, clear_break_, (gpointer)&tr); return tr.result; } gint mix_vm_clear_breakpoint_address (mix_vm_t *vm, guint address) { g_return_val_if_fail (vm != NULL, MIX_VM_BP_ERROR); if (address >= MIX_VM_CELL_NO) return MIX_VM_BP_INV_ADDRESS; else bp_clear_ (vm, mix_short_new (address)); return MIX_VM_BP_OK; } void mix_vm_clear_all_breakpoints (mix_vm_t *vm) { g_return_if_fail (vm != NULL); bp_clear_all_ (vm); mix_predicate_list_clear (get_pred_list_ (vm)); } gboolean mix_vm_set_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred) { g_return_val_if_fail (vm != NULL, FALSE); g_return_val_if_fail (pred != NULL, FALSE); mix_predicate_list_add (get_pred_list_ (vm), pred); return TRUE; } gboolean mix_vm_clear_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred) { g_return_val_if_fail (vm != NULL, FALSE); g_return_val_if_fail (pred != NULL, FALSE); return mix_predicate_list_remove (get_pred_list_ (vm), pred); } const gchar * mix_vm_get_last_breakpoint_message (const mix_vm_t *vm) { const mix_predicate_t *last = NULL; g_return_val_if_fail (vm != NULL, NULL); if ((last = mix_predicate_list_last_true_eval (get_pred_list_ (vm))) != NULL) return mix_predicate_get_message (last); return NULL; } mix_predicate_type_t mix_vm_get_last_conditional_breakpoint_type (const mix_vm_t *vm) { const mix_predicate_t *last = NULL; g_return_val_if_fail (vm != NULL, MIX_PRED_INVALID); last = mix_predicate_list_last_true_eval (get_pred_list_ (vm)); return last? mix_predicate_get_type (last) : MIX_PRED_INVALID; } /* Get the vm uptime, defined as the time spent executing instructions */ mix_time_t mix_vm_get_uptime (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, 0); return mix_vm_clock_get_time (get_clock_ (vm)); } /* Get the list of addresses for executed instructions */ const GSList * mix_vm_get_backtrace (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, NULL); return get_address_list_ (vm); } mdk-1.2.9/mixlib/mix_scanner.c0000644000175000017500000036541312262430567013200 00000000000000#line 2 "mix_scanner.c" #line 4 "mix_scanner.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(n) 1 #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char yytext[]; static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yy_fatal_error (yyconst char msg[] ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ if ( yyleng >= YYLMAX ) \ YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ yy_flex_strncpy( yytext, (yytext_ptr), yyleng + 1 ); \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 71 #define YY_END_OF_BUFFER 72 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_acclist[339] = { 0, 72, 2, 71, 3, 71, 1, 2, 71, 10, 71, 4, 10, 71, 11, 71, 10, 71, 9, 10, 71, 16392, 25, 71, 12, 25, 71, 13, 71, 24, 25, 71, 25, 71, 24, 25, 71, 24, 25, 71, 24, 25, 71, 24, 25, 71, 24, 25, 71, 24, 25, 71, 48, 71, 47, 71, 48, 71, 48, 71, 48, 71, 48, 71, 48, 71, 52, 71, 51, 71, 52, 71, 52, 71, 52, 71, 52, 71, 55, 71, 71, 55, 71, 55, 71, 55, 71, 55, 71, 63, 71, 62, 63, 71, 62, 71, 59, 63, 71, 63, 71, 63, 71, 60, 63, 71, 63, 71, 61, 63, 71, 70, 71, 69, 70, 71, 69, 71, 70, 71, 70, 71, 70, 71, 70, 71, 70, 71, 35, 71, 34, 35, 71, 35, 71, 34, 35, 71, 34, 35, 71, 35, 71, 34, 35, 71, 35, 71, 34, 35, 71, 35, 71, 34, 35, 71, 1, 4, 9,16392, 7, 9,16392, 7, 9,16392, 5, 9,16392, 9,16392, 9,16392, 12, 24, 24, 24, 23, 22, 24, 24, 24, 24, 24, 24, 24, 24, 24, 46, 46, 44, 46, 46, 36, 45, 46, 50, 49, 50, 36, 54, 54, 36, 58, 56, 57, 56, 60, 60, 61, 61, 61, 67, 68, 68, 68, 66, 67, 64, 66, 67, 65, 66, 67, 34, 34, 34, 26, 34, 34, 34, 28, 34, 30, 34, 32, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 43, 40, 42, 38, 39, 37, 38, 39, 53, 57, 57, 68, 68, 34, 34, 34, 34, 34, 34, 26, 27, 28, 29, 30, 31, 32, 33, 24, 24, 23, 20, 22, 15, 23, 17, 23, 16, 23, 24, 44, 40, 41, 68, 68, 68, 34, 34, 34, 34, 34, 27, 29, 31, 33, 8200, 21, 23, 21, 14, 23, 41, 39, 37, 68, 68, 34, 34, 34, 6, 8200, 21, 23, 21, 21, 34, 34, 34, 21, 23, 21, 21, 19, 21, 21, 23, 21, 21, 21, 18, 19, 21, 18, 21 } ; static yyconst flex_int16_t yy_accept[428] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 6, 9, 11, 14, 16, 18, 22, 24, 27, 29, 32, 34, 37, 40, 43, 46, 49, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 81, 83, 85, 87, 89, 91, 94, 96, 99, 101, 103, 106, 108, 111, 113, 116, 118, 120, 122, 124, 126, 128, 130, 133, 135, 138, 141, 143, 146, 148, 151, 153, 156, 157, 158, 158, 160, 163, 166, 169, 169, 171, 173, 174, 174, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 189, 189, 189, 189, 189, 189, 190, 192, 193, 194, 194, 194, 194, 194, 196, 196, 196, 197, 197, 197, 197, 197, 197, 199, 200, 200, 200, 201, 201, 201, 201, 201, 201, 202, 203, 203, 203, 204, 205, 206, 208, 208, 209, 210, 211, 212, 213, 213, 213, 213, 213, 213, 214, 214, 215, 216, 218, 221, 224, 224, 224, 224, 224, 224, 224, 225, 226, 227, 227, 228, 229, 230, 231, 231, 232, 233, 233, 234, 235, 235, 236, 236, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 246, 246, 246, 246, 246, 246, 247, 247, 248, 249, 249, 249, 249, 249, 251, 251, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 256, 257, 257, 257, 257, 257, 257, 258, 259, 259, 259, 259, 259, 260, 261, 262, 263, 263, 264, 265, 265, 265, 267, 267, 267, 269, 269, 269, 271, 271, 271, 273, 273, 273, 274, 275, 276, 278, 280, 282, 284, 285, 285, 285, 285, 286, 286, 286, 286, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 289, 290, 291, 292, 292, 292, 292, 292, 293, 294, 294, 294, 294, 295, 296, 297, 298, 299, 300, 300, 301, 303, 303, 304, 306, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 308, 308, 308, 309, 310, 311, 311, 311, 311, 311, 311, 311, 311, 312, 313, 314, 316, 318, 319, 319, 319, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 321, 321, 321, 321, 321, 322, 323, 325, 326, 327, 327, 327, 328, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 331, 332, 333, 334, 334, 334, 334, 336, 337, 337, 337, 337, 337, 337, 337, 338, 339, 339, 339, 339, 339 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 5, 1, 6, 1, 1, 6, 7, 8, 9, 10, 11, 12, 6, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 6, 6, 16, 6, 1, 6, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 26, 28, 29, 26, 30, 31, 26, 26, 32, 26, 26, 26, 26, 26, 1, 1, 1, 1, 1, 1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 26, 26, 42, 26, 43, 44, 26, 45, 46, 26, 26, 47, 26, 26, 26, 26, 26, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[48] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 12, 13, 12, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 } ; static yyconst flex_int16_t yy_base[581] = { 0, 783, 0, 9, 25, 41, 0, 88, 104, 120, 136, 152, 168, 184, 200, 216, 232, 248, 264, 271, 272, 277, 278, 283, 284, 775, 3343, 3343, 0, 3343, 0, 3343, 285, 298, 3343, 3, 3343, 301, 292, 324, 338, 379, 276, 287, 298, 3343, 3343, 393, 345, 408, 352, 447, 3343, 3343, 462, 349, 476, 515, 3343, 3343, 359, 361, 523, 421, 3343, 3343, 3343, 364, 370, 428, 750, 376, 747, 3343, 3343, 3343, 562, 429, 483, 576, 590, 3343, 492, 430, 604, 613, 431, 506, 438, 509, 459, 537, 0, 4, 741, 412, 480, 540, 541, 608, 320, 544, 341, 467, 543, 621, 628, 637, 557, 3343, 651, 0, 665, 0, 338, 303, 478, 354, 509, 3343, 512, 670, 0, 730, 608, 683, 654, 3343, 698, 0, 703, 694, 713, 723, 3343, 738, 0, 3343, 553, 743, 0, 648, 756, 3343, 0, 770, 0, 3343, 567, 775, 782, 790, 798, 812, 809, 817, 825, 3343, 630, 729, 662, 753, 668, 667, 0, 659, 3343, 767, 832, 845, 859, 873, 880, 787, 887, 894, 3343, 3343, 3343, 908, 922, 929, 822, 935, 937, 945, 959, 968, 840, 3343, 977, 986, 1000, 1014, 3343, 1017, 1020, 3343, 1023, 1026, 3343, 1030, 368, 1026, 1033, 1040, 1047, 1056, 1070, 1084, 423, 451, 1087, 1125, 1140, 1155, 1098, 667, 1073, 3343, 1104, 3343, 3343, 1106, 850, 1163, 1108, 3343, 648, 3343, 1171, 1181, 1196, 1210, 1224, 1232, 1240, 1248, 1121, 3343, 0, 645, 1262, 1276, 1290, 913, 1297, 1303, 1310, 1318, 1325, 1332, 1340, 1349, 1358, 1367, 1376, 939, 1385, 1394, 632, 1305, 3343, 618, 1408, 3343, 606, 1411, 3343, 593, 1414, 3343, 523, 699, 1410, 1417, 1431, 3343, 1435, 1438, 1441, 687, 1444, 1459, 1474, 3343, 1477, 592, 1483, 3343, 1481, 1488, 1495, 1503, 1512, 1522, 1532, 1542, 950, 1552, 1562, 926, 1577, 1591, 1599, 1607, 579, 1621, 1624, 1638, 1645, 1652, 1659, 538, 1049, 1666, 1673, 1681, 1690, 1699, 1706, 1081, 1708, 1716, 1725, 3343, 3343, 3343, 3343, 746, 3343, 1739, 510, 0, 1674, 3343, 1163, 1193, 1736, 1743, 1751, 1760, 1770, 1778, 1201, 1780, 3343, 1788, 1798, 3343, 1806, 1813, 1821, 1829, 1837, 1845, 1852, 1859, 1867, 1876, 1885, 1894, 3343, 1908, 0, 501, 1744, 0, 1906, 1914, 1922, 1930, 1937, 1944, 1952, 1961, 1971, 1981, 1990, 1998, 485, 1207, 2005, 2012, 2020, 2029, 2038, 2052, 0, 0, 482, 2013, 3343, 0, 2050, 2058, 1219, 1237, 2065, 2072, 2080, 2089, 2099, 2108, 2116, 2124, 2138, 0, 0, 0, 465, 464, 2073, 3343, 0, 2136, 2144, 2152, 2160, 2168, 441, 3343, 3343, 2176, 2184, 423, 3343, 2199, 2213, 2227, 2241, 2255, 2269, 2283, 2297, 2311, 394, 2324, 295, 2336, 2348, 2353, 2358, 2370, 698, 2383, 708, 2389, 885, 386, 374, 1031, 2394, 2406, 1176, 2413, 2425, 1308, 2430, 2442, 1323, 2455, 2463, 2476, 1415, 2489, 1486, 2495, 364, 343, 336, 322, 1517, 2507, 2519, 1547, 2524, 2536, 2541, 1650, 2546, 2558, 2565, 2578, 2586, 2599, 2613, 2627, 2633, 2638, 2643, 2648, 2660, 2672, 2685, 2699, 2713, 2719, 1765, 2724, 2731, 2739, 2752, 2764, 2770, 2776, 2789, 308, 305, 2802, 2814, 1793, 2819, 2824, 2830, 2837, 1811, 2844, 2857, 2863, 2875, 2888, 2895, 2902, 1850, 2910, 2923, 2935, 2941, 2947, 2960, 2973, 2978, 1935, 2984, 2991, 2996, 1966, 3003, 3010, 3022, 3033, 3044, 2094, 3051, 3058, 3064, 2318, 3071, 3077, 3083, 3089, 3096, 3108, 3119, 3130, 3141, 3148, 3154, 3161, 3168, 2320, 3174, 3181, 3193, 3204, 3215, 3226, 3240, 3251, 3258, 2321, 3264, 3271, 3278, 3288, 3299, 3306, 3312, 3322, 3329 } ; static yyconst flex_int16_t yy_def[581] = { 0, 427, 427, 428, 428, 426, 5, 429, 429, 430, 430, 431, 431, 432, 432, 433, 433, 434, 434, 18, 18, 18, 18, 18, 18, 426, 426, 426, 435, 426, 426, 426, 436, 437, 426, 426, 426, 426, 438, 439, 440, 440, 41, 41, 41, 426, 426, 426, 441, 441, 442, 443, 426, 426, 426, 444, 444, 445, 426, 426, 426, 446, 446, 447, 426, 426, 426, 448, 448, 448, 449, 448, 450, 426, 426, 426, 426, 451, 452, 451, 453, 426, 426, 454, 454, 455, 454, 84, 454, 84, 454, 84, 435, 426, 436, 437, 437, 437, 437, 426, 456, 437, 426, 457, 457, 426, 438, 458, 426, 426, 439, 41, 459, 41, 41, 41, 41, 41, 41, 426, 460, 460, 47, 426, 49, 443, 461, 426, 426, 125, 426, 442, 442, 462, 426, 463, 125, 426, 464, 464, 54, 56, 445, 426, 142, 465, 142, 426, 466, 466, 426, 446, 447, 426, 447, 467, 447, 426, 448, 468, 448, 448, 469, 470, 471, 470, 426, 472, 472, 426, 473, 474, 426, 475, 475, 476, 426, 426, 426, 477, 474, 478, 479, 480, 479, 426, 481, 482, 483, 426, 484, 482, 481, 485, 426, 192, 486, 426, 192, 487, 426, 426, 426, 426, 488, 489, 490, 491, 492, 492, 209, 209, 209, 426, 493, 494, 426, 495, 495, 426, 496, 426, 426, 497, 498, 499, 498, 426, 426, 426, 500, 501, 426, 502, 503, 426, 504, 505, 506, 426, 507, 508, 426, 509, 510, 511, 511, 512, 513, 426, 478, 478, 514, 426, 479, 515, 426, 516, 516, 517, 518, 518, 426, 485, 485, 426, 486, 486, 426, 487, 487, 426, 426, 426, 519, 489, 520, 426, 426, 426, 426, 209, 521, 494, 495, 426, 426, 496, 496, 426, 426, 497, 497, 522, 426, 498, 523, 426, 524, 524, 525, 426, 526, 527, 528, 529, 530, 530, 531, 510, 426, 511, 532, 426, 533, 533, 534, 514, 535, 515, 536, 537, 537, 538, 539, 426, 426, 426, 426, 426, 426, 540, 541, 542, 426, 426, 426, 543, 543, 544, 522, 545, 523, 546, 547, 547, 426, 548, 525, 426, 549, 532, 426, 533, 550, 426, 536, 536, 551, 426, 537, 552, 426, 553, 554, 555, 426, 556, 426, 543, 557, 426, 546, 546, 558, 426, 547, 559, 560, 550, 426, 561, 561, 562, 551, 563, 552, 564, 565, 566, 567, 568, 426, 569, 570, 557, 426, 571, 571, 572, 558, 573, 559, 426, 561, 574, 564, 565, 566, 569, 575, 568, 568, 426, 576, 426, 571, 577, 578, 574, 579, 426, 426, 580, 577, 426, 0, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426 } ; static yyconst flex_int16_t yy_nxt[3391] = { 0, 426, 93, 27, 93, 102, 93, 102, 93, 28, 29, 30, 31, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 32, 29, 29, 29, 30, 31, 30, 29, 29, 29, 29, 29, 29, 29, 29, 29, 32, 29, 29, 34, 35, 36, 35, 34, 34, 34, 34, 37, 38, 34, 38, 34, 39, 34, 34, 40, 41, 42, 41, 43, 41, 41, 41, 41, 41, 41, 41, 44, 41, 41, 41, 40, 41, 42, 41, 43, 41, 41, 41, 41, 41, 41, 44, 41, 41, 41, 45, 45, 46, 45, 45, 45, 45, 45, 47, 48, 45, 48, 45, 49, 45, 50, 45, 45, 46, 45, 45, 45, 45, 45, 47, 48, 45, 48, 45, 49, 45, 50, 52, 52, 53, 52, 52, 52, 52, 52, 54, 55, 52, 55, 52, 56, 52, 52, 52, 52, 53, 52, 52, 52, 52, 52, 54, 55, 52, 55, 52, 56, 52, 52, 58, 58, 59, 58, 58, 58, 58, 58, 60, 61, 58, 61, 58, 62, 58, 58, 58, 58, 59, 58, 58, 58, 58, 58, 60, 61, 58, 61, 58, 62, 58, 58, 64, 65, 66, 65, 64, 64, 65, 65, 67, 68, 65, 68, 69, 70, 71, 65, 64, 65, 66, 65, 64, 64, 65, 65, 67, 68, 65, 68, 69, 70, 71, 65, 73, 74, 75, 74, 73, 73, 73, 73, 76, 77, 78, 77, 73, 79, 73, 74, 73, 74, 75, 74, 73, 73, 73, 73, 76, 77, 78, 77, 73, 79, 73, 74, 81, 81, 59, 81, 81, 81, 81, 81, 82, 83, 81, 83, 81, 84, 81, 81, 81, 81, 59, 81, 81, 81, 81, 81, 82, 83, 81, 83, 81, 84, 81, 81, 86, 86, 86, 86, 87, 87, 88, 88, 88, 88, 89, 89, 90, 90, 90, 90, 91, 91, 94, 99, 105, 99, 96, 107, 115, 106, 97, 107, 98, 103, 103, 100, 103, 104, 116, 103, 117, 241, 96, 115, 240, 99, 97, 99, 98, 108, 109, 108, 118, 116, 209, 117, 103, 103, 164, 103, 104, 110, 103, 108, 109, 108, 102, 118, 102, 209, 103, 103, 165, 103, 104, 112, 103, 122, 123, 163, 123, 140, 124, 208, 130, 131, 141, 131, 114, 132, 147, 148, 148, 150, 148, 149, 157, 148, 151, 208, 241, 158, 157, 114, 108, 109, 108, 160, 157, 211, 165, 103, 103, 158, 103, 104, 112, 103, 119, 119, 119, 273, 163, 119, 211, 120, 120, 119, 120, 121, 95, 120, 119, 126, 127, 126, 273, 99, 127, 99, 120, 120, 127, 120, 121, 124, 120, 128, 279, 100, 279, 366, 147, 148, 148, 129, 148, 149, 155, 148, 157, 169, 185, 185, 161, 158, 170, 186, 192, 366, 185, 129, 134, 134, 134, 195, 280, 134, 280, 120, 120, 134, 120, 121, 135, 120, 119, 137, 137, 137, 421, 185, 137, 366, 138, 138, 198, 138, 139, 203, 138, 143, 143, 143, 204, 99, 143, 99, 138, 138, 366, 138, 139, 141, 138, 172, 173, 100, 173, 183, 174, 210, 181, 144, 182, 182, 183, 182, 184, 366, 182, 193, 194, 193, 196, 197, 196, 210, 366, 144, 137, 137, 137, 192, 213, 137, 195, 138, 138, 214, 138, 139, 145, 138, 153, 148, 148, 212, 148, 149, 151, 148, 199, 200, 199, 99, 201, 99, 201, 99, 154, 99, 183, 212, 198, 203, 329, 100, 100, 103, 204, 100, 108, 109, 108, 232, 154, 166, 166, 166, 233, 329, 166, 166, 167, 167, 166, 167, 168, 235, 167, 176, 176, 176, 236, 239, 177, 178, 167, 167, 176, 167, 168, 170, 167, 166, 166, 166, 335, 328, 166, 166, 167, 167, 166, 167, 168, 179, 167, 188, 189, 188, 327, 99, 181, 99, 182, 182, 183, 182, 184, 186, 182, 181, 326, 182, 182, 183, 182, 184, 190, 182, 202, 103, 103, 125, 103, 104, 325, 103, 103, 103, 426, 103, 104, 106, 103, 158, 202, 103, 103, 125, 103, 104, 206, 103, 108, 109, 108, 218, 219, 218, 240, 103, 103, 301, 103, 104, 110, 103, 108, 109, 108, 219, 426, 142, 164, 103, 103, 160, 103, 104, 213, 103, 164, 162, 120, 214, 134, 134, 134, 142, 334, 134, 334, 120, 120, 134, 120, 121, 135, 120, 119, 220, 221, 220, 130, 228, 222, 228, 142, 132, 222, 223, 142, 224, 224, 225, 224, 226, 152, 224, 227, 223, 152, 224, 224, 225, 224, 226, 132, 224, 229, 223, 330, 224, 224, 225, 224, 226, 230, 224, 227, 134, 134, 134, 240, 216, 134, 330, 120, 120, 134, 120, 121, 232, 120, 119, 94, 138, 233, 137, 137, 137, 164, 157, 137, 162, 138, 138, 158, 138, 139, 145, 138, 137, 137, 137, 426, 242, 137, 362, 138, 138, 243, 138, 139, 235, 138, 27, 426, 148, 236, 147, 148, 148, 362, 148, 149, 172, 148, 153, 148, 148, 174, 148, 149, 151, 148, 147, 148, 148, 426, 148, 149, 155, 148, 238, 239, 238, 147, 148, 148, 426, 148, 149, 155, 148, 147, 148, 148, 426, 148, 149, 253, 148, 147, 148, 148, 254, 148, 149, 155, 148, 242, 261, 262, 261, 167, 243, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 294, 167, 176, 176, 176, 295, 426, 177, 178, 167, 167, 176, 167, 168, 170, 167, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 179, 167, 245, 245, 426, 245, 246, 159, 245, 245, 245, 159, 245, 246, 174, 245, 245, 245, 426, 245, 246, 247, 245, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 310, 167, 166, 166, 166, 311, 426, 166, 166, 167, 167, 166, 167, 168, 179, 167, 249, 250, 301, 250, 349, 251, 256, 257, 253, 257, 256, 258, 182, 254, 181, 258, 182, 182, 183, 182, 184, 297, 182, 188, 189, 188, 299, 426, 181, 426, 182, 182, 183, 182, 184, 186, 182, 181, 426, 182, 182, 183, 182, 184, 190, 182, 181, 426, 182, 182, 183, 182, 184, 426, 182, 181, 426, 182, 182, 183, 182, 184, 190, 182, 193, 194, 193, 426, 426, 181, 426, 182, 182, 183, 182, 184, 192, 182, 264, 265, 264, 196, 197, 196, 267, 268, 267, 199, 200, 199, 270, 271, 270, 195, 201, 426, 201, 103, 103, 198, 103, 104, 171, 103, 103, 103, 171, 103, 104, 204, 103, 103, 103, 272, 103, 104, 274, 103, 103, 103, 352, 103, 104, 426, 103, 353, 426, 103, 103, 272, 103, 104, 206, 103, 276, 277, 276, 218, 219, 218, 426, 103, 103, 426, 103, 104, 112, 103, 278, 109, 278, 108, 359, 108, 426, 103, 103, 360, 103, 104, 112, 103, 284, 285, 284, 426, 426, 285, 288, 289, 288, 285, 281, 426, 216, 426, 286, 290, 291, 294, 291, 426, 292, 224, 295, 307, 239, 307, 281, 119, 119, 119, 426, 426, 119, 426, 120, 120, 119, 120, 121, 426, 120, 119, 119, 119, 119, 426, 426, 119, 426, 120, 120, 119, 120, 121, 214, 120, 119, 119, 119, 119, 426, 426, 119, 426, 120, 120, 119, 120, 121, 282, 120, 119, 297, 298, 225, 298, 426, 299, 223, 346, 224, 224, 225, 224, 226, 187, 224, 227, 223, 187, 224, 224, 225, 224, 226, 230, 224, 227, 137, 137, 137, 426, 368, 137, 426, 138, 138, 369, 138, 139, 375, 138, 137, 137, 137, 376, 403, 137, 426, 138, 138, 404, 138, 139, 233, 138, 137, 137, 137, 426, 225, 137, 426, 138, 138, 346, 138, 139, 302, 138, 147, 148, 148, 426, 148, 149, 415, 148, 147, 148, 148, 416, 148, 149, 236, 148, 147, 148, 148, 426, 148, 149, 304, 148, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 426, 167, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 243, 167, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 308, 167, 310, 261, 262, 261, 245, 311, 245, 245, 426, 245, 246, 205, 245, 245, 245, 205, 245, 246, 247, 245, 313, 314, 314, 426, 314, 315, 215, 314, 249, 426, 215, 426, 426, 251, 313, 314, 314, 426, 314, 315, 251, 314, 313, 314, 314, 426, 314, 315, 316, 314, 181, 426, 182, 182, 183, 182, 184, 426, 182, 181, 426, 182, 182, 183, 182, 184, 254, 182, 181, 426, 182, 182, 183, 182, 184, 318, 182, 320, 426, 321, 321, 183, 321, 322, 426, 321, 320, 426, 321, 321, 183, 321, 322, 258, 321, 320, 426, 321, 321, 183, 321, 322, 323, 321, 264, 265, 264, 267, 268, 267, 270, 271, 270, 103, 103, 426, 103, 104, 234, 103, 103, 103, 234, 103, 104, 274, 103, 276, 277, 331, 332, 278, 109, 278, 279, 109, 279, 280, 109, 280, 119, 119, 119, 426, 426, 119, 426, 120, 120, 119, 120, 121, 426, 120, 119, 119, 119, 119, 426, 426, 119, 426, 120, 120, 119, 120, 121, 282, 120, 119, 218, 219, 218, 220, 221, 220, 426, 426, 222, 288, 289, 288, 222, 336, 337, 337, 426, 337, 338, 237, 337, 290, 426, 237, 426, 426, 292, 336, 337, 337, 426, 337, 338, 292, 337, 336, 337, 337, 426, 337, 338, 339, 337, 223, 426, 224, 224, 225, 224, 226, 244, 224, 227, 223, 244, 224, 224, 225, 224, 226, 295, 224, 227, 223, 426, 224, 224, 225, 224, 226, 341, 224, 227, 343, 426, 344, 344, 225, 344, 345, 175, 344, 346, 343, 175, 344, 344, 225, 344, 345, 299, 344, 346, 343, 426, 344, 344, 225, 344, 345, 347, 344, 346, 137, 137, 137, 426, 426, 137, 426, 138, 138, 426, 138, 139, 426, 138, 137, 137, 137, 426, 426, 137, 426, 138, 138, 426, 138, 139, 302, 138, 147, 148, 148, 426, 148, 149, 426, 148, 147, 148, 148, 426, 148, 149, 304, 148, 307, 239, 307, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 426, 167, 166, 166, 166, 426, 426, 166, 166, 167, 167, 166, 167, 168, 308, 167, 245, 245, 426, 245, 246, 255, 245, 245, 245, 255, 245, 246, 311, 245, 245, 245, 426, 245, 246, 350, 245, 352, 334, 109, 334, 314, 353, 313, 314, 314, 426, 314, 315, 426, 314, 313, 314, 314, 426, 314, 315, 316, 314, 181, 426, 182, 182, 183, 182, 184, 426, 182, 181, 426, 182, 182, 183, 182, 184, 318, 182, 355, 356, 359, 356, 426, 357, 321, 360, 320, 426, 321, 321, 183, 321, 322, 426, 321, 320, 426, 321, 321, 183, 321, 322, 323, 321, 276, 277, 363, 332, 368, 391, 392, 391, 337, 369, 336, 337, 337, 426, 337, 338, 426, 337, 336, 337, 337, 426, 337, 338, 339, 337, 223, 426, 224, 224, 225, 224, 226, 296, 224, 227, 223, 296, 224, 224, 225, 224, 226, 341, 224, 227, 371, 372, 375, 372, 426, 373, 344, 376, 343, 426, 344, 344, 225, 344, 345, 312, 344, 346, 343, 312, 344, 344, 225, 344, 345, 347, 344, 346, 245, 245, 426, 245, 246, 259, 245, 245, 245, 259, 245, 246, 350, 245, 313, 314, 314, 426, 314, 315, 426, 314, 313, 314, 314, 426, 314, 315, 353, 314, 313, 314, 314, 426, 314, 315, 378, 314, 380, 381, 381, 426, 381, 382, 300, 381, 355, 426, 300, 426, 426, 357, 380, 381, 381, 426, 381, 382, 357, 381, 380, 381, 381, 426, 381, 382, 383, 381, 320, 426, 321, 321, 183, 321, 322, 426, 321, 320, 426, 321, 321, 183, 321, 322, 360, 321, 320, 426, 321, 321, 183, 321, 322, 385, 321, 276, 277, 387, 332, 336, 337, 337, 426, 337, 338, 426, 337, 336, 337, 337, 426, 337, 338, 369, 337, 336, 337, 337, 426, 337, 338, 394, 337, 396, 397, 397, 426, 397, 398, 354, 397, 371, 426, 354, 426, 426, 373, 396, 397, 397, 426, 397, 398, 373, 397, 396, 397, 397, 426, 397, 398, 399, 397, 343, 426, 344, 344, 225, 344, 345, 361, 344, 346, 343, 361, 344, 344, 225, 344, 345, 376, 344, 346, 343, 426, 344, 344, 225, 344, 345, 401, 344, 346, 313, 314, 314, 426, 314, 315, 426, 314, 313, 314, 314, 426, 314, 315, 378, 314, 403, 412, 413, 412, 381, 404, 380, 381, 381, 426, 381, 382, 426, 381, 380, 381, 381, 426, 381, 382, 383, 381, 320, 426, 321, 321, 183, 321, 322, 426, 321, 320, 426, 321, 321, 183, 321, 322, 385, 321, 276, 277, 406, 332, 336, 337, 337, 426, 337, 338, 426, 337, 336, 337, 337, 426, 337, 338, 394, 337, 415, 412, 413, 412, 397, 416, 396, 397, 397, 426, 397, 398, 426, 397, 396, 397, 397, 426, 397, 398, 399, 397, 343, 426, 344, 344, 225, 344, 345, 370, 344, 346, 343, 370, 344, 344, 225, 344, 345, 401, 344, 346, 380, 381, 381, 426, 381, 382, 426, 381, 380, 381, 381, 426, 381, 382, 404, 381, 380, 381, 381, 426, 381, 382, 418, 381, 276, 277, 406, 332, 396, 397, 397, 426, 397, 398, 426, 397, 396, 397, 397, 426, 397, 398, 416, 397, 396, 397, 397, 426, 397, 398, 423, 397, 380, 381, 381, 426, 381, 382, 426, 381, 380, 381, 381, 426, 381, 382, 418, 381, 396, 397, 397, 426, 397, 398, 426, 397, 396, 397, 397, 426, 397, 398, 423, 397, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 92, 92, 426, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 101, 377, 101, 405, 417, 377, 426, 405, 417, 426, 426, 101, 111, 111, 111, 426, 426, 426, 426, 111, 111, 426, 111, 111, 113, 113, 113, 426, 426, 426, 426, 113, 113, 426, 113, 113, 125, 125, 426, 426, 125, 133, 133, 426, 426, 133, 136, 136, 136, 426, 426, 136, 426, 136, 136, 136, 136, 136, 136, 146, 146, 146, 426, 426, 146, 426, 146, 146, 426, 146, 146, 156, 156, 156, 426, 156, 156, 175, 175, 426, 426, 175, 180, 180, 180, 426, 426, 180, 180, 180, 180, 180, 180, 180, 191, 426, 191, 191, 191, 191, 191, 100, 426, 100, 426, 426, 426, 426, 426, 426, 426, 426, 100, 207, 207, 426, 207, 207, 112, 112, 112, 426, 426, 426, 426, 112, 112, 426, 112, 112, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 231, 426, 231, 231, 231, 231, 231, 231, 135, 135, 135, 426, 426, 135, 426, 135, 135, 135, 135, 135, 135, 145, 145, 145, 426, 426, 145, 426, 145, 145, 426, 145, 145, 155, 155, 155, 426, 155, 155, 171, 171, 171, 426, 426, 171, 171, 171, 171, 171, 171, 171, 180, 180, 180, 426, 426, 180, 180, 180, 180, 180, 180, 180, 248, 248, 426, 248, 248, 179, 179, 179, 426, 426, 179, 179, 179, 179, 179, 179, 179, 252, 252, 426, 426, 252, 259, 259, 426, 426, 259, 187, 187, 187, 426, 426, 187, 426, 187, 187, 187, 187, 187, 191, 426, 191, 191, 191, 191, 191, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 190, 426, 190, 190, 190, 190, 190, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 205, 205, 426, 205, 205, 275, 275, 426, 275, 275, 206, 206, 426, 206, 206, 207, 207, 426, 207, 207, 113, 113, 113, 426, 426, 426, 426, 113, 113, 426, 113, 113, 215, 215, 215, 426, 426, 215, 426, 215, 215, 215, 215, 215, 215, 283, 283, 283, 426, 426, 283, 426, 283, 283, 283, 283, 283, 283, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 293, 293, 426, 426, 293, 300, 300, 426, 426, 300, 230, 426, 230, 230, 230, 230, 230, 230, 231, 426, 231, 231, 231, 231, 231, 231, 234, 234, 234, 426, 426, 234, 426, 234, 234, 426, 234, 234, 303, 303, 303, 426, 426, 303, 426, 303, 303, 426, 303, 303, 237, 237, 237, 426, 237, 237, 305, 305, 305, 426, 305, 305, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 244, 244, 244, 426, 426, 244, 244, 244, 244, 244, 244, 244, 309, 309, 309, 426, 426, 309, 309, 309, 309, 309, 309, 309, 247, 247, 426, 247, 247, 248, 248, 426, 248, 248, 317, 317, 317, 426, 317, 317, 319, 426, 319, 319, 319, 319, 319, 324, 426, 324, 324, 324, 324, 324, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 274, 274, 426, 274, 274, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 282, 282, 282, 426, 426, 282, 426, 282, 282, 282, 282, 282, 282, 340, 340, 340, 426, 340, 340, 342, 426, 342, 342, 342, 342, 342, 342, 348, 426, 348, 348, 348, 348, 348, 348, 302, 302, 302, 426, 426, 302, 426, 302, 302, 426, 302, 302, 303, 303, 303, 426, 426, 303, 426, 303, 303, 426, 303, 303, 304, 304, 304, 426, 304, 304, 305, 305, 305, 426, 305, 305, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 308, 308, 308, 426, 426, 308, 308, 308, 308, 308, 308, 308, 351, 351, 426, 351, 351, 316, 316, 316, 426, 316, 316, 318, 426, 318, 318, 318, 318, 318, 358, 358, 426, 426, 358, 323, 426, 323, 323, 323, 323, 323, 324, 426, 324, 324, 324, 324, 324, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 367, 426, 367, 367, 367, 367, 367, 367, 367, 367, 367, 339, 339, 339, 426, 339, 339, 341, 426, 341, 341, 341, 341, 341, 341, 374, 374, 426, 426, 374, 347, 426, 347, 347, 347, 347, 347, 347, 350, 350, 426, 350, 350, 379, 379, 379, 426, 379, 379, 384, 384, 384, 426, 384, 384, 386, 426, 386, 386, 386, 386, 386, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 389, 426, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 393, 426, 393, 393, 393, 393, 393, 393, 393, 393, 393, 395, 395, 395, 426, 395, 395, 400, 400, 400, 426, 400, 400, 402, 426, 402, 402, 402, 402, 402, 402, 378, 378, 378, 426, 378, 378, 383, 383, 383, 426, 383, 383, 385, 426, 385, 385, 385, 385, 385, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 408, 426, 408, 408, 408, 408, 408, 408, 408, 408, 408, 409, 426, 409, 409, 409, 409, 409, 409, 409, 409, 409, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 414, 426, 414, 414, 414, 414, 414, 414, 414, 414, 414, 394, 394, 394, 426, 394, 394, 399, 399, 399, 426, 399, 399, 401, 426, 401, 401, 401, 401, 401, 401, 419, 419, 419, 426, 419, 419, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 422, 426, 422, 422, 422, 422, 422, 422, 422, 422, 422, 424, 424, 424, 426, 424, 424, 418, 418, 418, 426, 418, 418, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 423, 423, 423, 426, 423, 423, 25, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426 } ; static yyconst flex_int16_t yy_chk[3391] = { 0, 0, 30, 2, 30, 35, 93, 35, 93, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 19, 20, 19, 20, 21, 22, 21, 22, 21, 22, 23, 24, 23, 24, 23, 24, 32, 33, 38, 33, 32, 438, 42, 38, 32, 438, 32, 37, 37, 33, 37, 37, 43, 37, 43, 508, 32, 42, 507, 100, 32, 100, 32, 39, 39, 39, 44, 43, 115, 43, 39, 39, 471, 39, 39, 39, 39, 40, 40, 40, 102, 44, 102, 115, 40, 40, 470, 40, 40, 40, 40, 48, 48, 469, 48, 55, 48, 114, 50, 50, 55, 50, 40, 50, 60, 60, 60, 61, 60, 60, 67, 60, 61, 114, 468, 67, 68, 40, 41, 41, 41, 68, 71, 117, 450, 41, 41, 71, 41, 41, 41, 41, 47, 47, 47, 202, 449, 47, 117, 47, 47, 47, 47, 47, 436, 47, 47, 49, 49, 49, 202, 95, 49, 95, 49, 49, 49, 49, 49, 49, 49, 49, 210, 95, 210, 425, 63, 63, 63, 49, 63, 63, 63, 63, 69, 77, 83, 86, 69, 69, 77, 83, 86, 420, 88, 49, 51, 51, 51, 88, 211, 51, 211, 51, 51, 51, 51, 51, 51, 51, 51, 54, 54, 54, 411, 90, 54, 410, 54, 54, 90, 54, 54, 103, 54, 56, 56, 56, 103, 96, 56, 96, 56, 56, 390, 56, 56, 56, 56, 78, 78, 96, 78, 380, 78, 116, 82, 56, 82, 82, 82, 82, 82, 365, 82, 87, 87, 87, 89, 89, 89, 116, 332, 56, 57, 57, 57, 87, 120, 57, 89, 57, 57, 120, 57, 57, 57, 57, 62, 62, 62, 118, 62, 62, 62, 62, 91, 91, 91, 97, 98, 97, 98, 101, 62, 101, 313, 118, 91, 104, 272, 97, 98, 104, 104, 101, 108, 108, 108, 138, 62, 76, 76, 76, 138, 272, 76, 76, 76, 76, 76, 76, 76, 148, 76, 79, 79, 79, 148, 306, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 287, 269, 80, 80, 80, 80, 80, 80, 80, 80, 80, 84, 84, 84, 266, 99, 84, 99, 84, 84, 84, 84, 84, 84, 84, 85, 263, 85, 85, 85, 85, 85, 85, 85, 99, 105, 105, 124, 105, 105, 260, 105, 106, 106, 158, 106, 106, 106, 106, 158, 99, 107, 107, 124, 107, 107, 107, 107, 110, 110, 110, 126, 126, 126, 241, 110, 110, 228, 110, 110, 110, 110, 112, 112, 112, 217, 160, 141, 165, 112, 112, 160, 112, 112, 121, 112, 163, 162, 121, 121, 125, 125, 125, 141, 281, 125, 281, 125, 125, 125, 125, 125, 125, 125, 125, 128, 128, 128, 131, 131, 128, 131, 444, 131, 128, 130, 444, 130, 130, 130, 130, 130, 446, 130, 130, 132, 446, 132, 132, 132, 132, 132, 132, 132, 132, 133, 273, 133, 133, 133, 133, 133, 133, 133, 133, 135, 135, 135, 159, 123, 135, 273, 135, 135, 135, 135, 135, 139, 135, 135, 94, 139, 139, 142, 142, 142, 72, 161, 142, 70, 142, 142, 161, 142, 142, 142, 142, 145, 145, 145, 25, 167, 145, 329, 145, 145, 167, 145, 145, 149, 145, 1, 0, 149, 149, 150, 150, 150, 329, 150, 150, 173, 150, 151, 151, 151, 173, 151, 151, 151, 151, 152, 152, 152, 0, 152, 152, 152, 152, 153, 153, 153, 154, 154, 154, 0, 154, 154, 154, 154, 155, 155, 155, 0, 155, 155, 182, 155, 156, 156, 156, 182, 156, 156, 156, 156, 168, 188, 188, 188, 168, 168, 169, 169, 169, 0, 0, 169, 169, 169, 169, 169, 169, 169, 224, 169, 170, 170, 170, 224, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 171, 171, 171, 0, 0, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 0, 172, 172, 448, 172, 174, 174, 448, 174, 174, 174, 174, 175, 175, 0, 175, 175, 175, 175, 179, 179, 179, 0, 0, 179, 179, 179, 179, 179, 179, 179, 245, 179, 180, 180, 180, 245, 0, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 301, 181, 301, 181, 183, 183, 184, 183, 257, 183, 184, 184, 185, 257, 185, 185, 185, 185, 185, 298, 185, 186, 186, 186, 298, 0, 186, 0, 186, 186, 186, 186, 186, 186, 186, 187, 0, 187, 187, 187, 187, 187, 187, 187, 190, 0, 190, 190, 190, 190, 190, 0, 190, 191, 0, 191, 191, 191, 191, 191, 191, 191, 192, 192, 192, 0, 0, 192, 0, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 195, 195, 195, 196, 196, 196, 198, 198, 198, 199, 199, 199, 195, 201, 0, 201, 203, 203, 198, 203, 203, 451, 203, 204, 204, 451, 204, 204, 204, 204, 205, 205, 201, 205, 205, 205, 205, 206, 206, 314, 206, 206, 0, 206, 314, 0, 207, 207, 201, 207, 207, 207, 207, 208, 208, 208, 218, 218, 218, 0, 208, 208, 0, 208, 208, 208, 208, 209, 209, 209, 212, 321, 212, 0, 209, 209, 321, 209, 209, 209, 209, 216, 216, 216, 0, 0, 216, 220, 220, 220, 216, 212, 0, 216, 0, 216, 223, 223, 226, 223, 0, 223, 226, 226, 238, 238, 238, 212, 213, 213, 213, 0, 0, 213, 0, 213, 213, 213, 213, 213, 0, 213, 213, 214, 214, 214, 0, 0, 214, 0, 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 0, 0, 215, 0, 215, 215, 215, 215, 215, 215, 215, 215, 225, 225, 336, 225, 0, 225, 230, 336, 230, 230, 230, 230, 230, 454, 230, 230, 231, 454, 231, 231, 231, 231, 231, 231, 231, 231, 232, 232, 232, 0, 337, 232, 0, 232, 232, 337, 232, 232, 344, 232, 233, 233, 233, 344, 381, 233, 0, 233, 233, 381, 233, 233, 233, 233, 234, 234, 234, 0, 396, 234, 0, 234, 234, 396, 234, 234, 234, 234, 235, 235, 235, 0, 235, 235, 397, 235, 236, 236, 236, 397, 236, 236, 236, 236, 237, 237, 237, 0, 237, 237, 237, 237, 242, 242, 242, 0, 0, 242, 242, 242, 242, 242, 242, 242, 0, 242, 243, 243, 243, 0, 0, 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, 244, 244, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 246, 261, 261, 261, 246, 246, 247, 247, 0, 247, 247, 457, 247, 248, 248, 457, 248, 248, 248, 248, 249, 249, 249, 0, 249, 249, 460, 249, 250, 250, 460, 250, 0, 250, 251, 251, 251, 0, 251, 251, 251, 251, 252, 252, 252, 0, 252, 252, 252, 252, 253, 0, 253, 253, 253, 253, 253, 0, 253, 254, 0, 254, 254, 254, 254, 254, 254, 254, 255, 0, 255, 255, 255, 255, 255, 255, 255, 256, 0, 256, 256, 256, 256, 256, 0, 256, 258, 0, 258, 258, 258, 258, 258, 258, 258, 259, 0, 259, 259, 259, 259, 259, 259, 259, 264, 264, 264, 267, 267, 267, 270, 270, 270, 274, 274, 0, 274, 274, 464, 274, 275, 275, 464, 275, 275, 275, 275, 276, 276, 276, 276, 278, 278, 278, 279, 279, 279, 280, 280, 280, 282, 282, 282, 0, 0, 282, 0, 282, 282, 282, 282, 282, 0, 282, 282, 283, 283, 283, 0, 0, 283, 0, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284, 284, 286, 286, 286, 0, 0, 286, 288, 288, 288, 286, 290, 290, 290, 0, 290, 290, 466, 290, 291, 291, 466, 291, 0, 291, 292, 292, 292, 0, 292, 292, 292, 292, 293, 293, 293, 0, 293, 293, 293, 293, 294, 0, 294, 294, 294, 294, 294, 472, 294, 294, 295, 472, 295, 295, 295, 295, 295, 295, 295, 295, 296, 0, 296, 296, 296, 296, 296, 296, 296, 296, 297, 0, 297, 297, 297, 297, 297, 475, 297, 297, 299, 475, 299, 299, 299, 299, 299, 299, 299, 299, 300, 0, 300, 300, 300, 300, 300, 300, 300, 300, 302, 302, 302, 0, 0, 302, 0, 302, 302, 0, 302, 302, 0, 302, 303, 303, 303, 0, 0, 303, 0, 303, 303, 0, 303, 303, 303, 303, 304, 304, 304, 0, 304, 304, 0, 304, 305, 305, 305, 0, 305, 305, 305, 305, 307, 307, 307, 308, 308, 308, 0, 0, 308, 308, 308, 308, 308, 308, 308, 0, 308, 309, 309, 309, 0, 0, 309, 309, 309, 309, 309, 309, 309, 309, 309, 310, 310, 0, 310, 310, 479, 310, 311, 311, 479, 311, 311, 311, 311, 312, 312, 0, 312, 312, 312, 312, 315, 334, 334, 334, 315, 315, 316, 316, 316, 0, 316, 316, 0, 316, 317, 317, 317, 0, 317, 317, 317, 317, 318, 0, 318, 318, 318, 318, 318, 0, 318, 319, 0, 319, 319, 319, 319, 319, 319, 319, 320, 320, 322, 320, 0, 320, 322, 322, 323, 0, 323, 323, 323, 323, 323, 0, 323, 324, 0, 324, 324, 324, 324, 324, 324, 324, 331, 331, 331, 331, 338, 366, 366, 366, 338, 338, 339, 339, 339, 0, 339, 339, 0, 339, 340, 340, 340, 0, 340, 340, 340, 340, 341, 0, 341, 341, 341, 341, 341, 498, 341, 341, 342, 498, 342, 342, 342, 342, 342, 342, 342, 342, 343, 343, 345, 343, 0, 343, 345, 345, 347, 0, 347, 347, 347, 347, 347, 511, 347, 347, 348, 511, 348, 348, 348, 348, 348, 348, 348, 348, 350, 350, 0, 350, 350, 516, 350, 351, 351, 516, 351, 351, 351, 351, 352, 352, 352, 0, 352, 352, 0, 352, 353, 353, 353, 0, 353, 353, 353, 353, 354, 354, 354, 0, 354, 354, 354, 354, 355, 355, 355, 0, 355, 355, 524, 355, 356, 356, 524, 356, 0, 356, 357, 357, 357, 0, 357, 357, 357, 357, 358, 358, 358, 0, 358, 358, 358, 358, 359, 0, 359, 359, 359, 359, 359, 0, 359, 360, 0, 360, 360, 360, 360, 360, 360, 360, 361, 0, 361, 361, 361, 361, 361, 361, 361, 363, 363, 363, 363, 368, 368, 368, 0, 368, 368, 0, 368, 369, 369, 369, 0, 369, 369, 369, 369, 370, 370, 370, 0, 370, 370, 370, 370, 371, 371, 371, 0, 371, 371, 533, 371, 372, 372, 533, 372, 0, 372, 373, 373, 373, 0, 373, 373, 373, 373, 374, 374, 374, 0, 374, 374, 374, 374, 375, 0, 375, 375, 375, 375, 375, 537, 375, 375, 376, 537, 376, 376, 376, 376, 376, 376, 376, 376, 377, 0, 377, 377, 377, 377, 377, 377, 377, 377, 378, 378, 378, 0, 378, 378, 0, 378, 379, 379, 379, 0, 379, 379, 379, 379, 382, 391, 391, 391, 382, 382, 383, 383, 383, 0, 383, 383, 0, 383, 384, 384, 384, 0, 384, 384, 384, 384, 385, 0, 385, 385, 385, 385, 385, 0, 385, 386, 0, 386, 386, 386, 386, 386, 386, 386, 387, 387, 387, 387, 394, 394, 394, 0, 394, 394, 0, 394, 395, 395, 395, 0, 395, 395, 395, 395, 398, 412, 412, 412, 398, 398, 399, 399, 399, 0, 399, 399, 0, 399, 400, 400, 400, 0, 400, 400, 400, 400, 401, 0, 401, 401, 401, 401, 401, 543, 401, 401, 402, 543, 402, 402, 402, 402, 402, 402, 402, 402, 403, 403, 403, 0, 403, 403, 0, 403, 404, 404, 404, 0, 404, 404, 404, 404, 405, 405, 405, 0, 405, 405, 405, 405, 406, 406, 406, 406, 415, 415, 415, 0, 415, 415, 0, 415, 416, 416, 416, 0, 416, 416, 416, 416, 417, 417, 417, 0, 417, 417, 417, 417, 418, 418, 418, 0, 418, 418, 0, 418, 419, 419, 419, 0, 419, 419, 419, 419, 423, 423, 423, 0, 423, 423, 0, 423, 424, 424, 424, 0, 424, 424, 424, 424, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 435, 435, 0, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 437, 547, 437, 561, 571, 547, 0, 561, 571, 0, 0, 437, 439, 439, 439, 0, 0, 0, 0, 439, 439, 0, 439, 439, 440, 440, 440, 0, 0, 0, 0, 440, 440, 0, 440, 440, 441, 441, 0, 0, 441, 442, 442, 0, 0, 442, 443, 443, 443, 0, 0, 443, 0, 443, 443, 443, 443, 443, 443, 445, 445, 445, 0, 0, 445, 0, 445, 445, 0, 445, 445, 447, 447, 447, 0, 447, 447, 452, 452, 0, 0, 452, 453, 453, 453, 0, 0, 453, 453, 453, 453, 453, 453, 453, 455, 0, 455, 455, 455, 455, 455, 456, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 456, 458, 458, 0, 458, 458, 459, 459, 459, 0, 0, 0, 0, 459, 459, 0, 459, 459, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 462, 0, 462, 462, 462, 462, 462, 462, 463, 463, 463, 0, 0, 463, 0, 463, 463, 463, 463, 463, 463, 465, 465, 465, 0, 0, 465, 0, 465, 465, 0, 465, 465, 467, 467, 467, 0, 467, 467, 473, 473, 473, 0, 0, 473, 473, 473, 473, 473, 473, 473, 474, 474, 474, 0, 0, 474, 474, 474, 474, 474, 474, 474, 476, 476, 0, 476, 476, 477, 477, 477, 0, 0, 477, 477, 477, 477, 477, 477, 477, 478, 478, 0, 0, 478, 480, 480, 0, 0, 480, 481, 481, 481, 0, 0, 481, 0, 481, 481, 481, 481, 481, 482, 0, 482, 482, 482, 482, 482, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 484, 0, 484, 484, 484, 484, 484, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 488, 488, 0, 488, 488, 489, 489, 0, 489, 489, 490, 490, 0, 490, 490, 491, 491, 0, 491, 491, 492, 492, 492, 0, 0, 0, 0, 492, 492, 0, 492, 492, 493, 493, 493, 0, 0, 493, 0, 493, 493, 493, 493, 493, 493, 494, 494, 494, 0, 0, 494, 0, 494, 494, 494, 494, 494, 494, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 497, 0, 0, 497, 499, 499, 0, 0, 499, 500, 0, 500, 500, 500, 500, 500, 500, 501, 0, 501, 501, 501, 501, 501, 501, 502, 502, 502, 0, 0, 502, 0, 502, 502, 0, 502, 502, 503, 503, 503, 0, 0, 503, 0, 503, 503, 0, 503, 503, 504, 504, 504, 0, 504, 504, 505, 505, 505, 0, 505, 505, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 509, 509, 509, 0, 0, 509, 509, 509, 509, 509, 509, 509, 510, 510, 510, 0, 0, 510, 510, 510, 510, 510, 510, 510, 512, 512, 0, 512, 512, 513, 513, 0, 513, 513, 514, 514, 514, 0, 514, 514, 515, 0, 515, 515, 515, 515, 515, 517, 0, 517, 517, 517, 517, 517, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 519, 519, 0, 519, 519, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 521, 521, 521, 0, 0, 521, 0, 521, 521, 521, 521, 521, 521, 522, 522, 522, 0, 522, 522, 523, 0, 523, 523, 523, 523, 523, 523, 525, 0, 525, 525, 525, 525, 525, 525, 526, 526, 526, 0, 0, 526, 0, 526, 526, 0, 526, 526, 527, 527, 527, 0, 0, 527, 0, 527, 527, 0, 527, 527, 528, 528, 528, 0, 528, 528, 529, 529, 529, 0, 529, 529, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 531, 531, 531, 0, 0, 531, 531, 531, 531, 531, 531, 531, 532, 532, 0, 532, 532, 534, 534, 534, 0, 534, 534, 535, 0, 535, 535, 535, 535, 535, 536, 536, 0, 0, 536, 538, 0, 538, 538, 538, 538, 538, 539, 0, 539, 539, 539, 539, 539, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 0, 542, 542, 542, 542, 542, 542, 542, 542, 542, 544, 544, 544, 0, 544, 544, 545, 0, 545, 545, 545, 545, 545, 545, 546, 546, 0, 0, 546, 548, 0, 548, 548, 548, 548, 548, 548, 549, 549, 0, 549, 549, 550, 550, 550, 0, 550, 550, 551, 551, 551, 0, 551, 551, 552, 0, 552, 552, 552, 552, 552, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 554, 0, 554, 554, 554, 554, 554, 554, 554, 554, 554, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 556, 0, 556, 556, 556, 556, 556, 556, 556, 556, 556, 557, 557, 557, 0, 557, 557, 558, 558, 558, 0, 558, 558, 559, 0, 559, 559, 559, 559, 559, 559, 560, 560, 560, 0, 560, 560, 562, 562, 562, 0, 562, 562, 563, 0, 563, 563, 563, 563, 563, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 565, 0, 565, 565, 565, 565, 565, 565, 565, 565, 565, 566, 0, 566, 566, 566, 566, 566, 566, 566, 566, 566, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 569, 0, 569, 569, 569, 569, 569, 569, 569, 569, 569, 570, 570, 570, 0, 570, 570, 572, 572, 572, 0, 572, 572, 573, 0, 573, 573, 573, 573, 573, 573, 574, 574, 574, 0, 574, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 576, 0, 576, 576, 576, 576, 576, 576, 576, 576, 576, 577, 577, 577, 0, 577, 577, 578, 578, 578, 0, 578, 578, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 580, 580, 580, 0, 580, 580, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426 } ; extern int yy_flex_debug; int yy_flex_debug = 0; static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; static char *yy_full_match; static int yy_lp; static int yy_looking_for_trail_begin = 0; static int yy_full_lp; static int *yy_full_state; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ (yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ (yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ ++(yy_lp); \ goto find_rule; \ } #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #ifndef YYLMAX #define YYLMAX 8192 #endif char yytext[YYLMAX]; char *yytext_ptr; #line 1 "../../mixlib/mix_scanner.l" /* -*-c-*- -------------- mix_scanner.l : * Lexical scanner used by mix_parser_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2003, 2004, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #line 23 "../../mixlib/mix_scanner.l" #include #include #include "mix.h" #include "xmix_parser.h" #define YY_DECL mix_parser_err_t mix_flex_scan (mix_parser_t *parser) #define RESET() \ do { \ mix_ins_fill_from_id (ins, mix_NOP); \ ins.address = 0; \ ins.index = 0; \ nof = FALSE; \ lsf = FALSE; \ if (symbol != NULL ) \ { \ g_free (symbol); \ symbol = NULL; \ } \ if (lsymbol != NULL) \ { \ g_free (lsymbol); \ lsymbol = NULL; \ } \ } while (FALSE) #define NEXT() \ do { \ if (lsymbol != NULL) \ mix_parser_manage_local_symbol (parser,lsymbol, \ loc); \ parser->loc_count++; \ RESET (); \ ++lineno; \ BEGIN (INITIAL); \ } while (FALSE) #define ADD_INS() \ do { \ mix_parser_add_ins (parser, &ins, lineno); \ NEXT (); \ } while (FALSE) #define ADD_RAW(value,is_con) \ do { \ mix_parser_add_raw (parser, value, lineno, is_con); \ NEXT (); \ } while (FALSE) #define ENTER_EVAL() \ do { \ if (yytext[0] != '*') \ { \ expr_val = MIX_WORD_ZERO; \ yyless (0); \ } \ else \ { \ expr_val = mix_short_to_word_fast (parser->loc_count); \ yyless (1); \ } \ yy_push_state (EVAL); \ } while (FALSE) #define ENTER_WEVAL(s) \ do { \ wexpr_val = MIX_WORD_ZERO; \ wexpr_val_tmp = MIX_WORD_ZERO; \ is_fp = FALSE; \ yyless (s); \ yy_push_state (WEVAL); \ } while (FALSE) #define RETURN_ERROR(error, comment) \ do { \ int c; \ mix_parser_log_error (parser, error, lineno, comment, FALSE); \ while ( (c = input ()) != '\n' && c != EOF ) ; \ if ( c == EOF ) return error; else ++lineno; \ RESET (); \ BEGIN (INITIAL); \ } while (FALSE) static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y); static void unput_word_ (mix_word_t word); #line 1560 "mix_scanner.c" #define INITIAL 0 #define LOC 1 #define OP 2 #define ADDRESS 3 #define INDEX 4 #define FSPEC 5 #define EVAL 6 #define WEVAL 7 #define ORIG 8 #define CON 9 #define EQU 10 #define END 11 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * in_str ); FILE *yyget_out (void ); void yyset_out (FILE * out_str ); int yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif static void yyunput (int c,char *buf_ptr ); #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif static int yy_start_stack_ptr = 0; static int yy_start_stack_depth = 0; static int *yy_start_stack = NULL; static void yy_push_state (int new_state ); static void yy_pop_state (void ); /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 152 "../../mixlib/mix_scanner.l" mix_ins_t ins; gboolean nof = FALSE, is_fp = FALSE, end = FALSE, lsf = FALSE; mix_word_t expr_val = MIX_WORD_ZERO, wexpr_val = MIX_WORD_ZERO, wexpr_val_tmp = MIX_WORD_ZERO; gchar *symbol = NULL, *lsymbol = NULL; mix_address_t loc = MIX_SHORT_ZERO; guint lineno = 1; mix_ins_fill_from_id (ins, mix_NOP); ins.address = 0; ins.index = 0; parser->err_line = 0; #ifdef FLEX_DEBUG yy_flex_debug = getenv("FLEX_DEBUG"); #endif yyin = mix_file_to_FILE (parser->in_file); yyrestart (yyin); #line 1793 "mix_scanner.c" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif /* Create the reject buffer large enough to save one state per allowed character. */ if ( ! (yy_state_buf) ) (yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE ); if ( ! (yy_state_buf) ) YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 427 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 3343 ); yy_find_action: yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[(yy_lp)]; if ( yy_act & YY_TRAILING_HEAD_MASK || (yy_looking_for_trail_begin) ) { if ( yy_act == (yy_looking_for_trail_begin) ) { (yy_looking_for_trail_begin) = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; } else { (yy_full_match) = yy_cp; (yy_full_state) = (yy_state_ptr); (yy_full_lp) = (yy_lp); break; } ++(yy_lp); goto find_rule; } --yy_cp; yy_current_state = *--(yy_state_ptr); (yy_lp) = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(LOC): case YY_STATE_EOF(OP): case YY_STATE_EOF(ADDRESS): case YY_STATE_EOF(INDEX): case YY_STATE_EOF(FSPEC): case YY_STATE_EOF(EVAL): case YY_STATE_EOF(WEVAL): case YY_STATE_EOF(ORIG): case YY_STATE_EOF(CON): case YY_STATE_EOF(EQU): case YY_STATE_EOF(END): #line 175 "../../mixlib/mix_scanner.l" { mix_parser_log_error (parser, MIX_PERR_UNEX_EOF, lineno, NULL, FALSE); return MIX_PERR_UNEX_EOF; } YY_BREAK case 1: YY_RULE_SETUP #line 181 "../../mixlib/mix_scanner.l" /* eat comments */ YY_BREAK case 2: YY_RULE_SETUP #line 182 "../../mixlib/mix_scanner.l" { if (end) { return parser->status; } yyless (0); BEGIN (LOC); } YY_BREAK case 3: /* rule 3 can match eol */ YY_RULE_SETUP #line 190 "../../mixlib/mix_scanner.l" { ++lineno; if (end) { return parser->status; } } YY_BREAK case 4: YY_RULE_SETUP #line 200 "../../mixlib/mix_scanner.l" BEGIN (OP); /* LOC field is empty */ YY_BREAK case 5: YY_RULE_SETUP #line 201 "../../mixlib/mix_scanner.l" { /* manage local symbol */ loc = get_ploc_ (parser); lsymbol = g_strdup (yytext); if ( lsymbol == NULL ) { mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); return MIX_PERR_INTERNAL; } BEGIN (OP); } YY_BREAK case 6: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp = yy_bp + 2; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 210 "../../mixlib/mix_scanner.l" {/* local symbol with value */ loc = get_ploc_ (parser); symbol = g_strdup (yytext); lsymbol = g_strdup (yytext); if ( symbol == NULL || lsymbol == NULL) { mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); return MIX_PERR_INTERNAL; } symbol[1] = 'B'; /* this will be referred as nB afterwards */ BEGIN (OP); } YY_BREAK case 7: YY_RULE_SETUP #line 221 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext); YY_BREAK case 8: YY_RULE_SETUP #line 222 "../../mixlib/mix_scanner.l" { /* store symbol name for future definition */ symbol = g_strdup (yytext); if ( symbol == NULL ) { mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE); return MIX_PERR_INTERNAL; } BEGIN (OP); } YY_BREAK case 9: YY_RULE_SETUP #line 230 "../../mixlib/mix_scanner.l" { /* define a new symbol */ mix_parser_err_t err; if ( mix_get_id_from_string (yytext) != mix_INVALID_INS ) mix_parser_log_error (parser, MIX_PERR_SYM_INS, lineno, yytext, TRUE); if ( (err = mix_parser_define_symbol_here (parser,yytext)) != MIX_PERR_OK ) mix_parser_log_error (parser, err, lineno, yytext, FALSE); BEGIN (OP); } YY_BREAK case 10: YY_RULE_SETUP #line 238 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_LOC, yytext); YY_BREAK case 11: /* rule 11 can match eol */ YY_RULE_SETUP #line 239 "../../mixlib/mix_scanner.l" ++lineno; /* empty line */ YY_BREAK case 12: YY_RULE_SETUP #line 243 "../../mixlib/mix_scanner.l" /* eat leading whitespace */ YY_BREAK case 13: /* rule 13 can match eol */ YY_RULE_SETUP #line 244 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_NOOP, NULL); YY_BREAK case 14: YY_RULE_SETUP #line 245 "../../mixlib/mix_scanner.l" BEGIN (ORIG); YY_BREAK case 15: YY_RULE_SETUP #line 246 "../../mixlib/mix_scanner.l" BEGIN (CON); YY_BREAK case 16: YY_RULE_SETUP #line 247 "../../mixlib/mix_scanner.l" BEGIN (EQU); YY_BREAK case 17: YY_RULE_SETUP #line 248 "../../mixlib/mix_scanner.l" BEGIN (END); YY_BREAK case 18: /* rule 18 can match eol */ #line 250 "../../mixlib/mix_scanner.l" case 19: /* rule 19 can match eol */ YY_RULE_SETUP #line 250 "../../mixlib/mix_scanner.l" { mix_byte_t bytes[5]; mix_word_t value; guint k, j = 4; while ( yytext[j++] != '\"' ) ; for ( k = j; k < 5+j && yytext[k] != '\"'; ++k ) bytes[k-j] = mix_ascii_to_char (yytext[k]); if ( k-j < 5 ) { mix_parser_log_error (parser, MIX_PERR_SHORT_ALF, lineno, NULL, TRUE); /* Fill with spaces */ for (; k < 5+j; k++) bytes[k-j] = mix_ascii_to_char (' '); } else if ( yytext[k] != '\"' ) mix_parser_log_error (parser, MIX_PERR_LONG_ALF, lineno, NULL, TRUE); value = mix_bytes_to_word (bytes, 5); ADD_RAW (value, FALSE); } YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP #line 271 "../../mixlib/mix_scanner.l" { mix_byte_t bytes[5]; memset (bytes, mix_ascii_to_char (' '), 5); mix_word_t value = mix_bytes_to_word (bytes, 5); ADD_RAW (value, FALSE); } YY_BREAK case 21: YY_RULE_SETUP #line 277 "../../mixlib/mix_scanner.l" { mix_byte_t bytes[5]; mix_word_t value; int i, n; for (n = 3; n < yyleng; n++) if (!isspace (yytext[n])) break; for (i = 0; i < 5 && n < yyleng; i++, n++) bytes[i] = mix_ascii_to_char (yytext[n]); for (; i < 5; i++) bytes[i] = mix_ascii_to_char (' '); value = mix_bytes_to_word (bytes, 5); ADD_RAW (value, FALSE); } YY_BREAK /* ALF " " */ case 22: /* rule 22 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ #line 296 "../../mixlib/mix_scanner.l" case 23: /* rule 23 can match eol */ YY_RULE_SETUP #line 296 "../../mixlib/mix_scanner.l" { mix_ins_id_t id = mix_get_id_from_string (g_strchomp (yytext)); if ( id == mix_INVALID_INS ) mix_parser_log_error (parser, MIX_PERR_INV_OP, lineno, yytext, FALSE); else { mix_ins_fill_from_id (ins, id); nof = mix_ins_id_is_extended (id); } BEGIN (ADDRESS); } YY_BREAK case 24: YY_RULE_SETUP #line 306 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_OP, yytext); YY_BREAK case 25: YY_RULE_SETUP #line 307 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_OP, yytext); YY_BREAK case 26: /* rule 26 can match eol */ #line 313 "../../mixlib/mix_scanner.l" case 27: /* rule 27 can match eol */ YY_RULE_SETUP #line 313 "../../mixlib/mix_scanner.l" { mix_word_t value = mix_word_new (atol (yytext)); parser->loc_count = mix_word_to_short_fast (value); ++lineno; BEGIN (INITIAL); } YY_BREAK case 28: /* rule 28 can match eol */ #line 323 "../../mixlib/mix_scanner.l" case 29: /* rule 29 can match eol */ YY_RULE_SETUP #line 323 "../../mixlib/mix_scanner.l" { mix_word_t value = mix_word_new (atol (yytext)); ADD_RAW (value, TRUE); } YY_BREAK case 30: /* rule 30 can match eol */ #line 331 "../../mixlib/mix_scanner.l" case 31: /* rule 31 can match eol */ YY_RULE_SETUP #line 331 "../../mixlib/mix_scanner.l" { gint def = MIX_PERR_MIS_SYM; if (symbol) { mix_word_t value = mix_word_new (atol (yytext)); def = mix_parser_define_symbol_value (parser, symbol, value); } switch (def) { case MIX_SYM_DUP: RETURN_ERROR (MIX_PERR_DUP_SYMBOL, symbol); break; case MIX_SYM_LONG: RETURN_ERROR (MIX_PERR_LONG_SYMBOL, symbol); break; case MIX_PERR_MIS_SYM: mix_parser_log_error (parser, def, lineno, NULL, TRUE); break; default: break; } ++lineno; BEGIN (INITIAL); } YY_BREAK case 32: /* rule 32 can match eol */ #line 354 "../../mixlib/mix_scanner.l" case 33: /* rule 33 can match eol */ YY_RULE_SETUP #line 354 "../../mixlib/mix_scanner.l" { parser->start = mix_short_new (atol (yytext)); parser->end = parser->loc_count; end = TRUE; if ( parser->status == MIX_PERR_NOCOMP ) parser->status = MIX_PERR_OK; RESET (); BEGIN (INITIAL); return parser->status; } YY_BREAK case 34: YY_RULE_SETUP #line 366 "../../mixlib/mix_scanner.l" ENTER_WEVAL (0); YY_BREAK case 35: YY_RULE_SETUP #line 367 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_OP, yytext); YY_BREAK case 36: YY_RULE_SETUP #line 371 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext); YY_BREAK case 37: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 374 "../../mixlib/mix_scanner.l" lsf = TRUE; YY_BREAK case 38: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 375 "../../mixlib/mix_scanner.l" lsf = TRUE; YY_BREAK case 39: YY_RULE_SETUP #line 376 "../../mixlib/mix_scanner.l" { lsf = TRUE; ENTER_WEVAL (1); } YY_BREAK case 40: /* rule 40 can match eol */ #line 378 "../../mixlib/mix_scanner.l" case 41: /* rule 41 can match eol */ YY_RULE_SETUP #line 378 "../../mixlib/mix_scanner.l" { if (!lsf) RETURN_ERROR (MIX_PERR_INV_ADDRESS, yytext); mix_parser_define_ls (parser, mix_word_new (atol (yytext))); lsf = FALSE; ADD_INS (); } YY_BREAK case 42: YY_RULE_SETUP #line 384 "../../mixlib/mix_scanner.l" { int pos = yyleng - 3; if (!lsf) RETURN_ERROR (MIX_PERR_INV_ADDRESS, yytext); unput (yytext[yyleng - 1]); while (pos >= 0) { unput (yytext[pos]); --pos; } } YY_BREAK case 43: /* rule 43 can match eol */ #line 394 "../../mixlib/mix_scanner.l" case 44: /* rule 44 can match eol */ YY_RULE_SETUP #line 394 "../../mixlib/mix_scanner.l" { ins.address = mix_short_new (atol (yytext)); switch ( yytext[yyleng-1] ) { case '(' : BEGIN (FSPEC); break; case ',' : BEGIN (INDEX); break; case '\n' : ADD_INS (); break; default: g_assert_not_reached (); } } YY_BREAK case 45: /* rule 45 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 403 "../../mixlib/mix_scanner.l" { gboolean neg = (yytext[0] == '-'); const gchar *s = (neg || yytext[0] == '+')? yytext+1 : yytext; if ( !mix_symbol_table_is_defined (parser->symbol_table, s) ) { mix_parser_set_future_ref (parser, s); if (neg) mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, lineno, s, TRUE); unput (neg? '1':'0'); } else { mix_word_t v = mix_symbol_table_value (parser->symbol_table, s); if ( neg ) mix_word_reverse_sign (v); unput_word_ (v); } } YY_BREAK case 46: /* rule 46 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 420 "../../mixlib/mix_scanner.l" ENTER_EVAL (); YY_BREAK case 47: /* rule 47 can match eol */ YY_RULE_SETUP #line 421 "../../mixlib/mix_scanner.l" ADD_INS (); YY_BREAK case 48: YY_RULE_SETUP #line 422 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_ADDRESS, yytext); YY_BREAK case 49: /* rule 49 can match eol */ YY_RULE_SETUP #line 427 "../../mixlib/mix_scanner.l" { int end = yytext[yyleng-1]; ins.index = mix_byte_new (atol (yytext)); if ( end == '\n' ) ADD_INS (); else if ( end == '(' ) BEGIN (FSPEC); else { /* eat rest of line (comment) */ while ( (end = input()) != '\n' && end != EOF ) ; if ( end == '\n' ) ADD_INS (); else RETURN_ERROR (MIX_PERR_UNEX_EOF, NULL); } } YY_BREAK case 50: /* rule 50 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 441 "../../mixlib/mix_scanner.l" ENTER_EVAL (); YY_BREAK case 51: /* rule 51 can match eol */ YY_RULE_SETUP #line 442 "../../mixlib/mix_scanner.l" { mix_parser_log_error (parser, MIX_PERR_INV_IDX, lineno++, NULL, FALSE); RESET (); BEGIN (INITIAL); } YY_BREAK case 52: YY_RULE_SETUP #line 447 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_IDX, yytext); YY_BREAK case 53: /* rule 53 can match eol */ YY_RULE_SETUP #line 451 "../../mixlib/mix_scanner.l" { glong val = atol (yytext); if (val < 0 || val > MIX_BYTE_MAX) RETURN_ERROR (MIX_PERR_INV_FSPEC, NULL); if (ins.opcode != mix_opMOVE && ins.opcode != mix_opNOP && ( ins.opcode < mix_opJBUS || ins.opcode > mix_opJXx ) && !mix_fspec_is_valid (mix_byte_new (val)) ) { gchar *spec = g_strdup_printf ("%d", (int)val); mix_parser_log_error (parser, MIX_PERR_INV_FSPEC, lineno, spec, TRUE); g_free (spec); } if (nof) { mix_parser_log_error (parser, MIX_PERR_INV_FSPEC, lineno, "ignored", TRUE); } else { ins.fspec = mix_byte_new (val); if (lsf) { mix_parser_define_ls (parser, mix_short_to_word_fast (ins.address)); ins.address = MIX_WORD_ZERO; lsf = FALSE; } ADD_INS (); } } YY_BREAK case 54: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 485 "../../mixlib/mix_scanner.l" { ENTER_EVAL (); } YY_BREAK case 55: YY_RULE_SETUP #line 488 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_FSPEC, yytext); YY_BREAK case 56: YY_RULE_SETUP #line 493 "../../mixlib/mix_scanner.l" { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; mix_word_t value = mix_word_new (atol (s)); expr_val = eval_binop_ (yytext, expr_val, value); } YY_BREAK case 57: YY_RULE_SETUP #line 498 "../../mixlib/mix_scanner.l" { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; if ( !mix_symbol_table_is_defined (parser->symbol_table, s) ) { mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, lineno, s, FALSE); yy_pop_state (); } expr_val = eval_binop_ (yytext, expr_val, mix_symbol_table_value (parser->symbol_table, s)); } YY_BREAK case 58: YY_RULE_SETUP #line 507 "../../mixlib/mix_scanner.l" { expr_val = eval_binop_ (yytext, expr_val, mix_short_to_word_fast (parser->loc_count)); } YY_BREAK case 59: YY_RULE_SETUP #line 511 "../../mixlib/mix_scanner.l" unput_word_ (mix_short_to_word_fast (parser->loc_count)); YY_BREAK case 60: YY_RULE_SETUP #line 512 "../../mixlib/mix_scanner.l" expr_val = mix_word_new (atol (yytext)); YY_BREAK case 61: YY_RULE_SETUP #line 513 "../../mixlib/mix_scanner.l" { if ( !mix_symbol_table_is_defined (parser->symbol_table, yytext) ) { mix_parser_log_error (parser, MIX_PERR_UNDEF_SYM, lineno, yytext, FALSE); yy_pop_state (); } expr_val = mix_symbol_table_value (parser->symbol_table, yytext); } YY_BREAK case 62: /* rule 62 can match eol */ YY_RULE_SETUP #line 520 "../../mixlib/mix_scanner.l" unput (yytext[0]); unput_word_ (expr_val); yy_pop_state (); YY_BREAK case 63: YY_RULE_SETUP #line 521 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_EXPR, yytext); YY_BREAK case 64: YY_RULE_SETUP #line 525 "../../mixlib/mix_scanner.l" { is_fp = TRUE; wexpr_val_tmp = mix_word_new (atol (yytext)); } YY_BREAK case 65: YY_RULE_SETUP #line 529 "../../mixlib/mix_scanner.l" { glong val = atol (yytext); if ( !is_fp ) { mix_parser_log_error (parser, MIX_PERR_MIS_PAREN, lineno, NULL, FALSE); yy_pop_state (); } if ( val < 0 || val > MIX_BYTE_MAX || !mix_fspec_is_valid (mix_byte_new (val)) ) { mix_parser_log_error (parser, MIX_PERR_INV_FSPEC, lineno, NULL, FALSE); yy_pop_state (); } is_fp = FALSE; wexpr_val = mix_word_store_field (mix_byte_new (val), wexpr_val_tmp, wexpr_val); } YY_BREAK case 66: /* rule 66 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 544 "../../mixlib/mix_scanner.l" wexpr_val = mix_word_new (atol (yytext)); YY_BREAK case 67: /* rule 67 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 545 "../../mixlib/mix_scanner.l" ENTER_EVAL (); YY_BREAK case 68: *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ (yy_c_buf_p) = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 546 "../../mixlib/mix_scanner.l" /* eat comma if followed by expression */ YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP #line 547 "../../mixlib/mix_scanner.l" { /* ok if not inside an f-part */ if ( is_fp ) { mix_parser_log_error (parser, MIX_PERR_MIS_PAREN, lineno, NULL, FALSE); yy_pop_state (); } unput (yytext[yyleng-1]); unput_word_ (wexpr_val); yy_pop_state (); } YY_BREAK case 70: YY_RULE_SETUP #line 556 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_EXPR, NULL); YY_BREAK case 71: YY_RULE_SETUP #line 559 "../../mixlib/mix_scanner.l" ECHO; YY_BREAK #line 2610 "mix_scanner.c" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), (size_t) num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); yy_current_state += YY_AT_BOL(); (yy_state_ptr) = (yy_state_buf); *(yy_state_ptr)++ = yy_current_state; for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 427 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *(yy_state_ptr)++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { register int yy_is_jam; register YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 427 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 426); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } static void yyunput (int c, register char * yy_bp ) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register int number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return EOF; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n'); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } #ifndef __cplusplus extern int isatty (int ); #endif /* __cplusplus */ /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return 0; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = 0; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = _yybytes_len + 2; buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } static void yy_push_state (int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) yyalloc(new_size ); else (yy_start_stack) = (int *) yyrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } static void yy_pop_state (void) { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param line_number * */ void yyset_lineno (int line_number ) { yylineno = line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * in_str ) { yyin = in_str ; } void yyset_out (FILE * out_str ) { yyout = out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int bdebug ) { yy_flex_debug = bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = (char *) 0; (yy_init) = 0; (yy_start) = 0; (yy_start_stack_ptr) = 0; (yy_start_stack_depth) = 0; (yy_start_stack) = NULL; (yy_state_buf) = 0; (yy_state_ptr) = 0; (yy_full_match) = 0; (yy_lp) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = (FILE *) 0; yyout = (FILE *) 0; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Destroy the start condition stack. */ yyfree((yy_start_stack) ); (yy_start_stack) = NULL; yyfree ( (yy_state_buf) ); (yy_state_buf) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 559 "../../mixlib/mix_scanner.l" static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y) { mix_word_t result = MIX_WORD_ZERO; switch (op[0]) { case '+': result = mix_word_add (x,y); break; case '-': result = mix_word_sub (x,y); break; case '*': mix_word_mul (x, y, NULL, &result); break; case ':': { mix_word_t a; mix_word_mul (x, 8, NULL, &a); result = mix_word_add (a, y); break; } case '/': if ( strlen (op) > 1 && op[1] == '/' ) { mix_word_div (x,MIX_WORD_ZERO,y, &result, NULL); } else { mix_word_div (MIX_WORD_ZERO, x, y, &result, NULL); } break; default: g_assert_not_reached (); } return result; } static void unput_word_ (mix_word_t word) { gchar *value; gint k; value = g_strdup_printf ("%s%ld", mix_word_is_negative (word)? "-":"+", mix_word_magnitude (word)); for (k = strlen (value) - 1; k >= 0; --k) unput (value[k]); g_free (value); } mdk-1.2.9/mixlib/mix_vm_command.h0000644000175000017500000002152712262417540013663 00000000000000/* -*-c-*- ---------------- mix_vm_command.h : * declarations for mix_vm_command_t, describing commands issued to a vm * ------------------------------------------------------------------ * Copyright (C) 2001, 2006, 2007, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_VM_COMMAND_H #define MIX_VM_COMMAND_H #include #include "mix.h" #include "mix_vm.h" #include "mix_config.h" /* mix_vm_cmd_dispatcher encapsulates a virtual machine and helper objects, providing a command driven interface with output to provided files (in the posix sense). */ typedef struct mix_vm_cmd_dispatcher_t mix_vm_cmd_dispatcher_t; /* mix_vm_cmd_dispatcher understands the commands of this type */ typedef enum { MIX_CMD_HELP = 0, /* echo help message */ MIX_CMD_LOAD, /* load a mix program */ MIX_CMD_EDIT, /* edit mixal source */ MIX_CMD_PEDIT, /* print editor command */ MIX_CMD_SEDIT, /* set editor command*/ MIX_CMD_COMPILE, /* compile mixal source */ MIX_CMD_PASM, /* print compiler command */ MIX_CMD_SASM, /* set assembler command */ MIX_CMD_RUN, /* run a loaded program */ MIX_CMD_NEXT, /* run next instruction */ MIX_CMD_PSTAT, /* print current vm status */ MIX_CMD_LOC, /* print location pointer */ MIX_CMD_PSYM, /* print symbol */ MIX_CMD_PREG, /* print registry */ MIX_CMD_PFLAGS, /* print comp and overf flags */ MIX_CMD_PALL, /* print all registers and flags */ MIX_CMD_PMEM, /* print memory cells */ MIX_CMD_SREG, /* set register value */ MIX_CMD_SCMP, /* set comparison flag value */ MIX_CMD_SOVER, /* set overflow toggle value */ MIX_CMD_SMEM, /* set memory cell value */ MIX_CMD_SSYM, /* set symbol value */ MIX_CMD_SBP, /* set breakpoint at lineno */ MIX_CMD_CBP, /* clear breakpoint at lineno */ MIX_CMD_SBPA, /* set breakpoint at address */ MIX_CMD_CBPA, /* clear breakpoint at address */ MIX_CMD_SBPR, /* set breakpoint on register changed */ MIX_CMD_CBPR, /* clear breakpoint on register changed */ MIX_CMD_SBPM, /* set breakpoint on mem cell changed */ MIX_CMD_CBPM, /* clear breakpoint on mem cell changed */ MIX_CMD_SBPC, /* set breakpoint on comp flag changed */ MIX_CMD_CBPC, /* clear breakpoint on comp flag changed */ MIX_CMD_SBPO, /* set breakpoint on overflow toggled */ MIX_CMD_CBPO, /* clear breakpoint on overflow toggled */ MIX_CMD_CABP, /* clear all breakpoints */ MIX_CMD_WEVAL, /* evaluate a w-expression */ MIX_CMD_W2D, /* print word in decimal notation */ MIX_CMD_STRACE, /* enable/disable instruction traces */ MIX_CMD_PBT, /* print backtrace */ MIX_CMD_STIME, /* enable/disable timing statistics */ MIX_CMD_PTIME, /* print current time statistics */ MIX_CMD_SDDIR, /* set device directory */ MIX_CMD_PDDIR, /* print current device directory */ MIX_CMD_SLOG, /* set on/off message logging */ MIX_CMD_PPROG, /* print the current program path */ MIX_CMD_PSRC, /* print the current program source path */ MIx_CMD_PLINE, /* print the current line no */ MIX_CMD_INVALID, /* invalid command identifier */ MIX_CMD_LOCAL /* locally defined command */ } mix_vm_command_t; /* new commands definition */ typedef gboolean (*mix_vm_cmd_function_t) (mix_vm_cmd_dispatcher_t *, const gchar *); typedef struct { const gchar *name; /* User printable name of the function. */ mix_vm_cmd_function_t func; /* Function to call to do the job. */ const char *doc; /* Documentation for this function. */ const char *usage; /* Usage */ } mix_vm_command_info_t; /* hook functions, to be invoked before and/or after command execution */ typedef void (*mix_vm_cmd_hook_t)(mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data); /* global hook functions */ typedef void (*mix_vm_cmd_global_hook_t)(mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg, gpointer data); /* conversion from/to commands to strings */ extern const gchar * mix_vm_command_to_string (mix_vm_command_t cmd); extern mix_vm_command_t mix_vm_command_from_string (const gchar *name); /* get help string about a command */ extern const gchar * mix_vm_command_help (mix_vm_command_t cmd); extern const gchar * mix_vm_command_usage (mix_vm_command_t cmd); /* create a new command dispatcher */ extern mix_vm_cmd_dispatcher_t * mix_vm_cmd_dispatcher_new (FILE *out, /* output messages file */ FILE *err /* error messages file */); extern mix_vm_cmd_dispatcher_t * mix_vm_cmd_dispatcher_new_with_config (FILE *out, FILE *err, mix_config_t *config); /* delete (does not close the fds in the constructor) */ extern void mix_vm_cmd_dispatcher_delete (mix_vm_cmd_dispatcher_t *dis); /* register new commands for a dispatcher */ extern void mix_vm_cmd_dispatcher_register_new (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_info_t *cmd); /* get command completion list */ const GList * mix_vm_cmd_dispatcher_complete (const mix_vm_cmd_dispatcher_t *dis, const gchar *cmd, gchar **prefix); /* set/get out/error streams */ extern FILE * mix_vm_cmd_dispatcher_get_out_stream (const mix_vm_cmd_dispatcher_t *dis); extern FILE * mix_vm_cmd_dispatcher_get_err_stream (const mix_vm_cmd_dispatcher_t *dis); extern FILE * /* old output stream */ mix_vm_cmd_dispatcher_set_out_stream (mix_vm_cmd_dispatcher_t *dis, FILE *out); extern FILE * /* old error stream */ mix_vm_cmd_dispatcher_set_error_stream (mix_vm_cmd_dispatcher_t *dis, FILE *err); /* set editor and compiler templates */ extern void mix_vm_cmd_dispatcher_set_editor (mix_vm_cmd_dispatcher_t *dis, const gchar *edit_tplt); extern void mix_vm_cmd_dispatcher_set_assembler (mix_vm_cmd_dispatcher_t *dis, const gchar *asm_tplt); extern const gchar * mix_vm_cmd_dispatcher_get_src_file_path (const mix_vm_cmd_dispatcher_t *dis); extern const gchar * mix_vm_cmd_dispatcher_get_program_path (const mix_vm_cmd_dispatcher_t *dis); extern const gchar * mix_vm_cmd_dispatcher_get_editor (const mix_vm_cmd_dispatcher_t *dis); extern const gchar * mix_vm_cmd_dispatcher_get_assembler (const mix_vm_cmd_dispatcher_t *dis); /* dispatch a command */ extern gboolean /* TRUE if success, FALSE otherwise */ mix_vm_cmd_dispatcher_dispatch (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg); /* dispatch a command in text format */ extern gboolean mix_vm_cmd_dispatcher_dispatch_text (mix_vm_cmd_dispatcher_t *dis, const gchar *text); /* dispatch a command in text format, with command and arg split */ extern gboolean mix_vm_cmd_dispatcher_dispatch_split_text (mix_vm_cmd_dispatcher_t *dis, const gchar *command, const gchar *arg); /* get the last dispatch's result */ extern gboolean mix_vm_cmd_dispatcher_get_last_result (const mix_vm_cmd_dispatcher_t *dis); /* get total uptime */ extern mix_time_t mix_vm_cmd_dispatcher_get_uptime (const mix_vm_cmd_dispatcher_t *dis); /* get program total time */ extern mix_time_t mix_vm_cmd_dispatcher_get_progtime (const mix_vm_cmd_dispatcher_t *dis); /* get time lapse */ extern mix_time_t mix_vm_cmd_dispatcher_get_laptime (const mix_vm_cmd_dispatcher_t *dis); /* src file info */ extern gulong mix_vm_cmd_dispatcher_get_src_file_lineno (const mix_vm_cmd_dispatcher_t *dis); extern const gchar * mix_vm_cmd_dispatcher_get_src_file_line (const mix_vm_cmd_dispatcher_t *dis, gulong line, gboolean cr); /* toggle time printing */ extern void mix_vm_cmd_dispatcher_print_time (mix_vm_cmd_dispatcher_t * dis, gboolean print); /* install hooks */ extern void mix_vm_cmd_dispatcher_pre_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, mix_vm_cmd_hook_t hook, gpointer data); extern void mix_vm_cmd_dispatcher_post_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, mix_vm_cmd_hook_t hook, gpointer data); extern void mix_vm_cmd_dispatcher_global_pre_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_cmd_global_hook_t hook, gpointer data); extern void mix_vm_cmd_dispatcher_global_post_hook (mix_vm_cmd_dispatcher_t *dis, mix_vm_cmd_global_hook_t hook, gpointer data); /* get the mix vm */ extern const mix_vm_t * mix_vm_cmd_dispatcher_get_vm (const mix_vm_cmd_dispatcher_t *dis); #endif /* MIX_VM_COMMAND_H */ mdk-1.2.9/mixlib/mix.c0000644000175000017500000000521512622454575011463 00000000000000/* -*-c-*- -------------- mix.c : * Implementation of the functions declared in mix.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2005, 2006, 2007, 2008, 2009, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "mix_types.h" #include "mix_ins.h" #include "mix_code_file.h" #include "mix.h" /* This function must be called before using the library */ void mix_init_lib(void) { mix_init_types (); mix_init_ins (); mix_code_file_set_defext (MIX_CODE_DEFEXT); } /* This function must be called for deallocating the lib resources when it is no longer in use */ void mix_release_lib (void) { /* clean the user defined code file extension (if any) */ mix_code_file_set_defext (NULL); mix_release_ins (); } const char *MIX_GPL_LICENSE = "Copyright (C) 2000-2014 Free Software Foundation, Inc.\n" "There is NO warranty. You may redistribute this software\n" "under the terms of the GNU General Public License.\n" "For more information about these matters, see the files named COPYING.\n"; void mix_print_license (const gchar *program) { fprintf (stderr, _("%s (GNU MDK %s)\n\n"), program, VERSION); fprintf (stderr, "%s", MIX_GPL_LICENSE); } /* check dir, and create it if it doesn't exist */ gboolean mix_stat_dir (const gchar *dirname, const gchar *alias) { struct stat statbuf; g_return_val_if_fail (dirname != NULL, FALSE); if (alias == NULL) alias = ""; if (stat (dirname, &statbuf) == -1) { if (errno != ENOENT || mkdir (dirname, S_IRWXU | S_IRWXG | S_IRWXO)) { g_warning (_("Error creating %s dir %s: %s"), alias, dirname, strerror (errno)); return FALSE; } stat (dirname, &statbuf); } if (!(statbuf.st_mode & S_IFDIR)) { g_warning (_("Error setting %s dir: %s is not a directory"), alias, dirname); return FALSE; } return TRUE; } mdk-1.2.9/mixlib/mix_eval_scanner.l0000644000175000017500000001435612112755472014214 00000000000000/* -*-c-*- ------------------ mix_eval_scanner.l : * scanner used by mix_eval_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ %{ #include #include "mix.h" #include "xmix_eval.h" #define YY_DECL \ mix_eval_result_t mix_eval_expr (mix_eval_data_ *data) /* keep track of current position in buffer */ #define YY_USER_ACTION yypos += yyleng; #define RETURN_STATE(err) \ do { \ done = TRUE; \ state = err; \ BEGIN (INITIAL); \ } while (FALSE) #define CLEAN_UP() \ do { \ yy_delete_buffer (buffer); \ g_free (expr_cp); \ } while (FALSE) static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y); static int unput_word_ (mix_word_t word); %} %option nomain %option caseless %option array %option stack %option noinput %option noyywrap %option noyy_top_state %option noreject %option outfile="lex.yy.c" %s EVAL %s WEVAL ws [ \t]+ digit [0-9] letter [A-Z] number [+-]?{digit}+ mixchar [0-9A-Z .,'')(+*/=$<>@;:\-] locsymbol {digit}H flocsymbol {digit}F blocsymbol {digit}B symbol {digit}*{letter}+[A-Z0-9]* binops "+"|"-"|"/"|"//"|":" binop {binops}|"*" atexpr {digit}+|{symbol}|\* expr [+-]?{atexpr}({binop}{1}{atexpr})* fpart \({expr}\) wexpr {expr}({fpart})?(,{expr}({fpart})?)* %% %{ YY_BUFFER_STATE buffer; mix_word_t expr_val = MIX_WORD_ZERO, wexpr_val = MIX_WORD_ZERO; mix_word_t wexpr_val_tmp = MIX_WORD_ZERO; mix_eval_result_t state = MIX_EVAL_OK; gchar *expr_cp; gint yypos = -22; /* to account for padding */ gboolean is_fp = FALSE, done = FALSE; g_assert (data != NULL && data->expr != NULL); /* make room enough to unput computed values */ expr_cp = g_strdup_printf ("%-20s%s"," ", data->expr); buffer = yy_scan_string (expr_cp); data->errpos = -1; %} <*><> { CLEAN_UP (); return MIX_EVAL_INTERN; } { {ws} /* eat whitespace */ . { if (!done && state == MIX_EVAL_OK) { yypos -= yyleng; yyless (0); yy_push_state (WEVAL); } else { CLEAN_UP (); if (state == MIX_EVAL_OK) return (MIX_EVAL_SYNTAX); data->errpos = yypos; return state; } } "\n" { CLEAN_UP(); if (state == MIX_EVAL_OK) data->value = wexpr_val; else data->errpos = yypos; return state; } } { {number}"(" { is_fp = TRUE; wexpr_val_tmp = mix_word_new (atol (yytext)); } {number}")" { glong val = atol (yytext); if ( !is_fp ) { RETURN_STATE (MIX_EVAL_MIS_PAREN); } else if ( val < 0 || val > MIX_BYTE_MAX || !mix_fspec_is_valid (mix_byte_new (val)) ) { RETURN_STATE (MIX_EVAL_INV_FSPEC); } else { is_fp = FALSE; wexpr_val = mix_word_store_field (mix_byte_new (val), wexpr_val_tmp, wexpr_val); } } {number}/({ws}*\n)|[,()] { wexpr_val = mix_word_new (atol (yytext)); } {expr}/({ws}*\n)|[,()] { if (yytext[0] != '*') { yypos -= yyleng; yyless (0); } else { yypos -= yyleng - 1; expr_val = mix_short_to_word_fast (data->loc); yyless (1); } yy_push_state (EVAL); } ,/{expr} /* eat comma if followed by expression */ [\t\n ] { /* ok if not inside an f-part */ if ( is_fp ) { RETURN_STATE (MIX_EVAL_MIS_PAREN); } unput (yytext[yyleng-1]); --yypos; done = TRUE; yy_pop_state (); } . RETURN_STATE (MIX_EVAL_SYNTAX); } { {binop}{digit}+ { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; mix_word_t value = mix_word_new (atol (s)); expr_val = eval_binop_ (yytext, expr_val, value); } {binop}{symbol} { const gchar *s = ( yytext[1] == '/' ) ? yytext+2 : yytext+1; if ( !mix_symbol_table_is_defined (data->table, s) ) { RETURN_STATE (MIX_EVAL_UNDEF_SYM); } expr_val = eval_binop_ (yytext, expr_val, mix_symbol_table_value (data->table, s)); } {binop}"*" { expr_val = eval_binop_ (yytext, expr_val, mix_short_to_word_fast (data->loc)); } "*" yypos -= unput_word_ (mix_short_to_word_fast (data->loc)); {number} expr_val = mix_word_new (atol (yytext)); {symbol} { if ( !mix_symbol_table_is_defined (data->table, yytext) ) { RETURN_STATE (MIX_EVAL_UNDEF_SYM); } expr_val = mix_symbol_table_value (data->table, yytext); } [,)(\n\t ] { unput (yytext[0]); --yypos; yypos -= unput_word_ (expr_val); yy_pop_state (); } . RETURN_STATE (MIX_EVAL_SYNTAX); } %% static mix_word_t eval_binop_ (const gchar *op, mix_word_t x, mix_word_t y) { mix_word_t result = MIX_WORD_ZERO; switch (op[0]) { case '+': result = mix_word_add (x,y); break; case '-': result = mix_word_sub (x,y); break; case '*': mix_word_mul (x, y, NULL, &result); break; case ':': { mix_word_t a; mix_word_mul (x, 8, NULL, &a); result = mix_word_add (a, y); break; } case '/': if ( strlen (op) > 1 && op[1] == '/' ) { mix_word_div (x,MIX_WORD_ZERO,y, &result, NULL); } else { mix_word_div (MIX_WORD_ZERO, x, y, &result, NULL); } break; default: g_assert_not_reached (); } return result; } static int unput_word_ (mix_word_t word) { gchar *value; gint k, result; value = g_strdup_printf ("%s%ld", mix_word_is_negative (word)? "-":"+", mix_word_magnitude (word)); result = strlen (value); for (k = result - 1; k >= 0; --k) unput (value[k]); g_free (value); return result; } mdk-1.2.9/mixlib/mix_eval.c0000644000175000017500000001124712112755472012466 00000000000000/* -*-c-*- -------------- mix_eval.c : * Implementation of the functions declared in mix_eval.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "xmix_eval.h" static const gchar *errors_[] = { N_("Successful evaluation"), N_("Syntax error in expression"), N_("Out of range F-specification"), N_("Mismatched parenthesis"), N_("Undefined symbol"), N_("Internal error") }; /* create a new evaluator */ mix_eval_t * mix_eval_new (void) { mix_eval_t *result = g_new (mix_eval_t, 1); result->table = mix_symbol_table_new (); if (result->table == NULL) { g_free (result); return NULL; } result->towner = TRUE; result->value = MIX_WORD_ZERO; result->errpos = 0; return result; } /* create a new evaluator with an external symbol table */ mix_eval_t * mix_eval_new_with_table (mix_symbol_table_t *table) { mix_eval_t *result = g_new (mix_eval_t, 1); result->table = table; result->towner = FALSE; result->value = MIX_WORD_ZERO; result->errpos = 0; return result; } /* delete */ void mix_eval_delete (mix_eval_t *eval) { g_return_if_fail (eval); if (eval->table && eval->towner) { mix_symbol_table_delete (eval->table); } g_free (eval); } /* eval an expression */ mix_eval_result_t mix_eval_expression_with_loc (mix_eval_t *eval, const gchar *expr, mix_short_t loc) { mix_eval_data_ data; if (expr == NULL || eval == NULL) return MIX_EVAL_INTERN; data.expr = g_strdup_printf ("%s\n", expr); data.table = eval->table; data.errpos = eval->errpos; data.value = eval->value; data.loc = loc; eval->result = mix_eval_expr (&data); if (eval->result == MIX_EVAL_OK) { eval->value = data.value; eval->errpos = -1; } else { eval->errpos = data.errpos; } g_free (data.expr); return eval->result; } /* get the result of the last evaluation */ mix_word_t mix_eval_value (const mix_eval_t *eval) { g_return_val_if_fail (eval != NULL, MIX_WORD_ZERO); return eval->value; } /* get the last eval result code */ mix_eval_result_t mix_eval_last_error (const mix_eval_t *eval) { g_return_val_if_fail (eval != NULL, MIX_EVAL_INTERN); return eval->result; } /* get the last error string */ const gchar* mix_eval_last_error_string (const mix_eval_t *eval) { g_return_val_if_fail (eval != NULL, errors_[MIX_EVAL_INTERN]); return errors_[eval->result]; } /* get the position of last error */ guint mix_eval_last_error_pos (const mix_eval_t *eval) { g_return_val_if_fail (eval != NULL, 0); return eval->errpos; } /* add, or redefine, a symbol. see mix_symbol_table.h for possible outcomes. */ gint mix_eval_set_symbol (mix_eval_t *eval, const gchar *symbol, mix_word_t value) { g_return_val_if_fail (eval != NULL && eval->table != NULL, MIX_SYM_FAIL); return mix_symbol_table_insert (eval->table, symbol, value); } void mix_eval_remove_symbol (mix_eval_t *eval, const gchar *symbol) { g_return_if_fail (eval != NULL && eval->table != NULL); mix_symbol_table_remove (eval->table, symbol); } void mix_eval_use_symbol_table (mix_eval_t *eval, mix_symbol_table_t *table) { g_return_if_fail (eval != NULL); if (eval->table != NULL && eval->towner) mix_symbol_table_delete (eval->table); eval->table = table; eval->towner = FALSE; } const mix_symbol_table_t * mix_eval_symbol_table (const mix_eval_t *eval) { g_return_val_if_fail (eval != NULL, NULL); return eval->table; } gboolean mix_eval_set_symbols_from_table (mix_eval_t *eval, const mix_symbol_table_t *table) { g_return_val_if_fail (eval != NULL, FALSE); if (eval->table != NULL) return mix_symbol_table_merge_table (eval->table, table); else return FALSE; } gboolean mix_eval_remove_symbols_from_table (mix_eval_t *eval, const mix_symbol_table_t *table) { g_return_val_if_fail (eval != NULL, FALSE); if (eval->table != NULL) return mix_symbol_table_substract_table (eval->table, table); else return FALSE; } mdk-1.2.9/mixlib/mix.h0000644000175000017500000000355412112755472011466 00000000000000/* -*-c-*- ---------------- mix.h : * Initialisation of the mix library * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_H #define MIX_H #ifdef HAVE_CONFIG_H # include #else # warning "config.h not found, package misconfigured." # define PACKAGE "mdk" # define VERSION "0.0" #endif #ifdef HAVE_LOCALE_H # include #endif /* #ifdef HAVE_GETTEXT # include # define gettext_noop(String) (String) #else # include #endif */ #include "gettext.h" #define _(String) gettext (String) #define N_(String) gettext_noop (String) #include /* This function must be called before using the library */ extern void mix_init_lib (void); /* This function must be called for deallocating the lib resources when it is no longer in use */ extern void mix_release_lib (void); extern const char *MIX_GPL_LICENSE; extern void mix_print_license (const gchar *program); /* check dir, and create it if it doesn't exist */ extern gboolean mix_stat_dir (const gchar *dirname, const gchar *alias); #endif /* MIX_H */ mdk-1.2.9/mixlib/mix_vm_dump.h0000644000175000017500000000563312112755472013215 00000000000000/* ---------------------- mix_vm_dump.h : * This file declares types and functions for dumping the contents * of a mix virtual machine. * ------------------------------------------------------------------ ** Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #ifndef MIX_VM_DUMP_H #define MIX_VM_DUMP_H #include #include "mix_vm.h" /* Dump context: a structure defining the properties of dumping */ typedef struct mix_dump_context_t mix_dump_context_t; struct mix_dump_context_t { /* flags activating dumps (see enum below) */ guint32 options; /* range of addresses dumped: [begin,end) */ mix_address_t begin; mix_address_t end; /* IO channel for dumping */ FILE *channel; }; /* Flags for activating dumps */ #define MIX_DUMP_NONE 0 #define MIX_DUMP_rA 1 #define MIX_DUMP_rX (1<<1) #define MIX_DUMP_rJ (1<<2) #define MIX_DUMP_rI1 (1<<3) #define MIX_DUMP_rI2 (1<<4) #define MIX_DUMP_rI3 (1<<5) #define MIX_DUMP_rI4 (1<<6) #define MIX_DUMP_rI5 (1<<7) #define MIX_DUMP_rI6 (1<<8) #define MIX_DUMP_rIa MIX_DUMP_rI1|MIX_DUMP_rI2|MIX_DUMP_rI3 \ |MIX_DUMP_rI4|MIX_DUMP_rI5|MIX_DUMP_rI6 #define MIX_DUMP_rALL MIX_DUMP_rA|MIX_DUMP_rX|MIX_DUMP_rJ|MIX_DUMP_rIa #define MIX_DUMP_OVER (1<<9) #define MIX_DUMP_CMP (1<<10) #define MIX_DUMP_CELLS (1<<11) #define MIX_DUMP_ALL MIX_DUMP_rALL|MIX_DUMP_OVER|MIX_DUMP_CMP|MIX_DUMP_CELLS #define MIX_DUMP_ALL_NOMEM MIX_DUMP_rALL|MIX_DUMP_OVER|MIX_DUMP_CMP /* Default output channel (stdout) */ #define MIX_DUMP_DEF_CHANNEL (stdout) /* Create/destroy a dump context */ extern mix_dump_context_t * mix_dump_context_new (FILE *fd, mix_address_t begin, mix_address_t end, guint32 options); extern void mix_dump_context_delete(mix_dump_context_t *dc); /* Modify an existing dump context */ #define mix_dump_context_add_opt(dc,opt) ((dc)->options |= (opt)) #define mix_dump_context_del_opt(dc,opt) ((dc)->options &= ~(opt)) #define mix_dump_context_set_opt(dc,opt) ((dc)->options = (opt)) #define mix_dump_context_range(dc,first,last) \ do { \ (dc)->begin = first; \ (dc)->end = last; \ } while (FALSE) /* Use the dump context */ extern void mix_vm_dump(const mix_vm_t *vm, const mix_dump_context_t *dc); #endif /* MIX_VM_DUMP_H */ mdk-1.2.9/mixlib/mix_vm.h0000644000175000017500000001647612112755472012177 00000000000000/* ---------------------- mix_vm.h : * Types and functions implementing the MIX virtual machine * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_VM_H #define MIX_VM_H #include "mix_types.h" #include "mix_ins.h" #include "mix_device.h" #include "mix_code_file.h" #include "mix_src_file.h" #include "mix_symbol_table.h" #include "mix_vm_clock.h" /* Comparison flag */ typedef enum { mix_LESS, mix_EQ, mix_GREAT } mix_cmpflag_t; /* Number of memory cells in the virtual machine */ enum { MIX_VM_CELL_NO = 4000 }; /* Opaque type for the mix virtual machine */ typedef struct mix_vm_t mix_vm_t; /* Create/destroy a mix vm */ extern mix_vm_t * mix_vm_new(void); extern void mix_vm_delete(mix_vm_t * vm); /* connect devices to a virtual machine */ extern mix_device_t * /* previously connected device */ mix_vm_connect_device (mix_vm_t *vm, mix_device_t *device); /* get device */ extern mix_device_t * mix_vm_get_device (const mix_vm_t *vm, mix_device_type_t dev); /* install a device factory for automatic connection */ typedef mix_device_t * (* mix_device_factory_t) (mix_device_type_t device); extern void mix_vm_set_device_factory (mix_vm_t *vm, mix_device_factory_t factory); /* Reset a vm (set state as of a newly created one) */ extern void mix_vm_reset(mix_vm_t * vm); /* Set start address for execution */ extern void mix_vm_set_start_addr(mix_vm_t *vm, mix_address_t addr); /* Access to the vm's registers */ extern mix_word_t mix_vm_get_rA(const mix_vm_t *vm); extern mix_word_t mix_vm_get_rX(const mix_vm_t *vm); extern mix_short_t mix_vm_get_rJ(const mix_vm_t *vm); extern mix_short_t mix_vm_get_rI(const mix_vm_t *vm, guint idx); extern void mix_vm_set_rA(mix_vm_t *vm, mix_word_t value); extern void mix_vm_set_rX(mix_vm_t *vm, mix_word_t value); extern void mix_vm_set_rJ(mix_vm_t *vm, mix_short_t value); extern void mix_vm_set_rI(mix_vm_t *vm, guint idx, mix_short_t value); /* Access to the comparison flag and overflow toggle */ extern mix_cmpflag_t mix_vm_get_cmpflag(const mix_vm_t *vm); extern void mix_vm_set_cmpflag(mix_vm_t *vm, mix_cmpflag_t value); extern gboolean mix_vm_get_overflow(const mix_vm_t *vm); extern void mix_vm_set_overflow(mix_vm_t *vm, gboolean value); extern void mix_vm_toggle_overflow(mix_vm_t *vm); extern gboolean mix_vm_is_halted(const mix_vm_t *vm); /* Access to memory cells */ extern mix_word_t mix_vm_get_addr_contents(const mix_vm_t *vm, mix_address_t addr); extern void mix_vm_set_addr_contents(mix_vm_t *vm, mix_address_t addr, mix_word_t value); /* Execution of instructions and programs */ extern gboolean /* TRUE if success */ mix_vm_exec_ins(mix_vm_t *vm, const mix_ins_t *ins); /* Load a code file into memory (-name- does not need the default extension) * resetting the vm's state */ extern gboolean mix_vm_load_file(mix_vm_t *vm, const gchar *name); /* Get the source file object corresponding to the last loaded code file */ extern const mix_src_file_t * mix_vm_get_src_file (const mix_vm_t *vm); /* Get symbol table of loaded file */ extern const mix_symbol_table_t * mix_vm_get_symbol_table (const mix_vm_t *vm); /* Get current program counter */ extern mix_address_t mix_vm_get_prog_count (const mix_vm_t *vm); /* Get the source line number for a given address */ extern guint mix_vm_get_address_lineno (const mix_vm_t *vm, mix_address_t addr); /* Get the address for a given source line number */ extern mix_address_t mix_vm_get_lineno_address (const mix_vm_t *vm, guint lineno); /* continue execution of instructions in memory */ /* Possible outcomes */ typedef enum { MIX_VM_ERROR, /* error executing instructions */ MIX_VM_BREAK, /* breakpoint found */ MIX_VM_COND_BREAK, /* conditional breakpoint found */ MIX_VM_HALT, /* end of execution */ MIX_VM_RUNNING, /* successful instruction execution */ MIX_VM_LOADED, /* program loaded */ MIX_VM_EMPTY /* no program loaded */ } mix_vm_status_t; /* execution errors */ typedef enum { MIX_VM_ERROR_NONE, /* no error */ MIX_VM_ERROR_BAD_ACCESS, /* bad memory address */ MIX_VM_ERROR_BAD_DEVICE_NO, /* bad device number */ MIX_VM_ERROR_BAD_FSPEC, /* invalid fspec */ MIX_VM_ERROR_BAD_M, /* invalid M-value */ MIX_VM_ERROR_DEV_CTL, /* error accessing device for ioctl */ MIX_VM_ERROR_DEV_READ, /* error accessing device for reading */ MIX_VM_ERROR_DEV_WRITE, /* error accessing device for writing */ MIX_VM_ERROR_UNEXPECTED /* unexpected error */ } mix_vm_error_t; extern mix_vm_error_t mix_vm_get_last_error (const mix_vm_t *vm); extern const gchar * mix_vm_get_last_error_string (const mix_vm_t *vm); extern const gchar * mix_vm_get_error_string (mix_vm_error_t code); /* run until next breakpoint or end of execution */ extern mix_vm_status_t mix_vm_run (mix_vm_t *vm); /* execute next memory instruction */ extern mix_vm_status_t mix_vm_exec_next (mix_vm_t *vm); /* get the current execution status */ extern mix_vm_status_t mix_vm_get_run_status (const mix_vm_t *vm); /* get the line no. of the last break or 0 if not found */ extern gulong mix_vm_get_break_lineno (const mix_vm_t *vm); /* Breakpoints */ /* possible error outcomes */ enum { MIX_VM_BP_ERROR = -4, /* internal error */ MIX_VM_BP_NDEBUG = -3, /* no debug info */ MIX_VM_BP_INV_ADDRESS = -2, /* address out of range */ MIX_VM_BP_INV_LINE = -1, /* invalid line no. */ MIX_VM_BP_OK = 0 /* success */ }; extern gint /* if >0 the line no. of the break point */ mix_vm_set_breakpoint (mix_vm_t *vm, guint lineno); extern gint /* one of MIX_VM_BP_ */ mix_vm_set_breakpoint_address (mix_vm_t *vm, guint address); extern gint /* one of MIX_VM_BP_ */ mix_vm_clear_breakpoint (mix_vm_t *vm, guint lineno); extern gint /* one of MIX_VM_BP_ */ mix_vm_clear_breakpoint_address (mix_vm_t *vm, guint address) ; extern gboolean mix_vm_has_breakpoint_at_address (const mix_vm_t *vm, guint address); extern void mix_vm_clear_all_breakpoints (mix_vm_t *vm); #include "mix_predicate.h" extern gboolean mix_vm_set_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred); extern gboolean mix_vm_clear_conditional_breakpoint (mix_vm_t *vm, mix_predicate_t *pred); extern const gchar * mix_vm_get_last_breakpoint_message (const mix_vm_t *vm); extern mix_predicate_type_t mix_vm_get_last_conditional_breakpoint_type (const mix_vm_t *vm); /* Get the vm uptime, defined as the time spent executing instructions */ extern mix_time_t mix_vm_get_uptime (const mix_vm_t *vm); /* Get the list of addresses for executed instructions */ extern const GSList * mix_vm_get_backtrace (const mix_vm_t *vm); #endif /* MIX_VM_H */ mdk-1.2.9/mixlib/mix_device.c0000644000175000017500000000756412112755472013005 00000000000000/* -*-c-*- -------------- mix_device.c : * Implementation of the functions declared in mix_device.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix_file.h" #include "xmix_device.h" /* Set the directory for mix device files (by default, it's ".") If the dir does not exist, it is created. */ gboolean mix_device_set_dir (const gchar *dirname) { if (mix_stat_dir (dirname, "devices")) { if (DEV_DIR_) g_free (DEV_DIR_); DEV_DIR_ = g_strdup (dirname); return TRUE; } else return FALSE; } const gchar * mix_device_get_dir (void) { return DEV_DIR_; } mix_device_t * mix_device_new (mix_device_type_t type) { mix_device_t *result = NULL; g_return_val_if_fail (type < mix_dev_INVALID, NULL); result = g_new (mix_device_t, 1); construct_device_ (result, type); return result; } mix_device_t * mix_device_new_with_name (mix_device_type_t type, const gchar *name) { mix_device_t *result = NULL; g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (type < mix_dev_INVALID, NULL); result = g_new (mix_device_t, 1); construct_device_with_name_ (result, type, name); return result; } /* Create a new device with a given type and stream */ mix_device_t * mix_device_new_with_file (mix_device_type_t type, FILE *file) { mix_device_t *result = NULL; g_return_val_if_fail (file != NULL, NULL); g_return_val_if_fail (type < mix_dev_INVALID, NULL); result = g_new (mix_device_t, 1); construct_device_with_file_ (result, type, file); return result; } void mix_device_delete (mix_device_t *dev) { if (dev != NULL) { (dev->vtable->destroy) (dev); g_free (dev); } } mix_device_type_t mix_device_type (const mix_device_t *dev) { g_return_val_if_fail (dev != NULL, mix_dev_INVALID); return dev->type; } const char * mix_device_get_name (const mix_device_t *dev) { g_return_val_if_fail (dev != NULL, NULL); return mix_file_base_name(GET_FILE_(dev)); } /* Get the device block size */ size_t mix_device_block_size (const mix_device_t *dev) { g_return_val_if_fail (dev != NULL, 0); return SIZES_[dev->type]; } /* Get the device io mode */ mix_device_mode_t mix_device_mode (const mix_device_t *dev) { g_return_val_if_fail (dev != NULL, 0); return MODES_[dev->type]; } /* Write a block to the device. */ gboolean mix_device_write (mix_device_t *dev, const mix_word_t *block) { g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (block != NULL, FALSE); g_assert (dev->vtable != NULL); return (dev->vtable->write) (dev, block); } gboolean mix_device_read (mix_device_t *dev, mix_word_t *block) { g_return_val_if_fail (dev != NULL, FALSE); g_return_val_if_fail (block != NULL, FALSE); g_assert (dev->vtable != NULL); return (dev->vtable->read) (dev, block); } gboolean mix_device_ioc (mix_device_t *dev, mix_short_t arg) { g_return_val_if_fail (dev != NULL, FALSE); g_assert (dev->vtable != NULL); return (dev->vtable->ioc) (dev, arg); } gboolean mix_device_busy (const mix_device_t *dev) { g_return_val_if_fail (dev != NULL, FALSE); return (dev->vtable->busy) (dev); } mdk-1.2.9/mixlib/Makefile.in0000644000175000017500000006507112636565536012602 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2000, 2001, 2006, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = mixlib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libmix_a_AR = $(AR) $(ARFLAGS) libmix_a_LIBADD = am_libmix_a_OBJECTS = completion.$(OBJEXT) mix.$(OBJEXT) \ mix_types.$(OBJEXT) mix_ins.$(OBJEXT) mix_vm.$(OBJEXT) \ xmix_vm.$(OBJEXT) mix_vm_dump.$(OBJEXT) mix_io.$(OBJEXT) \ xmix_io.$(OBJEXT) mix_symbol_table.$(OBJEXT) \ mix_file.$(OBJEXT) mix_code_file.$(OBJEXT) \ mix_parser.$(OBJEXT) mix_scanner.$(OBJEXT) \ mix_device.$(OBJEXT) xmix_device.$(OBJEXT) mix_eval.$(OBJEXT) \ mix_eval_scanner.$(OBJEXT) mix_src_file.$(OBJEXT) \ mix_vm_clock.$(OBJEXT) mix_vm_command.$(OBJEXT) \ xmix_vm_command.$(OBJEXT) xmix_vm_handlers.$(OBJEXT) \ mix_config.$(OBJEXT) mix_predicate.$(OBJEXT) \ mix_predicate_list.$(OBJEXT) libmix_a_OBJECTS = $(am_libmix_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) AM_V_LEX = $(am__v_LEX_@AM_V@) am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) am__v_LEX_0 = @echo " LEX " $@; am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap SOURCES = $(libmix_a_SOURCES) DIST_SOURCES = $(libmix_a_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/ylwrap \ mix_eval_scanner.c mix_scanner.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ -I$(includedir) -I$(top_srcdir) \ -DG_LOG_DOMAIN=\"libmix\" AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = testsuite noinst_LIBRARIES = libmix.a libmix_a_SOURCES = gettext.h \ completion.h completion.c \ mix.h mix.c \ mix_types.h mix_types.c \ mix_ins.h mix_ins.c \ mix_vm.h mix_vm.c xmix_vm.h xmix_vm.c \ mix_vm_dump.h mix_vm_dump.c \ mix_io.h mix_io.c xmix_io.h xmix_io.c \ mix_symbol_table.h mix_symbol_table.c \ mix_file.h mix_file.c \ mix_code_file.h mix_code_file.c \ mix_parser.h xmix_parser.h mix_parser.c mix_scanner.l \ mix_device.h mix_device.c xmix_device.h xmix_device.c \ mix_eval.h mix_eval.c xmix_eval.h mix_eval_scanner.l \ mix_src_file.c mix_src_file.h \ mix_vm_clock.c mix_vm_clock.h \ mix_vm_command.c mix_vm_command.h \ xmix_vm_command.c xmix_vm_command.h \ xmix_vm_handlers.h xmix_vm_handlers.c \ mix_config.c mix_config.h \ mix_predicate.c mix_predicate.h \ mix_predicate_list.c mix_predicate_list.h all: all-recursive .SUFFIXES: .SUFFIXES: .c .l .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mixlib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu mixlib/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmix.a: $(libmix_a_OBJECTS) $(libmix_a_DEPENDENCIES) $(EXTRA_libmix_a_DEPENDENCIES) $(AM_V_at)-rm -f libmix.a $(AM_V_AR)$(libmix_a_AR) libmix.a $(libmix_a_OBJECTS) $(libmix_a_LIBADD) $(AM_V_at)$(RANLIB) libmix.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/completion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_code_file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_eval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_eval_scanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_ins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_predicate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_predicate_list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_scanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_src_file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_symbol_table.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_types.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_clock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_command.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_dump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_vm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_vm_command.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_vm_handlers.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .l.c: $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(LIBRARIES) installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f mix_eval_scanner.c -rm -f mix_scanner.c clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/mixlib/mix_predicate.c0000644000175000017500000001367412112755472013505 00000000000000/* -*-c-*- -------------- mix_predicate.c : * Implementation of the functions declared in mix_predicate.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mix_vm.h" #include "mix_predicate.h" /* predicate data */ typedef union pred_data_t { mix_word_t regA; mix_word_t regX; mix_short_t regI; mix_cmpflag_t cmp; gboolean over; mix_word_t mem; } pred_data_t; /* the predicate function type */ typedef gboolean (*mix_predicate_fun_t) (mix_predicate_t *pred, const mix_vm_t *vm); /* the predicate type */ struct mix_predicate_t { mix_predicate_type_t type; pred_data_t data; guint control; }; /* predicate funcs */ static gboolean pred_func_rA (mix_predicate_t *pred, const mix_vm_t *vm) { mix_word_t val = mix_vm_get_rA (vm); if (pred->data.regA == val) return FALSE; pred->data.regA = val; return TRUE; } static gboolean pred_func_rX (mix_predicate_t *pred, const mix_vm_t *vm) { mix_word_t val = mix_vm_get_rX (vm); if (pred->data.regX == val) return FALSE; pred->data.regX = val; return TRUE; } static gboolean pred_func_rI (mix_predicate_t *pred, const mix_vm_t *vm) { mix_short_t val = (pred->control == 0) ? mix_vm_get_rJ (vm) : mix_vm_get_rI (vm, pred->control); if (pred->data.regI == val) return FALSE; pred->data.regI = val; return TRUE; } static gboolean pred_func_mem (mix_predicate_t *pred, const mix_vm_t *vm) { mix_word_t val = mix_vm_get_addr_contents (vm, (mix_address_t)pred->control); if (pred->data.mem == val) return FALSE; pred->data.mem = val; return TRUE; } static gboolean pred_func_cmp (mix_predicate_t *pred, const mix_vm_t *vm) { mix_cmpflag_t val = mix_vm_get_cmpflag (vm); if (pred->data.cmp == val) return FALSE; pred->data.cmp = val; return TRUE; } static gboolean pred_func_over (mix_predicate_t *pred, const mix_vm_t *vm) { gboolean val = mix_vm_get_overflow (vm); if (pred->data.over == val) return FALSE; pred->data.over = val; return TRUE; } static mix_predicate_fun_t PRED_FUNCS_[] = { pred_func_rA, pred_func_rX, pred_func_rI, pred_func_rI, pred_func_rI, pred_func_rI, pred_func_rI, pred_func_rI, pred_func_rI, pred_func_over, pred_func_cmp, pred_func_mem }; /* create predicates based on vm status */ mix_predicate_t * mix_predicate_new (mix_predicate_type_t type) { mix_predicate_t *result; g_return_val_if_fail (type <= MIX_PRED_MEM, NULL); result = g_new (mix_predicate_t, 1); result->type = type; result->data.regA = MIX_WORD_ZERO; if (type >= MIX_PRED_REG_I1 && type <= MIX_PRED_REG_I6) result->control = 1 + type - MIX_PRED_REG_I1; else result->control = 0; return result; } /* delete a predicate */ void mix_predicate_delete (mix_predicate_t *predicate) { g_return_if_fail (predicate != NULL); g_free (predicate); } /* return the predicate's type */ mix_predicate_type_t mix_predicate_get_type (const mix_predicate_t *pred) { g_return_val_if_fail (pred != NULL, MIX_PRED_INVALID); return pred->type; } /* test a predicate */ gboolean mix_predicate_eval(mix_predicate_t *pred, const mix_vm_t *vm) { g_return_val_if_fail (pred != NULL, FALSE); g_return_val_if_fail (vm != NULL, FALSE); return PRED_FUNCS_[pred->type] (pred, vm); } /* change mem address of a MIX_PRED_MEM predicate */ void mix_predicate_set_mem_address (mix_predicate_t *predicate, mix_address_t address) { g_return_if_fail (predicate != NULL); predicate->control = address; } /* get message about predicate evaluation */ const gchar * mix_predicate_get_message (const mix_predicate_t *predicate) { enum {SIZE = 256}; static gchar BUFFER[SIZE]; static const gchar *CMP_STRINGS[] = { "L", "E", "G"}; g_return_val_if_fail (predicate != NULL, NULL); switch (predicate->type) { case MIX_PRED_REG_A: g_snprintf (BUFFER, SIZE, _("Register A changed to %s%ld"), mix_word_is_negative (predicate->data.regA)? "-" : "+", mix_word_magnitude (predicate->data.regA)); break; case MIX_PRED_REG_X: g_snprintf (BUFFER, SIZE, _("Register X changed to %s%ld"), mix_word_is_negative (predicate->data.regX)? "-" : "+", mix_word_magnitude (predicate->data.regX)); break; case MIX_PRED_REG_J: g_snprintf (BUFFER, SIZE, _("Register J changed to %d"), mix_short_magnitude (predicate->data.regI)); break; case MIX_PRED_REG_I1: case MIX_PRED_REG_I2: case MIX_PRED_REG_I3: case MIX_PRED_REG_I4: case MIX_PRED_REG_I5: case MIX_PRED_REG_I6: g_snprintf (BUFFER, SIZE, _("Register I%d changed to %s%d"), predicate->control, mix_short_is_negative (predicate->data.regI)? "-" : "+", mix_short_magnitude (predicate->data.regI)); break; case MIX_PRED_CMP: g_snprintf (BUFFER, SIZE, _("Comparison flag changed to %s"), CMP_STRINGS[predicate->data.cmp]); break; case MIX_PRED_OVER: g_snprintf (BUFFER, SIZE, _("Overflow toggled %s"), predicate->data.over ? "ON" : "OFF"); break; case MIX_PRED_MEM: g_snprintf (BUFFER, SIZE, _("Memory address %d changed to %s%ld"), predicate->control, mix_word_is_negative (predicate->data.mem)? "-" : "+", mix_word_magnitude (predicate->data.mem)); break; default: g_assert_not_reached (); } return BUFFER; } mdk-1.2.9/mixlib/mix_src_file.c0000644000175000017500000000761312112755472013327 00000000000000/* -*-c-*- -------------- mix_src_file.c : * Implementation of the functions declared in mix_src_file.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "mix_src_file.h" /* the MIXAL source file type */ struct mix_src_file_t { gchar *path; /* the path to the disk file */ GPtrArray *lines; /* an array of the file lines */ guint lineno; /* the number of lines */ }; /* format a source line */ static gchar * format_line_ (gchar *line) { const gchar *label, *op, *rest; gint k = 0; if (!line) return line; if (line[0] == '*' || strlen(line) == 0) return g_strdup (line); if (isspace (line[0])) { label = " "; while (line[k] && isspace (line[k])) ++k; } else { label = line; while (line[k] && !isspace (line[k])) ++k; while (line[k] && isspace (line[k])) ++k; } if (line[k]) { line[k - 1] = 0; op = line + k; while (line[k] && !isspace (line[k])) ++k; while (line[k] && isspace (line[k])) ++k; line[k - 1] = 0; rest = (line[k]) ? line + k: ""; } else { op = rest = ""; } return g_strdup_printf ("%-11s %-5s %s", label, op, rest); } /* load the source file lines into memory */ static gboolean load_file_ (mix_src_file_t *file) { mix_file_t *mf = mix_file_new_with_def_ext (file->path, mix_io_READ, MIX_SRC_DEFEXT); if (mf != NULL) { enum {BUFFER_SIZE = 256}; static gchar BUFFER[BUFFER_SIZE]; FILE *f = mix_file_to_FILE (mf); file->lines = g_ptr_array_new (); file->lineno = 0; while (fgets (BUFFER, BUFFER_SIZE, f) == BUFFER) { g_ptr_array_add (file->lines, (gpointer) format_line_ (BUFFER)); file->lineno++; } mix_file_delete (mf); return TRUE; } return FALSE; } /* create a new src file from an existing disk file */ mix_src_file_t * mix_src_file_new_for_read (const gchar *path) { mix_src_file_t *result = g_new (mix_src_file_t, 1); result->lines = NULL; result->path = g_strdup (path); result->lineno = 0; return result; } /* destroy a src file object */ void mix_src_file_delete (mix_src_file_t *src) { g_return_if_fail (src != NULL); if (src->lines) g_ptr_array_free (src->lines, TRUE); g_free (src->path); g_free (src); } /* get the source file path */ const gchar * mix_src_file_get_path (const mix_src_file_t *src) { g_return_val_if_fail (src != NULL, NULL); return src->path; } /* get a given line of the source file */ const gchar * mix_src_file_get_line (const mix_src_file_t *src, guint lineno) { g_return_val_if_fail (src != NULL, NULL); if (src->lines == NULL && !load_file_ ((mix_src_file_t*)src)) return NULL; if (lineno > src->lineno || lineno == 0) return NULL; return (gchar *)g_ptr_array_index (src->lines, lineno - 1); } /* get the total no. of lines in the file */ guint mix_src_file_get_line_no (const mix_src_file_t *src) { g_return_val_if_fail (src != NULL, 0); if (src->lines == NULL && !load_file_ ((mix_src_file_t*)src)) return 0; return src->lineno; } mdk-1.2.9/mixlib/mix_vm_clock.h0000644000175000017500000000314012112755472013332 00000000000000/* -*-c-*- ---------------- mix_vm_clock.h : * Declaration of mix_vm_clock_t, a clock for the MIX virtual machine. * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIX_VM_CLOCK_H #define MIX_VM_CLOCK_H #include "mix.h" #include "mix_ins.h" /* the type of time unit */ typedef gulong mix_time_t; /* the clock type */ typedef struct mix_vm_clock_t { mix_time_t time; } mix_vm_clock_t; /* Create/delete a clock */ extern mix_vm_clock_t * mix_vm_clock_new (); extern void mix_vm_clock_delete (mix_vm_clock_t *clock); /* Increase time with the units needed to execute ins */ extern mix_time_t /* the added lapse */ mix_vm_clock_add_lapse (mix_vm_clock_t *clock, const mix_ins_t *ins); /* Get the time since creation */ #define mix_vm_clock_get_time(clock) (clock? clock->time:0) #endif /* MIX_VM_CLOCK_H */ mdk-1.2.9/mixlib/mix_code_file.c0000644000175000017500000002146312112755472013451 00000000000000/* -*-c-*- -------------- mix_code_file.c : * Implementation of the functions declared in mix_code_file.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2002, 2003, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "mix.h" #include "xmix_io.h" #include "mix_code_file.h" /* mix_code_file_t type */ static const gint32 SIGNATURE_ = 0xDEADBEEF; /* release files */ static const gint32 SIGNATURE_D_ = 0xBEEFDEAD; /* debug files */ #define IS_DEBUG_(file) ((file)->header.signature == SIGNATURE_D_) #define IS_RELEASE_(file) ((file)->header.signature == SIGNATURE_) typedef struct mix_cfheader_t mix_cfheader_t; struct mix_cfheader_t { gint32 signature; gint mj_ver; gint mn_ver; gint16 start; size_t path_len; }; struct mix_code_file_t { mix_file_t *file; /* the underlying disk file */ mix_address_t address; /* current address while reading */ mix_cfheader_t header; /* file header */ gchar *source_path; /* variable length part of the header*/ mix_symbol_table_t *symbol_table; /* code files with debug info fill it*/ }; #define to_io_(cf) MIX_IOCHANNEL (cf->file) /* Code files are lists of tagged words. A MIX_INS_TAG_ denotes * that the word is an instruction, whose address is the next to * the previous instruction's one, while a MIX_ADDR_TAG_ indicates * that the word is a new address origin for the next instructions. * The tags are stored as bit patterns in bit 31 of the mix word. */ #define MIX_ADDR_TAG_ (MIX_WORD_SIGN_BIT<<1) #define is_ins_(word) (((word)&MIX_ADDR_TAG_) == MIX_WORD_ZERO) #define is_addr_(word) (((word)&MIX_ADDR_TAG_) == MIX_ADDR_TAG_) #define tag_ins_(word) (word) #define tag_addr_(word) ((word)|MIX_ADDR_TAG_) #define extract_ins_(tagged) (tagged) #define extract_addr_(tagged) ((tagged)&MIX_SHORT_MAX) /* mix code files have a default extension (.mix) which is customizable */ static const gchar *DEFEXT_ = NULL; const gchar * mix_code_file_get_defext (void) { return DEFEXT_; } gboolean mix_code_file_set_defext (const gchar *ext) { if (DEFEXT_ != NULL) g_free ((void *)DEFEXT_); DEFEXT_ = (ext != NULL)? g_strdup (ext):NULL; return (DEFEXT_ != NULL || ext == NULL); } /* create/destroy code files for read or write */ static mix_code_file_t * mix_code_file_new_ (const gchar *name, mix_fmode_t mode) { mix_code_file_t *result = g_new (mix_code_file_t, 1); if ( result != NULL ) { result->file = mix_file_new_with_def_ext (name, mode, DEFEXT_); result->address = MIX_SHORT_ZERO; result->source_path = NULL; result->symbol_table = NULL; } if ( result != NULL && result->file == NULL ) { g_free (result); result = NULL; } return result; } mix_code_file_t * mix_code_file_new_read (const gchar *name) { mix_code_file_t *result = mix_code_file_new_ (name, mix_io_READ); mix_cfheader_t *header; FILE *file; gboolean check; if ( result == NULL ) return NULL; file = mix_file_to_FILE (result->file); header = &(result->header); check = fread (header, sizeof (mix_cfheader_t), 1, file) && (IS_RELEASE_ (result) || IS_DEBUG_ (result)); if ( check ) { gint major, minor; sscanf (VERSION, "%d.%d", &major, &minor); check = header->mj_ver == major && header->mn_ver <= minor; } if ( check ) {/* get source path */ result->source_path = g_strnfill (1 + header->path_len, '\0'); check = result->source_path != NULL && fgets (result->source_path, 1 + header->path_len, file) != NULL; } if ( check && IS_DEBUG_ (result) ) {/* read symbol table */ result->symbol_table = mix_symbol_table_new_from_file (file); check = result->symbol_table != NULL; } if ( !check ) { mix_code_file_delete (result); return NULL; } return result; } mix_code_file_t * mix_code_file_new_write(const gchar *name, mix_address_t addr, const gchar *source_path, gboolean debug, const mix_symbol_table_t *table) { mix_code_file_t *result; FILE *file; gboolean check; result = mix_code_file_new_ (name, mix_io_WRITE); if ( result == NULL || ( file = mix_file_to_FILE (result->file) ) == NULL ) return NULL; else if ( source_path != NULL ) { result->source_path = g_strdup (source_path/*, MAX_PATH_LEN_*/); if ( result->source_path == NULL ) { mix_code_file_delete (result); return NULL; } } else result->source_path = NULL; result->header.signature = debug? SIGNATURE_D_:SIGNATURE_; sscanf (VERSION, "%d.%d", &result->header.mj_ver, &result->header.mn_ver); result->header.start = (gint16) addr; result->header.path_len = strlen (result->source_path); check = write_data_ (to_io_ (result), &result->header, 1); if ( check && result->source_path != NULL ) check = fputs (result->source_path, file) != EOF; if ( check && debug ) mix_symbol_table_print (table, MIX_SYM_LINE, file, TRUE); if ( !check ) { mix_code_file_delete (result); return NULL; } return result; } void mix_code_file_delete (mix_code_file_t *file) { g_return_if_fail (file != NULL); mix_file_delete (file->file); if (file->source_path) g_free (file->source_path); g_free (file); } /* get general parameters from a code file */ gboolean mix_code_file_is_debug (const mix_code_file_t *file) { return (file != NULL) && IS_DEBUG_ (file); } gint mix_code_file_major_version (const mix_code_file_t *file) { g_return_val_if_fail (file != NULL, 0); return file->header.mj_ver; } gint mix_code_file_minor_version (const mix_code_file_t *file) { g_return_val_if_fail (file != NULL, 0); return file->header.mn_ver; } mix_address_t mix_code_file_get_start_addr (const mix_code_file_t *file) { g_return_val_if_fail (file != NULL, MIX_SHORT_ZERO); return mix_short_new (file->header.start); } mix_symbol_table_t * mix_code_file_get_symbol_table(mix_code_file_t *file) { mix_symbol_table_t *result = NULL; g_return_val_if_fail (file != NULL, NULL); result = file->symbol_table; file->symbol_table = NULL; return result; } /* read instructions from a code file */ gboolean mix_code_file_is_eof (mix_code_file_t *file) { return is_eof_ (to_io_ (file)); } gboolean mix_code_file_get_ins (mix_code_file_t *file, mix_ins_desc_t *desc) { mix_word_t next; g_return_val_if_fail (file != NULL, FALSE); g_return_val_if_fail (desc != NULL, FALSE); while (TRUE) { if ( ! mix_io_read_word_array (to_io_ (file), &next, 1) ) return FALSE; if ( is_addr_ (next) ) file->address = extract_addr_ (next); else if ( is_ins_ (next) ) { desc->ins = extract_ins_ (next); desc->address = (file->address)++; if ( IS_DEBUG_ (file) ) { mix_short_t lineno; if ( !mix_io_read_short_array (to_io_ (file), &lineno, 1) ) return FALSE; desc->lineno = mix_short_magnitude (lineno); } else desc->lineno = 0; return TRUE; } else { g_assert_not_reached (); return FALSE; } }; } /* Write instructions to a code file */ gboolean mix_code_file_write_ins (mix_code_file_t *file, const mix_ins_desc_t *desc) { g_return_val_if_fail (desc != NULL, FALSE); return ( mix_code_file_set_address (file, desc->address) && mix_code_file_write_next_ins (file, desc->ins, desc->lineno) ); } gboolean mix_code_file_write_next_ins (mix_code_file_t *file, mix_word_t ins, guint lineno) { g_return_val_if_fail (file != NULL, FALSE); if ( mix_io_write_word (to_io_ (file), tag_ins_ (ins)) && ( IS_RELEASE_ (file) || mix_io_write_short (to_io_ (file), mix_short_new (lineno)) ) ) { ++(file->address); return TRUE; } else return FALSE; } gboolean mix_code_file_set_address (mix_code_file_t *file, mix_address_t address) { g_return_val_if_fail(file != NULL, FALSE); if ( file->address != address ) { if ( !mix_io_write_word (to_io_ (file), tag_addr_ (mix_short_to_word_fast (address))) ) return FALSE; file->address = address; } return TRUE; } /* get details about the source file */ const gchar * mix_code_file_get_source_path (const mix_code_file_t *file) { g_return_val_if_fail (file != NULL, NULL); return file->source_path; } mdk-1.2.9/intltool-extract.in0000644000175000017500000000000012636565532013066 00000000000000mdk-1.2.9/ylwrap0000755000175000017500000001531212563613157010476 00000000000000#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2013-01-12.17; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: mdk-1.2.9/NEWS0000644000175000017500000004743412636567111007742 00000000000000* GNU MDK -- History of visible changes. Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013, 2014, 2015 Free Software Foundation, Inc. See the end for copying conditions. Please send mdk bug reports to bug-mdk@gnu.org. --------------------------------------------------------------------------- * Version 1.2.9 (23/12/15) ** Bug fixes: - #43985: Added missing instructions SLB,SRB,JAE,JAO,JXE,JXO (from volume 2, section 4.5.2), by Sergey Litvin. - #46456: Documentation fixes, by Joshua Davies. --------------------------------------------------------------------------- * Version 1.2.8 (03/08/14) ** Bug fixes: - #42818: Fixed invalid use of --export-dynamic in Darwin. - #42871: Fixed tautological integer comparisons. - #39817: Fixed compilation with Glib > 2.35.6. - #41097, #4198: Fixed compilation in Darwin systems. - #41097: Fixed compilation with libreadline 6.3.x. - #40359: Check for opcodes during compilation fixed. --------------------------------------------------------------------------- * Version 1.2.7 (23/02/13) - Upgrade to Guile 2.0. Thanks to Aleix Conchillo. - Samples and documentation from TAOCP, via MIXAL. Thanks to Eric S. Raymond. --------------------------------------------------------------------------- * Version 1.2.6 (10/10/10): ** Bug fixes: - mixvm: the instruction MOVE with F=0 is interpreted correctly as a NOP (#31010). - mixasm: no longer limit the index field to 3 bits (#5652) - debugger: breakpoints for I register modification fixed. - Manual: download info updated to point to Git repositories (#29524). - Compilation without Guile works again (#28086). - Parallel compilation with `make -jn' now works (#31018). --------------------------------------------------------------------------- * Version 1.2.5 (11/10/09): ** Bug fixes: - MIXAL: EQU directives without a LOC don't cause an error (#23816). - gmixvm: startup time reduced. ** Maintenance: - Guile API modernized (deprecated gh_* calls are gone). - Migration to latest Glade tool. - Miscellaneous infrastructure improvements (thanks to Aleix Conchillo). --------------------------------------------------------------------------- * Version 1.2.4 (21/03/08) ** Maintenance release: - License changed to GPLv3 - Compilation checked against recent versions GTK+, Glib, Glade &co. - Bug fixes - Darwin compatibility issues fixed (thanks to Aleix Conchillo) --------------------------------------------------------------------------- * Version 1.2.3 (16/08/06) ** GUI improvements: - The external programs dialog has been revamped: - Only proper paths can be introduced for the executables (via a graphical file chooser). - Flags for mixasm are no longer free text, but a check button. - Configurable toolbars (icons, text or both). - Attach/detach buttons in main toolbar are only active when meaningful. - Missing toolbar tooltips added. - 'About' dialog cleaned up. ** Supported platforms: - Fixed compilation for Darwin (thanks to Aleix Conchillo). - Fixed compilation for 64-bit archs (thanks to Baruch Even). --------------------------------------------------------------------------- * Version 1.2.2 (07/08/06) ** MIXAL compliance fixes (thanks to Xiaofeng Zhao): - NOP accepts an F-spec. - Invalid F-spec values are reported as warnings instead of errors, since they can be legitimately (if hackishly) used. ** gmixvm: history popup in terminal input dialog. ** gmixvm: the load file dialog now remembers last directory. ** Bug fixes: - smem in mixvm correctly handles negative zero (thanks to Michael Vernov). - cbpo help string corrected (thanks to Michael Vernov). - I1 and I2 in mixvm swapped to their correct position (closes #15746). - Obsolete CFLAGS for Darwin removed. - mixal-mode.el syncronised with Emacs CVS. - Segmentation fault when clicking Memory title (closes #15910). - Writing to char devices caused an out-of-bounds array access (thanks to Aleix Conchillo). --------------------------------------------------------------------------- * Version 1.2.1 (20/09/05) ** MIXAL compliance improvements (Sergey Poznyakoff): - w-expressions in literals are now admitted (e.g. LDA =8(1:1)=) - ALF now accepts non-quoted arguments (in addition to quoted - ones), as in the original TAOCP definition. ** German translation updated (thanks to Jens Seidel) ** mixal.el improvements (Pieter Pareit) ** Bug fixes: - gmixvm's failure to dynamically link with libglade (#13661) (thanks to Sascha Wilde) - mixal.el calls mixasm with obsolete -g option (#14569) (thanks to Sascha Wilde) - mixasm -g causes a coredump (#14579) (Pieter Pareit) --------------------------------------------------------------------------- * Version 1.2 (05/08/04) ** Graphical user interface (gmixvm) updated to gtk+ 2.4.x - gmixvm now uses the latest version of the gtk+ toolkit, including antialiased Pango fonts. - Individually detachable windows for the virtual machine, the source window and the devices notebook (there is no 'split mode' anymore). - Detachable toolbars. - Current source line and breakpoints are now marked via icons. - New menu option to change all fonts at once. ** German i18n available (thanks to Mike Scholz). Set LANG to de_DE.UTF-8 to use it. ** mixasm includes debug info in compiled mix files by default: the options -g and --debug are gone; if you want to compile without debug info, use -O or --ndebug. --------------------------------------------------------------------------- * Version 1.1 (12/06/04) ** The typewriter device (19) is now input/output, so that you can read characters from standard input (mixvm) or a popup dialog (gmixvm) in your MIXAL programs (see samples/echo.mixal for a simple usage sample). ** Input character device files may now contain lines with less than the required block size; the virtual machine pads the missing characters in memory using 0 (MIX char 'space'). ** The paper tape device (20) was incorrectly defined as an output device. It is now an input char device (cf. TAOCP vol.1 p. 133, where it is mentioned as the 'paper tape reader'; thanks to Michael Talbot-Wilson). ** Listings produced by mixasm improved: better layout, and correct identification of 'ALF' and 'CON' instructions (including those added by the compiler as a result of local constant definitions and future references. ** Local constants can now be modified by a field spec or an index, as in, say, CMPA =0=,1(3:2) (closes #5654). ** The virtual machine reader is now case-insensitive, i.e., it automatically converts lowercase characters in input char device files to their uppercase counterparts (which are the only ones admitted by MIX). The ASCII representation for MIX chars delta, sigma and pi is now ~, [ and #. ** Bug fix: mixvm prompt's ending whitespace is now correctly set. ** Bug fix: blocks in input char devices (e.g. the card reader) are now expected to be separated by newlines, mirroring char output, which is done so (i.e. with one ASCII line per block). ** Improved virtual machine error messages (bad memory address, device no., fspec, etc.). ** Bug fix: undefined symbols are transformed to new addresses just before the end of a compiled program (as per TAOCP v1 p. 156; thanks to WeiZeng). ** Bug fix: the vm no longer blows up on memory access violations (thanks to Joel R. Holveck; closes #5649). ** Bug fix: LDAN, LDXN and LDiN always negate the result, even if zero (thanks to Ruslan Batdalov; closes Debian's #247392). --------------------------------------------------------------------------- * Version 1.0.1 (09/06/03) ** New misc/mixal-mode.el for emacs (and associated docs), written by Pieter Pareit. ** Error message for unquoted ALF operand improved. ** Fixed bug that caused (g)mixvm to segfault when reading a false MIX file. ** All translatable strings are ready for i18n. ** Portability fixes to extend supported platforms. ** When the program counter reaches address 4000 during program execution, it is set back to its maximum value, 3999, and the program halts, to avoid infinite loops. ** Minor documentation improvements. ** Minor bug fixes. --------------------------------------------------------------------------- * Version 1.0 (08/04/02) ** The stable release. ** New command line option added to 'mixvm': -t (--time) to turn on virtual execution time printing (it is now off by default). ** New 'mixvm' command: prompt, lets you change the mixvm command prompt ("MIX > " by default). ** When the program counter reaches address 4000 during program execution, it wraps up to value 0, to keep always a valid address. Caveat: a program missing the HLT instruction can loop indefinitely. ** New supported platform: Mac OS X. ** User manual reviewed and updated. ** Bug fix: 'configure' libraries detection now works properly. ** Bug fix: missing #includes added to avoid compilation errors in some platforms (RedHat 7.1, ia64 with gcc 3.0). --------------------------------------------------------------------------- * Version 0.5 (29/09/01) ** Added Guile support: - New utility 'mixguile': a Guile shell with an embedded MIX virtual machine. - gmixvm and mixvm have an embedded Guile interpreter: Scheme can be used as an extension language. - See the updated User's Manual for details. ** New (g)mixvm commands: - psrc: print the current program's source file path - pprog: print the current program's path - pline: print the current program line - pstat: print the current virtual machine status - slog: set on/off the logging of info messages to stdout (or the command log in gmixvm) ** For the sake of coherence, the following (g)mixvm commands have been renamed: - tracing -> strace - timing -> stime (set on/off timing), ptime (print timing stats) - devdir -> sddir (set the devices dir), pddir (print the devices dir) ** Major documentation update to include Guile support and various cosmetic corrections for pretty ps and pdf manuals (provided in the distribution in addition to the html format). ** In gmixvm, when a font specified in the config file cannot be loaded, it is removed from the configuration. ** gmixvm now accepts the standard command line options -vuh ** Bug fix: when the MIX font is changed in gmixvm, the loc widget font is correctly updated. ** Bug fix: help messages are now correctly aligned in (g)mixvm. ** Bug fix: timing statitics for the MOVE instruction are correctly computed. ** Bug fix: pressing return at an empty 'MIX >' prompt does not produce an error message. ** Bug fix: the configure script now correctly detects the absence of libglade (needed by gmixvm). ** Bug fix: makefiles corrected so that mdk accepts a VPATH build ('make distcheck' works now) --------------------------------------------------------------------------- * Version 0.4.2 (17/08/01) ** New toolbars for gmixvm windows. ** Toolbars can be hidden, using View->Toolbar checkbox. ** New icon for the "goto loc pointer address" button. ** The menu entry "Split windows" has been moved from "Settings" to "View" main menu, and renamed to "One window" in split mode. ** In split mode, the MIXAL window has its own statusbar to display symbol values in it (instead of in the main window toolbar). ** Bug fix: the visibility of split windows when changing mode is now correctly handled. ** Bug fix: the devices window is now correctly destroyed, avoiding GTK warnings on gmixvm exit. --------------------------------------------------------------------------- * Version 0.4 (22/07/01) ** Split mode: gmixvm can now be run with the MIXVM, MIXAL and Devices windows detached (instead of arranged in a notebook). ** When running in split mode, the MIXVM, MIXAL and Devices windows can be hidden. ** Conditional breakpoints can be set in mixvm and gmixvm using the commands 'sbp[rmco]', which cause the execution to stop when a given register, memory cell contents, comparison flag or overflow toggle change (e.g. 'sbpr A' will set a breakpoint on register A contents change). Conditional breakpoints can be deleted using the new commands 'cbp[rmco]'. ** New vm command 'pbt' which prints a backtrace of the last executed instructions. ** The gmixvm main window displays the path to the current MIX file in its title bar. ** The mixvm and gmixvm configuration files are now stored in ~/.mdk (instead of ~/.gmixvm). ** The default device files directory is also ~/.mdk. It can be configured using the new command 'devdir' or (in gmixvm) with the new Settings->Devices dir menu command. ** The commands 'tron' and 'troff' have been substituted by 'tracing on|off'. ** The trace flag is saved as a configuration parameter in mixvm and gmixvm. ** New vm commands: 'pedit'/'sedit' (print/set editor command) and 'pasm'/'sasm' (print/set compile command). Their value is stored as a config param also in mixvm. ** New command 'timing' for setting on/off and printing the timing statistics (both in gmixvm and mixvm). Its value is also stored as a config param. ** mixvm and gmixvm now save a history file so that they remember commands typed in previous sessions. ** Bug fix: changes in the device format are now correctly stored (gmixvm). --------------------------------------------------------------------------- * Version 0.3.5 (23/06/01) ** In gmixvm, when the mouse pointer is over a MIXAL source line, the status bar shows the value of the variables appearing in this line. ** The current symbol table can be displayed, in gmixvm, using the menu command Debug->Symbols... ** Bug fix: the load, compile and run file dialogs now get the correct filename under linux. ** Bug fix: fonts used by gmixvm are now always correctly saved. ** Bug fix: 'psym' now works correctly in gmixvm. ** Bug fix: the symbol table for a MIX file is now correctly recovered both in gmixvm and mixvm (negative values where incorrectly converted to a positive value). --------------------------------------------------------------------------- * Version 0.3.4 (12/06/01) ** Bug fix for a segfault which made gmixvm unusable in version 0.3.3. --------------------------------------------------------------------------- * Version 0.3.3 (10/06/01) ** The output of the contents of binary devices in gmixvm can be configured to be in decimal or word format (for each block device). ** The main gmixvm window is not shown until it is completely drawn. ** The commands 'edit' and 'compile' are now understood by gmixvm. The external programs used can be configured using the menu entry Settings->External programs. ** The commands 'edit' and 'compile' can be now executed without argument (both in mixvm and gmixvm). When no argument is given, the MIXAL source file corresponding to the currently loaded MIX program is edited/compiled. ** Bug in CON fixed : 'CON wexpr' didn't compile correctly unless wexpr represented a valid instruction; now, wexpr can evaluate to an arbitrary value (Vasilij Ozmetelenko). ** The completion key for the gmixvm command prompt is now TAB (instead of RETURN). ** The gmixvm command prompt maintains now a history of previously typed commands, which can be visited using the arrow keys (UP for previous command, DOWN for next one). ** When a file is reloaded by the virtual machine (both in mixvm and gmixvm), the currently set breakpoints are conserved. ** When compiling a source file which is not in the current directory, the correct path is now stored in the compiled file. ** Fixed a bug which caused gmixvm to segfault when creating the virtual machine (Andrew Hood) ** The GNU MDK documentation is now distributed under the GFDL license. --------------------------------------------------------------------------- * Version 0.3.2 (10/05/01) ** The colors used for highlighting MIXAL source lines in gmixvm are now customizable. ** The fonts used in the different gmixvm widgets are now customizable. ** Input/output for all MIX block devices is shown in gmixvm. ** All gmixvm customizations are stored in a configuration file (inside ~/.gmixvm directory). ** Device files used by gmixvm are stored in ~/.gmixvm, instead of the working directory. ** Output to binary devices works now correctly. ** Bug on pmem fixed (thanks to Christoph von Nathusius and Jason Uhlenkott). --------------------------------------------------------------------------- * Version 0.3.1 (9/04/01) ** New binary and html RPMs (RedHat) contributed by Agustin Navarro . ** The package can be correctly build in FreeBSD 4.2 (Ying-Chieh Liao) ** Fixed configuration process when included gettext is used. ** The info files are now properly categorized in a dir entry, so that they can be properly installed. ** Compilation warnings fixed. ** getopt implementation provided for systems missing it. --------------------------------------------------------------------------- * Version 0.3 (28/03/01) ** MDK is now an official GNU package. ** New GTK+ interface for the virtual machine (gmixvm). ** New mixvm-Emacs/GUD interface via mixvm.el (Philip King). ** Readline and history support for mixvm are now optional features. ** JRED is now properly implemented (bug pointed out by Vasilij Ozmetelenko). --------------------------------------------------------------------------- * Version 0.2 (07/01/01) ** mixvm provides virtual execution time statistics after each invocation of run or next. ** mixvm can trace instructions as they are executed. tron/troff commands turn on/off instruction tracing. ** mixvm accepts a new command, w2d, which computes the decimal value of a MIX word given as a series of bytes (e.g. - 01 00 34 32 22). ** Symbols can be defined at the mixvm prompt with the new command ssym. ** mixvm accepts a new command, weval, which allows the evaluation of MIXAL w-expressions. ** Expressions containing strings of successive '*' are now correctly evaluated. ** When using block devices in mixvm, the buffers are now flushed after each OUT operation. --------------------------------------------------------------------------- * Version 0.1.1 (18/11/00) ** MDK is now compilable in rpm-based linuxes. ** MDK fully compliant with Knuth's specification. In particular, local symbols are now properly handled in special cases such as 3H ORIG 3B instructions. See samples/stress{1,2}.mixal. ** Future references affected by unary minus are accepted with a warning (they are banned in Knuth's specification). Also future refs in EQU directives are now properly handled. See samples/stress{3,4}.mixal. ** When mixvm executes a program and reaches the end of the available memory without encountering a HALT instruction, it halts anyway. --------------------------------------------------------------------------- * Version 0.1 (31/10/00) ** Initial version --------------------------------------------------------------------------- * Copying information: Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013, 2014, 2015 Free Software Foundation, Inc. Permission is granted to anyone to make or distribute verbatim copies of this document as received, in any medium, provided that the copyright notice and this permission notice are preserved, thus giving the recipient permission to redistribute in turn. Permission is granted to distribute modified versions of this document, or of portions of it, under the above conditions, provided also that they carry prominent notices stating who last changed them. -- ;;; Local Variables: ;;; mode: outline ;;; End: mdk-1.2.9/autogen.sh0000755000175000017500000000350512112755472011231 00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir PROJECT=mdk TEST_TYPE=-d FILE=mixlib DIE=0 grep "^AM_GNU_GETTEXT" $srcdir/configure.ac >/dev/null && { (gettext --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`gettext' installed to compile $PROJECT." echo "(0.13.1 or a newer version if it is available)" DIE=1 } } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have autoconf installed to compile $PROJECT." echo "(2.53 or a newer version if it is available)" DIE=1 } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have automake installed to compile $PROJECT." echo "(1.5 or a newer version if it is available)" DIE=1 NO_AUTOMAKE=yes } # if no automake, don't bother testing for aclocal test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: Missing \`aclocal'. The version of \`automake'" echo "installed doesn't appear recent enough." DIE=1 } if test "$DIE" -eq 1; then exit 1 fi test $TEST_TYPE $FILE || { echo "You must run this script in the top-level $PROJECT directory" exit 1 } case $CC in *xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;; esac echo "Running gettext's autopoint..." autopoint --force echo "Running intltoolize" intltoolize --copy --force --automake ACLOCAL_FLAGS="-I m4" echo "Running aclocal ..." aclocal $ACLOCAL_FLAGS # optionally feature autoheader (autoheader --version) < /dev/null > /dev/null 2>&1 && autoheader # changelog file touch ChangeLog echo "Running automake --add-missing --gnu $am_opt ..." automake -a --gnu $am_opt echo "Running autoconf ..." autoconf cd $ORIGDIR mdk-1.2.9/mixutils/0000755000175000017500000000000012636571405011166 500000000000000mdk-1.2.9/mixutils/mixasm_comp.c0000644000175000017500000000435312112755472013570 00000000000000/* -*-c-*- -------------- mixasm_comp.c : * Implementation of the functions declared in mixasm_comp.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include "mixasm_comp.h" int mix_asm_compile(const gchar *src, const gchar *out, gboolean use_list, const gchar *list, gboolean debug) { int result = EXIT_SUCCESS; mix_parser_t *parser; mix_parser_err_t error; if ( (parser = mix_parser_new(src)) == NULL ) { fprintf(stderr, _("*** Unable to open source file %s\n"), src); return EXIT_FAILURE; } if ( mix_parser_compile(parser) == MIX_PERR_OK ) { guint k; if ( ( k = mix_parser_warning_count(parser) ) != 0 ) fprintf(stderr, _("(%d warning(s))\n"), k); if ( (error = mix_parser_write_code(parser, out, debug)) != MIX_PERR_OK ) { fprintf(stderr, _("*** Error writing output code file: %s\n"), mix_parser_err_string(error)); result = EXIT_FAILURE; } else if ( use_list && (error = mix_parser_write_listing(parser, list)) != MIX_PERR_OK) { fprintf(stderr, _("*** Error writing listing file: %s\n"), mix_parser_err_string(error)); result = EXIT_FAILURE; } } else { fprintf(stderr, _("(%d warning(s), %d error(s))\n"), mix_parser_warning_count(parser), mix_parser_err_count(parser)); result = EXIT_FAILURE; } mix_parser_delete(parser); return result; } mdk-1.2.9/mixutils/mixvm_command.h0000644000175000017500000000240412112755472014112 00000000000000/* -*-c-*- ---------------- mixvm_command.h : * Declarations for commands accepted by the mix virtual machine * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXVM_COMMAND_H #define MIXVM_COMMAND_H #include #include extern mix_vm_cmd_dispatcher_t * mixvm_cmd_init (mix_config_t *config, char *arg, gboolean use_emacs); extern gboolean mixvm_cmd_exec (char *line); #endif /* MIXVM_COMMAND_H */ mdk-1.2.9/mixutils/mixasm_comp.h0000644000175000017500000000223512112755472013572 00000000000000/* -*-c-*- ---------------- mixasm_comp.h : * Declarations of functions used to compile mix source files. * ------------------------------------------------------------------ * Copyright (C) 2000, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXASM_COMP_H #define MIXASM_COMP_H #include extern int mix_asm_compile(const gchar *src, const gchar *out, gboolean use_list, const gchar *list, gboolean debug); #endif /* MIXASM_COMP_H */ mdk-1.2.9/mixutils/mixvm_loop.h0000644000175000017500000000242212112755472013445 00000000000000/* -*-c-*- ---------------- mixvm_loop.h : * Declarations for functions controlling the mixvm loop. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXVM_LOOP_H #define MIXVM_LOOP_H extern void mix_vmloop (int argc, char *argv[], gboolean initfile, const gchar *code_file, gboolean use_emacs); extern void mix_vmrun (const gchar *code_file, gboolean dump, gboolean ptime); extern void mix_vmloop_set_prompt (const gchar *prompt); #endif /* MIXVM_LOOP_H */ mdk-1.2.9/mixutils/mixasm.c0000644000175000017500000000643212112755472012552 00000000000000/* -*-c-*- -------------- mixasm.c: * Main function of mixasm, the mix assembler * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #ifdef HAVE_GETOPT_LONG # include #else # include #endif /* HAVE_GETOPT_LONG */ #include "mixasm_comp.h" enum { VER_OPT = 'v', HELP_OPT = 'h', USAGE_OPT = 'u', OUT_OPT = 'o', LIST_OPT = 'l', NDEBUG_OPT = 'O' }; static struct option long_options_[] = { {"version", no_argument, 0, VER_OPT}, {"help", no_argument, 0, HELP_OPT}, {"usage", no_argument, 0, USAGE_OPT}, {"output", required_argument, 0, OUT_OPT}, {"list", optional_argument, 0, VER_OPT}, {"ndebug", no_argument, 0, NDEBUG_OPT}, {0, 0, 0, 0} }; static const gchar *USAGE_ = N_("Usage: %s [-vhulO] [-o OUTPUT_FILE] [--version] [--help]\n" "\t[--usage] [--ndebug] [--output=OUTPUT_FILE] [--list[=LIST_FILE]] file\n"); int main (int argc, char **argv) { int c; const char *prog_name = argv[0]; const char *src = NULL, *out = NULL, *list = NULL; gboolean use_list = FALSE, debug = TRUE; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); while (1) { /* -g option is still available, but is no longer used */ c = getopt_long (argc, argv, "vhuo:lOg", long_options_, (int*)0); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case HELP_OPT: case USAGE_OPT: fprintf (stderr, _(USAGE_), prog_name); return EXIT_SUCCESS; case VER_OPT: mix_print_license ("mixasm, MIX assembler"); return EXIT_SUCCESS; case OUT_OPT: out = optarg; break; case LIST_OPT: use_list = TRUE; list = optarg; break; case NDEBUG_OPT: debug = FALSE; break; case 'g': /* used to be the switch to create debug version, not needed anymore */ break; case '?': /* getopt already handles the output of a warning message */ fprintf (stderr, _("(Try: %s -h)\n"), prog_name); return EXIT_FAILURE; default: g_assert_not_reached (); } } if ( optind == argc ) { fprintf (stderr, _("*** Error: Missing source file.\n")); return EXIT_FAILURE; } if ( optind < argc-1 ) { fprintf (stderr, _("*** Error: Too many input files.\n")); return EXIT_FAILURE; } src = argv[optind]; mix_init_lib (); c = mix_asm_compile (src, out, use_list, list, debug); mix_release_lib (); return c; } mdk-1.2.9/mixutils/mixvm.c0000644000175000017500000000664212622454575012425 00000000000000/* -*-c-*- -------------- mixvm.c : * Main function for mixvm, the mix vm simulator * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #ifdef HAVE_GETOPT_LONG # include #else # include #endif /* HAVE_GETOPT_LONG */ #include "mixvm_loop.h" enum { VER_OPT = 'v', HELP_OPT = 'h', USAGE_OPT = 'u', RUN_OPT = 'r', DUMP_OPT = 'd', TIME_OPT = 't', EMACS_OPT = 'e', /* used by mixvm-gud only */ NOINIT_OPT = 'q' }; static const char *options_ = "vhurdt"; /* no short opt for --emacs */ static struct option long_options_[] = { {"version", no_argument, 0, VER_OPT}, {"help", no_argument, 0, HELP_OPT}, {"usage", no_argument, 0, USAGE_OPT}, {"run", required_argument, 0, RUN_OPT}, {"dump", no_argument, 0, DUMP_OPT}, {"time", no_argument, 0, TIME_OPT}, /* pek: yo! */ {"emacs", no_argument, 0, EMACS_OPT}, {"noinit", no_argument, 0, NOINIT_OPT}, {0, 0, 0, 0} }; static const gchar *USAGE_ = N_("Usage: %s [-vhurdqt] [--version] [--help] [--noinit] [--usage]" "\n\t[--run] [--dump] [--time] [MIX_FILE]\n"); int main (int argc, char **argv) { int c; const char *prog_name = argv[0]; const char *in = NULL; gboolean run = FALSE; gboolean dump = FALSE; gboolean emacs = FALSE; gboolean initfile = TRUE; gboolean ptime = FALSE; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); while (1) { c = getopt_long (argc, argv, options_, long_options_, (int*)0); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case HELP_OPT: case USAGE_OPT: fprintf (stderr, _(USAGE_), prog_name); return EXIT_SUCCESS; case VER_OPT: mix_print_license ("mixvm, MIX virtual machine"); return EXIT_SUCCESS; case RUN_OPT: in = optarg; run = TRUE; break; case DUMP_OPT: dump = TRUE; break; case TIME_OPT: ptime = TRUE; break; case '?': /* getopt already handles the output of a warning message */ fprintf (stderr, _("(Try: %s -h)\n"), prog_name); return EXIT_FAILURE; case EMACS_OPT: emacs = TRUE; break; case NOINIT_OPT: initfile = FALSE; break; default: g_assert_not_reached (); } } if ( optind < argc-1 ) { fprintf (stderr, _("*** Error: Too many input files.\n")); return EXIT_FAILURE; } if (!in) in = argv[optind]; mix_init_lib (); if (run) mix_vmrun (in, dump, ptime); else mix_vmloop (argc, argv, initfile, in, emacs); mix_release_lib (); return EXIT_SUCCESS; } mdk-1.2.9/mixutils/Makefile.am0000644000175000017500000000176012262430211013126 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2002, 2006, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. LDADD = $(top_builddir)/mixlib/libmix.a $(top_builddir)/lib/libreplace.a \ $(INTLLIBS) if MAKE_GUILE AM_CFLAGS += -I$(includedir) -I$(top_srcdir) -DMAKE_GUILE LDADD += $(top_builddir)/mixguile/libmixguile.a else AM_CFLAGS += -I$(includedir) -I$(top_srcdir) endif bin_PROGRAMS = mixasm mixvm mixasm_SOURCES = mixasm.c mixasm_comp.h mixasm_comp.c mixvm_SOURCES = mixvm.c mixvm_loop.h mixvm_loop.c mixvm_command.h \ mixvm_command.c mdk-1.2.9/mixutils/mixvm_loop.c0000644000175000017500000001043512112755472013443 00000000000000/* -*-c-*- -------------- mixvm_loop.c : * Implementation of mix vm command loop. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2004, 2006, 2007, 2009, 2010 Free * Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ #include #include #include #include #include #include #include #ifdef MAKE_GUILE #include #endif #include "mixvm_command.h" #include "mixvm_loop.h" #ifdef HAVE_LIBHISTORY # include #else # define add_history(x) ((void)0) #endif #ifdef HAVE_LIBREADLINE # include #else /* !HAVE_LIBREADLINE */ static char * readline (char *prompt) { enum {LINE_LEN = 256}; char *line = g_new (char, LINE_LEN); printf ("%s", prompt); return fgets (line, LINE_LEN, stdin); } #endif /* HAVE_LIBREADLINE */ /* A static variable for holding the line. */ static char *line_read = (char *)NULL; #define PROMPT_LEN 128 static char PROMPT[PROMPT_LEN + 1] = {'M', 'I', 'X', '>', ' '}; static const char *CONFIG_FILE_ = "mixvm.config"; static const char *PROMPT_KEY_ = "Prompt"; /* Read a string, and return a pointer to it. Returns NULL on EOF. */ static char * rl_gets () { /* If the buffer has already been allocated, return the memory to the free pool. */ if (line_read) { g_free (line_read); line_read = (char *)NULL; } /* Get a line from the user. */ line_read = readline ((char *)PROMPT); /* If the line has any text in it, save it on the history. */ if (line_read && *line_read) add_history (line_read); return (line_read); } /* The main command loop of the virtual machine */ static mix_config_t *config_ = NULL; static mix_vm_cmd_dispatcher_t * init_mixvm_ (const gchar *file, gboolean use_emacs) { static const gchar *HISTORY_FILE = "mixvm.history"; static gint HISTORY_SIZE = 100; config_ = mix_config_new (NULL, CONFIG_FILE_); mix_config_set_autosave (config_, TRUE); if (!mix_config_get_history_file (config_)) mix_config_set_history_file (config_, HISTORY_FILE); if (mix_config_get_history_size (config_) == 0) mix_config_set_history_size (config_, HISTORY_SIZE); mix_vmloop_set_prompt (mix_config_get (config_, PROMPT_KEY_)); return mixvm_cmd_init (config_, (char *)file, use_emacs); } void mix_vmloop_set_prompt (const gchar *prompt) { if (prompt) { g_snprintf (PROMPT, PROMPT_LEN, "%s ", prompt); mix_config_update (config_, PROMPT_KEY_, prompt); } } static void loop_ (void *closure, int argc, char *argv[]) { while ( mixvm_cmd_exec (rl_gets ()) ) ; mix_config_delete (config_); } void mix_vmloop (int argc, char *argv[], gboolean initfile, const gchar *file, gboolean use_emacs) { #ifdef MAKE_GUILE mix_vm_cmd_dispatcher_t *dis = init_mixvm_ (file, use_emacs); mixguile_init (argc, argv, initfile, loop_, dis); #else (void) init_mixvm_ (file, use_emacs); loop_ (NULL, argc, argv); #endif } /* run a program and exit */ void mix_vmrun (const gchar *code_file, gboolean dump, gboolean ptime) { gchar *time_cmd = ptime? g_strdup ("stime on") : g_strdup ("stime off"); gchar *run_cmd = g_strdup ("run"); gchar *dump_cmd = dump? g_strdup ("pall") : NULL; gboolean result; init_mixvm_ (code_file, FALSE); result = mixvm_cmd_exec (time_cmd) && mixvm_cmd_exec (run_cmd); if (result && dump) mixvm_cmd_exec (dump_cmd); mix_config_set_autosave (config_, FALSE); mix_config_delete (config_); g_free(time_cmd); g_free(run_cmd); if (dump_cmd) g_free(dump_cmd); } mdk-1.2.9/mixutils/Makefile.in0000644000175000017500000005252212636565536013171 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2000, 2001, 2002, 2006, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @MAKE_GUILE_TRUE@am__append_1 = -I$(includedir) -I$(top_srcdir) -DMAKE_GUILE @MAKE_GUILE_TRUE@am__append_2 = $(top_builddir)/mixguile/libmixguile.a @MAKE_GUILE_FALSE@am__append_3 = -I$(includedir) -I$(top_srcdir) bin_PROGRAMS = mixasm$(EXEEXT) mixvm$(EXEEXT) subdir = mixutils ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_mixasm_OBJECTS = mixasm.$(OBJEXT) mixasm_comp.$(OBJEXT) mixasm_OBJECTS = $(am_mixasm_OBJECTS) mixasm_LDADD = $(LDADD) am__DEPENDENCIES_1 = mixasm_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a \ $(top_builddir)/lib/libreplace.a $(am__DEPENDENCIES_1) \ $(am__append_2) am_mixvm_OBJECTS = mixvm.$(OBJEXT) mixvm_loop.$(OBJEXT) \ mixvm_command.$(OBJEXT) mixvm_OBJECTS = $(am_mixvm_OBJECTS) mixvm_LDADD = $(LDADD) mixvm_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a \ $(top_builddir)/lib/libreplace.a $(am__DEPENDENCIES_1) \ $(am__append_2) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(mixasm_SOURCES) $(mixvm_SOURCES) DIST_SOURCES = $(mixasm_SOURCES) $(mixvm_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ $(am__append_1) $(am__append_3) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LDADD = $(top_builddir)/mixlib/libmix.a \ $(top_builddir)/lib/libreplace.a $(INTLLIBS) $(am__append_2) mixasm_SOURCES = mixasm.c mixasm_comp.h mixasm_comp.c mixvm_SOURCES = mixvm.c mixvm_loop.h mixvm_loop.c mixvm_command.h \ mixvm_command.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mixutils/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu mixutils/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) mixasm$(EXEEXT): $(mixasm_OBJECTS) $(mixasm_DEPENDENCIES) $(EXTRA_mixasm_DEPENDENCIES) @rm -f mixasm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixasm_OBJECTS) $(mixasm_LDADD) $(LIBS) mixvm$(EXEEXT): $(mixvm_OBJECTS) $(mixvm_DEPENDENCIES) $(EXTRA_mixvm_DEPENDENCIES) @rm -f mixvm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mixvm_OBJECTS) $(mixvm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixasm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixasm_comp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixvm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixvm_command.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixvm_loop.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/mixutils/mixvm_command.c0000644000175000017500000001630512622454575014120 00000000000000/* -*-c-*- -------------- mixvm_command.c : * Implementation of the functions declared in mixvm_command.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2004, 2006, 2007, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #ifdef HAVE_LIBREADLINE # include # include # ifndef HAVE_RL_COMPLETION_MATCHES /* old versions of rl don't use rl_ */ # define rl_completion_matches completion_matches # endif #endif /* HAVE_LIBREADLINE */ #include #include #include #include #include #ifdef MAKE_GUILE # include static gboolean try_guile_ (char *line) { if (line[0] == '(') { if (line[strlen (line) -1] != ')') return FALSE; mixguile_interpret_command (line); return TRUE; } return FALSE; } #else /* !MAKE_GUILE */ # define try_guile_(ignored) FALSE #endif /* MAKE_GUILE */ #include "mixvm_loop.h" #include "mixvm_command.h" /* mixvm dispatcher */ static mix_vm_cmd_dispatcher_t *dis_ = NULL; static mix_config_t *config_ = NULL; /* The names of functions that actually do the manipulation. */ #define DEC_FUN(name) \ static gboolean cmd_##name (mix_vm_cmd_dispatcher_t *dis, const char *arg) DEC_FUN (shell_); DEC_FUN (quit_); DEC_FUN (prompt_); mix_vm_command_info_t commands[] = { { "prompt", cmd_prompt_, N_("Set command prompt"), "prompt PROMPT" }, { "shell", cmd_shell_, N_("Execute shell command"), "shell COMMAND" }, { "quit", cmd_quit_, N_("Quit the program"), "quit" }, { (char *)NULL, NULL, (char *)NULL } }; #ifdef HAVE_LIBREADLINE /* readline functions */ static char * mixvm_cmd_generator_ (const char *text, int state); /* Attempt to complete on the contents of TEXT. START and END bound the region of rl_line_buffer that contains the word to complete. TEXT is the word to complete. We can use the entire contents of rl_line_buffer in case we want to do some simple parsing. Return the array of matches, or NULL if there aren't any. */ static char ** mixvm_cmd_completion_ (char *text, int start, int end) { char **matches; matches = (char **)NULL; /* If this word is at the start of the line, then it is a command to complete. Otherwise it is the name of a file in the current directory. */ if (start == 0) matches = rl_completion_matches (text, mixvm_cmd_generator_); return (matches); } /* Generator function for command completion. STATE lets us know whether to start from scratch; without any state (i.e. STATE == 0), then we start at the top of the list. */ static char * mixvm_cmd_generator_ (const char *text, int state) { static const GList *comp = NULL; char *prefix = NULL; char *name = NULL; /* If this is a new word to complete, initialize now. */ if (!state) { if (prefix) g_free (prefix); comp = mix_vm_cmd_dispatcher_complete (dis_, text, &prefix); } /* Return the next name which partially matches from the command list. */ if (comp) { name = g_strdup ((const gchar *)comp->data); comp = comp->next; } return name; } #endif /* HAVE_LIBREADLINE */ /* emacs interface */ static void emacs_output_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { /* pek: probably bad that we snag the src w/every emacs_output_, however when multiple files are supported then this will have to be done each time (but the info will be snagged from elsewhere...) */ const mix_vm_t *vm = mix_vm_cmd_dispatcher_get_vm (dis); const mix_src_file_t *src = mix_vm_get_src_file (vm); const gchar *path = mix_src_file_get_path (src); mix_address_t loc = mix_vm_get_prog_count (vm); guint lineno = mix_vm_get_address_lineno (vm, loc); printf ("\032\032mixvm:%s%s:%d\n", path, MIX_SRC_DEFEXT, lineno); return; } static int cmd_quit_ (mix_vm_cmd_dispatcher_t *dis, const char *arg) { puts (_("Quitting ...")); if (dis_) mix_vm_cmd_dispatcher_delete (dis_); if (config_) mix_config_delete (config_); exit (0); /* pek: anything needed here to make the marker disappear??? */ return FALSE; } static int cmd_shell_ (mix_vm_cmd_dispatcher_t *dis, const char *arg) { system (arg); return TRUE; } static int cmd_prompt_ (mix_vm_cmd_dispatcher_t *dis, const char *arg) { if (arg && strlen (arg)) mix_vmloop_set_prompt (arg); return TRUE; } /* external interface */ static void init_dis_ (mix_vm_cmd_dispatcher_t *dis) { static const gchar * envars[] = { "MDK_EDITOR", "X_EDITOR", "EDITOR", "VISUAL" }; static const guint s = sizeof (envars) / sizeof (envars[0]); static const gchar *editor = NULL; gchar *edit = NULL; if (!editor) { int k; for (k = 0; k < s; k++) if ( (editor = getenv (envars[k])) != NULL ) break; } if (!editor) editor = "vi"; edit = g_strconcat (editor, " %s", NULL); mix_vm_cmd_dispatcher_set_editor (dis, edit); g_free (edit); mix_vm_cmd_dispatcher_set_assembler (dis, "mixasm %s"); } mix_vm_cmd_dispatcher_t * mixvm_cmd_init (mix_config_t *config, char *arg, gboolean use_emacs) { int k; #ifdef HAVE_LIBREADLINE /* Tell the completer that we want a crack first. */ rl_attempted_completion_function = (rl_completion_func_t *)mixvm_cmd_completion_; #endif /* HAVE_LIBREADLINE */ /* initialise the dispatcher */ config_ = config; dis_ = mix_vm_cmd_dispatcher_new_with_config (stdout, stderr, config_); if ( dis_ == NULL) g_error (_("Failed initialisation (no memory resources)")); init_dis_ (dis_); /* add local commands */ k = 0; while (commands[k].name) { mix_vm_cmd_dispatcher_register_new (dis_, commands + k); ++k; } /* install post hook for emacs interaction */ if (use_emacs) { mix_vm_cmd_dispatcher_post_hook (dis_, MIX_CMD_LOAD, emacs_output_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_, MIX_CMD_RUN, emacs_output_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_, MIX_CMD_NEXT, emacs_output_, NULL); } if (arg) mix_vm_cmd_dispatcher_dispatch (dis_, MIX_CMD_LOAD, arg); return dis_; } gboolean mixvm_cmd_exec (char *line) { if (!line) return cmd_quit_(dis_, NULL); /* strip white space */ line = g_strstrip(line); if (strlen (line) == 0) return TRUE; if (try_guile_ (line)) return TRUE; (void)mix_vm_cmd_dispatcher_dispatch_text (dis_, line); return TRUE; } mdk-1.2.9/Makefile.in0000644000175000017500000006733212636565535011317 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2000, 2001, 2004, 2006, 2013, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = intl/Makefile CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/intl/Makefile.in ABOUT-NLS AUTHORS COPYING \ ChangeLog INSTALL NEWS README THANKS compile config.guess \ config.rpath config.sub depcomp install-sh missing \ mkinstalldirs ylwrap DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = $(top_builddir)/doc dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = config.rpath ABOUT-NLS intltool-extract.in intltool-merge.in \ autogen.sh intltool-update.in ChangeLog.1 ChangeLog.2 SUBDIRS = po intl doc lib mixlib mixguile mixutils mixgtk misc samples ACLOCAL_AMFLAGS = -I m4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ --with-included-gettext \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-local \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-local distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-am uninstall uninstall-am .PRECIOUS: Makefile distclean-local: rm -f intltool-extract rm -f intltool-merge rm -f intltool-update dist-hook: $(SHELL) $(top_srcdir)/ChangeLog > $(top_distdir)/ChangeLog # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/mixgtk/0000755000175000017500000000000012636571405010613 500000000000000mdk-1.2.9/mixgtk/mixgtk_wm.h0000644000175000017500000000243212112755472012710 00000000000000/* -*-c-*- ---------------- mixgtk_wm.h : * Functions for window management * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_WM_H #define MIXGTK_WM_H #include "mixgtk.h" typedef enum { MIXGTK_MIXVM_WINDOW, MIXGTK_MIXAL_WINDOW, MIXGTK_DEVICES_WINDOW } mixgtk_window_id_t; extern gboolean mixgtk_wm_init (void); extern void mixgtk_wm_attach_window (mixgtk_window_id_t w); extern void mixgtk_wm_detach_window (mixgtk_window_id_t w); #endif /* MIXGTK_WM_H */ mdk-1.2.9/mixgtk/mixgtk.glade0000644000175000017500000047321712112755472013047 00000000000000 gmixvm gmixvm-main 650 550 True 2 vertical 2 True True _File True _Load True Load a MIX file True False True gtk-open gtk-edit True Edit a MIXAL source file True True _Compile True Compile a MIXAL source file True False True gtk-execute True E_xit True Exit application True False True gtk-quit True De_bug True _Run True Run program True False True gtk-media-play _Next True Execute next instruction True False True gtk-media-next _Clear breakpoints True Clear all set breakpoints True False True gtk-clear _Symbols True Show the symbol table True False True gtk-index True Vie_w True _Toolbars True True False True _Show Toolbars True True _Style True True Show only icons in toolbar buttons _Icons True True True Show only labels in toolbar buttons _Labels True True tb_style_icons True Show both icons and labels in toolbar buttons _Both True True tb_style_icons True _Sideways True True tb_style_icons True gtk-preferences _Detached windows True True False True _Virtual machine True True _Source True True _Devices True True gtk-dnd-multiple True S_ettings True Change _font True True False True _Virtual machine True True _Source True True Command _prompt True True Command l_og True True _Devices True True Symbol _list True True True Change all fonts at once _All True True gtk-select-font _Device output True Change format of binary devices output True False True gtk-directory De_vices dir True True False True gtk-home E_xternal programs True True False True gtk-execute True _Save True Save current settings True False True gtk-save True Toogle save settings on exit Save on _exit True True _Help True _About True True False True gtk-about False 0 True True icons True Load MIX program True Open True gtk-open False True True Compile MIXAL source True Compile True gtk-execute False True True Edit MIXAL source True Edit True gtk-justify-fill False True True False True Run True Run True gtk-go-forward False True True Next True Next True gtk-goto-last False True True Clear breakpoints True Clear True gtk-clear False True True Symbol table True Symbols True gtk-index False True True False True Device directory Devdir True gtk-home False True True Output format Format True gtk-zoom-100 False True True External programs Programs True gtk-properties False True True False True Detach window Detach True gtk-dnd-multiple False True True Attach all windows True Attach True gtk-dnd False True False False 3 1 True True 1 True True True False True vertical True False automatic automatic in True False word 3 4 0 True True True Enter MIXVM command here False False 1 True True 2 True False False 3 Enter value False True mouse dialog True vertical True 5 0 0 True True True GDK_KEY_PRESS_MASK 28 0 88 64 0 0 True True GDK_KEY_PRESS_MASK 2 3 0 144 32 0 0 True True GDK_BUTTON_PRESS_MASK 2 3 0 176 32 0 0 True True GDK_KEY_PRESS_MASK 2 3 0 208 32 0 0 True True GDK_KEY_PRESS_MASK 2 3 0 238 32 0 0 True True GDK_KEY_PRESS_MASK 2 3 0 112 32 0 0 True True GDK_KEY_PRESS_MASK 1 2 + 88 32 0 0 True Decimal center 14 68 0 0 True Bytes center 15 36 0 0 True Enter value center 112 8 2 True end gtk-cancel -6 True True True False True False False 0 gtk-clear True True True False True False False False 1 gtk-ok -5 True True True False True False False 2 False False end 0 Go to memory cell False True mouse dialog True vertical True 12 vertical True Go to address: center 0 True True True True False False 10 1 False False 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True True False True False False 1 False end 0 4 Select Font True center-on-parent dialog True 4 True True True False True True True False True True True False Device output format True center-on-parent 320 140 dialog True vertical True S_et all 0 0 True True False Set all devices to current format True 233 31 0 0 True Device center 24 10 0 0 True Format center 24 38 183 25 True tape0 tape1 tape2 tape3 tape4 tape5 tape6 tape7 disk0 disk1 disk2 disk3 disk4 disk5 disk6 disk7 90 2 Word 0 0 True True False Show output as MIX words True True 89 34 Decimal 0 0 True True False Show output as decimal numbers True True wordradio 154 34 False end 2 True end gtk-cancel -6 True True True False True False False 0 gtk-apply -10 True True True False True False False 1 gtk-ok -5 True True True False True False False 2 False end 0 1 External programs False True center-on-parent dialog True vertical True vertical True True 9 0 0 True True Enter the arguments for the editor. %s will be substituted by the full path to the MIXAL file to edit. -e vi %s 168 24 0 0 True Editor command and arguments (e.g -e vi %s) 8 151 31 True False False 8 24 0 True 9 0 0 True 0.47999998927116394 0.52999997138977051 MIX asssembler path True 8 8 151 31 True False False Select mixasm executable 8 32 Generate listing file 152 24 True True False If checked, mixasm will be called with the --listing flag. True False True 176 32 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Symbol table 245 265 dialog True vertical True False automatic automatic in True True False True True 2 True end True True False True 0 0 True 2 True gtk-close False False 0 True _Close True False False 1 False False 0 False end 0 MIXAL source 570 225 True vertical True True True 2 icons True Run True Run True gtk-go-forward False True True Next True Step True gtk-goto-last False True True Clear breakpoints True Clear True gtk-clear False True True Symbol table True Symbols True gtk-index False True True False True Source code font True Font True gtk-select-font False True True False True Attach window True Attach True gtk-dnd False True False False 0 True 1 True False False 2 Devices 550 250 True vertical True True True 2 icons True Device directory True Directory True gtk-home False True True Output format True Output True gtk-zoom-100 False True True False True Change output font True Font True gtk-select-font False True True False True Attach window True Attach True gtk-dnd False True False False 0 True 1 Devices directory False True center dialog True vertical True 25 11 True Directory center False False 0 True True False 1 gtk-open True True False True False False 2 False 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False False end 0 Virtual machine 640 268 True vertical True True True icons True Change font True Font True gtk-select-font False True True False True Attach window True Attach True gtk-dnd False True False False 0 True 5 0 True True 1 vertical 1 True 2 0 True 8 3 6 11 6 0 0 True A center GTK_FILL 0 0 True I1 center 2 3 GTK_FILL 0 0 True I2 center 2 3 1 2 GTK_FILL 0 0 True True True False 19 1 2 0 0 True True False 9 3 4 1 2 0 0 True True False 9 3 4 0 0 True X center 1 2 GTK_FILL 16 16 True I3 center 2 3 2 3 GTK_FILL 0 0 True I4 center 4 5 GTK_FILL 16 16 True I5 center 4 5 1 2 GTK_FILL 16 16 True I6 center 4 5 2 3 GTK_FILL 0 0 True J center 2 3 GTK_FILL 0 0 True True False 19 1 2 1 2 0 0 True True False 9 5 6 0 0 True True False 9 5 6 1 2 0 0 True True False 9 5 6 2 3 0 0 True True False 9 3 4 2 3 True 0 0 True True False 9 False False 0 1 2 2 3 GTK_FILL GTK_FILL True 2 Registers label_item False 5 0 True True 2 0 True 1 5 G 0 0 True True False Greater 2 True True False False 0 E 0 0 True True False Equal 2 True True greater_radio False False 1 L 0 0 True True False Lesser 2 True True greater_radio False False 2 7 True False False 3 Overflow True True False True True False False 4 True 2 Flags label_item False False 0 True 2 0 True 4 1 0 0 True True False 4 6 0 False False 5 0 True True False View loc address True gtk-jump-to False False 1 1 True 2 Location label_item False False end 2 False 5 1 True 2 0 True 5 5 True 0 0 True Uptime: False False 0 0 0 True 5 00000000 center False False 1 0 0 True Elapsed: False False 3 2 0 0 True 5 000000 center False False 3 0 0 True Program: False False 2 4 0 0 True 5 000000 center False False 5 True 2 Times center label_item False 5 2 False False 2 0 True 7 0 True True 5 automatic automatic in True True GDK_BUTTON_PRESS_MASK True True 2 Memory label_item 3 end 1 True 2 MIX Virtual Machine label_item 1 True MIX Console input False True center-on-parent dialog True vertical True 3 vertical True True Enter up to 70 characters False False 0 True True 70 True 70 False False 1 False False 2 True end gtk-ok -5 True True True True False True False False 0 False end 0 2 About gmixvm False True center-on-parent dialog False True vertical True 3 0 0 True True 15 vertical 10 True 0 <b>MIX virtual machine</b> <small>(GNU MDK)</small> True center 0 52 16 True 0 label223 center False 1 True True 0 http://www.gnu.org/software/mdk/mdk.html True center True False False 2 True True 0 <small>Please send bug reports to bug-mdk@gnu.org</small> True center True True False 3 True 0 <small>Copyright (C) 2001-2009 Free Software Foundation, Inc</small> True center False False 4 1 True spread gtk-ok -5 True True True True True False 1 True False False 0 False end 0 mdk-1.2.9/mixgtk/mixgtk_mixal.c0000644000175000017500000003751412112755472013403 00000000000000/* -*-c-*- -------------- mixgtk_mixal.c : * Implementation of the functions declared in mixgtk_mixal.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "mixgtk_widgets.h" #include "mixgtk_config.h" #include "mixgtk_fontsel.h" #include "mixgtk_mixal.h" static mix_vm_t *vm_ = NULL; static GtkTreeView *clist_ = NULL; static GtkListStore *clist_store_ = NULL; static gulong lineno_; static GtkStatusbar *status_ = NULL; static gint status_context_ = 0; static GPtrArray *tips_text_ = NULL; static GtkWidget *symbols_dlg_ = NULL; static GtkTreeView *symbols_view_ = NULL; static GtkListStore *symbols_store_ = NULL; static const gchar *SYMBOLS_VIEW_NAME_ = "symbols_view"; static const gchar *bp_stock_id_ = NULL; static const gchar *pc_stock_id_ = NULL; static const guint bp_stock_size_ = GTK_ICON_SIZE_MENU; enum { CLIST_BP_ID_COL, CLIST_BP_SIZE_COL, CLIST_ADDRESS_COL, CLIST_BYTECODE_COL, CLIST_CODE_COL, CLIST_ADDRESS_NO_COL, CLIST_LINE_NO_COL, CLIST_COL_NO }; enum { SYMBOLS_NAME_COL, SYMBOLS_VALUE_COL, SYMBOLS_WORD_COL, SYMBOLS_COL_NO }; static gboolean mixal_event_ (GtkWidget *w, GdkEvent *event, gpointer data); static void init_symbols_ (void) { GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); symbols_dlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_SYMBOLS_DIALOG); g_assert (symbols_dlg_); symbols_view_ = GTK_TREE_VIEW (mixgtk_widget_factory_get_child_by_name (MIXGTK_SYMBOLS_DIALOG, SYMBOLS_VIEW_NAME_)); g_assert (symbols_view_); mixgtk_fontsel_set_font (MIX_FONT_SYMBOLS, GTK_WIDGET (symbols_view_)); symbols_store_ = gtk_list_store_new (SYMBOLS_COL_NO, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (symbols_store_), SYMBOLS_NAME_COL, GTK_SORT_ASCENDING); gtk_tree_view_set_model (symbols_view_, GTK_TREE_MODEL (symbols_store_)); g_object_unref (G_OBJECT (symbols_store_)); gtk_tree_view_append_column (symbols_view_, gtk_tree_view_column_new_with_attributes ("Name", renderer, "text", SYMBOLS_NAME_COL, NULL)); gtk_tree_view_append_column (symbols_view_, gtk_tree_view_column_new_with_attributes ("Value", renderer, "text", SYMBOLS_VALUE_COL, NULL)); gtk_tree_view_append_column (symbols_view_, gtk_tree_view_column_new_with_attributes ("", renderer, "text", SYMBOLS_WORD_COL, NULL)); } static void insert_symbol_ (gpointer symbol, gpointer value, gpointer data) { enum {DEC_SIZE = 25, WORD_SIZE = 20}; static gchar DEC[DEC_SIZE], WORD[WORD_SIZE]; GtkTreeIter iter; mix_word_t w = (mix_word_t)GPOINTER_TO_INT (value); g_snprintf (DEC, DEC_SIZE, "%s%ld", mix_word_is_negative (w)? "-" : "+", mix_word_magnitude (w)); mix_word_print_to_buffer (w, WORD); gtk_list_store_append (symbols_store_, &iter); gtk_list_store_set (symbols_store_, &iter, SYMBOLS_NAME_COL, (const gchar*)symbol, SYMBOLS_VALUE_COL, DEC, SYMBOLS_WORD_COL, WORD, -1); } static void fill_symbols_ (const mix_symbol_table_t *table) { if (symbols_view_) gtk_list_store_clear (symbols_store_); else init_symbols_ (); mix_symbol_table_foreach (((mix_symbol_table_t *)table), insert_symbol_, NULL); } static void init_clist_ (void) { GtkStockItem item; GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GtkCellRenderer *bprenderer = gtk_cell_renderer_pixbuf_new (); clist_ = GTK_TREE_VIEW (gtk_tree_view_new ()); clist_store_ = gtk_list_store_new (CLIST_COL_NO, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); gtk_tree_view_set_model (clist_, GTK_TREE_MODEL (clist_store_)); g_object_unref (G_OBJECT (clist_store_)); gtk_tree_view_set_rules_hint (clist_, TRUE); gtk_tree_view_append_column (clist_, gtk_tree_view_column_new_with_attributes ("", bprenderer, "stock-id", CLIST_BP_ID_COL, "stock-size", CLIST_BP_SIZE_COL, NULL)); gtk_tree_view_append_column (clist_, gtk_tree_view_column_new_with_attributes ("Address", renderer, "text", CLIST_ADDRESS_COL, NULL)); gtk_tree_view_append_column (clist_, gtk_tree_view_column_new_with_attributes ("Bytecode", renderer, "text", CLIST_BYTECODE_COL, NULL)); gtk_tree_view_append_column (clist_, gtk_tree_view_column_new_with_attributes ("Source", renderer, "text", CLIST_CODE_COL, NULL)); if (gtk_stock_lookup (GTK_STOCK_STOP, &item)) { bp_stock_id_ = item.stock_id; } if (gtk_stock_lookup (GTK_STOCK_GO_FORWARD, &item)) { pc_stock_id_ = item.stock_id; } symbols_dlg_ = NULL; symbols_view_ = NULL; g_signal_connect (G_OBJECT (clist_), "event", G_CALLBACK (mixal_event_), NULL); mixgtk_fontsel_set_font (MIX_FONT_MIXAL, GTK_WIDGET (clist_)); gtk_widget_show (GTK_WIDGET (clist_)); } /* initialise the mixal widgets */ GtkWidget * mixgtk_mixal_init (mix_vm_t *vm) { if (vm != NULL) vm_ = vm; if (vm_ == NULL) return FALSE; if (clist_ == NULL) init_clist_ (); status_ = NULL; return GTK_WIDGET (clist_); } void mixgtk_mixal_reparent (GtkStatusbar *status) { g_assert (status != NULL); mixgtk_mixal_pop_status (); status_ = status; status_context_ = gtk_statusbar_get_context_id (status_, "MIXAL status"); } void mixgtk_mixal_update_fonts (void) { mixgtk_fontsel_set_font (MIX_FONT_MIXAL, GTK_WIDGET (clist_)); mixgtk_fontsel_set_font (MIX_FONT_SYMBOLS, GTK_WIDGET (symbols_view_)); } void mixgtk_mixal_pop_status (void) { if (status_ != NULL) gtk_statusbar_pop (status_, status_context_); } /* load the corresponding mixal file */ static void update_tips_ (const mix_symbol_table_t *table, const gchar *line) { enum {SIZE = 256}; static gchar BUFFER[256]; static const gchar *DELIMITERS = " /+*=-()\t,:\n"; if (line) { guint k = 0; gchar *tip = g_strdup (""); gchar *new_tip; gchar **tokens; gchar *text = g_strdup (line); text = g_strdelimit (text, DELIMITERS, ' '); tokens = g_strsplit (g_strstrip (text), " ", -1); while (tokens[k]) { if (mix_symbol_table_is_defined (table, tokens[k])) { mix_word_t val = mix_symbol_table_value (table, tokens[k]); g_snprintf (BUFFER, SIZE, "[ %s = %s%ld ]", tokens[k], mix_word_is_negative (val)? "-" : "+", mix_word_magnitude (val)); new_tip = g_strconcat (tip, " ", BUFFER, NULL); g_free (tip); tip = new_tip; } ++k; } g_ptr_array_add (tips_text_, (gpointer)tip); g_strfreev (tokens); g_free (text); } } void mixgtk_mixal_load_file (void) { enum {ADDR_SIZE = 20, CONT_SIZE = 200, WORD_SIZE = 20}; static gchar ADDR[ADDR_SIZE], CONT[CONT_SIZE], WORD[WORD_SIZE]; const mix_src_file_t *file; GtkTreeIter iter; g_assert (vm_); g_assert (clist_); gtk_list_store_clear (clist_store_); if (tips_text_) { g_ptr_array_free (tips_text_, TRUE); tips_text_ = NULL; } file = mix_vm_get_src_file (vm_); if (file != NULL) { gint k; mix_address_t addr; const mix_symbol_table_t *table = mix_vm_get_symbol_table (vm_); if (table) tips_text_ = g_ptr_array_new (); lineno_ = mix_src_file_get_line_no (file); for (k = 0; k < lineno_; ++k) { gchar *line = g_strchomp ((gchar *)mix_src_file_get_line (file, k + 1)); g_snprintf (CONT, CONT_SIZE, " %03d: %s", k + 1, line); addr = mix_vm_get_lineno_address (vm_, k + 1); if (addr != MIX_VM_CELL_NO) { g_snprintf (ADDR, ADDR_SIZE, "%04d", mix_short_magnitude (addr)); mix_word_print_to_buffer (mix_vm_get_addr_contents (vm_, addr), WORD); } else { g_snprintf (ADDR, ADDR_SIZE, _("N/A")); g_snprintf (WORD, WORD_SIZE, _("N/A")); } gtk_list_store_append (clist_store_, &iter); gtk_list_store_set (clist_store_, &iter, CLIST_ADDRESS_NO_COL, mix_short_magnitude (addr), CLIST_LINE_NO_COL, k + 1, CLIST_ADDRESS_COL, ADDR, CLIST_CODE_COL, CONT, CLIST_BYTECODE_COL, WORD, CLIST_BP_SIZE_COL, bp_stock_size_, -1); if (table) update_tips_ (table, line); } if (table) fill_symbols_ (table); } else { lineno_ = 0; gtk_list_store_append (clist_store_, &iter); gtk_list_store_set (clist_store_, &iter, CLIST_ADDRESS_NO_COL, MIX_VM_CELL_NO, CLIST_LINE_NO_COL, 0, CLIST_ADDRESS_COL, "", CLIST_CODE_COL, _("Source not available"), CLIST_BYTECODE_COL, "", -1); } } /* update the widgets */ static gint find_address_ (gint address) { GtkTreeIter iter; gint addr; gint row = 0; gboolean valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (clist_store_), &iter); while (valid) { ++row; gtk_tree_model_get (GTK_TREE_MODEL (clist_store_), &iter, CLIST_ADDRESS_NO_COL, &addr, -1); if (addr == address) return row; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (clist_store_), &iter); } return 0; } static void update_bp_ (gint row) { if (row > 0) { GtkTreePath *path = gtk_tree_path_new_from_indices (row - 1, -1); GtkTreeIter iter; if (gtk_tree_model_get_iter (GTK_TREE_MODEL (clist_store_), &iter, path)) { gint address; const gchar *id = NULL; gtk_tree_model_get (GTK_TREE_MODEL (clist_store_), &iter, CLIST_ADDRESS_NO_COL, &address, -1); if (mix_vm_has_breakpoint_at_address (vm_, address)) id = bp_stock_id_; else if (address == (gint) mix_short_magnitude (mix_vm_get_prog_count (vm_))) id = pc_stock_id_; gtk_list_store_set (clist_store_, &iter, CLIST_BP_ID_COL, id, -1); } gtk_tree_path_free (path); } } static void select_row_ (gint row) { static gint previous = 0; if (row > 0 && previous != row) { GtkTreePath *path = gtk_tree_path_new_from_indices (row - 1, -1); GtkTreeIter iter; if (gtk_tree_model_get_iter (GTK_TREE_MODEL (clist_store_), &iter, path)) { gtk_list_store_set (clist_store_, &iter, CLIST_BP_ID_COL, pc_stock_id_, -1); update_bp_ (previous); previous = row; gtk_tree_view_scroll_to_cell (clist_, path, NULL, FALSE, 0.3, 0); } gtk_tree_path_free (path); } } void mixgtk_mixal_update (void) { gint addr = 0; g_assert (vm_); addr = (gint) mix_short_magnitude (mix_vm_get_prog_count (vm_)); select_row_ (find_address_ (addr)); } /* breakpoints */ void mixgtk_mixal_update_bp_at_address (guint addr) { update_bp_ (find_address_ ((gint)addr)); } void mixgtk_mixal_update_bp_at_line (guint line) { update_bp_ ((gint)line); } void mixgtk_mixal_update_bp_all (void) { gint k; for (k = 1; k <= lineno_; ++k) update_bp_ (k); mixgtk_mixal_update (); } /* callbacks */ static void mixal_row_clicked_ (GtkTreeIter *iter) { gint addr = MIX_VM_CELL_NO; gtk_tree_model_get (GTK_TREE_MODEL (clist_store_), iter, CLIST_ADDRESS_NO_COL, &addr, -1); if (addr < MIX_VM_CELL_NO) { gboolean isset = mix_vm_has_breakpoint_at_address (vm_, addr); if (isset) mix_vm_clear_breakpoint_address (vm_, addr); else mix_vm_set_breakpoint_address (vm_, addr); update_bp_ (find_address_ (addr)); } } static void mixal_motion_ (GtkTreeIter *iter) { static gint last_row = 0; static guint last_message = 0; gint row = last_row; gtk_tree_model_get (GTK_TREE_MODEL (clist_store_), iter, CLIST_LINE_NO_COL, &row, -1); if (row > 0 && row != last_row && tips_text_) { const gchar *msg = NULL; last_row = row; if (last_message) gtk_statusbar_remove (status_, status_context_, last_message); msg = (const gchar *)g_ptr_array_index (tips_text_, row - 1); if (msg) last_message = gtk_statusbar_push (status_, status_context_, msg); else last_message = 0; } } static gboolean mixal_event_ (GtkWidget *w, GdkEvent *event, gpointer data) { GdkEventType type = event->type; if ((type == GDK_BUTTON_PRESS || type == GDK_MOTION_NOTIFY) && (gtk_tree_view_get_bin_window (clist_) == event->any.window)) { gdouble x = (type == GDK_BUTTON_PRESS)? event->button.x : event->motion.x; gdouble y = (type == GDK_BUTTON_PRESS)? event->button.y : event->motion.y; GtkTreeIter iter; GtkTreePath *path = NULL; GtkTreeViewColumn *col = NULL; if (gtk_tree_view_get_path_at_pos (clist_, x, y, &path, &col, NULL, NULL) && gtk_tree_model_get_iter (GTK_TREE_MODEL (clist_store_), &iter, path)) { if (type == GDK_BUTTON_PRESS) mixal_row_clicked_ (&iter); else mixal_motion_ (&iter); } if (path) gtk_tree_path_free (path); return TRUE; } return FALSE; } void on_symbol_ok_clicked () { gtk_widget_hide (symbols_dlg_); } void on_symbols_activate () { if (!symbols_dlg_) init_symbols_ (); gtk_widget_show (symbols_dlg_); } void on_mixal_leave_notify_event () { if (status_ != NULL) gtk_statusbar_pop (status_, status_context_); } void on_mixal_font_activate () { GtkWidget *w[] = { GTK_WIDGET (clist_) }; mixgtk_fontsel_query_font (MIX_FONT_MIXAL, w, 1); } void on_symbols_font_activate () { if (symbols_view_ != NULL) { GtkWidget *w[] = { GTK_WIDGET (symbols_view_) }; mixgtk_fontsel_query_font (MIX_FONT_SYMBOLS, w, 1); } else mixgtk_fontsel_query_font (MIX_FONT_SYMBOLS, NULL, 0); } mdk-1.2.9/mixgtk/mixgtk_external.h0000644000175000017500000000230212112755472014103 00000000000000/* -*-c-*- -------------- mixgtk_external.h : * Managing the external programs dialog. * ------------------------------------------------------------------ * Copyright (C) 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_EXTERNAL_H_0608072329 #define MIXGTK_EXTERNAL_H_0608072329 #include extern void mixgtk_external_init (mix_vm_cmd_dispatcher_t *dispatcher); extern void on_external_programs_activate (); #endif // MIXGTK_EXTERNAL_H_0608072329 mdk-1.2.9/mixgtk/gmixvm.c0000644000175000017500000000557412112755472012216 00000000000000/* -*-c-*- -------------- gmixvm.c : * Main function of the mix gtk front-end * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2006, 2007, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "mixgtk.h" static gboolean initfile_ = TRUE; #ifdef MAKE_GUILE # include # include "mixgtk_cmd_dispatcher.h" static void inner_main_ (void *closure, int argc, char *argv[]) { mixgtk_init (argc, argv); mixguile_set_cmd_dispatcher (mixgtk_cmd_dispatcher_get_mix_dispatcher ()); mixguile_load_bootstrap (initfile_); mixgtk_main (); mixgtk_release (); } #endif #ifdef HAVE_GETOPT_LONG # include #else # include #endif /* HAVE_GETOPT_LONG */ enum { VER_OPT = 'v', NOINIT_OPT = 'q', HELP_OPT = 'h', USAGE_OPT = 'u' }; static const char *options_ = "vqhu"; static struct option long_options_[] = { {"version", no_argument, 0, VER_OPT}, {"help", no_argument, 0, HELP_OPT}, {"usage", no_argument, 0, USAGE_OPT}, {"noinit", no_argument, 0, NOINIT_OPT}, {0, 0, 0, 0} }; static void print_usage_ (const gchar *prog) { static const char *usage_ = "Usage: %s [-vhuq] [--version] [--help] [--usage] [--noinit]\n"; fprintf (stderr, usage_, prog); } int main(int argc, char *argv[]) { int c; const char *prog_name = argv[0]; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); while (1) { c = getopt_long (argc, argv, options_, long_options_, (int*)0); /* Detect the end of the options. */ if (c == -1) break; switch (c) { case VER_OPT: mix_print_license (_("gmixvm, GTK MIX virtual machine")); return EXIT_SUCCESS; case NOINIT_OPT: initfile_ = FALSE; break; case HELP_OPT: case USAGE_OPT: print_usage_ (prog_name); return EXIT_SUCCESS; case '?': print_usage_ (prog_name); return EXIT_FAILURE; default: g_assert_not_reached (); break; } } #ifdef MAKE_GUILE mixguile_enter (argc, argv, inner_main_); #else if (!mixgtk_init (argc, argv)) return EXIT_FAILURE; mixgtk_main (); mixgtk_release (); #endif return EXIT_SUCCESS; } mdk-1.2.9/mixgtk/mixgtk_fontsel.h0000644000175000017500000000273212112755472013742 00000000000000/* -*-c-*- ---------------- mixgtk_fontsel.h : * Functions for handling font selection. * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_FONTSEL_H #define MIXGTK_FONTSEL_H #include #include "mixgtk_widgets.h" typedef enum { MIX_FONT_MIXVM, MIX_FONT_LOG, MIX_FONT_PROMPT, MIX_FONT_MIXAL, MIX_FONT_DEVICES, MIX_FONT_SYMBOLS, MIX_FONT_DEFAULT, MIX_FONT_NO } mixgtk_font_t; /* configured fonts */ extern void mixgtk_fontsel_set_font (mixgtk_font_t f, GtkWidget *w); extern gboolean mixgtk_fontsel_query_font (mixgtk_font_t f, GtkWidget **ws, size_t no); extern void on_all_fonts_activate (void); #endif /* MIXGTK_FONTSEL_H */ mdk-1.2.9/mixgtk/mixgtk_wm.c0000644000175000017500000004253212112755472012710 00000000000000/* -*-c-*- -------------- mixgtk_wm.c : * Implementation of the functions declared in mixgtk_wm.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "mixgtk_wm.h" #include "mixgtk_config.h" #include "mixgtk_device.h" #include "mixgtk_mixvm.h" #include "mixgtk_mixal.h" #include "mixgtk_widgets.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_gen_handlers.h" #include "mixgtk.h" typedef struct window_info_t_ { mixgtk_dialog_id_t dialog; GtkWidget *widget; GtkCheckMenuItem *menu; const gchar *menu_name; const gchar *config_key; gboolean detached; void (*detach) (void); void (*attach) (void); } window_info_t_; static const gchar *DETACH_YES_ = "Yes"; static const gchar *DETACH_NO_ = "No"; static GtkWidget *about_ = NULL; static GtkContainer *mixvm_container_ = NULL; static GtkContainer *mixal_container_ = NULL; static GtkContainer *dev_container_ = NULL; static GtkToolItem *attach_button_ = NULL; static GtkToolItem *detach_button_ = NULL; static const gchar *TB_MENU_NAME_ = "show_toolbars"; static GtkCheckMenuItem *tb_menu_ = NULL; static GtkNotebook *notebook_ = NULL; static mix_vm_t *vm_ = NULL; static void init_info_ (void); static void init_notebook_ (void); static void init_dispatcher_ (void); static void init_mixvm_ (void); static void init_mixal_ (void); static void init_dev_ (void); static void init_signals_ (void); static void init_visibility_ (void); static void init_tb_ (void); static void init_about_ (void); static void init_autosave_ (void); static void set_tb_style_ (guint style); static void show_toolbars_ (gboolean show); static void add_page_ (GtkWidget *w, mixgtk_window_id_t id); static void mixvm_attach_ (void); static void mixvm_detach_ (void); static void mixal_attach_ (void); static void mixal_detach_ (void); static void dev_attach_ (void); static void dev_detach_ (void); static void update_attach_buttons_ (void); static void on_tb_style_ (GtkMenuItem *w, gpointer style); static void on_nb_switch_ (GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data); static window_info_t_ infos_[] = { {MIXGTK_MIXVM_DIALOG, NULL, NULL, "detach_vm", "MIX.detach", FALSE, mixvm_detach_, mixvm_attach_}, {MIXGTK_MIXAL_DIALOG, NULL, NULL, "detach_source", "MIXAL.detach", FALSE, mixal_detach_, mixal_attach_}, {MIXGTK_DEVICES_DIALOG, NULL, NULL, "detach_dev", "Devices.detach", FALSE, dev_detach_, dev_attach_} }; static size_t INF_NO_ = sizeof (infos_) / sizeof (infos_[0]); gboolean mixgtk_wm_init (void) { gint k; init_info_ (); init_notebook_ (); init_dispatcher_ (); init_mixvm_ (); init_mixal_ (); init_dev_ (); init_tb_ (); for (k = 0; k < INF_NO_; ++k) { if (infos_[k].detached) mixgtk_wm_detach_window (k); else mixgtk_wm_attach_window (k); } init_about_ (); init_autosave_ (); init_visibility_ (); init_signals_ (); return TRUE; } void mixgtk_wm_detach_window (mixgtk_window_id_t w) { if (w < INF_NO_) { (*(infos_[w].detach)) (); infos_[w].detached = TRUE; gtk_check_menu_item_set_active (infos_[w].menu, TRUE); mixgtk_config_update (infos_[w].config_key, DETACH_YES_); if (infos_[w].widget != NULL) gtk_widget_show (infos_[w].widget); if (gtk_notebook_get_n_pages (notebook_) < 1) gtk_widget_hide (GTK_WIDGET (notebook_)); gtk_widget_show (mixgtk_widget_factory_get_dialog (infos_[w].dialog)); update_attach_buttons_ (); } } void mixgtk_wm_attach_window (mixgtk_window_id_t w) { if (w < INF_NO_) { gint page = gtk_notebook_page_num (notebook_, infos_[w].widget); gtk_widget_hide (mixgtk_widget_factory_get_dialog (infos_[w].dialog)); if (page < 0) (*(infos_[w].attach)) (); infos_[w].detached = FALSE; gtk_check_menu_item_set_active (infos_[w].menu, FALSE); mixgtk_config_update (infos_[w].config_key, DETACH_NO_); if (gtk_notebook_get_n_pages (notebook_) == 1) gtk_widget_show (GTK_WIDGET (notebook_)); update_attach_buttons_ (); } } /* callbacks */ void on_detach_clicked (GtkWidget *ignored) { gint page = gtk_notebook_get_current_page (notebook_); if (page >= 0) { gint k; GtkWidget *w = gtk_notebook_get_nth_page (notebook_, page); for (k = 0; k < INF_NO_; ++k) if (infos_[k].widget == w) mixgtk_wm_detach_window (k); } } void on_attach_all_clicked () { gint k; for (k = INF_NO_; k > 0; --k) if (infos_[k - 1].detached) mixgtk_wm_attach_window (k - 1); } void on_attach_toggled (GtkCheckMenuItem *item) { gint k; for (k = 0; k < INF_NO_; ++k) if (item == infos_[k].menu) break; g_return_if_fail (k < INF_NO_); if (item->active) mixgtk_wm_detach_window (k); else mixgtk_wm_attach_window (k); mixgtk_config_update (infos_[k].config_key, (item->active)? DETACH_YES_ : DETACH_NO_); } void on_window_hide (GtkWidget *w) { gint k; for (k = 0; k < INF_NO_; ++k) if (w == mixgtk_widget_factory_get_dialog (infos_[k].dialog)) break; g_return_if_fail (k < INF_NO_); mixgtk_wm_attach_window (k); } void on_show_toolbars_toggled (GtkCheckMenuItem *item) { if (item->active != mixgtk_config_show_toolbars ()) show_toolbars_ (item->active); } void on_widget_attach (GtkWidget *ign, gpointer id) { mixgtk_wm_attach_window (GPOINTER_TO_INT (id)); } /* about box */ void on_about_activate (GtkWidget *w, gpointer data) { if (!about_) init_about_ (); gtk_widget_show (about_); } void on_about_clicked (GtkWidget *w) { if (about_) gtk_widget_hide (about_); } static void init_info_ (void) { gint k; for (k = 0; k < INF_NO_; ++k) { const gchar *txt; infos_[k].menu = GTK_CHECK_MENU_ITEM (mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, infos_[k].menu_name)); g_assert (infos_[k].menu != NULL); txt = mixgtk_config_get (infos_[k].config_key); infos_[k].detached = txt && !g_ascii_strcasecmp (txt, DETACH_YES_); } } static void init_notebook_ (void) { notebook_ = GTK_NOTEBOOK (mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_NOTEBOOK)); g_assert (notebook_ != NULL); gtk_widget_show (GTK_WIDGET (notebook_)); } static void add_page_ (GtkWidget *page, mixgtk_window_id_t id) { static const gchar *LABELS[] = { N_("_Virtual machine"), N_("_Source"), N_("_Devices") }; gint p = 0; g_assert (page != NULL); g_assert (id < INF_NO_); g_assert (notebook_ != NULL); if (id > MIXGTK_MIXVM_WINDOW) { if (id == MIXGTK_DEVICES_WINDOW) p = gtk_notebook_get_n_pages (notebook_); else p = infos_[MIXGTK_MIXVM_WINDOW].detached ? 0 : 1; } gtk_notebook_insert_page (notebook_, page, gtk_label_new_with_mnemonic (LABELS[id]), p); gtk_notebook_set_current_page (notebook_, p); gtk_widget_show (page); gtk_widget_show (GTK_WIDGET (notebook_)); } static void init_signals_ (void) { gint k; for (k = 0; k < INF_NO_; ++k) { GObject *dialog = G_OBJECT (mixgtk_widget_factory_get_dialog (infos_[k].dialog)); GObject *button = G_OBJECT (mixgtk_widget_factory_get (infos_[k].dialog, MIXGTK_WIDGET_ATTACH_BUTTON)); g_assert (dialog != NULL); g_assert (button != NULL); g_signal_connect (button, "clicked", G_CALLBACK (on_widget_attach), GINT_TO_POINTER (k)); g_signal_connect (dialog, "destroy", G_CALLBACK (on_window_hide), NULL); g_signal_connect (dialog, "destroy_event", G_CALLBACK (on_window_hide), NULL); g_signal_connect (dialog, "delete_event", G_CALLBACK (on_window_hide), NULL); g_signal_connect (G_OBJECT (infos_[k].menu), "toggled", G_CALLBACK (on_attach_toggled), NULL); } GtkWindow *mainw = GTK_WINDOW (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN)); g_signal_connect (mainw, "destroy", G_CALLBACK (on_file_exit_activate), NULL); } static void init_visibility_ (void) { gint k; for (k = 0; k < INF_NO_; ++k) if (infos_[k].detached) gtk_widget_show (mixgtk_widget_factory_get_dialog (infos_[k].dialog)); if (gtk_notebook_get_n_pages (notebook_) > 0) gtk_notebook_set_current_page (notebook_, 0); gtk_widget_show (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN)); } static void init_dispatcher_ (void) { if (!mixgtk_cmd_dispatcher_init (MIXGTK_MAIN)) g_assert (FALSE); vm_ = mixgtk_cmd_dispatcher_get_vm (); g_assert (vm_ != NULL); } static void init_mixvm_ (void) { GtkContainer *vm = GTK_CONTAINER (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_MIXVM)); mixvm_container_ = GTK_CONTAINER (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_MIXVM_CONTAINER)); g_assert (mixvm_container_ != NULL); g_assert (vm != NULL); g_object_ref (G_OBJECT (vm)); infos_[MIXGTK_MIXVM_WINDOW].widget = GTK_WIDGET (vm); mixgtk_mixvm_init (vm_); mixgtk_mixvm_update_vm_widgets (); gtk_widget_show (GTK_WIDGET (vm)); } static void init_mixal_ (void) { GtkWidget *page = gtk_scrolled_window_new (NULL, NULL); GtkWidget *mixal = mixgtk_mixal_init (vm_); g_assert (page != NULL); g_assert (mixal != NULL); g_object_ref (page); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (page), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (page), mixal); infos_[MIXGTK_MIXAL_WINDOW].widget = page; mixal_container_ = GTK_CONTAINER (mixgtk_widget_factory_get (MIXGTK_MIXAL_DIALOG, MIXGTK_WIDGET_MIXAL_CONTAINER)); g_assert (mixal_container_ != NULL); gtk_container_add (mixal_container_, page); gtk_widget_show (mixal); gtk_widget_show (page); gtk_widget_show (GTK_WIDGET (mixal_container_)); } static void init_dev_ (void) { GtkWidget *page = gtk_scrolled_window_new (NULL, NULL); GtkWidget *devs = mixgtk_device_init (vm_); g_assert (page != NULL); g_assert (devs != NULL); g_object_ref (page); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (page), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (page), devs); infos_[MIXGTK_DEVICES_WINDOW].widget = page; dev_container_ = GTK_CONTAINER (mixgtk_widget_factory_get (MIXGTK_DEVICES_DIALOG, MIXGTK_WIDGET_DEV_CONTAINER)); g_assert (dev_container_ != NULL); gtk_container_add (dev_container_, page); gtk_widget_show (devs); gtk_widget_show (page); } static void init_tb_ (void) { gchar *names[4]; gint k; gint style = mixgtk_config_tb_style (); tb_menu_ = GTK_CHECK_MENU_ITEM (mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, TB_MENU_NAME_)); g_assert (tb_menu_ != NULL); gtk_check_menu_item_set_active (tb_menu_, mixgtk_config_show_toolbars ()); show_toolbars_ (mixgtk_config_show_toolbars ()); g_signal_connect (G_OBJECT (tb_menu_), "toggled", G_CALLBACK (on_show_toolbars_toggled), NULL); attach_button_ = GTK_TOOL_ITEM (mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_ATTACH_BUTTON)); detach_button_ = GTK_TOOL_ITEM (mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_DETACH_BUTTON)); g_assert (attach_button_); g_assert (detach_button_); names[GTK_TOOLBAR_ICONS] = "tb_style_icons"; names[GTK_TOOLBAR_TEXT] = "tb_style_labels"; names[GTK_TOOLBAR_BOTH] = "tb_style_both"; names[GTK_TOOLBAR_BOTH_HORIZ] = "tb_style_bothh"; for (k = 0; k < 4; ++k) { GtkWidget *item = mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, names[k]); g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (on_tb_style_), GUINT_TO_POINTER (k)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), (k == style)); } set_tb_style_ (style); } static void on_tb_style_ (GtkMenuItem *w, gpointer style) { guint ui_style = GPOINTER_TO_UINT (style); set_tb_style_ (ui_style); mixgtk_config_set_tb_style (ui_style); } static void set_tb_style_ (guint style) { static const gchar *TB_NAME = "main_toolbar"; static const gchar *TB_DNAME = "dlg_toolbar"; gint k; GtkToolbar *tb = GTK_TOOLBAR (mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, TB_NAME)); gtk_toolbar_set_style (tb, style); for (k = 0; k < INF_NO_; ++k) { GtkToolbar *tb = GTK_TOOLBAR (mixgtk_widget_factory_get_child_by_name (infos_[k].dialog, TB_DNAME)); gtk_toolbar_set_style (tb, style); } } static void show_toolbars_ (gboolean show) { static const gchar *HANDLE_NAME = "tb_handle"; gint k; GtkWidget *handle = mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, HANDLE_NAME); if (show) gtk_widget_show (handle); else gtk_widget_hide (handle); for (k = 0; k < INF_NO_; ++k) { GtkWidget *hd = mixgtk_widget_factory_get_child_by_name (infos_[k].dialog, HANDLE_NAME); if (show) gtk_widget_show (hd); else gtk_widget_hide (hd); } mixgtk_config_set_show_toolbars (show); } static void init_autosave_ (void) { #define AUTOSAVE_ITEM_ "save_on_exit" GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM (mixgtk_widget_factory_get_child_by_name (MIXGTK_MAIN, AUTOSAVE_ITEM_)); if (item) { gtk_check_menu_item_set_active (item, mixgtk_config_is_autosave ()); } } static void init_about_ (void) { #define VERSION_LABEL_ "version_label" #define GPL_TEXT_ "gpl_text" GtkWidget *label; about_ = mixgtk_widget_factory_get_dialog (MIXGTK_ABOUT_DIALOG); g_assert (about_ != NULL); label = mixgtk_widget_factory_get_child_by_name (MIXGTK_ABOUT_DIALOG, VERSION_LABEL_); g_assert (label != NULL); gtk_label_set_text (GTK_LABEL (label), VERSION); gtk_widget_show (label); } static void mixvm_attach_ (void) { gtk_container_remove (mixvm_container_, infos_[MIXGTK_MIXVM_WINDOW].widget); add_page_ (infos_[MIXGTK_MIXVM_WINDOW].widget, MIXGTK_MIXVM_WINDOW); } static void mixvm_detach_ (void) { gtk_widget_reparent (infos_[MIXGTK_MIXVM_WINDOW].widget, GTK_WIDGET (mixvm_container_)); } static void mixal_attach_ (void) { static GtkStatusbar *stat = NULL; if (stat == NULL) { stat = GTK_STATUSBAR (mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_STATUSBAR)); g_assert (stat); g_signal_connect (G_OBJECT (notebook_), "switch-page", G_CALLBACK (on_nb_switch_), NULL); } mixgtk_mixal_reparent (stat); gtk_container_remove (mixal_container_, infos_[MIXGTK_MIXAL_WINDOW].widget); add_page_ (infos_[MIXGTK_MIXAL_WINDOW].widget, MIXGTK_MIXAL_WINDOW); } static void mixal_detach_ (void) { static GtkStatusbar *stat = NULL; if (stat == NULL) { stat = GTK_STATUSBAR (mixgtk_widget_factory_get (MIXGTK_MIXAL_DIALOG, MIXGTK_WIDGET_MIXAL_STATUSBAR)); g_assert (stat); } mixgtk_mixal_reparent (stat); gtk_widget_reparent (infos_[MIXGTK_MIXAL_WINDOW].widget, GTK_WIDGET (mixal_container_)); } static void dev_attach_ (void) { gtk_container_remove (dev_container_, infos_[MIXGTK_DEVICES_WINDOW].widget); add_page_ (infos_[MIXGTK_DEVICES_WINDOW].widget, MIXGTK_DEVICES_WINDOW); } static void dev_detach_ (void) { gtk_widget_reparent (infos_[MIXGTK_DEVICES_WINDOW].widget, GTK_WIDGET (dev_container_)); } static void on_nb_switch_ (GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data) { if (!(infos_[MIXGTK_MIXAL_WINDOW].detached) && (page != infos_[MIXGTK_MIXAL_WINDOW].widget)) mixgtk_mixal_pop_status (); } static void update_attach_buttons_ (void) { gint k; gboolean wants_attach = FALSE; gboolean wants_detach = FALSE; g_assert (attach_button_); g_assert (detach_button_); for (k = 0; k < INF_NO_; ++k) { wants_attach = wants_attach || infos_[k].detached; wants_detach = wants_detach || !infos_[k].detached; } gtk_tool_item_set_visible_horizontal (attach_button_, wants_attach); gtk_tool_item_set_visible_vertical (attach_button_, wants_attach); gtk_tool_item_set_visible_horizontal (detach_button_, wants_detach); gtk_tool_item_set_visible_vertical (detach_button_, wants_detach); } mdk-1.2.9/mixgtk/mixgtk_config.h0000644000175000017500000000365312112755472013540 00000000000000/* -*-c-*- ---------------- mixgtk_config.h : * Configuration functions declarations. * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_CONFIG_H #define MIXGTK_CONFIG_H #include #include /* load configuration */ extern gboolean mixgtk_config_load (void); /* get mix config */ extern mix_config_t * mixgtk_config_get_mix_config (void); /* autosave state */ extern gboolean mixgtk_config_is_autosave (void); extern void mixgtk_config_set_autosave (gboolean autosave); /* toolbar style */ extern guint mixgtk_config_tb_style (void); extern void mixgtk_config_set_tb_style (guint style); /* update config item */ extern void mixgtk_config_update (const gchar *key, const gchar *value); /* get config item */ extern const gchar * mixgtk_config_get (const gchar *key); /* remove config item */ extern void mixgtk_config_remove (const gchar *key); /* save configuration */ extern void mixgtk_config_save (void); /* shared config params */ extern gboolean mixgtk_config_show_toolbars (void); extern void mixgtk_config_set_show_toolbars (gboolean show); #endif /* MIXGTK_CONFIG_H */ mdk-1.2.9/mixgtk/mixgtk_widgets.c0000644000175000017500000000703212622454575013735 00000000000000/* -*-c-*- -------------- mixgtk_widgets.c : * Implementation of the functions declared in mixgtk_widgets.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007, 2014 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include "mixgtk_config.h" #include "mixgtk_widgets.h" /* dialog names */ static const gchar * dnames_[] = { "main_window", "mixvm_window", "mixal_window", "devices_window", "word_dialog", "about_dialog", "goto_dialog", "fontsel_dialog", "devform_dialog", "external_dialog", "symbols_dialog", "input_dialog", "devdir_dialog" }; #define DLG_NO_ (sizeof (dnames_) / sizeof(dnames_[0])) /* widget names */ static const gchar *names_[] = { "main_statusbar", "attach_button", "detach_button", "main_notebook", "mixvm_widget", "mixvm_container", "command_prompt", "command_log", "dev_container", "mixal_container", "mixal_statusbar", "rA_entry", "rX_entry", "rJ_entry", "rI1_entry", "rI2_entry", "rI3_entry", "rI4_entry", "rI5_entry", "rI6_entry", "lesser_radio", "equal_radio", "greater_radio", "over_toggle", "memory_cells", "elapsed_label", "program_label", "uptime_label", "devices_container", "loc_entry", "goto_entry", NULL }; #define WIDGET_NO_ (sizeof (names_) / sizeof (names_[0])) /* the glade specs */ static GladeXML *xml_[DLG_NO_] = {NULL}; /* the xml file name */ static const gchar *file_ = NULL; static void init_xml_ (mixgtk_dialog_id_t dlg) { xml_[dlg] = glade_xml_new (file_, dnames_[dlg], NULL); glade_xml_signal_autoconnect (xml_[dlg]); g_assert (xml_[dlg] != NULL); } /* create a new factory from an xml glade file */ gboolean mixgtk_widget_factory_init (void) { if (!file_) { const gchar *glade_file = GLADE_FILE; glade_init (); if (access (glade_file, R_OK)) { if (access (LOCAL_GLADE_FILE, R_OK)) return FALSE; glade_file = LOCAL_GLADE_FILE; } file_ = g_strdup (glade_file); } else { gint k; for (k = 0; k < DLG_NO_; ++k) if (xml_[k]) xml_[k] = NULL; } init_xml_ (MIXGTK_MAIN); return TRUE; } /* get a widget */ GtkWidget * mixgtk_widget_factory_get (mixgtk_dialog_id_t dlg, mixgtk_widget_id_t widget) { g_assert ((long)widget < WIDGET_NO_); return mixgtk_widget_factory_get_child_by_name (dlg, names_[widget]); } GtkWidget * mixgtk_widget_factory_get_dialog (mixgtk_dialog_id_t dlg) { g_assert (dlg < DLG_NO_); if (!xml_[dlg]) init_xml_ (dlg); return glade_xml_get_widget (xml_[dlg], dnames_[dlg]); } GtkWidget * mixgtk_widget_factory_get_child_by_name (mixgtk_dialog_id_t dlg, const gchar *name) { g_assert (dlg < DLG_NO_); g_assert (name != NULL); if (!xml_[dlg]) init_xml_ (dlg); return glade_xml_get_widget (xml_[dlg], name); } mdk-1.2.9/mixgtk/mixgtk_widgets.h0000644000175000017500000000620412112755472013734 00000000000000/* -*-c-*- ---------------- mixgtk_widgets.h : * glade-based factory of mixvm widgets * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_WIDGETS_H #define MIXGTK_WIDGETS_H #include #include /* enumeration of gmixvm dialogs */ typedef enum { MIXGTK_MAIN, /* main app window */ MIXGTK_MIXVM_DIALOG, /* mixvm dialog */ MIXGTK_MIXAL_DIALOG, /* mixal dialog */ MIXGTK_DEVICES_DIALOG, /* devices dialog */ MIXGTK_WORD_DIALOG, /* input dialog for a mix word */ MIXGTK_ABOUT_DIALOG, MIXGTK_GOTO_DIALOG, MIXGTK_FONTSEL_DIALOG, /* font selection dialog */ MIXGTK_DEVFORM_DIALOG, /* device format config dialog */ MIXGTK_EXTERNPROG_DIALOG, /* external programs dialog */ MIXGTK_SYMBOLS_DIALOG, /* symbol table dialog */ MIXGTK_INPUT_DIALOG, /* console input dialog */ MIXGTK_DEVDIR_DIALOG /* devices directory chooser */ } mixgtk_dialog_id_t; /* enumeration of mixvm widget ids */ typedef enum { MIXGTK_WIDGET_STATUSBAR, MIXGTK_WIDGET_ATTACH_BUTTON, MIXGTK_WIDGET_DETACH_BUTTON, MIXGTK_WIDGET_NOTEBOOK, /* the notebook */ MIXGTK_WIDGET_MIXVM, /* virtual machine */ MIXGTK_WIDGET_MIXVM_CONTAINER, MIXGTK_WIDGET_PROMPT, /* command prompt */ MIXGTK_WIDGET_LOG, /* command output */ MIXGTK_WIDGET_DEV_CONTAINER, MIXGTK_WIDGET_MIXAL_CONTAINER, MIXGTK_WIDGET_MIXAL_STATUSBAR, MIXGTK_WIDGET_rA, MIXGTK_WIDGET_rX, MIXGTK_WIDGET_rJ, MIXGTK_WIDGET_rI1, MIXGTK_WIDGET_rI2, MIXGTK_WIDGET_rI3, MIXGTK_WIDGET_rI4, MIXGTK_WIDGET_rI5, MIXGTK_WIDGET_rI6, MIXGTK_WIDGET_CMP_L, MIXGTK_WIDGET_CMP_E, MIXGTK_WIDGET_CMP_G, MIXGTK_WIDGET_OVER, MIXGTK_WIDGET_CELLS, MIXGTK_WIDGET_LAPTIME, MIXGTK_WIDGET_PROGTIME, MIXGTK_WIDGET_UPTIME, MIXGTK_WIDGET_DEVICES, MIXGTK_WIDGET_LOC, MIXGTK_WIDGET_GOTO_ENTRY, MIXGTK_WIDGET_NONE } mixgtk_widget_id_t; /* create a new factory from an xml glade file */ extern gboolean mixgtk_widget_factory_init (void); /* get a dialog */ extern GtkWidget * mixgtk_widget_factory_get_dialog (mixgtk_dialog_id_t dlg); /* get a widget */ extern GtkWidget * mixgtk_widget_factory_get (mixgtk_dialog_id_t dlg, mixgtk_widget_id_t widget); /* Get a widget by name */ extern GtkWidget * mixgtk_widget_factory_get_child_by_name (mixgtk_dialog_id_t dlg, const gchar *name); #endif /* MIXGTK_WIDGETS_H */ mdk-1.2.9/mixgtk/mixgtk_fontsel.c0000644000175000017500000001007612112755472013735 00000000000000/* -*-c-*- -------------- mixgtk_fontsel.c : * Implementation of the functions declared in mixgtk_fontsel.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "mixgtk_widgets.h" #include "mixgtk_config.h" #include "mixgtk_mixvm.h" #include "mixgtk_mixal.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_device.h" #include "mixgtk_fontsel.h" static GtkFontSelectionDialog *fontsel_dialog_ = NULL; static const gchar *keys_[MIX_FONT_NO] = { "MIX.font", "Prompt.font", "Log.font", "MIXAL.font", "Devices.font", "Symbols.font", "Default.font" }; static const gchar *default_font_ = "Monospace 10"; /* initialise the font selection dialog */ static void init_fontsel_ (void) { fontsel_dialog_ = GTK_FONT_SELECTION_DIALOG (mixgtk_widget_factory_get_dialog (MIXGTK_FONTSEL_DIALOG)); g_assert (fontsel_dialog_ != NULL); } void mixgtk_fontsel_set_font (mixgtk_font_t f, GtkWidget *w) { const gchar *font; PangoFontDescription *font_desc; if (f >= MIX_FONT_NO || w == NULL) return; font = mixgtk_config_get (keys_[f]); if (!font) { mixgtk_config_update (keys_[f], default_font_); font = mixgtk_config_get (keys_[f]); g_assert (font); } font_desc = pango_font_description_from_string (font); if (font_desc) { gtk_widget_modify_font (w, font_desc); gtk_widget_queue_draw (w); pango_font_description_free (font_desc); } else mixgtk_config_remove (keys_[f]); } gboolean mixgtk_fontsel_query_font (mixgtk_font_t f, GtkWidget **w, size_t no) { gint result = GTK_RESPONSE_APPLY; const gchar *current; gboolean ret = FALSE; if (f >= MIX_FONT_NO) return FALSE; if (!fontsel_dialog_) init_fontsel_ (); current = mixgtk_config_get (keys_[f]); gtk_font_selection_dialog_set_font_name (fontsel_dialog_, current? current : default_font_); while (result == GTK_RESPONSE_APPLY) { result = gtk_dialog_run (GTK_DIALOG (fontsel_dialog_)); if (result != GTK_RESPONSE_CANCEL) { gint k; mixgtk_config_update (keys_[f], gtk_font_selection_dialog_get_font_name (fontsel_dialog_)); for (k = 0; k < no; ++k) mixgtk_fontsel_set_font (f, w[k]); ret = TRUE; } } gtk_widget_hide (GTK_WIDGET (fontsel_dialog_)); return ret; } void on_all_fonts_activate (void) { gint result = GTK_RESPONSE_APPLY; const gchar *current; if (!fontsel_dialog_) init_fontsel_ (); current = mixgtk_config_get (keys_[MIX_FONT_DEFAULT]); gtk_font_selection_dialog_set_font_name (fontsel_dialog_, current? current : default_font_); while (result == GTK_RESPONSE_APPLY) { result = gtk_dialog_run (GTK_DIALOG (fontsel_dialog_)); if (result != GTK_RESPONSE_CANCEL) { gint k; current = gtk_font_selection_dialog_get_font_name (fontsel_dialog_); for (k = 0; k < MIX_FONT_NO; ++k) mixgtk_config_update (keys_[k], current); mixgtk_mixal_update_fonts (); mixgtk_mixvm_update_fonts (); mixgtk_device_update_fonts (); mixgtk_cmd_dispatcher_update_fonts (); } } gtk_widget_hide (GTK_WIDGET (fontsel_dialog_)); } mdk-1.2.9/mixgtk/mixgtk.c0000644000175000017500000000363512112755472012206 00000000000000/* -*-c-*- -------------- mixgtk.c : * Main functions of the mix gtk front-end * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "mixgtk_widgets.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_input.h" #include "mixgtk_config.h" #include "mixgtk_wm.h" #include "mixgtk.h" /* initialise the app */ gboolean mixgtk_init (int argc, char *argv[]) { mix_init_lib (); gtk_init (&argc, &argv); if (!mixgtk_config_load ()) { g_error (_("Unable to load gmixvm configuration")); } if (!mixgtk_widget_factory_init ()) { g_error (_("Unable to initialise application: missing glade file")); return FALSE; } if (!mixgtk_wm_init ()) { g_error (_("Unable to initialise application\n")); return FALSE; } mixgtk_input_init (); return TRUE; } /* main loop */ void mixgtk_main (void) { gtk_main (); } /* clean up */ void mixgtk_release (void) { if (mixgtk_config_is_autosave ()) mixgtk_config_save (); mix_vm_cmd_dispatcher_delete (mixgtk_cmd_dispatcher_get_mix_dispatcher ()); mix_release_lib (); } mdk-1.2.9/mixgtk/mixgtk_cmd_dispatcher.h0000644000175000017500000000347512112755472015246 00000000000000/* -*-c-*- ---------------- mixgtk_cmd_dispatcher.h : * functions to access the command dispatcher * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_CMD_DISPATCHER_H #define MIXGTK_CMD_DISPATCHER_H #include #include #include "mixgtk_widgets.h" /* initialise the command dispatcher */ extern gboolean mixgtk_cmd_dispatcher_init (mixgtk_dialog_id_t top); extern void mixgtk_cmd_dispatcher_update_fonts (void); /* dispatch an externally provided command */ extern void mixgtk_cmd_dispatcher_dispatch (const gchar *command); /* get times */ extern void mixgtk_cmd_dispatcher_get_times (gint *uptime, gint *progtime, gint *laptime); /* get the underlying vm */ extern mix_vm_t * mixgtk_cmd_dispatcher_get_vm (void); /* get the current source file */ extern const gchar * mixgtk_cmd_dispatcher_get_src_path (void); /* get the mix cmd dispatcher */ extern mix_vm_cmd_dispatcher_t * mixgtk_cmd_dispatcher_get_mix_dispatcher (void); #endif /* MIXGTK_CMD_DISPATCHER_H */ mdk-1.2.9/mixgtk/mixgtk_gen_handlers.c0000644000175000017500000001233212112755472014711 00000000000000/* -*-c-*- -------------- mixgtk_gen_handlers.c : * Implementation of the functions declared in mixgtk_gen_handlers.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include "mixgtk_gen_handlers.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_config.h" /* grab a file with an externally provided callback */ typedef void (*file_callback_t)(const gchar *file); static GtkFileChooser * get_chooser_ (const gchar *title, gboolean src) { static GtkFileChooser *dialog = NULL; static GtkFileFilter *src_filter = NULL; static GtkFileFilter *code_filter = NULL; if (dialog == NULL) { dialog = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new ("gmixvm", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL)); src_filter = gtk_file_filter_new (); gtk_file_filter_add_pattern (src_filter, "*.mixal"); gtk_file_filter_set_name (src_filter, "MIXAL files"); code_filter = gtk_file_filter_new (); gtk_file_filter_add_pattern (code_filter, "*.mix"); gtk_file_filter_set_name (code_filter, "MIX files"); gtk_file_chooser_add_filter (dialog, src_filter); gtk_file_chooser_add_filter (dialog, code_filter); } gtk_file_chooser_set_filter (dialog, src? src_filter : code_filter); gtk_window_set_title (GTK_WINDOW (dialog), title); return dialog; } static void get_file_ (file_callback_t callback, const gchar *title, gboolean is_src, const gchar *def_file) { static gchar *last_folder = NULL; if (callback != NULL) { GtkFileChooser *dialog = get_chooser_ (title, is_src); if (def_file != NULL) { gtk_file_chooser_set_filename (dialog, def_file); } else if (last_folder != NULL) { gtk_file_chooser_set_current_folder (dialog, last_folder); } gint result = gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_hide (GTK_WIDGET (dialog)); if (result == GTK_RESPONSE_ACCEPT) { gchar *filename = gtk_file_chooser_get_filename (dialog); if (filename) { callback (filename); if (last_folder) g_free (last_folder); last_folder = g_path_get_dirname (filename); g_free (filename); } } } } /* exec prompt command */ static void exec_cmd_ (mix_vm_command_t cmd, const gchar *arg) { gchar *command; if (arg) command = g_strdup_printf ("%s %s", mix_vm_command_to_string (cmd), arg); else command = g_strdup (mix_vm_command_to_string (cmd)); mixgtk_cmd_dispatcher_dispatch (command); g_free (command); } /* load mix binary */ static void open_cb_ (const gchar *file) { exec_cmd_ (MIX_CMD_LOAD, file); } void on_file_open_activate (GtkWidget *w, gpointer data) { get_file_ (open_cb_, _("Load MIX program..."), FALSE, NULL); } /* edit mixal source */ static void edit_cb_ (const gchar *file) { exec_cmd_ (MIX_CMD_EDIT, file); } void on_file_edit_activate (GtkWidget *w, gpointer data) { get_file_ (edit_cb_, _("Edit MIXAL source file..."), TRUE, mixgtk_cmd_dispatcher_get_src_path ()); } /* compile mixal source */ static void compile_cb_ (const gchar *file) { exec_cmd_ (MIX_CMD_COMPILE, file); } void on_file_compile_activate (GtkWidget *w, gpointer data) { get_file_ (compile_cb_, _("Compile MIXAL source file..."), TRUE, mixgtk_cmd_dispatcher_get_src_path ()); } void on_debug_run_activate (GtkWidget *w, gpointer p) { mixgtk_cmd_dispatcher_dispatch (mix_vm_command_to_string (MIX_CMD_RUN)); } void on_debug_next_activate (GtkWidget *w, gpointer p) { mixgtk_cmd_dispatcher_dispatch (mix_vm_command_to_string (MIX_CMD_NEXT)); } void on_file_exit_activate (GtkWidget *w, gpointer data) { gtk_main_quit (); } void on_clear_breakpoints_activate (GtkWidget *w, gpointer data) { mixgtk_cmd_dispatcher_dispatch (mix_vm_command_to_string (MIX_CMD_CABP)); } void on_save_on_exit_toggle (GtkWidget *w, gpointer data) { mixgtk_config_set_autosave (GTK_CHECK_MENU_ITEM (w)->active); } void on_save_activate (GtkWidget *w, gpointer data) { mixgtk_config_save (); } mdk-1.2.9/mixgtk/mixgtk_input.c0000644000175000017500000001454712112755472013431 00000000000000/* -*-c-*- -------------- mixgtk_input.c : * Implementation of the functions declared in mixgtk_input.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include "mixgtk_widgets.h" #include "mixgtk_input.h" enum { MSG_, SIGN_, B1_, B2_, B3_, B4_, B5_, DEC_, RESET_, OK_, SIZE_ }; static const gchar *WGT_NAMES_[SIZE_] = { "word_label", "word_sign", "word_b1", "word_b2", "word_b3", "word_b4", "word_b5", "word_decimal", "word_reset", "word_ok" }; static GtkDialog *dialog_ = NULL; static GtkWidget *childs_[SIZE_]; static input_callback_t callback_; static gpointer data_; static void init_dialog_ (void); static void set_word_ (mix_word_t word); /* init */ void mixgtk_input_init (void) { dialog_ = NULL; } /* get a word */ void mixgtk_input_word (const gchar *message, mix_word_t def, input_callback_t cb, gpointer data) { if (!dialog_) init_dialog_ (); gtk_label_set_text (GTK_LABEL (childs_[MSG_]), message); set_word_ (def); callback_ = cb; data_ = data; gtk_widget_show (childs_[B1_]); gtk_widget_show (childs_[B2_]); gtk_widget_show (childs_[B3_]); gtk_widget_show (GTK_WIDGET (dialog_)); } /* get a short */ void mixgtk_input_short (const gchar *message, mix_short_t def, input_callback_t cb, gpointer data) { if (!dialog_) init_dialog_ (); gtk_label_set_text (GTK_LABEL (childs_[MSG_]), message); set_word_ (mix_word_to_short_fast (def)); callback_ = cb; data_ = data; gtk_widget_show (GTK_WIDGET (dialog_)); gtk_widget_hide (childs_[B1_]); gtk_widget_hide (childs_[B2_]); gtk_widget_hide (childs_[B3_]); } #include /* dec and bytes input handler */ void on_word_dec_changed (GtkEditable *dec, gpointer *data) { gchar *txt = gtk_editable_get_chars (dec, 0, -1); if (strlen (txt) > 0) { gint val = atoi (txt); set_word_ (mix_word_new (val)); } g_free (txt); } void on_word_byte_changed (GtkEditable *byte, gpointer *data) { gchar *txt = gtk_editable_get_chars (byte, 0, 2); if (strlen (txt) > 0) { mix_byte_t bytes[5]; gint k; const gchar *s; mix_word_t w; for (k = 0; k < 5; ++k) { const gchar *text = gtk_entry_get_text (GTK_ENTRY (childs_[B1_ + k])); bytes[k] = mix_byte_new (atoi (text)); } w = mix_bytes_to_word (bytes, 5); s = gtk_entry_get_text (GTK_ENTRY (childs_[SIGN_])); if (s && s[0] == '-') mix_word_reverse_sign (w); set_word_ (w); } g_free (txt); } void on_word_sign_changed (GtkEditable *sign, gpointer *data) { gchar *txt = gtk_editable_get_chars (sign, 0, 1); if (strlen (txt) > 0) { gint pos = 0; mix_word_t w = mix_word_new (atoi (gtk_entry_get_text (GTK_ENTRY (childs_[DEC_])))); g_signal_handlers_block_by_func (GTK_OBJECT (sign), on_word_sign_changed, data); if (txt[0] != '+' && txt[0] != '-') txt[0] = '+'; gtk_editable_delete_text (sign, 0, 1); gtk_editable_insert_text (sign, txt, 1, &pos); g_signal_handlers_unblock_by_func (GTK_OBJECT (sign), on_word_sign_changed, data); set_word_ (txt[0] == '-' ? mix_word_negative (w) : w); } g_free (txt); } void on_word_ok_clicked (GtkWidget *widget, gpointer *data) { const gchar *text = gtk_entry_get_text (GTK_ENTRY (childs_[DEC_])); mix_word_t w = mix_word_new (atoi (text)); if (w == MIX_WORD_ZERO) { const gchar *sign = gtk_entry_get_text (GTK_ENTRY (childs_[SIGN_])); if (sign && sign[0] == '-') mix_word_reverse_sign (w); } callback_ (w, data_); gtk_widget_hide (GTK_WIDGET (dialog_)); } void on_word_cancel_clicked (GtkWidget *widget, gpointer *data) { gtk_widget_hide (GTK_WIDGET (dialog_)); } void on_word_reset_clicked (GtkWidget *w, gpointer *data) { set_word_ (MIX_WORD_ZERO); } static void init_dialog_ (void) { gint k; dialog_ = GTK_DIALOG (mixgtk_widget_factory_get_dialog (MIXGTK_WORD_DIALOG)); g_assert (dialog_ != NULL); for (k = 0; k < SIZE_; ++k) { childs_[k] = mixgtk_widget_factory_get_child_by_name (MIXGTK_WORD_DIALOG, WGT_NAMES_[k]); g_assert (childs_[k] != NULL); } } static void set_word_ (mix_word_t word) { enum {SIZE = 50}; static gchar BUFFER[SIZE] = {0}; gint k; gint val = mix_word_magnitude (word); gboolean neg = mix_word_is_negative (word); g_snprintf (BUFFER, SIZE, "%s%d", neg ? "-" : "", val); g_signal_handlers_block_by_func (GTK_OBJECT (childs_[DEC_]), on_word_dec_changed, NULL); g_signal_handlers_block_by_func (GTK_OBJECT (childs_[SIGN_]), on_word_sign_changed, NULL); for (k = B1_; k <= B5_; ++k) g_signal_handlers_block_by_func (GTK_OBJECT (childs_[k]), on_word_byte_changed, NULL); gtk_entry_set_text (GTK_ENTRY (childs_[DEC_]), BUFFER); gtk_entry_set_text (GTK_ENTRY (childs_[SIGN_]), neg ? "-" : "+"); for (k = 1; k < 6; ++k) { mix_byte_t b = mix_word_get_byte (word, k); g_snprintf (BUFFER, SIZE, "%d", (int)b); gtk_entry_set_text (GTK_ENTRY (childs_[SIGN_ + k]), BUFFER); } for (k = B1_; k <= B5_; ++k) g_signal_handlers_unblock_by_func (GTK_OBJECT (childs_[k]), on_word_byte_changed, NULL); g_signal_handlers_unblock_by_func (GTK_OBJECT (childs_[DEC_]), on_word_dec_changed, NULL); g_signal_handlers_unblock_by_func (GTK_OBJECT (childs_[SIGN_]), on_word_sign_changed, NULL); } mdk-1.2.9/mixgtk/mixgtk_device.c0000644000175000017500000004362512112755472013530 00000000000000/* -*-c-*- ---------------- mixgtk_device.c : * actual types for mixgtk devices * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include "mixgtk.h" #include "mixgtk_gen_handlers.h" #include "mixgtk_widgets.h" #include "mixgtk_fontsel.h" #include "mixgtk_config.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_device.h" #define BIN_DEV_COL_ 5 static const gchar *DEV_FORMAT_KEY_ = "Device.format"; /* device container */ static GtkNotebook *dev_nb_ = NULL; /* devdir dialog */ static GtkWidget *devdir_dlg_ = NULL; static GtkEntry *devdir_entry_ = NULL; /* terminal input dialog */ static GtkWidget *input_dlg_ = NULL; static GtkEntry *input_dlg_entry_ = NULL; static GtkListStore *input_list_ = NULL; /** configuration stuff */ #define LAST_BIN_DEV_ mix_dev_DISK_7 static GtkWidget *devdlg_ = NULL; static GtkWidget *dtoggle_ = NULL; static GtkWidget *wtoggle_ = NULL; static GtkWidget *combo_ = NULL; /* virtual machine */ static mix_vm_t *vm_ = NULL; /* dec settings */ static gint32 decs_ = 0; static gint32 new_decs_ = 0; /* macros manipulating dec settings */ #define IS_DEC(flags,type) (((flags) >> (type)) & 1) #define SET_DEC(flags,type) ((flags) |= (1<<(type))) #define CLEAR_DEC(flags,type) ((flags) &= ~(1<<(type))) /* a mixgtk device */ struct mixgtk_device_t { mix_device_t device; GtkWidget *widget; GtkWidget *scroll; }; struct mixgtk_bin_device_t { struct mixgtk_device_t gtk_device; guint last_insert; GtkListStore *store; gboolean dec; }; /* callbacks for output devices */ static void write_char_ (struct mixgtk_device_t *dev, const mix_word_t *block) { enum {MAX_BLOCK = 24, BUFF_SIZE = MAX_BLOCK * 5 + 2}; static gchar BUFFER[BUFF_SIZE]; guint k, j; GtkTextIter end; GtkTextBuffer *buffer; GtkTextMark *mark; for (k = 0; k < SIZES_[dev->device.type]; k++) for (j = 1; j < 6; j++) { mix_char_t ch = mix_word_get_byte (block[k], j); BUFFER[5 * k + j - 1] = mix_char_to_ascii (ch); } BUFFER[5 * k] = '\n'; BUFFER[5 * k + 1] = '\0'; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dev->widget)); gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_place_cursor (buffer, &end); gtk_text_buffer_insert_at_cursor (buffer, BUFFER, -1); mark = gtk_text_buffer_get_insert (buffer); gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (dev->widget), mark, 0, TRUE, 0, 0); } static const gchar * get_word_string_ (mix_word_t w, gboolean dec) { enum {BUFF_SIZE = 17}; static gchar BUFFER[BUFF_SIZE] = { 0 }; if (dec) g_snprintf (BUFFER, BUFF_SIZE, "%s%011ld", mix_word_is_negative (w)? "-" : "+", mix_word_magnitude (w)); else mix_word_print_to_buffer (w, BUFFER); return BUFFER; } static void write_bin_ (struct mixgtk_bin_device_t *dev, const mix_word_t *block) { guint k, col; gboolean dec = FALSE; size_t len; GtkTreeView *view = GTK_TREE_VIEW (dev->gtk_device.widget); GtkListStore *store = dev->store; GtkTreeIter iter; g_assert (view); g_assert (store); dec = IS_DEC(decs_, dev->gtk_device.device.type); for (k = 0, len = SIZES_[dev->gtk_device.device.type]; k < len; k += BIN_DEV_COL_) { gtk_list_store_append (store, &iter); for (col = 0; col < BIN_DEV_COL_; ++col) gtk_list_store_set (store, &iter, col, get_word_string_ (block[k + col], dec), col + BIN_DEV_COL_, (guint)block[k + col], -1); dev->last_insert++; } } static gboolean write_ (mix_device_t *dev, const mix_word_t *block) { struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *) dev; if (dev->type != mix_dev_CONSOLE && !(DEF_DEV_VTABLE_->write)(dev, block)) return FALSE; if (MODES_[dev->type] == mix_dev_CHAR) write_char_ (gtkdev, block); else write_bin_ ((struct mixgtk_bin_device_t *)gtkdev, block); gtk_notebook_set_current_page (dev_nb_, gtk_notebook_page_num (dev_nb_, gtkdev->scroll)); return TRUE; } static void init_input_widgets_ (void) { input_dlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_INPUT_DIALOG); g_assert (input_dlg_); input_dlg_entry_ = GTK_ENTRY (mixgtk_widget_factory_get_child_by_name (MIXGTK_INPUT_DIALOG, "input_entry")); g_assert (input_dlg_entry_); GtkEntryCompletion *completion = gtk_entry_completion_new (); input_list_ = gtk_list_store_new (1, G_TYPE_STRING); gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (input_list_)); gtk_entry_completion_set_popup_completion (completion, TRUE); #if GTK_CHECK_VERSION(2,8,0) gtk_entry_completion_set_popup_single_match (completion, TRUE); #endif gtk_entry_completion_set_inline_completion (completion, FALSE); gtk_entry_completion_set_minimum_key_length (completion, 1); gtk_entry_completion_set_text_column (completion, 0); gtk_entry_set_completion (input_dlg_entry_, completion); } static gboolean find_input_ (const gchar *text) { GtkTreeModel *list_store = GTK_TREE_MODEL (input_list_); GtkTreeIter iter; gboolean valid = gtk_tree_model_get_iter_first (list_store, &iter); gboolean found = FALSE; while (valid && !found) { gchar *str_data; gtk_tree_model_get (list_store, &iter, 0, &str_data, -1); found = (g_ascii_strcasecmp (str_data, text) == 0); valid = gtk_tree_model_iter_next (list_store, &iter); g_free (str_data); } return found; } static gboolean read_cons_ (mix_word_t *block) { gchar *text; size_t i, j; if (input_dlg_ == NULL) { init_input_widgets_ (); } gtk_entry_set_text (input_dlg_entry_, ""); gint result = gtk_dialog_run (GTK_DIALOG (input_dlg_)); gtk_widget_hide (input_dlg_); if (result == GTK_RESPONSE_OK) { text = g_strdup_printf ("%-70s", gtk_entry_get_text (input_dlg_entry_)); for (i = 0; i < 70; ++i) for (j = 0; j < 5; ++j) mix_word_set_byte (block + i, j + 1, mix_char_to_byte (mix_ascii_to_char (text[5 * i + j]))); if (!find_input_ (g_strchomp (text))) { GtkTreeIter iter; gtk_list_store_append (input_list_, &iter); gtk_list_store_set (input_list_, &iter, 0, text, -1); } g_free (text); } return TRUE; } static gboolean read_ (mix_device_t *dev, mix_word_t *block) { struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *) dev; if (dev->type == mix_dev_CONSOLE && !read_cons_ (block)) return FALSE; if (dev->type != mix_dev_CONSOLE && !(DEF_DEV_VTABLE_->read)(dev, block)) return FALSE; if (MODES_[dev->type] == mix_dev_CHAR) write_char_ (gtkdev, block); else write_bin_ ((struct mixgtk_bin_device_t *)gtkdev, block); gtk_notebook_set_current_page (dev_nb_, gtk_notebook_page_num (dev_nb_, gtkdev->scroll)); return TRUE; } static gboolean ioc_ (mix_device_t *dev, mix_short_t cmd) { return (DEF_DEV_VTABLE_->ioc)(dev, cmd); } static gboolean busy_ (const mix_device_t *dev) { return (DEF_DEV_VTABLE_->busy)(dev); } static void destroy_ (mix_device_t *dev) { struct mixgtk_device_t *gtkdev = (struct mixgtk_device_t *)dev; if (MODES_[dev->type] == mix_dev_BIN) { struct mixgtk_bin_device_t * bdev = (struct mixgtk_bin_device_t *)dev; gtk_list_store_clear (bdev->store); g_object_unref ((gpointer)bdev->store); } (DEF_DEV_VTABLE_->destroy) (dev); gtk_notebook_remove_page (dev_nb_, gtk_notebook_page_num (dev_nb_, gtkdev->scroll)); } static mix_device_vtable_t MIXGTK_VTABLE_ = { write_, read_, ioc_, busy_, destroy_ }; /* create the gui part of the device */ static void mixgtk_device_construct_gui_ (struct mixgtk_device_t *dev) { GtkWidget *label = gtk_label_new (DEF_NAMES_[dev->device.type]); g_assert (label); dev->scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dev->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); if (MODES_[dev->device.type] == mix_dev_CHAR) { dev->widget = gtk_text_view_new (); gtk_text_view_set_editable (GTK_TEXT_VIEW (dev->widget), FALSE); } else { gint k; struct mixgtk_bin_device_t *bindev = (struct mixgtk_bin_device_t *)dev; GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); GType *types = g_new (GType, BIN_DEV_COL_ * 2); for (k = 0; k < BIN_DEV_COL_; ++k) { types[k] = G_TYPE_STRING; types[k + BIN_DEV_COL_] = G_TYPE_UINT; } bindev->store = gtk_list_store_newv (BIN_DEV_COL_ * 2, types); dev->widget = gtk_tree_view_new_with_model (GTK_TREE_MODEL (bindev->store)); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (dev->widget), FALSE); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (dev->widget), TRUE); for (k = 0; k < BIN_DEV_COL_; ++k) { gtk_tree_view_append_column (GTK_TREE_VIEW (dev->widget), gtk_tree_view_column_new_with_attributes ("", renderer, "text", k, NULL)); } g_free (types); } g_assert (dev->widget); gtk_container_add (GTK_CONTAINER (dev->scroll), dev->widget); mixgtk_fontsel_set_font (MIX_FONT_DEVICES, dev->widget); gtk_notebook_append_page (dev_nb_, dev->scroll, label); gtk_widget_show (label); gtk_widget_show (dev->scroll); gtk_widget_show (dev->widget); } static void redraw_bin_device_ (struct mixgtk_bin_device_t *dev) { if (dev != NULL) { GtkTreeModel *store = GTK_TREE_MODEL (dev->store); GtkTreeIter iter; gboolean valid; g_assert (store); valid = gtk_tree_model_get_iter_first (store, &iter); while (valid) { gint k; guint word; for (k = 0; k < BIN_DEV_COL_; ++k) { gtk_tree_model_get (store, &iter, k + BIN_DEV_COL_, &word, -1); gtk_list_store_set (GTK_LIST_STORE (store), &iter, k, get_word_string_ ((mix_word_t)word, dev->dec), -1); } valid = gtk_tree_model_iter_next (store, &iter); } gtk_widget_queue_draw (((struct mixgtk_device_t *)dev)->widget); } } /* create a new mixgtk device */ static mix_device_t * mixgtk_device_new_ (mix_device_type_t type) { struct mixgtk_device_t *dev = NULL; g_return_val_if_fail (type < mix_dev_INVALID, NULL); if (MODES_[type] == mix_dev_CHAR) { dev = g_new (struct mixgtk_device_t, 1); } else { dev = (struct mixgtk_device_t *) g_new (struct mixgtk_bin_device_t, 1); ((struct mixgtk_bin_device_t *)dev)->last_insert = 0; } construct_device_ (&dev->device, type); dev->device.vtable = &MIXGTK_VTABLE_; mixgtk_device_construct_gui_ (dev); return (mix_device_t *)dev; } /* init default devices */ GtkWidget * mixgtk_device_init (mix_vm_t *vm) { g_assert (vm != NULL); vm_ = vm; devdlg_ = NULL; devdir_dlg_ = NULL; devdir_entry_ = NULL; input_dlg_ = NULL; dtoggle_ = NULL; wtoggle_ = NULL; combo_ = NULL; if (dev_nb_ == NULL) { mix_vm_set_device_factory (vm, mixgtk_device_new_); /* read format configuration */ if (mixgtk_config_get (DEV_FORMAT_KEY_)) decs_ = atoi (mixgtk_config_get (DEV_FORMAT_KEY_)); dev_nb_ = GTK_NOTEBOOK (gtk_notebook_new ()); gtk_notebook_set_tab_pos (dev_nb_, GTK_POS_RIGHT); gtk_notebook_set_scrollable (dev_nb_, FALSE); } mixgtk_fontsel_set_font (MIX_FONT_DEVICES, GTK_WIDGET (dev_nb_)); return GTK_WIDGET (dev_nb_); } void mixgtk_device_set_format (mix_device_type_t dev, gboolean dec) { gboolean changed; g_return_if_fail (dev < mix_dev_INVALID); changed = (dec && !IS_DEC (decs_, dev)) || (!dec && IS_DEC (decs_, dev)); if (changed && (MODES_[dev] == mix_dev_BIN)) { struct mixgtk_bin_device_t *gdev = (struct mixgtk_bin_device_t *) mix_vm_get_device (vm_, dev); if (gdev != NULL) { if (dec) SET_DEC (decs_, dev); else CLEAR_DEC (decs_, dev); gdev->dec = !(gdev->dec); redraw_bin_device_ (gdev); } } } static mix_device_type_t get_device_idx_ (void) { int k; const gchar *name = gtk_entry_get_text (GTK_ENTRY (GTK_BIN (combo_)->child)); for (k = 0; k <= LAST_BIN_DEV_; ++k) if (!strcmp (name, DEF_NAMES_[k])) break; return k; } static void init_devform_ (void) { devdlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_DEVFORM_DIALOG); g_assert (devdlg_); dtoggle_ = mixgtk_widget_factory_get_child_by_name (MIXGTK_DEVFORM_DIALOG, "decradio"); g_assert (dtoggle_); wtoggle_ = mixgtk_widget_factory_get_child_by_name (MIXGTK_DEVFORM_DIALOG, "wordradio"); g_assert (wtoggle_); combo_ = mixgtk_widget_factory_get_child_by_name (MIXGTK_DEVFORM_DIALOG, "dev_combo"); g_assert (combo_); gtk_editable_set_editable (GTK_EDITABLE (GTK_BIN (combo_)->child), FALSE); } void on_dev_combo_changed () { mix_device_type_t dev = get_device_idx_ (); if (dev <= LAST_BIN_DEV_) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dtoggle_), IS_DEC (new_decs_, dev)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wtoggle_), !IS_DEC (new_decs_, dev)); } } void on_devform_activate () { gint result = GTK_RESPONSE_APPLY; if (!devdlg_) init_devform_ (); new_decs_ = decs_; while (result == GTK_RESPONSE_APPLY) { //on_dev_combo_changed (); result = gtk_dialog_run (GTK_DIALOG (devdlg_)); if (result != GTK_RESPONSE_CANCEL) { int k; gchar value[20]; for (k = 0; k <= LAST_BIN_DEV_; ++k) mixgtk_device_set_format (k, IS_DEC (new_decs_, k)); decs_ = new_decs_; g_snprintf (value, 20, "%d", decs_); mixgtk_config_update (DEV_FORMAT_KEY_, value); } } gtk_widget_hide (devdlg_); } void on_decradio_toggled (GtkToggleButton *button) { if (gtk_toggle_button_get_active (button)) SET_DEC (new_decs_, get_device_idx_ ()); else CLEAR_DEC (new_decs_, get_device_idx_ ()); } void on_devset_button_clicked () { static gint32 ON = 0xffff, OFF = 0; new_decs_ = (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dtoggle_)))? ON : OFF; } void on_devdir_activate () { static const gchar *DEVDIR_ENTRY_NAME = "devdir_entry"; if (devdir_dlg_ == NULL) { devdir_dlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_DEVDIR_DIALOG); g_assert (devdir_dlg_); devdir_entry_ = GTK_ENTRY (mixgtk_widget_factory_get_child_by_name (MIXGTK_DEVDIR_DIALOG, DEVDIR_ENTRY_NAME)); g_assert (devdir_entry_); } gtk_entry_set_text (devdir_entry_, mix_device_get_dir ()); gtk_widget_show (devdir_dlg_); } void on_devdir_browse_clicked () { GtkWidget *dialog; const gchar *current = gtk_entry_get_text (devdir_entry_); dialog = gtk_file_chooser_dialog_new (_("Devices folder"), GTK_WINDOW (devdir_dlg_), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (current != NULL) gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), current); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_entry_set_text (devdir_entry_, filename); g_free (filename); } gtk_widget_destroy (dialog); } void on_devdir_cancel_clicked () { gtk_widget_hide (devdir_dlg_); } void on_devdir_ok_clicked () { const gchar *dirname = gtk_entry_get_text (devdir_entry_); gchar *cmd = g_strconcat (mix_vm_command_to_string (MIX_CMD_SDDIR), " ", dirname, NULL); gtk_widget_hide (devdir_dlg_); mixgtk_cmd_dispatcher_dispatch (cmd); g_free (cmd); } /* fonts */ static GtkWidget ** font_widgets_ (gint * n) { gint no = gtk_notebook_get_n_pages (dev_nb_); GtkWidget **w = g_new (GtkWidget *, no + 1); gint k, j; for (k = 0, j = 0; k < no && j < mix_dev_INVALID; ++j) { struct mixgtk_device_t * dev = (struct mixgtk_device_t *) mix_vm_get_device (vm_, j); if (dev != NULL) w[k++] = dev->widget; } g_assert (k == no); w[k] = GTK_WIDGET (dev_nb_); if (n) *n = no; return w; } void on_devices_font_activate () { gint no = 0; GtkWidget **w = font_widgets_ (&no); mixgtk_fontsel_query_font (MIX_FONT_DEVICES, w, no + 1); g_free (w); } void mixgtk_device_update_fonts (void) { gint k, n = 0; GtkWidget **w = font_widgets_ (&n); g_assert (n >= 0); for (k = 0; k < n; ++k) mixgtk_fontsel_set_font (MIX_FONT_DEVICES, w[k]); } mdk-1.2.9/mixgtk/mixgtk.h0000644000175000017500000000244612112755472012212 00000000000000/* -*-c-*- ---------------- mixgtk.h : * Gmixvm initialisation and cleanup functions * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_H #define MIXGTK_H #include #include /* the app files directory */ #define MIXGTK_FILES_DIR ".mdk" /* initialise the app */ extern gboolean mixgtk_init (int argc, char *argv[]); /* enter the main mixgtk loop */ extern void mixgtk_main (void); /* clean up */ extern void mixgtk_release (void); #endif /* MIXGTK_H */ mdk-1.2.9/mixgtk/Makefile.am0000644000175000017500000000367412622454575012604 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2001, 2004, 2006, 2008, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EXTRA_DIST = mixgtk.glade if MAKE_GUILE GUILED = -DMAKE_GUILE GUILEL = $(top_builddir)/mixguile/libmixguile.a else GUILED = GUILEL = endif if DARWIN_SYSTEM EDITOR_CMD = "/usr/bin/open -a TextEdit %s" EXTRA_EXECD = -DEXTRA_EXEC_MIME_TYPE else EDITOR_CMD = "/usr/bin/xterm -e vi %s" EXTRA_EXECD = endif if MAKE_GUI pkgdata_DATA = mixgtk.glade AM_CFLAGS += -I$(includedir) -I$(top_srcdir) \ -DGLADE_FILE=\""$(pkgdatadir)/mixgtk.glade"\"\ -DLOCAL_GLADE_FILE=\""$(srcdir)/mixgtk.glade"\"\ -DDEFAULT_EDITOR_CMD=\"$(EDITOR_CMD)\"\ -DDEFAULT_ASM_CMD="\"$(bindir)/mixasm %s"\"\ $(GUILED) $(EXTRA_EXECD) LDADD = $(top_builddir)/mixlib/libmix.a $(top_builddir)/lib/libreplace.a\ $(GUILEL) $(INTLLIBS) if ! DARWIN_SYSTEM AM_LDFLAGS = -Wl,--export-dynamic endif bin_PROGRAMS = gmixvm gmixvm_SOURCES = gmixvm.c mixgtk.h mixgtk.c \ mixgtk_config.h mixgtk_config.c \ mixgtk_gen_handlers.h mixgtk_gen_handlers.c \ mixgtk_external.h mixgtk_external.c \ mixgtk_cmd_dispatcher.h mixgtk_cmd_dispatcher.c \ mixgtk_widgets.h mixgtk_widgets.c \ mixgtk_device.h mixgtk_device.c \ mixgtk_mixvm.h mixgtk_mixvm.c \ mixgtk_mixal.h mixgtk_mixal.c \ mixgtk_input.h mixgtk_input.c \ mixgtk_fontsel.h mixgtk_fontsel.c \ mixgtk_wm.h mixgtk_wm.c endif mdk-1.2.9/mixgtk/mixgtk_mixal.h0000644000175000017500000000325112112755472013377 00000000000000/* -*-c-*- ---------------- mixgtk_mixal.h : * Declarations for functions displaying the mixal source file * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_MIXAL_H #define MIXGTK_MIXAL_H #include #include #include "mixgtk_widgets.h" /* initialise the mixal widget */ extern GtkWidget * mixgtk_mixal_init (mix_vm_t *vm); extern void mixgtk_mixal_reparent (GtkStatusbar *stat); /* load the corresponding mixal file */ extern void mixgtk_mixal_load_file (void); /* update the widget */ extern void mixgtk_mixal_update (void); extern void mixgtk_mixal_update_fonts (void); extern void mixgtk_mixal_pop_status (void); /* breakpoints */ extern void mixgtk_mixal_update_bp_at_address (guint addr); extern void mixgtk_mixal_update_bp_at_line (guint line); extern void mixgtk_mixal_update_bp_all (void); #endif /* MIXGTK_MIXAL_H */ mdk-1.2.9/mixgtk/mixgtk_mixvm.c0000644000175000017500000003324312112755472013424 00000000000000/* -*-c-*- -------------- mixgtk_mixvm.c : * Implementation of the functions declared in mixgtk_mixvm.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2008 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include "mixgtk_widgets.h" #include "mixgtk_fontsel.h" #include "mixgtk_mixvm.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_input.h" /* Local variables */ #define REGISTER_NO_ (MIXGTK_WIDGET_rI6 - MIXGTK_WIDGET_rA + 1) static GtkEntry *reg_entries_[REGISTER_NO_]; static GtkEntry *loc_entry_; static GtkWidget *goto_ = NULL; static GtkEntry *goto_entry_ = NULL; static GtkToggleButton *over_button_; static GtkToggleButton *cmp_buttons_[3]; static GtkTreeView *memory_; static GtkListStore *mem_store_; static GtkLabel *laptime_; static GtkLabel *progtime_; static GtkLabel *uptime_; static mix_vm_t *vm_; #define HAVE_OLD_GTK !GTK_CHECK_VERSION(2, 12, 0) #if HAVE_OLD_GTK static GtkTooltips *tips_ = NULL; #endif /* Static function prototypes */ static void init_goto_ (void); static void update_register_ (mixgtk_widget_id_t reg); static gboolean init_mem_ (void); enum { MEM_ADDRESS_COL, MEM_CONTENTS_COL, MEM_COL_NO }; /* initialise the mixvm widgets */ gboolean mixgtk_mixvm_init (mix_vm_t *vm) { int k; g_assert (vm != NULL); vm_ = vm; #if HAVE_OLD_GTK if (!tips_) tips_ = gtk_tooltips_new (); #endif for (k = 0; k < REGISTER_NO_; ++k) { reg_entries_[k] = GTK_ENTRY (mixgtk_widget_factory_get(MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_rA + k)); g_assert (reg_entries_[k] != NULL); mixgtk_fontsel_set_font (MIX_FONT_MIXVM, GTK_WIDGET (reg_entries_[k])); } loc_entry_ = GTK_ENTRY (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_LOC)); g_assert (loc_entry_ != NULL); mixgtk_fontsel_set_font (MIX_FONT_MIXVM, GTK_WIDGET (loc_entry_)); uptime_ = GTK_LABEL (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_UPTIME)); g_assert (uptime_ != NULL); progtime_ = GTK_LABEL (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_PROGTIME)); g_assert (progtime_ != NULL); laptime_ = GTK_LABEL (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_LAPTIME)); g_assert (laptime_ != NULL); over_button_ = GTK_TOGGLE_BUTTON (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_OVER)); g_assert (over_button_ != NULL); for (k = 0; k < 3; ++k) { cmp_buttons_[k] = GTK_TOGGLE_BUTTON (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_CMP_L +k)); g_assert (cmp_buttons_[k] != NULL); } init_mem_ (); return TRUE; } static GtkWidget ** text_widgets_ (gint *n) { static GtkWidget *w[REGISTER_NO_ + 2] = { NULL}; if (w[0] == NULL) { gint k; w[0] = GTK_WIDGET (loc_entry_); w[1] = GTK_WIDGET (memory_); for (k = 0; k < REGISTER_NO_; ++k) w[k + 2] = GTK_WIDGET (reg_entries_[k]); }; if (n) *n = REGISTER_NO_ + 2; return w; } void mixgtk_mixvm_update_fonts (void) { gint k, n = 0; GtkWidget **w = text_widgets_ (&n); for (k = 0; k < n; ++k) mixgtk_fontsel_set_font (MIX_FONT_MIXVM, w[k]); } /* update register widgets */ void mixgtk_mixvm_update_registers (void) { gint k; for (k = MIXGTK_WIDGET_rA; k <= MIXGTK_WIDGET_rI6; ++k) update_register_ (k); } /* update the overflow toggle */ void mixgtk_mixvm_update_over_toggle (void) { g_assert (over_button_); gtk_toggle_button_set_active (over_button_, mix_vm_get_overflow (vm_)); } /* update the comparison flag */ void mixgtk_mixvm_update_cmp (void) { gint toggle = mix_vm_get_cmpflag (vm_); gtk_toggle_button_set_active (cmp_buttons_[toggle], TRUE); } /* update the memory cells */ void mixgtk_mixvm_update_cells (void) { static gchar BUFFER[20]; GtkTreeIter iter; gboolean valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (mem_store_), &iter); gint k = 0; while (valid) { mix_word_print_to_buffer (mix_vm_get_addr_contents (vm_, k++), BUFFER); gtk_list_store_set (mem_store_, &iter, MEM_CONTENTS_COL, BUFFER, -1); valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (mem_store_), &iter); } } void mixgtk_mixvm_update_cells_to_address (gint address) { GtkTreePath *path = gtk_tree_path_new_from_indices (address, -1); if (address >= MIX_VM_CELL_NO) return; gtk_tree_view_scroll_to_cell (memory_, path, NULL, TRUE, 0, 0); gtk_tree_path_free (path); } /* update the loc pointer */ void mixgtk_mixvm_update_loc (void) { enum {SIZE = 10 }; static gchar BUFFER[SIZE]; mix_short_t locval; g_assert (loc_entry_); locval = mix_vm_get_prog_count (vm_); g_snprintf (BUFFER, SIZE, "%04d", mix_short_magnitude (locval)); gtk_entry_set_text (loc_entry_, BUFFER); } /* update times */ void mixgtk_mixvm_update_times (void) { enum {SIZE = 20 }; static gchar BUFFER[SIZE]; gint uptime, progtime, laptime; g_assert (uptime_ && progtime_ && laptime_); mixgtk_cmd_dispatcher_get_times (&uptime, &progtime, &laptime); g_snprintf (BUFFER, SIZE, "%d", uptime); gtk_label_set_text (uptime_, BUFFER); g_snprintf (BUFFER, SIZE, "%d", progtime); gtk_label_set_text (progtime_, BUFFER); g_snprintf (BUFFER, SIZE, "%d", laptime); gtk_label_set_text (laptime_, BUFFER); } /* update all mixvm widgets */ void mixgtk_mixvm_update_vm_widgets (void) { mixgtk_mixvm_update_registers (); mixgtk_mixvm_update_loc (); mixgtk_mixvm_update_over_toggle (); mixgtk_mixvm_update_cmp (); mixgtk_mixvm_update_cells (); mixgtk_mixvm_update_times (); } /* update cmp flag */ void on_cmp_e_toggled (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) mix_vm_set_cmpflag (vm_, mix_EQ); } void on_cmp_l_toggled (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) mix_vm_set_cmpflag (vm_, mix_LESS); } void on_cmp_g_toggled (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) mix_vm_set_cmpflag (vm_, mix_GREAT); } void on_overflow_toggled (GtkWidget *widget, gpointer data) { mix_vm_set_overflow (vm_, GTK_TOGGLE_BUTTON (widget)->active); } void on_loc_arrow_clicked (GtkWidget *widget, gpointer data) { gint address = mix_short_magnitude (mix_vm_get_prog_count (vm_)); mixgtk_mixvm_update_cells_to_address (address); } static void register_AX_ (mix_word_t w, gpointer reg) { gint k = GPOINTER_TO_INT (reg); if (k == 0) mix_vm_set_rA (vm_, w); else mix_vm_set_rX (vm_, w); update_register_ (MIXGTK_WIDGET_rA + k); } static void register_j_ (mix_word_t w, gpointer data) { if (mix_word_is_negative (w)) mix_word_reverse_sign (w); mix_vm_set_rJ (vm_, mix_word_to_short_fast (w)); update_register_ (MIXGTK_WIDGET_rJ); } static void register_i_ (mix_word_t w, gpointer reg) { mix_vm_set_rI (vm_, GPOINTER_TO_INT (reg), mix_word_to_short_fast (w)); update_register_ (MIXGTK_WIDGET_rI1 - 1 + GPOINTER_TO_INT (reg)); } gboolean on_register_click (GtkWidget *w, GdkEvent *e, gpointer data) { enum {SIZE = 20}; static gchar BUFFER[SIZE]; gint k; if (w == GTK_WIDGET (reg_entries_[0])) mixgtk_input_word (_("Register A"), mix_vm_get_rA (vm_), register_AX_, GINT_TO_POINTER (0)); else if (w == GTK_WIDGET (reg_entries_[1])) mixgtk_input_word (_("Register X"), mix_vm_get_rX (vm_), register_AX_, GINT_TO_POINTER(1)); else if (w == GTK_WIDGET (reg_entries_[2])) mixgtk_input_short (_("Register J"), mix_vm_get_rJ (vm_), register_j_, NULL); else for (k = 1; k < 7; ++k) { if (w == GTK_WIDGET (reg_entries_[2 + k])) { g_snprintf (BUFFER, SIZE, _("Register I%d"), k); mixgtk_input_short (BUFFER, mix_vm_get_rI (vm_, k), register_i_, GINT_TO_POINTER (k)); break; } } return TRUE; } static void mem_cell_ (mix_word_t w, gpointer a) { mix_short_t addr = mix_short_new (GPOINTER_TO_INT (a)); mix_vm_set_addr_contents (vm_, addr, w); mixgtk_mixvm_update_cells (); } void on_mix_font_activate (void) { gint n; GtkWidget **w = text_widgets_ (&n); mixgtk_fontsel_query_font (MIX_FONT_MIXVM, w, n); } /* static functions */ static void init_goto_ (void) { goto_ = mixgtk_widget_factory_get_dialog (MIXGTK_GOTO_DIALOG); g_assert (goto_ != NULL); goto_entry_ = GTK_ENTRY (mixgtk_widget_factory_get (MIXGTK_GOTO_DIALOG, MIXGTK_WIDGET_GOTO_ENTRY)); g_assert (goto_entry_ != NULL); } static void update_register_ (mixgtk_widget_id_t reg) { static gchar BUFFER[20]; mix_word_t tipval = MIX_WORD_ZERO; switch (reg) { case MIXGTK_WIDGET_rA: tipval = mix_vm_get_rA (vm_); mix_word_print_to_buffer (tipval, BUFFER); break; case MIXGTK_WIDGET_rX: tipval = mix_vm_get_rX (vm_); mix_word_print_to_buffer (tipval, BUFFER); break; case MIXGTK_WIDGET_rJ: tipval = mix_short_to_word_fast (mix_vm_get_rJ (vm_)); mix_short_print_to_buffer (mix_vm_get_rJ (vm_), BUFFER); break; case MIXGTK_WIDGET_rI1: case MIXGTK_WIDGET_rI2: case MIXGTK_WIDGET_rI3: case MIXGTK_WIDGET_rI4: case MIXGTK_WIDGET_rI5: case MIXGTK_WIDGET_rI6: { gint k = reg - MIXGTK_WIDGET_rI1 + 1; tipval = mix_short_to_word_fast (mix_vm_get_rI (vm_, k)); mix_short_print_to_buffer (mix_vm_get_rI (vm_, k), BUFFER); } break; default: g_assert_not_reached (); } gtk_entry_set_text (reg_entries_[reg - MIXGTK_WIDGET_rA], BUFFER); g_snprintf (BUFFER, 20, "%s%ld", mix_word_is_negative (tipval)? "-" : "", mix_word_magnitude (tipval)); #if HAVE_OLD_GTK gtk_tooltips_set_tip (tips_, GTK_WIDGET (reg_entries_[reg - MIXGTK_WIDGET_rA]), BUFFER, NULL); #else gtk_widget_set_tooltip_text ( GTK_WIDGET (reg_entries_[reg - MIXGTK_WIDGET_rA]), BUFFER); #endif } static void cells_clicked_ (GtkTreeViewColumn* col, gpointer data) { if (!goto_) init_goto_ (); if (gtk_dialog_run (GTK_DIALOG (goto_)) == GTK_RESPONSE_OK) { const gchar *txt = gtk_entry_get_text (goto_entry_); mix_short_t addr = mix_short_new (atoi (txt)); if (addr < MIX_VM_CELL_NO) mixgtk_mixvm_update_cells_to_address (addr); } gtk_widget_hide (goto_); } static gboolean cont_clicked_ (GtkWidget *w, GdkEvent *event, gpointer data) { enum {SIZE = 30}; static gchar BUFFER[SIZE]; if (event && event->type == GDK_BUTTON_PRESS) { GtkTreeIter iter; GtkTreeModel *model; GtkTreeSelection *selection; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (memory_)); if (gtk_tree_selection_get_selected (selection, &model, &iter)) { gint addr; gtk_tree_model_get (model, &iter, MEM_ADDRESS_COL, &addr, -1); g_snprintf (BUFFER, SIZE, _("Memory cell no. %d"), addr); mixgtk_input_word (BUFFER, mix_vm_get_addr_contents (vm_, mix_short_new (addr)), mem_cell_, GINT_TO_POINTER (addr)); } } return FALSE; } static gboolean init_mem_ (void) { gint k; GtkTreeIter iter; GtkCellRenderer *renderer; GtkTreeViewColumn *col; /* model */ mem_store_ = gtk_list_store_new (MEM_COL_NO, G_TYPE_INT, G_TYPE_STRING); g_assert (mem_store_); for (k = 0; k< MIX_VM_CELL_NO; ++k) { gtk_list_store_append (mem_store_, &iter); gtk_list_store_set (mem_store_, &iter, MEM_ADDRESS_COL, k, MEM_CONTENTS_COL, "+ 00 00 00 00 00", -1); } /* view */ renderer = gtk_cell_renderer_text_new (); memory_ = GTK_TREE_VIEW (mixgtk_widget_factory_get (MIXGTK_MIXVM_DIALOG, MIXGTK_WIDGET_CELLS)); g_assert (memory_); g_assert (renderer); gtk_tree_view_set_model (memory_, GTK_TREE_MODEL (mem_store_)); gtk_tree_view_set_headers_clickable (memory_, TRUE); g_object_unref (G_OBJECT (mem_store_)); col = gtk_tree_view_column_new_with_attributes ("Address", renderer, "text", 0, NULL); gtk_tree_view_column_set_clickable (col, TRUE); g_signal_connect (G_OBJECT (col), "clicked", G_CALLBACK (cells_clicked_), NULL); gtk_tree_view_append_column (memory_, col); col = gtk_tree_view_column_new_with_attributes ("Contents", renderer, "text", 1, NULL); gtk_tree_view_column_set_clickable (col, TRUE); g_signal_connect (G_OBJECT (col), "clicked", G_CALLBACK (cont_clicked_), NULL); gtk_tree_view_append_column (memory_, col); g_signal_connect_after (G_OBJECT (memory_), "event-after", G_CALLBACK (cont_clicked_), NULL); mixgtk_fontsel_set_font (MIX_FONT_MIXVM, GTK_WIDGET (memory_)); return TRUE; } mdk-1.2.9/mixgtk/mixgtk_device.h0000644000175000017500000000251112112755472013522 00000000000000/* -*-c-*- ---------------- mixgtk_device.h : * Block devices used by mixgtk * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_DEVICE_H #define MIXGTK_DEVICE_H #include #include #include /* init default devices */ extern GtkWidget * mixgtk_device_init (mix_vm_t *vm); extern void mixgtk_device_update_fonts (void); /* change the output format of a device */ extern void mixgtk_device_set_format (mix_device_type_t dev, gboolean dec); #endif /* MIXGTK_DEVICE_H */ mdk-1.2.9/mixgtk/mixgtk_cmd_dispatcher.c0000644000175000017500000003137212112755472015236 00000000000000/* -*-c-*- -------------- mixgtk_cmd_dispatcher.c : * Implementation of the functions declared in mixgtk_cmd_dispatcher.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #ifdef HAVE_LIBHISTORY # include #endif #ifdef MAKE_GUILE # include #endif #include #include #include "mixgtk_mixvm.h" #include "mixgtk_mixal.h" #include "mixgtk_fontsel.h" #include "mixgtk_config.h" #include "mixgtk_external.h" #include "mixgtk_cmd_dispatcher.h" /* a mix vm command dispatcher */ typedef struct mixgtk_dispatch_ { mix_vm_cmd_dispatcher_t *dispatcher; /* the underlying cmd dispatcher */ FILE *out; /* the dispatcher's output file */ int fildes[2]; /* pipe for communication with the dispatcher */ GtkWidget *prompt; /* the command prompt widget */ GtkWidget *log; /* the dispatcher's messages echo area */ GtkWidget *status; /* the status bar widget */ guint context; /* context of the status bar messages */ gchar *last_file; } mixgtk_dispatch_data_t; static struct mixgtk_dispatch_ dis_data_ = {NULL}; static const gchar *TITLE_FORMAT_ = "gmixvm - %s"; static void log_command_ (mixgtk_dispatch_data_t *dis, const gchar *cmd) { GtkTextBuffer *buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dis->log)); GtkTextIter end; gtk_text_buffer_get_end_iter (buf, &end); gtk_text_buffer_place_cursor (buf, &end); gtk_text_buffer_insert_at_cursor (buf, "MIX> ", -1); gtk_text_buffer_insert_at_cursor (buf, cmd, -1); gtk_text_buffer_insert_at_cursor (buf, "\n", -1); #ifdef HAVE_LIBHISTORY add_history ((char *)cmd); /* history_search ((char *)cmd, 0); */ history_set_pos (history_base + history_length - 1); #endif } static void flush_log_ (mixgtk_dispatch_data_t *dis) { enum {BLKSIZE = 100}; static gchar BUFFER[BLKSIZE]; GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dis->log)); GtkTextMark *mark; GtkTextIter end; ssize_t k; gtk_text_buffer_get_end_iter (buffer, &end); gtk_text_buffer_place_cursor (buffer, &end); fflush (dis->out); while ((k = read (dis->fildes[0], BUFFER, BLKSIZE)) != 0) { if (k == -1 && errno != EINTR) break; if (k != -1) gtk_text_buffer_insert_at_cursor (buffer, BUFFER, k); } mark = gtk_text_buffer_get_insert (buffer); gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (dis->log), mark, 0, TRUE, 0, 0); } /* hooks */ static void global_post_hook_ (mix_vm_cmd_dispatcher_t *dis, mix_vm_command_t cmd, const gchar *arg, gpointer data) { flush_log_ ((mixgtk_dispatch_data_t *)data); mixgtk_mixvm_update_vm_widgets (); } static void load_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { static glong id = -1; if (mix_vm_cmd_dispatcher_get_last_result (dis)) { GtkWindow *mainw = GTK_WINDOW (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN)); if (dis_data_.last_file) g_free (dis_data_.last_file); dis_data_.last_file = g_strdup_printf (TITLE_FORMAT_, arg); gtk_window_set_title (mainw, dis_data_.last_file); mixgtk_mixal_load_file (); mixgtk_mixal_update (); mixgtk_mixal_update_bp_all (); if (id != -1) gtk_statusbar_remove (GTK_STATUSBAR (dis_data_.status), dis_data_.context, (guint)id); id = gtk_statusbar_push (GTK_STATUSBAR (dis_data_.status), dis_data_.context, dis_data_.last_file); } } static void run_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { mixgtk_mixal_update (); } static void next_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { mixgtk_mixal_update (); } static void linebp_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { if (arg && strlen (arg)) mixgtk_mixal_update_bp_at_line (atoi (arg)); } static void addrbp_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { if (arg && strlen (arg)) mixgtk_mixal_update_bp_at_address (atoi (arg)); } static void allbp_post_hook_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg, gpointer data) { mixgtk_mixal_update_bp_all (); } static void install_hooks_ (void) { mix_vm_cmd_dispatcher_global_post_hook (dis_data_.dispatcher, global_post_hook_, (gpointer)(&dis_data_)); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_LOAD, load_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_RUN, run_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_NEXT, next_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_SBP, linebp_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_CBP, linebp_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_SBPA, addrbp_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_CBPA, addrbp_post_hook_, NULL); mix_vm_cmd_dispatcher_post_hook (dis_data_.dispatcher, MIX_CMD_CABP, allbp_post_hook_, NULL); } /* initialise the command dispatcher */ gboolean mixgtk_cmd_dispatcher_init (mixgtk_dialog_id_t top) { static gboolean restart = FALSE; gchar *text = NULL; dis_data_.prompt = mixgtk_widget_factory_get (top, MIXGTK_WIDGET_PROMPT); g_return_val_if_fail (dis_data_.prompt != NULL, FALSE); if (dis_data_.log) text = gtk_editable_get_chars (GTK_EDITABLE (dis_data_.log), 0, -1); dis_data_.log = mixgtk_widget_factory_get (top, MIXGTK_WIDGET_LOG); g_return_val_if_fail (dis_data_.log != NULL, FALSE); if (text) { gtk_text_buffer_insert_at_cursor (gtk_text_view_get_buffer (GTK_TEXT_VIEW (dis_data_.log)), text, -1); g_free (text); } if (!dis_data_.dispatcher) { static const gchar *HISTORY_FILE = "gmixvm.history"; static gint HISTORY_SIZE = 100; mix_config_t *config = mixgtk_config_get_mix_config (); int r = pipe (dis_data_.fildes); g_return_val_if_fail (r == 0, FALSE); /* connect stdout/stderr to the pipe's write end */ if (dup2 (dis_data_.fildes[1], STDOUT_FILENO) == -1 || dup2 (dis_data_.fildes[1], STDOUT_FILENO) == -1) return FALSE; dis_data_.out = fdopen (dis_data_.fildes[1], "w"); g_return_val_if_fail (dis_data_.out != NULL, FALSE); r = fcntl (dis_data_.fildes[0], F_GETFL, 0); g_return_val_if_fail (r != -1, FALSE); r |= O_NONBLOCK; r = fcntl(dis_data_.fildes[0], F_SETFL, r); g_return_val_if_fail (r != -1, FALSE); if (!mix_config_get_history_file (config)) mix_config_set_history_file (config, HISTORY_FILE); if (mix_config_get_history_size (config) == 0) mix_config_set_history_size (config, HISTORY_SIZE); dis_data_.dispatcher = mix_vm_cmd_dispatcher_new_with_config (dis_data_.out, dis_data_.out, config); mix_vm_cmd_dispatcher_print_time (dis_data_.dispatcher, FALSE); install_hooks_ (); } dis_data_.status = mixgtk_widget_factory_get (MIXGTK_MAIN, MIXGTK_WIDGET_STATUSBAR); g_return_val_if_fail (dis_data_.status != NULL, FALSE); dis_data_.context = gtk_statusbar_get_context_id (GTK_STATUSBAR (dis_data_.status), "cmd_dis_context"); if (!restart) mixgtk_external_init (dis_data_.dispatcher); if (dis_data_.last_file) gtk_window_set_title (GTK_WINDOW (mixgtk_widget_factory_get_dialog (MIXGTK_MAIN)), dis_data_.last_file); mixgtk_fontsel_set_font (MIX_FONT_LOG, dis_data_.log); mixgtk_fontsel_set_font (MIX_FONT_PROMPT, dis_data_.prompt); restart = TRUE; return TRUE; } /* dispatch an externally provided command */ #ifdef MAKE_GUILE static gboolean try_guile_ (const gchar *command) { if (command && command[0] == '(' && command[strlen (command) - 1] == ')') { mixguile_interpret_command (command); return TRUE; } return FALSE; } #else # define try_guile_(ignored) FALSE #endif void mixgtk_cmd_dispatcher_dispatch (const gchar *command) { GtkWidget *entry = dis_data_.prompt; g_return_if_fail (command != NULL); g_assert (entry != NULL); gtk_entry_set_text (GTK_ENTRY (entry), command); log_command_ (&dis_data_, command); if (!try_guile_ (command)) mix_vm_cmd_dispatcher_dispatch_text (dis_data_.dispatcher, command); gtk_entry_set_text (GTK_ENTRY (entry), ""); } /* get times */ void mixgtk_cmd_dispatcher_get_times (gint *uptime, gint *progtime, gint *laptime) { if (uptime != NULL) *uptime = mix_vm_cmd_dispatcher_get_uptime (dis_data_.dispatcher); if (progtime != NULL) *progtime = mix_vm_cmd_dispatcher_get_progtime (dis_data_.dispatcher); if (laptime != NULL) *laptime = mix_vm_cmd_dispatcher_get_laptime (dis_data_.dispatcher); } /* get the underlying vm */ mix_vm_t * mixgtk_cmd_dispatcher_get_vm (void) { return (mix_vm_t *) mix_vm_cmd_dispatcher_get_vm (dis_data_.dispatcher); } /* get the current source file */ const gchar * mixgtk_cmd_dispatcher_get_src_path (void) { return mix_vm_cmd_dispatcher_get_src_file_path (dis_data_.dispatcher); } /* get the mix cmd dispatcher */ mix_vm_cmd_dispatcher_t * mixgtk_cmd_dispatcher_get_mix_dispatcher (void) { return dis_data_.dispatcher; } /* process commands */ void complete_command_ (void) { GtkEntry *entry = GTK_ENTRY (dis_data_.prompt); gchar *prefix = NULL; const gchar *text = gtk_entry_get_text (entry); const GList *cmds = mix_vm_cmd_dispatcher_complete (dis_data_.dispatcher, text, &prefix); if (prefix != NULL) { GtkTextBuffer *buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (dis_data_.log)); gtk_entry_set_text (entry, prefix); if (g_list_length ((GList *)cmds) > 1) { static gchar BUFFER[25]; gint k = 0; gtk_text_buffer_insert_at_cursor (buf, "Completions:\n", -1); while (cmds) { g_snprintf (BUFFER, 25, "%-12s", (const char*)cmds->data); ++k; gtk_text_buffer_insert_at_cursor (buf, BUFFER, -1); if (k%5 == 0) gtk_text_buffer_insert_at_cursor (buf, "\n", -1); cmds = cmds->next; } if (k%5 != 0) gtk_text_buffer_insert_at_cursor (buf, "\n", -1); } else { gint pos = strlen (prefix); gtk_editable_insert_text (GTK_EDITABLE (entry), " ", 1, &pos); } flush_log_ (&dis_data_); g_free (prefix); } } int on_command_prompt_key_press_event (GtkEntry *w, GdkEventKey *e, gpointer d) { guint key = e->keyval; gboolean result = FALSE; #ifdef HAVE_LIBHISTORY HIST_ENTRY *entry = NULL; if (key == GDK_Up) { entry = previous_history (); if (entry && entry->line) gtk_entry_set_text (w, entry->line); result = TRUE; } if (key == GDK_Down) { entry = next_history (); if (entry && entry->line) gtk_entry_set_text (w, entry->line); result = TRUE; } #endif if (key == GDK_Tab) { complete_command_ (); result = TRUE; } if (result) gtk_editable_set_position (GTK_EDITABLE (w), -1); return result; } void on_command_prompt_activate (GtkEntry *prompt, gpointer data) { gchar *text = g_strstrip (gtk_editable_get_chars (GTK_EDITABLE (prompt), 0, -1)); if (text && *text) { log_command_ (&dis_data_, text); if (!try_guile_ (text)) mix_vm_cmd_dispatcher_dispatch_text (dis_data_.dispatcher, text); gtk_entry_set_text (prompt, ""); } g_free (text); } void on_log_font_activate () { GtkWidget *w[] = { dis_data_.log }; mixgtk_fontsel_query_font (MIX_FONT_LOG, w, 1); } void on_prompt_font_activate () { GtkWidget *w[] = { dis_data_.prompt }; mixgtk_fontsel_query_font (MIX_FONT_PROMPT, w, 1); } void mixgtk_cmd_dispatcher_update_fonts (void) { mixgtk_fontsel_set_font (MIX_FONT_LOG, dis_data_.log); mixgtk_fontsel_set_font (MIX_FONT_PROMPT, dis_data_.prompt); } mdk-1.2.9/mixgtk/mixgtk_external.c0000644000175000017500000001310312112755472014077 00000000000000/* -*-c-*- -------------- mixgtk_cmd_dispatcher.c : * Implementation of the functions declared in mixgtk_external.h * ------------------------------------------------------------------ * Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * */ #include #include #include "mixgtk_config.h" #include "mixgtk_cmd_dispatcher.h" #include "mixgtk_external.h" enum { ext_wdg_ed_chooser, ext_wdg_ed_entry, ext_wdg_asm_chooser, ext_wdg_asm_ls, ext_wdg_no }; static GtkWidget *ext_dlg_ = NULL; static GtkWidget *ext_wdg_[ext_wdg_no] = {NULL, NULL, NULL, NULL}; static const gchar *ext_wdg_names_[] = { "editor_chooser", "editor_entry", "mixasm_chooser", "mixasm_mls" }; static const gchar *EDITOR_KEY_ = "Editor"; static const gchar *MIXASM_KEY_ = "Mixasm"; static mix_vm_cmd_dispatcher_t *dispatcher_; static void init_widgets_ (void); static void update_dialog_ (void); static void read_config_ (void); static void update_config_ (void); static void update_editor_ (const gchar *cmd); static void update_asm_ (const gchar *cmd); void mixgtk_external_init (mix_vm_cmd_dispatcher_t *dispatcher) { g_assert (dispatcher); dispatcher_ = dispatcher; init_widgets_ (); read_config_ (); } void on_external_programs_activate () { if (ext_dlg_) { update_dialog_ (); gtk_widget_show (ext_dlg_); if (gtk_dialog_run (GTK_DIALOG (ext_dlg_)) == GTK_RESPONSE_OK) { update_config_ (); } gtk_widget_hide (ext_dlg_); } } void init_widgets_ (void) { gint k; GtkFileFilter *filter = gtk_file_filter_new (); g_assert (filter); ext_dlg_ = mixgtk_widget_factory_get_dialog (MIXGTK_EXTERNPROG_DIALOG); g_assert (ext_dlg_ != NULL); for (k = 0; k < ext_wdg_no; ++k) { ext_wdg_[k] = mixgtk_widget_factory_get_child_by_name (MIXGTK_EXTERNPROG_DIALOG, ext_wdg_names_[k]); g_assert (ext_wdg_[k]); } gtk_file_filter_add_mime_type (filter, "application/x-executable"); #ifdef EXTRA_EXEC_MIME_TYPE gtk_file_filter_add_mime_type (filter, "application/octet-stream"); #endif gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_asm_chooser]), filter); gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_ed_chooser]), filter); #if GTK_CHECK_VERSION (2,18,0) gtk_file_chooser_set_create_folders (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_asm_chooser]), FALSE); gtk_file_chooser_set_create_folders (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_ed_chooser]), FALSE); #endif // GTK_CHECK_VERSION } void update_editor_ (const gchar *cmd) { mix_vm_cmd_dispatcher_set_editor (dispatcher_, cmd); mixgtk_config_update (EDITOR_KEY_, cmd); } void update_asm_ (const gchar *cmd) { mix_vm_cmd_dispatcher_set_assembler (dispatcher_, cmd); mixgtk_config_update (MIXASM_KEY_, cmd); } void read_config_ (void) { const gchar *editor = mixgtk_config_get (EDITOR_KEY_); const gchar *assem = mixgtk_config_get (MIXASM_KEY_); if (!editor) { static const gchar *ENV[] = {"MDK_EDITOR", "X_EDITOR", NULL}; gchar *edit = NULL; int k = 0; while (!edit && ENV[k]) edit = getenv (ENV[k++]); if (edit) edit = g_strconcat (edit, " %s", NULL); else edit = g_strdup (DEFAULT_EDITOR_CMD); update_editor_ (edit); g_free (edit); } else { update_editor_ (editor); } update_asm_ (assem? assem : DEFAULT_ASM_CMD); } void update_dialog_ (void) { const gchar *editor = mixgtk_config_get (EDITOR_KEY_); const gchar *assem = mixgtk_config_get (MIXASM_KEY_); if (editor && assem && ext_dlg_) { gchar **parts = g_strsplit_set (editor, " \t", 2); gboolean is_active; gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_ed_chooser]), parts[0]); gtk_entry_set_text (GTK_ENTRY (ext_wdg_[ext_wdg_ed_entry]), parts[1]); g_strfreev (parts); parts = g_strsplit_set (assem, " \t", 3); gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_asm_chooser]), parts[0]); is_active = parts[1] && g_ascii_strcasecmp (g_strstrip (parts[1]), "-l") == 0; gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ext_wdg_[ext_wdg_asm_ls]), is_active); g_strfreev (parts); } } void update_config_ (void) { gchar *prog = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_ed_chooser])); const gchar *args = gtk_entry_get_text (GTK_ENTRY (ext_wdg_[ext_wdg_ed_entry])); gchar *cmd = g_strdup_printf ("%s %s", prog, args); update_editor_ (cmd); g_free (cmd); g_free (prog); prog = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ext_wdg_[ext_wdg_asm_chooser])); args = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ext_wdg_[ext_wdg_asm_ls])) ? " -l " : " "; cmd = g_strdup_printf ("%s%s%%s", prog, args); update_asm_ (cmd); g_free (cmd); g_free (prog); } mdk-1.2.9/mixgtk/mixgtk_input.h0000644000175000017500000000306612112755472013430 00000000000000/* -*-c-*- ---------------- mixgtk_input.h : * Declaration of functions for user input * ------------------------------------------------------------------ * Last change: Time-stamp: <01/03/12 23:35:14 jose> * ------------------------------------------------------------------ * Copyright (C) 2001, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_INPUT_H #define MIXGTK_INPUT_H #include /* callback function type */ typedef void (*input_callback_t)(mix_word_t result, gpointer data); /* init */ extern void mixgtk_input_init (void); /* get a word */ extern void mixgtk_input_word (const gchar *message, mix_word_t def, input_callback_t cb, gpointer data); /* get a short */ extern void mixgtk_input_short (const gchar *message, mix_short_t def, input_callback_t cb, gpointer data ); #endif /* MIXGTK_INPUT_H */ mdk-1.2.9/mixgtk/mixgtk_gen_handlers.h0000644000175000017500000000312312112755472014714 00000000000000/* -*-c-*- ---------------- mixgtk_gen_handlers.h : * general signal handlers declarations * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_GEN_HANDLERS_H #define MIXGTK_GEN_HANDLERS_H #include extern void on_main_window_destroy (GtkWidget *w, gpointer data); extern void on_file_open_activate (GtkWidget *w, gpointer data); extern void on_file_exit_activate (GtkWidget *w, gpointer data); extern void on_file_edit_activate (GtkWidget *w, gpointer data); extern void on_file_compile_activate (GtkWidget *w, gpointer data); extern void on_clear_breakpoints_activate (GtkWidget *w, gpointer data); extern void on_save_on_exit_toggle (GtkWidget *w, gpointer data); extern void on_save_activate (GtkWidget *w, gpointer data); #endif /* MIXGTK_GEN_HANDLERS_H */ mdk-1.2.9/mixgtk/Makefile.in0000644000175000017500000006361112636565536012617 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2001, 2004, 2006, 2008, 2014 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @MAKE_GUI_TRUE@am__append_1 = -I$(includedir) -I$(top_srcdir) \ @MAKE_GUI_TRUE@ -DGLADE_FILE=\""$(pkgdatadir)/mixgtk.glade"\"\ @MAKE_GUI_TRUE@ -DLOCAL_GLADE_FILE=\""$(srcdir)/mixgtk.glade"\"\ @MAKE_GUI_TRUE@ -DDEFAULT_EDITOR_CMD=\"$(EDITOR_CMD)\"\ @MAKE_GUI_TRUE@ -DDEFAULT_ASM_CMD="\"$(bindir)/mixasm %s"\"\ @MAKE_GUI_TRUE@ $(GUILED) $(EXTRA_EXECD) @MAKE_GUI_TRUE@bin_PROGRAMS = gmixvm$(EXEEXT) subdir = mixgtk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) am__gmixvm_SOURCES_DIST = gmixvm.c mixgtk.h mixgtk.c mixgtk_config.h \ mixgtk_config.c mixgtk_gen_handlers.h mixgtk_gen_handlers.c \ mixgtk_external.h mixgtk_external.c mixgtk_cmd_dispatcher.h \ mixgtk_cmd_dispatcher.c mixgtk_widgets.h mixgtk_widgets.c \ mixgtk_device.h mixgtk_device.c mixgtk_mixvm.h mixgtk_mixvm.c \ mixgtk_mixal.h mixgtk_mixal.c mixgtk_input.h mixgtk_input.c \ mixgtk_fontsel.h mixgtk_fontsel.c mixgtk_wm.h mixgtk_wm.c @MAKE_GUI_TRUE@am_gmixvm_OBJECTS = gmixvm.$(OBJEXT) mixgtk.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_config.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_gen_handlers.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_external.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_cmd_dispatcher.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_widgets.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_device.$(OBJEXT) mixgtk_mixvm.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_mixal.$(OBJEXT) mixgtk_input.$(OBJEXT) \ @MAKE_GUI_TRUE@ mixgtk_fontsel.$(OBJEXT) mixgtk_wm.$(OBJEXT) gmixvm_OBJECTS = $(am_gmixvm_OBJECTS) gmixvm_LDADD = $(LDADD) @MAKE_GUILE_TRUE@am__DEPENDENCIES_1 = \ @MAKE_GUILE_TRUE@ $(top_builddir)/mixguile/libmixguile.a am__DEPENDENCIES_2 = @MAKE_GUI_TRUE@gmixvm_DEPENDENCIES = $(top_builddir)/mixlib/libmix.a \ @MAKE_GUI_TRUE@ $(top_builddir)/lib/libreplace.a \ @MAKE_GUI_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(gmixvm_SOURCES) DIST_SOURCES = $(am__gmixvm_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(pkgdata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ $(am__append_1) AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = mixgtk.glade @MAKE_GUILE_FALSE@GUILED = @MAKE_GUILE_TRUE@GUILED = -DMAKE_GUILE @MAKE_GUILE_FALSE@GUILEL = @MAKE_GUILE_TRUE@GUILEL = $(top_builddir)/mixguile/libmixguile.a @DARWIN_SYSTEM_FALSE@EDITOR_CMD = "/usr/bin/xterm -e vi %s" @DARWIN_SYSTEM_TRUE@EDITOR_CMD = "/usr/bin/open -a TextEdit %s" @DARWIN_SYSTEM_FALSE@EXTRA_EXECD = @DARWIN_SYSTEM_TRUE@EXTRA_EXECD = -DEXTRA_EXEC_MIME_TYPE @MAKE_GUI_TRUE@pkgdata_DATA = mixgtk.glade @MAKE_GUI_TRUE@LDADD = $(top_builddir)/mixlib/libmix.a $(top_builddir)/lib/libreplace.a\ @MAKE_GUI_TRUE@ $(GUILEL) $(INTLLIBS) @DARWIN_SYSTEM_FALSE@@MAKE_GUI_TRUE@AM_LDFLAGS = -Wl,--export-dynamic @MAKE_GUI_TRUE@gmixvm_SOURCES = gmixvm.c mixgtk.h mixgtk.c \ @MAKE_GUI_TRUE@ mixgtk_config.h mixgtk_config.c \ @MAKE_GUI_TRUE@ mixgtk_gen_handlers.h mixgtk_gen_handlers.c \ @MAKE_GUI_TRUE@ mixgtk_external.h mixgtk_external.c \ @MAKE_GUI_TRUE@ mixgtk_cmd_dispatcher.h mixgtk_cmd_dispatcher.c \ @MAKE_GUI_TRUE@ mixgtk_widgets.h mixgtk_widgets.c \ @MAKE_GUI_TRUE@ mixgtk_device.h mixgtk_device.c \ @MAKE_GUI_TRUE@ mixgtk_mixvm.h mixgtk_mixvm.c \ @MAKE_GUI_TRUE@ mixgtk_mixal.h mixgtk_mixal.c \ @MAKE_GUI_TRUE@ mixgtk_input.h mixgtk_input.c \ @MAKE_GUI_TRUE@ mixgtk_fontsel.h mixgtk_fontsel.c \ @MAKE_GUI_TRUE@ mixgtk_wm.h mixgtk_wm.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mixgtk/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu mixgtk/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gmixvm$(EXEEXT): $(gmixvm_OBJECTS) $(gmixvm_DEPENDENCIES) $(EXTRA_gmixvm_DEPENDENCIES) @rm -f gmixvm$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gmixvm_OBJECTS) $(gmixvm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmixvm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_cmd_dispatcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_config.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_external.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_fontsel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_gen_handlers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_mixal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_mixvm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_widgets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_wm.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-pkgdataDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-pkgdataDATA .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/mixgtk/mixgtk_config.c0000644000175000017500000000563512112755472013535 00000000000000/* -*-c-*- -------------- mixgtk_config.c : * Implementation of the functions declared in mixgtk_config.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include "mixgtk.h" #include "mixgtk_config.h" static const gchar *MIXGTK_CONFIG_FILE_ = "gmixvm.config"; static const gchar *SHOW_TB_KEY_ = "Toolbars"; static const gchar *TB_YES_ = "Yes"; static const gchar *TB_NO_ = "No"; static const gchar *TB_STYLE_KEY_ = "ToolbarStyle"; static mix_config_t *config_ = NULL; /* load configuration */ gboolean mixgtk_config_load (void) { if (config_ == NULL) { gchar *cdir = g_strconcat (g_get_home_dir (), G_DIR_SEPARATOR_S, MIXGTK_FILES_DIR, NULL); config_ = mix_config_new (cdir, MIXGTK_CONFIG_FILE_); g_free (cdir); } return (config_ != NULL); } /* get mixlib config */ mix_config_t * mixgtk_config_get_mix_config (void) { return config_; } /* autosave state */ gboolean mixgtk_config_is_autosave (void) { return mix_config_is_autosave (config_); } void mixgtk_config_set_autosave (gboolean autosave) { mix_config_set_autosave (config_, autosave); } guint mixgtk_config_tb_style (void) { return (guint)mix_config_get_integer (config_, TB_STYLE_KEY_); } void mixgtk_config_set_tb_style (guint style) { mix_config_update_integer (config_, TB_STYLE_KEY_, (gint)style); } /* update config item */ void mixgtk_config_update (const gchar *key, const gchar *value) { mix_config_update (config_, key, value); } /* get config item */ const gchar * mixgtk_config_get (const gchar *key) { return mix_config_get (config_, key); } void mixgtk_config_remove (const char *key) { mix_config_remove (config_, key); } /* save configuration */ void mixgtk_config_save (void) { mix_config_save (config_); } gboolean mixgtk_config_show_toolbars (void) { const gchar *show = mixgtk_config_get (SHOW_TB_KEY_); return (!show || !strcmp (show, TB_YES_)); } void mixgtk_config_set_show_toolbars (gboolean show) { mixgtk_config_update (SHOW_TB_KEY_, show? TB_YES_ : TB_NO_); } mdk-1.2.9/mixgtk/mixgtk_mixvm.h0000644000175000017500000000350112112755472013423 00000000000000/* -*-c-*- ---------------- mixgtk_mixvm.h : * Functions dealing with the mixvm widgets * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MIXGTK_MIXVM_H #define MIXGTK_MIXVM_H #include #include "mixgtk.h" #include "mixgtk_widgets.h" /* initialise the mixvm widgets */ extern gboolean mixgtk_mixvm_init (mix_vm_t *vm); extern void mixgtk_mixvm_update_fonts (void); /* update register widgets */ extern void mixgtk_mixvm_update_registers (void); /* update the overflow toggle */ extern void mixgtk_mixvm_update_over_toggle (void); /* update the comparison flag */ extern void mixgtk_mixvm_update_cmp (void); /* update the memory cells */ extern void mixgtk_mixvm_update_cells (void); extern void mixgtk_mixvm_update_cells_to_address (gint address); /* update the loc pointer */ extern void mixgtk_mixvm_update_loc (void); /* update times */ extern void mixgtk_mixvm_update_times (void); /* update all mixvm widgets */ extern void mixgtk_mixvm_update_vm_widgets (void); #endif /* MIXGTK_MIXVM_H */ mdk-1.2.9/samples/0000755000175000017500000000000012636571406010755 500000000000000mdk-1.2.9/samples/hello.mixal0000644000175000017500000000021010770465100013013 00000000000000* mixal hello world * TERM EQU 19 ORIG 3000 START OUT MSG(TERM) HLT MSG ALF "MIXAL" ALF " HELL" ALF "O WOR" ALF "LD " END START mdk-1.2.9/samples/echo.mixal0000644000175000017500000000031110770465100012630 00000000000000* read from the console TERM EQU 19 MSG EQU 500 PRINT EQU 20 ORIG 1000 START IN MSG(TERM) * JBUS *(TERM) OUT MSG(TERM) HLT END START mdk-1.2.9/samples/primes.mixal0000644000175000017500000000120110770465100013210 00000000000000* table of primes (taopc p. 148) * L EQU 500 OUTDEV EQU 18 the printer PRIME EQU -1 BUF0 EQU 2000 BUF1 EQU BUF0+25 ORIG 3000 START IOC 0(OUTDEV) LD1 =1-L= LD2 =3= 2H INC1 1 ST2 PRIME+L,1 J1Z 2F 4H INC2 2 ENT3 2 6H ENTA 0 ENTX 0,2 DIV PRIME,3 JXZ 4B CMPA PRIME,3 INC3 1 JG 6B JMP 2B 2H OUT TITLE(OUTDEV) ENT4 BUF1+10 ENT5 -50 2H INC5 L+1 4H LDA PRIME,5 CHAR STX 0,4(1:4) DEC4 1 DEC5 50 J5P 4B OUT 0,4(OUTDEV) LD4 24,4 J5N 2B HLT * initial contents ORIG PRIME+1 CON 2 ORIG BUF0-5 TITLE ALF "FIRST" ALF " FIVE" ALF " HUND" ALF "RED P" ALF "RIMES" ORIG BUF0+24 CON BUF1+10 ORIG BUF1+24 CON BUF0+10 END START mdk-1.2.9/samples/elevator.mixal0000644000175000017500000002242712112755472013555 00000000000000*** The elevator simulation in equ 1:1 Definition of fields llink1 equ 2:3 within nodes rlink1 equ 4:5 nextinst equ 0:2 out equ 1:1 llink2 equ 2:3 rlink2 equ 4:5 *** Fixed-size tables and list heads wait con *+2(llink1),*+2(rlink1) List head for WAIT list con 0 NEXTTIME = 0 always man1 con *-2(llink1),*-2(rlink1) This node represents action con 0 M1 and it is initially the jmp M1 sole entry in the WAIT list. elev1 con 0 This node represents the con 0 elevator actions, except jmp E1 for E5 and E9. elev2 con 0 This node represents the con 0 independent elevator jmp E5 at E5. elev3 con 0 This node represents the con 0 independent elevator jmp E9 at E9. avail con 0 Link to available nodes time con 0 Current simulated time queue equ *-3 con *-3(llink2),*-3(rlink2) List head for QUEUE[0] con *-3(llink2),*-3(rlink2) List head for QUEUE[1] con *-3(llink2),*-3(rlink2) All queues initially con *-3(llink2),*-3(rlink2) are empty con *-3(llink2),*-3(rlink2) List head for QUEUE[4] elevator equ *-3 con *-3(llink2),*-3(rlink2) List head for ELEVATOR con 0 con 0 "Padding" for CALL table con 0 (see lines 183-186) con 0 call con 0 CALLUP[0], CALLCAR[0], CALLDOWN[0] con 0 CALLUP[1], CALLCAR[1], CALLDOWN[1] con 0 CALLUP[2], CALLCAR[2], CALLDOWN[2] con 0 CALLUP[3], CALLCAR[3], CALLDOWN[3] con 0 CALLUP[4], CALLCAR[4], CALLDOWN[4] con 0 con 0 "Padding" for CALL table con 0 (see lines 178-181) con 0 D1 con 0 Indicates door open, activity D2 con 0 Indicates prolonged standstill D3 con 0 Indicates door open, inactivity *** Subroutines and control routine insert stj 9F Insert NODE(C) to left of NODE(rI1): ld2 3,1(llink2) rI2 <- LLINK2(rI1). st2 3,6(llink2) LLINK2(C) <- rI2. st6 3,1(llink2) LLINK2(rI1) <- C. st6 3,2(rlink2) RLINK2(rI2) <- C. st1 3,6(rlink2) RLINK2(C) <- rI1. 9H jmp * Exit from subroutine. delete stj 9F Delete NODE(C) from its list: ld1 3,6(llink2) P <- LLINK2(C). ld2 3,6(rlink2) Q <- RLINK2(C). st1 3,2(llink2) LLINK2(Q) <- P. st2 3,1(rlink2) RLINK2(P) <- Q. 9H jmp * Exit from subroutine. immed stj 9F Insert NODE(C) first in WAIT list: lda time sta 1,6 Set NEXTTIME(C) <- TIME. ent1 wait P <- LOC(WAIT). jmp 2F Insert NODE(C) to right of NODE(P). hold add time rA <- TIME + rA. sortin stj 9F Sort NODE(C) into WAIT list. sta 1,6 Set NEXTTIME(C) <- rA. ent1 wait P <- LOC(WAIT). ld1 0,1(llink1) P <- LLINK1(P). cmpa 1,1 Compare NEXTTIME fields, right to left. jl *-2 Repeat until NEXTTIME(C) >= NEXTTIME(P). 2H ld2 0,1(rlink1) Q <- RLINK1(P). st2 0,6(rlink1) RLINK1(C) <- Q. st1 0,6(llink1) LLINK1(C) <- P. st6 0,1(rlink1) RLINK1(P) <- C. st6 0,2(llink1) LLINK1(Q) <- C. 9H jmp * Exit from subroutine. deletew stj 9F Delete NODE(C) from WAIT list: ld1 0,6(llink1) (This is same as lines 58-63 ld2 0,6(rlink1) except LLINK1, RLINK1 are used st1 0,2(llink1) instead of LLINK2, RLINK2.) st2 0,1(rlink1) 9H jmp * cycle1 stj 2,6(nextinst) Set NEXTINST(C) <- rJ. jmp cycle holdc stj 2,6(nextinst) Set NEXTINST(C) <- rJ. jmp hold Insert NODE(C) in WAIT, delay (rA). cycle ld6 wait(rlink1) Set current node C <- RLINK1(LOC(WAIT)). lda 1,6 NEXTTIME(C) sta time becomes new value of simulated TIME. jmp deletew Remove NODE(C) from WAIT list. jmp 2,6 Jump to NEXTINST(C). *** Coroutine M. M1. Enter, prepare for successor. M1 jmp values Computer IN, OUT, INTERTIME, GIVEUPTIME. lda intertime INTERTIME is computed by VALUES subroutine. jmp hold Put NODE(C) in WAIT, delay INTERTIME. ld6 avail C <- AVAIL. j6p 1F If AVAIL != A, jump. ld6 poolmax inc6 4 C <- POOLMAX + 4 ld6 poolmax POOLMAX <- C. jmp *+3 1H lda 0,6(rlink1) sta avail AVAIL <- RLINK1(AVAIL). ld1 infloor rI1 <- INFLOOR (computed by VALUES above). st1 0,6(in) IN(C) <- rI1. ld2 outfloor rI2 <- OUTFLOOR (computed by VALUES). st2 3,6(out) OUT(C) <- rI2. enta 39 Put constant 39 (JMP operation code) sta 2,6 into third word of node format (6). M2 enta 0,4 M2. Signal and wait. Set rA <- FLOOR. deca 0,1 FLOOR <- IN st6 temp Save value of C. janz 2F Jump if FLOOR != IN. ent6 elev1 Set C <- LOC(ELEV1). lda 2,6(nextinst) Is elevator positioned at E6? deca E6 janz 3F enta E3 If so, reposition at E3. sta 2,6(nextinst) jmp deletew Remove it from WAIT list jmp 4F and reinsert it at front of WAIT. 3H lda D3 jaz 2F Jump if D3 = 0. st6 D1 Otherwise set D1 != 0. stz D3 Set D3 <- 0. 4H jmp immed Insert ELEV1 at front of WAIT list. jmp M3 (rI1, rI2 have changed.) 2H dec2 0,1 rI2 <- OUT - IN. enta 1 j2p *+3 Jump if going up. sta call,1(5:5) Set CALLDOWN(IN) <- 1. jmp *+2 sta call,1(1:1) Set CALLUP(IN) <- 1. lda D2 jaz decision If D2 = 0, call the DECISION subroutine. lda elev1+2(nextinst) deca E1 If the elevator is at E1, call jaz decision the DECISION subroutine. M3 ld6 temp M3. Enter queue. ld1 0,6(in) ent1 queue,1 rI1 <- LOC(QUEUE[IN]). jmp insert Insert NODE(C) at right end of QUEUE[IN]. M4A lda giveuptime jmp holdc Wait GIVEUPTIME units. M4 lda 0,6(in) M4. Give up. deca 0,4 IN(C) - FLOOR janz *+3 lda D1 FLOOR = IN(C) janz M4A See exercise 7. M6 jmp delete M6. Get out. MODE(C) is deleted lda avail from QUEUE or ELEVATOR. sta 0,6(rlink1) AVAIL <= C. st6 avail jmp cycle M5 jmp delete M5. Get in. NODE(C) is deleted ent1 elevator from QUEUE. jmp insert Insert it at right of ELEVATOR. enta 1 ld2 3,6(out) sta call,2(3:3) Set CALLCAR[OUT(C)] <- 1. j5nz cycle Jump if STATE != NEUTRAL. dec2 0,4 ent5 0,2 Set STATE to proper direction. ent6 elev2 Set C <- LOC(ELEV2). jmp deletew Remove E5 action from WAIT list. enta 25 jmp E5A Restart E5 action 25 units from now. *** Coroutine E. E1A jmp cycle1 Set NEXTINST <- E1, go to CYCLE. E1 equ * E1. Wait for call. (no action) E2A jmp holdc E2 j5n 1F E2. Change of state? lda call+1,4 State is GOINGUP. add call+2,4 add call+3,4 add call+4,4 jap E3 Are there calls for higher floors? lda call-1,4(3:3) If not, have passenger in the add call-2,4(3:3) elevator called for lower floors? add call-3,4(3:3) add call-4,4(3:3) jmp 2F 1H lda call-1,4 State is GOINGDOWN. add call-2,4 add call-3,4 add call-4,4 jap E3 Are there calls for lower floors? [right???] lda call+1,4(3:3) If not, have passenger in the add call+2,4(3:3) elevator called for higher floors? add call+3,4(3:3) add call+4,4(3:3) 2H enn5 0,5 Reverse direction of STATE. stz call,4 Set CALL variable to zero. janz E3 Jump if calls for opposite direction, ent5 0 otherwise, set STATE <- NEUTRAL. E3 ent6 elev3 E3. Open door. lda 0,6 If activity E9 is already scheduled, janz deletew remove it from the WAIT list. enta 300 jmp hold Schedule activity E9 after 300 units. ent6 elev2 enta 76 jmp hold Schedule activity E5 after 76 units. st6 D2 Set D2 != 0. st6 D1 Set D1 != 0. enta 20 E4A ent6 elev1 jmp holdc E4 enta 0,4 E4. Let people out, in. sla 4 Set OUT field of rA to FLOOR. ent6 elevator C <- LOC(ELEVATOR). 1H ld6 3,6(llink2) C <- LLINK2(C). cmp6 =elevator= Search ELEVATOR list, right to left. je 1F If C = LOC(ELEVATOR), search is complete. cmpa 3,6(out) Compare OUT(C) with FLOOR. jne 1B If not equal, continue search, enta M6 otherwise, prepare to send man to M6. jmp 2F 1H ld6 queue+3,4(rlink2) Set C <- RLINK2(LOC(QUEUE[FLOOR])). cmp6 3,6(rlink2) Is C = RLINK2(C)? je 1F If so, the queue is empty. jmp deletew If not, cancel action M4 for the man. enta M5 Prepare to send man to M5. 2H sta 2,6(nextinst) Set NEXTINST(C). jmp immed Put him at front of WAIT list. enta 25 jmp E4A Wait 25 units and repeat E4. 1H stz D1 Set D1 <- 0. st6 D3 Set D3 != 0. jmp cycle Return to simulate other events. E5A jmp holdc E5 lda D1 E5. Close door. jaz *+3 Is D1 = 0? enta 40 If not, people are still getting in or out. jmp E5A Wait 40 units, repeat E5. stz D3 If D1 = 0, set D3 <- 0. enta 20 ent6 elev1 E6A jmp holdc Wait 20 units, then go to E6. E6 j5n *+2 E6. Prepare to move. stz call,4(1:3) If STATE != GOINGDOWN, CALLUP and CALLCAR j5p *+2 on this floor are reset. stz call,4(3:5) If != GOINGUP, reset CALLCAR and CALLDOWN. j5z decision Perform DECISION subroutine. E6B j5z E1A If STATE = NEUTRAL, go to E1 and wait. lda D2 jaz *+4 ent6 elev3 Otherwise, if D2 != 0, jmp deletew cancel activity E9 stz elev3 (see line 202). enta 15 ent6 elev1 Wait 15 units of time. j5n E8A If STATE = GOINGDOWN, go to E8. E7A jmp holdc E7 inc4 1 E7. Go up a floor. enta 51 jmp holdc Wait 51 units. lda call,4(1:3) Is CALLCAR[FLOOR] or CALLUP[FLOOR] != 0? jap 1F ent1 -2,4 If not, j1z 2F is FLOOR = 2? lda call,4(5:5) If not, is CALLDOWN[FLOOR] != 0? jaz E7 If not, repeat step E7. 2H lda call+1,4 add call+2,4 add call+3,4 add call+4,4 janz E7 Are there calls for higher floors? 1H enta 14 It is time to stop the elevator. jmp E2A Wait 14 units and go to E2. E8A jmp holdc * ... (see exercise 8) E9 stz 0,6 E9. Set inaction indicator. stz D2 D2 <- 0. jmp decision Perform DECISION subroutine. jmp cycle Return to simulation of other events. * (fill in VALUES, DECISION routines here) begin ent4 2 Start with FLOOR = 2 ent5 0 and STATE = NEUTRAL. jmp cycle Begin simulation. poolmax end begin Storage pool follows literals, temp storage * Warning: there's probably a typo or two in this file. mdk-1.2.9/samples/mystery.mixal0000644000175000017500000000045312112755472013443 00000000000000* Mystery program * (Knuth, vol 1, p 153) printer equ 18 buf orig *+3000 1H ent1 1 ent2 0 ldx 4F 2H ent3 0,1 3H stz buf,2 inc2 1 dec3 1 j3p 3B stx buf,2 inc2 1 inc1 1 cmp1 =75= jl 2B enn2 2400 out buf+2400,2(printer) inc2 24 j2n *-2 hlt 4H con "aaaaa" end 1B * End of mystery.mix mdk-1.2.9/samples/Makefile.am0000644000175000017500000000134612112755472012731 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2004, 2006, 2013 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. SUBDIRS = tests EXTRA_DIST = primes.result hello.mixal primes.mixal echo.mixal \ permutations.mixal permutations.cardrd isains.mixal \ elevator.mixal mystery.mixal mdk-1.2.9/samples/isains.mixal0000644000175000017500000000417212112755472013217 00000000000000B EQU 1(4:4) BMAX EQU B-1 UMAX EQU 20 TABLE NOP GOOD(BMAX) ADD FLOAT(5:5) SUB FLOAT(5:5) MUL FLOAT(5:5) DIV FLOAT(5:5) HLT GOOD SRC GOOD MOVE MEMORY(BMAX) LDA FIELD(5:5) LD1 FIELD(5:5) LD2 FIELD(5:5) LD3 FIELD(5:5) LD4 FIELD(5:5) LD5 FIELD(5:5) LD6 FIELD(5:5) LDX FIELD(5:5) LDAN FIELD(5:5) LD1N FIELD(5:5) LD2N FIELD(5:5) LD3N FIELD(5:5) LD4N FIELD(5:5) LD5N FIELD(5:5) LD6N FIELD(5:5) LDXN FIELD(5:5) STA FIELD(5:5) ST1 FIELD(5:5) ST2 FIELD(5:5) ST3 FIELD(5:5) ST4 FIELD(5:5) ST5 FIELD(5:5) ST6 FIELD(5:5) STX FIELD(5:5) STJ FIELD(5:5) STZ FIELD(5:5) JBUS MEMORY(UMAX) IOC GOOD(UMAX) IN MEMORY(UMAX) OUT MEMORY(UMAX) JRED MEMORY(UMAX) JLE MEMORY JANP MEMORY J1NP MEMORY J2NP MEMORY J3NP MEMORY J4NP MEMORY J5NP MEMORY J6NP MEMORY JXNP MEMORY ENNA GOOD ENN1 GOOD ENN2 GOOD ENN3 GOOD ENN4 GOOD ENN5 GOOD ENN6 GOOD ENNX GOOD CMPA FLOAT(5:5) CMP1 FIELD(5:5) CMP2 FIELD(5:5) CMP3 FIELD(5:5) CMP4 FIELD(5:5) CMP5 FIELD(5:5) CMP6 FIELD(5:5) CMPX FIELD(5:5) BEGIN LDA INST CMPA VALID(3:3) JG BAD LD1 INST(5:5) DEC1 64 J1NN BAD CMPA TABLE+64,1(4:4) JG BAD LD1 TABLE+64,1(1:2) JMP 0,1 FLOAT CMPA VALID(4:4) JE GOOD FIELD ENTA 0 LDX INST(4:4) DIV =9= STX *+1(0:2) INCA 0 CMPA =5= JG BAD MEMORY LDX INST(3:3) JXNZ GOOD LDX INST(0:2) JXN BAD CMPX =3999= JLE GOOD JMP BAD VALID CMPX 3999,6(6) *VALID CON 63,3999(0:2),6(3:3),6(4:4) CMPX 3999,6(6) * * * INST CON 63,3999(0:2),6(3:3),45(4:4) GOOD OUT GTEXT(18) HLT BAD OUT BTEXT(18) HLT GTEXT ALF GOOD BTEXT ALF BAD END BEGIN mdk-1.2.9/samples/tests/0000755000175000017500000000000012636571406012117 500000000000000mdk-1.2.9/samples/tests/stress1.mixal0000644000175000017500000000024610770465100014467 00000000000000 ORIG 1999 ST NOP 3H EQU 69 3H ENTA 3B ** According to pg 151, rA should be 69, not 2000 ** "An address of 2F or 2B never refers to its own line" HLT END ST mdk-1.2.9/samples/tests/stress6.mixal0000644000175000017500000000032510770465100014472 00000000000000* checking input from binary device INDEV EQU 1 device for input OUTDEV EQU 2 device for output MEM EQU 1000 ORIG 2000 START IN MEM(INDEV) OUT MEM(OUTDEV) HLT END START mdk-1.2.9/samples/tests/bt.mixal0000644000175000017500000000010310770465100013460 00000000000000 ORIG 0 BEG JMP *+1 JMP *+1 FOO JMP BAR BAR HLT END BEG mdk-1.2.9/samples/tests/stress2.mixal0000644000175000017500000000014112112755472014470 00000000000000 ORIG 1999 ST NOP SYM EQU ST+1 SYM2 CON SYM2+1 SYM3 ORIG SYM3+2 HLT SYM4 END SYM4+1 mdk-1.2.9/samples/tests/cbp.mixal0000644000175000017500000000031610770465100013625 00000000000000* testing conditional breakpoints ORIG 2000 START ENTA 100 STA 1000 ENTX 200 STX 1001 CMPA 1001 * cmp flag changed CMPX 1000 * cmp flag changed DIV 1002 * over toggle HLT END START mdk-1.2.9/samples/tests/negwrite.mixal0000644000175000017500000000012710770465100014705 00000000000000* test for bug #5649: invalid address in OUT START OUT -1(18) HLT END START mdk-1.2.9/samples/tests/lockonw.mixal0000644000175000017500000000007210770465100014534 00000000000000* test for bug #5654 START CMPA =0=(1:4) END START mdk-1.2.9/samples/tests/Makefile.am0000644000175000017500000000131612112755472014070 00000000000000## Process this file with automake to produce Makefile.in # Copyright (C) 2006 by Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EXTRA_DIST = bt.mixal cbp.mixal ldan.mixal lockonw.mixal negwrite.mixal \ stress0.mixal stress1.mixal stress2.mixal stress4.mixal \ stress5.mixal stress6.mixal mdk-1.2.9/samples/tests/ldan.mixal0000644000175000017500000000012212112755472014000 00000000000000VAR ORIG *+1 BEGIN LDAN VAR(1:5) LDXN VAR(1:5) HLT END BEGIN mdk-1.2.9/samples/tests/stress5.mixal0000644000175000017500000000051410770465100014471 00000000000000* checking output to binary device OUTDEV EQU 1 device for output FROM EQU 1000 TO EQU 1099 INITVAL EQU 1 STEP EQU 10 ORIG 2000 START ENTA INITVAL ST1 0 LOOP STA FROM,1 INC1 1 INCA STEP CMP1 =TO-FROM+1= JNE LOOP OUT FROM(OUTDEV) HLT END START mdk-1.2.9/samples/tests/stress4.mixal0000644000175000017500000000015010770465100014464 00000000000000 ORIG 2000 ST NOP ENTA FUT ** Whoa, mdk tells me FUT is never defined... FUT EQU 69 HLT END ST mdk-1.2.9/samples/tests/Makefile.in0000644000175000017500000003421712636565536014122 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2006 by Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = samples/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = bt.mixal cbp.mixal ldan.mixal lockonw.mixal negwrite.mixal \ stress0.mixal stress1.mixal stress2.mixal stress4.mixal \ stress5.mixal stress6.mixal all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu samples/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu samples/tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: mdk-1.2.9/samples/tests/stress0.mixal0000644000175000017500000000017010770465100014462 00000000000000 ORIG 1999 ST NOP * SYM EQU SYM+1 SYM2 CON SYM2+1 SYM3 ORIG SYM3+2 SYM4 ENTA SYM4+1 HLT SYM5 END SYM5+1 mdk-1.2.9/samples/primes.result0000644000175000017500000000704510770465100013430 00000000000000FIRST FIVE HUNDRED PRIMES 0002 0233 0547 0877 1229 1597 1993 2371 2749 3187 0003 0239 0557 0881 1231 1601 1997 2377 2753 3191 0005 0241 0563 0883 1237 1607 1999 2381 2767 3203 0007 0251 0569 0887 1249 1609 2003 2383 2777 3209 0011 0257 0571 0907 1259 1613 2011 2389 2789 3217 0013 0263 0577 0911 1277 1619 2017 2393 2791 3221 0017 0269 0587 0919 1279 1621 2027 2399 2797 3229 0019 0271 0593 0929 1283 1627 2029 2411 2801 3251 0023 0277 0599 0937 1289 1637 2039 2417 2803 3253 0029 0281 0601 0941 1291 1657 2053 2423 2819 3257 0031 0283 0607 0947 1297 1663 2063 2437 2833 3259 0037 0293 0613 0953 1301 1667 2069 2441 2837 3271 0041 0307 0617 0967 1303 1669 2081 2447 2843 3299 0043 0311 0619 0971 1307 1693 2083 2459 2851 3301 0047 0313 0631 0977 1319 1697 2087 2467 2857 3307 0053 0317 0641 0983 1321 1699 2089 2473 2861 3313 0059 0331 0643 0991 1327 1709 2099 2477 2879 3319 0061 0337 0647 0997 1361 1721 2111 2503 2887 3323 0067 0347 0653 1009 1367 1723 2113 2521 2897 3329 0071 0349 0659 1013 1373 1733 2129 2531 2903 3331 0073 0353 0661 1019 1381 1741 2131 2539 2909 3343 0079 0359 0673 1021 1399 1747 2137 2543 2917 3347 0083 0367 0677 1031 1409 1753 2141 2549 2927 3359 0089 0373 0683 1033 1423 1759 2143 2551 2939 3361 0097 0379 0691 1039 1427 1777 2153 2557 2953 3371 0101 0383 0701 1049 1429 1783 2161 2579 2957 3373 0103 0389 0709 1051 1433 1787 2179 2591 2963 3389 0107 0397 0719 1061 1439 1789 2203 2593 2969 3391 0109 0401 0727 1063 1447 1801 2207 2609 2971 3407 0113 0409 0733 1069 1451 1811 2213 2617 2999 3413 0127 0419 0739 1087 1453 1823 2221 2621 3001 3433 0131 0421 0743 1091 1459 1831 2237 2633 3011 3449 0137 0431 0751 1093 1471 1847 2239 2647 3019 3457 0139 0433 0757 1097 1481 1861 2243 2657 3023 3461 0149 0439 0761 1103 1483 1867 2251 2659 3037 3463 0151 0443 0769 1109 1487 1871 2267 2663 3041 3467 0157 0449 0773 1117 1489 1873 2269 2671 3049 3469 0163 0457 0787 1123 1493 1877 2273 2677 3061 3491 0167 0461 0797 1129 1499 1879 2281 2683 3067 3499 0173 0463 0809 1151 1511 1889 2287 2687 3079 3511 0179 0467 0811 1153 1523 1901 2293 2689 3083 3517 0181 0479 0821 1163 1531 1907 2297 2693 3089 3527 0191 0487 0823 1171 1543 1913 2309 2699 3109 3529 0193 0491 0827 1181 1549 1931 2311 2707 3119 3533 0197 0499 0829 1187 1553 1933 2333 2711 3121 3539 0199 0503 0839 1193 1559 1949 2339 2713 3137 3541 0211 0509 0853 1201 1567 1951 2341 2719 3163 3547 0223 0521 0857 1213 1571 1973 2347 2729 3167 3557 0227 0523 0859 1217 1579 1979 2351 2731 3169 3559 0229 0541 0863 1223 1583 1987 2357 2741 3181 3571 mdk-1.2.9/samples/permutations.cardrd0000644000175000017500000000024010770465100014572 00000000000000 ( A C F G ) ( B C D ) ( A E D ) ( F A D E ) ( B g F a E ) = mdk-1.2.9/samples/permutations.mixal0000644000175000017500000000211110770465100014444 00000000000000* multiply permutations in cycle form (taopc p. 168) * MAXWDS EQU 1200 PERM ORIG *+MAXWDS ANS ORIG *+MAXWDS OUTBUF ORIG *+24 CARDS EQU 16 PRINTER EQU 18 BEGIN IN PERM(CARDS) ENT2 0 LDA EQUALS 1H JBUS *(CARDS) CMPA PERM+15,2 JE *+2 IN PERM+16,2(CARDS) ENT1 OUTBUF JBUS *(PRINTER) MOVE PERM,2(16) OUT OUTBUF(PRINTER) JE 1F INC2 16 CMP2 =MAXWDS-16= JLE 1B HLT 666 1H INC2 15 ST2 SIZE ENT3 0 2H LDAN PERM,3 CMPA LPREN(1:5) JNE 1F STA PERM,3 INC3 1 LDXN PERM,3 JXZ *-2 1H CMPA RPREN(1:5) JNE *+2 STX PERM,3 INC3 1 CMP3 SIZE JL 2B LDA LPREN ENT1 ANS OPEN ENT3 0 1H LDXN PERM,3 JXN GO INC3 1 CMP3 SIZE JL 1B * DONE CMP1 =ANS= JNE *+2 MOVE LPREN(2) MOVE =0= MOVE -1,1(22) ENT3 0 OUT ANS,3(PRINTER) INC3 24 LDX ANS,3 JXNZ *-3 HLT * LPREN ALF " (" RPREN ALF ") " EQUALS ALF " =" * GO MOVE LPREN MOVE PERM,3 STX START SUCC STX PERM,3 INC3 1 LDXN PERM,3(1:5) JXN 1F JMP *-3 5H STX 0,1 INC1 1 ENT3 0 4H CMPX PERM,3(1:5) JE SUCC 1H INC3 1 CMP3 SIZE JL 4B CMPX START(1:5) JNE 5B CLOSE MOVE RPREN CMPA -3,1 JNE OPEN INC1 -3 JMP OPEN END BEGIN mdk-1.2.9/samples/Makefile.in0000644000175000017500000005060212636565536012754 00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2000, 2001, 2004, 2006, 2013 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = samples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/codeset.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc21.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intdiv0.m4 \ $(top_srcdir)/m4/intmax.m4 $(top_srcdir)/m4/inttypes-pri.m4 \ $(top_srcdir)/m4/inttypes.m4 $(top_srcdir)/m4/inttypes_h.m4 \ $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lcmessage.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/longdouble.m4 \ $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/printf-posix.m4 \ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/signed.m4 \ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ $(top_srcdir)/m4/uintmax_t.m4 $(top_srcdir)/m4/ulonglong.m4 \ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wint_t.m4 \ $(top_srcdir)/m4/xsize.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_CFLAGS = @AM_CFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GENCAT = @GENCAT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GLIBC21 = @GLIBC21@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_LIBS = @GUILE_LIBS@ HAVE_ASPRINTF = @HAVE_ASPRINTF@ HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ HAVE_SNPRINTF = @HAVE_SNPRINTF@ HAVE_WPRINTF = @HAVE_WPRINTF@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLBISON = @INTLBISON@ INTLLIBS = @INTLLIBS@ INTLOBJS = @INTLOBJS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_V_MERGE = @INTLTOOL_V_MERGE@ INTLTOOL_V_MERGE_OPTIONS = @INTLTOOL_V_MERGE_OPTIONS@ INTLTOOL__v_MERGE_ = @INTLTOOL__v_MERGE_@ INTLTOOL__v_MERGE_0 = @INTLTOOL__v_MERGE_0@ INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKE_GUILE = @MAKE_GUILE@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ intltool__v_merge_options_ = @intltool__v_merge_options_@ intltool__v_merge_options_0 = @intltool__v_merge_options_0@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = tests EXTRA_DIST = primes.result hello.mixal primes.mixal echo.mixal \ permutations.mixal permutations.cardrd isains.mixal \ elevator.mixal mystery.mixal all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu samples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu samples/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: