mdk-1.3.1/0000775000175000017500000000000015065042311006027 5mdk-1.3.1/config.sub0000755000175000017500000011544114770044664007755 #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale timestamp='2024-05-27' # 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: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # 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. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -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-2024 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 ;; *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 # Split fields of configuration type saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in cloudabi*-eabi* \ | kfreebsd*-gnu* \ | knetbsd*-gnu* \ | kopensolaris*-gnu* \ | linux-* \ | managarm-* \ | netbsd*-eabi* \ | netbsd*-gnu* \ | nto-qnx* \ | os2-emx* \ | rtmk-nova* \ | storm-chaos* \ | uclinux-gnu* \ | uclinux-uclibc* \ | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) case $field1-$field2 in # Shorthands that happen to contain a single dash convex-c[12] | convex-c3[248]) basic_machine=$field2-convex basic_os= ;; decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Do not treat sunos as a manufacturer sun*os*) basic_machine=$field1 basic_os=$field2 ;; # Manufacturers 3100* \ | 32* \ | 3300* \ | 3600* \ | 7300* \ | acorn \ | altos* \ | apollo \ | apple \ | atari \ | att* \ | axis \ | be \ | bull \ | cbm \ | ccur \ | cisco \ | commodore \ | convergent* \ | convex* \ | cray \ | crds \ | dec* \ | delta* \ | dg \ | digital \ | dolphin \ | encore* \ | gould \ | harris \ | highlevel \ | hitachi* \ | hp \ | ibm* \ | intergraph \ | isi* \ | knuth \ | masscomp \ | microblaze* \ | mips* \ | motorola* \ | ncr* \ | news \ | next \ | ns \ | oki \ | omron* \ | pc533* \ | rebel \ | rom68k \ | rombug \ | semi \ | sequent* \ | siemens \ | sgi* \ | siemens \ | sim \ | sni \ | sony* \ | stratus \ | sun \ | sun[234]* \ | tektronix \ | tti* \ | ultra \ | unicom* \ | wec \ | winbond \ | wrs) basic_machine=$field1-$field2 basic_os= ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # 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) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | delta-motorola | 3300-motorola | motorola-delta | motorola-3300) cpu=m68k vendor=motorola ;; # This used to be dpx2*, but that gets the RS6000-based # DPX/20 and the x86-based DPX/2-100 wrong. See # https://oldskool.silicium.org/stations/bull_dpx20.htm # https://www.feb-patrimoine.com/english/bull_dpx2.htm # https://www.feb-patrimoine.com/english/unix_and_bull.htm dpx2 | dpx2[23]00 | dpx2[23]xx) cpu=m68k vendor=bull ;; dpx2100 | dpx21xx) cpu=i386 vendor=bull ;; dpx20) cpu=rs6000 vendor=bull ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x"$basic_os" != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. obj= case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) saved_IFS=$IFS IFS="-" read kernel os <&2 fi ;; *) echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 exit 1 ;; esac case $obj in aout* | coff* | elf* | pe*) ;; '') # empty is fine ;; *) echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 exit 1 ;; esac # Here we handle the constraint that a (synthetic) cpu and os are # valid only in combination with each other and nowhere else. case $cpu-$os in # The "javascript-unknown-ghcjs" triple is used by GHC; we # accept it here in order to tolerate that, but reject any # variations. javascript-ghcjs) ;; javascript-* | *-ghcjs) echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os-$obj in linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ | linux-mlibc*- | linux-musl*- | linux-newlib*- \ | linux-relibc*- | linux-uclibc*- | linux-ohos*- ) ;; uclinux-uclibc*- | uclinux-gnu*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-msvc*-) ;; -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; -kernel*- ) echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; *-kernel*- ) echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; *-msvc*- ) echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 exit 1 ;; kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; rtmk-nova-) ;; *-eabi*- | *-gnueabi*-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal), # can be paired with an machine code file format ;; -*-) # Blank kernel with real OS is always fine. ;; --*) # Blank kernel and OS with real machine code file format is always fine. ;; *-*-*) echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos* | *-solaris*) 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 ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) 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 ;; esac echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mdk-1.3.1/AUTHORS0000644000175000017500000000075412636565126007042 Authors 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.3.1/mixgtk/0000775000175000017500000000000015065042311007332 5mdk-1.3.1/mixgtk/mixgtk_input.h0000644000175000017500000000306612112755472012161 /* -*-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.3.1/mixgtk/mixgtk_mixvm.c0000644000175000017500000003337013743201230012143 /* -*-c-*- -------------- mixgtk_mixvm.c : * Implementation of the functions declared in mixgtk_mixvm.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2008, 2019 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 */ static gboolean button_active_ (GtkWidget *widget) { return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); } void on_cmp_e_toggled (GtkWidget *widget, gpointer data) { if (button_active_ (widget)) mix_vm_set_cmpflag (vm_, mix_EQ); } void on_cmp_l_toggled (GtkWidget *widget, gpointer data) { if (button_active_ (widget)) mix_vm_set_cmpflag (vm_, mix_LESS); } void on_cmp_g_toggled (GtkWidget *widget, gpointer data) { if (button_active_ (widget)) mix_vm_set_cmpflag (vm_, mix_GREAT); } void on_overflow_toggled (GtkWidget *widget, gpointer data) { mix_vm_set_overflow (vm_, button_active_ (widget)); } 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.3.1/mixgtk/mixgtk_widgets.c0000644000175000017500000000642313743201230012450 /* -*-c-*- -------------- mixgtk_widgets.c : * Implementation of the functions declared in mixgtk_widgets.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007, 2014, 2019, 2020 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_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 GtkBuilder *builder_ = NULL; /* the xml file name */ static const gchar *file_ = NULL; /* create a new factory from an xml glade file */ gboolean mixgtk_widget_factory_init (void) { if (!file_) { const gchar *glade_file = GLADE_FILE; 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); builder_ = gtk_builder_new_from_file (file_); g_assert (builder_); gtk_builder_connect_signals (builder_, NULL); } 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_by_name (names_[widget]); } GtkWidget * mixgtk_widget_factory_get_dialog (mixgtk_dialog_id_t dlg) { g_assert (dlg < DLG_NO_); return GTK_WIDGET (gtk_builder_get_object (builder_, dnames_[dlg])); } GtkWidget * mixgtk_widget_factory_get_by_name (const gchar *name) { g_assert (name != NULL); GtkWidget *w = GTK_WIDGET (gtk_builder_get_object (builder_, name)); if (!w) g_warning ("Widget '%s' not found", name); return w; } mdk-1.3.1/mixgtk/mixgtk_mixal.h0000644000175000017500000000325112112755472012130 /* -*-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.3.1/mixgtk/mixgtk_input.c0000644000175000017500000001402313743201230012134 /* -*-c-*- -------------- mixgtk_input.c : * Implementation of the functions declared in mixgtk_input.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2019, 2020 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 (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 (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_by_name (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 (childs_[DEC_], on_word_dec_changed, NULL); g_signal_handlers_block_by_func (childs_[SIGN_], on_word_sign_changed, NULL); for (k = B1_; k <= B5_; ++k) g_signal_handlers_block_by_func (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 (childs_[k], on_word_byte_changed, NULL); g_signal_handlers_unblock_by_func (childs_[DEC_], on_word_dec_changed, NULL); g_signal_handlers_unblock_by_func (childs_[SIGN_], on_word_sign_changed, NULL); } mdk-1.3.1/mixgtk/mixgtk_external.c0000644000175000017500000001304713743201230012624 /* -*-c-*- -------------- mixgtk_cmd_dispatcher.c : * Implementation of the functions declared in mixgtk_external.h * ------------------------------------------------------------------ * Copyright (C) 2006, 2007, 2008, 2009, 2019, 2020 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_by_name (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.3.1/mixgtk/mixgtk_device.c0000644000175000017500000004355513743201230012250 /* -*-c-*- ---------------- mixgtk_device.c : * actual types for mixgtk devices * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2019, 2020 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_by_name ("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); gtk_widget_hide (input_dlg_); } 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 < SIZES_[mix_dev_CONSOLE]; ++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, mix_word_t val) { return (DEF_DEV_VTABLE_->ioc)(dev, cmd, val); } 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 gpointer combo_child_ () { return gtk_bin_get_child (GTK_BIN (combo_)); } static mix_device_type_t get_device_idx_ (void) { int k; const gchar *name = gtk_entry_get_text (GTK_ENTRY (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_by_name ("decradio"); g_assert (dtoggle_); wtoggle_ = mixgtk_widget_factory_get_by_name ("wordradio"); g_assert (wtoggle_); combo_ = mixgtk_widget_factory_get_by_name ("dev_combo"); g_assert (combo_); gtk_editable_set_editable (GTK_EDITABLE (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_by_name (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, "_Cancel", GTK_RESPONSE_CANCEL, "_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.3.1/mixgtk/mixgtk_mixal.c0000644000175000017500000003715613743201230012123 /* -*-c-*- -------------- mixgtk_mixal.c : * Implementation of the functions declared in mixgtk_mixal.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2019, 2020 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_ = "gtk-stop"; static const gchar *pc_stock_id_ = "gtk-go-forward"; 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_by_name (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) { 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)); 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.3.1/mixgtk/mixgtk_fontsel.c0000644000175000017500000000766113743201230012461 /* -*-c-*- -------------- mixgtk_fontsel.c : * Implementation of the functions declared in mixgtk_fontsel.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007, 2008, 2019, 2020 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 GtkFontChooserDialog *fontsel_dialog_ = NULL; #define FONTSEL_ GTK_FONT_CHOOSER (fontsel_dialog_) 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_CHOOSER_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_override_font (w, font_desc); 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_chooser_set_font (FONTSEL_, 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_chooser_get_font (FONTSEL_)); 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_chooser_set_font (FONTSEL_, 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_chooser_get_font (FONTSEL_); 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.3.1/mixgtk/mixgtk.h0000644000175000017500000000244612112755472010743 /* -*-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.3.1/mixgtk/mixgtk_gen_handlers.c0000644000175000017500000001240513743201230013430 /* -*-c-*- -------------- mixgtk_gen_handlers.c : * Implementation of the functions declared in mixgtk_gen_handlers.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2019 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, "_Cancel", GTK_RESPONSE_CANCEL, "_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) { gboolean active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (w)); mixgtk_config_set_autosave (active); } void on_save_activate (GtkWidget *w, gpointer data) { mixgtk_config_save (); } mdk-1.3.1/mixgtk/mixgtk_device.h0000644000175000017500000000251112112755472012253 /* -*-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.3.1/mixgtk/mixgtk_config.c0000644000175000017500000000563512112755472012266 /* -*-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.3.1/mixgtk/mixgtk_cmd_dispatcher.h0000644000175000017500000000347512112755472013777 /* -*-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.3.1/mixgtk/mixgtk_cmd_dispatcher.c0000644000175000017500000003141413743201230013751 /* -*-c-*- -------------- mixgtk_cmd_dispatcher.c : * Implementation of the functions declared in mixgtk_cmd_dispatcher.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2019 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_KEY_Up) { entry = previous_history (); if (entry && entry->line) gtk_entry_set_text (w, entry->line); result = TRUE; } if (key == GDK_KEY_Down) { entry = next_history (); if (entry && entry->line) gtk_entry_set_text (w, entry->line); result = TRUE; } #endif if (key == GDK_KEY_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.3.1/mixgtk/mixgtk_wm.h0000644000175000017500000000243212112755472011441 /* -*-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.3.1/mixgtk/mixgtk_wm.c0000644000175000017500000004251313743201230011425 /* -*-c-*- -------------- mixgtk_wm.c : * Implementation of the functions declared in mixgtk_wm.h * ------------------------------------------------------------------ * Copyright (C) 2001, 2002, 2004, 2006, 2007, 2008, 2019, 2020 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; const gchar *toolbar_name; const gchar *attach_button; 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 reparent_ (GtkWidget *widget, GtkWidget *parent); 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", "mixvm_toolbar", "attach_button_mixvm", FALSE, mixvm_detach_, mixvm_attach_}, {MIXGTK_MIXAL_DIALOG, NULL, NULL, "detach_source", "MIXAL.detach", "mixal_toolbar", "attach_button_mixal", FALSE, mixal_detach_, mixal_attach_}, {MIXGTK_DEVICES_DIALOG, NULL, NULL, "detach_dev", "Devices.detach", "dev_toolbar", "attach_button_dev", 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_); gboolean active = gtk_check_menu_item_get_active (item); if (active) mixgtk_wm_detach_window (k); else mixgtk_wm_attach_window (k); mixgtk_config_update (infos_[k].config_key, 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) { gboolean active = gtk_check_menu_item_get_active (item); if (active != mixgtk_config_show_toolbars ()) show_toolbars_ (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_by_name (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_by_name (infos_[k].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_container_add (GTK_CONTAINER (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_by_name (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_by_name (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 const gchar *TB_NAME = "main_toolbar"; static void set_tb_style_ (guint style) { gint k; GtkToolbar *tb = GTK_TOOLBAR (mixgtk_widget_factory_get_by_name (TB_NAME)); gtk_toolbar_set_style (tb, style); for (k = 0; k < INF_NO_; ++k) { GtkToolbar *tb = GTK_TOOLBAR (mixgtk_widget_factory_get_by_name (infos_[k].toolbar_name)); gtk_toolbar_set_style (tb, style); } } static void show_toolbars_ (gboolean show) { gint k; GtkWidget *handle = mixgtk_widget_factory_get_by_name (TB_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_by_name (infos_[k].toolbar_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_by_name (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_by_name (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 reparent_ (GtkWidget *widget, GtkWidget *parent) { gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (widget)), widget); gtk_container_add (GTK_CONTAINER (parent), widget); } static void mixvm_detach_ (void) { 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); 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) { 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.3.1/mixgtk/mixgtk_config.h0000644000175000017500000000365312112755472012271 /* -*-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.3.1/mixgtk/mixgtk_fontsel.h0000644000175000017500000000273212112755472012473 /* -*-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.3.1/mixgtk/mixgtk_widgets.h0000644000175000017500000000615313743201230012455 /* -*-c-*- ---------------- mixgtk_widgets.h : * glade-based factory of mixvm widgets * ------------------------------------------------------------------ * Copyright (C) 2001, 2004, 2006, 2007, 2019, 2020 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_by_name (const gchar *name); #endif /* MIXGTK_WIDGETS_H */ mdk-1.3.1/mixgtk/mixgtk_mixvm.h0000644000175000017500000000350112112755472012154 /* -*-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.3.1/mixgtk/mixgtk_external.h0000644000175000017500000000230212112755472012634 /* -*-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.3.1/mixgtk/Makefile.am0000644000175000017500000000367412622454575011335 ## 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.3.1/mixgtk/mixgtk.glade0000644000175000017500000047740713743423061011602 False 2 About gmixvm False True center-on-parent dialog True False vertical True False spread gtk-ok True True True True True False 1 True True False 0 False False end 0 True False 3 0 0 True False True False 15 vertical 10 True False <b>MIX virtual machine</b> <small>(GNU MDK)</small> True center 0 True True 0 52 16 True False label223 center 0 True False 1 True True <a href="http://www.gnu.org/software/mdk/mdk.html">www.gnu.org/software/mdk</a> True center True 0 False False 2 True True <small>Please send bug reports to bug-mdk@gnu.org</small> True center True True 0 True False 3 True False <small>Copyright (C) 2000-2020 Free Software Foundation, Inc</small> True center 0 False False 4 False True 1 okbutton2 False Devices directory False True center dialog True False vertical True False end gtk-cancel True True True False True True False 0 gtk-ok True True True False True True False 1 False False end 0 True False 25 11 True False Directory center False False 0 True False False False False False False True True 1 _Select True True False True False False 2 False True 2 devdir_cancel devdir_ok False Device output format False True center-on-parent 320 dialog True False vertical True False end gtk-cancel True True True False True True False 0 gtk-apply True True True False True True False 1 gtk-ok True True True False True True False 2 False False end 0 True False S_et all 0 0 True True False True 241 34 0 0 True False Device center 24 10 0 0 True False Format center 24 38 Word 0 0 True True False True True 89 34 Decimal 0 0 True True False True True wordradio 154 34 100 True False 0 True tape0 tape1 tape2 tape3 tape4 tape5 tape6 tape7 disk0 disk1 disk2 disk3 disk4 disk5 disk6 disk7 False tape0 94 3 False False 5 1 button37 button38 button39 False Devices 550 250 True False vertical True False True 2 icons True False True Directory True gtk-home False True True False True Output True gtk-zoom-100 False True True False False False True False True Font True gtk-select-font False True True False False False True False True Attach True gtk-dnd-multiple False True False True 0 True False vertical True True 1 False 1 External programs False True center-on-parent dialog True False vertical True False end gtk-cancel True True True False True True False 0 gtk-ok True True True False True True False 1 False False end 0 True False vertical True True False 9 0 0 True True -e vi %s 168 24 0 0 True False Editor command and arguments (e.g -e vi %s) 8 151 31 True False False False 8 24 True True 0 True False 9 0 0 True False MIX asssembler path True 0.47999998927116394 0.52999997138977051 8 8 151 31 True False False False False Select mixasm executable 8 32 Generate listing file 152 24 True True False False True True 176 32 True True 1 False True 2 button40 button41 False dialog en-gb False vertical 2 False end False False 0 False Memory cell False True dialog False vertical 2 False end gtk-cancel True True False True True True 0 gtk-ok True True True True False True True True 1 False False 0 True False vertical 5 True False Go to address False True 0 True True True 4 True 6 6 0.5 False digits False False 1 False False 1 goto_cancel goto_ok False MIX Console input False True center-on-parent dialog True False vertical True False end gtk-ok True True True True False True True False 0 False False end 0 True False 3 vertical True True False Enter up to 70 characters False False 0 True True 70 True 70 False False 1 False False 2 okbutton1 False gmixvm gmixvm-main 650 550 True False 2 vertical 2 True False True False _File True False _Load True False True False gtk-edit True False True True _Compile True False True False True False gtk-quit True False True True True False De_bug True False _Run True False True False _Next True False True False _Clear breakpoints True False True False _Symbols True False True False True False Vie_w True False _Toolbars True False True False False True False _Show Toolbars True True False _Style True False True False _Icons True True True False _Labels True True tb_style_icons True False _Both True True tb_style_icons True False _Sideways True True tb_style_icons _Detached windows True False True False False True False _Virtual machine True True False _Source True True False _Devices True True False S_ettings True False Change _font True False True False False True False _Virtual machine True True False _Source True True False Command _prompt True True False Command l_og True True False _Devices True True False Symbol _list True True False True False _All True _Device output True False True False De_vices dir True False True False E_xternal programs True False True False True False _Save True False True False True False Save on _exit True True False _Help True False _About True False True False False True 0 True False icons True False True Open True gtk-open False True True False True Compile True gtk-execute False True True False True Edit True gtk-justify-fill False True True False False False True False True Run True gtk-go-forward False True True False True Next True gtk-goto-last False True True False True Clear True gtk-clear False True True False True Symbols True gtk-index False True True False False False True False Devdir True gtk-home False True True False Format True gtk-zoom-100 False True True False Programs True gtk-preferences False True True False False False True False Detach True gtk-dnd-multiple False True True False True Attach True gtk-revert-to-saved False True False True 1 True True vertical 1 True True True True True False True False vertical True False in 10 True False False word 3 4 True True True 0 True True True False False 1 True True True True 2 True False False end bottom False False 3 False MIXAL source 570 225 True False vertical True False True 2 icons True False True Run True gtk-go-forward False True True False True Step True gtk-goto-last False True True False True Clear True gtk-clear False True True False True Symbols True gtk-index False True True False False False True False True Font True gtk-select-font False True True False False False True False True Attach True gtk-dnd-multiple False True False True 0 True False vertical True True 1 True False False False 2 False Virtual machine 640 268 True False vertical True False True icons True False True Font True gtk-select-font False True True False False False attach_button True False True Attach True gtk-dnd-multiple False True menu-bar False True 0 True False 5 0 True False True False 1 vertical 1 True False 2 0 True False 8 3 6 11 6 0 0 True False A center GTK_FILL 0 0 True False I1 center 2 3 GTK_FILL 0 0 True False I2 center 2 3 1 2 GTK_FILL 0 0 True False 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 False X center 1 2 GTK_FILL 16 16 True False I3 center 2 3 2 3 GTK_FILL 0 0 True False I4 center 4 5 GTK_FILL 16 16 True False I5 center 4 5 1 2 GTK_FILL 16 16 True False I6 center 4 5 2 3 GTK_FILL 0 0 True False 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 False 0 0 True True False 9 False False 0 1 2 2 3 GTK_FILL GTK_FILL False True 5 0 True False True False 2 0 True False 1 5 G 0 0 True True False 2 True True False False 0 E 0 0 True True False 2 True True greater_radio False False 1 L 0 0 True True False 2 True True greater_radio False False 2 7 True False False False 3 Overflow True True False True True False False 4 False False 0 True False 2 0 True False 4 1 0 0 True True False 4 6 0 False False 5 0 True True False True False gtk-jump-to False False 1 1 False False end 2 False True 5 1 True False 2 0 True False 5 5 True 0 0 True False Uptime: False False 0 0 0 True False 5 00000000 center False False 1 0 0 True False Elapsed: False False 3 2 0 0 True False 5 000000 center False False 3 0 0 True False Program: False False 2 4 0 0 True False 5 000000 center False False 5 False True 5 2 False False 2 0 True False 7 0 True True 5 in True True GDK_BUTTON_PRESS_MASK True True True 3 end 1 True True 1 False Symbol table 245 265 dictionary dialog True False vertical True False end True True False True False 0 0 True False 2 True False gtk-close False False 0 True False _Close True False False 1 True False 0 False False end 0 True False in True True False True True False True 2 False Enter value False True mouse dialog True False vertical 2 True False end gtk-cancel True True True False True True False 0 gtk-clear True True False True False True True False 1 gtk-ok True True True False True True False 2 False False end 0 True False 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 False Decimal center 14 68 0 0 True False Bytes center 15 36 0 0 True False Enter value center 112 8 False True 2 word_cancel word_ok mdk-1.3.1/mixgtk/mixgtk.c0000644000175000017500000000363512112755472010737 /* -*-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.3.1/mixgtk/mixgtk_gen_handlers.h0000644000175000017500000000312312112755472013445 /* -*-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.3.1/mixgtk/gmixvm.c0000644000175000017500000000557412112755472010747 /* -*-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.3.1/mixgtk/Makefile.in0000664000175000017500000006751215065042013011331 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/gmixvm.Po ./$(DEPDIR)/mixgtk.Po \ ./$(DEPDIR)/mixgtk_cmd_dispatcher.Po \ ./$(DEPDIR)/mixgtk_config.Po ./$(DEPDIR)/mixgtk_device.Po \ ./$(DEPDIR)/mixgtk_external.Po ./$(DEPDIR)/mixgtk_fontsel.Po \ ./$(DEPDIR)/mixgtk_gen_handlers.Po ./$(DEPDIR)/mixgtk_input.Po \ ./$(DEPDIR)/mixgtk_mixal.Po ./$(DEPDIR)/mixgtk_mixvm.Po \ ./$(DEPDIR)/mixgtk_widgets.Po ./$(DEPDIR)/mixgtk_wm.Po 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 ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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)" && $(am__rm_f) $$files clean-binPROGRAMS: -$(am__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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_cmd_dispatcher.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_device.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_external.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_fontsel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_gen_handlers.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_input.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_mixal.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_mixvm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_widgets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixgtk_wm.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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 -f ./$(DEPDIR)/gmixvm.Po -rm -f ./$(DEPDIR)/mixgtk.Po -rm -f ./$(DEPDIR)/mixgtk_cmd_dispatcher.Po -rm -f ./$(DEPDIR)/mixgtk_config.Po -rm -f ./$(DEPDIR)/mixgtk_device.Po -rm -f ./$(DEPDIR)/mixgtk_external.Po -rm -f ./$(DEPDIR)/mixgtk_fontsel.Po -rm -f ./$(DEPDIR)/mixgtk_gen_handlers.Po -rm -f ./$(DEPDIR)/mixgtk_input.Po -rm -f ./$(DEPDIR)/mixgtk_mixal.Po -rm -f ./$(DEPDIR)/mixgtk_mixvm.Po -rm -f ./$(DEPDIR)/mixgtk_widgets.Po -rm -f ./$(DEPDIR)/mixgtk_wm.Po -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 -f ./$(DEPDIR)/gmixvm.Po -rm -f ./$(DEPDIR)/mixgtk.Po -rm -f ./$(DEPDIR)/mixgtk_cmd_dispatcher.Po -rm -f ./$(DEPDIR)/mixgtk_config.Po -rm -f ./$(DEPDIR)/mixgtk_device.Po -rm -f ./$(DEPDIR)/mixgtk_external.Po -rm -f ./$(DEPDIR)/mixgtk_fontsel.Po -rm -f ./$(DEPDIR)/mixgtk_gen_handlers.Po -rm -f ./$(DEPDIR)/mixgtk_input.Po -rm -f ./$(DEPDIR)/mixgtk_mixal.Po -rm -f ./$(DEPDIR)/mixgtk_mixvm.Po -rm -f ./$(DEPDIR)/mixgtk_widgets.Po -rm -f ./$(DEPDIR)/mixgtk_wm.Po -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 am--depfiles 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/depcomp0000755000175000017500000005621714767572401007355 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2024-06-19.01; # UTC # Copyright (C) 1999-2024 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 . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "depcomp (GNU Automake) $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 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 interference 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 obsolete pre-3.x GCC compilers. ## but also to in-use compilers like IBM 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mdk-1.3.1/intltool-extract.in0000664000175000017500000000000015065042012011577 mdk-1.3.1/mkinstalldirs0000755000175000017500000000370414171035245010564 #! /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.3.1/doc/0000775000175000017500000000000015065042311006574 5mdk-1.3.1/doc/MIX.DOC0000644000175000017500000006212712112755472007517 This 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.3.1/doc/mdk_emacs.texi0000644000175000017500000001263610770465100011343 @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.3.1/doc/mdk_mixasm.texi0000644000175000017500000000531512622455635011557 @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.3.1/doc/COPYING.MIX.DOC0000644000175000017500000000136312112755472010621 The 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.3.1/doc/mdk_index.texi0000644000175000017500000000050512112755472011360 @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.3.1/doc/texinfo.tex0000644000175000017500000135102514767572401010737 % 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{2024-02-10.22} % % Copyright 1985, 1986, 1988, 1990-2024 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: % https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % https://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 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 https://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % LaTeX's \typeout. This ensures that the messages it is used for % are identical in format to the corresponding ones from latex/pdflatex. \def\typeout{\immediate\write17}% \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\ptexsp=\sp \let\ptexstar=\* \let\ptexsup=\sup \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 % Give the space character the catcode for a space. \def\spaceisspace{\catcode`\ =10\relax} % Likewise for ^^M, the end of line character. \def\endlineisspace{\catcode13=10\relax} \chardef\dashChar = `\- \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 } % 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} % Output routine % % 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 } % 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. % \domark is called twice inside \chapmacro, to add one % mark before the section break, and one after. % In the second call \prevchapterdefs is the same as \currentchapterdefs, % and \prevsectiondefs is the same as \currentsectiondefs. % Then if the page is not broken at the mark, some of the previous % section appears on the page, and we can get the name of this section % from \firstmark for @everyheadingmarks top. % @everyheadingmarks bottom uses \botmark. % % See page 260 of The TeXbook. \def\domark{% \toks0=\expandafter{\currentchapterdefs}% \toks2=\expandafter{\currentsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\currentcolordefs}% \mark{% \the\toks0 \the\toks2 % 0: marks for @everyheadingmarks top \noexpand\or \the\toks4 \the\toks6 % 1: for @everyheadingmarks bottom \noexpand\else \the\toks8 % 2: color marks }% } % \gettopheadingmarks, \getbottomheadingmarks, % \getcolormarks - extract needed part of mark. % % \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 etc.) between @contents and the very first @chapter. \def\gettopheadingmarks{% \ifcase0\the\savedtopmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\the\savedtopmark\fi} % Avoid "undefined control sequence" errors. \def\currentchapterdefs{} \def\currentsectiondefs{} \def\currentsection{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\currentcolordefs{} % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\txipagewidth \newdimen\txipageheight % Main output routine. % \chardef\PAGE = 255 \newtoks\defaultoutput \defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}} \output=\expandafter{\the\defaultoutput} \newbox\headlinebox \newbox\footlinebox % When outputting the double column layout for indices, an output routine % is run several times, hiding the original value of \topmark. Hence, save % \topmark at the beginning. % \newtoks\savedtopmark \newif\iftopmarksaved \topmarksavedtrue \def\savetopmark{% \iftopmarksaved\else \global\savedtopmark=\expandafter{\topmark}% \global\topmarksavedtrue \fi } % \onepageout takes a vbox as an argument. % \shipout a vbox for a single page, adding an optional header, footer % and footnote. This also causes index entries for this page to be written % to the auxiliary files. % \def\onepageout#1{% \hoffset=\normaloffset % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % \checkchapterpage % % Make the heading and footing. \makeheadline and \makefootline % use the contents of \headline and \footline. \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}% % {% % Set context for writing to auxiliary files like index files. % 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. % \atdummies % don't expand commands in the output. \turnoffactive \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\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 % }% }% \global\topmarksavedfalse \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen % Main part of page, including any footnotes \def\pagebody#1{\vbox to\txipageheight{\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} } % Check if we are on the first page of a chapter. Used for printing headings. \newif\ifchapterpage \def\checkchapterpage{% % Get the chapter that was current at the end of the last page \ifcase1\the\savedtopmark\fi \let\prevchaptername\thischaptername % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \let\curchaptername\thischaptername % \ifx\curchaptername\prevchaptername \chapterpagefalse \else \chapterpagetrue \fi } % Argument parsing % 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. % For example, \def\foo{\parsearg\fooxxx}. % \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. Pass the result on to % \argremovespace. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm} % \argremovec might leave us with trailing space, though; e.g., % @end itemize @c foo % Note that the argument cannot contain the TeX $, as its catcode is % changed to \other when Texinfo source is read. \def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\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 % just before passing the control to \next. % (But first, we have to remove the remaining $ or two.) \def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef - define a command taking an argument on the line % % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} \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}} \long\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 calls \checkenv and executes the definition of \Efoo. \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 % @- allows explicit insertion of hyphenation points \def\-{\discretionary{\normaldash}{}{}}% % @. 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} % @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. \addgroupbox \prevdepth = \dimen1 \checkinserts } \def\addgroupbox{ % \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 = \txipageheight \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\txipageheight \page \fi \fi \box\groupbox } % % 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 % This is similar to the 'needspace' module in LaTeX. % The first penalty allows a break if the end of the page is % not too far away. Following penalties and skips are discarded. % Otherwise, require at least \dimen0 of vertical space. % % (We used to use a \vtop to reserve space, but this had spacing issues % when followed by a section heading, as it was not a "discardable item". % This also has the benefit of providing glue before the page break if % there isn't enough space.) \vskip0pt plus \dimen0 \penalty-100 \vskip0pt plus -\dimen0 \vskip \dimen0 \penalty9999 \vskip -\dimen0 \penalty0\relax % this hides the above glue from \safewhatsit and \dobreak \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 } % @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\c{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \cxxx} {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} % \let\comment\c % @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 = {}% } % leave vertical mode without cancelling any first paragraph indent \gdef\imageindent{% \toks0=\everypar \everypar={}% \ptexnoindent \global\everypar=\toks0 } % @refill is a no-op. \let\refill=\relax % @setfilename INFO-FILENAME - ignored \let\setfilename=\comment % @bye. \outer\def\bye{\chappager\pagelabels\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 \newbox\boxB \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % % For LuaTeX % \newif\iftxiuseunicodedestname \txiuseunicodedestnamefalse % For pdfTeX etc. \ifx\luatexversion\thisisundefined \else % Use Unicode destination names \txiuseunicodedestnametrue % Escape PDF strings with converting UTF-16 from UTF-8 \begingroup \catcode`\%=12 \directlua{ function UTF16oct(str) tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377') for c in string.utfvalues(str) do if c < 0x10000 then tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c / 256), math.floor(c % 256))) else c = c - 0x10000 local c_hi = c / 1024 + 0xd800 local c_lo = c % 1024 + 0xdc00 tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c_hi / 256), math.floor(c_hi % 256), math.floor(c_lo / 256), math.floor(c_lo % 256))) end end end } \endgroup \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}} % Escape PDF strings without converting \begingroup \directlua{ function PDFescstr(str) for c in string.bytes(str) do if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then tex.sprint(-2, string.format(string.char(0x5c) .. string.char(0x25) .. '03o', c)) else tex.sprint(-2, string.char(c)) end end end } % The -2 in the arguments here gives all the input to TeX catcode 12 % (other) or 10 (space), preventing undefined control sequence errors. See % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html % \endgroup \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}} \ifnum\luatexversion>84 % For LuaTeX >= 0.85 \def\pdfdest{\pdfextension dest} \let\pdfoutput\outputmode \def\pdfliteral{\pdfextension literal} \def\pdfcatalog{\pdfextension catalog} \def\pdftexversion{\numexpr\pdffeedback version\relax} \let\pdfximage\saveimageresource \let\pdfrefximage\useimageresource \let\pdflastximage\lastsavedimageresourceindex \def\pdfendlink{\pdfextension endlink\relax} \def\pdfoutline{\pdfextension outline} \def\pdfstartlink{\pdfextension startlink} \def\pdffontattr{\pdfextension fontattr} \def\pdfobj{\pdfextension obj} \def\pdflastobj{\numexpr\pdffeedback lastobj\relax} \let\pdfpagewidth\pagewidth \let\pdfpageheight\pageheight \edef\pdfhorigin{\pdfvariable horigin} \edef\pdfvorigin{\pdfvariable vorigin} \fi \fi % 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 \newif\ifpdforxetex \pdforxetexfalse \ifpdf \pdforxetextrue \fi \ifx\XeTeXrevision\thisisundefined\else \pdforxetextrue \fi % Output page labels information. % See PDF reference v.1.7 p.594, section 8.3.1. % Page label ranges must be increasing. \ifpdf \def\pagelabels{% \def\title{0 << /P (T-) /S /D >>}% % % support @contents at very end of document \ifnum\contentsendcount=\pagecount \ifnum\arabiccount<\romancount \pdfcatalog{/PageLabels << /Nums [\title \the\arabiccount << /S /D >> \the\romancount << /S /r >> ] >> }\relax \fi % no contents in document \else\ifnum\contentsendcount=0 \pdfcatalog{/PageLabels << /Nums [\title \the\arabiccount << /S /D >> ] >> }\relax \else \pdfcatalog{/PageLabels << /Nums [\title \the\romancount << /S /r >> \the\contentsendcount << /S /D >> ] >> }\relax \fi\fi } \else \let\pagelabels\relax \fi \newcount\pagecount \pagecount=0 \newcount\romancount \romancount=0 \newcount\arabiccount \arabiccount=0 \newcount\contentsendcount \contentsendcount=0 \ifpdf \let\ptxadvancepageno\advancepageno \def\advancepageno{% \ptxadvancepageno\global\advance\pagecount by 1 } \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. \xdef#1{#1}% \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \def\txiescapepdfutfsixteen#1{% \ifx\pdfescapestrutfsixteen\thisisundefined % No UTF-16 converting macro available. \txiescapepdf{#1}% \else \xdef#1{\pdfescapestrutfsixteen{#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 using ideas from 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. The dark red here is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. We use % black by default, though. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % rg sets the color for filling (usual text, etc.); % RG 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\curcolor{0 0 0}% \def\setcolor#1{% \ifx#1\curcolor\else \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% \xdef\curcolor{#1}% \fi } % \let\maincolor\rgbBlack \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \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\setpdfdestname#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 \makevalueexpandable \turnoffactive \iftxiuseunicodedestname \ifx \declaredencoding \latone % Pass through Latin-1 characters. % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode. \else \ifx \declaredencoding \utfeight % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \fi \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \indexnofonts \makevalueexpandable \turnoffactive \ifx \declaredencoding \latone % The PDF format can use an extended form of Latin-1 in bookmark % strings. See Appendix D of the PDF Reference, Sixth Edition, for % the "PDFDocEncoding". \passthroughcharstrue % Pass through Latin-1 characters. % LuaTeX: Convert to Unicode % pdfTeX: Use Latin-1 as PDFDocEncoding \def\pdfoutlinetext{#1}% \else \ifx \declaredencoding \utfeight \ifx\luatexversion\thisisundefined % For pdfTeX with UTF-8. % TODO: the PDF format can use UTF-16 in bookmark strings, % but the code for this isn't done yet. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \else % For LuaTeX with UTF-8. % Pass through Unicode characters for title texts. \passthroughcharstrue \def\pdfoutlinetext{#1}% \fi \else % For non-Latin-1 or non-UTF-8 encodings. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \fi \fi % LuaTeX: Convert to UTF-16 % pdfTeX: Use Latin-1 as PDFDocEncoding \txiescapepdfutfsixteen\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use black for everything. \def\urlcolor{\rgbBlack} \let\linkcolor\rgbBlack \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. \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#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. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\unnchapentry##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} % \pdfgettoks - Surround page numbers in #1 with @pdflink. #1 may % be a simple number, or a list of numbers in the case of an index % entry. \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{\pdflinkpage{#1}{#1}}% \def\pdflinkpage#1#2{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#2\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 % % For XeTeX % \ifx\XeTeXrevision\thisisundefined \else % % XeTeX version check % \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1 % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307. % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941). % For avoiding PDF destination name replacement, we use this special % instead of xdvipdfmx's command line option `-C 0x0010'. \special{dvipdfmx:config C 0x0010} % XeTeX 0.99995+ comes with xdvipdfmx 20160307+. % It can handle Unicode destination names for PDF. \txiuseunicodedestnametrue \else % XeTeX < 0.99996 (TeX Live < 2016) cannot use the % `dvipdfmx:config' special. % So for avoiding PDF destination name replacement, % xdvipdfmx's command line option `-C 0x0010' is necessary. % % XeTeX < 0.99995 can not handle Unicode destination names for PDF % because xdvipdfmx 20150315 has a UTF-16 conversion issue. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). \txiuseunicodedestnamefalse \fi % % Color support % \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % \def\pdfsetcolor#1{\special{pdf:scolor [#1]}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \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 } % % PDF outline support % % Emulate pdfTeX primitive \def\pdfdest name#1 xyz{% \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}% } % \def\setpdfdestname#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 \makevalueexpandable \turnoffactive \iftxiuseunicodedestname % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \turnoffactive % Always use Unicode characters in title texts. \def\pdfoutlinetext{#1}% % For XeTeX, xdvipdfmx converts to UTF-16. % So we do not convert. \txiescapepdf\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % \def\dopdfoutline#1#2#3#4{% \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A << /S /GoTo /D (\pdfdestname) >> >> }% } % \def\pdfmakeoutlines{% \begingroup % % For XeTeX, counts of subentries are not necessary. % Therefore, we read toc only once. % % We use node names as destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{1}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{2}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{3}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% \dopdfoutline{##1}{4}{##3}{##4}}% % \let\appentry\numchapentry% \let\appsecentry\numsecentry% \let\appsubsecentry\numsubsecentry% \let\appsubsubsecentry\numsubsubsecentry% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{1}{##3}{##4}}% \let\unnsecentry\numsecentry% \let\unnsubsecentry\numsubsecentry% \let\unnsubsubsecentry\numsubsubsecentry% % % For XeTeX, xdvipdfmx converts strings to UTF-16. % Therefore, the encoding and the language may not be considered. % \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[}]% ] \special{pdf:docview << /PageMode /UseOutlines >> } % ``\special{pdf:tounicode ...}'' is not necessary % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it. % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315, % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). % \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 } % 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}% \special{pdf:bann << /Border [0 0 0] /Subtype /Link /A << /S /URI /URI (#1) >> >>}% \endgroup} \def\endlink{\setcolor{\maincolor}\special{pdf:eann}} \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{\pdflinkpage{#1}{#1}}% \def\pdflinkpage#1#2{% \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% \setcolor{\linkcolor}#2\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} % % % @image support % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\doxeteximage#1#2#3{% \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % XeTeX (and the PDF format) supports .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\xeteximgext=\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 \errmessage{Could not find image file #1 for XeTeX}% \else \gdef\xeteximgext{JPG}% \fi \else \gdef\xeteximgext{jpeg}% \fi \else \gdef\xeteximgext{jpg}% \fi \else \gdef\xeteximgext{png}% \fi \else \gdef\xeteximgext{PDF}% \fi \else \gdef\xeteximgext{pdf}% \fi \closein 1 \endgroup % % Putting an \hbox around the image can prevent an over-long line % after the image. \hbox\bgroup \def\xetexpdfext{pdf}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \def\xetexpdfext{PDF}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \XeTeXpicfile "#1".\xeteximgext "" \fi \fi \ifdim \wd0 >0pt width \xeteximagewidth \fi \ifdim \wd2 >0pt height \xeteximageheight \fi \relax \egroup } \fi % \message{fonts,} % 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 % % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % 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% \ifx#2\ttshape\hyphenchar#1=-1 \fi \ifx#2\ttbshape\hyphenchar#1=-1 \fi \ifx#2\ttslshape\hyphenchar#1=-1 \fi } % 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\defsl\slshape{10}{\magstep1}{OT1} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\ttslfont=\defttsl \let\slfont=\defsl \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 math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % 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\secrmnotbold\rmshape{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 @acronym 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\defsl\slshape{10}{\magstephalf}{OT1} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\slfont=\defsl \let\ttslfont=\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 math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % 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 @acronym 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 % 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} % 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 } % % 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 #1font\endcsname % change the current font } \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}} % 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}} % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. % We don't bother to reset \scriptscriptfont; awaiting user need. % \def\resetmathfonts{% \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont \textfont\ttfam=\ttfont \textfont\sffam=\sffont % % Fonts for superscript. Note that the 7pt fonts are used regardless % of the current font size. \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt \scriptfont\sffam=\sevensf } % \defineassignfonts{SIZE} - % Define sequence \assignfontsSIZE, which switches between font sizes % by redefining the meanings of \STYLEfont. (Just \STYLE additionally sets % the current \fam for math mode.) % \def\defineassignfonts#1{% \expandafter\edef\csname assignfonts#1\endcsname{% \let\noexpand\rmfont\csname #1rm\endcsname \let\noexpand\itfont\csname #1it\endcsname \let\noexpand\slfont\csname #1sl\endcsname \let\noexpand\bffont\csname #1bf\endcsname \let\noexpand\ttfont\csname #1tt\endcsname \let\noexpand\smallcaps\csname #1sc\endcsname \let\noexpand\sffont \csname #1sf\endcsname \let\noexpand\ifont \csname #1i\endcsname \let\noexpand\syfont \csname #1sy\endcsname \let\noexpand\ttslfont\csname #1ttsl\endcsname } } \def\assignfonts#1{% \csname assignfonts#1\endcsname } \newif\ifrmisbold % Select smaller font size with the current style. Used to change font size % in, e.g., the LaTeX logo and acronyms. If we are using bold fonts for % normal roman text, also use bold fonts for roman text in the smaller size. \def\switchtolllsize{% \expandafter\assignfonts\expandafter{\lllsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% \def\switchtolsize{% \expandafter\assignfonts\expandafter{\lsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% % Define the font-changing commands (all called \...fonts). % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used % in, e.g., the LaTeX logo and acronyms. % % Note: The fonts used for \ifont are for "math italics" (\itfont is for % italics in regular text). \syfont is also used in math mode only. % \def\definefontsetatsize#1#2#3#4#5{% \defineassignfonts{#1}% \expandafter\def\csname #1fonts\endcsname{% \def\curfontsize{#1}% \def\lsize{#2}\def\lllsize{#3}% \csname rmisbold#5\endcsname \csname assignfonts#1\endcsname \resetmathfonts \setleading{#4}% }} \definefontsetatsize{text} {reduced}{smaller}{\textleading}{false} \definefontsetatsize{title} {chap} {subsec} {27pt} {true} \definefontsetatsize{chap} {sec} {text} {19pt} {true} \definefontsetatsize{sec} {subsec} {reduced}{17pt} {true} \definefontsetatsize{ssec} {text} {small} {15pt} {true} \definefontsetatsize{reduced}{small} {smaller}{10.5pt}{false} \definefontsetatsize{small} {smaller}{smaller}{10.5pt}{false} \definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false} \def\titlefont#1{{\titlefonts\rm #1}} \let\subsecfonts = \ssecfonts \let\subsubsecfonts = \ssecfonts % 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 % 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. #1 is what to % print if we are indeed using \tt; #2 is what to print otherwise. \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} % Check if internal flag is clear, i.e. has not been @set. \def\ifflagclear#1#2#3{% \expandafter\ifx\csname SET#1\endcsname\relax #2\else#3\fi } { \catcode`\'=\active \catcode`\`=\active \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} \gdef\setregularquotes{\let`\lq \let'\rq} } \setregularquotes % output for ' in @code % in tt font hex 0D (undirected) or 27 (curly right quote) % \def\codequoteright{% \ifusingtt {\ifflagclear{txicodequoteundirected}% {\ifflagclear{codequoteundirected}% {'}% {\char"0D }}% {\char"0D }}% {'}% } % output for ` in @code % in tt font hex 12 (grave accent) or 60 (curly left quote) % \relax disables Spanish ligatures ?` and !` of \tt font. % \def\codequoteleft{% \ifusingtt {\ifflagclear{txicodequotebacktick}% {\ifflagclear{codequotebacktick}% {\relax`}% {\char"12 }}% {\char"12 }}% {\relax`}% } % 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 } % Turn them on by default \let\SETtxicodequoteundirected = t \let\SETtxicodequotebacktick = t % [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}\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless the following character is such as % not to need one. \def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx} \def\smartitaliccorrectionx{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ifx\next\.% \else\ifx\next\comma% \else\ptexslash \fi\fi\fi\fi\fi \aftersmartic } % @cite unconditionally uses \sl with \smartitaliccorrection. \def\cite#1{{\sl #1}\smartitaliccorrection} % @var unconditionally uses \sl. This gives consistency for % parameter names whether they are in @def, @table @code or a % regular paragraph. % To get ttsl font for @var when used in code context, @set txicodevaristt. % The \null is to reset \spacefactor. \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% % \ifflagclear{txicodevaristt}% {\def\varnext{{{\sl #1}}\smartitaliccorrection}}% {\def\varnext{\smartslanted{#1}}}% \varnext } % To be removed after next release \def\SETtxicodevaristt{}% @set txicodevaristt \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % @r for roman font, used for code comment \def\r#1{{% \usenormaldash % get --, --- ligatures even if in @code \defcharsdefault % in case on def line \rm #1}} {\catcode`-=\active \gdef\usenormaldash{\let-\normaldash}} % @sc, undocumented @ii. \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}} \newif\iffrenchspacing \frenchspacingfalse % 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{% \iffrenchspacing\else \frenchspacingtrue \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m \def\endofsentencespacefactor{1000}% for @. and friends \fi } \def\plainnonfrenchspacing{% \iffrenchspacing \frenchspacingfalse \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends \fi } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \let\frenchspacingsetting\plainnonfrenchspacing % used in output routine \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \let\frenchspacingsetting\plainfrenchspacing \else\ifx\temp\offword \let\frenchspacingsetting\plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi \frenchspacingsetting } % @t, explicit typewriter. \def\t#1{% {\tt \defcharsdefault \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setcodequotes\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 % % `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % This is for LuaTeX: It is not sufficient to disable hyphenation at % explicit dashes by setting `\hyphenchar` to -1. \def\dashnobreak{% \normaldash \penalty 10000 } % 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. % We explicitly allow hyphenation at these characters % using \discretionary. % % Hyphenation at - and hyphenation within words was turned off % by default for the tt fonts using the \hyphenchar parameter of TeX. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setcodequotes \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\dashnobreak \let_\realunder \fi \codex } % \gdef\codedash{\futurelet\next\codedashfinish} \gdef\codedashfinish{% \normaldash % always output the dash character itself. % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or % (b) the preceding character is a -, or % (c) we are at the start of the string. % In both cases (b) and (c), \codedashnobreak should be set to \codedash. % % E.g., given --posix, we do not want to allow a break after either -. % Given --foo-bar, we do want to allow a break between the - and the b. \ifx\next\codedash \else \ifx\codedashnobreak\codedash \else \discretionary{}{}{}\fi \fi % we need the space after the = for the case when \next itself is a % space token; it would get swallowed otherwise. As in @code{- a}. \global\let\codedashnobreak= \next } } \def\normaldash{-} % \def\codex #1{\tclose{% % Given -foo (with a single dash), we do not want to allow a break % after the -. \codedashnobreak is set to the first character in % @code. \futurelet\codedashnobreak\relax #1% }\endgroup} \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') aka @url 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. % TeX-only option to allow changing PDF output to show only the second % arg (if given), and not the url (which is then just the link target). \newif\ifurefurlonlylink % The default \pretolerance setting stops the penalty inserted in % \urefallowbreak being a discouragement to line breaking. Set it to % a negative value for this paragraph only. Hopefully this does not % conflict with redefinitions of \par done elsewhere. \def\nopretolerance{% \pretolerance=-1 \def\par{\endgraf\pretolerance=100 \let\par\endgraf}% } % The main macro is \urefbreak, which allows breaking at expected % places within the url. \def\urefbreak{\nopretolerance \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}% look for second arg \ifdim\wd0 > 0pt \ifpdf % For pdfTeX and LuaTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \else \ifx\XeTeXrevision\thisisundefined \unhbox0\ (\urefcode{#1})% DVI, always show arg and url \else % For XeTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \fi \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`\&=\active \catcode`\.=\active \catcode`\#=\active \catcode`\?=\active \catcode`\/=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setcodequotes \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} } \def\urefcodeamp{\urefprebreak \&\urefpostbreak} \def\urefcodedot{\urefprebreak .\urefpostbreak} \def\urefcodehash{\urefprebreak \#\urefpostbreak} \def\urefcodequest{\urefprebreak ?\urefpostbreak} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprebreak \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 \urefpostbreak \fi } } % 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{\urefallowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} % Allow a ragged right output to aid breaking long URL's. There can % be a break at the \allowbreak with no extra glue (if the existing stretch in % the line is sufficient), a break at the \penalty with extra glue added % at the end of the line, or no break at all here. % Changing the value of the penalty and/or the amount of stretch affects how % preferable one choice is over the other. \def\urefallowbreak{% \penalty0\relax \hskip 0pt plus 2 em\relax \penalty1000\relax \hskip 0pt plus -2 em\relax } \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} \ifpdforxetex \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 \def\kbd#1{% \tclose{\kbdfont\setcodequotes#1}% } % 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. % \def\key#1{{\setregularquotes \tt #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} % @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{% {\switchtolsize #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{% \ifmmode\else % only go into math if not in math mode already \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 % have to provide another name for sup operator \let\mathopsup=\sup $\expandafter\finishmath\fi } \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 } } % for @sub and @sup, if in math mode, just do a normal sub/superscript. % If in text, use math to place as sub/superscript, but switch % into text mode, with smaller fonts. This is a different font than the % one used for real math sub/superscripts (8pt vs. 7pt), but let's not % fix it (significant additions to font machinery) until someone notices. % \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} \def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}% % \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}% % provide this command from LaTeX as it is very common \def\frac#1#2{{{#1}\over{#2}}} % @displaymath. % \globaldefs is needed to recognize the end lines in \tex and % \end tex. Set \thisenv as @end displaymath is seen before @end tex. {\obeylines \globaldefs=1 \envdef\displaymath{% \tex% \def\thisenv{\displaymath}% \begingroup\let\end\displaymathend% $$% } \def\displaymathend{$$\endgroup\end}% \def\Edisplaymath{% \def\thisenv{\tex}% \end tex }} % @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 } % % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if % FMTNAME is tex, else ELSE-TEXT. \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\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. } % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. % \long\def\inlineifset#1{\doinlineifset #1,\finish} \long\def\doinlineifset#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \else\ignorespaces#2\fi } % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. % \long\def\inlineifclear#1{\doinlineifclear #1,\finish} \long\def\doinlineifclear#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. \def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}} \def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}} \let\{=\lbracechar \let\}=\rbracechar % @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{\switchtolllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \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 \ifx\curfontsize\smallword % For footnotes and indices \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \switchtolllsize A% \fi \fi }% \vss }}% \kern-.15em \TeX } \def\smallword{small} % Some math mode symbols. Define \ensuremath to switch into math mode % unless we are already there. Expansion tricks may not be needed here, % but safer, and can't hurt. \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} \def\ensuredmath#1{$\relax#1$} % \def\bullet{\ensuremath\ptexbullet} \def\geq{\ensuremath\ge} \def\leq{\ensuremath\le} \def\minus{\ensuremath-} % @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 % {\ttfont \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{{\ifusingtt{\ecfont\char"BF}{\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}} % \def\L{{\ecfont \char"8A}} % L with stroke \def\l{{\ecfont \char"AA}} % l with stroke % % 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 European Computer Modern fonts (cm-super in outline format) % for non-CM glyphs. That is ec* for regular text and tc* for the text % companion symbols (LaTeX TS1 encoding). Both are part of the ec % package and follow the same conventions. % \def\ecfont{\etcfont{e}} \def\tcfont{\etcfont{t}} % \def\etcfont#1{% % 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}% \ifusingtt % typewriter: {\font\thisecfont = #1ctt\ecsize \space at \nominalsize}% % else {\ifx\curfontstyle\bfstylename % bold: \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize \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{\switchtolllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{% \ifmmode ^\circ \else {\tcfont \char 176}% \fi} % 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\quoteleft=`\` \chardef\quoteright=`\' % only change font for tt for correct kerning and to avoid using % \ecfont unless necessary. \def\quotedblleft{% \ifusingtt{{\ecfont\char"10}}{{\char"5C}}% } \def\quotedblright{% \ifusingtt{{\ecfont\char"11}}{{\char`\"}}% } \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 % @setcontentsaftertitlepage used to do an implicit @contents or % @shortcontents after @end titlepage, but it is now obsolete. \def\setcontentsaftertitlepage{% \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo command; move your @contents command if you want the contents after the title page.}}% \def\setshortcontentsaftertitlepage{% \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo command; move your @shortcontents and @contents commands if you want the contents after the title page.}}% \parseargdef\shorttitlepage{% {\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page}\pageone} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts \headingsoff % 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 \pageone \endgroup % } \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. \par should % be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rm \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\rmfont \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\rm \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\evenchapheadline% headline on even pages with a new chapter \newtoks\oddchapheadline % headline on odd pages with a new chapter \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make \makeheadline and \makefootline in Plain TeX use those variables \headline={{\textfonts\rm\frenchspacingsetting \ifchapterpage \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi \else \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi \fi}} \footline={{\textfonts\rm\frenchspacingsetting \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}} \global\evenchapheadline=\evenheadline} \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}}% \global\oddchapheadline=\oddheadline} \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\txipageheight 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 % These define \getoddheadingmarks, \getevenheadingmarks, % \getoddfootingmarks, and \getevenfootingmarks, each to one of % \gettopheadingmarks, \getbottomheadingmarks. % \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \parseargdef\everyfootingmarks{\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. \parseargdef\headings{\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting % Set the page number to 1. \def\pageone{ \global\pageno=1 \global\arabiccount = \pagecount } \let\contentsalignmacro = \chappager % \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon % 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\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdouble{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\folio\hfil\thistitle}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle} \def\HEADINGSsingle{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\hfil\folio}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chappager } % for @setchapternewpage off \def\HEADINGSsinglechapoff{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline=\evenheadline \global\oddchapheadline=\oddheadline \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 so 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}% % \ifinner\else \vadjust{\penalty 1200}% not good to break after first line of item. \fi % We can be in inner vertical mode in a footnote, although an % @itemize looks awful there. }% \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 } % @multitable macros % 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 } % @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 below 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{% \crcr % must appear first \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % default for tables with no headings. \let\headitemcrhook=\relax % \def\tab{\checkenv\multitable &\the\everytab}% \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 \parskip=0pt \parindent=6pt \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% Reset from possible headitem. \global\colcount=0 % Reset the column counter. % % Check for saved footnotes, etc.: \checkinserts % % Perhaps a \nobreak, then reset: \headitemcrhook \global\let\headitemcrhook=\relax }% }% % \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 \strut \vtop{% \advance\hsize by -1\leftskip % Find the correct column width \hsize=\expandafter\csname col\the\colcount\endcsname % \advance\rightskip by -1\rightskip % Zero leaving only any stretch \ifnum\colcount=1 \advance\hsize by\leftskip % Add indent of surrounding text \else % In order to keep entries from bumping into each other. \leftskip=12pt \ifsetpercent \else % If a template has been used \advance\hsize by \leftskip \fi \fi \noindent\ignorespaces##\unskip\strut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @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{ifnotlatex} \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\iflatex{\doignore{iflatex}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\latex{\doignore{latex}} \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 } } \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 } % Like \expandablevalue, but completely expandable (the \message in the % definition above operates at the execution level of TeX). Used when % writing to auxiliary files, due to the expansion that \write does. % If flag is undefined, pass through an unexpanded @value command: maybe it % will be set by the time it is read back in. % % NB flag names containing - or _ may not work here. \def\dummyvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax \string\value{#1}% \else \csname SET#1\endcsname \fi } % Used for @value's in index entries to form the sort key: expand the @value % if possible, otherwise sort late. \def\indexnofontsvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax ZZZZZZZ% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get the special treatment we need for `@end ifset,' we call % \makecond and then 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 {IX} defines an index named IX. % It automatically defines \IXindex such that % \IXindex ...rest of line... puts an entry in the index IX. % It also defines \IXindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is IX. % \def\newindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \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{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % The default indices: \newindex{cp}% concepts, \newcodeindex{fn}% functions, \newcodeindex{vr}% variables, \newcodeindex{tp}% types, \newcodeindex{ky}% keys \newcodeindex{pg}% and programs. % @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{% \requireopenindexfile{#3}% % 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 index macros. % Argument #1 is generated by the calling \fooindex macro, % and it is the two-letter name of the index. \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} \def\doindexxxx #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} \def\docodeindexxxx #1{\docind{\indexname}{#1}} % \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. % % 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). % % For control letters, we have \definedummyletter, which omits the % space. % \def\definedummyword #1{\def#1{\string#1\space}}% \def\definedummyletter#1{\def#1{\string#1}}% % Used for the aux, toc and index files to prevent expansion of Texinfo % commands. Most of the commands are controlled through the % \ifdummies conditional. % \def\atdummies{% \dummiestrue % \definedummyletter\@% \definedummyletter\ % \definedummyletter\{% \definedummyletter\}% \definedummyletter\&% % \definedummyletter\_% \definedummyletter\-% % \definedummyword\subentry % % We want to disable all macros so that they are not expanded by \write. \let\commondummyword\definedummyword \macrolist \let\value\dummyvalue % \turnoffactive } \newif\ifdummies \newif\ifindexnofonts \def\commondummyletter#1{% \expandafter\let\csname\string#1:impl\endcsname#1% \edef#1{% \noexpand\ifindexnofonts % empty expansion \noexpand\else \noexpand\ifdummies\string#1% \noexpand\else \noexpand\jumptwofi % dispose of the \fi \expandafter\noexpand\csname\string#1:impl\endcsname \noexpand\fi \noexpand\fi}% } \def\commondummyaccent#1{% \expandafter\let\csname\string#1:impl\endcsname#1% \edef#1{% \noexpand\ifindexnofonts \noexpand\expandafter % dispose of \else ... \fi \noexpand\asis \noexpand\else \noexpand\ifdummies\string#1% \noexpand\else \noexpand\jumptwofi % dispose of the \fi \expandafter\noexpand\csname\string#1:impl\endcsname \noexpand\fi \noexpand\fi}% } % Like \commondummyaccent but add a \space at the end of the dummy expansion % #2 is the expansion used for \indexnofonts. #2 is always followed by % \asis to remove a pair of following braces. \def\commondummyword#1#2{% \expandafter\let\csname\string#1:impl\endcsname#1% \expandafter\def\csname\string#1:ixnf\endcsname{#2\asis}% \edef#1{% \noexpand\ifindexnofonts \noexpand\expandafter % dispose of \else ... \fi \expandafter\noexpand\csname\string#1:ixnf\endcsname \noexpand\else \noexpand\ifdummies\string#1\space \noexpand\else \noexpand\jumptwofi % dispose of the \fi \fi \expandafter\noexpand\csname\string#1:impl\endcsname \noexpand\fi \noexpand\fi}% } \def\jumptwofi#1\fi\fi{\fi\fi#1} % For \atdummies and \indexnofonts. \atdummies sets % \dummiestrue and \indexnofonts sets \indexnofontstrue. \def\definedummies{ % @-sign is always an escape character when reading auxiliary files \escapechar = `\@ % \commondummyletter\!% \commondummyaccent\"% \commondummyaccent\'% \commondummyletter\*% \commondummyaccent\,% \commondummyletter\.% \commondummyletter\/% \commondummyletter\:% \commondummyaccent\=% \commondummyletter\?% \commondummyaccent\^% \commondummyaccent\`% \commondummyaccent\~% % % Control letters and accents. \commondummyword\u {}% \commondummyword\v {}% \commondummyword\H {}% \commondummyword\dotaccent {}% \commondummyword\ogonek {}% \commondummyword\ringaccent {}% \commondummyword\tieaccent {}% \commondummyword\ubaraccent {}% \commondummyword\udotaccent {}% \commondummyword\dotless {}% % % Texinfo font commands. \commondummyword\b {}% \commondummyword\i {}% \commondummyword\r {}% \commondummyword\sansserif {}% \commondummyword\sc {}% \commondummyword\slanted {}% \commondummyword\t {}% % % Commands that take arguments. \commondummyword\abbr {}% \commondummyword\acronym {}% \commondummyword\anchor {}% \commondummyword\cite {}% \commondummyword\code {}% \commondummyword\command {}% \commondummyword\dfn {}% \commondummyword\dmn {}% \commondummyword\email {}% \commondummyword\emph {}% \commondummyword\env {}% \commondummyword\file {}% \commondummyword\image {}% \commondummyword\indicateurl{}% \commondummyword\inforef {}% \commondummyword\kbd {}% \commondummyword\key {}% \commondummyword\link {}% \commondummyword\math {}% \commondummyword\option {}% \commondummyword\pxref {}% \commondummyword\ref {}% \commondummyword\samp {}% \commondummyword\strong {}% \commondummyword\tie {}% \commondummyword\U {}% \commondummyword\uref {}% \commondummyword\url {}% \commondummyword\var {}% \commondummyword\verb {}% \commondummyword\w {}% \commondummyword\xref {}% % \commondummyword\AA {AA}% \commondummyword\AE {AE}% \commondummyword\DH {DZZ}% \commondummyword\L {L}% \commondummyword\O {O}% \commondummyword\OE {OE}% \commondummyword\TH {TH}% \commondummyword\aa {aa}% \commondummyword\ae {ae}% \commondummyword\dh {dzz}% \commondummyword\exclamdown {!}% \commondummyword\l {l}% \commondummyword\o {o}% \commondummyword\oe {oe}% \commondummyword\ordf {a}% \commondummyword\ordm {o}% \commondummyword\questiondown {?}% \commondummyword\ss {ss}% \commondummyword\th {th}% % \commondummyword\LaTeX {LaTeX}% \commondummyword\TeX {TeX}% % % Assorted special characters. \commondummyword\ampchar {\normalamp}% \commondummyword\atchar {\@}% \commondummyword\arrow {->}% \commondummyword\backslashchar {\realbackslash}% \commondummyword\bullet {bullet}% \commondummyword\comma {,}% \commondummyword\copyright {copyright}% \commondummyword\dots {...}% \commondummyword\enddots {...}% \commondummyword\entrybreak {}% \commondummyword\equiv {===}% \commondummyword\error {error}% \commondummyword\euro {euro}% \commondummyword\expansion {==>}% \commondummyword\geq {>=}% \commondummyword\guillemetleft {<<}% \commondummyword\guillemetright {>>}% \commondummyword\guilsinglleft {<}% \commondummyword\guilsinglright {>}% \commondummyword\lbracechar {\{}% \commondummyword\leq {<=}% \commondummyword\mathopsup {sup}% \commondummyword\minus {-}% \commondummyword\pounds {pounds}% \commondummyword\point {.}% \commondummyword\print {-|}% \commondummyword\quotedblbase {"}% \commondummyword\quotedblleft {"}% \commondummyword\quotedblright {"}% \commondummyword\quoteleft {`}% \commondummyword\quoteright {'}% \commondummyword\quotesinglbase {,}% \commondummyword\rbracechar {\}}% \commondummyword\registeredsymbol {R}% \commondummyword\result {=>}% \commondummyword\sub {}% \commondummyword\sup {}% \commondummyword\textdegree {o}% } \let\indexlbrace\relax \let\indexrbrace\relax \let\indexatchar\relax \let\indexbackslash\relax {\catcode`\@=0 \catcode`\\=13 @gdef@backslashdisappear{@def\{}} } { \catcode`\<=13 \catcode`\-=13 \catcode`\`=13 \gdef\indexnonalnumdisappear{% \ifflagclear{txiindexlquoteignore}{}{% % @set txiindexlquoteignore makes us ignore left quotes in the sort term. % (Introduced for FSFS 2nd ed.) \let`=\empty }% % \ifflagclear{txiindexbackslashignore}{}{% \backslashdisappear }% \ifflagclear{txiindexhyphenignore}{}{% \def-{}% }% \ifflagclear{txiindexlessthanignore}{}{% \def<{}% }% \ifflagclear{txiindexatsignignore}{}{% \def\@{}% }% } \gdef\indexnonalnumreappear{% \let-\normaldash \let<\normalless } } % \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{% \indexnofontstrue % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % \uccode`\1=`\{ \uppercase{\def\{{1}}% \uccode`\1=`\} \uppercase{\def\}{1}}% \let\lbracechar\{% \let\rbracechar\}% % % % 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. % % 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. % \def\commondummyword##1{\let##1\asis}% \macrolist \let\value\indexnofontsvalue } % #1 is the index name, #2 is the entry text. \def\doind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\doindwrite }% \fi } % Same as \doind, but for code indices \def\docind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\docindwrite }% \fi } % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 \expandafter\newwrite \csname#1indfile\endcsname \edef\suffix{#1}% % A .fls suffix would conflict with the file extension for the output % of -recorder, so use .f1s instead. \ifx\suffix\indexisfl\def\suffix{f1}\fi % Open the file \immediate\openout\csname#1indfile\endcsname \jobname.\suffix % Using \immediate above here prevents an object entering into the current % box, which could confound checks such as those in \safewhatsit for % preceding skips. \typeout{Writing index file \jobname.\suffix}% \fi} \def\indexisfl{fl} % Definition for writing index entry sort key. { \catcode`\-=13 \gdef\indexwritesortas{% \begingroup \indexnonalnumreappear \indexwritesortasxxx} \gdef\indexwritesortasxxx#1{% \xdef\indexsortkey{#1}\endgroup} } \def\indexwriteseealso#1{ \gdef\pagenumbertext{\string\seealso{#1}}% } \def\indexwriteseeentry#1{ \gdef\pagenumbertext{\string\seeentry{#1}}% } % The default definitions \def\sortas#1{}% \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only \def\putwordSeeAlso{See also} \def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}": % * Set \bracedtext to "{aaa}{bbb}" % * Set \fullindexsortkey to "aaa @subentry ZZZ" % * If @seealso occurs, set \pagenumbertext % \def\splitindexentry#1{% \gdef\fullindexsortkey{}% \xdef\bracedtext{}% \def\sep{}% \def\seealso##1{}% \def\seeentry##1{}% \expandafter\doindexsegment#1\subentry\finish\subentry } % append the results from the next segment \def\doindexsegment#1\subentry{% \def\segment{#1}% \ifx\segment\isfinish \else % % Fully expand the segment, throwing away any @sortas directives, and % trim spaces. \edef\trimmed{\segment}% \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \ifincodeindex \edef\trimmed{\noexpand\code{\trimmed}}% \fi % \xdef\bracedtext{\bracedtext{\trimmed}}% % % Get the string to sort by. Process the segment with all % font commands turned off. \bgroup \let\sortas\indexwritesortas \let\seealso\indexwriteseealso \let\seeentry\indexwriteseeentry \indexnofonts % The braces around the commands are recognized by texindex. \def\lbracechar{{\string\indexlbrace}}% \def\rbracechar{{\string\indexrbrace}}% \let\{=\lbracechar \let\}=\rbracechar \def\@{{\string\indexatchar}}% \def\atchar##1{\@}% \def\backslashchar{{\string\indexbackslash}}% \uccode`\~=`\\ \uppercase{\let~\backslashchar}% % \let\indexsortkey\empty \global\let\pagenumbertext\empty % Execute the segment and throw away the typeset output. This executes % any @sortas or @seealso commands in this segment. \setbox\dummybox = \hbox{\segment}% \ifx\indexsortkey\empty{% \indexnonalnumdisappear \xdef\trimmed{\segment}% \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \xdef\indexsortkey{\trimmed}% \ifx\indexsortkey\empty \message{Empty index sort key near line \the\inputlineno}% \xdef\indexsortkey{ }% \fi }\fi % % Append to \fullindexsortkey. \edef\tmp{\gdef\noexpand\fullindexsortkey{% \fullindexsortkey\sep\indexsortkey}}% \tmp \egroup \def\sep{\subentry}% % \expandafter\doindexsegment \fi } \def\isfinish{\finish}% \newbox\dummybox % used above \let\subentry\relax % Use \ instead of @ in index files. To support old texi2dvi and texindex. % This works without changing the escape character used in the toc or aux % files because the index entries are fully expanded here, and \string uses % the current value of \escapechar. \def\escapeisbackslash{\escapechar=`\\} % Uncomment to use \ in index files by default. Old texi2dvi (before 2019) % didn't support @ as the escape character (as it checked for "\entry" in % the files, and not "@entry"). % In the future we can remove this flag and simplify the code for % index files and backslashes, once the support is no longer likely to be % useful. % % \set txiindexescapeisbackslash % Write the entry in \indextext to the index file. % \newif\ifincodeindex \def\doindwrite{\incodeindexfalse\doindwritex} \def\docindwrite{\incodeindextrue\doindwritex} \def\doindwritex{% \maybemarginindex % \atdummies % \ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}% % % For texindex which always views { and } as separators. \def\{{\lbracechar{}}% \def\}{\rbracechar{}}% \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}% % % Split the entry into primary entry and any subentries, and get the index % sort key. \splitindexentry\indextext % % 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{\fullindexsortkey}% {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}% \bracedtext}% }% \temp } % Put the index entry in the margin if desired (undocumented). \def\maybemarginindex{% \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}% \fi } \let\SETmarginindex=\relax % 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} % \entry {topic}{} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % \secondary {subtopic}{} % for a subtopic with sub-subtopics % \tertiary {subtopic}{subsubtopic}{pagelist} % for each sub-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} % 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 comment in \requireopenindexfile. \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi % % See if the index file exists and is nonempty. \openin 1 \jobname.\indexname s \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 \typeout{No file \jobname.\indexname s.}% \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 \thisline \ifeof 1 \putwordIndexIsEmpty \else \expandafter\printindexzz\thisline\relax\relax\finish% \fi \fi \closein 1 \endgroup} % If the index file starts with a backslash, forgo reading the index % file altogether. If somebody upgrades texinfo.tex they may still have % old index files using \ as the escape character. Reading this would % at best lead to typesetting garbage, at worst a TeX syntax error. \def\printindexzz#1#2\finish{% \ifflagclear{txiindexescapeisbackslash}{% \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 \ifflagclear{txiskipindexfileswithbackslash}{% \errmessage{% ERROR: A sorted index file in an obsolete format was skipped. To fix this problem, please upgrade your version of 'texi2dvi' or 'texi2pdf' to that at . If you are using an old version of 'texindex' (part of the Texinfo distribution), you may also need to upgrade to a newer version (at least 6.0). You may be able to typeset the index if you run 'texindex \jobname.\indexname' yourself. You could also try setting the 'txiindexescapeisbackslash' flag by running a command like 'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'. If you do this, Texinfo will try to use index files in the old format. If you continue to have problems, deleting the index files and starting again might help (with 'rm \jobname.?? \jobname.??s')% }% }{% (Skipped sorted index file in obsolete format) }% \else \begindoublecolumns \input \jobname.\indexname s \enddoublecolumns \fi }{% \begindoublecolumns \catcode`\\=0\relax % % Make @ an escape character to give macros a chance to work. This % should work because we (hopefully) don't otherwise use @ in index files. %\catcode`\@=12\relax \catcode`\@=0\relax \input \jobname.\indexname s \enddoublecolumns }% } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 \catcode`\$=3 \gdef\initialglyphs{% % special control sequences used in the index sort key \let\indexlbrace\{% \let\indexrbrace\}% \let\indexatchar\@% \def\indexbackslash{\math{\backslash}}% % % Some changes for non-alphabetic characters. Using the glyphs from the % math fonts looks more consistent than the typewriter font used elsewhere % for these characters. \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}} % % In case @\ is used for backslash \uppercase{\let\\=~} % Can't get bold backslash so don't use bold forward slash \catcode`\/=13 \def/{{\secrmnotbold \normalslash}}% \def-{{\normaldash\normaldash}}% en dash `--' \def^{{\chapbf \normalcaret}}% \def~{{\chapbf \normaltilde}}% \def\_{% \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% \def|{$\vert$}% \def<{$\less$}% \def>{$\gtr$}% \def+{$\normalplus$}% }} \def\initial{% \bgroup \initialglyphs \initialx } \def\initialx#1{% % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. % The glue before the bonus allows a little bit of space at the % bottom of a column to reduce an increase in inter-line spacing. \nobreak \vskip 0pt plus 5\baselineskip \penalty -300 \vskip 0pt plus -5\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 1\baselineskip \leftline{\secfonts \kern-0.05em \secbf #1}% % \secfonts is inside the argument of \leftline so that the change of % \baselineskip will not affect any glue inserted before the vbox that % \leftline creates. % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip \egroup % \initialglyphs } \newdimen\entryrightmargin \entryrightmargin=0pt % amount to indent subsequent lines in an entry when it spans more than % one line. \newdimen\entrycontskip \entrycontskip=1em % for PDF output, whether to make the text of the entry a link to the page % number. set for @contents and @shortcontents where there is only one % page number. \newif\iflinkentrytext % \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. % \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % No extra space above this paragraph. \parskip = 0in % % 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}% An undocumented command % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% % Save the text of the entry in \boxA \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. % Not absorbing as a macro argument reduces the chance of problems % with catcodes occurring. } {\catcode`\@=11 % #1 is the page number \gdef\finishentry#1{% \egroup % end \boxA \dimen@ = \wd\boxA % Length of text of entry % add any leaders and page number to \boxA. \global\setbox\boxA=\hbox\bgroup \ifpdforxetex \iflinkentrytext \pdflinkpage{#1}{\unhbox\boxA}% \else \unhbox\boxA \fi \else \unhbox\boxA \fi % % Get the width of the page numbers, and only use % leaders if they are present. \global\setbox\boxB = \hbox{#1}% \ifdim\wd\boxB = 0pt \null\nobreak\hfill\ % \else % \null\nobreak\indexdotfill % Have leaders before the page number. % \ifpdforxetex \pdfgettoks#1.% \hskip\skip\thinshrinkable\the\toksA \else \hskip\skip\thinshrinkable #1% \fi \fi \egroup % end \boxA % % now output \ifdim\wd\boxB = 0pt \noindent\unhbox\boxA\par \nobreak \else\bgroup % We want the text of the entries to be aligned to the left, and the % page numbers to be aligned to the right. % \parindent = 0pt \advance\leftskip by 0pt plus 1fil \advance\leftskip by 0pt plus -1fill \rightskip = 0pt plus -1fil \advance\rightskip by 0pt plus 1fill % Cause last line, which could consist of page numbers on their own % if the list of page numbers is long, to be aligned to the right. \parfillskip=0pt plus -1fill % \advance\rightskip by \entryrightmargin % \dimen@ii = \hsize \advance\dimen@ii by -1\leftskip \advance\dimen@ii by -1\entryrightmargin \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line \ifdim\dimen@ > 0.8\dimen@ii % due to long index text \advance\leftskip by 0pt plus 1fill % ragged right % % Indent all lines but the first one. \advance\leftskip by \entrycontskip \advance\parindent by -\entrycontskip \fi\fi \indent % start paragraph \unhbox\boxA % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % Word spacing - no stretch \spaceskip=\fontdimen2\font minus \fontdimen4\font % \linepenalty=1000 % Discourage line breaks. \hyphenpenalty=5000 % Discourage hyphenation. % \par % format the paragraph \egroup % The \vbox \fi \endgroup }} \newskip\thinshrinkable \skip\thinshrinkable=.15em minus .15em % Like plain.tex's \dotfill, except uses up at least 0.5 em. % The filll stretch here overpowers both the fil and fill stretch to push % the page number to the right. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll} \def\primary #1{\line{#1\hfil}} \def\secondary{\indententry{0.5cm}} \def\tertiary{\indententry{1cm}} \def\indententry#1#2#3{% \bgroup \leftskip=#1 \entry{#2}{#3}% \egroup } % 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 % private names \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % If not much space left on page, start a new page. \ifdim\pagetotal>0.8\vsize\vfill\eject\fi % % Grab any single-column material above us. \output = {% \savetopmark % \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, \doublecolumnhsize, 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 % % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \advance\vsize by -\ht\partialpage \vsize = 2\vsize % % For the benefit of balancing columns \advance\baselineskip by 0pt plus 0.5pt } % The double-column output routine for all double-column pages except % the last, which is done by \balancecolumns. % \def\doublecolumnout{% % \savetopmark \splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@ = \vsize \divide\dimen@ by 2 % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@ \global\advance\vsize by 2\ht\partialpage \onepageout\pagesofar % empty except for the first time we are called \unvbox\PAGE \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\txipagewidth{\box0\hfil\box2}% } % Finished 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 \txipageheight (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. \savetopmark \balancecolumns }% \eject % call the \output just set \ifdim\pagetotal=0pt % Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. \global\output=\expandafter{\the\defaultoutput} % \endgroup % started in \begindoublecolumns % Leave the double-column material on the current page, no automatic % page break. \box\balancedcolumns % % \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. \global\vsize = \txipageheight % \pagegoal = \txipageheight % \else % We had some left-over material. This might happen when \doublecolumnout % is called in \balancecolumns. Try again. \expandafter\enddoublecolumns \fi } \newbox\balancedcolumns \setbox\balancedcolumns=\vbox{shouldnt see this}% % % Only called for the last of the double column material. \doublecolumnout % does the others. \def\balancecolumns{% \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \ifdim\dimen@<7\baselineskip % Don't split a short final column in two. \setbox2=\vbox{}% \global\setbox\balancedcolumns=\vbox{\pagesofar}% \else % double the leading vertical space \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to \dimen@ii = \dimen@ \splittopskip = \topskip % Loop until left column is at least as high as the right column. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht1<\ht3 \global\advance\dimen@ by 1pt \repeat }% % Now the left column is in box 1, and the right column in box 3. % % Check whether the left column has come out higher than the page itself. % (Note that we have doubled \vsize for the double columns, so % the actual height of the page is 0.5\vsize). \ifdim2\ht1>\vsize % It appears that we have been called upon to balance too much material. % Output some of it with \doublecolumnout, leaving the rest on the page. \setbox\PAGE=\box0 \doublecolumnout \else % Compare the heights of the two columns. \ifdim4\ht1>5\ht3 % Column heights are too different, so don't make their bottoms % flush with each other. \setbox2=\vbox to \ht1 {\unvbox3\vfill}% \setbox0=\vbox to \ht1 {\unvbox1\vfill}% \else % Make column bottoms flush with each other. \setbox2=\vbox to\ht1{\unvbox3\unskip}% \setbox0=\vbox to\ht1{\unvbox1\unskip}% \fi \global\setbox\balancedcolumns=\vbox{\pagesofar}% \fi \fi % } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rm #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 % This outputs a mark at the end of the page that clears \thischapter % and \thissection, as is done in \startcontents. \let\pchapsepmacro\relax \chapmacro{}{Yomitfromtoc}{}% \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} % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} % 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\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{% \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\advance\unnumberedno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}% } % 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\advance\unnumberedno by 1 \sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}% } % 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\unnumberedno by 1 \sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}% } % 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}} % Start a new page \def\chappager{\par\vfill\supereject} % \chapoddpage - start on an odd page for a new chapter % 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 } \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\def\HEADINGSon{\HEADINGSsinglechapoff}} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \setchapternewpage on % \chapmacro - Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % Not used for @heading series. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yappendixkeyword{Yappendix} \def\Yomitfromtockeyword{Yomitfromtoc} % % % Definitions for @thischapter. These can be overridden in translation % files. \def\thischapterAppendix{% \putwordAppendix{} \thischapternum: \thischaptername} \def\thischapterChapter{% \putwordChapter{} \thischapternum: \thischaptername} % % \def\chapmacro#1#2#3{% \expandafter\ifx\thisenv\titlepage\else \checkenv{}% chapters, etc., should not start inside an environment. \fi % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% \let\noexpand\thischapter\noexpand\thischapterAppendix }% \else \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% \let\noexpand\thischapter\noexpand\thischapterChapter }% \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=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \domark % {% \chapfonts \rm \let\footnote=\errfootnoteheading % give better error message % % Have to define \currentsection 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\currentsection{#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 } % 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} % Definition for @thissection. This can be overridden in translation % files. \def\thissectionDef{% \putwordSection{} \thissectionnum: \thissectionname} % % Print any size, any type, section title. % % #1 is the text of the title, % #2 is the section level (sec/subsec/subsubsec), % #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), % #4 is the section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \def\sectionlevel{#2}% \def\temptype{#3}% % % It is ok for the @heading series commands to appear inside an % environment (it's been historically allowed, though the logic is % dubious), but not the others. \ifx\temptype\Yomitfromtockeyword\else \checkenv{}% non-@*heading should not be in an environment. \fi \let\footnote=\errfootnoteheading % % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\currentsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\currentsectiondefs{\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\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \let\noexpand\thissection\noexpand\thissectionDef }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \let\noexpand\thissection\noexpand\thissectionDef }% \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. \global\let\prevsectiondefs=\currentsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\currentsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \currentsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\currentsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\currentsection{#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'. \ifpdforxetex \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 } % process toc file to find the maximum width of the section numbers for % each chapter \def\findsecnowidths{% \begingroup \setupdatafile \activecatcodes \secentryfonts % Redefinitions \def\numchapentry##1##2##3##4{% \def\curchapname{secnowidth-##2}% \curchapmax=0pt }% \let\appentry\numchapentry % \def\numsecentry##1##2##3##4{% \def\cursecname{secnowidth-##2}% \cursecmax=0pt % \setbox0=\hbox{##2}% \ifdim\wd0>\curchapmax \curchapmax=\wd0 \expandafter\xdef\csname\curchapname\endcsname{\the\wd0}% \fi }% \let\appsecentry\numsecentry % \def\numsubsecentry##1##2##3##4{% \def\curssecname{secnowidth-##2}% \curssecmax=0pt % \setbox0=\hbox{##2}% \ifdim\wd0>\cursecmax \cursecmax=\wd0 \expandafter\xdef\csname\cursecname\endcsname{\the\wd0}% \fi }% \let\appsubsecentry\numsubsecentry % \def\numsubsubsecentry##1##2##3##4{% \setbox0=\hbox{##2}% \ifdim\wd0>\curssecmax \curssecmax=\wd0 \expandafter\xdef\csname\curssecname\endcsname{\the\wd0}% \fi }% \let\appsubsubsecentry\numsubsubsecentry % % Discard any output by outputting to dummy vbox, in case the toc file % contains macros that we have not redefined above. \setbox\dummybox\vbox\bgroup \input \tocreadfilename\relax \egroup \endgroup } \newdimen\curchapmax \newdimen\cursecmax \newdimen\curssecmax % set #1 to the maximum section width for #2 \def\retrievesecnowidth#1#2{% \expandafter\let\expandafter\savedsecnowidth \csname secnowidth-#2\endcsname \ifx\savedsecnowidth\relax #1=0pt \else #1=\savedsecnowidth \fi } \newdimen\secnowidthchap \secnowidthchap=0pt \newdimen\secnowidthsec \secnowidthsec=0pt \newdimen\secnowidthssec \secnowidthssec=0pt \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. \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. \entryrightmargin=\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi \def\thistitle{}% no title in double-sided headings % Record where the Roman numerals started. \ifnum\romancount=0 \global\romancount=\pagecount \fi \linkentrytexttrue } % \raggedbottom in plain.tex hardcodes \topskip so override it \catcode`\@=11 \def\raggedbottom{\advance\topskip by 0pt plus60pt \r@ggedbottomtrue} \catcode`\@=\other % 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 \findsecnowidths \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \contentsendroman } % 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. \extrasecnoskip=0.4pt \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 \contentsendroman } \let\shortcontents = \summarycontents % Get ready to use Arabic numerals again \def\contentsendroman{% \lastnegativepageno = \pageno \global\pageno=1 \contentsendcount = \pagecount } % 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. % % 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, % and are read in from the *.toc file. % % The arguments are like: % \def\numchapentry#1#2#3#4 % #1 - the chapter or section name. % #2 - section number % #3 - level of section (e.g "chap", "sec") % #4 - page 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{% % Add stretch and a bonus for breaking the page before the part heading. % This reduces the chance of the page being broken immediately after the % part heading, before a following chapter heading. \vskip 0pt plus 5\baselineskip \penalty-300 \vskip 0pt plus -5\baselineskip \dochapentry{#1}{\numeralbox}{}% } % % 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{% \retrievesecnowidth\secnowidthchap{#2}% \dochapentry{#1}{#2}{#4}% } % Chapters, in the short toc. \def\shortchapentry#1#2#3#4{% \tocentry{#1}{\shortchaplabel{#2}}{#4}% } % 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{% \retrievesecnowidth\secnowidthchap{#2}% \dochapentry{\appendixbox{#2}\hskip.7em#1}{}{#4}% } % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#4}} \def\numsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthsec{#2}% \dosecentry{#1}{#2}{#4}% } \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthsec{#2}% \dosecentry{#1}{}{#4}% } % Subsections. \def\numsubsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthssec{#2}% \dosubsecentry{#1}{#2}{#4}% } \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthssec{#2}% \dosubsecentry{#1}{}{#4}% } % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#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, #2 is % a section number if present, and #3 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#3{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup % Move the page numbers slightly to the right \advance\entryrightmargin by -0.05em \chapentryfonts \extrasecnoskip=0.4em % separate chapter number more \tocentry{#1}{#2}{#3}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2#3{\begingroup \secnowidth=\secnowidthchap \secentryfonts \leftskip=\tocindent \tocentry{#1}{#2}{#3}% \endgroup} \def\dosubsecentry#1#2#3{\begingroup \secnowidth=\secnowidthsec \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{#2}{#3}% \endgroup} \def\dosubsubsecentry#1#2#3{\begingroup \secnowidth=\secnowidthssec \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{#2}{#3}% \endgroup} % Used for the maximum width of a section number so we can align % section titles. \newdimen\secnowidth \secnowidth=0pt \newdimen\extrasecnoskip \extrasecnoskip=0pt % \tocentry{TITLE}{SEC NO}{PAGE} % \def\tocentry#1#2#3{% \def\secno{#2}% \ifx\empty\secno \entry{#1}{#3}% \else \ifdim 0pt=\secnowidth \setbox0=\hbox{#2\hskip\labelspace\hskip\extrasecnoskip}% \else \advance\secnowidth by \labelspace \advance\secnowidth by \extrasecnoskip \setbox0=\hbox to \secnowidth{% #2\hskip\labelspace\hskip\extrasecnoskip\hfill}% \fi \entrycontskip=\wd0 \entry{\box0 #1}{#3}% \fi } \newdimen\labelspace \labelspace=0.6em \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{% \setregularquotes \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 % % ' 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 % % Inverse of the list at the beginning of the file. \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\sp=\ptexsp \let\*=\ptexstar %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % we've made it 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 \ifnum\lastpenalty<10000 % Penalize breaking before the environment, because preceding text % often leads into it. \penalty100 \fi \vskip\envskipamount \fi \fi }} \def\afterenvbreak{{% % =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 }} % \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. % \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 % only require the font if @cartouche is actually used \def\cartouchefontdefs{% \font\circle=lcircle10\relax \circthick=\fontdimen8\circle } \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \envparseargdef\cartouche{% \cartouchefontdefs \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*. % % Set paragraph width for text inside cartouche. There are % left and right margins of 3pt each plus two vrules 0.4pt each. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \advance\cartinner by -6.8pt % % For drawing top and bottom of cartouche. Each corner char % adds 6pt and we take off the width of a rule to line up with the % right boundary perfectly. \cartouter=\hsize \advance\cartouter by 11.6pt % \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % % 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 % \setbox\groupbox=\vtop\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \def\arg{#1}% \ifx\arg\empty\else \centerV{\hfil \bf #1 \hfil}% \fi \kern3pt \vskip -\parskip } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \addgroupbox \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % 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, @verbatim % \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\setcodequotes \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \parsearg\gobble } % @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 plus2.4em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\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 \def\par{\leavevmode\endgraf}% \parindent = 0pt \setcodequotes \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. \newbox\verbbox \def\starttabbox{\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 \leavevmode\box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% \tabexpand \setcodequotes % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces } % 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{% \starttabbox#2\egroup\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. % The \egroup ends the \verbbox started at the end of the last line in % the block. \endgroup % \envdef\verbatim{% \setnormaldispenv\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}% \edef\tmp{\noexpand\input #1 } \expandafter }\expandafter\starttabbox\tmp\egroup \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 desirable. % \def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying} {\catcode`\ =\other \gdef\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 } % Called as \printdefunline \deffooheader{text} % \def\printdefunline#1#2{% \begingroup \plainfrenchspacing % call \deffooheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \deffoox % 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} % @defblock, @defline do not automatically create index entries \envdef\defblock{% \startdefun } \let\Edefblock\Edefun \def\defline{% \doingtypefnfalse \parseargusing\activeparens{\printdefunline\deflineheader}% } \def\deflineheader#1 #2 #3\endheader{% \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% } \def\deftypeline{% \doingtypefntrue \parseargusing\activeparens{\printdefunline\deftypelineheader}% } \def\deftypelineheader#1 #2 #3 #4\endheader{% \printdefname{#1}{#2}{#3}\magicamp\defunargs{#4\unskip}% } % \makedefun{deffoo} (\deffooheader parameters) { (\deffooheader expansion) } % % Define \deffoo, \deffoox \Edeffoo and \deffooheader. \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{% % First, check whether we are in the right environment: \checkenv#1% % % As in \startdefun, 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 % \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#3% definition of \deffooheader follows } \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}#1 #2 #3\endheader{% \doind{fn}{\code{#2}}% \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% } % @defop category class name args \makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}} \def\defopheaderx#1#2 #3 #4\endheader{% \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}% \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}#1 #2 #3 #4\endheader{% \doind{fn}{\code{#3}}% \doingtypefntrue \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% } % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}} \def\deftypeopheaderx#1#2 #3 #4 #5\endheader{% \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}% \doingtypefntrue \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}#1 #2 #3 #4\endheader{% \doind{vr}{\code{#3}}% \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% } % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}} \def\deftypecvheaderx#1#2 #3 #4 #5\endheader{% \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}% \printdefname{#1\ \code{#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 {\defcvheaderx{#1\ \putwordof}} \def\defcvheaderx#1#2 {\deftypecvheaderx{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \printdefname{#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}{\defopheaderx\putwordMethodon} \makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon} \makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof} % \printdefname, 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\printdefname#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: \ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}% \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 {% \def\^^M{}% for line continuation % % 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 }% \ifflagclear{txidefnamenospace}{% {\rm\enskip}% hskip 0.5 em of \rmfont }{}% % \boldbrax % arguments will be output next, if any. } % Print arguments. Use slanted for @def*, typewriter for @deftype*. \def\defunargs#1{% \bgroup \def\^^M{}% for line continuation \df \ifdoingtypefn \tt \else \sl \fi \ifflagclear{txicodevaristt}{}% {\def\var##1{{\setregularquotes \ttsl ##1}}}% #1% \egroup } % 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 \gdef\defcharsdefault{% \let(=\lparen \let)=\rparen \let[=\lbrack \let]=\rbrack \let& = \&% } \globaldefs=1 \defcharsdefault \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \let\ampchar\& \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\rm\ }} \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 \let\E=\expandafter % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M % expand the expansion of \eatleadingcr twice to maybe remove a leading % newline (and \else and \fi tokens), then call \eatspaces on the result. \def\xeatspaces##1{% \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1% }}% \def\xempty##1{}% % % Process the macro body under the current catcode regime. \scantokens{#1@comment}% % % The \comment is to remove the \newlinechar added by \scantokens, and % can be noticed by \parsearg. Note \c isn't used because this means cedilla % in math mode. } % Used for copying and captions \def\scanexp#1{% \expandafter\scanmacro\expandafter{#1}% } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \commondummyword\macro1\commondummyword\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\commondummyword#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} } {\catcode`\^^M=\other% \gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}% % Warning: this won't work for a delimited argument % or for an empty argument % 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 \catcode`\^^M=\other \catcode`\\=\active \passthroughcharstrue } \def\macrobodyctxt{% used for @macro definitions and @copying \scanctxt \catcode`\ =\other \catcode`\{=\other \catcode`\}=\other } % Used when scanning braced macro arguments. Note, however, that catcode % changes here are ineffectual if the macro invocation was nested inside % an argument to another Texinfo command. \def\macroargctxt{% \scanctxt \catcode`\ =\active } \def\macrolineargctxt{% used for whole-line arguments without braces \scanctxt \catcode`\{=\other \catcode`\}=\other } % \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 \usembodybackslash \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\commondummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \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\commondummyword \noexpand#1% \fi } % \getargs -- Parse the arguments to a @macro line. Set \macname to % the name of the macro, and \argl to the braced argument list. \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}} % This made use of the 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. % Parse the optional {params} list to @macro or @rmacro. % Set \paramno to the number of arguments, % and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a % three-param macro.) Define \macarg.BLAH for each BLAH in the params % list to some hook where the argument is 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). % % If there are 10 or more arguments, a different technique is used: see % \parsemmanyargdef. % \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax \let\xempty\relax \parsemargdefxxx#1,;,% \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\noexpand\xempty{}}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % the \xempty{} is to give \eatleadingcr an argument in the case of an % empty macro argument. % \parsemacbody, \parsermacbody % % Read recursive and nonrecursive macro bodies. (They're different since % rec and nonrec macros end differently.) % % We are in \macrobodyctxt, and the \xdef causes backslashes in the macro % body to be transformed. % Set \macrobody to the body of the macro, and call \macrodef. % {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% % Make @ a letter, so that we can make private-to-Texinfo macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax %%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% % 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 under which the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, no macro can have more than 256 arguments (else error). % % 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. \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} \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}% } % Define the named-macro outside of this group and then close this group. % \def\macargexpandinbody@{% \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 } % Trailing 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}% } %%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% % This defines a Texinfo @macro or @rmacro, called by \parsemacbody. % \macrobody has the body of the macro in it, with placeholders for % its parameters, looking like "\xeatspaces{\hash 1}". % \paramno is the number of parameters % \paramlist is a TeX parameter text, e.g. "#1,#2,#3," % There are four cases: macros of zero, one, up to nine, and many arguments. % \xdef is used so that macro definitions will survive the file % they're defined in: @include reads the file inside a group. % \def\macrodef{% \let\hash=##% convert placeholders to macro parameter chars \ifnum\paramno=1 \long\def\xeatspaces##1{##1}% % We don't use \xeatspaces for single-argument macros, because we % want to keep ends of lines. This definition removes \xeatspaces % when \macrobody is expanded below. \else \def\xeatspaces{\string\xeatspaces}% % This expands \xeatspaces as a sequence of character tokens, which % stops \scantokens inserting an extra space after the control sequence. \fi \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \begingroup \noexpand\spaceisspace \noexpand\endlineisspace \noexpand\expandafter % skip any whitespace after the macro name. \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname{% \endgroup \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \begingroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \endgroup \noexpand\scanmacro{\macrobody}% }% \else % at most 9 \ifnum\paramno<10\relax % @MACNAME sets the context for reading the macro argument % @MACNAME@@ gets the argument, processes backslashes and appends a % comma. % @MACNAME@@@ removes braces surrounding the argument list. % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% \begingroup \noexpand\expandafter % This \expandafter skip any spaces after the \noexpand\macroargctxt % macro before we change the catcode of space. \noexpand\expandafter \expandafter\noexpand\csname\the\macname @@\endcsname}% \expandafter\xdef\csname\the\macname @@\endcsname##1{% \noexpand\passargtomacro \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% \endgroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi} \catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % {\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape @catcode`@_=11 % private names @catcode`@!=11 % used as argument separator % \passargtomacro#1#2 - % Call #1 with a list of tokens #2, with any doubled backslashes in #2 % compressed to one. % % This implementation works by expansion, and not execution (so we cannot use % \def or similar). This reduces the risk of this failing in contexts where % complete expansion is done with no execution (for example, in writing out to % an auxiliary file for an index entry). % % State is kept in the input stream: the argument passed to % @look_ahead, @gobble_and_check_finish and @add_segment is % % THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) % % where: % THE_MACRO - name of the macro we want to call % ARG_RESULT - argument list we build to pass to that macro % PENDING_BS - either a backslash or nothing % NEXT_TOKEN - used to look ahead in the input stream to see what's coming next @gdef@passargtomacro#1#2{% @add_segment #1!{}@relax#2\@_finish\% } @gdef@_finish{@_finishx} @global@let@_finishx@relax % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 used to look ahead % % If the next token is not a backslash, process the rest of the argument; % otherwise, remove the next token. @gdef@look_ahead#1!#2#3#4{% @ifx#4\% @expandafter@gobble_and_check_finish @else @expandafter@add_segment @fi#1!{#2}#4#4% } % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 should be a backslash, which is gobbled. % #5 looks ahead % % Double backslash found. Add a single backslash, and look ahead. @gdef@gobble_and_check_finish#1!#2#3#4#5{% @add_segment#1\!{}#5#5% } @gdef@is_fi{@fi} % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 is input stream until next backslash % % Input stream is either at the start of the argument, or just after a % backslash sequence, either a lone backslash, or a doubled backslash. % NEXT_TOKEN contains the first token in the input stream: if it is \finish, % finish; otherwise, append to ARG_RESULT the segment of the argument up until % the next backslash. PENDING_BACKSLASH contains a backslash to represent % a backslash just before the start of the input stream that has not been % added to ARG_RESULT. @gdef@add_segment#1!#2#3#4\{% @ifx#3@_finish @call_the_macro#1!% @else % append the pending backslash to the result, followed by the next segment @expandafter@is_fi@look_ahead#1#2#4!{\}@fi % this @fi is discarded by @look_ahead. % we can't get rid of it with \expandafter because we don't know how % long #4 is. } % #1 - THE_MACRO % #2 - ARG_RESULT % #3 discards the res of the conditional in @add_segment, and @is_fi ends the % conditional. @gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \braceorline MAC is used for a one-argument macro MAC. It checks % whether the next non-whitespace character is a {. It sets the context % for reading the argument (slightly different in the two cases). Then, % to read the argument, in the whole-line case, it then calls the regular % \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup \macroargctxt \expandafter\passargtomacro \else \macrolineargctxt\expandafter\parsearg \fi \macnamexxx} % @linemacro \parseargdef\linemacro{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty \paramno=0 \let\hash\relax \def\paramlist{\hash 1\endlinemacro}% \else \expandafter\linegetparamlist\argl;% \fi \begingroup \macrobodyctxt \usembodybackslash \parselinemacrobody } % Build up \paramlist which will be used as the parameter text for the macro. % At the end it will be like "#1 #2 #3\endlinemacro". \def\linegetparamlist#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \linegetparamlistxxx#1,;,% } \def\linegetparamlistxxx#1,{% \if#1;\let\next=\linegetparamlistxxxx \else \let\next=\linegetparamlistxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\hash\the\paramno}% \edef\paramlist{\paramlist\hash\the\paramno\space}% \fi\next} \def\linegetparamlistxxxx{% \expandafter\fixparamlist\paramlist\fixparamlist } % Replace final space token \def\fixparamlist#1 \fixparamlist{% \def\paramlist{#1\endlinemacro}% } % Read the body of the macro, replacing backslash-surrounded variables % {\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{% \xdef\macrobody{#1}% \endgroup \linemacrodef }} % Make the definition \def\linemacrodef{% \let\hash=##% \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\parsearg \expandafter\noexpand\csname\the\macname @@\endcsname } \expandafter\xdef\csname\the\macname @@\endcsname##1{% \egroup \expandafter\noexpand \csname\the\macname @@@\endcsname##1\noexpand\endlinemacro } \expandafter\expandafter \expandafter\xdef \expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{% \newlinechar=13 % split \macrobody into lines \noexpand\scantokens{\macrobody}% } } % @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}\omittopnode} % Used so that the @top node doesn't have to be wrapped in an @ifnottex % conditional. % \doignore goes to more effort to skip nested conditionals but we don't need % that here. \def\omittopnode{% \ifx\lastnode\wordTop \expandafter\ignorenode\fi } \def\wordTop{Top} % Until the next @node, @part or @bye command, divert output to a box that % is not output. \def\ignorenode{\setbox\dummybox\vbox\bgroup \def\part{\egroup\part}% \def\node{\egroup\node}% \ignorenodebye } {\let\bye\relax \gdef\ignorenodebye{\let\bye\ignorenodebyedef} \gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}} % The redefinition of \bye here is because it is declared \outer \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 } % @nodedescription, @nodedescriptionblock - do nothing for TeX \parseargdef\nodedescription{} \def\nodedescriptionblock{\doignore{nodedescriptionblock}} % @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 \currentsection, % 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 {% \requireauxfile \atdummies % preserve commands, but don't expand them % match definition in \xrdef, \refx, \xrefX. \def\value##1{##1}% \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\currentsection}% \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{\putwordsee{} \xrefXX} \def\xref{\putwordSee{} \xrefXX} \def\ref{\xrefXX} \def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} \def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % \getprintedrefname{#1}{#3}{#5}% \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \startxreflink{#1}{#4}% {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". \iffloat distinguishes them by % \Xthisreftitle being set to a magic string. \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. % % Only output a following space if the -snt ref is nonempty, as the ref % will be empty for @unnumbered and @anchor. \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 % \ifflagclear{txiomitxrefpg}{% % We always want a comma ,% % output the `page 3'. \turnoffactive \putpageref{#1}% % Add a , if xref followed by a space \if\space\noexpand\tokenafterxref ,% \else\ifx\ \tokenafterxref ,% @TAB \else\ifx\*\tokenafterxref ,% @* \else\ifx\ \tokenafterxref ,% @SPACE \else\ifx\ \tokenafterxref ,% @NL \else\ifx\tie\tokenafterxref ,% @tie \fi\fi\fi\fi\fi\fi }{}% \fi\fi \fi \endlink \endgroup} % \getprintedrefname{NODE}{LABEL}{MANUAL} % - set \printedrefname and \printedmanual % \def\getprintedrefname#1#2#3{% % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #2}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\printedmanual{\ignorespaces #3}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #2) 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 } % \startxreflink{NODE}{FILE} - start link in pdf output. \def\startxreflink#1#2{% \ifpdforxetex % For pdfTeX and LuaTeX {\indexnofonts \makevalueexpandable \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #2, including (wrongly) those in the middle of the filename. \getfilename{#2}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \setpdfdestname{#1}% % \ifx\pdfdestname\empty \def\pdfdestname{Top}% no empty targets \fi % \leavevmode \ifpdf \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfdestname}% \else goto name{\pdfmkpgn{\pdfdestname}}% \fi \else % XeTeX \ifnum\filenamelength>0 % With default settings, % XeTeX (xdvipdfmx) replaces link destination names with integers. % In this case, the replaced destination names of % remote PDFs are no longer known. In order to avoid a replacement, % you can use xdvipdfmx's command line option `-C 0x0010'. % If you use XeTeX 0.99996+ (TeX Live 2016+), % this command line option is no longer necessary % because we can use the `dvipdfmx:config' special. \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}% \else \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (\pdfdestname) >> >>}% \fi \fi }% \setcolor{\linkcolor}% \fi } % can be overridden in translation files \def\putpageref#1{% \space\putwordpage\tie\refx{#1-pg}} % 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]} % @link{NODENAME, LABEL, MANUAL} - create a "plain" link, with no % page number. Not useful if printed on paper. % \def\link#1{\linkX[#1,,,]} \def\linkX[#1,#2,#3,#4]{% \begingroup \unsepspaces \getprintedrefname{#1}{#2}{#3}% \startxreflink{#1}{#3}% \printedrefname \endlink \endgroup } % 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 } % \refx{NAME} - reference a cross-reference string named NAME. \def\refx#1{% \requireauxfile {% \indexnofonts \turnoffactive \def\value##1{##1}% \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 } % This is the macro invoked by entries in the aux file. Define a control % sequence for a cross-reference target (we prepend XR to the control sequence % name to avoid collisions). The value is the page number. If this is a float % type, we have more work to do. % \def\xrdef#1#2{% {% Expand the node or anchor name to remove control sequences. % \turnoffactive stops 8-bit characters being changed to commands % like @'e. \refx does the same to retrieve the value in the definition. \indexnofonts \turnoffactive \def\value##1{##1}% \xdef\safexrefname{#1}% }% % \bgroup \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% \egroup % We put the \gdef inside a group to avoid the definitions building up on % TeX's save stack, which can cause it to run out of space for aux files with % thousands of lines. \gdef doesn't use the save stack, but \csname does % when it defines an unknown control sequence as \relax. % % 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 } % 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 at the beginning of the file. % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % Used when writing to the aux file, or when using data from it. \def\requireauxfile{% \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi \global\let\requireauxfile=\relax % Only do this once. } % 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 \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\active \catcode`\|=\active \catcode`\<=\active \catcode`\>=\active \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % \catcode`\\=\active % % @ 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{% \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 % % Nested footnotes are not supported in TeX, that would take a lot % more work. (\startsavinginserts does not suffice.) \let\footnote=\errfootnotenest % % 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=\txipagewidth \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 \def\errfootnotenest{% \errhelp=\EMsimple \errmessage{Nested footnotes not supported in texinfo.tex, even though they work in makeinfo; sorry} } \def\errfootnoteheading{% \errhelp=\EMsimple \errmessage{Footnotes in chapters, sections, etc., are not supported} } % 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 https://ctan.org/texarchive/macros/texinfo/texinfo/doc/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 } % Approximate height of a line in the standard text font. \newdimen\capheight \setbox0=\vbox{\tenrm H} \capheight=\ht0 % % 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 \makevalueexpandable \ifvmode \imagevmodetrue \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. \vskip\parskip % % Place image in a \vtop for a top page margin that is (close to) correct, % as \topskip glue is relative to the first baseline. \vtop\bgroup \kern -\capheight \vskip-\parskip \fi % \ifx\centersub\centerV % For @center @image, enter vertical mode and add vertical space % Enter an extra \parskip because @center doesn't add space itself. \vbox\bgroup\vskip\parskip\medskip\vskip\parskip \else % Enter horizontal 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. \imageindent \fi % % Output the image. \ifpdf % For pdfTeX and LuaTeX <= 0.80 \dopdfimage{#1}{#2}{#3}% \else \ifx\XeTeXrevision\thisisundefined % For epsf.tex % \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}% \else % For XeTeX \doxeteximage{#1}{#2}{#3}% \fi \fi % \ifimagevmode \egroup \medskip % space after a standalone image \fi \ifx\centersub\centerV % @center @image \medskip \egroup % close \vbox \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 \currentsection 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\currentsection{\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. {% \requireauxfile \atdummies % \ifx\thisshortcaption\empty \def\gtemp{\thiscaption}% \else \def\gtemp{\thisshortcaption}% \fi \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % \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\scanctxt\docaptionz} \def\docaptionz#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 % \currentsection 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{% \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \let_ = \normalunderscore % normal _ character for filename test \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 } % % 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 } % XeTeX and LuaTeX can handle Unicode natively. % Their default I/O uses UTF-8 sequences instead of a byte-wise operation. % Other TeX engines' I/O (pdfTeX, etc.) is byte-wise. % \newif\iftxinativeunicodecapable \newif\iftxiusebytewiseio \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \txinativeunicodecapablefalse \txiusebytewiseiotrue \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi % Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex % for non-UTF-8 (byte-wise) encodings. % \def\setbytewiseio{% \ifx\XeTeXrevision\thisisundefined \else \XeTeXdefaultencoding "bytes" % For subsequent files to be read \XeTeXinputencoding "bytes" % For document root file % Unfortunately, there seems to be no corresponding XeTeX command for % output encoding. This is a problem for auxiliary index and TOC files. % The only solution would be perhaps to write out @U{...} sequences in % place of non-ASCII characters. \fi \ifx\luatexversion\thisisundefined \else \directlua{ local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub local function convert_char (char) return utf8_char(byte(char)) end local function convert_line (line) return gsub(line, ".", convert_char) end callback.register("process_input_buffer", convert_line) local function convert_line_out (line) local line_out = "" for c in string.utfvalues(line) do line_out = line_out .. string.char(c) end return line_out end callback.register("process_output_buffer", convert_line_out) } \fi \txiusebytewiseiotrue } % 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. % \def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} \def\documentencodingzzz#1{% % % 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 \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \iftxinativeunicodecapable % For native Unicode handling (XeTeX and LuaTeX) \nativeunicodechardefs \else % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX). % Since we already invoke \utfeightchardefs at the top level, % making non-ascii chars active is sufficient. \setnonasciicharscatcode\active \fi % \else \message{Ignoring unknown document encoding: #1.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii % \ifx\XeTeXrevision\thisisundefined \else \ifx \declaredencoding \utfeight \else \ifx \declaredencoding \ascii \else \message{Warning: XeTeX with non-UTF-8 encodings cannot handle % non-ASCII characters in auxiliary files.}% \fi \fi \fi } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing, sorry: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} \def\gdefchar#1#2{% \gdef#1{% \ifpassthroughchars \string#1% \else #2% \fi }} \begingroup % Make non-ASCII characters active for defining the character definition % macros. \setnonasciicharscatcode\active % Latin1 (ISO-8859-1) character definitions. \gdef\latonechardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\exclamdown} \gdefchar^^a2{{\tcfont \char162}} % cent \gdefchar^^a3{\pounds{}} \gdefchar^^a4{{\tcfont \char164}} % currency \gdefchar^^a5{{\tcfont \char165}} % yen \gdefchar^^a6{{\tcfont \char166}} % broken bar \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\copyright{}} \gdefchar^^aa{\ordf} \gdefchar^^ab{\guillemetleft{}} \gdefchar^^ac{\ensuremath\lnot} \gdefchar^^ad{\-} \gdefchar^^ae{\registeredsymbol{}} \gdefchar^^af{\={}} % \gdefchar^^b0{\textdegree} \gdefchar^^b1{$\pm$} \gdefchar^^b2{$^2$} \gdefchar^^b3{$^3$} \gdefchar^^b4{\'{}} \gdefchar^^b5{$\mu$} \gdefchar^^b6{\P} \gdefchar^^b7{\ensuremath\cdot} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{$^1$} \gdefchar^^ba{\ordm} \gdefchar^^bb{\guillemetright{}} \gdefchar^^bc{$1\over4$} \gdefchar^^bd{$1\over2$} \gdefchar^^be{$3\over4$} \gdefchar^^bf{\questiondown} % \gdefchar^^c0{\`A} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\~A} \gdefchar^^c4{\"A} \gdefchar^^c5{\ringaccent A} \gdefchar^^c6{\AE} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\`E} \gdefchar^^c9{\'E} \gdefchar^^ca{\^E} \gdefchar^^cb{\"E} \gdefchar^^cc{\`I} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\"I} % \gdefchar^^d0{\DH} \gdefchar^^d1{\~N} \gdefchar^^d2{\`O} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\~O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\O} \gdefchar^^d9{\`U} \gdefchar^^da{\'U} \gdefchar^^db{\^U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\TH} \gdefchar^^df{\ss} % \gdefchar^^e0{\`a} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\~a} \gdefchar^^e4{\"a} \gdefchar^^e5{\ringaccent a} \gdefchar^^e6{\ae} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\`e} \gdefchar^^e9{\'e} \gdefchar^^ea{\^e} \gdefchar^^eb{\"e} \gdefchar^^ec{\`{\dotless i}} \gdefchar^^ed{\'{\dotless i}} \gdefchar^^ee{\^{\dotless i}} \gdefchar^^ef{\"{\dotless i}} % \gdefchar^^f0{\dh} \gdefchar^^f1{\~n} \gdefchar^^f2{\`o} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\~o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\o} \gdefchar^^f9{\`u} \gdefchar^^fa{\'u} \gdefchar^^fb{\^u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\th} \gdefchar^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \gdef\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdefchar^^a4{\euro{}} \gdefchar^^a6{\v S} \gdefchar^^a8{\v s} \gdefchar^^b4{\v Z} \gdefchar^^b8{\v z} \gdefchar^^bc{\OE} \gdefchar^^bd{\oe} \gdefchar^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \gdef\lattwochardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\ogonek{A}} \gdefchar^^a2{\u{}} \gdefchar^^a3{\L} \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}} \gdefchar^^a5{\v L} \gdefchar^^a6{\'S} \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\v S} \gdefchar^^aa{\cedilla S} \gdefchar^^ab{\v T} \gdefchar^^ac{\'Z} \gdefchar^^ad{\-} \gdefchar^^ae{\v Z} \gdefchar^^af{\dotaccent Z} % \gdefchar^^b0{\textdegree} \gdefchar^^b1{\ogonek{a}} \gdefchar^^b2{\ogonek{ }} \gdefchar^^b3{\l} \gdefchar^^b4{\'{}} \gdefchar^^b5{\v l} \gdefchar^^b6{\'s} \gdefchar^^b7{\v{}} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{\v s} \gdefchar^^ba{\cedilla s} \gdefchar^^bb{\v t} \gdefchar^^bc{\'z} \gdefchar^^bd{\H{}} \gdefchar^^be{\v z} \gdefchar^^bf{\dotaccent z} % \gdefchar^^c0{\'R} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\u A} \gdefchar^^c4{\"A} \gdefchar^^c5{\'L} \gdefchar^^c6{\'C} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\v C} \gdefchar^^c9{\'E} \gdefchar^^ca{\ogonek{E}} \gdefchar^^cb{\"E} \gdefchar^^cc{\v E} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\v D} % \gdefchar^^d0{\DH} \gdefchar^^d1{\'N} \gdefchar^^d2{\v N} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\H O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\v R} \gdefchar^^d9{\ringaccent U} \gdefchar^^da{\'U} \gdefchar^^db{\H U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\cedilla T} \gdefchar^^df{\ss} % \gdefchar^^e0{\'r} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\u a} \gdefchar^^e4{\"a} \gdefchar^^e5{\'l} \gdefchar^^e6{\'c} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\v c} \gdefchar^^e9{\'e} \gdefchar^^ea{\ogonek{e}} \gdefchar^^eb{\"e} \gdefchar^^ec{\v e} \gdefchar^^ed{\'{\dotless{i}}} \gdefchar^^ee{\^{\dotless{i}}} \gdefchar^^ef{\v d} % \gdefchar^^f0{\dh} \gdefchar^^f1{\'n} \gdefchar^^f2{\v n} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\H o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\v r} \gdefchar^^f9{\ringaccent u} \gdefchar^^fa{\'u} \gdefchar^^fb{\H u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\cedilla t} \gdefchar^^ff{\dotaccent{}} } \endgroup % active chars % 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 } % Give non-ASCII bytes the active definitions for processing UTF-8 sequences \begingroup \catcode`\~13 \catcode`\$12 \catcode`\"12 % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp % substituting ~ and $ with a character token of that value. \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uccode`\$\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} % For bytes other than the first in a UTF-8 sequence. Not expected to % be expanded except when writing to auxiliary files. \countUTFx = "80 \countUTFy = "C2 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $\fi}}% \UTFviiiLoop \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiFourOctets\expandafter$\fi }}% \UTFviiiLoop \endgroup \def\globallet{\global\let} % save some \expandafter's below % @U{xxxx} to produce U+xxxx, if we support it. \def\U#1{% \expandafter\ifx\csname uni:#1\endcsname \relax \iftxinativeunicodecapable % All Unicode characters can be used if native Unicode handling is % active. However, if the font does not have the glyph, % letters are missing. \begingroup \uccode`\.="#1\relax \uppercase{.} \endgroup \else \errhelp = \EMsimple \errmessage{Unicode character U+#1 not supported, sorry}% \fi \else \csname uni:#1\endcsname \fi } % These macros are used here to construct the name of a control % sequence to be defined. \def\UTFviiiTwoOctetsName#1#2{% \csname u8:#1\string #2\endcsname}% \def\UTFviiiThreeOctetsName#1#2#3{% \csname u8:#1\string #2\string #3\endcsname}% \def\UTFviiiFourOctetsName#1#2#3#4{% \csname u8:#1\string #2\string #3\string #4\endcsname}% % For UTF-8 byte sequences (TeX, e-TeX and pdfTeX), % provide a definition macro to replace a Unicode character; % this gets used by the @U command % \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacterUTFviii#1#2{% \countUTFz = "#1\relax \begingroup \parseXMLCharref % Give \u8:... its definition. The sequence of seven \expandafter's % expands after the \gdef three times, e.g. % % 1. \UTFviiTwoOctetsName B1 B2 % 2. \csname u8:B1 \string B2 \endcsname % 3. \u8: B1 B2 (a single control sequence token) % \expandafter\expandafter \expandafter\expandafter \expandafter\expandafter \expandafter\gdef \UTFviiiTmp{#2}% % \expandafter\ifx\csname uni:#1\endcsname \relax \else \message{Internal error, already defined: #1}% \fi % % define an additional control sequence for this code point. \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp \endgroup} % % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp % to the corresponding UTF-8 sequence. \gdef\parseXMLCharref{% \ifnum\countUTFz < "20\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 0020}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctetsName.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}% \fi\fi\fi } % Extract a byte from the end of the UTF-8 representation of \countUTFx. % It must be a non-initial byte in the sequence. % Change \uccode of #1 for it to be used in \parseUTFviiiB as one % of the bytes. \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz % Save to be the future value of \countUTFz. \multiply\countUTFz by 64 % \countUTFz is now \countUTFx with the last 5 bits cleared. Subtract % in order to get the last five bits. \advance\countUTFx by -\countUTFz % Convert this to the byte in the UTF-8 sequence. \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} % Used to put a UTF-8 byte sequence into \UTFviiiTmp % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8 % sequence. % #2 is one of the \UTFviii*OctetsName macros. % #3 is always a full stop (.) % #4 is a template for the other bytes in the sequence. The values for these % bytes is substituted in here with \uppercase using the \uccode's. \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro that sets a catcode to `other' non-globally % \def\DeclareUnicodeCharacterNativeOther#1#2{% \catcode"#1=\other } % https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M % U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B % % Many of our renditions are less than wonderful, and all the missing % characters are available somewhere. Loading the necessary fonts % awaits user request. We can't truly support Unicode without % reimplementing everything that's been done in LaTeX for many years, % plus probably using luatex or xetex, and who knows what else. % We won't be doing that here in this simple file. But we can try to at % least make most of the characters not bomb out. % \def\unicodechardefs{% \DeclareUnicodeCharacter{0020}{ } % space \DeclareUnicodeCharacter{0021}{\char"21 }% % space to terminate number \DeclareUnicodeCharacter{0022}{\char"22 }% \DeclareUnicodeCharacter{0023}{\char"23 }% \DeclareUnicodeCharacter{0024}{\char"24 }% \DeclareUnicodeCharacter{0025}{\char"25 }% \DeclareUnicodeCharacter{0026}{\char"26 }% \DeclareUnicodeCharacter{0027}{\char"27 }% \DeclareUnicodeCharacter{0028}{\char"28 }% \DeclareUnicodeCharacter{0029}{\char"29 }% \DeclareUnicodeCharacter{002A}{\char"2A }% \DeclareUnicodeCharacter{002B}{\char"2B }% \DeclareUnicodeCharacter{002C}{\char"2C }% \DeclareUnicodeCharacter{002D}{\char"2D }% \DeclareUnicodeCharacter{002E}{\char"2E }% \DeclareUnicodeCharacter{002F}{\char"2F }% \DeclareUnicodeCharacter{0030}{0}% \DeclareUnicodeCharacter{0031}{1}% \DeclareUnicodeCharacter{0032}{2}% \DeclareUnicodeCharacter{0033}{3}% \DeclareUnicodeCharacter{0034}{4}% \DeclareUnicodeCharacter{0035}{5}% \DeclareUnicodeCharacter{0036}{6}% \DeclareUnicodeCharacter{0037}{7}% \DeclareUnicodeCharacter{0038}{8}% \DeclareUnicodeCharacter{0039}{9}% \DeclareUnicodeCharacter{003A}{\char"3A }% \DeclareUnicodeCharacter{003B}{\char"3B }% \DeclareUnicodeCharacter{003C}{\char"3C }% \DeclareUnicodeCharacter{003D}{\char"3D }% \DeclareUnicodeCharacter{003E}{\char"3E }% \DeclareUnicodeCharacter{003F}{\char"3F }% \DeclareUnicodeCharacter{0040}{\char"40 }% \DeclareUnicodeCharacter{0041}{A}% \DeclareUnicodeCharacter{0042}{B}% \DeclareUnicodeCharacter{0043}{C}% \DeclareUnicodeCharacter{0044}{D}% \DeclareUnicodeCharacter{0045}{E}% \DeclareUnicodeCharacter{0046}{F}% \DeclareUnicodeCharacter{0047}{G}% \DeclareUnicodeCharacter{0048}{H}% \DeclareUnicodeCharacter{0049}{I}% \DeclareUnicodeCharacter{004A}{J}% \DeclareUnicodeCharacter{004B}{K}% \DeclareUnicodeCharacter{004C}{L}% \DeclareUnicodeCharacter{004D}{M}% \DeclareUnicodeCharacter{004E}{N}% \DeclareUnicodeCharacter{004F}{O}% \DeclareUnicodeCharacter{0050}{P}% \DeclareUnicodeCharacter{0051}{Q}% \DeclareUnicodeCharacter{0052}{R}% \DeclareUnicodeCharacter{0053}{S}% \DeclareUnicodeCharacter{0054}{T}% \DeclareUnicodeCharacter{0055}{U}% \DeclareUnicodeCharacter{0056}{V}% \DeclareUnicodeCharacter{0057}{W}% \DeclareUnicodeCharacter{0058}{X}% \DeclareUnicodeCharacter{0059}{Y}% \DeclareUnicodeCharacter{005A}{Z}% \DeclareUnicodeCharacter{005B}{\char"5B }% \DeclareUnicodeCharacter{005C}{\char"5C }% \DeclareUnicodeCharacter{005D}{\char"5D }% \DeclareUnicodeCharacter{005E}{\char"5E }% \DeclareUnicodeCharacter{005F}{\char"5F }% \DeclareUnicodeCharacter{0060}{\char"60 }% \DeclareUnicodeCharacter{0061}{a}% \DeclareUnicodeCharacter{0062}{b}% \DeclareUnicodeCharacter{0063}{c}% \DeclareUnicodeCharacter{0064}{d}% \DeclareUnicodeCharacter{0065}{e}% \DeclareUnicodeCharacter{0066}{f}% \DeclareUnicodeCharacter{0067}{g}% \DeclareUnicodeCharacter{0068}{h}% \DeclareUnicodeCharacter{0069}{i}% \DeclareUnicodeCharacter{006A}{j}% \DeclareUnicodeCharacter{006B}{k}% \DeclareUnicodeCharacter{006C}{l}% \DeclareUnicodeCharacter{006D}{m}% \DeclareUnicodeCharacter{006E}{n}% \DeclareUnicodeCharacter{006F}{o}% \DeclareUnicodeCharacter{0070}{p}% \DeclareUnicodeCharacter{0071}{q}% \DeclareUnicodeCharacter{0072}{r}% \DeclareUnicodeCharacter{0073}{s}% \DeclareUnicodeCharacter{0074}{t}% \DeclareUnicodeCharacter{0075}{u}% \DeclareUnicodeCharacter{0076}{v}% \DeclareUnicodeCharacter{0077}{w}% \DeclareUnicodeCharacter{0078}{x}% \DeclareUnicodeCharacter{0079}{y}% \DeclareUnicodeCharacter{007A}{z}% \DeclareUnicodeCharacter{007B}{\char"7B }% \DeclareUnicodeCharacter{007C}{\char"7C }% \DeclareUnicodeCharacter{007D}{\char"7D }% \DeclareUnicodeCharacter{007E}{\char"7E }% % \DeclareUnicodeCharacter{007F}{} % DEL % \DeclareUnicodeCharacter{00A0}{\tie}% \DeclareUnicodeCharacter{00A1}{\exclamdown}% \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent \DeclareUnicodeCharacter{00A3}{\pounds{}}% \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar \DeclareUnicodeCharacter{00A7}{\S}% \DeclareUnicodeCharacter{00A8}{\"{ }}% \DeclareUnicodeCharacter{00A9}{\copyright{}}% \DeclareUnicodeCharacter{00AA}{\ordf}% \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}% \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}% \DeclareUnicodeCharacter{00AD}{\-}% \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% \DeclareUnicodeCharacter{00AF}{\={ }}% % \DeclareUnicodeCharacter{00B0}{\textdegree}% \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% \DeclareUnicodeCharacter{00B2}{$^2$}% \DeclareUnicodeCharacter{00B3}{$^3$}% \DeclareUnicodeCharacter{00B4}{\'{ }}% \DeclareUnicodeCharacter{00B5}{$\mu$}% \DeclareUnicodeCharacter{00B6}{\P}% \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}% \DeclareUnicodeCharacter{00B8}{\cedilla{ }}% \DeclareUnicodeCharacter{00B9}{$^1$}% \DeclareUnicodeCharacter{00BA}{\ordm}% \DeclareUnicodeCharacter{00BB}{\guillemetright{}}% \DeclareUnicodeCharacter{00BC}{$1\over4$}% \DeclareUnicodeCharacter{00BD}{$1\over2$}% \DeclareUnicodeCharacter{00BE}{$3\over4$}% \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{00D7}{\ensuremath\times}% \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{00F7}{\ensuremath\div}% \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{010A}{\dotaccent{C}}% \DeclareUnicodeCharacter{010B}{\dotaccent{c}}% \DeclareUnicodeCharacter{010C}{\v{C}}% \DeclareUnicodeCharacter{010D}{\v{c}}% \DeclareUnicodeCharacter{010E}{\v{D}}% \DeclareUnicodeCharacter{010F}{d'}% % \DeclareUnicodeCharacter{0110}{\DH}% \DeclareUnicodeCharacter{0111}{\dh}% \DeclareUnicodeCharacter{0112}{\=E}% \DeclareUnicodeCharacter{0113}{\=e}% \DeclareUnicodeCharacter{0114}{\u{E}}% \DeclareUnicodeCharacter{0115}{\u{e}}% \DeclareUnicodeCharacter{0116}{\dotaccent{E}}% \DeclareUnicodeCharacter{0117}{\dotaccent{e}}% \DeclareUnicodeCharacter{0118}{\ogonek{E}}% \DeclareUnicodeCharacter{0119}{\ogonek{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{0122}{\cedilla{G}}% \DeclareUnicodeCharacter{0123}{\cedilla{g}}% \DeclareUnicodeCharacter{0124}{\^H}% \DeclareUnicodeCharacter{0125}{\^h}% \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0128}{\~I}% \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}% \DeclareUnicodeCharacter{012A}{\=I}% \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}% \DeclareUnicodeCharacter{012C}{\u{I}}% \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}% \DeclareUnicodeCharacter{012E}{\ogonek{I}}% \DeclareUnicodeCharacter{012F}{\ogonek{i}}% % \DeclareUnicodeCharacter{0130}{\dotaccent{I}}% \DeclareUnicodeCharacter{0131}{\dotless{i}}% \DeclareUnicodeCharacter{0132}{IJ}% \DeclareUnicodeCharacter{0133}{ij}% \DeclareUnicodeCharacter{0134}{\^J}% \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}% \DeclareUnicodeCharacter{0136}{\cedilla{K}}% \DeclareUnicodeCharacter{0137}{\cedilla{k}}% \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}% \DeclareUnicodeCharacter{0139}{\'L}% \DeclareUnicodeCharacter{013A}{\'l}% \DeclareUnicodeCharacter{013B}{\cedilla{L}}% \DeclareUnicodeCharacter{013C}{\cedilla{l}}% \DeclareUnicodeCharacter{013D}{L'}% should kern \DeclareUnicodeCharacter{013E}{l'}% should kern \DeclareUnicodeCharacter{013F}{L\U{00B7}}% % \DeclareUnicodeCharacter{0140}{l\U{00B7}}% \DeclareUnicodeCharacter{0141}{\L}% \DeclareUnicodeCharacter{0142}{\l}% \DeclareUnicodeCharacter{0143}{\'N}% \DeclareUnicodeCharacter{0144}{\'n}% \DeclareUnicodeCharacter{0145}{\cedilla{N}}% \DeclareUnicodeCharacter{0146}{\cedilla{n}}% \DeclareUnicodeCharacter{0147}{\v{N}}% \DeclareUnicodeCharacter{0148}{\v{n}}% \DeclareUnicodeCharacter{0149}{'n}% \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}% \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}% \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{0156}{\cedilla{R}}% \DeclareUnicodeCharacter{0157}{\cedilla{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{0165}{\v{t}}% \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}% \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{0172}{\ogonek{U}}% \DeclareUnicodeCharacter{0173}{\ogonek{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{017F}{\missingcharmsg{LONG S}}% % \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{02BC}{'}% % \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% % % Greek letters upper case \DeclareUnicodeCharacter{0391}{{\it A}}% \DeclareUnicodeCharacter{0392}{{\it B}}% \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}% \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}% \DeclareUnicodeCharacter{0395}{{\it E}}% \DeclareUnicodeCharacter{0396}{{\it Z}}% \DeclareUnicodeCharacter{0397}{{\it H}}% \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}% \DeclareUnicodeCharacter{0399}{{\it I}}% \DeclareUnicodeCharacter{039A}{{\it K}}% \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}% \DeclareUnicodeCharacter{039C}{{\it M}}% \DeclareUnicodeCharacter{039D}{{\it N}}% \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}% \DeclareUnicodeCharacter{039F}{{\it O}}% \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}% \DeclareUnicodeCharacter{03A1}{{\it P}}% %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}% \DeclareUnicodeCharacter{03A4}{{\it T}}% \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}% \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}% \DeclareUnicodeCharacter{03A7}{{\it X}}% \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}% \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}% % % Vowels with accents \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}% \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}% \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}% \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}% \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}% \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}% % % Standalone accent \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}% % % Greek letters lower case \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}% \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}% \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}% \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}% \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}% \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}% \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}% \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}% \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}% \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}% \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}% \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}% \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}% \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}% \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}% \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}% \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}% \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}% \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}% \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}% \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}% \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}% \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}% \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}% % % More Greek vowels with accents \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}% \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}% \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}% \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}% \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}% % % Variant Greek letters \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}% \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}% \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}% % \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}% % % Exotic spaces \DeclareUnicodeCharacter{2007}{\hphantom{0}}% % % Punctuation \DeclareUnicodeCharacter{2013}{--}% \DeclareUnicodeCharacter{2014}{---}% \DeclareUnicodeCharacter{2018}{\quoteleft{}}% \DeclareUnicodeCharacter{2019}{\quoteright{}}% \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}% \DeclareUnicodeCharacter{201C}{\quotedblleft{}}% \DeclareUnicodeCharacter{201D}{\quotedblright{}}% \DeclareUnicodeCharacter{201E}{\quotedblbase{}}% \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}% \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}% \DeclareUnicodeCharacter{2022}{\bullet{}}% \DeclareUnicodeCharacter{202F}{\thinspace}% \DeclareUnicodeCharacter{2026}{\dots{}}% \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}% \DeclareUnicodeCharacter{203A}{\guilsinglright{}}% % \DeclareUnicodeCharacter{20AC}{\euro{}}% % \DeclareUnicodeCharacter{2192}{\arrow}% \DeclareUnicodeCharacter{21D2}{\result{}}% % % Mathematical symbols \DeclareUnicodeCharacter{2200}{\ensuremath\forall}% \DeclareUnicodeCharacter{2203}{\ensuremath\exists}% \DeclareUnicodeCharacter{2208}{\ensuremath\in}% \DeclareUnicodeCharacter{2212}{\minus{}}% \DeclareUnicodeCharacter{2217}{\ast}% \DeclareUnicodeCharacter{221E}{\ensuremath\infty}% \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}% \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}% \DeclareUnicodeCharacter{2229}{\ensuremath\cap}% \DeclareUnicodeCharacter{2261}{\equiv{}}% \DeclareUnicodeCharacter{2264}{\ensuremath\leq}% \DeclareUnicodeCharacter{2265}{\ensuremath\geq}% \DeclareUnicodeCharacter{2282}{\ensuremath\subset}% \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}% % \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}% \DeclareUnicodeCharacter{2032}{\ensuremath\prime}% \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}% \DeclareUnicodeCharacter{2111}{\ensuremath\Im}% \DeclareUnicodeCharacter{2113}{\ensuremath\ell}% \DeclareUnicodeCharacter{2118}{\ensuremath\wp}% \DeclareUnicodeCharacter{211C}{\ensuremath\Re}% \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}% \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}% \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}% \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}% \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}% \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}% \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}% \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}% \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}% \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}% \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}% \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}% \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}% \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}% \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}% \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}% \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}% \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}% \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}% \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}% \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}% \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}% \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}% \DeclareUnicodeCharacter{2202}{\ensuremath\partial}% \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}% \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}% \DeclareUnicodeCharacter{2209}{\ensuremath\notin}% \DeclareUnicodeCharacter{220B}{\ensuremath\owns}% \DeclareUnicodeCharacter{220F}{\ensuremath\prod}% \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}% \DeclareUnicodeCharacter{2211}{\ensuremath\sum}% \DeclareUnicodeCharacter{2213}{\ensuremath\mp}% \DeclareUnicodeCharacter{2218}{\ensuremath\circ}% \DeclareUnicodeCharacter{221A}{\ensuremath\surd}% \DeclareUnicodeCharacter{221D}{\ensuremath\propto}% \DeclareUnicodeCharacter{2220}{\ensuremath\angle}% \DeclareUnicodeCharacter{2223}{\ensuremath\mid}% \DeclareUnicodeCharacter{2228}{\ensuremath\vee}% \DeclareUnicodeCharacter{222A}{\ensuremath\cup}% \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}% \DeclareUnicodeCharacter{222E}{\ensuremath\oint}% \DeclareUnicodeCharacter{223C}{\ensuremath\sim}% \DeclareUnicodeCharacter{2240}{\ensuremath\wr}% \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}% \DeclareUnicodeCharacter{2245}{\ensuremath\cong}% \DeclareUnicodeCharacter{2248}{\ensuremath\approx}% \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}% \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}% \DeclareUnicodeCharacter{2260}{\ensuremath\neq}% \DeclareUnicodeCharacter{226A}{\ensuremath\ll}% \DeclareUnicodeCharacter{226B}{\ensuremath\gg}% \DeclareUnicodeCharacter{227A}{\ensuremath\prec}% \DeclareUnicodeCharacter{227B}{\ensuremath\succ}% \DeclareUnicodeCharacter{2283}{\ensuremath\supset}% \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}% \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}% \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}% \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}% \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}% \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}% \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}% \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}% \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}% \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}% \DeclareUnicodeCharacter{2299}{\ensuremath\odot}% \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}% \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}% \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}% \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}% \DeclareUnicodeCharacter{22A8}{\ensuremath\models}% \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}% \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}% \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}% \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}% \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}% \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}% \DeclareUnicodeCharacter{22C6}{\ensuremath\star}% \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}% \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}% \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}% \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}% \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}% \DeclareUnicodeCharacter{2322}{\ensuremath\frown}% \DeclareUnicodeCharacter{2323}{\ensuremath\smile}% % \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}% \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}% \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}% \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}% \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}% \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}% \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}% \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}% \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}% \DeclareUnicodeCharacter{266D}{\ensuremath\flat}% \DeclareUnicodeCharacter{266E}{\ensuremath\natural}% \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}% \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}% \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}% \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}% \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}% \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}% \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}% \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}% \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}% \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}% \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}% \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}% \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}% \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}% \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}% \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}% \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}% \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}% % \global\mathchardef\checkmark="1370% actually the square root sign \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}% }% end of \unicodechardefs % UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command) % It makes the setting that replace UTF-8 byte sequence. \def\utfeightchardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii \unicodechardefs } % Whether the active definitions of non-ASCII characters expand to % non-active tokens with the same character code. This is used to % write characters literally, instead of using active definitions for % printing the correct glyphs. \newif\ifpassthroughchars \passthroughcharsfalse % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro to replace/pass-through a Unicode character % \def\DeclareUnicodeCharacterNative#1#2{% \ifnum"#1>"7F % only make non-ASCII chars active \catcode"#1=\active \def\dodeclareunicodecharacternative##1##2##3{% \begingroup \uccode`\~="##2\relax \uppercase{\gdef~}{% \ifpassthroughchars ##1% \else ##3% \fi } \endgroup } \begingroup \uccode`\.="#1\relax \uppercase{\def\UTFNativeTmp{.}}% \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% \endgroup \fi } % Native Unicode handling (XeTeX and LuaTeX) character replacing definition. % It activates the setting that replaces Unicode characters. \def\nativeunicodechardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative \unicodechardefs } % For native Unicode handling (XeTeX and LuaTeX), % make the character token expand % to the sequences given in \unicodechardefs for printing. \def\DeclareUnicodeCharacterNativeAtU#1#2{% \def\UTFAtUTmp{#2} \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp } % @U command definitions for native Unicode handling (XeTeX and LuaTeX). \def\nativeunicodechardefsatu{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU \unicodechardefs } % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Define all Unicode characters we know about \iftxinativeunicodecapable \nativeunicodechardefsatu \else \utfeightchardefs \fi \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 \txipageheight = \vsize % \hsize = #2\relax \txipagewidth = \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 \else \ifx\XeTeXrevision\thisisundefined \special{papersize=#8,#7}% \else \pdfpageheight #7\relax \pdfpagewidth #8\relax % XeTeX does not have \pdfhorigin and \pdfvorigin. \fi \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 \contentsrightmargin = 0pt \defbodyindent = .5cm }} % 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 \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}{-11.4mm}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \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 }} \def\bsixpaper{{\globaldefs = 1 \afourpaper \internalpagesizes{140mm}{100mm}% {-6.35mm}{-12.7mm}% {\bindingoffset}{14pt}% {176mm}{125mm}% \let\SETdispenvsize=\smallword \lispnarrowing = 0.2in \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 2.5in % default 1in margin above heading line % and 1.5in to include heading, footing and % bottom margin % \dimen2 = \hsize \advance\dimen2 by 2in % default to 1 inch margin on each side % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper % Default value of \hfuzz, for suppressing warnings about overfull hboxes. \hfuzz = 1pt \message{microtype,} % protrusion, from Thanh's protcode.tex. \def\mtsetprotcode#1{% \rpcode#1`\!=200 \rpcode#1`\,=700 \rpcode#1`\-=700 \rpcode#1`\.=700 \rpcode#1`\;=500 \rpcode#1`\:=500 \rpcode#1`\?=200 \rpcode#1`\'=700 \rpcode#1 34=500 % '' \rpcode#1 123=300 % -- \rpcode#1 124=200 % --- \rpcode#1`\)=50 \rpcode#1`\A=50 \rpcode#1`\F=50 \rpcode#1`\K=50 \rpcode#1`\L=50 \rpcode#1`\T=50 \rpcode#1`\V=50 \rpcode#1`\W=50 \rpcode#1`\X=50 \rpcode#1`\Y=50 \rpcode#1`\k=50 \rpcode#1`\r=50 \rpcode#1`\t=50 \rpcode#1`\v=50 \rpcode#1`\w=50 \rpcode#1`\x=50 \rpcode#1`\y=50 % \lpcode#1`\`=700 \lpcode#1 92=500 % `` \lpcode#1`\(=50 \lpcode#1`\A=50 \lpcode#1`\J=50 \lpcode#1`\T=50 \lpcode#1`\V=50 \lpcode#1`\W=50 \lpcode#1`\X=50 \lpcode#1`\Y=50 \lpcode#1`\v=50 \lpcode#1`\w=50 \lpcode#1`\x=50 \lpcode#1`\y=0 % \mtadjustprotcode#1\relax } \newcount\countC \def\mtadjustprotcode#1{% \countC=0 \loop \ifcase\lpcode#1\countC\else \mtadjustcp\lpcode#1\countC \fi \ifcase\rpcode#1\countC\else \mtadjustcp\rpcode#1\countC \fi \advance\countC 1 \ifnum\countC < 256 \repeat } \newcount\countB \def\mtadjustcp#1#2#3{% \setbox\boxA=\hbox{% \ifx#2\font\else#2\fi \char#3}% \countB=\wd\boxA \multiply\countB #1#2#3\relax \divide\countB \fontdimen6 #2\relax #1#2#3=\countB\relax } \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \ifpdf % pdfTeX \mtsetprotcode\textrm \def\mtfontexpand#1{\pdffontexpand#1 20 20 1 autoexpand\relax} \else % TeX \def\mtfontexpand#1{} \fi \else % LuaTeX \mtsetprotcode\textrm \def\mtfontexpand#1{\expandglyphsinfont#1 20 20 1\relax} \fi \else % XeTeX \mtsetprotcode\textrm \def\mtfontexpand#1{} \fi \newif\ifmicrotype \def\microtypeON{% \microtypetrue % \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \ifpdf % pdfTeX \pdfadjustspacing=2 \pdfprotrudechars=2 \fi \else % LuaTeX \adjustspacing=2 \protrudechars=2 \fi \else % XeTeX \XeTeXprotrudechars=2 \fi % \mtfontexpand\textrm \mtfontexpand\textsl \mtfontexpand\textbf } \def\microtypeOFF{% \microtypefalse % \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \ifpdf % pdfTeX \pdfadjustspacing=0 \pdfprotrudechars=0 \fi \else % LuaTeX \adjustspacing=0 \protrudechars=0 \fi \else % XeTeX \XeTeXprotrudechars=0 \fi } \microtypeOFF \parseargdef\microtype{% \def\txiarg{#1}% \ifx\txiarg\onword \microtypeON \else\ifx\txiarg\offword \microtypeOFF \else \errhelp = \EMsimple \errmessage{Unknown @microtype option `\txiarg', must be on|off}% \fi\fi } \message{and turning on texinfo input format.} % Make UTF-8 the default encoding. \documentencodingzzz{UTF-8} \def^^L{\par} % remove \outer, so ^L can appear in an @comment \catcode`\^^K = 10 % treat vertical tab as whitespace % 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{~} % Set catcodes for Texinfo file % Active characters for printing the wanted glyph. % 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\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hatchar=`\^ \catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \let\realunder=_ \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix \catcode`\-=\active \let-=\normaldash % used for headline/footline in the output routine, in case the page % breaks in the middle of an @tex block. \def\texinfochars{% \let< = \activeless \let> = \activegtr \let~ = \activetilde \let^ = \activehat \setregularquotes \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. } % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \passthroughcharstrue \let-=\normaldash \let"=\normaldoublequote \let$=\normaldollar %$ font-lock fix \let+=\normalplus \let<=\normalless \let>=\normalgreater \let^=\normalcaret \let_=\normalunderscore \let|=\normalverticalbar \let~=\normaltilde \otherbackslash \setregularquotes \unsepspaces } % 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 \loadconf turn them back on. \catcode`+=\other \catcode`\_=\other % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ % Print a typewriter backslash. For math mode, we can't simply use % \backslashcurfont: 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). 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\ttbackslash{{\tt \ifmmode \mathchar29020 \else \backslashcurfont \fi}} \let\backslashchar = \ttbackslash % \backslashchar{} is for user documents. % These are made active for url-breaking, so need % active definitions as the normal characters. \def\normaldot{.} \def\normalquest{?} \def\normalslash{/} % \newlinesloadsconf - call \loadconf as soon as possible in the % file, e.g. at the first newline. % {\catcode`\^=7 \catcode`\^^M=13 \gdef\newlineloadsconf{% \catcode`\^^M=13 % \newlineloadsconfzz% } \gdef\newlineloadsconfzz#1^^M{% \def\c{\loadconf\c}% % Definition for the first newline read in the file \def ^^M{\loadconf}% % In case the first line has a whole-line or environment command on it \let\originalparsearg\parsearg% \def\parsearg{\loadconf\originalparsearg}% % % \startenvironment is in the expansion of commands defined with \envdef \let\originalstartenvironment\startenvironment% \def\startenvironment{\loadconf\startenvironment}% }} % Emergency active definition of newline, in case an active newline token % appears by mistake. {\catcode`\^=7 \catcode13=13% \gdef\enableemergencynewline{% \gdef^^M{% \par% %\par% }}} % \loadconf gets called at the beginning of every Texinfo file. % If texinfo.cnf is present on the system, read it. Useful for site-wide % @afourpaper, etc. Not opening texinfo.cnf directly in texinfo.tex % makes it possible to make a format file for Texinfo. % \gdef\loadconf{% \relax % Terminate the filename if running as "tex '&texinfo' FILE.texi". % % Turn off the definitions that trigger \loadconf \everyjobreset \catcode13=5 % regular end of line \enableemergencynewline \let\c=\comment \let\parsearg\originalparsearg \let\startenvironment\originalstartenvironment % % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. \catcode`+=\active \catcode`\_=\active % \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 } % Redefine some control sequences to be controlled by the \ifdummies % and \ifindexnofonts switches. Do this at the end so that the control % sequences are all defined. \definedummies \catcode`\@=0 % \realbackslash is an actual character `\' with catcode other. {\catcode`\\=\other @gdef@realbackslash{\}} % In Texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. @let\ = @ttbackslash % If in a .fmt file, print the version number. % \eatinput stops the `\input texinfo' from showing up. % After that, `\' should revert to printing a backslash. % 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]}% @global@let\ = @eatinput @catcode`+=@active @catcode`@_=@active} {@catcode`@^=7 @catcode`@^^M=13% @gdef@eatinput input texinfo#1^^M{@loadconf}} @def@everyjobreset{@ifx\@eatinput @let\ = @ttbackslash @fi} % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % {@catcode`- = @active @gdef@normalturnoffactive{% @turnoffactive @let\=@ttbackslash } } % Say @foo, not \foo, in error messages. @escapechar = `@@ % 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 @c Local variables: @c eval: (add-hook 'before-save-hook 'time-stamp nil t) @c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}" @c page-delimiter: "^\\\\message" @c End: @newlineloadsconf mdk-1.3.1/doc/mdk_ack.texi0000644000175000017500000000536712636571173011027 @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.3.1/doc/mdk_install.texi0000644000175000017500000002212012622455635011720 @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.3.1/doc/mdk_findex.texi0000644000175000017500000000046112112755472011527 @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.3.1/doc/mdk_gmixvm.texi0000644000175000017500000003213413747276503011573 @c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2003, 2004, 2006, 2020 @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. @image{img/ss_mix, 400pt} 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}}. Here is an screenshot showing how @code{gmixvm} looks like when running with a couple of detached windows: @ifnotinfo @image{img/ss_split, 420pt} @end ifnotinfo 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. The next figure shows the enter word dialog. @ifnotinfo @image{img/ss_worddlg, 250pt} @end ifnotinfo 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. @ifnotinfo @image{img/ss_mixal, 400pt} @end ifnotinfo 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. @ifnotinfo @image{img/ss_devices, 400pt} @end ifnotinfo 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}}. @ifnotinfo @image{img/ss_symbols, 250pt} @end ifnotinfo @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. @ifnotinfo @image{img/ss_devform, 250pt} @end ifnotinfo 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). @ifnotinfo @image{img/ss_devdir, 250pt} @end ifnotinfo 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. @ifnotinfo @image{img/ss_extprog, 250pt} @end ifnotinfo 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.3.1/doc/mdk_intro.texi0000644000175000017500000000616312622455635011416 @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.3.1/doc/img/0000775000175000017500000000000015065042311007350 5mdk-1.3.1/doc/img/ss_extprog.jpg0000644000175000017500000002405213747275312012206 ÿØÿà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Ÿ;¹úå+ª[áÛíÀè[áÆˆ÷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.3.1/doc/img/ss_mix.txt0000644000175000017500000000250210770465100011333 |-----------------------------------------------------------| | Menu | |-----------------------------------------------------------| | | | | | | | | | MIXVM / MIXAL / Devices | | | | | | | | | | | | | |-----------------------------------------------------------| | | | Command output | | | | | | | |-----------------------------------------------------------| | Command prompt | |-----------------------------------------------------------| | Status bar | |-----------------------------------------------------------| mdk-1.3.1/doc/img/ss_mixal.jpg0000644000175000017500000013246013747275312011633 ÿØÿàJFIFÿÛC       ÿÛC ÿÀÚÿÄ ÿÄT  !1"AQS“23TUas’”Ñ#4qr‘±²âBRb$C¡Dc‚Áð %Ò&7WXƒ•–˜ÓÿÄÿÄ*!1QAa2¡"bqð‘¢±ÿÚ ?üxûî¥Õ%.àWÒ¶Êó¾ ‡ÀÜ\V=u;Qò%:¯³û±NÔ{Þö¦¨w‡ý©§j=ëÈÆzŠÅ;QçxÚšv $¼|'÷b¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w—²GXäxŽ8§jáÿjiÚ‡xÚšv¡Þö¦¨÷¼?ŒõŠv£Îðÿµ4í@Êu#%â¬â¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ€’ñðxœ~êv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨w‡ý©§jáÿjiÚ‡xÚšv¡Þö¦¨ûSNÔH§Ñ]{ÿ´/÷×>_c¦I¶Ø˜ÓZ:$eih²îС-ýÖ·Wt[ŽJ(.¶ùAm$ `z<9Á¬¦.=žZ.Q~ã9-D±ÇÖpÊÙŽ*îû-îyÄôÒp3ÊO€J@ô15ÊõUªÝcÔSíV‹»7HQÝÃÙZT—PR9I)$giÇIÅfµcÄQ]V× OJºh}'GÙcQÚ¢÷™°Q9/½¼ÒðVIN¶RBH"µü3ù¨ÓÙ®ž¢Ówºêˆñn3-’nQBîЂuÆÛg»Ÿ×-Nt—…¤„‚@Á䉆ú”ÔÚKK_'¹ “¢ÝaXm¶¡¤Å[jn+n!) ÜÃÁ{É!G ¤x›a*>ÙÙeºé|¼Út”Ò-ºd:¤¡DÆéËqn—6Å*9˜j¿©¬ºa7cÕaë¯FîüæVÅÁM)lô:p¦Ò­Áìž8‚J¬Uê*ý¢ô»ZÙ­¬³¦e[¯ˆjêúxRíï ¬8³ÿaeäçÐгÖmÄÔ}aÕp«U([ìýÖTæà&ThHi+¸­†Ymç’RŒ(•ï9ÈOˆá¸É±½/6zM»W92ؤKŒ&°¶–ƒ?{IˆÈP%+/¤(‚ymͤqL;9ö­°3¦§Ãµ¥×•+ÉÑdMK˜9£¨[H ©¿œ“Rø³Ô!¨®¡ L[5µ²ÍjÑ0ôèmß'D¹<ã*XRZ[u娑ÔeN+‚Œ€ RBMi϶ݻAvyUÚ™râ«´I Ü‘&Wh²Ab:Ümâ¶RR”«iÂÊTÒ×~€—6õg¶»qqi—KV¹ÀM(-¶¤ü3’Ÿþµ¬fÚÙGf]Øò®wmCÐ'Ϻ7.ᆣ"3ªBw4çë Vú²6Œ|#Å0ÖŽžÒ‹ÑöÝU¨qm«m†ÊÅ´2ÚßTŽó½JZÒ@Pé’yÄ%ªV³ÓÉÒš¦ã§›–d· ÐyIÚ¥¶¤…$©>…aC#ךÍYv!h¥@ P( @ P( @ P( @ P( @>©ø#÷WQ áõþúçËìm½º¾å­çe$®ÌÓLÂ=4Ž’^ô; 9ç9ôÔ1,ßhú½¹àܘt)§Ùq—¡²ã.¶ëê}iqµ$¥cª¢¡¸cu2 gÎ~å5éòzA×Õ½A¦’Òõ% )@¨¬úh,Ìö“«£[µE›:cCò{RZ€Â%¦6é÷€Ž®Ü(…àH«©‘¦Þ±¾·`eODzhq¶CðÙuØèYÊÒÓªI[`œ’G$úÍ4ÆÌþÑu}ÎÚmRîmTË”¶â´ÛÊa½&‹©HYm% !9ÆáŸi‘¾žÔu}ÊdD\µ ²›‹7dÄ·2—”%I]sjÔNT9À¦™{CÕ°/¶Ë– É»‡’Õ1çd³kM½‚§ÔÙØÛ  ²I*Z©IŒ]EIYµ%ëO7rjÍ=Q‘v„»|À“Õad'‘Ç)Œëæ†krÙ®µ5¥˜ñaÎ`ÇØiŽôVžeÆ\tº¤8…¤¥ÁÔ;†àpqŒb®¦h½s©Õ MµÙ‹*àÍÕÆXŽÛHZ6¤„¤l‚0ŸN)¦D}öùsÔ·™—ûÔ¡"|÷KÒJ7,€8J@`€01SídƉÁ4¯u0··m.,6ÐY%ÈP™Žû…¥6\u ^Õ¡¸ž@5u1öÿhz¡ûÌM@$@f|7ênŽÏQk-N„ J ï œøÓLy´ O1‘D&„ʸÄÛocÿ ò¾KÍó}(iÇ…4Æšµ]ø¬¸f¤¨ÚM“â‘ûОŸ‡¨»á}4Ó‹ßi-§K¿>¥Mîç6l EÇ,hŒ‚ù¥'ÿáÞ“¸mO'šº’(WÍCsÔO²ýÍÈàFk Ã1£7–Q’v¡¶ÀJA$“É95\ÄvG®Š‘Šð‘hZqb$ÀýZTK½^xó¼þ|ìú¼(˜ßg^êfaÉ€©1$1*CÒŠdÁeþ“ÎübÚ+I-zvcÀzªé‰‹iW V’¸Ú×%‡f&E†Ôˆ >Á‰®JV•¤¥E%ÄT 'œñILT.W)׋Œ›µÒZä̘êž}圩kQÉ&¢µ²=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ2=t ]#×@ÈõÐ  •OÁºº’Ój9(I'ÒE2:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³Gݦ@èµìÑ÷i:-{4}Úd‹^Ív™¢×³GݦA÷¦ƒÚÒÉØö½Ô=›Þ»UµÚí‚Äú’ï;ÕŸ†´'r[ÊwŸFáôã7Ÿ˯î¹sTªÒ= ûa‰Ÿn,F}÷––Úi´•-Ũá)H$’’iô/¦v+®{'j RÌ%±9×£aHë¡™ —t€@”qšÇ’sú[,Q+hPIi«+ZŠý ÆõþÑdnc5\.ò{¼8Ãi;žp±¬ÓÚ‘ ´Û¢áašeÃYXÉB\)NTŸ p}u¾7´ÜJ…ª 9§ozºûLé»{“®w'ƒc €§\> ‡¤Ô¶q›F¬ø­S¤[.q‹.#ªeöAJÛq' Jäj˾Á‚A1mÑÚ¦ñ§nº¶×c“*Ñc[H¸Ëi;“¹›‡ˆœ`zqRò’å1ƒŒâ¨P(/½™öÚ¿l L•Ùæ’rèÄ¥·ÞT–˜@Z†BRB•ŽHNHšÇ?“ê«%¿Ioþ—;sìëKÌÖzÇF7Ï6_.q]Úâ[N‡ ••­#€|jqùxr¹)xÙöåUÑ9 ·Ú; ícPLëfº–ã(Àu F¶¸âÌ)èHÀé9µ[UàpqáY¼øÏº¹_:·²NÕ4µ»Æ¸ìßRiø>˜Íɹ[œŽÒÞ)RƒaJ•z’}TãÏ+’–Yö©Ö PyáA=ªt&²Ñ ¶«WiÉÖ¡wˆ™ÐŒ–Š:Ì«ÁCéõƒÈÈÈæ§S—ÒÙgÚ ªÎÍû)×½®]åX»>±‹œØQ»ãíªSL5¼#vçT‘ð”3žk<¹ñá7’ÉoÒïÿH?êLY'ê+Þ‚DxÈ®M”èºÃYC ¤©k K¥J žð¬O›…¹)Ö¸Ø9®¨ö‚ÓÙçfÚ—´Û´«NœÚî:\©¯†#Fe* Üã¤aR‚F|Ož\ç µdÔ^¬Ò×½©nZOQÃT[•ªJãHlƒÉôŒã)P!I>”}5xòœ¦Ä³UBA’,g&Kb%=I!”n8– ‘Ÿ£$Sèvë—úM¿YîRì×NØ;.>ÞúâÊŽåêFöA›^#`(ž+—ëK7+]\Nd9P$.,Èî²â áÆÔ‚Fp€88àúk¬ºË @ P( @ P( ƒÅ¤¥âIÀ´»í¶E§ýë¿I´¼{ÖŸTˆxN"Jãâ7 Œ¯ÝÖr”•rN8òóø÷厒ÿ•ø¸¸‡V·-TOêñ´sà1ÀýÕês(JJ‚µ!I9 I ƒërÓAýÒZ"ßÛfoj:OTêùšÚ;ÐÍÍ,Fmw•(Ëo`óz4$-[ÖF2JkÅytåzÜÏîë&Ï_ˆ»PÓPtohÚ—IÛšÜKEÍøŒ&nÞ¸m Âwí$G úAä_ ÛŒ®wʬV‘mì–Z v“§¦&æå¸µ,žôÝ‹ËJkõK„ñãŸNïöÖyÿMYöý\5ÄœûÚ¹þ¹'ÿÑ^lþ?öoî?2vïpUÏ´‰s{zìU*{ÓºWôuJÂ>qÀ؆üyþ5èøüãÿkíÏëhP(:ßc·>Íî¬z:Wb2µ¬™8¶ÅÍÒE©*Z–Tߘ„·±8ó‚²vçÇŠçÎr›wÏöjbÇþ°õçfúÓ\B¢í­½u´FïW¶¥)æç¼Àµ^éG]@)¸V~<¸ÏNVW®Ì¼P%* 8$3ƒë ýuþœu¿c–“z×möV½+c±Û„[íÆN³‘13‹¨!1“m„ÈSª !ÍO¯Šó|¼y\›¿ðß#^õßbSt>­³Yû!vþëz3,w/¨-°·$ô 'w,m¤ïñózÎ<ö[|gf9]tG‡$¢ƒú3ØõÛKö©þ”çè¾Çô÷Bï Ü È³·rTG™ž¥%]áRF…(uBÿÝ´ ú«ÃÎ^&òužññ[íCAv™¡?ÒjQ;RœõÞó2çn’o&s¦{]â*R ÚÀîû0Q³qó½5®¸òù8õK,ãuø.½Žo ýÙΜ3R%•h8“AÒWúKíuV¡¹}L¿×Ü0WŽaxGÀÿ•pç|ûýÿ F¿ú†ÓŒÚ4T9-èx–b«£hë³ÚÉÔåYiÓ³º•€ã=_F6ÿ¾¯Çvýÿl,~{®Ì” éþ‹lZSSv÷g²ê<.¥lH“:ð °û-—µ¶Rz¿<ØÅqùíœ65Ãíú—¶^Ó{íðŽÐn KÔ(ÐÉBÜÇrÑ¥­ÎšË«B½J' „àŽA~yü|çòݲÇó›â½ÎEëÿ £Ú¦¬IR¿FÒ@$âc>ŠóŠþ˜ßÇöý4>¬Ð‚vÉoÕ=õi—#U\mÎJœ¹Ž{ÑÏwÞ≠á'Ì' ú9®§.|søo2Wó?¸WÐq}Ptoôóx¿Zû_ÓìÑy˜ÝªQ†ÛN8¸î¬¤!ßÕŸ å@ã€NÇË%ãugÛôÿú…ì3CNÑ:ûVª­—ÝI· j7^Z¹nøoJ7)'v¤a)8JkÏñü—dß¿ìß)†«ÖæP(6­5ño’òÂfdw£þÔ¥Ô’~À ¥ú®?Ônº·NX¬‡²ÔnV›N¦ÕzÆbdÚ§[œÐž×I÷¬~ó^o„¶ÎSðß+ørOõCx¹êÏgwûÕÉûÂåÙņT¹¹½É¬>Tâ•é$œ“]>’Éù©ËöqŠêÉ@ P( @ P( A!§ußJ_­úšÃ%îV¹ •Õ²‡R‡SàJ B¿rEK')”útÿý­{}Üu…¸©<7k$}½Þ¹þÇÿZíT s¯µ_i7ßÒ]grjuÇ»·ªÜ6c’7mBÆåsŒœòxÓÂdKu_ª…«Mö©Ú&±]4Ö›Õ³¡[/1ÄY‘Р ¦‚а‚ K\“Ê IÉÉæ³xqåvÅÛwžzCÎHòÝuÕ¸âÔT¥¨œ’Iä’yÍi4¶[åëM]¢ß´íÞe®ç }HÓ!¼¦^ex)Ü…¤‚“‚FG šY/”\ÿö†í÷ÿãnºÿûüŸÿ]cô¸~"ö¿•GQê}K¬.«¾êÝCq½\œB\Ë„•¾ò„$­d’àEjIÆdO´mP P …A‚ òƒÚàøŒÐ( ŒJ•“[ìpKN©§i ûváq}²Ó÷)޶¯9!jIýàœd(–T0¦[#9Á@<úè i¤¡–Ò}iHt ŽžÔº‹HÝš¿éKôû5Í„©-Lƒ!L<€¡…­$$X©då2›Œõf©·Z®¶8’çÝ})7HIZYœRIIyáÌHÝžM:ÍÓQUBƒí™#,¹K̨Œ4âHõdA•w+›ˆ-»tœ´(aIT§õN 2 zÓ/=æäGym:Ò‚Ûq )RAr<æ‚Ñ©;TíWØ­zgQêÙÓm–hæ,8ëPHKEAXYHÞ@åeD``ñYœ8ñ»"Ûj«ZB@ èú7ýDöÅ 4ä}%¥uc1m1uÖ#½j‡'¦§U½ÂóKPʉ8Î+¾.<®Ø²Ø­ëÞÑ5—i×Äj=qxò•Á¸­ÃC¢;L%  ¨¡ %)«Àzk\xÎ!ný«•P P( @ P( @ P( @ P(‰ óz?äŸæ(Ñÿ$ÿ1@Þù'ùŠôÉ?ÌP7£þIþb½òOó…$øq ö@ P( @ P( @ P( @ P( @ P( @ P(f<¾tWÐêtº˜ówã;sëÇ4RbH„B% 2³ƒÓZ€XSâ`úy ÆP°Êdᥨ¥+ô<@?FEÉRGŠ€ÇÓA™¸» ÛƒiJ˜eÄ4µn)@”Œz~  Á½‚´ñôÐ7 c+O>øÐg‡ë„Æ D [ï«jT“Œú|<(16»¶¸ÐÚ ó–qè³ôxš’x ý€•r•û%+y„­!@ºœ‚2J$û¤\~ÊÏ»OåQ©‹æ„Ô:b4yºJ?mbWĹ%„ /ŒãÖ88<ÐÚ†KT’Ìux„w®†×…ˆ’Ôaèå)ýßÖ†Ó¥o²Ü_3áy¨óª†×Ћ C)ŽÁÀ†ÓùPÚÑœÓMIh4Ú–Õ©>r}UcSéìH’§Én(ë}÷NÚT£Œñö £$û]ÊÖ´7r‚ôe82Ž¢p>ƒàh5B’|î9 ô€õÁ$`,nô‘â<O4;ÑÇœ9ðçÆƒÝÉÎÝÃ>¬óAí@ P( @ P( @ P( @ P( @ P( ý& Î2¬wI ³GNP[Š HS$©C'ҦˉI¢^é‰QdÝT^ðë—7’—BImž˜Áõc¤qQ›Ì§í¶gfÜÒ¸Ñï%Ùéqhá*Z•)'’>€#Ç4p-MÄb$is£5) r†$2\VGM!D”§qñöñAñªž†»\®‹Í6õ:úQp6èY% q’æ}9|ThrŒüT¦=Ž+¬†ÉLcŽ\¨zøú(©;b­ææ.JšÊ“)qS5´¾ÃM%%„•­À JQ ¥ rH¢4mï¹u‰pdÄE™’ÏYÆÆ$ ÛÊÁ;‰ÝéðÆ(5#ÜQq´ —ãª_u¹±•lJ¶Ém8ú ^ß´ *Aû®mæâÍáØ‹¶ÄºÃS(H@J[+XsnßV3ë „Örò¢!øImäu?_ß§PHÚ2ÚRG8ÈÎÑH+hý¢?×'ÿ­)Sqº¢C%…„8IB‰%Y9<j0î¦5™z…_ª£Y,ºÊäõÀ´È¹³.Éˈµ19h ZcÿâJ¢‚H!)ŠŠÖž×–­Ó¬Iv‰Þ~– ËWzŒž´„\ÐëHSÁA¢øŠ‘’ÈNh<ÕרzcN\bZ.–•Êÿöj ² ©—\- AD Ê¹8*ÊV¡éàóA0‰»5ÝÙÙ³-ÙÌ9£A·å 2ýc]0ÒÔ•†îûÀ/#áî(îÈûQšÝÃ[M”›#V§Û)~;s•—ƒ`-Å8ÊRÙRÈÜ­  “U;íM}Rÿ¹5cSé#¤J£‡½hH=Tåj NKK$ð9>š´©‹KP,ñ­Ö½Hôu%wVä)„¼—Ë!**)ÊR¢ž9á9"¢·ä¹ìð°Ý™f¤4WÞÝšËÊQmÀ¡ç¶”€6uŸIÜ=BˆÅåàÒæG0Ùšë×@Jö$6¼2ñàyA$ñŸ¦‡Ó$9ibоõ¹Ó7ÈDÌ6H I+>‚=|ÐD\–ãÚF/YÔE %”6Âih“ã—Gž…nàýýÅfª” @ P( @ P( @ P( @ P( @ 4ܗ”Ó)RR¢œ—ä}úji_F$Óãô~TÔÓºLù:=èü©¦ÎfsÝÛÏÖÊšiÜ¥ã+xúÑùSM;œÑáô~TÓNç3äè÷£ò¦šw9Ÿ&oþ(ü©¦Î^sÝ›ÏÖÊšiÜæ|ô~TÓNé3äèãÿŠ?*i ‡0xFl~çGåM5ôÔI}f”¶”¡À¢z™à}¥5'Ž9¨ËĶÚA m 3@é··gM;ãŽ?•¡)„û…6üïÕ§Îø\}©JR0”€€S£¾ë͸Ê ”)$íñ ÿô¤jV¹‰4Œè?ÿT~UtÐC˜fÀú•4Ó¹ËÍûÑùSM;œÃãÿñGåM5çr—Çþ¾j¸ hRAÁV<8"ƒËÇeÌÚ´D RÑ'QHÖk²923Î)-ŽîÔ-E#„¸I$$øä)¢}”^N¡—¦aß,³f[S%w×–ˆIcã ÏHsÀ …’xÆx ÈŽÇuq¸O„éˆÓvû|{«’TRó†–„%²éÉÎFÀSƒ»mm«³ËÕÚÉrÔLÊ‚Ü d®äãªS‹ {iP¦…mNÃ^ÔäœñTW#%+y)X®?ùI µvm£"ëYw†%&äé¶Z^¸µßÓHZ€Ä”Œî<ãÑDJj>Èn®×XZrrg¦Ô›iz;Þl¶Õ3h )Jv«¦µ-@€88Åì^Ê ¢ß¬UyÖ–ØÓ´£íÇPh>ãeÍŠR”–I)ÎBJ2r@ÔDlÊ5eÆÀAÊ…"äÄcÔë=‚CŽŒ  ‚BT°¢ +Bå¡®¶¨v÷fL€™×FX“ØQ”¦^8idmØ7dÛ°sŒUö5«…Æ-®#Öɯ?sU™ãI(‰1-õÛªR@@'rw'Í8$ÔÑ5xì­3lZ*.™ǥɶ]§ÜîL-ÒË­1(¤8¬§yÚŒ$%(ÜO&‚‡ª´¥ÛGÜZ·]ŒÈŒÔØî·»cÌ82…§pJ†pF@ªˆz@ P}íOv ÀÝÕ)ÏÑ´*ómìÙ©ýœmÜîNõ$¦SvàÒÓmKd*Cgõ…+É;“€‘ãšÙ=šê(º}Ëó¯A*bÚÕáø)yFKPœVÔ>¤íÛ‚Hà(¨ PgÔ}•jM0.J¸É·,ZîѬÏt]Z²ûì‡PS” £iäœúA–ãÙ5ö­N†y²\/bRâ¿,‡w(Fõ-j[iH@H$I9ƒF×ÙýÂ÷2s6‹½²d;dNù*àÉyl6ÞýƒÍ õJŠŽB >#Žjˆ½Q¦nú>ù'O_Krãl*Úr•%i B’xÈ)P#€y爋 P( @ P( @ P( @ P( AŠWìÏ}Z¿´Ô«|R?„VãM»_ĹõÊþ‚²ÍnÑJpPØ)R‰?¿•o‹Úž¢‡½–# |K+ÖC{½ÝæÝ½Õ¤/—IYVáà@ÀÇÜ®Ù5«d¨~Kµµ.rmÂMÅ´8$:¨* aD쀄àò|Nh<»v¿yº:~ͺßÿIÝÐèëL)E[–p“´'ð–ÎÑ/ÖWuÕ±a/Þ»ÊfGĶ´>­Ë@)PZp|1ãD}AíãQþ’5miO! ¥¤ªt½Íì9<ꜟ„²ÆGUµeí_PY5ÇU± îW.Ê[™u¤%n m­(qð‡“žqÉ §4î×úËÎâp1Éÿ© ˜Òš­í*»MªÅ‹µ½Ël¦%)Ä¥L¬¤«µ%@ù£œÑÝÛ ¶k Zêõ!ˆj…dòTTHÎ-/„7µ„oVà…¥ *Z²p1š˜ª=‡ZN³G½B•n‰t‹¨9™*uÔ—:iSjJ’wgÓéªÏú•|^™¥ä0Û¬Áaر]ï2SL¸I)(C·0Tv•¥DfŠ×ºk»•Þ-·¾[ ›•©ˆñcÝ$†X9i$nØJpí»°1œTNvѪÊ5Ò ¾ÕÖ®ª½HK-,¢dÅ7ÓRÜ QÂJ †ÄíHÜH ñ²_â¹jM®Ík·Å´Â™nDXåð‡cÉs¨âT²æðwr•æ‚¥~½¿¸w÷Ùéa´¶”uÝ{gÅn­KQçĨÕD}@ P(>·Ž€k=B¼ú1€(«–×st{N®Íg·"àägâ ‚º½PÓÉ)X) ¯ÍQ©$EÄžÒï’tó–%B‚—µ³dzzP¾ð씆O³ŒT¸€4šŸµÛ檄üIÖkS.K¹FºÊÂ]?!†ƒI$”€RB@çÃ0G+´mAÿPdv“¸Œ\äÉrK%L¢JÞÕJ IœÍõfívž›=Û– W8¢˜,=!R÷‚’ ¡Â‚Á*ªñt~õrzå!°…»08µ„€sŠR‡‰$““DiÐ( @ P( @ P( @ P( @ Å+ög¾­_ÚjUˆÆ¾)Â+q¦Ý¯â\úåAYf·h(7§Øï–¶cIºYnÙšñœ‘Æ’ú}m•>‘š¹zsQ[î Zgéû¤iÒ‚K^†ëo:ðv!I V}4cé-Y.î¥¯/]X€Ý½åIlzÔÐNð9#ÓAAI)P ¤A E@ ó4Ðn¹d½³jnúí–z-®¯¦ÜÕEpGZÿâ#i?@9 \,WËK¥]l—LMNøÎÉŠãH}>´)@¤fƒZL8 RYŒµ´À>E¤£ÿ˜Š‘o^Jò÷‘§ù3©Ñï½Ù}ß©ÿ®6nú3š ,úh%]Òš¥‹„[KÚbðÜéÉ ‹pKÒ| h)ܱô¤ {µ–ó`˜m×ë<ëd°„¸cÍŒ¶ W‚¶,ƒè8æk²Þo®-’Ï:âóm—VÜ8Ë}i@ñQ€=~ñ_.0å\mö[„¨Fe>ÄWiëqi#ÿ˜Š 84oéKT82´åÕ™7•CeÈN¥É øÒS•ƒèÚ Êôî¡nõú6傿›¸XoÉê†à•¸§pOKnüàƒŒxsA§.,¨]…>3Ѥ0²Û¬¼Ùmm¨x¥IV?A Ç@ P( @ P(2ˆ’ÕsÓã·Êß žš\ ’¬`(€HÉÐm9¨›ôˆië¡´î(ïâ½Ûp8#«·fAãñ ù“a¾Â¶F½Ì²\cÛ¦¨¢4Çb¸†P‡Ú³€xø ƒzÝa¾Þ—&Ñc¸ÎfeéNEˆãÉŽØ•¸RBp ʰ84žEgâÊŒ†“æQ%¾³ q²ëy#rIøIÈ##ŒƒAŠ@ P( @ P(1Jý™ï«Wöš•b1¯ŠGðŠÜi·kø—>¹_ÐVY­Ú!ŒðHõÐvû=öÁ¦­zaZŽínqqõ| ¤ÒÅä]•=”' ’¤ò¨Á« ç‘ÅEoEÔv;Dë¢ç©íŽ\÷j2‰í]ÄÆc*dpÜw$d7Ôx-Ìg-u2pE\YÖÇûVìÕ¶oV–F¢ÀYK½2¨ì†¥-Òß{ZÂ_-²¦Ñ”“¸NqAɵ'm×ë„GžŠê“%Åï‹)©-()E@¥Æ”¤+…pr Ѝ P(.Ýœê]`bøÞ¥ÓÆcÒí2£²ï”žc¨W³ mm «õ= ¦Éq‡dºìXÆ3+YSl—K4“Âw ±á’2h:MªD;wez»ÖÝÞnVèìÅu7±)çÒ‡¤Ãî$îchõpÛ€pj+ÍxÄÝ?¢Ó¿¤v»÷žÕÒç=›ìiªï="”4ÓhuN„¡$ïqI•Ç ‘ ÙÒßh× É¸Ojz øŒKu{CÑ\m•©ìjOŸþÜçÑT\.P-z¦ùaÓÿ¦ûk6]2–o+jþÏëÂd-Æá3)Å¥¹%+iEE)ÚUÎÊŠçý¢Ý®7ímw»ÝZ„Ü™O…)å·)”¤$¤<Ú”—HP''$óš¨é}–êM=oÓš^TëÄÌiÙ·gîñž¸]q·61ã+¨€YÚÛâp9¨¬Mê{9D…^ tƒ|Âòˆë‹ŽÿÝh„Æq¢Ž«Ž(„Æê)Mž’Švô‰8¨%n²­‘;LÔJvýdwËúI«}¾S7Èå“!a!Ö—!¥¨G+è>ÐZÊ|r<Óš*¹©.±î=§F]šç¦$;O5T«»©~²„¤»‡qxÂ_¥Ä¤ƒàhŽX€Ÿããöý5GÕ@ P( AÐ4¼.öYzÓðî–†'«PB––'ÝcB+i1ÜJ–’ûˆ ¨ƒé¨.bán±Ù4…Êç©­ cµ_ ]à¢ê˯>§_¦Àa *t/zV 1Îê*Þçý SN]í @ÍǺÄnòc¦#¬©a‚çS=E$mÛ¸ƒœcš T(,š"v—…&Zµ:mÊmm¤3ßl\†ìóµ-I` ãÒJ³ê4UÇ@ªÍ3´+¥ÂÍs°ÛíbÉqŒ•8¦ì¬©× ºÒ–dÉZ‰.(‡ã¸ís¸ìXáE®l+§PŸŽ¸›“ºŠóŠÓ‘ÁmX#OT\õe©WÍ%£.¶ë­Öm:u1æ4»ÌDHiÄÈuEÝn¥ÕªjS“ž* ]SvÐ2¬.1bnÈ'ÞÓJI„îó°òç:‘ôþ¬ç說- P( @ P(1Jý™ï«Wöš•b1¯ŠGðŠÜi·kø—>¹_ÐVY­Ú!@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4ÛµüKŸ\¯è+,Öíáð⃩Cì®Í·iy6¿)Ú—¨/‘í .d¦% 8U$%:'Ž’É*ô Em#²-s•i¹Ûܼ³¾.Ê™D–’Q„È mÄ$!%ÖÖŽMDçv(ˆ[ÞÓV+õ™µYõøú†ÚܨV¨ÓX2Ñ$¾¶VŸKjBÀ[KÚ¤·çe<MYÖö[fœÕ×k šçåpd©–¤’Tˆ%>i)9I#‚RHâª!( n‡ìÖÿ®£ÜåÛHfß çÒ£"::#nÃŽ €B¾6ŒxÑUiQŸ…%Ør›y…–ÜHZU…‚2’AçÒ EÒŒ²Ü{6ºjÖ£\ãHµ¶Ñœ–ÃŒJ}N„)ªÐä:¥m8Æ4/š{J Æ«³7w‚êî=Á–î/´ç”*qö’„'¦VÔ¨ec*vA=Ÿi˜z³S"×rû0™‰.|¥1·ª¦£°·T„nà)[6‚xÉð¨,w-b¨ll1i¼Ì¨-}ö5°]b4ûO¥å´ãK–¤ôŠBšY óƪªú÷OCÒzÊï§-òÝ“ß ´ÛŽ£jÈÀ8W I‡D\´e–MOd³.àõÄ\54™±á<Ãí!ˆ] % uµ··ºv‚©ä梱£³"ôRgõ."ðtÇéI‘×gº„|>ëÑÇSwG*êîÛ»ÍÛé ¢iË+ºQÚ´ã/œºO.‚ë‰Fâ=8Ýœ}QÑævuÙìYÖ[”«…Ò×`‘x—hœ©Ó˜+=6 ¬¾—[l†’ç¡HQA<æ ¤ë­<ΞºÇD+r¢Á›¹Q.­Ü[ƒ\mô4ÐRw1°Aª6û1ÓúUêEiëü{‚»ÔINFz$´3Ñq¨î: Ò¦×ÔI( òy Ÿìß³.¬°Øå]¸‰ºžá"ß È¯´ÛPKhl]BÁSÁN¼„ìAIJB•“áQ\Ïp|Gª7,ÖÇow›}•‡‡.2؆…«Á*qÄ ô Ùû(/zçBéM5onÿlbðä(wÇlÒØ“5ž¤´¥µ-´´6C;Ãn…%e8NsšŠÔ¾i]%bíY­,¸wiGÕo l\nR¨Ì9ËÝ“µOü±‡-ÃL[cë»Ö•7ø¶¸vÙ×ÍL¸•”Ç[´«¦’w¯¦”Œ7(g¢¸’JA#ǪƒÚ@ P( ‚ÃNB³Ûެ[¯‰‘/1mÈ@Pé–ÜekQ#Ý” ãâ‚Û§{:ÒwÛ&˜„¥Ýš¿jˆW9LJ[1r+Ž¥ )žžì)-r°æA?ŠŠ€·Øt¥Û³ëž£e«¼)–¶¢‘*Kíª,Ù.¨f+m„%A–½^jIRS‘TT(……šÎ‹Ë޶½Abµt’vž"¥ÌŸ“¸úųAh[> Õ¢³œ7…ºãI,wˆéŒÃJ -íî§/gâ8#9¢¡ÒÞ/©çHÆKO:Ò[¸Ý{¬…(€¥4¤ÀdsÍ^<2=#Â@ P( @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4ÛµüKŸ\¯è+,ÖíðäPZÕÚMñˆÑ£XíÖ{qbìµÛ"”üÆ~)ÕîR†S“„ %<ž* ‡{WÔžT·Ü`À³[Ú·*ZÑ$"ˆŽªP"Iqµ)E]T’•yÀc! ¨=«Þ ^MÝ>âQjh‘ä±/¥1ö<—QÊ_P¨ïVO5EJã-©Ó]–Ŷ½·) + ´1Œ$8µ«žT|h5è ˆ7 vÓ%PKfdW!>KiVöWÈä´xsŰ# è&õ´èÚ~]‚šË Üb& Ùñâ)2äÇJ‚ƒkVòŒ”’R€£ŽI Ï¬5ëúͨ蛥´üb´Ó ½ofCJC-Œ%¤¥o­´£ÒBP2I9É97¨nZVòÅöÒ¦»Ãh(y¾£n¶´8ÚÓþä© RHã‚y’õ䛌ö¤\´Ö— 4[¢Ú݆¾ç:䥰$î$•u %G$çz“PÜõ]îMþð¶Õ*QHPi°„!)HB”¥)J@õA/§»HÔ:jÒݪÞŵÃÉÛåHŒW"޷ѱå0½À$©?òJ°y<Ðx;E¿§L2#[BSoò@ŸÝ|:›û¯SvÞžïûwcØâŠ®Ã™.Ý6=Æ êfLW‘!—Sð╤(öQ{¿iW{Ô˜nJ±ØT‰Ë‚̘Òd¾0óΠ¬’µJTŸö„Ô:“SÏÔïÄ\¨Ð¢G·Æ!ÄÑmˆì…mHR”£•(’T¥O&¨ØÑZÆV†»›Ü 5¦| ÓŒ¶n :âZ IBÊCn#’…)<çƒÀš ûi·Í9Pí6»3M3-é¶ÝÑVµZ^u¾šÕJp”å#Ï.cjO ¨Hï¿CR⺦žaĺÒÓâ…¤…%CéöPYõh·mNc¢ãh²¢3sœ¹È‹*Újl·<ø Ü¥( ª@¡94nݤʼêèzÎf“Óbd4´ž‹lILw‹HBS‰ë•„¶€6©#Íó‚ŽrVœÍo"n¯—¬œÓš¼Îï ~!†·")×’°ã½7Q ܲ°wa*€1Šˆ­¤mHNIÀÇ5G´ @ P( OëgìVIšuý;d¼[æËjjÙ¹2ú¶¼Ú ¤–^lŽAš {T¾Ã³Ç´Û¬ö8j„ÌÈÐæµÃ*+\RÝiµ­Õ% •¨•€q»ÓA¥r×o]4­»JHÒú} Ú£÷x’™fB$#'+s‡úEÅcÎYo$`z³@ ”°ê­O¥]yý1¨®V—$$!åÂ’¶K‰ (¤Œ€h$àv‰|bê«õæ-¿Q\úÍHjeí§%>Ë­Œ!IXZIÆš­Éày´QŽÔ{Iˆ—›…¯/Ñ[ó²j<çl¸êŠœVÄ‘¹D“騊Á$’I$“’MP P( @ P( R¿f{êÕý¦¥XŒkâ‘ü"·mÚþ%Ï®Wô–kvˆðñÍ­ÏJê‹+%]ôíÆ7"¸üu%/ŸRxäò8ñæŠË;EëeÚ-†ã¥®±®S°bÄv*ïäàlN2®xâˆõ'Y9{sM#JÝvi!k„#+¬”‘¢ŸVÁð9 ‰•T.›ØòYmÖAJÛX8)P<‚¢ƒAêRµçb­£qÚ’p=gÔ>š($—¦5+v$j‡4ýÁ6wÓDòƒ Vq€¿GïâƒÛž—Ô¶X0î—?p…à7D‘":ÛãóIñàƒû¹ ÒƒuÒc6ël7¥Ë’°Û,2‚µ¸³à”¤rM¼}­åjiHÚFêíé) 6ôÆQiÆÏF1ãš5¡m­M8‚…¡E I)P8 ý ÐHÛôÆ¥»[%Þ­z~á.ßo•)˜ê[Lñ“¹CÃŽ~Í¿£—È_¥£÷#ïé÷þ‚º³Œoðñã÷ñA2HOãA1pÑš¾Ó>®é¥®±&\qÜã»irFNÄã*9 `sPj^lw­;=V»ý¦]ºb•)‰-,$øAõÕ«MÖýrf±ÛdÜ'Ìp5,fËŽº³à”¤rMÝ¿Iê›´—;^œ¸Ë‡o*ßf:–† FTG}@PDŽy ö‚fv‹Ö6Épm÷--s‹&éŽäÓÑ”…HÎ1°ÇÒ(<:3W§P9¤Õ¦.bôÏÆ[ÌuuÑæ…d£Ä ªIφ=t×3­·]¡½ TuôÞfB km^¢ ÁAáãš wô~¬‹o‡v“¦nmB¸8†¢H\eßZþR}%^_¢ƒVM’ó ™2&Ze°Ô)}ÂJÜh¥,ÉÂEDø/YÚyóOªƒN@ P( ÖžÑ:ÇV·!Ý-¥îWdDÇxTF ¬ŒùØðâƒzKU<ˆ.5¦îKEÍo· IŽ¢$©ŽKgqGû±áé øF™ÔnXN©nÃ=V`v™á…t3œ|?3á@¼éG§„íþÅ:Ü‹‹Eøj’Ñ@Ø  ÿ¸G‡¬PFÐHØ4æ ÕWÚ4Í’eÖr’T˜ñ.8G¬$r|Ez’¶Ö¦ÜIJТ•$ŒAÁí ò@ P( @ P( R¿f{êÕý¦¥XŒkâ‘ü"·mÚþ%Ï®Wô–kvˆpx'ƒ³Øµ6”Ò6Í5å ½™÷!êØy~Jšìç'2ØÂäÉä²â6¶6îÉÊxÍ» Ué;‹%…ýOhyìê"»Œ)n¿)2Ë‹uYRJÜJœXª|ÅA]¿JÓ·kÆ´³pÒò˜±iöaLbUÞCÙKëºàމIPRÒÒ\BA*ÁéðO~Õ.ÖûïhW˽®çå²d· ' W˜BxBH)JˆIH'“UZ‚éÙÞ¯ÓZa‹ÛWÝ1{“mrc4ó’f!KRöa‚q)VÒJñ¸cÄQTù´ô—^b*#6µ•!”-KKi'„‚²T@ðÉ$úÍ×§ê½,憗1kjÝ•¢"i´[ć;âe¶[ J™ø e*BÞã$¹ŒçŠŠûíWVik¥—TÈ´Þ­ÓWª¯®P™ŒûŽ>Ë-!eFCjá…¥+K!)ÆB3Èæ‚‘ÙMæÙcÖmÉ»NDd@Ÿ2Ü*Œëñ\i·SÊR±•@$ú(. Ü´Óý£vlÂoºyˆºNBSæ¤æ+/iËH_´Ö©‡bƒkƒ"F¹3ÚeÈyS£t¥Žó‡– ”åhøGž8ðÁž¨P( Azì¶5µhÕ.\¯ú~ÛÞôüËlqsžÜu:󥲯ù‡*ð¨:fÚëF³èý5¨µÍÚ!]§%å/(‹8=$%¥8ë²æ ÉôQ\óV=o¿é7y·j{kÓ¦aYßµ9!H–‡ÙN׆±ç!ÅeÍÙÛ•ÜŠ£ëWÅ·µÙ®‹QiéRm¾PïpáÜ[vCFK͸Ù-§Ÿ‚ƒ»þ'òh(”E«²žà×húnátº[-ðí×HÓ¤H¸HK-!¶J•…+ÅX ŸEEBê(©‡~¸0‰Ðf$ÉqÄ¿ J_eiZŠK‰àð ¨äz*¢>@ P( @ P( R¿f{êÕý¦¥XŒkâ‘ü"·mÚþ%Ï®Wô–ks4G´Iñ9 dç9擜äæ@ P( N1ž('ÄøP(9ÎyõÐ $äÐ2|=t œcÑ@ dŸ@<òh Ÿ_@ÉñÏ…»•œî?΃̜ç<Ð( œc' @ P( $x(>ºN1ž(’0IÅ€  â€y94 @ P( @ P(1Jý™ï«Wöš•b1¯ŠGðŠÜiaÐ:yz®òͻ͞ҩo:˼Á#[[ÝúÇH!9ÛÇ* zkæÔͯÓzgý:iýYÙ]âÉ+Uöoåí2—nq¯Ö@™aƕʙž£j8ó á~KÇ–û•¹ÆXü¶±´©;’pHÈ9é±^‡'T¶öi¦õE·KH¶²ý©wÍAϽ7Fîl:œ©çRˆÎƒ­+^Æj+mŽÌô]ÝûMêiÐm. ʦBò£rœq0c¦B SˆZ GêÔêÅ|ÎÌm._-3â±26Ÿ“hnñri™jâŽð¸êa§0éqÖö¶¯RóÎ(*¡Øaé}}¨ôå¹§Û‡lºI‹/¨­ÀÒ!•¸à;>4E~¨P(-º³ÉšÚ=ÒSWtd@‚ü„îã­n£nÔ©8•Îã—1´`sAV“Ȳ]ˆò›+eeµKˆ$«A)PõH>ƒAÓfvo¦˜Ñϸ†äùb&—©×3Ê(p¹ÓZ£÷lnJn§úV>ŠŠ…ÔvýŽÏíú‚–“h¹Ý.N3 òÒäFΩ Bq—V”¤ƒèWªª!4<}++TCcZÉèYÔ믬ãCwME°VÚ´‚æÀJRN â‚ÙHiôv¥§l7}6Û¶=F¸IŒ-×çBÚ}aöä) ³ƒ»ÌZ‚>W>¸ÇDKŒÈçdy/2Ç©Z’3ö #¦èÍ4Þ¢²XSuL•Ü5T™ñ£HnzL†Úº$fAS‡Îࣟ¦ «µg°LìíPÍ®D{¼Ô8Hïª[O´ôyÕá ¤A9õÕT.˜²I©­t?Ðò­Â4®3Ó꺔nǧ³¢ˆé´OfQ%ÙosD»]…ËÜË4ô=tïim‚ã/B”Ò”v¥m„’‚|**“¯l Xîqo‰Ýq†‰P—æäö_FJT´ºê_ÂI*BJHÆ*£/g6«-ûP1dºié÷UÌy´uDV%çÖ­ªá ó¹Â@IÏ¢‚ßbì³M\ì Ÿ kWYW‹ÅÂÕbC·# o&:RR´ 6°ã«ê' YB8ÆíÊ¢¹0új£zÇlUî÷m²¡ÐÒ®3X†>.¸”nû7gì ¾ëÍ£ìÄê 5®YP=e“ëª]3–ÔâÞ˜ëWMaMà”å5"´µFšÓ.Óž°D³¼õ¹qịÊ#ãðØ{k’Ü%N/Î88 új}_£´å´ ziWÿ#Û[Œ™L¶×%-¸c‡)S`R¥þ­´ä+Ú JI 0Häz¨h @ P( ÎÓsPZ&—ã‹­û¾6ÄkP¼7nZ£©/4V0û›üÀÐ9ôàæŠØ°[tAÑ:†ëzÐóž¹iç¢FQ7Ç£õTó®![Û …#`óAñÎh4¢Øô­Ã³ë­ýV›…¶M¸0ÔiîÎê5p˜µŽ¤d3´ÞW¸R7xŠ ] »ö[¤aêÇ5M\/ò-Vƒ:%º•²ãîõ›F BT¢V£€=Ñ-‹è™ ñ·¿p(¾[-¥·5Q\€‡áuä6ž1-öœÜˆGf6äÐPl¶m½)­®,S.oéåµÜ&yIÈ¡ÖÞ}M ¸ÈA¤$+'Qr±í Ý‘ûÚeN!½$¹Ic¾ þXLC/v6ä±ÑNvÿÉA9¨¨.Ó;?²éÙ´iû ᆖçÈÖ1ÜyJq¤­]HŠRK)%GÎ^@<ÕBc¬Â×:rÃ{¸F—ñ »ÜîÑy.«t¤Vµ$²6¨xEr°p„©|e œñD\{-²iíM©`¿ÚäID¨Saæ&©…Gq¨Îº•`$‡(¤ãŒóPSYQ[-­^*@'÷‘T}Ð( @ Å+ög¾­_ÚjUˆÆ¾)Â+q¦Ý¯â]úåAYf®ëí/SÎÚì‹ËÞ×6guk¦íÁÃð;ÂÇ.% ³Övì½¼ÅWr#šÓ+<ŽÑõ;±ãƇäÛX9«‘]²qVô¶¾-ç ~““2x¢³ÈíSX=w·ÞvÝ Ëb¤)ˆñ 6Ìb©ïm5eܼøŽ8F¤žÑu“×6î°ï’-.1¨lµiqpYj;|¡¤¡¥0œrI'Æ‚;Rê;ί¿NÔÚ†jåÜ./)÷ÝQ8Ü} ©#€ŠÚƒbÆ}»¼w n1Þ£®+Û1úÆWÈ?AÀþTV¿‡…dw´=NöšYoCî½Õøˆ-q½èŒ§¾i*ä'è8 ‹»_®w¶­ÌOq²Õª Dm¶Â†’¥+Àx¨©jR•âI惪æýž{wñâ>¤$µ.:^eiP …!\ƒûýT¬ö‘¨™ÕýZcYÝ—im¦­ì;nB¢CKg-ô™ÈJvŸ8y$œÐAÞ.n^®r.¯BƒÉKê-¨1à …”q“’}d“A1bíTiËA³Z߈Bßr3®ÄCÃ[ÈØò£¸yh­<(ßÁæƒmmr‰£äh†í[å:™:åµ*•ÖJV”8ÎBÒ—”œpx4q¤È…%™°Þ[/Çq/4â…¤…%@ú û¨,×^Ó5=êd9s™³”Cyù"+vÖÑçÞy×Z8µ³Z‹S]5<ˆïÜ»«h…1"Ɖ,GŽÈ$„6ÚxHÉ$ø’I$ÐmimtÒ®vø6Ë$Ø÷t6Ü´\­é“¹%A’ RIÊ’„ç8 Ú²ö•©ôó+jE­¤ nΈ ,Ûßq;TäRyd”àqŸ‚ŸHŠªÑm:ìw[ÊmÖ–—ZN T“Aô@?e“Pv‰¨µ:ãÃ6§-s×»zfT•à8óèN:«PH 'ðÉ Ëwí&ó|¾Cq±é…ÉTdÄy´ÙÛ Hi)Bo8QJ[BRAã×Ej¹¯5 úê©ÜüÞê¨HmØ .3LKAd‰ A;=)8#‘šˆ®¤mHHô UÐ( @ P(zoWÜ´²Šíð,òL–—:ÞÜ•0ò~ •|=cŒâƒu=è@¼[—).5~}©3ÔâœuÖÜS‰Vïw-DãÇ4÷-yt»iÈ:bm›O*=²0‰BmiL¦‘»q!Я†£Ê—Œ«ÓèÀW(ÖÛÝÆÓéÚ Þbw)i[A{šê%xü¹ ä~ê ±5%â˜XaÉK1EÉ«²Jˆ’Ú ´¯Ä`(ñëÁôPMžÓïËŒõ›L¼53Åû’ݳ ­Åî+H#`JÉR@(“ôQQªÖºw5ÝÔüs)ËB¬jWwN BÁ`§òéœnñÏ>4F}O¯.z¹µÅ“N‰nBçÆµ¥™k ¤%!N…s”¤Ç8¢µíÏQYu ¿SǘÛóí%ˆÆ[Iu´´–Ëil à)! #ˆÜµkhÐõm›SKÑÚ|3hx<`[à¦+2JrRIÞ3Œär(­m)­®ú>ðõú×Ìü×ê7M·¥ô6 tÒHÜ•©?ÂqDBÉxHì„Æ:²°Ìfúm6 ø(OûR<ô t @ P(1Jý™ï«Wöš•b1¯ŠGðŠÜi·kø—>¹_ÐVY­Ú#Âp3A7sÑZºÎÄI7==1†§¸Ž¢½îo$¥dæ(}¦ö{®-׈Z~n—œÕÆã‘>µÚa÷÷ôuÞš ‹Ø‚­¨*8ð#$ñAñA!Oß%Ù&êX¶©Z­Ï3TĤt™uÒChQÏŠˆ8Æ~œqA!yìÿYéëW—/%1o"9™QÞ@q`” ôœQ€HÈôPDZíw+ÝÆ=¦Ñé“e,6Ë §rÖ¯Pýé –OgúÕW·4àÓr¼¢Ôq-l•6X ép«§°äa{¶œøÐDÜí—-ÂE¦í ès"¬¶ó'jСè#ÿ°h$-Z7Uß-R¯–‹¹p!në¾ÚFÔíNå`²”ùÄ$NŸ¡º¯ôwô·Èüãß0˜ß³v3»nï7~6çŒæ‚! [‹Km¡KZÈJR‘’IðzMõÏ@ë;-®ï§dÕqQLT>¶ÐP8Rw•lJà¥J>(¨ÛÝ’í¦îÒlWØB¸CXCñÜ)*mE!@’AÊT“Á#QجWOx‹`ÓÖÉ”çQâ°œ­ÕŸ@Îó PlCÒz’ái¹ßaZz›&{Éq¿ü8 %H*ßÊHÈI#š*&ˆI ’N$š 릂ÖvIPa^4ì¨O\–[Š—ÔÚC‹ÊwnÚ… Ã)YIƒFñ§o¶ Óšrók~-Í¥6…ÅVÕ,¥*@ rV’0NB…ÅöËvÓ7yvCovßq‚çFLgðÒðÕ`‘œ|}4T @ P( ‚[Mi=G¬&ªÛ¦-.\e!;Ë-ºÒGý¡jNãô''è ù¥µ Í=+Uŵ8í¢ÐÜ™Iu²RÔ”'rwo©IíÆHæƒyŽÎõ¬›ºš5nÛ‹ß]ܨêé±:Š@s¨‘’)‘A] PHXôõïRË\µÉ6Ž¢Ò•¡ ÈR–¤¥#$HÉ +wgZâë&ãš’^´:–'%çZÝÜQ!(Yuiœ œâ‚TWáJz¦úoGqM8ÉVÕ$àŒ¤y ‘ê4è @ P( AŠWìÏ}Z¿´Ô«|R?„VãM»_ĹõÊþ‚²ÍnÑ='ƒ°Øµ~ŽÑ–Í4…]ló·j˜7‡Å•©IL40·¦uÆéãb[;~G¦¢·!ë=azͧ†¢¶Êk7þ½Ê 2LxÝú0a¥«©ú¢SÔwoq[h"®ª ¸Û,úsVéhM[´Ûv™oM€¹6©g¼­õ0Ú_iÕѽ!%HÉéðGMw#LÊÖY::³­ìÆCm–Ñ£qB %+ÜR“ÈIª ¨ —gÚÚͤؼ±uÒ֫Ч[dFié HZÊ׳ +¦û`4v’N7x`ÔUFKÈ‘!×ÛŠÌt¸²¤²Îî›`Ÿ‚Ä«Àd“ôš¨ê¦ž?Ù-ãJGrûbb[‘‰aLÈ–‰!Çß Oç ·`„% NvÔUJýr³ÆÑÚwIØ_eà€íÚêãH)s§bZ9=&P‘Ÿ ¸¬Š£/e×Ë^ŸÕè•y”"E•}½RŠ¡R#8Ò\!>vÐ¥ŒãœgÔEõ]¢RàÓʺØn.PD¡d•!SL…2¢xé6…a àïBrqEP;R¼ZïÚòév²ÏTÈôBÚRŒ¥”%Ili*(È`NyÍvìß[iEKË»Ý Ç‘¤¦\仿ž2%%ô…#»ló –GI}LžE&õŽ“F†D“ußÓ¢•òxmîø$çfà~+»ãõÛ¾ñŠu¤®ñ¬ºÉ˜Âžm¹Åšëi*CO%jz𓦨»vƒrÒ÷;-#iÔ¶i‹—¨fÝšÚd"3-:Ú[I|¸’ êˆ+p!% Ž3EDvÅ&Ïp×ÓïAl»ÂžˆëmÈ*t†úqÚh¥aÆÐR­Í¨€psÎ($»Ö3HßX‘© Ö#ï\¡qˆSlÃCn¶´«Ï YÜP ŠS: óI(éí _¥Ö«[W›t›}°]ÖâuK”Ó©Rº--)NÖÕ“Ÿ sÅçÆˆßÓ÷lú‚Õw’ÏY˜ãJq¼|4¶êVSö„š‡Ú=ëJݬªÓ¶}Gi𻾍‘zT¦Ó! 0Ã)RK‰$<¢æV @lc4VƦԚ"ÕÚL­N›È½0ýž,{|›œƒ-¸qã©Õ&JNáÓt£ÆR¾ƒSSê[ÞÙnš‹FkO%B“iEÒá <‚LÚÛKiJŸ‚ÐQNB”OPrä !#Àz¾Š¨ú P( @ P(/=”;¥ìZ–Ó­¯šžCbÞœ€ó)÷ДŽJJT¥+Í!E8ñÉB·dNƒÖQ.:²Ãmv‰8@ÈsñD{AcЖ}-x¼:Þ±Ô­–èìÔÔ§]hOX#lpãm¯§¸œ•”ðqçb‚á3_[—l×jFô¾¥¹^.ÖÙ G(”ä'm+L”–W†ÒP‘¸Ü¯ŠåΩ:·a¶R¥%¶@'„§$œ’N=&ª>h @ P( AŠWìÏ}Z¿´Ô«|R?„VãM»_ĹõÊþ‚²ÍnÑ @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ Å+ög¾­_ÚjUˆÆ¾)Â+q¦Ý¯â\úåAYf·h ëV~Ïôž¯¶igàÅfÜ»¶£‰gup.ªž¤Çy<ªHWšÃùbRÏ›ÅEnFìûC^Þ´_ãZû•¼ùl˷Ǻ®B_LÉØë(•6¥%iC€4¥DøõŽÍô:œwUMîQ-Mivok„»Œ‡b&Bæª! y §Ügr ‰ %j w¦ƒšk[ ôÖ¨ŸgS,´–Ô‡ZK/©æË.6—R ¤”-$ Ø#<æª!( vƒÐMk.ÒÔ6h½ù-7*èÌg ˆÙ´©+ç¥ç¯ÐqÍUÁ%ØÅæ-, ¸ÃÆ×ƒŒ¥C…è#ƈêS{?Ò­hÙ-µ)»ÄÒQµ9žn*+q×:kS&?Á ìt%.¸­'“áE}v—Ùö“ÓöD‹$^„½%w‰kqþþ§×9.…¡Ky£Ã+ê6T”¤P¡|j fºzÙ©uZ!^’ãbÁ›q}¦Ýé©äÇŽãÝ0¿öî(¨r$Q+¾˜±B¾éÅÙtb/+Ôö‘"=¡‹³ÊŽÜ ûŒ¬¡ô«¨¶HiK¬`+%DJ¨ë˜ZvÛ«î°4œµI´± ¢3ª^ü€à½![€V<àôÑÞÏ;<Ò—ë&wŠ«eÜ#7,ÜÊà†Ce¦‡šò·Î„xcƃz J/D¤wAåeháªûÿ”Ôê|g@Gø=˜ÙÔÆî§§ÑEsí-eF¢ÕVm:ä‚Â.—ÐTèÆPu(*ô€¬ÕGVk³} |¸Z§B¶¹.·XS"Gº*J¤3å£.+%§”(q#„•dŒTU´KšÖÆœ½Xâ³›õ¹ÙÅbj¥°Ó­>¶”ZyD©hVС’Hçš Ý›FГ“>¨E¹wYEjÔ›“󙊭ÊPt-qRI%° ÈHÉ¢-º;²í>òm–}UlHº_¯÷ "”.JhÛLpÚeáõõ P^áÓA>'4WÁœUFõ†Ø/Wëe•OtEÂtxeÏøJ7}›³AÐ5þ˜Ñö[PÔVK m·lÔoÙ†«£²-¤4¥¡n¨(-—V ´ ¤ ÉÀ˜¥ÖÍÙ®žíJçm¾BnŒZc¿;ïÍu¦å½ ;ÉJÖÉ2Ø[Žxq€|(+·ý5iµkY«üè–k±»äwíé~{µ±ÔÓê+ª¤¸­©ÊÎS¸äy¸ª*I$¤0qÈõ N'ÑAׇdqíZ5Â÷§o>ZUîÌ%¾¦Ÿm†aLŠ|Е+hiJs>iq)šƒG´ͬšOOê;”I–Ù/CÖ&Ӹ݄³'NRºo%'Ís-7ʼï5_M0ª @ P]û2‡¦® êDê *ÅÙVë,›¤e®t¦ h ˉ IÞIÏ< P]´_ez7TéÝqî2{ì³q•xe2œÚä@ëÍ0´s”tÜi´¨…ÕN| ¦ª‡©íúgMiÛ°YW*ëw°B¼»tT×ÓvJ:‰m Õ–Ò’r вB†1TfÔ–½0 ÿO;b¸Ì›²*œä…O‚wÉq+øp¥H Jüì'ÍÍ"ˆ›ÑÌ56öÝ¿ôQZŠL±Ñ‰½¹*tŸ„¥6B¶„çýÉá€E[ÂÓ¶í]v¤æ*U¥‰*DWT½û’ν![€V<àôÔ•B@ P( @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4ÛµüKŸ\¯è+,ÖíÉ àŠ îÑ5|øñã.äÌdF”Üä˜PÙŠ¥ÉGÀyÅ4”—O¡J$Œš ÒûOÖó//«¼6Ô»auQ„xŒ²ÒTé%âZB\ÉÞTüùÙ¨1ÿÔ}_åw/*ŸN= 6ÕÇT ÄN6±ÝŠ:=0@!;pÏ4÷«ÕÓPÝ$^¯S*l¥:ê€À¨Ò P(3ÅŸ:[¸Ìz?xiL;ÓYOQ¥crœ ¢ƒûº÷U¿¦†’væ•[C)ŠSÝÚ*:W½,)í½BÐQÜ*Ú¢ƒÛö¾ÕºžÜÕª÷uKñÚZVØí6·ÜB:h[ËJBžZP6…,¨PFY/w]9u{²LTY±TTÓ€c ‚ …$‚AIH5Dô~Ôu”k´‹Ê%[–ô›x´©§mQ\Žˆc©m…6[mx!#‚G¤æ åÊ{×IÎÏÄF\x‚¦âEn3)ãkM¥(HãÀTLYuö­ÓÖ‡lv‹¢YˆâRsµ¸ÂFÇTËŠI[%hóTPS‘ãPx5î«hi!sH¶†{¨Owk­Ý÷õ:m½N–ÿ;§»n}D/=æäÇum<ÊÒãn áHRNBô@ ýyݨk«…Ößzzö–¥ÚÞrLeFŠË 9ñŽ© ¤%k_‚Ô J‡" ‰Ô–óª%µ2ó!¥ª; ŒÃLGm†Xi$†Úm)B’N$š£.œÕ×Í(âݲ¹ *ZÐè2`³'¦â3±ÄuR­‹8RpEå«´}kf., Ú€˜û²–㬶ó­¾ê u§’¦œZI R$xš‚´*¤-Æ–—ZZ´()*IÁJÈ ú<ÐX¯½¡j½JôG¯“bÊßT¤´¨ %§_V7ºói@KËVÐ¥…ƒšƒ5Ë´½Uw½§PܕɨDs8iiæ@JR—Z lsj[BRT HH¨ÓëU~’»«—sK—WYr:žr;KHimŠÚ’P%) ¼mÁ‚ %!#À ÜMi«![fbÿ0ÂT¸Ó‹.:\OYÝ"7gn>oÁSÕK{²vcŸ S¯µ³HòûVwOLwˆöh‘Ÿ)Bv¡%Æ›JŠBp6çxTÚ¢gKêëÞ‘2M‘P‚§ÅT) —‰h[* ©^J€ÎH‘‘àH Ž¸Ïzé9Ùï±— ©"·”ñ5¶ÂP‘Ç€ƒ^@ P( @ P( R¿f{êÕý¦¥XŒkâ‘ü"·mÚþ%Ï®Wô–kvˆðœ ÐX. W[‰"M™KDé †ÐŽûR$(–V–Ô¥6á„,%GÕAžgfzæ æë •6æ\LT³!—álèê!e ( ï PÙƒ»5ö©Ùº¹f–Ͷ$†ã"`T»¼8ìºÂþ <ã¡·RsP¥qŸQ Ô ¶–¼ÊÓ÷Ø©>‚i/6èI) sjROxTGÐ(£B™3«Üâ<ÿA¥>ïM[N7-XðHÈÉðæƒ ëºV1¦Ó«³©6µ6—ú½f÷†T²„¼ZÝÔ áNÒ| ·Ý «tÕ¹‹µî̸џR ë6µ6µ£zꢦT¤ —IPFÙ¬×MCte²Âr\ÙJØÓ(À* I'$’’@ª%•Ùö­nî«#ÖøíHLdMê;>2#ëÀC¢Bœ © $ ² àsAv´Ü¬796kÌ'bM†ámö\R?ôúAAvm «u¥ûåžÌ¹Ø.$¬<ÚTámÜ !J t¡rƒaE#“Š?AuaÓ¥Âί%ºý^³{ú;ú}n–î§K›ÔÛ³5GAìë_é+“MɼMi™šF]ÆHˆ¨.:ìÐø l0âFÆ”V68\ lðÏ…A½s¤Ñ¢áž×•S£”6ñο[àuCøéô6~³nwïôzh®{¥/MiÝWeÔOG/·k¹Eœ¶‡ŠÒÓÉYHϤ„>š¨èZ†íÙåñ»N^°e«cú†]æuÕ‹L„Ì- „%M”•¸ú±•©))ÜAÉÔ.Ñ®p®7xZ.Öév¨ÑÜÄIKq#¥D†Ôd4ÚÖá$­KÛ‚¥FßfZ69/¦Nµe‚ëñÜ›]¨Îf{(Q*NÐÚüð €ï>zqEHé‰ú!Åö€³¨¡iØ—è-ö˜’£KuHJä´ê7p%)Ke''9#‚2Aç9 Þ°Ü‘e¿Zï.3ÖM¾tyjoþa·R²Ÿ´'´-I¤oÑÛþ+â驽»/Éï°ˆ­-¥6ø)+qïÖ(­M¥CÌN ³QSRu¾‘¶ö‹z»Úõu¾T[þ™nÐÌÿ&IZ InØ´˜òoíŠJdÊîŠCêDt€P‡Ôv|à(¨áDs¤ !#n0¯¢¨ú P( @ P(:FÔr6‚ºéË¥ËLG›"õsHÔ™S£–RÂ¥$0Úö¬(qEZ´j&ËOX/÷ÒT§ q*óúní8Ê·F6´NŒï¤JµÙ‹#I7x “2H²Æ–f*6õ¬ñÑp ©´ä«rÓž(®Úm’Û§uÝÚÑgˆìh,¸Úã¶µïýZÚB¬’[PVäs°§<æª+ Ç@h{^®bðýÇTYíÆ¶D–š•)Öœ FÍ®(%•‚ÐÜsÎsŽ(ª”†Dy.ÇL†dÖPaEM¸Æä’ ú ÷Q^n‰ÒMè¹QZ·CMÆ&©ÅǼ¼d­÷:kRTŠîä;ÓNýÈ'5õÚ~‡Ò6[>¦fÉl‹F‘¼Ãµ¦CR^qémº—£%+ó…MõSÓÀذ ¦vabµj\ˆ—¨æL8°'\ŽR;ÁÇ’ÙR|à•HçÇ4Eíz/F5Íeä«2˜Q«¸€eÉò`’©ýл¿=~ïÔvr¡Î(ªiö fšÖ³-–fVÄ51[L-ee€üvÞ-n<¥ÂO8óD]{8кFõdÓ1.öè²%jé—(Ê–ì—ü4°[îéG˜T•£@AGV&ô^’^‡CÛÊJÑ?¥~P^ï]ãáìø®ï´t¼7ïç4óI٘Զɧ¤¾¦Y¹ÜâÂqÀyBy($gÓ…}8ª‹î¯±é8°-º’Ï£áeŠe‘V¸²ä¸‰ICaM S¬•— 8nsQU~Ò Ø-׈píâšÜ…æ7–ìh³ò­í6¥©Já;7¥a{€'E‹°¾ÍÓ­u;¾œy±Ã¸D…&,VÝ!×^qMùÍ´”­kÈø • Q;¢;9ÓNÃî›O2‹ŒËõÊÖ–.>Ä×ËYm«{i!%ô­I ë ¾rñ4WÕFþŸ·5x¿Ú¬ï=Ñn|øÑçüã©AWØMCíŤíƒ¨ìºrÙÚu4‹"â 2]jK(iKOxÞ  òKd/¦¤§õ‰Æ*+GV[ívŽÕ²i½gœÔæm­ÄµÈ2\aɉÏ3kéwãV78xV9ã¡«£è%ö‘s·G ³X!‡"¥v¦W$.C-•¡.¸U±ÇÒy+;PAÆ()IÉHÜ9Ç?¾ªw¬ŽYT( @ é ϦUÙõÛQ]¢iMb÷OjI3Z`4¦µ!*+*ùÞŠ*Û£»5Ñ:¢Ã¤¥ù•OtÝg]RćzR¡ße¥ e)eÆÙÁ%.‚¬í&¢).ÍÓ‹ì‚¢ŸéÖîr®NÛ”ƒ7xB"¶àp$É(nQ$í)ÿ¶ª§;Xì¡/DØîlé©öùv÷·^e>Û©nt‡ã¦JA_šB –ÁÙÆ[çžj#’U>ÎlÖI±5=ú÷ ÄØm­Hb<÷n)qÙ ³Ôx´C4“„‘Î=V¯iÖ fšÖÓ­VfVÌ"ÔYM2µ•–ñÛxµ¸òv— ryãžj"­T( @ P( AŠWìÏ}Z¿´Ô«|R?„VãKgº¿QhKä}U¥nnÁ¹@’¥´ê`e  J‡'‚+¤å²¦åØírÕ•á¸î9§;3Óv+ KÒátç„[±ã<ꣴ²¬ mÜq\ÿJ~õ®î"L™r™*C¯HyeÇqeKZÉÉQQä’yÍusMÜõö±¼Gá¨[qL¦ƒm¶Éë¤a.¨¶”•¸= YR‡®ƒ$ÞѵÍÂóPKÔ²•p¶•¯! ·Ò+$¬„!!¨’TJIVNìÐÚ.¶EáûèÔ™’c&¥L2¦—8ÚÑd µ°`˜dh!î×{úå"ñyœìɲ•½ç9R΀(5( ŒI“©Ý¤ºÏUµ4çMe;Ð|Rqâ“x8 ÇA4îµÕoiÄé'o’hBBb”|²°Ù^ÝåD¨ «há×îݑݘ\—ºiÏM¤ãrÏÐ23ûè5è,OvªXÓCV;8ƒÝ‘4 JlÉDU¯b$)œï  ãŠugº¯K[Qt¼Âa¶z­°ò”Û®ÄumõÛèI*ejG!*Å]†ÅuÔ×xö;,^¼ÉEA+H IR”¥”¤ÐLŽÍuaºªÔZ·€‹xºªq¸4 ÷3€ï9ÙÓ$„ƒŸ…Ç%òÉtÓwiV;ÔCl5ôÝl¨(€Ap AÁ kgº¯QÚzµBaq÷<†Pä¦ÛzR™F÷RÃj;ž(O* TZÑ7÷ôóºš0€üV#¦[Í59¥Êj:”[ïK{ˆˆôŒÕ±ãÈ—!¨‘Y[¯¾âZi´ ©kQ)ÒI ë4[¯fš¶Ë6í[œóÑÐów\a·™y§ ÚÚÐ9RTr>š*/Pé«¶˜“5ÑÔ™qÓ*3ñd!ö$2¢@[n ”©9qàAFk‘¹j(snQîXíëe§ä]nmBh-Ò ÚBœ#q;UÀõP}ÄÑ—9V%ê5Ý,1!%÷¢¶fÝ™aÉ.´¥¥–Ôw:p¡¾9QP äfˆûm·u 2ÚœqÅ! *Q8I$Ad¾öu©ô˱[½ ltJ’¸EñqilÇ€ Ù}Ä’ZBRUà(¯ìçTµª&iµMM”÷kº5´‡zÊ;:{lîÏŠ€ñ¢#¯bùb»®Å>•1-%ô¦1ë¥Æ”éq FBÐSçncŸEP9Ð( @ P(öxÔ6™7Èóì`E’ˆn?sº5 %å ­(OPùÇh'Š+n7eúÒd;5Â%¾;ÑuÓ#ÛžD¶Ê\\õ†sæŒ$”“ÃÃ4GËÞÓHÕÆû¥Ult”6´ß£—è@Yh7ÅÀ•QãÍ­ãBêkyÒîКa‹|†#-Îð‚—\y¾£}ëo ÜŒ€’ ñ  ”Óºfíª$ÈjLd¦uJ•"T”Gb; €Vã‹!) ø’ Ý–é§.Ò¬w¨†4ØntÞlpqAAÁA#dÐúƒQ[ܸZSℼ´E3šL§ÒÒw:Zdî¤p= €ð4Ð( @ P( )_³=õjþÓR¬F5ñHþ[6íç×+ú Ë5»D8ôçœPu‹_hšSIÛ4Ôx ÙvMEîÛq­ÚRÃC!õ$¼x pçnƒŠƒf?i&Ìõ¦Çt‰Ö´ ÒfNnÒ#)¤ÎŽ˜èÚÇþb”%K?ïQV3œ’µí M½r‰b3¢;ajÀÝ¢cÒ¬®÷yŽ&JåoLf‡YJ\^µ@£#Š izª&µÖ÷=G1b,Ž‹L ¶–ÏM–PÒIJxI!°v âˆ¬Õ ·Bö€î‹bëÈÖ©‰ŸøíªM¦,•¥ÕíÛ¹o ¨µæœ·œ84UZD…Ê’ì§i uejK-%¤Np”$¤z€EÓæv‹¦^ÑÒ:O8o2ô¤}0¨&ÜmmôЩOû›-´’ñ R¸ôÑ_]¤v¥õ£P+Ï;/UÝ¢ÝavðÁ€ Z›[¿ûÂ‹Ž¨%CÁ  ‚¡ÙÆ¢¶éR‰÷€èƒ&Ët…²Øqm"Du²\JOÂÛ¼+o¤=4EÝ]£i'š`Ï ·4Ý¡7_"‚ÏzLã0¬ÂÆzD¶ŒƒE´}GoÕZÂ]ÞÒ‡“3ròB\[lGm”­I¨7»Œâ‚ãÙÿhú_OÙ4û—g]n~”•>K“owðþÚR÷þîCƒ ¢,uŪáqk8êJÊ~ŒíÇÛAÐ/Ú‹³{âmQýA96Eߥ^nl½'Xim6Èhrë¸{¼‚¢çbŠ©ö‡ww¼Ç]žðÄËlX¨‹ ˆðŸŒÔ&NÖ@{ÎYä©Kÿr”Iõ7{2Õ Ó3}ÝuqÓì-ö“<KjàÒJšZÆpHÆß8äŠ í+ÚžµNºÊzûp‡§¥M›!Z@A/ƔӨ!´oÏM³ÊAQ§`)ÎErÁà*£zÅs6Kå¶ô›tØó:gýý'½¿nÜ}´í}«t…òÖ=c»º¦n:…ë܉nZ‹͵¶¦ÐÚ9÷Qen…µ8& •›­ô#¤\u,H䨷=>‹kO½euME’ˆ±ØËñœý¥¥\;yr §TóXY.¤AlÕW{$o%®\àCRqäÄSjKLËœ7³ ! Wóh9Ò8BFÀGÑUT @ P( FÐ:¶ÁkÐ÷]7q½[mÓ%^#ÎmW-5å†ÒR„”¨!y#œgš*Ë¡ûZÑöö+5íùOA·Bº)Ç#Á 78È’¸®6ßbÛ}HPã`tñæÔÁξ[•Ù•³H.C­Î{vk¤´TÚ\fÛ ÈøD)*óG8MQ`ך×Kê}1L[×9¦´Š“ÂãÈQ3¢/ãÔøÎs¨:‰ô+§þÜÔîª-ýžê;=Ef½É¾Àn;rÕLC4úAqüÄ+aIqÅþ “§;CÖz†ö«»–»]¾Ì ÇšOZR¢Çe†Ù¸aN”‚@ÉHÉÁÅAEÎÑö=3:äVmº²`z" ¶™¢,U#j‹+oÍ긤nWŤœr¬Šª"|ãÃÕD{@ P( @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4ÛµüKŸ\¯è+,Öí xxÐ0sŒs@ÁÎ=4 @ P= P(9Æ9 P(ŒÐ(9Æ(Á O…@ `Ð0sŒs@ P( @ P( ª‚F@â@ P'€(sþÜãÿJø ª€Ah @ P( AŠWìÏ}Z¿´Ô«|R?„VãM»_ĹõÊþ‚²ÍnÑxšÇ`ÒzGY[4ÁrÛhŽäUÑ?É-¾Ãã¼9bQ{Ç”AÚ´U訨}pΞ·Xôþµ·é½=÷.·Ân+½ÅÆÙéõt‚V‚êšZ³…)¼óTKNÓšFݯ»S’Õ¢ÍÝ4²R¸¤¶ãcue²·l•© ¥ÂByä‚x+µK³N뻮ϺŠňۊ»ºžŒÛªhΧ‘žp9ªŠ¥A½j³¿x2­q»³]Uwëƒ1wR:ŠÕÿjrh4SÎ>šÁ;Hé6ôD¨mÚ­¨“DÅÔ©¸„;ß)ÂÚ”T¿‹,â™ ŽAo><ÔW×jzCIÚlú¦=žÏo†î“½Â¶F~:]ÈiÔ8ÞT¿5Õ¨!/%Hà%xú()]•ÙmwÝbÜ[Ä4ÍùýÑeA2\b+Ž¡µm䤩 rF@¢. Ú´´~Ñ;8xií;*®b†b¸`¯|Ű\aµ”­°âœò7p(®SrC \ç3oI©o¶€“—èQ×;6ÑúJébÒÑ.Ö›t—u\ˤy2ßK¦Dt°Ý”Ÿ1µ6Ye <}]Ó6ë ï³›ù“j³yV×jLæ[a—Ñsu¥8êðÒ£ìRm$ŸäÕ]!i‰}ÕÖ;ÁÒÔ[Î$7Ö‚–ÜyQÐp£Ï®¢:}Ögö×lú²ë£ííA‹¨îV™-ÑZŽÔr¤ZuHê:ÒÈ((%Xñ ¢v‹ibÛUÞÞmfÝ|¶¢t#o¶zKaJAÞÁZö/rNHZ‚¸ ÕTÏfÖ›èÍßRÝ,¶Ë¬†.ÖËcL\[uÆPÛáå/ kÎê¸ZKHQá%yãŠ"ñ¦;ƒúA«ÒÞ™rý·¯–»Bw…¦*£0âû˜P=N§I ƒÁ;”rEp • lq$-<(}5Q!§ G»jUª[Ý'O×ÁBu(QûFí&Õ¦­6Uê+V›²AzѪdÙ»³l;Ñu†ÚRÂ$¥Ò:Ž  ­' êŽ|(>î–͵ Aví; ¦ì1¥ZâLWJÖ‰îCˆîʰ†ÏQõ¥î)EFkÝ1¤l¢7m}¹M[dÙcÜfÄØ{£)Ø¥{KŸù!À’sà‚HÏÎS£8Î9džjh @ P( ¡ÙÝ»O»¥mã£íw™7½d‹+ªÚÌ”ÆTfÔRÂÒ P ¥•dôñP`ŒÎŸ´éÐa›¸¿`º1 ÆT@¹='d¾ÑPXX”¶’“ކjŒótæ™kF¿Ú,±S^›‹ 3+¦ÝåOï8~K+ãõ€âŠåôB‚ûÙ=¢ Ñ:²D›nŸ™"Ýcï0üº´"Ow†“½EkBÚ¥¸új‘dÓ=–N‘1ë|]¨¯ê[MµKšÌ‡ÙYr \¨Ð\OÅ‚øVÇ)OÁó±AÏíK±AÒ½¢%Ý!eT‹#Ì*»DêMŠ”¶Š­ã*JRã…Fjªí#IöX‹l…"Õndh‡ n^ñ-0U,\±ŸµêÞIÇS¶XšRÉ5ë …Z":™L5w86Ù(º7¹„-eÇÖž’*%XQÎF*Ž}jÎëÉÖÆŸlaÂÔÆè©-i@ܦÇÂ8ñ ôŠ ?jv‹5ºeŠmŠ=¼FºÙÚ–©ÖÖÔNïZVävÜýchÊBJTÜ DRh @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4ÛµüKŸ\¯è+,Öíûh&nºÓWß#Å‹xÔ׌ÂXr:{†ÖÆ1çqðŽOÓA÷;]k;Þ%þãª.®0?e’ókgœù¹ñ$ž9''4ßí_Ê¿'TÈÖ7/ dÇïªpuKD’P£Œ(Ÿ„ Ù³.S¸\e»*T— ¯<êÊ–âÉÉR‰ñ&ƒ @@ •sVj‡lÒ®j ʳ6­É‚]ýH;·=Y$ã8ÉÎ(]Yª/¶ø–«Ö¡Ÿ:ft© a;F=xH’V•¾ã>Ñ9‹¥ªkÑ&EXq—ÙYJÛPð DK3¯u´}B5k:ªâ‹Ð@lOòRI# ŒF(#.÷‹­þäõâ÷=Ù³d^}ÜoYNz(6­º³TY­rì–A>¾~{Ìf])mܧiÈúGÈàæƒéZÃU®Åú.­G<Ú0Üú¿«ÚBO¤¤v“¢‚ $…%D(‚4³uî·¹\¡Þ.²ç"u¸Celƒã·ÑϤœçÓš‚>ó|¼ê)ê¹ß®’nÔ” ¼ú÷+hðHô=*ŒÖ S©4¬‡ei«ìÛcÏ 6êã9´­ äèà€Añ‘Š H— Ð&¹r…-Æe¼Û̸úOëÛ©(u%G’•(X&ƒXŠy‚A‘A5rÖúÆó* Û¶¦¸L~ØB¡¸û»Ëƒ”äc>hä‚NsA³;´}}s¼ÅÔW_r‘t„‚Ôyn-%ÆÐq”ƒ·p8 øU ÎªÔñ¯nêXú‚{wgÒê]œ—ÏYaÔ8 ¼p¤(¤QÅH  h @ P( «6·Ö:vÛ"ÏaÔ× |nu^b;»µíÛ»Ã![xÈ âŠú¶k½gf±ÈÓV­M6%ªVî¼6ÊzNçÇp “â}ª *ÄK•Æ2ãÁœôv§³Ýå!µ`<Öà­ŠõÉIǬ St¹"Ü«B'¾˜+’™ŠŽæÒ’”¹ù’3ê4­ö›ÚQî1Öw0ÍÝÅ»=i"RÕð”æS•ôþÿ“¨¯æQšo2Ì…B6âïSÎ1K}2ÎáÓóqêâƒ~÷Ú¸Ôvß#ßµTùðÇO ¾P¡ú±„s·wš<9¢—]s©.·Øz‰3• eºhÕ”ˆì0Ði NI8Ú 9ÎJ•è8 Ž½_¯z’w”µÚMÂVÀßUõî!Á#Ðõ£@ P( @ Å+ög¾­_ÚjUˆÆ¾)Â+q¦Ý¯â\úåAYf·h ÀÍ¡Îε £C“lzÙw'µjÙm˜[3m‡8)CÀ‚¤ð|ê)xìúéb•«…êÂ!Ü]y†îMNS°Ðë*Úëkq(*J’p > ‚AÍÜ~Î/ov€÷f¯\¬±/ L©ԘξJBP‡ÙÎâ¡‚R¯wZ[8À´µ6¬ùÉ$ýEó@ PlB·Í¹" rñ‰sÂ’62ŒnYÉ ÃÞh5d('bèËô½q×´Â-Ù Åun<âÖâ‚GMÊÂIHQãnäøæƒÝI£.ºQ¶…â]´K^Ðô¥o“©!@<Œ“‚8X<+Š Šç©®ñì–†P䙈ް„!)IRÖµ”¥*Q'ÀA¼$µ]ž¶M¦ÐÓ ‡Õ=w˜…$¶o*ÉÆÝ™’1Í¥¨,7M/z—`¼°–¦CXC‰JÂÒr J‡ I} Š"bÁÙÆ¥Ô¶”Ýí¦Rúä5 ;òƒr'­„oy1у¼¡>9)ç“ÅÈìïQ+LPo,ª•DNô;áƒÔé÷®–>+w§vqÎÜsPW¢D•>[!0·¤Éu 2ÒT· ”¤}$>Ú¢Ç~ìîñ§†›ÚÆ"Ë”ôNfqv4y-cªÓËJ J‘‘œ%C‚h"õFœ¸i A7M]\Œ¹p„¸¸Î—VæÒâJ@È)ZO€ñ¢²èí!{×zŠ&˜Óí2©“µ*}ÐÓ-JÜYá)?H¨ý1ÙôÝVúàÁÔšr,ô.B )³]iòJ–âøiH BÎJ‡Á>EXŒMFzKíFŒÒœy奦Б’µ¨€”¤’ÛAi½ve¨¬R"³6m•h‘5Ûs³pJ™‰-¤…8Ëë Ö”œŸpv•(§ý2ÔJ¸Ç†Ô»C±dÛ»¢è‰¹€!´¢—.”…¥Ci·9DmÓFê+UùzmVõÌš–D¤&2RôrßP<Ù@Ê›-å[°0Î0h!šh @ P( ͤ'k‹ÓZ~×sµE „Fn|…2$8|AJ ¿~ÓAžÏÙþ¢¾[¡Ýíâ JL¥9%r6·» -Îðqú¯0¥IñÜ1“À 4 »žš©àêm6ëVÈi›2/}u2˜J””)% Ž¡Q ,’sŒâЬQ Ë-žá¨.Ñl–¦C²æ8m%[F}%GÐ$ú&‚ÒÏdº‰s/e]ôô,·”X2î Bœ­Û[eA²Ã…£Ã×ETgÁ—kŸ&ÙpaLJ†òã¾Ò¼[q )ROÒ#ì¢0P( @ P( ƒ¯Ùžúµi©V#ø¤­Æ›v¿‰sƒñÊþ‚²Íný‡ùQÞ=8 ê°{NÓÚnÛ¦£[¸ÞWa¿E»°‡íÌÀÙlyì©M(÷…¯€X8ãÇ«µF’½Á±é[uÎè-p§Ë"âý©¤:ްm m1Ûpìm”¢°V¢ODŒ­c ÞíÙ¾Ò¼Þ<åFo+Ì„­µ¤ô}|„Önnø'ÏØsËï“Mæjìó_™ ÇÖëO=»­AGqË{×·‘ðŽqž3Q£öå@ûò }‡ùP[t7h÷éQÜjá æ+¥·—·<ÒÔRNQ§>ÁV•%ù’]— ¤ºúË‹)m(Nârp”€”  PtEv§%vuuÒ/èÅFœì t/1pyLå‡Ëªum«„¨¨©d …©D îÔ;Vµk›EÍ(•w—*ïrqj,Æ–,ÛPu¨ë ;ÊW$%„‚ UÍLUK³=\ΈÕì_¥&G@Æ— Õ°„©Öû h¸„«…)÷qœc"®"Ï'Wvy¨5E²á«§Þ®mY¬ÉŒ'ʶ»NKŠR)®¸WI)XOÆ)J ¤‚qCÕW^5Âê«Ì›²¥¼]TÙ;²Þ$rKAKÀ$(€Æ<*â/Ú´ûš²Xü¤‰þPÒògI†Ã1q©Ý|)´­Õ¦6:2JAÞž8©ƒ;I°#E&Ùæò-ú,b÷6»¹é÷®ñž§Ådtqþvjâ¨zjôæœÔ¶FÛeÚçÇœ<–JöçѸÏÓLEÇ[jí'¶ÀÓ™÷Ao7™Y3$[C‘Òâhi-6°(@9YRJÎ<(¨®ÕozsSkIš‹LO&4ô2¥¦\l­¶[knŽƒÓÝœŒnÆ8É îÊ{C³hK“&ó¦ øÎ] Í‘)™n³!¶£¹¼!)Ošâwa{@*Brp)ˆÑ‡ªìÖÖµŒÛl 1gßR¨Vä#ÏÈ%ÅÅe(x)\úʨ}‡ùQ¶[›–KÕºôÓAÅÛ¦11(> -¸•„Ÿß·m0t}I­»>Ô&…éWád—¨]¾\ßMµ„IŒÑmHLv•€ò†õåÕ)$å'TSþ¡i¨Ú–Ybë5Ëû–FÍ•-y!°ën²aÇœ€¶‚—¹@¬­dòj¢"õ¬lw½rÅÑ7;ý®×΋Kà¶„Mp5HIR‚P—¢®¢qŠ*„B@)ÁÀàïØ•ì?Êöå@ûò }‡ùP>Ãü¨aþT°ÿ*Ø•ì?ÊöåAtìÒÿ¤4•â­»¹vò¥šQ•,xèq‰xAØ…,¨ˆ_‰ÂÁO€ŠÜÒšßLØtkš\kƒ°µ­E% Ž£N7žçÝÓ» +ÏVìo+)à$PbŸuÑö{nÓv­Gu‰%¤÷û”Sd DÛŽ|Hi´¨Ê2µ•p1ŸQþTG¿aþTM« éW®v›EÕ(鈥wÇc:Ë}D©{ß>pNÕâ’G¦˜:l~Ù´šo:ºån•r°&õª£ß¢Ÿ"³tSŒ¶‡¤¨>±ÐqJXP(ÎÞ@8¦+êIðnºŠëuµÂv$9³_‘‡.-¦Öâ””©g•Ÿ¨Žûò }‡ùP>Ãü¨aþT°ÿ*Ø•ì?Êöå@ûò }‡ùP>Ãü¨aþT°ÿ*Ø•)YîÏp~-~ûM#ø¤­F›6+M’l§Þ¿L»5ká"‘»¬=,ïãgSnÿNÜãœV)¸–¶éݶ¢&ñwÕ¬º¨ï¦Zâ¦;©mýß©SiQIZ xZJ’Aä(Ž)‰ÙíÃOè¼%\µoC¼ÆîÝåqÊû¾ßüFý¼u7|^8ÇÂæ˜vx= {Ûîz³º÷É|*?Sºîû=_ùçÍÿ0ìúF—ìøéuºæ¨Õ£Qí*C €Áƒ».õØ'~ÎFÃãL;1?§´IvP‡rÔÅ%È¢]Ö”qÞ:ª„Ÿ„Ц–Ðû.ÒzRÛmzÕ}Ô&|é©qg½©¸ '¦¼0¥ŽI (¨o„xSÊ…£OÙ Ö¿\o"Ù×G|0–ƒ#£Ÿ?¥¿Íߌãwñ¦›Í?¥MÕÿ-\µ¶tät EµÞ:›UÐÝ¿ÍÛ»nüsÛyÅ0ìÅnÓú¸Ü¼¯q¾ ÝMîËo¤_Þ7u÷yÛ6nÆÎwc¹_ÐVY­Ú!@ ¾é¾Î]^™½jkò`›Ór.ðc™Ûe%!iKrK#ž™;€É9ñÆ9 Ùv­€Ë.¼Ý¼¸¹"¿¹©Sðœ”Gw9k~F8Ï8"‚#\kiúÞtYS Ãd6K,¦mÙûƒ€n?¬{œgмžhŠå@ P( @ P( @ P( @ P( @ P( @ P( @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4¿v)§ôΣ¿O‰«“$Ûc@Ÿ1f;¥µ¡m¶ ‘â9 ð}5”®Š{3ÐöM] 4µÂÚ«Âï&E¶öë7WÒ¦5!M­Øëoý€'r“É5^Ð:'Mö{¾Y۶ʳ*…Á—}Ù(DV”CѼþTó£"NK˜O ‹³ö|uê¥ÊÐî¶ÃÉuç¦gQA%#½¬tT ŸêB‰ðª);HQIàƒŠ ¤d‰M4ö®uW]NÄ),DjÖTÔtHw§úÇ‹£‘Ê€JF9Nh­»OdÎ\îq­êÔŒÇL‹ìû!yqT¤·Ý˜SÅâ²B‚1´r3œŸ "½ªôÔKv‰ÖË®VûÔ#23ËŠc¸6¸¦Ö…·¹x!Ià…A @ P( @ P( @ P( @ P( @ P( @ P( @ P(1Jý™ï«Wöš•b1¯ŠGðŠÜi3¥¯W"'®Úò[3Y‘íÍ…neÔ„­#>Häz+,ÕŠÁÚ¤ÓoYÞ·y1ÅXÞMíÌÈÔë¥Å­!i#vòHQä@âˆÂî·Ô*jC݉mnUÁ«£‰·Dn(ï |Z†À0IRR8 %XÏ4oZ»Qêûw;«¦<‡Ü”äFpÌnªÕ¹j £å\ø~ìQQ #~eþí=ËkÒ%~²Ñ˜ÖÚ M´rß#Ä‚s¸óAa™ÚÖ¸›&,µË·´ä9R'4#ÛXe&CížuA)JZ É>ž|h¨T¹©5C,Ñ`˸¦ËÄGf5:¶˜+Þµ(6’¢•Ê•á3AyG´m0ûåa†t¶‚âúh*Úâ£=$ð(>(>úôžƒ½¾˜waÙ¿Û»Ã8ç8 ø P( A•Pæ&WpT9NðŽiAÍÇÁ;1»<Ž1š JJ’¢•$¥I$F#Ä@ P( @ P( @ P( @ P( @ P( R¿f{êÕý¦¥XŒkâ‘ü"·t.ÀàB¹ö‡Â4ØWYDöRìp¤ÄqISˆRT R¤…r“áàkš¶¦× µ~ª°[¥¿ KŒX'J¿HÓ,¦,wä²—]k¢ iFvÒµ%´¤œàgš½/¦´V¡3R7}T4ÝmÖvm‘.a×›T”¬ªB,Ã(Ú”l©@PXl]é?)Ʋ]Syº®áw½Û›n}-µðp¥¤¡[Ëœ(ò©äf‚–»^޵vmiÔ—]ÎmÞðõÁ”©Ähé`¤!{CjRÎTrœ€qâ*‹Ì^Å,NC„›‚dC›ñi·]næ$Ãs¾êeÚáäé–ëjmð =ºIpT¢…œ'¥´'o+ZA"¨¹é®Ä­ GpÓ— Sk½Î²ÛnPè©ÅÇ@QSqÒËe'r7…)´€xQ9ÄÑñ¤ô͚ǥæÍjÖMÊç îwg'¶ðîm¤¸¦{¿Ofr:`•ïÎå·Ðc¿öI£-Z·±©ÙMØ A/÷§‰‹i+Ë=¡” =¹+ë(+¦G€h–‹=‹³sn³Zo…¬æÂY¸¼/­˜Á%Ô„„ärQÈOqÍ/ŸoŸk–å¾éL9LbCJiÄd2•GGQoìÚUŠ3„Üà¶™wVá\¤Y<«!+^ô8ÁàÚ¼ŠÀç4Tü;°ÚûIµêÍ‹ÞÄü@\ƒq,6ÈT¶ÐC ²µ Ù'<¤ì!>4t§e–ÛîŽzç= ‰=ûDûÌ Ç+q¨ÊP8Œ–HSd¶´•©Ô((p’<`ƒ¼Z´]Fé©«³Ýf]ïöåÍuãrK,0S!m€†ÃJ+ÊQÎT0NF|*¾ÖYÒqäX‘¦´‹Öƒ"Ån˜·Mî‡C|ÞŠ^~™%GÅ"ˆ€ÐÚušüa?½4WçJ̱(e¤åK[¥ (HÈÉJ¯RM}¼v[¥ôìÛ­Éæ.WH-–{„hf~°™ËR7uÔÈ+m²Ù!]$•o@!>5Àé;0í™íA>ßzŸ-ÝxÕž3q\ ªn;.‡^NÕo*Ý€Œ¤y‹;¸Å1rÑ£âé[ž­¿Zî—ïêI–ÖpLVP€ßSzMjR‚•à0ôŠ¢NÿÙ®Ž³hžÿåä.óä(w¦Êe¸²úߨKÜ1µJ\ÇT¼|äR A§©t.˜ˆ›DË7UZݸ³m,º]“ÔShZÒb)´)§FWµ S‰ ;}Ò[— ¤é3%SÓ§JzL™ .¼óθâÉÉR”rTIä“É ÚµjAbCíØï×+re'cé‰-ÆC©õ, Ãè41o—¸6éVˆW™ñàMÇzŠÔ¥¡—ñá½í_Ú WËÚí)°.õ=V´9ÖL)f8sþa¬í úqšÛåîå%ºåyŸ.$ìŠÃò–ãqÓêm*$ } ƒJ@ P( @ P( @ P( @ P( )_³=õjþÓR¬F5ñHþ[:Oú|¸Gµkwne?¶mw¢\(Fx'¼mÒÅ“ÂN$p|+5š¼_bÛõûi™oJnnKÑ}!¸LC—#:<„õû¤¤.BSÔÚ¢Se8Üë^‰ÓWÂS¦tÍÁLÝtô6Òù²†ž™e/r¼UþÕsÁ òÕcÐQeÁÓŽØlrš¸ê;õ¹é²VûQHÊÜ<¥~ŸAª*ŠÒ7Yˆ¯P§ICCñ'w†® 6Ò$» ²µ¬ïÜ´%ÀÊr ´_m}œH™>Û"Ídµ[í7-<“2 ÚúãÈÚ™¥KÜwŒ+æÆ<("ûUÓÑmzJßpsHØl³]¿ÏŒÙµ)$=  °UµjI ñVrjmhµL¾Ý¡Y-Á“*{èŒÇYä²Þõœ'rÖBP2yRˆÓUízréy»?e‚"÷¨íÉuά¦Úok RœÂÔBIÂNÐTpœŠ+¶Ëp»@¹\¡†:˜È—'©! «¦¥„ ‰QÅnPóR 'F•@ P( @ P( @ P( @ P( @ P( @ P( @ Pb•û3ßV¯í5*Äc_á¸ÓnØ™p(úåG[jmµ‚Ú㔃ŸßD<‘Ž8 ãEÇJ1sI¢æs£v}yñ Ý“mknÉ3™ïpœ;XØqHÞœz7¶¡èå&ƒrù«.Ú…˜ÑîÃDxEji˜‘ŒÒV¼u(i)jÚË>qÀÉ ‰*mIóŠJO8Á ðôˆ¶ú3ŒPJi>îªÔ6ý;C ?=î“N¼ JÒrqÏ£ÑEF’ŠI¢3CŒ¹³cBmiJ¤¾Û R¼Z‚A?FMÅöÔå‚ùq±HÓÎÛe;ÇÎÕ) )$gœzh47£Þœ~úôã;†=y –~G袵wzdFMÉ6Ζýå¢îìømÀÇŽsA¹9ÆáŸVy nNq¸gÕš &2elÍKÅmîu!µ'¢¬Ÿ0“¸ÁÈãš –Ø/Ö«TuJ™5äGŽËdnqÅ%#'$A€‚•) áI%$zˆ8"ƒÂ¤ûÍȶÏU­w¡}Ź(†§ò6‡Ô…-(ñÎJP£áà“A­A9«´Â4´›z#Þ£Ýc\í¬Ý#If;¬ÓŠZ@(t%@¶¬ç袢$¢3.rd¶P•jlÊp®x\·X×Qe_-ÚàÔíHt·ÖTÆK¨¦Ã¤¶…õvnN|ÜíÞÑtT{æ }«»»KbÒ‘|ïOÛÑ-ÆP˜ ëL8âC®Õ‚ØêØÎ Z7´' î‹„=KnÒ°Ó¨îW ¤&ã<¦îi"2[©-¨9„/nÝûÇ<¹#3ÞN‡ŸmN§a¶]»± ÙŒb\}A¥(;· JØQ¸Uœf¨Œ´¼Ôk´ /¯clÌaÅ«Ÿ5)q$ž9àDuþÐuÞ»ÝâÈ{YE¿¬Óu„ûQ@·Zó™PZS¹[WÓFà:dø«§iíR4þÓo7W}~\5qfÂó’e‹sޏ’ÛlBÕl ÙRwH"B·ÒNkK®¢V¥jÙ-íì6ì[œ¦›ž¤w‡,F/-Â|tЗyÜF9+X¾Á±vi§#]õdCm~Ã|eëJYqJ¹¾¹/¢;¨;6¨%Í« YJÀ%DPCêc¦çhY6Æugâ?i´Ä¶XÃÛg3ÓïR”lHV׉ZTTçXdy´FÔCd«{6Ô×^Ѭ×ÅØ[b%ÑÆÜ•!ÄlqÕ«ªÂw¶PŸyn9¢µ-}«·þÏõLÍO0Üms¤5xÑX|@2Ò¤4¢ÞŽ™^ >o "…­fOŸ©%J¸êæõ+«9Hyà´díNç’•ù£Œè&¨¾ö#©tvšhÊÔpV»£BdEÉu†žƒ°n$4ˆIÜT +(F9$ÔP5įúw¨4e·´m 7y2áDrT†Ø“¢BVÃA PJ[JØ ”«ÄœŠªæC€8¢.šŠ]ºõnѳmz¢9-Q­uo6ô7šyåuÔRÙ,8’’T>oUÎå«l;Po[yj»)ý:ôEÊc¼<âf¦H¬§%nŸ5^vHÉÛPd°v‹¥×q[½Ü*ý7JÁ†«³’߈ã3Û|õ·Ém§BÔÈBz‰B³àO$ÑÛ´Ä þ³º]íŒEj<—@Š¥–” ÚRµ‚´¥Gr’¥Rœ•œU:X“¢õ¤[–¬²[&]áE‹ ‰ŠqMLeõ¶ÊÒRÚ€%\«sQ[k¦™³öm‚åâÌ©÷˜-4Њđs.P¾ï ¬Dq´œ …û¨9ÚÆä¨H fª:Œ›Î™¸v«kÕ“ïýÆß>ÙIy…Ñd· ,VBV¦ZÈÊ ’•…$EX¯:ãI?x~U‡WÆ·ß&iV ¦ü·¤È OD­În’¦Rò”¸é釺yÁã&ƒtö‘¦Öw›£^ĵ9"õg˜íÑpÝJgÛØŽ":P–ÉptÈ ^9< tŽÒg³ké-Hô×}YßXv.öž\-®åIpP’Tœ§ ž28 ”{_é%vVÝŠ"¢u…p%@~|„­w)DËLt°ZZòR¤¼§B†0SŽ º¿UYoZFÊ—u,W¦A~#Û¢¡ÕÅi†ÛÚâÜŽãiK ÈNRÓ‹’¢qŧÚjeÛn,jD\î Tƒ!˜Ï:ôX­’ÚZSÍ¡mÿ»õ#rÂŽMOKG·Hº¤\æYYi* Þ[¨Ož?VïCõ€“‘éª:´íi¢/÷MOmV¤‰× 4ö&M#º‘—u¶CC¨eÀ¶€ÏLnæ Ý¶v¡¡çßšÔòî`&Ï«®šeGx¿&<€Ú›îý?3ªK=50‡ š Í—[özŽÌ¯šUá}·ÌzÍÓK)è-‰³Õ5—Tà8ÜÆÒ0¼¶…Ä ¨ªÞ®ÚìçLéöä´ô£>áv}(XQa.†Ymµcਈåxñ†h*´ @ P( @ P( ƒ¯Ùžúµi©V#ø¤­Æ›v¿‰së•ýešÝ¢ ƒ$y2a¼™1$ºÃÈÈK8P¡AÁ# ~‚E™cC­›-:YOQ‚R¬x§ 8ª t @ PyA•É2^i–’ëÇIC(ZÊ’ÚI$„ƒÂA$œI&ƒ@ P( @ P(<À ö@ P( Aæ(= P( @ P( @ P(¥~Ì÷Õ«ûMJ±×Å#øEn4úˆôÔOPÅÝœ8äVj\lw›¯Ímþ$~UüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*æëó[‰•óuù­¿Äʇ‡yºüÖßâGåCüÝ~koñ#ò¡áÞn¿5·ø‘ùPðï7_šÛüHü¨xw›¯Ímþ$~T<;Í׿¶ÿ?*1È“sè8mBRP H£Éz0ZÊ•(¯•”N>ƒê©‰šËå)%G½ÿ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4Êaå)%G½ÿe0ò”’£Þÿ2˜yJGÉQïÆ™L<¥#ä¨÷¿ãL¦R‘òT{ßñ¦S)Hù*=ïøÓ)‡”¤|•÷üi”ÃÊR>J{þ4ÊcåÙòmmwvÓ½%9ꌌxm¦SRJRb´¯h @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ƒÿÙmdk-1.3.1/doc/img/ss_devdir.jpg0000644000175000017500000001234013747275312011770 ÿØÿà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.3.1/doc/img/ss_devices.jpg0000644000175000017500000026021113747275312012137 ÿØÿàJFIFÿÛC       ÿÛC ÿÀ3ÿÿÄ ÿÄ` !"1A2QU£Ñ#%4RSTds‘“¡¢3a±$BqƒÂÒ5C67Db’ crv–²´Á&8EW˜³Óh‚…µÃáãÿÄÿÄ,!1A2Q"a‘’#3bq¡ÁðÿÚ ?þ>‘!ä<¤¥z_óWÒ¶Êó¹ù§ÿ9ü…NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)Ú‡šóŸÈSµ4ÿç?§jiÿÎ!NÔ<ÓÿœþB¨y§ÿ9ü…;PóOþsù v¡æŸüçòíCÍ?ùÏä)ÚŽÑ^uÇ V­Ž;÷V¸ÛG_ß«þåYåô} À-·Ì%Ü™Ì?-Èå¦ê¨^ÆúPl2•…¬ygr¢>’x;¼Ûð¨K°\n³ì춃ŽÌ¸[€}ã!7rCä ¬´é) #D§•0Õ=ÿÃ[Î?m™9û®Kö§fë 3ËT‹zÖHJ]'Ô8ž XJ»bî²5 úÅËÃï¤æS<7±œ‚%í· T¹lÈ%ð×0Ú–[SAgÒ½6Þµ“ã;sY[/†—›å¶,ÖnV¸ònM<õ¶ÞûËL™èh¨-M‚êBÒ9©<ŠHNêbÛ‹¶|0bÿ‹áÒ¬×L¥î<”%‰rœK·)–ëhC`%HAâHäP’HîN鉬ì?¯sn­±Dmì¹ÀÔ0â–:*óK÷ßNÓëmGÓ˶¾=©‹«oÂKÞJ--5|²@—~|³l‰6CˆvJRámN§Š€¤¬zˆRŠ{˜…$¥E'Þª+òƒy øw›®ͪS铲<ÛΩ$Åu§™}ÀŠž¨Ø$%iÙ>ú¸šðæíÙ¦Úo·ÙŸ‰.à™Ów“PÛ–¶R¹ZIùp@ #Õ´úvM0×䯲foòòí³[ºÜ"Ûá»Õ©)*eÑ´®+ÀP-¬SÊÛöyǼI¸I„[³ÜÚµ©M¸¥ .8‡•³éõ7Á¾[ArÈ-6:¥Ä€êÞó2KŠošx¶[¤/²–Ûz÷S fj)AõµøwGˆŽØÎ;“ e¾k3 \x ºÝ>ž¹7­|=õsÖ{xÉY|4¼ß-±f³rµÇ“riç­¶÷ÞZdÏCEAjhR‘ÍIäRBwL[qjχ¿ãxüÛ3`¼l³.×I$-(Sm\Ç/r´R‚J@ØIÐ* &åeòŒRn,ì>´ØSâ\cù¨Sa-JbC|”‚SÉ)P!hRJTAïu,Å—T• P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ‚D/ïOÿGÿ¾+\~2¿¿Wü?ʧ/¢ødÑÑáûx£BJ&&ò»q: –‹ l ï|¶“ÛZׯ›âgºÐ[¼F´ÁÅX³yy¦[ô«P_Mw.I”•|­ðà4N·Ë¶ˆïMLõ/ÄœDžû9v`uy/½d”à]º:¹sRP¾©*@WÈIm:ïÚ­ºI˜VZ(>³qñÃè¹”Ï,HÈ&_p£KŠÌxÑ_-tÊZqNñî ž(Ùg[[>³—1ÂÓâÉk µXU—eö6HÏEm«:ÒcMB[ˆS€º‚ÚÁp¤¨%{HOnÔÓ¯®6 ç‹oüE¾Ž\} ÇCE‰®n>†Ô¥,)¤£k Q<”8°Ê•Œø“…·?È2¸×£qÄæ­àÄZS2©‹’Ík B’§Wéâ  9'd‹°²þ—\ìWáã·kuõ«†RYŒ¦# Ä‘2ܬã…@·Ò.9ËIPP@OsIê_#ân§¡î$‘Ymæƒy‰ø‰ Á/xä˜o»rw©ìi á̶™È“±Í”¤ ßßV_Í«lOŨXí¦ÙfCר!Y6©smÊJ$GZçMºÁä9¤¥I% P߸Օ/v·x» Ý:úíÂó’d^fÜk™sëµ=´º–V¤õWÁ´ ¥(ï]»4ê Î3èF+ŽY¡Ä̸-•Ý\p'Œ‡ÒË1ÚRH$ŽìÉk÷ûê[«&0Õ>È›"îNC&|xD+“°™C®¥Zô…© ûýBƒêpüh·Û^bÙé“®2lÎZ\¾òCWQ¹ }µ à‚€€ÙwºT±Èl­gª‘¼þÐþGtrÿ‘e«uÖÊ»B®[Bæ´ ÒàRZSÅ%!iù=_r‰Ø54Ï-9¶% œ-é>×óX}Ð:ˆÍ)¹Q ¾¹VË€¡À ‡)'·¨Sae#ø‹ek"ÀnÊ‹8³‹\ ¹‰G% ÜW'MŽZ'‚€îSêíîïM3ëWá…ÒÁ’e¾½u·_Z¸Ø¥†c)ˆè1$EL·$œp¨úEÇ9i* iîjÏRùûveŽÀÂ'X$ν\œ—Ô5l•“ $•+bK/ ˆPzKiä{EM\õ€¨ÑAôUx“lW‹OgA»‡³[„3¤õt¨å±éåÇåü¯w³žbm§Å’Öj°«.Ëì2l‘žŠÛVu¤Æš…:·§uµ‚áIPJöžÝªé×ÔÜ"Çîx¼»=Å™á‹6:,Õ´”rÛ·FœJÚÙÒ¸‡t®; ê¤,õˆÍ25Î-ŽÃŽ"i¶Xa®;oMB~CŽ<·\qHB”” ¬$$)]’6I5*Æ^¢” @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ PH…ýéÿèÿ÷ÅkÑÑè®8ê–’{Í[ÆÚ9ù')¼ÔëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëE¬[þ_Òí‚Orl{—RS]C ß¿“`ñ;øìS­1Uäü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§Z-bßòø6—l²{”{cܺššê^ýü›‰ßÇbiН$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§Z;Æö”4¾ˆ“\a2š,>qI¶HWkå'iIÑí°Âháäü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´<“¿”ÞiÖ‡’wò‘ûÍ:ÐòNþR?y§ZIßÊGï4ëCÉ;ùHýæhy')¼Ó­$ïå#÷šu¡äü¤~óN´ul¬©E$®ÕdÁ&´ @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(GðÁ»·¾ ÄÅaõ·5©7Y‰£ÆÕ¯‡5|”œïÜ còsŸŽ¯´ñóÁ»·‚> ËÅeõ·=¹6©Š¤EQq¿qü|çä㥙_8­¡A*ÓoöµÖ«ÎŇç$7ÌKw¦Ã<ÔÍÅÿ²½“ðš[ƒí¿Ú+û;ؼ³Ûnö[ýÂG™¹I¶¹êÚyîš¡"2ýë¢ »©]ëâü—Ê×.8øEvd P}›ÁŸ<<ËñyW,·ñš÷1©ëa0Ë[a%°ÛjZœI!àT¢G»Š‘ó×.|¹q¾YþmI+{þƒ¼ÿô?ý¨ÿû‰ÿîëÄçýx®Oñ8ePaZò‹Å¶ÛéIòêØnk-¥Å%(”è%à °P5Þ{ªº¡@ P} ðbùžx{yÍq+¤;•ÂÀöçXY ó©‰Ç~e öZw±¤ìö?î¬rç8òʹ±óÚÚ §„þ9â¾Hö' %¶Ú®NDuÛsSŠ’'ÈN¸ÇB½ÉR»è“ðì gŸ>“VMfo–;¾5w—`¿ÛŸq€ê˜“ôñ[kðGÿÜGqZ–Y±h ²}ƒúŸ þ³.x…›"ñÅXTëëÈf%²\¸á[€–šä§ÛÛÊJIéTùÁÏËûF\ã5¹Ãú«¼VþÇ–o¼4ÈüD³xÉ %û›’Ì9Pã[PžûM)¥¸™ é­!䨤§~îÃ{«Ãó^\§>—ŽM4×v »N/í\fý’ýÑY!û Êþ—/§6YÂõV´z½=r_qÅ$õ-Ë!¨ÿø/ÿüDx%ÿÙoÿò®Åÿ¦ÿ£]ÅòìÓûŒÉ¦c_tVKï“éþ²ËóPžæÚW÷·t9k—Û²’¡ð®œoi¬ÙŠJ¡@ P}«Ãïì™â§ˆ¾\5$±©ñ#û\Û²2ï„þø‰í4HBr­Lü¾]þ}N\44A_o<?¿Þ³ÿ+xGò•z( @ P( @ P( @ P( @ P( @ P(mþÇÙÚ°ßìHºæFÅŽË2ÌH¸ùXN”Ã¥×ä Ú´áO^å®õËóqíÂäõ®7)ý°sµf^7ßQjÌ÷Šb›`qóPš*†ÇW¡ÅE´íÀ®\}ê}éøxõá6zr»_®¬” ôWÁ¨7¸ž àù-›Ãwò»žX=—=7 /–íκ°ëûZŠ@PJ6„€ R­”W‹žw²ÜÇYñü›ý­0œkÃï.Î#7gµ±"Ùe¹}p²¦†×¢J›ÙØ)Q$‘Ëܱ^ÃÊòᵎS+ã•Õ’ƒúû;ÿèTßÿ(üQÏý]ÿá¿Üµýçÿ?ù_û*ãù>þ¿Í®?RÿõÙ®íký_È9Ïþšäøßþ)/ÿÿÄ¿¾Wãüÿç?÷ùW§Èç~©*…‚ï Ê>ã2hy/Üí’ûäúŸƒïQ<Ô'¹¶¤}ñ­ŽZåÈw줤ü*r¦ãú×Á_¬vLríã&[áÿ…Ôa]º lnȘ÷‰òÔ€®’T–›Ñ”¤èüÕæçøí½eµÒrý¿’³|œæ™uÛ+6ˆ6³u”¹>N|g‘ù)ÌŸ‰$ükÓÆu˜ç}RU é¯ìûâc9-ÚÛOð×ÁKU³·"UÆýuÇÒfyxÉHSÜ‹ »!Z`|¢UþÃòpÉ»}nTœ§ûcZOÇÅ+‡Û…º¹ëDo3÷™R¥$‰ sЏ¨qÒG¤)I÷«´Ÿ†ôëiy{¯æÌ†ïíûýÎýäcÂö”Ç¥ùhÉâÓE•p@ø%;Ð0è“&0¯ Ðx– 6²æ&Ñè-”bJNÛw‰÷˜üAï¥tuªœ§i‹.?Ò<ò?í]à­­ÜíƒwŸér® ©oÛPÞ˽$§|e%\R!%*_«DàãÿŸ÷o÷§›ø¡áçÂì[›a7—í2¼µÊ;±fAmhr\uÜ"”»$(¾I:*R³ªéÔçùe‰fqÇð%{Š ¶)ÿ«LïÿBü×ÿ‹ã?Œ+ÿ ÿüÿüÞ«7ù§ßþþ«>?¨ÿýI«ÏþæÿÑü¹ãGþ²ïúÿ³ÿè_þ ø»‹ÿ×ÿÎs¯Gåýÿ›ëZBA6ÉrfÏw‰u~Ñ舮¥ÓpYŽþ¿Ùp!IQOΆÿÝK6`ÿT3_íøeâN3àíÆËx7›€¸1™òŒ¥ù ŽØQ.%IH; AÒu­û«çqüwŸÉÚò’ãøgûl̆ïö…ÈmÑlVè& "%ÉP´91NEiÒ·¶¢’°\#’R€7²7^ÏÁü‘ÏŸ×Â+«%ö¿ÿ&ÂÐâ#ei P´¨'}Èog_ñ¼W—ûWéÓñ¿£üðÂW„–üÊ Ãib ã-¸ßmÌÀÚZ‹Ô¶iI(HAJ[ ¥;HÑ5ÃòsïŸönL“5ô\ ö'ö(·Ë¸`YŽ@Î5+"ºbï3"à w¥¶Êä8àd1ËŠ>ù¥óX)RˆÖ”‚kÍùÿšOêéÃâ¿ûka–›~/‡ø€÷‡lc™FRûÒoÅ»€p¢Ai²Z(߯¾Ï4h$‚ÊÁ§àåm¼wÈœçíü—^– ƒúóûæØÙgðãϨd<Ÿ{z+ч÷?%ž§=pìà×òîµ³^oÏÆûËõŸûo…ý>_ý‹¿ü¥ðïÿ¨ý¾Etüÿòêpúøud P( @ P( @ P( @ P( @ P( @ P}~Çý­ÿ´&7d·ã¶_<½¾×¨QöTôÙiO%2Tt”²I:îMs¿‡…»c]©|þÖÿÚ$²\1Û׈bßtŠì)lû* :Œº‚…§’Y JˆØ ö"“ðð—d;WÈ+£%ƒW…x­â‡mÜÃry6ä\᪔„!À¦I)Hq*àv¥¤é@“¢6k<¸qåõe±—~Cò\ëIyÇ\ '’ÔTtlüÀ?ÀV‘âA¢Ç|Gñ„»n%ždVHnº_\{uÑøÍ©ÂJÊ[PD%#~ý$|Õ/<¾ÅÛŸéÇÆ¿ÿL·ÿdÿýåOáðþÚÇÎ6é6EÊå1ùs%º·äH}Âã8¢T¥­JÙR‰$’{’k_Æ@ P( @ P( @ P( ÝÓ9Ío—¸™-ë0½Ü.öþŸ”¸J¸<ì˜üVŽ›ªQR8¬• ¢IêN2LÚƒz¾^òK›×¬Šñ:ép“Ç­.l…¾óœRžKY*:JRÏ`øU’O …@ P( ¾+—d˜Mê&C‹]Þ·Ï„ú$2â4 NÂIBJ»)CJiD|MK')”— «/És{Ô¼‡*»½pŸ5õHyÅé ¸ ˆB@J{%#Ii |$œfBÝTU ‚çÌrOòHY~!sU¾ïo+1¤†ÐçhRéX);J”4A÷ÔåÆr™Iqõ%ÿlïí*âÚ¼JP 6ˆ ?ð!÷ŠçüÇýï_®¬” @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ ü.¼Ë!Å 8² N·®$üAùªQ/ÙIý2GôÛSjiì¤þ™#ú?í¦ÓOe'ôÉÑÿm6š{)?¦Hþûi´ÓÙIý2GôÛM¦žÊOé’?£þÚm4öRL‘ýöÓi§²“údèÿ¶›MCFÇ$•qqiÙ÷@÷ºµ>+Õ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ®3 %Îämr›ä¹l¸Ôer#„Ž;oÝïÚ€NåR‹+eŽ:à[Ю ϸyÉ qÆúÚi@Óµ-. ëcˆ"ƒñŒfÒÅÊÍ }Ù×r1\SMGì†Ý訬hìë°=»öù4.VKzºÏ¶Myl@”Ó°¢\ê|ËWdôõþ;øPvgJîBÞ§ç;¸qå}}m+ס 9k{ï¯wƒÝöÊ›-Ãy *L{¼ˆêy(Ò–”¶Ñg¾»“£îÙ êÖÀ†\ÈCrWoEÌ Å% k¦°T¾@r AÐî ÐhŠq˜«—1'L•àÂÞilÁ*iR’¤ô‚ýûOåkFš;ÌÃ[µ»)ÛµÉèУ¦>–b²ÔòJ’Ž‘Pâ ®[Wm|wMMKN;f¹AÇâ·s¤Ï1B&Ëëó Jé Aô€}D¸TÕC‰Œ&dò%ÜÛŒÒ =1DFIJ$tÊI“²A?àžÃ¸º=FÂU>SfÝ2D¨.B3ƒ­Ã*{€p´R ;W1­rÖ»ïTÑY‘Ø_ǧ"#Å—™Cí—Y-/‚·ÙH=ÒA³î÷ÐUÐ(5í°N6ÔØ6®ŽôœTç<ÂÃÑV ’J‡£r)P;=ƨ8 Q’Ú¿…L?<"t=>ŸWS—ËéúµÇ_ îƒÆwsnÝç¼¶{GŸOÝþ¬_á­ÿ‡ÿÇ_ Œ]‡ÛC¯&"'¬ysÁ†:=E©Jå¾@ ßnãz¦Ûf%ðdɶL¸É…6•­«i[åÅòÐ %dh’TUó|N©¢¢ùh~Åu‘i’ §#¨Z#`€AÑî6ì}Ô™ür7íÿÚ*¥/ŽF_“Ãk\üC»x|ÂÚ¾Yí¯ËºÅŸ-3›zB}N¡*uL$ì#¤Ö¶7±œ{û;Þnò.MÊ•v D¿IÇ™zÙcvà’û Hq×ø(tÑêõ(íZIâi¢ªoƒ2­¹kLûÚ[ˆlón³f¦7!Q ÍÈg?RƒìÒv9sAÐ媳¼2„Ì1‘eYRmöxÖ»2ËðìèSË~dbëL%”­ Z’†Ü+uK\vv¥j‚ÃþÏ7l¢Ëím—xwÛ”õ¡Æ¬.¹Æš[ˆI•!*ãN)¥/[IQƒM™žÛm˜¿3¸_gõn¬­ÈƵu¡…¥Õ °ì®¨é½¤ráÀé*Ißz EQJŸ”ïíœÿíÍYñ·ª¡@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ƒ¤yÄÔ¨ë(u•¥Ä(|ÁýôÓ35’òm©i¤Çr;QRïfÒ¦”ƒ¥kò–¥{¾:ÿ`„ýùÇ.vû£QÂoj3iIW ¢ÊR=‡¿º‚XÈ­%wc|Á¸­·”ȘˆuD¯†µëPÑO¸ûþ4Á&Fi`”Ì›*“@‹Å¦%–ø©†ºi\IRïDZ?Ƙ!_òs}iÔ*`»9ɤ‡64!<@ׯ÷þ4Ÿtßë^gÉù«ÙœzŸüÏKŸ»þ:ÿ†þ4íùkq-ÍÚ¤[œqq\SRzN()î¨)WǸŠ`é#/‰9.CŸd*€ãQÐjIJжR¤¡iYJ½éRî˜"µ’·mŽK6ò²=ÕCeí—\º¾=½üw£îßøP~Œ£Vïgùý…Ø\ú¿— =ËZøkŽ¿ã¿…¨yP4íýh­Á\Ð)S©Sêx)'^…ëßòÇT7áȑΠg˜d$‡_ê«ýå\SþB‚5‚êÓ|¶ÙÒܸևɶք¾©zÚO"ß žÇÝË_áð î2¶CbYµ~üˆ—×ôtú}.]>?/§éß-|uº`èÆ] ¤¢C–BääÛ•m/ù’À²ZJ‚8öPIîAÑì Ø`ŠŒMÝbÜD$© ÁDYRɶé/¸\’Oû¿ÆƒÛûDv¤Û›²É6é%·Ñ÷于ZZ\ èvY)4ÒÝaé.;•´Ò¡ sš’?ÅZýƒ›?ŽFý¢¿ûET¥ø·¨Ãé­x­‰4å†öï‡KÈ1ë|HQ_•wç®8Ónª2YJ•ßG‰t¤ëGc`Á[lñ*›#¶,êÇ6ö×´ä]Ø‘çä¤7!ð€øR‹n%h_M²SÄS°¡³AáŸÝáåËbÌfÊqlÎ2 r«3r#Zy,£8êÝCO‚ÒºÜêô¤–ÉGᢣÙ3û>;‰Ü¬–¼vzn7ˆ+5÷.ÅPJ”SÊô‡ßâK„$ú€Ý‰ª)Sòý³Ÿý¹«>6õT( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ âæÊÛs:)g†‡L+{ÿªÍ·Kq#Øó~•úöÓjv=7é_¨m6cÍúWêÛM§cØó~•úöÓiØö<ߥ~ }´Úv=7é_¨m6cÍúWêÛM§cØó~•úöÓiØö<ߥ~ }´Úv=7é_¨m6cÍúWêÛM§cØó~•úöÓiØö<ߥ~ }´Úv=7é_¨m6cÍúWêÛM§cØó~•úöÓiØö<ߥ~ }´Úv=7é_¨m6cÍúWêÛM§cØó~•úöÓiØö<ߥ~ }´Úv{jÕ1§ñ¸¥e²H c¶ôGÀž§¦¥ðŸúLà+þú'‡ ÿ¤Çþ¿ï¡áÂé1ÿ€¯ûèxpŸúLà+þú'þ“ø ÿ¾‡‡ ÿ¤Çþ¿ï¡áÂé1ÿ€¯ûèxpŸúLà+þú!*Ñ0©JMÌ'’Š´Ÿyÿz½ŸžÇ›ô¯Ô¶®Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;Ç›ô¯Ô¶›NDZæý+õí¦Ó±ìy¿Jý@ûi´ì{oÒ¿P>Úm;"µÖCÝ7.k¨“´€6•¾Õb¾³ýš&û;2˧ûZ}¯ËâóÜó°ÊL}2}mhÚǼzÓßâ+7êr]cyÕöGŒ¸½ÊÓâV_xS“a@\û£‹)L*BJã™m£²xóÑÙÚ~s-V'–^Í<\¾ÞólŠñlﲋ¤G"lfÓuŠ”¥®N¶t㮢@I?î ¿å Ø³åd>Vë*-ËŒ˜¹=µ”®~Š›J®e'A/rBØX+$¨u õªá\³ŒCÅÜNT?/ÊœµË\¤)ÈR&Å\‚€™m¥G’½+ß%/i ò ÑOòl“#ÍnéÈr •ÐB¸Jb0›-Çú õ•èG2x§°ì4*€}’äý­>×åñ{£žvyI¦¾[Cš6±ï´÷øŠ”uÆó«ìq{•§Ä¬¾ð§&€¹÷GR˜T„•Ç!2ÛGdñ磳´üá>úñ–ø“bWû´Ë“™,k…¶2¥¾§”Žá‘ ¨’>øÂ[Hàá» Óîw/½c-ÞîVv°¯ܶ®e±¤Ç•Ôeékm=Fö±!çSòÓÙ#½Å3»ò²+Òg+3Ȳp†Òfß[á% ˜w½’G¯Þ£Ø|CQàûV—¬>#5}›.cMõž‰2]@ö”=qmN6ßCºÓØ“ßZ!ô »6Ñ‹?Á*dØÊð•³r"¥‡ÜJoü”KH[:G²ÕÙ$üú nï´¢]êz^ÂqŽSëTWïiK îQeÒR~¤Ñ]/1¯þ[.1-7‰®¯ ÙDið^SkZ‘i¶¤„­µ>t¯üh9Ûç*Ñ&óϼÝ1ÛÔ¿ !̼εGkR—sa!Θq¯¾-ÁW­$‡ ŽÉÑ#Ì{˜žÞò6o—8Q^ðäH‘ÛÛtä…2•L) oOó BÓÔ)² ÕòˆeqŒÖôâ|BÈì^"å·yÑq6u¹•Gœ×á8€¶‚™-^å÷æ®Ã}Ã+ãKj7,fá>:Y½\q¸’ï)é†Ö©J[ -iike,,öÙ*Ùîh&ø"TK¦]&GìÛÅfî|ÞG•=V=|˜Jœÿ"I ú ‡7´Ì$¹ÂÎnÂ}«n-×(µEZeÉ“íVU´¸¶\Y ­¶ŠÖ¤)A$Ÿ€!Iv¿]íþ:à÷›ÞkLÝX³´›Äw”Ëרêq qçøkÖ¥%M¸‚U¢Ù«\ˆJÇrפ^´÷QïAòÛ'ˆMµ—Üïäù¾LdT6ïòciÚ6òY¤ªC $wFú¨?VŠN¶¯-wH7È7ž@õè^­¬Ü£M“¡%ÆTV”õѲC›B¶J•±Ä…E2¨P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( Þ_àýóvqûýŠâý…l¦éî­Øˆt€ÛŠæÚRRT¤J”RT ’jwÏÇ,P¯7Œ¿eû½›œ;jW%ÉO2ïÉù –Яe­>ã­öØGÊq©vL{¸{jËrsnBã9:Ûq J’CÊq–Öµ%DÝiø{è´Êü ¼âQ®oJÈlS]²Ha‹”ho<·b‡¿»q\›JT“Ø*R’H Ô<@ðëÄì– £=µÝ$]-ˆ˜äfÛ™Íå*CÍ—ç´†€l 8 ¾A}ˆ) ‡xW{Çm÷2nÖ‰3,/l[c<â¤Û¹¨ uv€ÙÒÔ”+¦µñR€V¨9ß<8s±B¼Þ2ü}—îvönpí©\—%<Ë¿'ä2[B½ý–´ûŽ·Ûaª(?ö³ÿÒÿÚ ±¿ÒǸO·Nº*ß:Dc!”Çx²ê‘Ôii!HVt‘؃ØÔ¿S’úÅ‘ä8¼ãsÆo×D‚ёRã»Àëiä‚އmüw¹f9uæL©·|ªñ:Dèé‰)Ù3uo°•%µ©J%H JTv6~ eyE©pœµä—Xk¶…¦£Ìq³,òXl¤Žs­lûè8Ê¿ßg]…þuê|‹ q/ ®ÉZßæqWPž[;ØÐ ˆûïÊ}É2^[Ï<²ãŽ8¢¥-D쨓ܒ{;„ûqyVùÒ# ®;Å—TŽ£KR£Ý$v ö4,YC‹Î7ð(,m9¦ca\g,yeæÜ¨m¸ÌeDžë%–ÜW%¡T8¥J;ÜÐyºæmõÙOß2‹½ÅÙ­¶Ô•ËœëÊ}<••(ò =À=î(?m9žaav<‹Wx·; …ÆŽ¸“eL²µ•­´¨qJ–JŠGbI'½i> g“/Lä’ókû÷xÍtžåÉåIm½“Á.•r Ú”t¶OÏPUÝ.×KÜçnw«”©ó ¹"SÊuÕkÔ¥OüMQ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(>Á㈘ã·üÒÙŠYÛ.ä/²Äë«w"<ˆì¸‡SÑm) –ÛjRŠÖ O¤$T<Ë2º‡mNy-ìËL[^º¼úqçîß¿]õóš¢ó'Ìð{ÎlÆ-8}ö örñ‡*Mù™ÛÎ%nuLFÊ»$„éIÖöykFAâw·_ÍöCî½ÈË×™ååzN…ëä{ã¯öuþ5D Îaj½ãKt›¶¯V¢kƒSÒ[÷^Ø-‚ò€Pt é5—=ñÒõžÚ'CŸ#$L‹ªÐ¹;’>õ´(,,ôaØ*H!*ZÒŸöBt4ܳ'û¨vÔç‘òÞ̴ŵë«Ï©ÑG~á­ûõß_9ª(¨(?ö³ÿÒÿÚ ±¿ÒMŸñÙßò¿ÈÔ¿S’ÚŒ” Ð4 X¬J™ 3ØëÇmåÊŽÇYƸ«¨–Ðò×Ä¥]Ò='Z!w•Dv]‹Nñ[$ë¶SÇ‘ålC±D¥<ëEæ£8ÚBÒÀ_£‚CŠËBÒ¦ù…$i¥ ì©)¤€™›¢ÓŽøn~׋åg†ð¸Ê·u­n:´¤Æ¢¥ Ò¤-! hèòûÚN‚B“Æ{e²Ý•DrÑ#qæÚaËóš Dšâ›Ó’lvÚ–•i$‚•m(ù :xCn¶<æS|Ÿ‡¬V%L†™ìuã¶òåGc¬ã\UÔKhykâR®é“­ÖÜ®6#”Z²+½¦ iÉpôÈ&Š4Øñç©õ´$·ICA*Cøé:êöHÞ€Cݲ\õs„3‘Z“gc"-جɆäȪ 2˜‘N-Í!E „úÜÚ€Ù~)AÉ1Ã[-’/°mh‰n“ŽFr:œv,p°ËRzái*HØPX'|¨2^2Ü-’óÙmm±gm«Zž·Áf#RÞe<^‘Óe G­Þ¢ ž#áA'Âu±ç2›äøÐ$=b±*d4Ïc¯·—*;g⮢[CË_•wHôh†ùŒ{93­Vâf í—ä»*×o™TtËTRŽí¯‚Hm-+J}$7¡ ¬Ô̱ç–Q…Y,ddx)mÄY"H…r}ÅpSñ£>Ò’ÈSˆ(×(¯ÒžE4s\ŠK~+½iÁìØÜ‡ØKò1Ë{ŒN’‚”8òXS% §äR¤ %#z £ñ–ál—žÌƒh‹lm‹;mZÔõ¾ 1–ó)âôŽ›(J=nõHôñ ,6èý§$"aèÌ(¸r ”–õÉA q .ÒîîyzE­¼X]YÇYf’PÊ,Ï_Y„»÷€‚Ž¿`4Vš ×–+ušõa“ ´?w°EŸ=°‘J+qµ–‚='¦èô¢Sé"ƒ+†Ý´ä$Gò·Ê››‰©@¶òëÜu±ð"ª¾.ë†á>6ø€ÍÞÒÃVôÏ»@·%›$[ƒp\ód6´Å|¥¢”¥% vÐ=ª"k‹m·3ºL¹ÏŦͻãM\±wæÛ"[­Ëukh¬b”ÆiÀÒd /m—$«`’£ç‘%âù®6q f5&ë“Ø¡.LfmPçBT×[j 4ëki<‹H!M€ŸQàx«¹nÉyìÈ6ˆ¶ÆØ³¶Õ­O[೩o2ž/H鲄£ÖïQ@„Oð ¢ÃnÚrH#Æ€ù[ÈeMÍ€ÄÆŠT Ûy Fõî:ØøU_I0±›wŒ~&[“‹.,«£8ãD0ݹ©)œAKºa 0}ì(' ˆººØ±K6TÜ’ŒE˶ÄøH{Ë‹8»™· ÿV²ÛªNþòV Gbš*ƒ<…kÅslrlQˆÆ~÷E—9ç! V¸²Ô·ã¨e´8…ImmúÉJtRAßí–ËvUËDHÇ›i‡/ÌBh5kŠoNHa±ýÛjZU¤’ U´£ä€ Â^¼"þÌl~Áïs˜<¼V%ÂD´¥j ò 8 j =iR@$ë°"vMuÆaøŽÑ°'cP£ÅŸ5ûy‘jnxB|Ãì°„-*o˜RFšRÊ’ H‚nn$ãþ"ÛZÁì–9/_­pÒ½T+ƒÎ„¥OÆŽûkKI[© (P!CŠ6R†i‘Éã °Û1Õ³kT{+ªEŠ‹1Æô‰ù~—Gks¨R „”èö¢³,‡mñO2·[¢3,\‚âË 2ØCm6™.¡)’À "õáöccö7{œÁåâ±.%¥+QiÀ[QëJ’']kò[»|Ff'‡v¼~\ùqaÛe¡ˆ“ ȸ„¼¨Í>ÚÛJK½‚r%Z¨/®¸›^!x¯u‡cÆÑqµáÐÜö±ûZ]Íqø¶ám¨Í·ä(ŽIO¥³Ë¸Eo•ãÖÛ‹YnX­ŽÁ:f3V=먖Ï>¦"u½ÏmK©èê‚êF ÆËºÍz°É„‹Z»Ø"Ïž‹XHˆ%¸ÚËA€“Ó ôz Q)ô‘A•Ãî·_qk²³Õ¡&ñ RãF$ƒÔSAs 4[XõNôEÌÔÃÆÕ°Ìä–Âù4‡[u¥-·p) zT?5’¼GËÜ¿=’?q"cì&#‰‘;±Ë kË­„ðO„hhh ¼ƒ"½e75ÝïÓ•*RІù¥ B”!H BR); ÉÏ2´eQ³dÝG¶¢%”1+˵¶Ã,¥–ˆO;J·°¾]ê I$’I=É5Ež;’ÞñKµl3y¥°¾M!ÖÝicKmÆÜ Cˆ#Þ•ÍAj3ddäÞÙJ¦ÊŠ ¼•Åeq×€ÁŽPYé„é¾G¡Ú æçˆÙ‹™<,ÅWt‹­µn¨ŒÊ[Š„–š ¶²@J@ìh÷ «°ßîøÍæ.Cd—åîœê°ùm.×¢9°FÆö¶ˆîª+É$’I$÷$ÐXXo³ñ»›W{b!ªKáæà±-°H÷ôÞBÐHøƒÜhÐhÇŒÚri¹€—i[”WaÌwØ08ImÕóp¸×G¦µ¬“Ée%jD‘Ú áoñG.µ_$d6Ãd‹.T[žK8ý½×D$°élëE\9Øv †¬êþo‰È[nÎ̤µÐ-±e„Ôe£æ\d4_ûÔ‚{˜jŠûþAxÊ.Ž^o³—.[¡(+)JBP”„¥ J@J”€R Xo³ñ»›W{b!ªKáæà±-°H÷ôÞBÐHøƒÜhÐ]ÌñC1Ÿ‘ÈË%¿k]ÆcjnZ½‹3()Ââ”ó®“«+<ŠÖ’¢@ïØj®çù\Œˆå2î-I¸)¤°|ÄF^c¤”„¥®‚ÐZé€áÄhh UŸwùwÝc9Á¼(Þã©*bJ™l†x§‚SÁ)ÐH :u¡PgÉ$’I$÷$ÕìünæÕÞØˆj’Æøy¸,Kl=ý7´>§`÷4÷r˦N¼ÆsÖÅÝJÒúÓg††¤òQR”ó)h4ò”¥T´¨“­žÃPp^{•=‘/*•qnUÁÄ”dÄeæTÐHJ[,-®€Ž…§¿ Öõ±î$ŸrFï ¾0›;ºÀŒë,Øá7Ö¹iq’Ðe}À;R ì;öø‡˜¯)‹š*ñø^Bb<#´(O%¶‚zh Ò{õeŠýpÇn^m©†¹Lì Ì„̶Á?ÛÈZ ø‚FÁî4j‰^[{ÍoßòÃr{û/;xU)JZÒ•¬©D•¨Û'BƒÞ%™äDévDVž—ÈOy˜,KBØ^¹ ¡ô-=ø€N·­q ‡Tç™94L¾íÐntc¹Õ+m¨oJ 4Ú[ä6}\yoG{PgÉ$’I$÷$ÕêÎòw2º‡ç1"àcµJ~´ã-´†…²´Ö@õ$ì¤ß½ þAxÊ.Ž^o³—.[¡(+)JBP”„¥ J@J”€R ÷`É.ØÌ·&Z]`)ÖúN·"+RYuŠÚu*B†À=Ò{€h,ñ *$k,—.»ŒvÒË>jÝöm)ÒPˆël²„¤|Oq£Þ –ÿŠÙÄŒ–V\»„Üç°äyªjÓ ¶¦!k+X}”´x©G‘.%DžÃAϳ2xYŠ®é[jÜ'Q”·!-4l'd€”€ ØÑïA›$’I$“Ü“T( @ P( @ P( @ P( AëòcþÛþ…R}j"Ö” P( AÉ_Œ·û5ÿšiûìÿŽÎÿ•þF³~§%µ( Ç…˜Ý¢öþAu½Àj{ AœÜ'¥ìÈ}rŽÚ]p)% …>¢žÉù@j ±ðãEÙܓ،*Þ0ö²YÕrPŠ&.hƒÒ29…ypîÜåÔßzõP‡Š.ÎäžÄaVñ‡µ¢Î«’„Q1sD‘‘Ì+ˇvç.¦øèsת‚‡$Æñ».WÈŒ[Ÿ’YZžÕ²eä³4’댬%Ô’Ï&¤’ðì´úνAIâæ7iŲÆíöˆ~QÛâJy†ÝSÑÛ}Æ‚œK+eÖv}+ä {éJ‘~cv‹ÛùÖ÷©ìX-spž”c³!õÈf;iuÀ¤”6øRˆR{'åI ³Ë¬ØÆ/‘Xî0°Æ®,dvFg1fóÏ8Ã2ÔóŒ))[KêºÙS (Ížiõ¨P~d¶\NÇâ3V{n;o”· Ç­SoˆPnJm%æW%N ” òN‹©!]ŠÏ°Ñ¹á¾.Îyv¶ÂÆ=¥263ë nSË2à²Èq¦Jƒ²Jë‰é¬•ôÈJÔÈc¼aÃbá׫8‹k6¯lÙcÜÞ·u”è„ò”ãn2¢UÙm(ñQ*Nø’H çáf7h½¿]opžÅ‚Ðg7 éF;2\†c¶—\ ICaO…(…'²~Pš kØç†6¦ûôT+uÿ8pçIœü×ú™(.DQ}Mm‡T“É]”6£ØLJسÉíç–¬V¾e”L²¥§îŽÚ]qa¾‹¡m-rø( ì+`„è×øhijBÜϱ{œ{¤F·C‹*âät'ƒÌ(HK䨂4âΉPâ!c¶œÞM‹²Ã¶¦ÔË0§7 ÷ÝesæJ Î8°éZ¨ ‰ ÷áf7h½¿]opžÅ‚Ðg7 éF;2\†c¶—\ ICaO…(…'²~Pš ´oqòÈÒ°0¨÷,=WøÖ·n+˜—”Âì°°Q“N)+S mM¤¹ßdìHxƒ"Ý÷8Áéâ©»¦§¸-^|¥;o0|¦Š´ï[‰^‘ÔÑÝ-²ã8—ˆ¶ˆˆÄ J‹>7eÛ—%ØI}à9˜Ï´êVëcÞ•‡Vò–謯‰–‹v?âFW`´Gòð-·¹ÐâµÍKé²ÛëBÉD¨é ’Iøš"#&ß!…íK +ÄgK+1ÇÐÙä@å¶m{íê×Î Uh²hXö)âÖUbˆ"ï æu¾ÛmrKጕ!¤¨¶ ë€$q,(’ QÑ"Ã%²âv?š³ÛqÛ|¥¹8•j›x,BƒrSi/2¹*q¡’t]I ìVx‡¼ºÇŒáÞ&[íÈÅ`͉.'$Û¤I’¸¼ò\òï´êu°I(XqI?:ÀÙ+-âe¢Ýø‘•Ø-ü¼ mît8­sRúl¶úЄòQ*:Hd’~&ˆ‡ˆÉ·ÇÈa{Rà ñçRÊãLqô6y9m‡^ÆûzµóƒU_J¶xqŠÈñcĈXŒÍ‹ rå!ˆ²¥ºÛ¶æ¦;HuÄòx¡!À£Çn+‡y*¢?!xyfFGz¼\ìV‡ípñÆï¶èîO¦ß8»!¨­«¬ò’ûl‡QPZÒ¤–Ô €î³&²cÎc‹ÎŠ[å[²K\y®Z¤Läxî-çp6ë/%Å$-•)¸®Ê*ÉY_-ìÄŒ®Áhåà[os¡Åkš—Óe·Ö„'’‰QÒ@$“ñ4DC Ú–WˆÏ:–Wc¡³ÈËl8Úö7ÛÕ¯œªú,<W‹"ãÐqÏjýÏ=r˜xyŵ5-!¥A×82V¾)PZº~ÿ}D\JðªÅ*R dO•ˆ5~ƒŠù·•Îyv0RVPBRó½0¾§£‰;ŠÎg˜õ«Ãì®Ð‡Öù‡ ²Fšls¤ÌZ ÊqÅ6¶Ð¦_mÒ ¶”Vµó);#tEŒ±ÛNo&ÅŽYaÛSje˜S›†ûî²¹È@ó%çXHt­ÔFÄÐgñ™Vø—0©øÊ/êq=(ðœyÖз” È2RâÆ¶R¤’HïÛF®KeÄì~#5g¶ã¶ùKr q*Õ6ðX…ä¦Ò^erTâ B$躒جñ;ƒ÷6µãø6xݾ n»&m¶жɑ1È­Ju R¼«¬¼ÚÞG-„«šÒBŽŠ´@ΜÄñŸ$ج¾اˆQÙ¶I‚©7ÇUÈù…´S(;ÙÞm¤’½lî‚§ÆXí§7“bÇ,°í©µ2Ì)ÍÃ}÷Y\ä y’‚óŽ,$:Vê#Hâh3øÌ«|K˜Tüeõ8ž”xN<ëh[ÊP ä)qc[)RI$wí£FÇ/‹bß³­xU²ì·`Ån]žT©n5â´¤¼ËN0ón,¡{F”µh•$ò ‚úå ÂkOŠ{ÚÉa·EµZ.›ïÜÜ·®ôŽRK.9 6^@ÒˆÒ÷š åÖÄÍ—?n$ìC}‹”Vd[c1x~=¥Ô8‘Áî»ïB Ø[¨!d‚S®4ü\Æí8¶XݾÑÊ!Û|IO0Ûªz;o¸ÐS‰aålºÎÏ¥|”})@r!I‡ˆK¾4ÄË$ ¡xÙbáqòQz„)×y·¤Ëÿ1ÈõvÑ£g—Xñœ;ÄË}¹¬±%Ää›t‰2W·žBKž]öC޶ % )'çX1VðLq^,x‹AÇ=«÷<õÈXl>aáçÔÔ´†v•\àÉZø¥AjéûýôDlϲàÙÞ6$á°×ÿj‹6M’d©*nθ¶œl-·Pè)Sj!*Y)'Š·ª+âe¢Ýø‘•Ø-ü¼ mît8­sRúl¶úЄòQ*:Hd’~&ˆÍÕ @ P( @ P( @ P( @ ƒuù1ÿmÿB©>µkJP( @ ä¯Æ[ýšÿÍ4ýŽöÇgÊÿ#Y¿S’ÚŒ” Þ%–ÏÃçÉ—,IŒNˆä°æ!JbTu詵ñRT$¥@¥IP)ª ±âÎA÷BåéVÛR¢9kEZ +ò^Ïj>‚ú!I åÏŸ1Ë–ûÔâÎA÷BåéVÛR¢9kEZ +ò^Ïj>‚ú!I åÏŸ1Ë–ûÐFâ4»­ñ7k¾3b›¨MÛ£ÚÝaÑ<ɱbDjVàɲ†cGFø¶€¢¥µ(’¥J‰$Ð1,¶~>L¸qbLbtG ͇1 S£¯EM¯Š’ 9%**JH U+ŒWˆ9brÕãv)+m¨ÜD„1n`c–žC¨X´²áVÖ£¾Gb a—Ûy]ÍŸñÄEu€Ë–ÕyÇ#¨òßP-rúØwC©íÛZ'tv¸øƒ*ñ~xºã¶IQaCE¾=©Lº˜FFø¶ž.F‰*åÔæI;QÙnU”ÜrëšnW£0–Xn$hÑ[鱆ÆÛiÙ!#üI$’I$“T{Ä²Ùø|ù2áʼn1‰Ñƒ6Ä)LJ޽6¾*J€ä”¨©* ‚5Ae7ÄiW[ên÷ŒbÅ:+P[¶ÇµºË©‹;zà†ÊK© ‚yu9¥lžF ü™â,»¥ô^/8ÕŠá›·1lu‡g¨ÓÇ’’ ”¤JAïPQ ¾Ø‹ÊîløŽ"+¬\¶«Î9G–úk§Ð¾ÃºOnÚÑ;¢D¿%\²hÓ²ËfÕ¸­e2ˆÃMì¡)麗N”J¶\$’yoÝPAÎ2Õg$Ì¡û ¶Õ*àë’%¢¦óî8¥­Òu•(«Ü’Hï°…^°ÝØ»?dƒvÏ4Æš§’ÑWÁG¢ãkìtF•®ÝÁªDÏn2³+®dÞ-aŽ»û/³x€Údª%ìáuÕ8yN$•ñWÞÖ€’„”€AÜ‹WäßÐZmDZ½…ì~‹žHÀß.†¹õuÏœùú¹n‚,¿%\²˜y-׳ÌjÛ¨­j‡–Æ›Bzn¥Ý$í[.TIQVÍã-Vq’LʰÛmR®¹"Z úo>ãŠZÝ!ç\)RнÉ! ¤ŽûXõá› Ý‹³öH7aóLiªy-|z.6¾ÇDiZíÜÚ¨¼¾ø‚Œ‡3•šOÂqî­Án½: D£KÎ-K[§“åÄ(©_ùk@³¸8ÎÏeݲ&ï·‹ žk ÆD&mn2â!³ Ò@BÒâ@÷ò $’Ty‡oô—{û¶¶g ·ÚÌ‹7D[át"FC#ï(J·¤(mD•wQVÎÃ*ûïIyÉ2SŽº¢µ­GeJ'd“ñ$Õ 6‘€Þ—}‰c¶\ßTg#¶'uÀ`¯@ºÚ™qµ¡À6‚¶9wÑ~Œ¾Ø‹ÊîløŽ"+¬\¶«Î9G–úk§Ð¾ÃºOnÚÑ;¢büO½/2³æbÕiK¸újÙ0¿) ì´’¾jâ²Wµ(’®äŸuAOŽe7 o)…—²Ìy³àÊ[§§Á䕨 ˆV•ï÷½Š¢©÷Þ’ó’d:§uEkZŽÊ”NÉ'âI Ð`Y´Œô»ìK²æú£9±;®zÖÔË­°±È뾈ƒÜ<ݬÆß™Xñ+%¹Ûcˆ}˜m™OF/ ’—ynh럤v÷ì+ìÙ¶Ü_¸\l¶ëà”•Ù¹%Å%d¨(«“kC‰VÇÊJÁîAØ$UÓãŠZÝ!ç\)RнÉ! ¤Žû ¡@ P( @ P( @ P( @ P(n¿&?í¿èU'Ö¢-iJ@ P(•øË³_ù¦Ÿ±ÞÏøìïù_äk7êr[Q’@ Øxm‡AË&]ä]“=Ø6Kqžìk~„™kSÍ0Ó •©N¼¾*б:·ýXÅùÉD_WcN6ÞDˆ áí%-rDDÂåÀ§©æIO>ŸÉá¾Ôô=cç%}]8Ûy '‡´”µÉ —ž§™%<ú$o†ûPð» •µé.s6»–7í»lI·x–É>²b9%öËAAÆÞà6‡qAÎl'É$Zņ}¡´¡§6sS(R ´Ûmº…o’T”ëDw:Ù¢ÇÃl:Y2ï"ì™îÁ²[Œ÷c[ô$ËZži†˜h”¨%Juä ñV€=‰Ð¨,2¬K ïö÷®ŒäY®övî‘!¥ÖššÛŠqM-‡]R SÁÆžÃDž)ô îAáœ8ùÌ\rÏ9øðŸ¶Ç»LTðí¥…²u2 @M¤ï°IVÒ8…4²¼SÅ|T8Ï–¾Ï°:ÌOžf<Áæb²è*s¢´zTéìÜ7ñ¢³Yý‚+žd˜½¹Çœ‹g»Ì€ÂÞ ¸¦ÚyhIQ¢7 þˆ²ðÛƒ–L»È»&{°l–ã=ØÖý 2Ö§ša¦%* Ry|U bt(5­x]…FÊÚt—9›]Ëöݶ$Û¼Kd“#ªY1’ûe  ão ð C¸ eð»Îs{µK±ÝìöÛ¨]݆íÎ3òh–Ž387‚ÔêWÖãÁ-…V¶Bžfo¶çhÇåb¹;íKŽÛÐ-eG•*QX!¹-!Mº‚9âVõ®>ò»ÄÜJ“û²€1#Év,²“& ®6¸Ï€ ˆ'GA? ¥'`_ °è9d˼‹²g»Én3ÝoГ-jy¦a¢R •)×7ÅZö'BƒZÇ„6³ð×á\qµ_íÖ”&ç%ä­M*Wž¢VÛÇl’–Α³ªÄøIŽŸÆ5}Z›°‹²l)[~ÕT”“oçÓ)ê€JÉéoŠHá˵UûÇìYô\e6œ¢à©p,q‹fæÄ· ˆâÃd$mD†‰îPô~&âP0¬ŸØ°”‰K±e”™0]q°¥Æx¤\A:: øm);*±Vì/_bÆÈàÏ— õ†TÜ)ˆŒèRˆAkiÑ¡½‘Ç¿Î*ªï ±áø‰>7xEæ]ªÉr›*#>Óré>[G7T‚”zRIPm]À ˆ‹KÖ ŽÙ³È˜óü’ìÜûtY¬Z!ôý¤‡ßm+ò®(!@)!D•‰>Ÿ@ÙÐqËqœ/Ì×g¼Û/׫ó«“1&À’â¥0û†;©R‘²Aî7Ä‚š ÿqÜwËWc­\Yò‘c‰ÌΖܕ±1M…¼Èq 6l«ôRðÕ6*Ý…ëìXÙòá>°Ê›…1 Q(-m:47²8÷ùÅUom~[®^(fø«oÎrφ»pZôû-È}–%IuÀl’´¸¡Å) V»j¢<Áðª¹]勪ùÕi³¢î˜LËbT©Çe–˜’Ò N…ºò4êPFô’5A_”âøf~·¹s´ä3í»CWqpjÈ«S‹mm¼â£¸•”8Ë©ìÚ ôžÝÓA[â®;Žâyjñìu«‹>R,q9™ÒÛ’¶&)°·™!¦Á •p>êB¾ ¦Å[°½}‹#ƒ>\'ÖSp¦"3¡J ­§F†öGÿ8ª­ª<8Çcg¾!Z&;u“hÁŒ÷PÄgLɳ1Оe) 8µôÈ*Ò~h‹>cð.’nRÅðÙ‰3–3o m¶ãÈc¢\((V¥,¹Óù ß¾Å$øIÀºI¹KÃdF$ÎXͼ-´\Û!މp  qZ”²çOä'|ûGļ2.rµ*Ü'" öÑó™Ü|Ã-»ÈpYHHQ B´ ”ìhèoTExÛsæRÅÉøˆh”3ou¶\qÍ$¸´¬!:äwÁG` wØ£gzÁ1Û6ybß’]›Ÿn‹5‹D>Ÿ´ûí¥~UÅ($(’ Ñ'Óè:‚ÙããÄYx¡]å󯛫vF–ßµ,¶…w>=dòQ$6NG¯H |Äq? Xnp¯B™3²mÆkQçÛßx °ë¥•¤©Ž’I „ÑY¬þÁÏ2L^ÜãÎE³Ýæ@ao\Sm<´$¨€Q ÐDC°/nbÜÊX¹? †mî¶ËŽ9±¤—•„'\Žø(ì®ûk2œsÂ2Ä@¹Ûï×(2íqf¢WbL‚óí¥Î‹ë1ÝJ”H !òIô覠Óñ‹‡ˆWlvÒ‹Ë0q«w+Äg®Öúe’\Ž™ m¦›qô¥N-HmÅ€¾XñœC+vIŠä+€ôV߉›ÜT»ëÑJÓ) :Ô†Èå¥! Þþ ‘ÇÅ\wÄòÕãØëW|¤Xâs3¥·%lLSao2CM‚*à}Ô…|5AU‡Û ]¯[çZ/WU< cÀ³ñó2]ØÒJÄk‘ØBÏ`5ßb&]Ša˜6h»Ué7Ç¡‹{—nmö[›KˆJ•÷J„©VÔ'° $ñ‚óýãÈË.1‹·—­vÜz5ùëseÒK² (j PAHw©!°UÓù'äoÓA[yðúÅgˬðX´å8Y­»¾Õ#ÚEÕ8¶•jé‘´¸ËÃh“Äz΂‹ÄÜJ“û²€1#Év,²“& ®6¸Ï€ ˆ'GA? ¥'`R¨P( @ P( @ P( @ P( ¯ÉûoúIõ¨‹ZR@ P( %~2ßì×þi§ìw³þ;;þWùÍúœ–Ôd P(4xF^Ö'&äÜûY¹[/V÷-—© µ²¥¡ÀPç-.6Ú)Pôè‚ A£ÿKŒ*òàsÞ6å8ϲ„Ò’°êH‘Ã]n°êóéñÙ#Ž»P?Òã ¼¸Æ7¹`N3ì¡4‡D$¬:’$p×[¬:¼ú|vHã®Ô׌ëȯQ]¼âc¶ÚÚ´ÛàǹôäGiµõËjJÖT§ ‰k‰ê%: ¼ß-}Ê#ñ퉷A¶ÀbÛ(tº¦Øh<Ü sQ%D³Ø¡TzÂ2ö±97&çÚÍÊÙz·¹l¸EKý­•-‡8¨!iq¶Ô J‡§Dj 4?qäæo÷LÙ6Û¥»$\’•Ã($¡õ8ã CË [«Òš +X:Òx¨WˆÒ,÷«Ó bC ^™ Ü[È<¥írUÔ)KS±’ƒµ¥ ùÚw³ð ™7‰ðs\ú&c“c:‹4V+[±á8¥0Ê]Lr+G-ÉJHm$%)ÐRø‹“Yó<Âç•Ú,³-~×’ôé1äÏL½HuÕ¸²…%¦¸£ÔI #Gj;ì˜F^Ö'&äÜûY¹[/V÷-—© µ²¥¡ÀPç-.6Ú)Pôè‚ •ã:Çr+ÔWo8„…Xí¶¶­6ø1î}9ÚmEA}rÚ’µ•)¢Zâz‡IN†‚Ãý.´»Ü…»Œÿø¿"ÀŒiVÆæ”º!!IZHR~úBWÈ §{xö wÎq»ýÖµpù ²Z­mÚ`ÄféÂS-¡Å9Ô2 E*Y[޶¸éZ ny˜§3ºC”ŰÁ‹n€Å¶+K_w¢Ð$u‡ &&+ŠP)§ÖDZÛcßTn‰¸Kž(ÜüHÃû‹Ââ¹3S ÛÓK1®:§<Ãk1 QÈñmm«J•+Z¨3²² .fG&é3¾Ì…1O"]ù.Mó\”ð˜éI'Ý¥´¯y;Þˆ 9ž&@Ø2¹8¨zߎ3$u‡ &&+ŠP)§ÖDZÛcßA¬¹ø‘e•âtß-VKý¬\ß‘2KQ²œ¦ä<âÖµ1%¶ÓO¨•!}·²v5ìÿ¤Ý3˜¹l¸÷f 0b¦ éÖ'2ØÙæ&©JuKZÔ¥)(­^‘Û@ŸâÔ›¦s-—ìÃ0!¦ TÁ½:Äæ[<Ä•)N©kZ”¥ …«Ò;h)<@Î&g·¶î²q†bÅnVœ©%¤’vãªõ8µ-kZ”@Ú–tÐûáæO`Ä2n_ñ—oA–V"6ÜÄG1ä’8?ëiÔ,£¹ RäA;Öˆ{•as297I˜Íöd)ˆ*yïÉro˜*ä§„„ÇJI>í-¥{ÉÞô@h•ãgoRž‘‹8«<¬y¼hÆEĦ`Š…¡i_š(;w’$·Ä£ÑÇZ ­»xb¾åKËœ- ÛâÃbè”ÊZR–…9%l¨)\–w¦€â@N ªñ&³æy…Ï+´YfZý¯%éÒcÉž™zë«qe KMqG¨’FŽÔwØ=xy“Ø1 ‡Û—üeÛÐe•ˆ·1Ìy$ŽúÚu (îBT‚9Nõ¢˱È~ AÍÇ®“cF”™ÏÄ»]“)ÙR¢¾N>–ÚJ¸’ (o¾ÀyÆ|@‘i¼ßn7èn]ãäñ_‰whHè:ò]u.•¡Î*XqP%*ˆ ƒA9ÿ-fXÕýX˜]£aˆÐ­nÌæ§eku!ç¸dºâ”­! ƒÄ;ÐcnW —{Œ«­Åõ?*kËûª÷­Å¨©J?âI&¨—`›a…-g#±¿sˆã|8G›å^m[) (ZwØ) '°: 7üXÇœÍ!ä÷Œé‘-–í–¨Âæž³ oû¹:ã%çµh)°ðí¤`®ƒâ’Ù‘^'ǰ]¦Zr(A»E¹^Rü¹ÜK¥ÔÉK Xq¶Ö m]ÒwÈPr¼gXöCzŠåã}VKm±«M¾{™nDf›QP_\¶¤©jRœ*%®'™ÒF†‚»<ÌS™Ý!ÊbØ`Å·@bÛ¥È/»Ñh%×HE÷=ø¤k@ ÍÕ @ P( @ P( @ P( @ ƒuù1ÿmÿB©>µkJP( @ ä¯Æ[ýšÿÍ4ýŽöÇgÊÿ#Y¿S’ÚŒ” ÄË$ÜœŸu6Ûe–ÞåÎá),u–†R´ 7É!kSŽ6 ’=[$PhÿÑ ¼¸\Ê5·`NMíQ—L%,4”ˆüõÖë—§‚yk½ý°›Ë…Ì£XÛväÞÕ‰tÂRÃIHÏ]n±épêqØ'–»ÐW^0œ_½Efý•\Í–ëljélŸЇÞy·Rã.Hl6BêU§¥#¶ÁØ^#b6Ì' nÇm½J¸î iO0“Öy°çEhK®ŽIJ‘½(è’>°ŒA¬²MÉÉ÷Sm¶Ymî\î’ÇYhe+BC|’µ8ãi©#Õ²@Wœǯ‘»å΢Çrµµw=›iqù -\BÀ”¸—‚ 5iG¶Âò×àšn9s¸ûWËŒ¸‡o#ˆåºÎd͒ò†ÄRêtáwB;l4Ñ—V5ÇÍÕŒÜî™Aı֓bm¹¨té\UI‘#}Ru£®úWfx÷ÜŽa}Å<ç›ö-ÊU»Ìtú}^‹ªoŸž;ã½lë~óUðŒA¬²MÉÉ÷Sm¶Ymî\î’ÇYhe+BC|’µ8ãi©#Õ²@ºÓà›w\ Ú#_.S-Ò1ïº;{öë?™™-‚ ŽšbõS§ù¤€á è‘Þ‚®Ëáj²,ÒçÛd^Ù‰g‹æå®m”·=)´tÄ48²\S®¡ OS¿ IHÞƒñ â‚ý áx¹[mxå¼\g=2Φg6‚ãM%¿(§ê@×SŽŽùPRçˆÄ.›qóð.¶önp%)‚ÊÝŽæÀæÙ*à ¤­$(m=‰5Gîˆ5–I¹9>êm¶Ë-½ËÂRXë- ¥h@o’BÖ§m $z¶H Ò'Â(Æú¶U”bûžû§j{pJ¤=a)̨s’JzœG+–†èèŽ È^„¼¡bÐÎ<œ˜Êòe˜Š Ò<¯S]]¨zzœxí\¸÷ ®½a8®1~bA•]®}­‹œ)0ìí»$¥Ð PóHl4uÈ8¿öHØVÀAñ¶a9v;mêUÇpcJxÉ„˜®°ã͇:+B]trJTéGD‘ð «Æ`Yn—¨öûõÎl²ëĉN“¤ýín´5³Üòíó¢Úé‰X±ìòÿˆäY;Ñ¡ØgK„f1o/;%L¼[ê% «EZS€¨‹×†³¡eÖÜbÏqnàÝæ{”9N6XãæúG’Iép@R—Ü€”•lŽô÷/íÖ¼Ç ²¿—­vLrÓó&æÝ¸—]eôG-¥¸åÁµ•Êm:S‰’=ÔŒã…Âqî>~ÖÞÍÎ¥0Y[±ÜØÛ%\•¤€¥ §±#F¨ƒŒÀ²Ý/Qí÷ëœØd(7ׇ œ 'IûÚÝhkg¹åÛæ4Û„S.>#dØ+'œ‹?1æ1O<ëlH $µ*%N8â›JQËÞ¾êÐ& åÃ&ÉïV¹—k¶×ÛÕs¸HŸhSh ÅRÿ½.:ÚBzœ}[å­ÐJ_„‘¹I‘#)PÆØ°5’&äÜO¹ÇÂR#—êõ—À¤¹ÄqQå¯yY¼ã…Âqî>~ÖÞÍÎ¥0Y[±ÜØÛ%\•¤€¥ §±#Fª+ììSf-íë\6Ú+.1 ÊujØo’Or}KHÒO}èÚ+Â&Y¿É#'°Ä°5’¹r‰xBt6O—+~RÝB88÷ß.=êú#a7— ™F±¶ì ɽª!é„¥†’‘žºÝcÒáÔã°O-w ¬½`¶,zù ›®Xè±Üí] ÏfÜVü†\%!‚àJ\ K‰ ¸:jÒm…vwˆ.ò͹;d×Ï)’Ë…—› @q¢OM`éÙH Õöv)³ŒŠöõ®m—†e:µl„7É '¹>¥¤i'¾ôho˜-ÈØ·Þ²Çi™lv‹1›qrC¬¼„©´yr°æ”vàN’HQÚw™ð…–²iV¹Y*‘k‹`FHe¦2•HB’‘¬}÷ïƒi.qrâ7A[|Á¬ÞAß-}™¶Æ.±å"ØU)MºKf?P%.{΋¡ƒâY_°.ù…ôÅöli‹u› *’Ëï!.dË IJ9(8t¯OÄÐVxˆÛ0œ»¶õ*ã¸1¥<Öʸû&;2`ùa!H-„) uí tB}ÿ1ÅrŒÞÍp&õÏeeyVåN’#§Ò·.¡¨ö×PñHHڵܪoXÞKž^²Œ^UÉØ—¹ÒnJDømÇq‡yk-‡\ JB“ëÚI;ôw#·†ÙŒNeÞ=ÙSÚƒ{·É·èɈ´¼Óí>Ð*HR’ã(:ä‚{ƒ£Ac”å¸fe~€ÍÒNCÏg´7l‡5,4ôÇKŠuo<ÒœJO5ºñâØÚ}JÑØ],kÈ'°¤ÞÚ²OÅ[Åšž ¸)¶Ê™ O •(©°’ß=tÏ]·A ïí#)´½l¹^¡Ú­vX1È¥H˜ÒT¥•?Õ\A* )d¡¢SACâžxŒúýddHíVæmqU! ¡Õ¶ÙRŠ”†ý ín,„#Ò„ñHØ óá¶c™wvTö ÞíÆ²mú2b-/4ûO´ ’¤¸Ê¹'`žàèÐkØñk(L¦Íöj£®,å‹ô99ÙÑ`°àunBˆ‰.í'`-ÖÁÙ'˜×¿GÝA¼’øEvñvõ›]בL³\ß—uj3–†9¢k¯©hiÖ„ a![$8…,Ž¿C™;U¹›\UHChum¶T¢¥!¿C{[‹!ô¡?fàüì­ÈìĈ‰)rH#¦mNµÉ¡Ü¨‚tØ@jmþ#Ymù}þá+"Èî²{o”•r6öaΊò^iæœe”>´iµ°ÐJCˆv ÃÆ¿9›ê,jÆÛÇQ=<=¤•¢H–™¼y„õ<È*áÔù'\÷Þ‚²ïâ=xË-3›¼eV¨˜ý©«}¶í!Wª\[«â:©ZÞxñKÀŽCÔ­…‰Ùm·3ÈšºÛ[˜¾”&#H›5(L«ƒÈ*KÁ€µlêQÒA*$“AÃÃÉx-¿!óùû7àÇenGf$DIK’A0óju®Må@, žÀ’ÖFK¿ž½”;œf uԇۼǷ³ly;ÐâÂ$”ðRò44:!¤O‹¸ÉÎ%äA7Æ~‹R2ÚhÝS0)WÂzªJTÙÓ\TO>[$+/Ùö1~Í ä)¼eVç [YíøÍ´.rf!D™n :TR®žå¤$•(ì ñ;-¶æyW[ksÒ„Äif¥ •py…Ix ­€}J:H%D’h8xy/·ä>?fàüì­ÈìĈ‰)rH#¦mNµÉ¡Ü¨‚tØ@XÉÈ1)ž&DÊ/÷[æGj2[—pT›s1$?Àï –’ûˆKzJ4±Å$€‘Ä-ùEºíâ23,ý™¢É¹›•ɘéI[ûYYlT}>þÉ'[Ð ~Qn»xŒŒË?fDè²nfårf:RVþÖV[D•O¿²IÖô>C|¸d×Û†Euw©2ç)Ùo«àVµ|Ãg°ùª‰˜uÂÙj¼¢áq¼ß-0žqgÙ‚U"3»PI[|†¹Î ÷gÜCq/8ðÏ$ñ œ“-‰|•­¶zê†Ëò.“Û&Dƺ͂“¿RRéR‚ %* åoñËoËï÷ YGt…“Û|¤«‘·³tW’óO4ã,¡õ£M­†‚R@ã°8èP{•⥽ì¾Ý* ÎõÑn² švy’%¶V·\\ˆÏ(²è[®-Eµ,é<‰OpÏø§ž#>¿C™;U¹›\UHChum¶T¢¥!¿C{[‹!ô¡å X–%pÌ'ɉTHlAˆäé³&-Ib,th)ÅñJ”G%% %*Q*º¢ù¯ .æý&Ï/!²D‹Ð/©º¸·×èGˆ#¦Ò;*ר ¥@€EALÆ3ev÷"Ôçˆxû1Xh8‹šØ¸Ϩñô!)Œ^ ?)´IÑ=¶wO =–BÅ.¶>ÙŸ <Ö§pšc¥/ -¤)>_¬•©*B´[Ð #àV{&°LÅrK®/qq—%Yç?õ²ImN4⢒@%$¤ë`|TIı+†a>LHr¢Cb G'M™1jKc£AN/ŠT¢9)))R‰PÐ]Ÿ oȽH¶¿v´55­µÞ󆂵%(x‚é ZÒ€ß>G\A üO„÷ó9eUÊÔ˜ZÅíWròü·5#aN%Jãß3ÇŽûPG›áá³ßEžÿ˜X­‘ß„ÝÂÉÑ-سYs\ }çWe¡:(P:#D!føkø=Ù‹L‹Íºæ©£ÏK°zÁ·ØPy¶Ö•«E>å 8噋ýÙ›T‹ì @|ñL™©}Mrø$ô[q{'°ôëç"¨²~axï šÚíŽLˆ²æIuÏ/Í—zjà…:æÕî AV¶HAjׄ—oʲ̿ÙaÇhÑsqo®#°•Ç‹ˆé4·NùIlA(+í˜ïW›•¾Õ”Ù_·Úbyé—“æ[†Ó;Byil¥ây¸„q T{;ÐWåx¥Ã¹5tˆ²›“©±%ÄYS2c¸6‡T­ãJH ‚U1Ë3û³6©Ø€ùâ™3RúšåðIè¶âöOaé×ÎEË^_™ß0¥Ì·²î8ì´\ç:ê“;qÜ-¸éWE´¤ò%I;:¨"FÄáÈÉ‘ŽœÎÄÛ/ѹŸ4¸®kˆÒSÉ$iM~‡z£Üœ%û~cwïûE¹Û$©%Ìëž_“.–ÔQÅÅíC°J µß@¨"åx­Ã¹·nžüY)‘©‘¤ÅY[2#ºžHq€­ðPAŠ£…‚ÌÕòbãH¾[m,´ÑuÉW–Ò@6•­jÚ‡¥ QÖδ £d#"vÆåÆÔÜfmi½®ì§–a z’’™.q%IHO|ˆOÔåxu&Ý”DÆ®Ù-šWÍK…tYä9-:>ö¤™S¾£´ú›B¸êŠŽ¼!ØyÔü ñÚ­’mÓŸ·;1ñ!q”óNÈOI¥¹¥(v%üuDVdÖ ˜®IuÅî.2ä«<çà>¶I-©ÆœRRH¤”l¯€ª 3WÉ‹"ùm´²ÓE×%\Z[H ÚVµ«j”%G[:Ð$Ìÿ&ÚrY.ù ’wa7qfæëî¯Fp‡ÅÕo—È óVÒ4u¤øO~öûöWn––£Fµ&ø»ªžY‡äÅðB „´¤$7Ï‘×îƒÑð–ø›ÃÖ÷ovà1jEñw…<ç“ò+RP‡»7Õîµ¥>|ޏÐPåx¥Ã¹5tˆ²›“©±%ÄYS2c¸6‡T­ãJH ‚U,f¯“EòÛie¦‹®J¸8´¶´­kVÔ=(J޶u H ¹¾ªÏ~ö.C—Ø­L» «„K‹ÂSÑf2à²ßA‡ŸZ®*G±‚|¯î±²',)ɬ.µÌÝúUÅ+’ˆÑa¸”© q+e/ãZHl«ï‰íïÐr>ßxzÞíâÎÜ-H¾.ð§œò~EjJ÷fú½Ö´ #§Ï‘× ¯¸b& N‘Src56$¸‹*fLwÐâ ‚U£ÜiIAŠ¢=ŠÎÕêj¢¿z·Z™CeÇ%Oqim ;%KYÙ”%GÞu H ©žK¶_Å–í‘ØàÇ\&îLÜÞ}ÃøÎ”-°–Ë«'ôù+iN ý•áÜ«nS»ä–h(Ÿ©pîK2‰!§R JOI¥¹êÞ½M‚!\uAÁü)»n]yÃò,¶Íf~É*D7¥ID·uÖ]-©-ôq}È$!#C¾Ž…,ß »1i‘y·\Õ"yévX 6òÛ 6ÚÒ¢‚•h§Ü¡AŸª @ P( @ P( @ P( AëòcþÛþ…R}j"Ö” P( AÉ_Œ·û5ÿšiûìÿŽÎÿ•þF³~§%µ( Ç…™%¢ÈþAj½ÏjûI‚Ü×£ Ç}Úl%Em•1Å@%]•òHب6ÇÄ|Ewgq¿mÇM¼áícȼ*Ú£ËDÑ;ªcð*òåݷǧ¾:<5é Ïd÷Ìg%Ìqhò˜­¸å®<nÏÃ}¨ï¸‡â›i¦”âRVòÓ’6=ÅqÌUŠÞ¼j¹ß ç¶uYî·‰7„\pm”.BÜKN#ËõzœuòP¤mCÕïÐTx½&Érñ#!¿cÙ ;Ä ÕÊ]Í—£5!¾š^}Å¥µ¥öÛW0’ â {(÷Ñ<,É-Gò Uî{P¿ÚLæ½Èf;è̆Ôëa*+l©Ž**쯒FÅ’ãqð×0Ì,vüƒ-ÇŒcè†fy9 µs’—\yM6–Y[Œ6¥¾¤…†ßd‚R(+edSÏß»Äñ† ™åBC1.VVî,CŽÒ8¥À ¡ô6”$kM¬)Ù$•ýÊ/x6]âuŽMâô§-,Ç„ÅöB®4Ÿ¿¼–ÀçÉ`(•­/0É%æEÓ'š„¶íÊJßé§ä´‚} §æJS¤ó$U 2KE‘ü‚Õ{žÔ/ö“¹¯F2Žú$3!µ:ØJŠÛ*cŠ€J»+䑱Phoœ)yEœ[ÄÇqß`ãíÚ‘|ŒÄ¨ÌÊw¬·,'ªÛEO($týͧiNû¢÷ƒeÞ'XäÞ/JrÒÌxL_n鈴*àãIûûÉl|–@R€Q )ZÙÐQ®úÞqâSÙ>Ayƒenló5oImå²Â¶–’–qz  :ì7¡ÞŠýñzM’åâFC~Dzwˆ«”»›/FjC}4¼û‹KkKí¶®a$Ä÷Qï¢$xY’Z,ä«Üö 1´˜-Íz1ÌwÑ!™ ©ÖÂTVÙSTUÙ_$Š L߬‹É­öx«CÖhØÊ1éÒn6éß?ïꔽ´ÀKí6Xà¤$,tÑéH$²™âž#rÈ¥ÙQ6R±1¸·ÛVb6û2‘- 1Ôácš zRVµ'JRI*œ’ùƒdÙÆ!l¹^Â±Ë ¾5ºáqfÛL„¥ç_|²ÐHRRTò›@)N´’BG¸19†I/0Ê.™<Ô%·nRVÿM?%¤èm?2R$™"¨bL@‘‘Aöò¢3O%åÊ–‡ÖÚBO-i–Ü^δ4l÷ w¢¾{á–KãNC}½x…n^;r™:ôË­Fž€òœµ7 Ãå‹(…¥¥µ¤'|IV…DB•‘Nw?~ïÆ6g• ĹY[¸±;Hâ”C2‡ÐÚP‘­6°x§d’TÖãâ Ž^x·#^mr!Ü,,Z/sî¶ùRîò8-nº†5! ­¶Èq 8TÚT@ät¿2ûF[|µ5a 6+<{KNGަs‚–µвVéJJÉY ^¢h3x“$dP}§|‡hŒÓÉyr¥¡õ¶“ËZe·³­ '[=Èê«ë(Ï1»'ŠÞ ݬÙÜA6bz ^cD•«s®ÍL†º‰[)u*  ›Jø•¥I$§´Fs,½ã™fy>æc ›}¾37\‚\i!¹òšZÖ§x¡¥<¢RPØR›EV·º)–HÅ®>0ß²kWˆ5C¹ÜeÝàÌ‘h‘&"K²¤³!—£•rVΚqÐÙîA/dv|Ÿ(q´O”ݶ,i’šelGzCh⣥€Zh$$%RŽ’@_áå· ¹ä:Îò­VÈì­ÿ¾6ùÝI#òa·ØQ=×Àé 뾨70³{b2Ü‘‹öcd‘!±7m‹> +·Û‹/0ìvK0— )’ÙHm{ ÙæyPVä÷Ìg%Ìqhò˜­¸å®<nÏÃ}¨ï¸‡â›i¦”âRVòÓ’6=ÅqÌUŠÞ¼j¹ß ç¶uYî·‰7„\pm”.BÜKN#ËõzœuòP¤mCÕïÐTx½&Érñ#!¿cÙ ;Ä ÕÊ]Í—£5!¾š^}Å¥µ¥öÛW0’ â {(÷Ñ|<¶á—<‡YÞBÕªÙ•¿÷Æß"[©#„~L6âÛ 'ºø$wÕíÒãíâ»Oñ=í˜2´I‘jŽ–ÀCqKÇæ†Æ‡Þ\†öIP qñ wÄ ×„ä,"SØ»v¶î@uv³p²añ'Ê–’¤%²Ñ@V•Ò@®`“›¶¸—ë<ˆ“ñÖl÷ÇæÛå&Õ1Ô(+‹l2û Ž›zHA oa)ƒ/ã_hËo–¦¬!ƒÅgiiÈñÔÃNpRÖ¢ÚJÂ)IY+! «ÔMW‡–Ü2çë;ÈZµ[#²·þøÛäKu$pɆÜ[aD÷_¤ƒ®ú ¹»L°ßüO·ÊÌ3 \Ë—2_´E–˜ña64"²Û­!ÁÅ´'ÒFÔ Qõ ,KÄ[|ìÿ*Ëò)ñíso¥7ozDeɃ×Gßa WQÈ[a% H< A×`²ºçö 9»k‰~³È‰?fÏ|~m¾RmSB‚¸¶Ã!/°Èé±Ç¤„¶öh2þ0eöŒ¶ùjjÂ0lVxö–œL4ç-j-¡d¬ )Ò”•’² ½DÐPa¢¼¢DËý¾Ò¶R;×i›N=.¶siÑ'ûµÛâ(ú êáá¦uâLyù&`Ëèvv2P‹)¨× ­$$2ÂinFeCˆþè„/Š´¦  ¼Ë‰ñ",ë¶}Ž˜h )"Æž˜1hÜfÛ1úÀ%JF›#¸%[äh©Yr°;ߎ3oS2ø³qkÕòEÖL¸‘¥5É p²PãH_T£CÒ AXõŽÌ2Iy†QtÉæ¡-»r’·úiù- ŸCiù’”é |ÉEE@ P( @ P( @ P( @ P( Ý~LÛЪO­DZÒ” @ P(9+ñ–ÿf¿óM?c½ŸñÙßò¿ÈÖoÔä¶£%AgŽãW¼®ãì« 1"@io¯“¨i¶š@ÚÜqņнJ ž‚Èxmš‘XŸ±µqD8 d´¸së—ʺ].$§>>úƒÊ¼=ÊZÉSˆÊ‹ %Ém¥ÖÄ»”hì:…$) Cî8XP ¤¥g–ûnƒ‹x>JæKpÄŒZ¹Úy‰È~[-5M/ƒœÞZÃIH_§‘V‰#DìUò vó‹Ü—h¾Â1¤¥tiZVÚÒ…¡h%+J’A I ƒØÐzÇq«ÞWqöU†‘ 4·×ÉÔ4ÛM mn8âÈChÞ¥ÏAb¯sïîã/ÛbkÓ-Å=5†ã¦:‚J^ó Xg¦y§KçÄò'uçú:Ìþé~佈¿iô|ϳ}.‡}n·.—K‡«©Ë†»î¨æÞ ’»|wDh†S-uÜsÚüªZí§<ÏS£Ãj—=l½ÐAÈ1ÛÎ/r]¢ûÆ’”!Ð9¥i[kHR… ”­*I)$‚cAëƯy]ÇÙVbD€Òß_'PÓm4µ¸ã‹!  z”@=»>æ¯d±“lŒÌèpý ñ‘qŒÄq„ðã• …¤…wÛuV0kÔ‹ÜŒ}¹¸ø• êÜ^EoDb“Dz$)àÊÕꔬ‘ßc±ÐL•á~[ò‹ åX¢ÊrwÔþEom‡#¬é Cê|4¢}á!EDwÖ»ÐUå8÷ žÍ¶þÌVÞ“¹Œ˜ÓX–ÚÙse 2µ ‚Çv¸Š£–;^ò»²¬0ĉ¥¾¾N¡¦ÚikqÇB@õ(€>z Døišœ…ì`Ù’‰Ñã ®•Êe1Ѥ(>d†zD):sŸÈh÷¨9²–òTâRb‰r[iu±.å;¡I BûŽ–))Yå¾Ûª95„ä.åR°§…ï CÑjeÆ4fÐóJ(Z:θ–ÉäQßÃt×›EǼN°]ãùyöÙ.Ô×4¯¦ój(Zy$”(°H?AÖÁa¸d·6íµÂL—Aáç'±³¯‡Qõ¡?½Ÿ†è&³‚äïd—KȲÕÊÐëÍOKóe¨ÊiΛœÞZÃIzO.Z$±Pw>e-_^Ç&³m5–$ûBï#.4 ’…¶óÎ¥§B‚­‘°  ï+Âü¶ åʱE”ä&î-©üŠÞÛGYÒ‡ÔøiDûÂBŠˆï­w «Êqî=›mý˜­½&3s1¦±-µ²æÊekA ŽþíqG †á’ÜÛ´Z× 2]‡œžÄFξGÖ„lüö~ šÆ •ÉʦaLÚT«Å¹çØ–ÇY°†Á!Ò·JºiBJNÖUǶ÷AúÖ;‘ X{1Ô¤nñŽà#`¢B ¯{íÅgg°Ù ý€e’òk– Í­"çg[è¸!É-6Ô^Šø:§RƒIJUÛ‘W‘£ÜT2 vó‹\•h¾ÂòÒR„:q.!m­!HZ‚R´(B’H?T~Ø1˶M1pm ²·h¼êß’Ôvšl –ëªJ6¤©C¹ãAfŸ óEdŠÄýŠSqD6 © %”ÇáÏ®_*é¸zœøhŽõ•x{”µ’§•K’ÛK­‰w(ÑØu HR‡Üp4° AIJÏ-öÝ6pl…ÌŠåŠ=ìÈW;C®±-»…Þ$6ÐãNtÖ€ëÎ¥µ®ÚJŽÀ$lh8e8÷ žÍ¶þÌVÞ“¹Œ˜ÓX–ÚÙse 2µ ‚Çv¸Š£ƒ»dÓÐË+q¶‹Î­ù-Gi¦Á©nº¤¡jHÚ”;>4+ðó.jþæ3"ØÛša2–_–ËlR÷]K tÈRt¾|O!£ÞƒÚ<6Í=Œ{"txÂk¥ÉL¡„F (>d)a Ñ NœçÄò=ÅAá~åÍ_ÜÆŸ¶´ÌÖ˜L¥©éŒ70 ’—¼Â–éžIÒùñ<†z¢· Ço8½Év‹ì#JP‡@æ•¥m­!HZ‚R´©$¤’=탻dÓÐË+q¶‹Î­ù-Gi¦Á©nº¤¡jHÚ”;>4g쥫ëØäÖm°&²ÂdŸh]áÄeÆ”P¶ÞyÔ´èPP#‚•±²65‡ü)ξ£U¶å®n¼ÚºDr2!«Üúä%ÂÊ{wRÀõ'ò†Â!ðû)o%N%&,(—%¶—[îQ£°ê¤)¸àia@‚’•ž[íº¢¦óh¸ã÷‰Ö ¼/>Û%Øršæ•ôÞmE O$’“¥6 àh:رû®I5P-,²§ÙuÅ¿!¸í4€@*[®©(Bv@Ú”È #áÞ^›û¸ÓÖÆ˜šÄtËp¿1†£¥…”½æ°ÏLóF—ωä4NêÓáÖ`‹û¸ÓÖÆ˜šÄtËp¿1†£¥…”½æ°ÏM\Ó¥óây º*ðû)o%N#*$8w%¶—[LËŒh츅$) Cî8––))Yå¾Ûª*o6‹Ž?x`»Çòóí²]‡)®i_MæÔP´òI):P#`~‚@ P( @ P( @ P( @ P( Ý~LÛЪO­DZÒ” @ P(9+ñ–ÿf¿óM?c½ŸñÙßò¿ÈÖoÔä¶£%Aôn6Æ\ÊlsäÀŽõöĨpÕ=þ„wD¨ïô\w’ziq ­Š“ÜPÞÄã‘ã+¹=†&éb2~àÙ±•7VõÍDôÌ1|Ï0:e±Ðêu5´_ûTŒ¿Éß³L3³ÜìŠvÁg‹dte¨HuºúЉ/8°„º–ÁæyhvÙ\ó›wrYÌÎÄnq§]¦Ý¡·&üÏ’šÃ’VP•He䥵ž\ëj|6"«Æ›…²á”ÁU²l'D{<8ÏF€ðz$Ž&;ïHòÚŽÔ­­dr!ë±—2›ù0#½}±*5O¡Ç‘*;ýäžš\C+G"¤÷#Ô7°Kå“Îòüs^UbƒÆZbç%6en!ç]Th¯>àmÕ€úI.ú äR’h,¬ÙZãæY-ºìœV³ñDYñæºÄŸoŽ–^al2ì„­L•°²K¤%K#˜ V¨3™=²ÁtÍ-)µ§ z{†¼D3‘Õ*xZ‚ÛmÖVÛIûÙh«¦âÉ+â~*¼i¸[.L[&ÂtG³ÃŒôh¢Aqâc°èþñ´€-¨íJÚÖG"¼!¸Ûs)±Ï“;×Û¡ÃT÷úÜy£¿ÑqÞIé¥Ä2´r*Or=C{¨¼ßç£&³Ú0œ‹jm«jÏ8Ë~+¶é 2òã!Ù|Øp :„òR´zGJ=¶YE£ Èß⇊âEÆ|{%¢å=¶C¯º–Ûnl!;Qס„% |J@Í>{“ŒÇ/¹ä-±åãHw„8ÿñ[¶à†’„ÿÂ¨ÐøCq¶2æScŸ&w¯¶%C†©ïô#¸ò%G¢ã¼“ÓKˆehäTžäz†ö ØÏÉ­?tp¶Ue¹D^Ö?uKw”DŽ]Œ°ˆó\æØ-«¤€µ•!]5 «`ªÎ¤Y²1;-"ÐËý¢½çœ»²ˆ¡m8ã«ÿZx¶Û…)p$¨h-I<ŠE :²¹qñæðüÆ>ôkú]Ú4´ß ùeFT§•)þ¯M )é©A}ǧ¸ØSx×(ñS(¸1p¶Í‹u»Í¸Ä~Á‰­‡d8¤¦V •ß‚´ Øˆ¢Ã­¯]r[|f$A`¥ô:§&Îf#IJQÛ-(Ð'gÜ6j«è™>o˼uÊÜ¿‹hq¸^Ñ5»ì"DUIYCm8^ ÖÓkRH’€¢*r(«Ë|O´Y²K…ŽÉiá Ky2=¾ÚÐâÒÔ…8•³ÉK>áÈ ù³íþ(x®$\gDzZ.SÛd:û©m¸æÀBµzBRĤÜÐSç¹8ÌrûžBÛ^4‡xCð°a¡þi(Oü*Ž8uµë®KoŒÄˆ,¾‡TäÙÌÄi)A ;q奰:ìû†ÍöOj[¬Þ/ø¡»ž-%Yt{“–9O\bJ€âœ¸!öƒ«JÔÒ9!¥7À,qWxŒŽQn´Ý|@Ç#Xäc,OL®Þ܉:$Kjf¡jS…· Ó}ì5°ÙâWÈ'tUÝêc0¼eÏa8ý‚ígÍ]žvÎI–ÞŠäî»JD´—aÞL¡\]×nÊO¨lŒ¿w›Î÷c¶cžXǰXbÚœTi>e²êâÈhJC%`©I% 'T~bPs,‡Ù×L‚ßh…•Êô¹¬FSˆIzeO­ —TH Pò{$Ð}&ü?•dÖ+ë˜äsÅš³ØØMî<˜-2Ĉî5Ùl:P’â#­*YZ%ì” >_äïÙ¦ÙîvE;`³Å‡2@º2Ô$:‡Ý}hD—œXB]K`ó<Š4 »l¨ÙÖ=n¾xùu?%²³f¿ä§{N=Ö4†‚ì—Ô.6µ%*à ¨…ì¤kÔ6FC=ÉÆc—ÜòØòñ¤;„x­€Û ðCIBáTwðóƒ™d>κdûD(ì®T‡¥Íb2œBHûÓ*}hlº¢@HR€÷“Ù& Ód-\2Dö0ô³n‚Ã6ë\Œ‰‡ ˜mÛqÕ1‡Â9ëjQ.¶Iä{l&ƒMyÉ-/çOÙ#¹eo¼âÑl÷,ÞZ‰›Snñ',)°¦[P[…i$­%K=ÉU™ËØöMšX-Xòq§ØÆ¬ .5ÂîQ [¨qjS^o“Ae!Ð ÂÛJ‹j(:â ïnˆSVɰìðã=Áè\B8˜ì:?¼m Ëj;R¶µ‘È…?‡˜”Ë!öuÓ ·Ú!Ger¤=.k”âGÞ™SëCeÕB”¼žÉ4Š*òßíl’ác²ZxE‚Òã^cLo¶´8€d4µ!N%DìòRϸr‚e³;o'ñ(qû|#hÊ!ªØ!Iº"܆Ó*3MÉp)¶–ØŽÈ`¤„}⊓H³dþ bvòÒÛªîž%K=Ô²¥¨$¨Á}ÌÿÄt[r+Ö9`µÛmˆí³À}¶à°ŒÔŽ·EÉ ÿÞXî¥,€žÔr&ȯ¯€Ì6¢³–ò(.Å‹¤!RÃÝ"°”’v°¥(“¡È *·Æ¸ÉGŠ™EÁ‹…¶l[­ÞmÆ#ð. Lml;!Å •2µ¨Žü¥FÀؤF&¨P( @ P( @ P( @ P( ¯ÉûoúIõ¨‹ZR@ P( %~2ßì×þi§ìw³þ;;þWùÍúœ–Ôd P(%[-WKÜö­vkl©ód-FŠÊuíé(H$öÜ($§ÉW|û˜F=sUçŸOÙÂ#†O=oK\÷®ú׺ƒ¬\7/›}s‡ŠÞ¼³Ë©nj «” ´Ìhw=¨?m˜Vez»K°Yñ+Ìû¤±.hºü~ ྣiIR4¢vcÞ‚=ûȱi¢Û“Øn6‰jl:#ÏŠäw +ŠÀ:$þîÆƒ…²Õt½Ïj×f¶ÊŸ6AâÔh¬©×\:Þ’„‚O`}‚[XžRýñXÃÕÕËÂR«z!¸d¤² @s]ýÔ¾çrm}Íû áín§KÈyUùžzßž¹o_ nƒªq,©wÓ‹£ºªò•q6á Ã(+[×K\÷®þïu+¶ãgšõ²íL)‘ÕÁèòZSn6¯™IP÷Ðz¶Z®—¹íZìÖÙSæÈë5i+LhQ–û¥#ÞB Ðøö üE†øíåXëViË»%õFTÇYI!M–õË ‚lhÐHF#–9}V.Þ1v]åЭɄ锓­èµÇ˜íßÝAû˧߯`â×y†¹u-íAurQÄlí žcC¹íA]6ËlÇí×E•Õ2û6PãN$¤)'ºT ƒÜAÚÑe¼_ç"×b´Ì¹Lw|#ÄaO:­{ô”‚Oî ìŒg$v÷÷2Þ?r]ã™oÙéˆá“Ï[ãÒ×-ë¾µAí¬O)~ø¬aŒjêåá )U½Ü2R@Ù 9ƒ®þêÐ0lÚëw“Úðëäˤ$•ɃÞó’H ¶Ò’¤©#d|GÏAýäX´ÑmÉì7Dµ6çÅr;…Å`wcAÊÑe¼_ç"×b´Ì¹Lw|#ÄaO:­{ô”‚Oî îÖ-“?{V4Æ9trî•*Þˆn!@l‚з¯†¨ bÙ3÷³Œ±Ž]¼%EÞˆn!@lŽ·®úÕëx®Nõðã ã—EÞ¢ƒoL7  6GK\÷®úÕ;¶ãgšõ²íL)‘ÕÁèòZSn6¯™IP÷Ðt´Yoùȵح3.SßñSΫ^ý% “û¨'ÀÁ³k­ÞN?kï“.’W& {{ÎHe €JÛJJ’6¤‘ñ=ìŒ8‰|g—†_Y¼HGU«{–ç“%Äwõ%¢žDzOp>æ¨p\Þéx“[0ë们$•ɂŽç$0@%m¥%IRFÈøž¨‰~Æò,Zh¶äö¢Z›ˆó⹂H â°‰¿»± ãj³Ý¯³›¶Xírî3ßNf:Þe’Aûâã¡à4•ÜhïD5y•gž?†cÞ}‹œ B;YPW!ø¬¶ò×Ó}-n­ **:a;+JSÄØ-¬× ‹¹îMm¹a˜÷&°¤Z±ëeÑ/DŸ= ­„ŽZâá[­6öÒÙ§›iW¸ÐV-cø¤\~õ^W‡µálµ­RæÙäÒáe–žp8°PÃeL©|ÂP'ÓA”ñéVƲ ¦ ’W&ÓŽB<ÊRø}Âï •†ÔÐ( W8l”îƒÇ‚IŸË­yë­Ëv4#º‘$ù˜ëy–I‡€ÒTOq£½Ø_ää°ò«U’Ç·‘^ÂYµ_-ÔëÒKêPi]¶êžC&2HNˆâv‘£ íbÅí6\îýh²ÛBça|îÔ9\æù—T×V gUÉIq>—HPqA Z VwEPø‰ÏÊ|KÄ0èirÓ-èI‡1ArmM‚¤©×ےД—Tx£HRGë@Œ/‰9<£1:Ò…7i­³ÿ— „˜ùÊ ÿÞRƃEà’D§òëDF^zërÇ]ˆî†äI>f:Þe’Aûâã¡à4•ÜhïD7w)E$\ë]éûËbÇsnÜ*ç Ñ+®„p%gÂmm‚•qä;q"‚‹Ä[C·¯pÜc¶Ýn—;U–ßs!®¼¾«KZU-rÒ’Éo’AWOOh«+Ô Õ§Ç1›®1‘6s.F0aîiŽ»€yÇiÂ0…ôJHJ‡$èö4FKÇ¥[È,˜.I\›N9 ó)HSáôK¼ ‚VS@ )\á²Sº ve¼_²›mºÅi™q–d!ÀÄFó…)P*W‚t$Ÿ€Uôì¯Ã/ò_ó\zÛl»Û½¡q¹Ü¤,Å|-fbX6‘ÍöÔ ž!!\ÕÄýÄE>ecÉ3Ÿl¸tŒzíbZ£Â´BMæ:Ù•äÚOLJ|,öRµ¨ŽÀHNè,­Yl\¯ÄªÑgµÝßµ^ìçµ¢ÒÒ^› d²ZeJGT”GHZPqÿ}QãÒ­d L$®M§…y”¤)ðú „%ÞA+ © P®pÙ)ÝŽÂì·‹öSm·X­3.2Ì„8ˆÂžp¥*JâN€“ðª¾äݲácñÇŸ·<^k—[Ä{»ö(Oc.âpJ¾òG­.4‡‡ÞÈ+HZRvwQ›Ÿ†Wì:·ã8t9ö™R±Æ¦äÖ‘$Ú[JÏQ’©å'Iaa’T¾N%>ñØ+2ë~a“x«g³3ƒd‘¤@S-îûAèqÒuyB¢@â‘Øº*ŸÇ{5âÍã`.ö©|íòá27™aMuã®S¼G 9!Z:PØ::4ˆáž•ç×÷±ìURÑÎ"ݸ¹8Q IYSmínŽ\4€ R¸€7AõX’.÷Ï(°Lů¶»’°¶lö83ÛT[¤èì=/\ÒO]Ö‘­%C¹@ D äx^Uœfxþyö.p1ídiA\‡â²ÛË_Mô´9º´4¨¨é„ì­)OG`ÎfV<“9ñVˇHÇ®Ö%ª<+D$Þc­™^M¤ôħÂÀÿe+Zˆì)„îƒ+âNG(ÌgN´¡MÚcpklÿåÂa¦¾r„÷”£ñ íáž•ç×÷±ìURÑÎ"ݸ¹8Q IYSmínŽ\4€ R¸€7A®Êa戨µ.i˜6ˆ¶ñjR•í>ÜÈKiZ‚Тµ-I 6°5 Fè57¹ üÌQ6»Âý½…C´y;z&ïkJ K 8‚´ù‡€`¤‡>J5ÄÒù2ÞœÁ%¾ úl™¸$l~à¨Hiû«/¡ô¼>ôÅôÛi e.m)*O#ÀÐ`üzU±¬‚Ái‚ä•É´ã O2”…>Ap„»À¨%aµ4 •ÀŽ%;¢(<3Âò¼úþö=ŠªZ9Ä[·#¡Ç !¡I+*m½­Ñˆ*Wè4™•$Î|U²áÒ1뵉j Ñ 7˜ëfW“i=1)ð°?ÙJÖ¢; A!; ²µe±r¿r«Ež×w~Õ{³œ~Ö‹KIzlh,-’Éi•)RQ!h AÇýôWï‰Xão‰fbyÿ<ÝšßižìÅ ºË©S…J‰)J›d¶TžG€AI'ŽèŒ‰9<£1:Ò…7i­³ÿ— „˜ùÊ ÿÞRƃ– i¼^o …jµ]®¨SGÎ@µJ Ê”Ç$íô¬«ÕÄè6¿võÛb©e¸FWx›żô^Ä?hEOQùVØL¡!LÊ moº’–ÏTTØAô¦7|WÄ?|Kû–¶cÙ‰¬lEqâ>™ª´ÆG]ö’9ºT¤¤„$«‚¾ ÐOvé{•žÝñ¦–ÛÓsřǡµäO¶|« eH‘Ñp ¼¥ôR¡èR’‘A–ñéVƲ ¦ ’W&ÓŽB<ÊRø}Âï •†ÔÐ( W8l”îƒæuB@ P( @ P( @ P( @ P( Ý~LÛЪO­DZÒ” @ P(9+ñ–ÿf¿óM?c½ŸñÙßò¿ÈÖoÔä¶£%@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( AëòcþÛþ…R}j"Ö” P( AÉ_Œ·û5ÿšiûìÿŽÎÿ•þF³~§%µ( ¤ø$¡üºï発[q×d@~;AÇã3<ÊI|Du¼F”’;lAô…)(½HÊ“"R2qáÃ75MLdùä¾f¥µËä?Ö<‰ožû•rÿjƒ#œÞï6\óÈí7«Œ íÊÅÛ”ÆV¨²ŸZÞqnðVÂÜŽ–®ç|¶IÞÉRŸ½D³xßⲕsrÏ>TË»ëÊ#ºï³ö€Qtô’§Ú\o¨„•'©ÚˆÏøû+9á8θÉÇ!=u”¶ÒäJ%ÁÕZTö¶ƒ*ÚÀR‚‚”$PsðIB+ùuÞ#Ï3t¶ã®È€üvƒÆ>f:y”’>øˆëx)$w;Ø &Y÷c#5Æ'a÷âdw\R<›µÉa1žhuÿ[}Íž‚ŒvØZÜ Þ”}G‘ä·lÃ#ÈüT†Ï…™Ö-ÒàÄ+î°Ÿr×gÀB!Î(¬z»é)*õnƒ÷1ñ*ûqñ™»Î=–ÝÊm®G²B¹&k‚Dˆ¬é²âœ äz¤-Ål÷.+7ã/þ·óŸþ²Üÿû©ÊD\ø$¡üºï発[q×d@~;AÇã3<ÊI|Du¼F”’;lÎõ™ÊÂò«nV _&\nø;)¼K·Êö|öÖëêJ%­Ô¡Þ›Še¸ä’Ë›äIÙ+1œêér›—ß[¹dxœy¶ÛåÜ=.u×Tʇ]m¥NÒmmP„º‚7 T¥K±gVÅ·!»55Ì^×ûݺÚU1)jd!jmHRÐ!jSkPX* ¬‚F_Çte¶ë‚Ünác%ÞGNLÐ[âdHF½,¤• «ày/|ˆ{ðIB+ùuÞ#Ï3t¶ã®È€üvƒÆ>f:y”’>øˆëx)$w;Ø ÝÆõÙ’FºËºÈµäW¼ …›òá¸^‡4ÊôÊy,…¸Ú܈Ú§ ^ÞÎÉ¢«ó¦2†üCÇÎ |pd3qX¯^/ E¡{Q\·X `PÊ˧ŠÊUµh¬¤‘Â>}aŸž_§Ûošq¶­‘rŸ&é_žiLn KIS­õR‡QÔ .âIîUEgü}œŠÀðœg\d㞺Ê[ ir%àê­*{[A•m`)AAJ’(Œv|½cùEºáa»Í¶Ê2k¯BÙs‚”“ÉØUnò/»%há¬rà\¿]ƒ“RàkÊ0%-N<§vR— ÷шÒXr{}ûÄ—%µL|3eÄz2òÑÿ-æú ®âÃ]‰ukP¥ ôÔ¥)iVÍf{q»Û³«.Mn»ÞbG™Âõö$åÑqÉ-™O ­='Ô´qØwºxýñ\‰Pg|w@V[n¸ -Æî8Q-ätä;&D„kÐòÊIPÚ¾’÷ȆW ¾^±ü¢Ýp°ÝæÛe µ×‡!l¹ÁJI䂈ìGƪ¾Çm6Ⱦ7øÉ}–‰j™f7©°<˜G™C¢â„­l©iPBÃKsK⢀JÀ%5A|…š#=µ]ðœ‚IajèäÛ“è-ñÊ”¹‚S®!ž]}!Eµ'ò´BÛ0Èò?!³áfEu‹t¸1 Ä»¬'܆õÙð…Ès k^®úJJ½[ ¤ñ›.^cŸL’‹´«œ;cmÚaK’òqö#§€yJQ$—áÙ÷¸h+|<û²VBÁ§.ÁÆš—^Q¥8òž=ÙJBv\67ßD>©hÉ­wüË.É,ßrådÄn5á¨ÃÍÊÓ±š•qm¤õK*}IÚ‚¸ŽJ![ !eŸv23\bvp~&GuÅ#É»\–æ‡QÏõ·ÜÙè(Çm…­À­éGÔy@ŸXgç—éöÛð¦œm«d\§ÉºWçšSÛ‚ÒÒTë}T¡ÔuK€8’{•QYÿcÅg"°<'×8ä'®²–š\‰D¸:«J€^ÖÐe[X PPR€$Š#1áçÝ’²Ö 9p.0°äÔ¸òŒ )Ç”ñîÊR²à ±¾ú!¼uÜoĤÞÓ>Ó-«ª?®ë:=¸dS™Jê,¾´'KpóX*æZAß­T¼\¹e˜ßQïѲD¸Ï‰gRåZîm—T(èp)QÖx…«±ÐRHP*I(¬þa|½cÿÚ(¸Xnóm²ŽYpk¯BÙs‚¦,)«aÉí÷ïr\–Õ1ðÍ—èËÈ#Gü ·›è2»‹ v%Õ­@z”ƒÓR”¥¥[4Ò¤e7<®,©J¸ÿ£È÷]ÔÇÒwýe¦_š¶ÉeD‚4³éHWPüº Žs{¼ÙsÌ##´Þ®0/·+nSZ¢Ê}kyÄ»Á[ r:XR»òÙ'{%cãA%9>J‹çÝ:2šo<úžÑÜyë\º»ç½vÞè:GÌ2ØwÕå12›»§ Šî-Îu2”T4vèW3±Ø÷÷Pv•žç3oldÓ3Kë÷ˆ­ô˜¸;qyRZGJ]*ä‘êW`uê?=AS:|ëœÇn)Ë•!En¾û…ÇQ÷•)[$ÿ‰ª=Úî·K$ön–[”¨cžMIŠòšu³­m+Iv'Üh,`ç9µ²ó'#¶æ7È—i¨-ÉžÅÁæä<’A)[AJJN‰ÿd|Ôfæ™ÊòÞEqË/2®Ì£¤Ü÷纹Fˆâ*䔡­üOÏAË}¾cw]±ÛÌë\æÂ’‰0¤-‡RÑh ƒ£Þƒ¥ÿ&É2©‰¸åÊñ- †RüùnHq-‚H@RÉ! ©G^í“óÐGµÝn–IìÝ,·)P&Ç<š“å4ëgZÚV’ìO¸ÐLc/Ë"ßÉ£ef¯’\¸"k©’²FŽÝ ä}ÃãAÍœŸ%{9,|†æÕହíKq2y¢®¨<¶GmîƒÔ\«'ƒy^G $ºG»8¢¥Ïjcˆ¢}ä¸"OǽK•ÎåyšíÎñp“:c瓲$º§\pë[R”I?ñ ýµÝn–IìÝ,·)P&Ç<š“å4ëgZÚV’ìO¸ÐJo*ÉÚ¾œ¡¬Žè‹ÉYpÜS1Á(¨Õß=ë¶÷î ënͳ+=ÞNAiËoP®“¤H{­Èy$‚BÜJ‚” JIûÀù¨=HγywƲyYñëÌtÚ¸¹pyR[Hߥ.•s¹ìÄüôs§Î¹Ìvár˜ü¹RVëï¸\qÅyR•²Oøšö[íó¸"íŽÞgZç6”I…!l:Fˆ AlôÃÄßàä#Ä—Ú¦7“3½¬ÿ˜òü¹ôºœùpåêã½o¾·PG<Î%_ɤæw×o  4ÝÁw•%ïé•s¹ìÄÕÑ™eí_“·•^x_ʸ&s¢Ií®îòçîãAås¹^f»s¼\$Θùäì‰.©×:ÖÔ¥Oüh:Ùo·Ìnà‹¶;ykœØRQ&…°êA -°t{ÐN—æóïqòYÙ•òMÞ"qî\^\–P6BPéW$R»þÑùèóÌæßz‘’@Ìï±®ÒÛéHžÍÅäIyŠÜ ä¡´§±?욃ÄÜÓ1¹^[È®9eæUÙ”t›žü÷W!ÑC…\€Ò”5¿‰ùè)¨,¬>KŠL]ÃÈnvyN6Y[öùnGqM’ AR%;JN½Ûæ ‘'8ÍfßÉæe÷·ïÒÍÅÛƒª’ÚFôéW0;ŸqøŸžƒös›[/2r;nc|‰vš‚Ü™ì\nCÉ$•¸¡´¤èŸöGÍ@‘fòïdò³ã×˜è µqràò¤¶‘¿J]*æs؉ùè*çOs˜íÂå1ùr¤(­×ßp¸ãŠ>ò¥+dŸñ4ì>KŠL]ÃÈnvyN6Y[öùnGqM’ AR%;JN½Ûæ ó}Èò¢p¹ä×ëÞ`@hH)rà7¤òY'Cg¶þ&ƒ´L»+·Þ‘@ÉîÑ®¨m,¦s3\D„¶ r  o\@ê Nø‡Ÿ¿|g'{9ȼGdÇfâ«›æKmúéW0ŸR»¯Qùê7ü›$ʦ&ã”d+Ä´6Kóå¹!Ķ !K$„‚¥{¶OÏT,>KŠL]ÃÈnvyN6Y[öùnGqM’ AR%;JN½Ûæ ”þyœJ¾7“IÌï®Þ@i»‚î/*JßÒ*æs؉ àr¼¤ßFPr[©¼…s8çš Ö·Õß=ë·¿ÝAê>a–þ¯)‰”ÝØ½8TWqns©”¢¡£·B¹ŽÇ¿ºƒ•ÿ&É2©‰¸åÊñ- †RüùnHq-‚H@RÉ! ©G^í“óÐr³ÞïXôä\ìy¶É‚"…²êA÷€¤Gï Ÿ :Íí·™»1¾E»LAnDö./"CÈ$•¸ÉCiIÑ?ìš ôî½{FLöm~rðÛ]\rxÉKåÈ'¹í½wª#DËr¸Ådðrk´{ÂÊŠ® MqTT4­ºÌìv=ûŠü›$ʦ&ã”d+Ä´6Kóå¹!Ķ !K$„‚¥{¶OÏA[@ P( @ P( @ P( @ P( 7_“ößô*“ëQ´¥@ P( Jüe¿Ù¯üÓOØïgüvwü¯ò5›õ9-¨É@ P}Âu±ç2›äøÐ$=b±*d4Ïc¯·—*;g⮢[CË_•wHôhÁ¾8æ2‹“Ùšmv!'î ›èeP·oDÕÏL3+Ëp#¦=~ŸO[Pô³AœÊ¢; .ŧaØ­’uÛ)ÇãÈòˆ¶!Ø¢Ržu¢óQœHm!i`/ŠÑÁ!Å)íÄ+òk®3Äv8³…,ù¯ÛÌ‹SsÂæe„!iS|Â’4ÒvT”€R@@ñžÙl·eQ´DˆÜy¶˜rüÄ&ƒQ&¸¦ôä†ݶ¥¥ZA ¥[J>HžÛ­9”ß'Æ!ë‰S!¦{xí¼¹QØë8×uÚZø”«ºG¤ëD.ò¨ŽÂ˱iØv+dvÊqøò<¢-ˆv(”§h¼ÔgHZX â´pHqGŠ{q-݈¾#3û^?.|¸°í²Ð‹DId\HB^TfŸmm¥%ÞÁHH¹N’­PwÍr)-ø®õ§³cra,cÈÇ-î1:J PãÉaL–‚œ‘J’€x”ê‚Æ[…²^{2 ¢-±¶,íµkSÖø,Äj[̧‹Ò:l¡(õ»ÔP!#ÓÄ|($øCn¶<æS|Ÿ‡¬V%L†™ìuã¶òåGc¬ã\UÔKhykâR®é“­ÖÜ®6#”Z²+½¦ iÉpôÈ&Š4Øñç©õ´$·ICA*Cøé:êöHÞ€qbÑm¶æwI—9ø´Ù·|i«–.üÛdKu¹n­mÕŒR˜Í8L¥í²à•lUµÖÅŠY²¦ä”b(¾]°¦'ÂCÞ\YÅÜÈ ¸@_ú°–ÝRw÷’µ;Ða¼l±[¬×« ˜Hµ¡û½‚,ù资ˆ‚Q[¬´è =0¯G •ŸIG?mÖÇœÊo“ã@õŠÄ©Ó=޼vÞ\¨ìuœkŠº‰m-|JUÝ#Òu¢iÜJ5þ5Ý1ˆ×‹îÝÆÜÜÆZfÔnžl´§:o²Ø[ ¸ââRØRÇaØQTùä+^+›c“bŒF3÷¼z,¹Ï9JµÅ–¥¸‡C-¡Ä(Ð:KkoÖJS¢’㛉8ÿˆ¶Ö°{%ŽK×ë\´¯cD• àó¡)Sñ£¾ÚÒÒVêHŠP─ÏxËp¶KÏfA´E¶6Ŷ­jzߘKy”ñzGM”%·zŠ$zx…t~Ó’@‘4ÊÞC*nl&4R¥vÛÈZ7¯qÖÇÀŠª×dl̵xç–YpìV×6B¯÷è.Û›}–” ž› /JSÄ$¥)$èh©·ÅÃ'ø‡|•€7hÅÂæ\U.Ùâ]RmÉAŽ*2\Qm)Cjk J t(:ηb°³¤5Dùø„yvIR™a‹<û‰u rBtZIB$%)u(OQ(I QXß,Vë5êÃ&-h~ï`‹>z-a" ”Vãk-zOL+Ñè%D§ÒE•ÃnÚrH#Æ€ù[ÈeMÍ€ÄÆŠT Ûy Fõî:ØøU_V·cx“~0x¯.åh¢î²áFT¿’›‚F£m(p!ž-’È +I¢3Y cùµ®îÔ¼aQ2+cS¡Ïa Eeµ©H.¹¤ºÚˉ)JG~@wÜÜIÇüE¶µƒÙ,r^¿Zà%¥{$¨W JŸöÖ–’·R@P B‡l¤{Æ[…²^{2 ¢-±¶,íµkSÖø,Äj[̧‹Ò:l¡(õ»ÔP!#ÓÄ|()p—¯¿³°A»Üæ/‰p‘-)Zˆ<ƒNÚˆZT :ì£êq¡á2òü¦ólƒa}ìsa÷Hе›©z4yPÀJ’¶P^qA!$§’RA §Ìi²åX½î |^ò,}‰’•mS¶èò δd&(m@¥„¬#¢ :§H´³í˜•»:œäx˜Ósfâq¥ØäLm†¬ón*SAÉmß¼¶…!2x!Д…§Ô”$;ÆËºÍz°É„‹Z»Ø"Ïž‹XHˆ%¸ÚËA€“Ó ôz Q)ô‘A˜Â^¼"þÌl~Áïs˜<¼V%ÂD´¥j ò 8 j =iR@$ë°"¢»„ڳϤýËØt…ڣʾ±ÆR›1 BDFÚHqår@â7â¨(Ÿ…xÜÃÍá–ë;7¶·M‰“‡"0é°ójo³½PHN»òŠ£Ê¸cþ7e–l6Ëh[äS­¡?g‰1”ƒ-Im¶Ù}µ¡ä¤€@ì;(ˆ2Ü-’óÙmm±gm«Zž·Áf#RÞe<^‘Óe G­Þ¢ ž#áAK„½xEý˜Øý‚ Þç0yx¬K„‰iJÔAäpÔ@zÒ¤€I×`ET·ÅÃ'ø‡|•€7hÅÂæ\U.Ùâ]RmÉAŽ*2\Qm)Cjk J t* ²1ÜqŒ–ë’7j°»äp˜×x² mrå9%˜ÎNLPƒ¦‘ÔtôËCÔÑ%±òh39‚m6\«½Á‹À^E±2S²­ªvÝAyÖŒ„Å ¨´°•„tTTé¶‚Æ{e²Ý•DrÑ#qæÚaËóš Dšâ›Ó’lvÚ–•i$‚•m(ù 3¸}ÁëãN-vVz ´$Þ!*\hÄzŠh!ÎdF‹k£éÞˆ£èŒ'm~$ÛYÂ1K5Î]êÑ QJ-­½ cë@êJ{mR±ÅÄŸY(A&Ò2 ±ÿgHzßoq£bnò-öH·h»ño«!ˆ¯©,©°¤¬ i'¹H "‚£ aÜs?‰p~㊿ùo6Æ^>Û0™aÄ€—W†”„¬pRTÛƒd«ÔHU/í–ËvUËDHÇ›i‡/ÌBh5kŠoNHa±ýÛjZU¤’ U´£ä€ÁÕ @ P( @ P( @ P( @ ƒuù1ÿmÿB©>µkJP( @ ä¯Æ[ýšÿÍ4ýŽöÇgÊÿ#Y¿S’ÚŒ” ž;’ÞñKµl3y¥°¾M!ÖÝicKmÆÜ Cˆ#Þ•ÍAdÕ°Ìä–Âù4‡[u¥-·p) zT?5Ô?³¨Y ¼¡«¤W.akÆE¶+ìù]%=°ãjiâž)Hl{‰IÏ26rh™|%Û Ý èÇr ª$VÛPÞ”i´·Èlú¸òÞŽö‚¾Ã»ã7˜¹ ’_—¸BsªÃå´¸[^ˆäÁØ:Ø:#¸¨¯$’I$“Ü“AgŽä·¼Rãí[ ÁAil/“Hu·ZXÒÛq·â÷¥@ƒóPY+Ä|½ËóÙ#÷ò&>Âb8™#»°†¼ºÐYOñHF††€ æî•ÈÈŽS.âÔ›‚šKÌDeæ:IHJZè-®˜ŽF†€ÕâóÜ©ì‰yT«‹r® 4£&#/2¦‚BRÙah-p$qâ8¡A_È/EÑËÍöråËt%e)HJ”¡)H BRJ@ñÜ–÷Š\}«a˜#È--…òi¶ëK[n6àRAô¨~j Ïgù\œˆå2® ÈžZL}= ‡#ôR”µåÔ‚ÏL4ŽF†‡j_é/UúFHýÍ©3e4˜ï PØ}…´–Ë µÁ! âž:O 5@_ˆyŠò˜¹¢¯…à„&#Â;A’„ñB[h'¦€}!)'¸ÑïPg $’I$÷$ÕìünæÕÞØˆj’Æøy¸,Kl=ý7´>§`÷41ãvœšn`%ÚEÖåØsö [u|Ü.5Ñé­k$òYIZÑ$v¨!1â>Uôåþ ¶Èr_Ša>Ô[<6"¾Á;(r2 ¸ žH;)OÌ4dx‰–Ë¿7‘˸G~[1ÄFÛvuÆCÜÐŒQÑ xG;ï­÷ «¿äŒ¢èåæû9r庂²”¤% HJP”¤¡)H% ¡a¾ÏÆîm]툆©,o‡›‚ĶÁ#ßÓy A#àJvq£Aw'Å,Ö^RîfäøH»IiÆdºÍ®#-ÊK…Eλ(l4ñYQ*.%E]·½ AÉ~$æ.^×~ãé+Œ˜e§ Gr/—N¸´#)²È@ 6ê ñ1^S4Uãð¼„ÄxGh"2Pž(KmôФ% $÷=ê á$’I$žäš¢ïÌò "t‹Ž;"+OKŠä'¼Ì%¡l/\ÐPúžü@'[ÖǸBK^!å¯ã%‚íºß.¨‹L;LHñÝe@…!Èí´–\ ¸Rûozê¼G̾½‘¿rbDÉ "+ˆ~ wc×—Z ! â$#CC@Uñ ,•'&—qfDÔ²˜ÉKИr8a#IhGR !±ðG ÷umÿ ¼eG/7ÙË—-Д”¥!(JBR„¥ % J@)Uñ,Ï Â'H¸ã²"´ô¸®B{ÌÁbZÂõÍ¡iïÄu½l{‰"_oÓ²)ÂápbÜÓ¡¾0mÑá5¡¿ü¸èB7ßß­žÛ=…ñäªÉ[ˤH‡*èÓ,°—%Û£Hl!¦’Ózqµ6JP„€xïc{ßz 3&æÇ FOí”ùÖây¤Egˈº#Ëù~–‰ûß=÷­ÐxWˆùƒ—ײ7îLH™!„EqÁŽìbÂBòëAd!7eÛ—%ØI}à9˜Ï´êVëcÞ•‡Vò–謯‰–‹v?âFW`´Gòð-·¹ÐâµÍKé²ÛëBÉD¨é ’Iøš"ÓÂÌnÑ{ ºÞà5=‹ ÎnÒŒvd>¹ Çm.¸’†ÂŸ Q Odü  4¸žaÒò~v$8v„aÉÉÜ·½ppÄmÿ5åÙ}n©€°§¥©:JTIŠ­…áå™êñs±ZµÃǾۢC¹>›|â솢¶®³ÊKí²qEAkJ’[P*¸"³&²cÎc‹ÎŠ[å[²K\y®Z¤Läxî-çp6ë/%Å$-•)¸®Ê*ÉY_-ìÄŒ®Áhåà[os¡Åkš—Óe·Ö„'’‰QÒ@$“ñ4E§…˜Ý¢öþAu½Àj{ AœÜ'¥ìÈ}rŽÚ]p)% …>¢žÉù@h6Íøq‹; ¶Üa3Þ¸b¿[1¶æºãr'y¯.ë ¸…õ]lÞy)JÊÔ”€}䪼èü¶Ø^„å†Òþ>ÆCzŽ—K¦ØžkiÖPVJ¹©Ä! %An%*=‰¢!f¶ìGñ„[í¸l¬²#Û‹\¹R–Û~f,õê$)ŵëü5ÚŠËx™h·cþ$ev D/Û{+\Ô¾›-¾´!<”JŽ’Ù$Ÿ‰¢!â2mñò^԰¼FyÔ²¸Ó} žD[aÆ×±¾Þ­|àÕV‹&…bž-eV(Ø‚.ð Þg[í¶×$¾8ÉRJ‹j¸G‰ •b5ÈÀ°ç3»Õ®×Ž‹•ÆÝ޳5¼eZw%ü4­ ¸JÝ_¯žÛ)äx’B¯3Ŭ¸6w‰8l5ǿڢ͓d™*J›†ó®-§ mÔ: TÚˆJ–JIâ­êŠÇø™h·cþ$ev D/Û{+\Ô¾›-¾´!<”JŽ’Ù$Ÿ‰¢!â2mñò^԰¼FyÔ²¸Ó} žD[aÆ×±¾Þ­|àÕWÒ­žb²§Â]ñ"ågeeÕÀÇ÷­OOq0"]BêÇ~W0¦ÙARÁRœN–‚çÆ ¥Ël¸Î%â-¢"1¢Ï ÙvçeÉv_xf3í:•ºØ÷¥aÕ§|‡%º*|<W‹"ãÐqÏjýÏ=r˜xyŵ5-!¥A×82V¾)PZº~ÿ}žñ‡ ‹‡^¬â-¬Ú½³eszÝÖS¢ÊS¸ÈR‰We´£ÅD©;âI"ƒ;‡ˆK¾4ÄË$ ¡xÙbáqòQz„)×y·¤Ëÿ1ÈõvÑ£a›Yqœ/>j |1A*ÙÔÚüä…ÄLׂ Ë­¨9!•¹Ü‘¥¨T¯Ù¼*°x‰:Û|kŠÊlM©Pg¿9èPoJKeqÔäB_RK€úŽŽÒI#tÛü4bY¡ng‡Ø½Î=Ò#[¡Å•qr ºÁæ$%òTAqgD¨q?Œ±ÛNo&ÅŽYaÛSje˜S›†ûî²¹È@ó%çXHt­ÔFÄÐbª…@ P( @ P( @ P( @ PAºü˜ÿ¶ÿ¡TŸZˆµ¥( @ PrWã-þÍæš~Ç{?㳿呬ߩÉmFJ‚ïËgáóäˇ$Æ'Dr Øs¥1*:ôTÚø©*’R R¤¨‚ÕØñg û¡rô«m©Qµ‹"­•ù/g€5A}@¤…òçϘåË}êöÿ¯rÄ嫯ìRWÚ-P!¸‰bÜÀ$Ç-<‡P°9ie­­G|ŽÀQ/)¶ûu7†pL}¨Ý.“–ÎSŒç΢§SÉW»º\O»üNè•e7ºæ›•Á¨Ì%–‰4VúlFa±¤6ÚvHHÿI$’I$Ð{Ä²Ùø|ù2áʼn1‰Ñƒ6Ä)LJ޽6¾*J€ä”¨©* ‚5A¢·øÅxƒ–'-^7b’¸öÑj ÄHCæ&9iä:…ËK.mj;äv ƒÄShºÎ›iì1`]`tûH2Ý‹%®¢\Ú‹©ä«š­¥Äè k]ö“c—-ԣūòo‚è-6"-^Âö?EÏ$`o—C\úºç÷Î]N|ý\·A_ˆ’®YL<–ëŽYæ5mŽÔHVµ ÃŽËcM¡=7Rî’v­— *$¨«f‚q–«8É&eØm¶©W\‘- ý7ŸqÅ-nó®©E^äÒG}‡ŒK-Ÿ‡Ï“.X“È3aÌB”ĨëÑSk⤨IJJ’ R#UDëˆï »¶=f—,FíñíKiÔÃf2Ú8¸NŽÕÈ9Ì’IQÙÜåx©*ö»í–ÿ3wʵ¶¬²†Û1[†SÁ[à=þ¢I$’I$ÐI½ø±eY”\Ó0‡üü8ìGf$çåé 6”%CƒÉp¤—¥€V¥;‘AQœeªÎ2I™CömªUÁ×$KDÿMçÜqK[¤<ë…*QW¹$$4‘ßa ¼3a»±v~Éì#ži5O%¢¯‚EÆ×Øè+]»‚;U¼c”Î?ÄV°\i7+“r:íƒ84$<²·%6|ÏQ§%$-)H>”ƒÞ Ï/)¶ûu7†pL}¨Ý.“–ÎSŒç΢§SÉW»º\O»üNè•#Äw ª.OwÇí‘–ãĶ-/µ;M§M¡—Pà ÷÷Y$ì«–Îà‡œeªÎ2I™CömªUÁ×$KDÿMçÜqK[¤<ë…*QW¹$$4‘ßa ¼3a»±v~Éì#ži5O%¢¯‚EÆ×Øè+]»‚;U‰ž,ÜefW\ɼZÃwö_fñ´ÉTK‡YÂëªp8òœI+⯽­% )ƒ¸"MñEÎðÍÆéŠØ&B‹ÈÖ§xE ä”¶¤ºIäT¢®§"T­’ x›{VkkÍÕnµ—ì‰aè]‘ÈûÊRŽ\ˆIõz”IWulì2¾ô—œ“!Õ8ëª+ZÔvT¢vI?MQ À³i éwØ–;eÍõFr;bw\ ô ­©—Z`(+c‘×}˜!.Ï}“w²âV81'A]¾u©&S±%²² ‚˯­ÐIVÒâH(I>ðý›â4«­õ7{Æ1b¨-ÛcÚÝeÔŽpCe%ÔA<ºœ‰R¶O#Aù3ÄY—Kè¼^q»øÈ„ݽ‹c±ÜLXñÛ×7Óq.£Zß ç#µl…v[–Ü3 ñæM‹#P¢·H”3:7Å´(©D•(’TI&‚F›HÀoK¾Ä±Û.oª3‘Ûºà0W ]mL¸ÚÐàA[Ž»è€öŸ/–»³·|na‹}Ë­ØnZK€íJqå¸vuÛ–» A¡ÿNÙ|¬Ôç—èP/wÛQlŽ‹ƒ²Ôˆ‰KiAu•!ô¸Û§Š”T•ü§\P@g_lEåw6|?ÇÖ.[U玣Ë}@µÈSè_aݧ·mhÑ-Ën„øó&ʼn¨Q[ƒ$FÊâÚŠ”FÔ¢J”I*$“PHÀ³i éwØ–;eÍõFr;bw\ ô ­©—Z`(+c‘×} xŠmYÓm8u†, ¬nŸi[±dµÔK›Qqõ<•sB´¸ k¾ÃògˆÒnY²ûrÆ,’#Y¢¢ Q[ˆÃ(*R(y/-j^Ôá$“½ŽÔ—ßQær³IøN=Õ¸-×§AH”cIyÅ©ktò|¸…+ÿ-h@6vYVSqË®i¹\ŒÂYa¸‘£Eo¦ÄfCm§d„ñ$’I$’MQÊÁzfÉ-ÇäØm—v]o¦¸×8[#`ì)µ¡ÄzV¶=ÄŠ ]¿Æ;Ä ©¼¥XÍ‚B¢[=“o†¶ä6Žî,)§’ê\^œ.}ñG{ÑR§/¶"ò»›^c‰Šë-ª3Ž£Ë—P-r é^Àî—GnÚÑ;¢R¼M½«5µæê·ZËöD°‹t.‚„HÈd}å)G.D$ú½J$«ºŠ¶wQ÷Þ’ó’d:§uEkZŽÊ”NÉ'âIªwiÛ̦þç۽dz4¦ÅÍÙ i 9p)ꀲ¢Cd”§är: ¬¿`8ý‹>‹Œ¦Ó”\.Ž1lÜØ–âA1Xl€¤¨Ñ=Ò Þ‚ÄÜJ“û²€1#Év,²“& ®6¸Ï€ ˆ'GA? ¥'`_ °è9d˼‹²g»Én3ÝoГ-jy¦a¢R •)×7ÅZö'BƒeÁdüŸýYwTØÆ42UFyÖZšÚzþYQ–ë- ¥ð §T”¡%E#Z ®ƒáTr»ËUò-ªÓgEÝ0™–Ä©SŽ4Ë-1%¤ uäiÔ é$j‚¿)ÅðÌ*ýorçiÈgÚ/v†®0â&àÔ9‘V§ÚÛyÅGq+(q—SÙ´é=»¦‚·Å\wÄòÕãØëW|¤Xâs3¥·%lLSao2CM‚*à}Ô…|5Aûá¶,™w‘vL÷`Ù-Æ{±­úe­O4ÃL4JT¥:òø«@ÄèPjŸðŸ‡t—r|ßdcFNݼ)´\H2SqÔál¥%·z…NtþB à ìUVCáR"åv[u­épíW»+9vârß A}U˃ ¤ºà 6IZ ÜPâ”…«]µQìþ3uÍ.¶éë¬ UªÎ/kaWŽºó*Sh@n`Ôu6Và%ý% Y#Óª Y˜]¾Û£•Šäïµ.;o@¶A•T©E`†ä´…6êäCˆm[Ö¸ûÈ ïq(VOìXÊÄ%زÊL˜.¸ØRãwiÛ̦þç۽dz4¦ÅÍÙ i 9p)ꀲ¢Cd”§är:¨+/Ø?bÏ¢ã)´åK€ÄcŒ[76%¸LG )#j$4Ot‚€w ü¾à6ˆmb¢Û’]<Ä(ï¢Í ¶nMJq Q†âÂѵl†‰ìBI«%¶ØÕ¦ß =Ì·"3M¨¨/®[RTµ)N×Ìé#CAîïâ–ÿ—Z¯wljo²ìИƒ{ L•!zeÉ+eajÙîzcÒ@H‚¯Ä\šÏ™æ<®Ñe™kö¼—§I&zeêC®­Å”)-5Å HQ;Qß`üÂ2ö±97&çÚÍÊÙz·¹l¸EKý­•-‡8¨!iq¶Ô J‡§Dh4ÐüUÇ“˜A¿Ý0gdÛlv”ZìrJW  ’‡ÔãŒ-,)n¯Jh$­`ëIâB»ÄKªÿ|¼É·d–ç \›{K³ÔVê[¨”˜è QSiØSj½öWÌ÷É/]¼aò\´[--Z"GnêS1mjXqR E+^Ô¡Ý®1•[L￘aÞ¸_˜éëªûàWOÃŽ»PC‘âL 9¾=’;Š¡vŒa˜Ñ ZW,«m0JЗ]áë*uJZô€"H÷6åp™w¸ÊºÜ_Sò¦¼¹º¯zÜZŠ”£þ$’j‹¼#/k“rn}¬Ü­—«{–Ë„T¿ÐZÙRÐà(sŠ‚—m@”¨ztA º{ÅËm—¸ö»•ºÝe·7j·Ç¶ÞdvÈò‚ß Öµ(ôøžjGmKÏyTÛì›­±¸¬G~ÞÕ«ÊÜc3uç·: :©M¬8µ;·¾#k; ¯ž-£$ñ2Õâ ç‚ë6´BÚÊYއ•¤$uÓIä’´rÑIÒl”§A„¹\&]î2®·Ôü©¯.Cî«Þ·¢¥(ÿ‰$š¢^5>Ïk½E¸_m³'ÄŽ°áb$ÄÅqJÓ÷Å4àzØàv;l{è7ÄÜ%Ïn~$?áýÅáq\™©†í饘×Sžaµ˜…(äx¶¶Õ¥J•­T±ó[=¿6û«µÃÊCkyg#Õľ²JD¶Ø@I;ÿiµ{Õ½ì.>)‹Ïˆv|ÖñaTØv0Â#[Ÿš§âQZCÏ©%N:¥-dÈ©@‚4«•ÂeÞã*ëq}OÊšòä>ê½ëqj*Rø’Iª%ãSìö»Ô[…öÛ2|Hë"LLW¡Ý?|SN7­Žc¶Ç¾ƒk7Å[#ùÎM“Åħ"Ù™1)«Í¹ë²\qJ~G]Jaä°ØJÒÙHR®'eAZy.E2ÈÆ÷8¬xc*¶ùóæ 0ï\+ÌtõÕëzùtøÿ³ÇT÷|ç¿Ý`ûW«%ªÖݦ Fnœ%2ÚSC ´R¥•¸á;kŽ• ‘ @V癊s;¤9L[ ¶è [b´¹÷z-ĺ騾ç¿h¼<Éì†CíËþ2íè2ÊÄFÛ˜ˆæ<’Gým:…”w!*Aˆ'zÑ H>!Y-™â|{Úe§"€ä´[•å/Ë‘Íĺ]L”°€•‡m`–ÕÝ'|ÕÏôºÊ¯¥xÉûœwN3ì´Î!äÂJà‰5Õë'¨UÓâI#ŽŽ¨+îùÎ7ºÁö®!VKU­»LŒÝ8Je´8§:†Ah¥K+qÂv×+A#@€­Ï3æwHr˜¶1mжÅir îôZ‰uÒQ}Ï~)Ð(=xy“Ø1 ‡Û—üeÛÐe•ˆ·1Ìy$ŽúÚu (îBT‚9Nõ¢â4‹=êçtÃXÃW¦Cwò){\•uŠRÔìd íiB¾FöìüfYâe«<Ë•‘e˜{NE6øÐSÜë0]mM4Ú:ÖØâ¢J ¶Ö• 'Aæg‰'gv ®N*·ãŒÅÜôµ¼Ü}–úï}ðò×/@ $h1w+„˽ÆUÖâúŸ•5åÈ}Õ{ÖâÔT¥ñ$“T_xy“Ø1 ‡Û—üeÛÐe•ˆ·1Ìy$ŽúÚu (îBT‚9Nõ£½»ÄKªÿ|¼É·d–ç \›{K³ÔVê[¨”˜è QSiØSj½öWÌ÷É/]¼aò\´[--Z"GnêS1mjXqR E+^Ô¡Ý®ƒ¥…vwˆ.ò͹;d×Ï)’Ë…—› @q¢OM`éÙH Õ¸F ÖY&ääû©¶Û,¶÷.w Ic¬´2•¡!¾I Zœq´€T‘êÙ ƒQÁY7™»u¶ôì»;ÖVò§³o[’ˆµ†’”ÆJ‰/Èk¦®]ùk½ øŽÛœ}Ë^î·ØJßUÛDÖÖ 8¥Ø®<€ƒ³ßN+·q¿u;®%ddzÛö#d¯G‡bŸ. ¦1¼ì‚ËűÁža!J×-)ÀÔN¶3¼@áw–mȸyØó ƸÆyL–\,¼ØZzk÷NÈø‚A¨ýÂ1²É7''ÝM¶Ùe·¹s¸JKe¡”­ òHZÔ㤤VÉT5øI‹”™2• m‹Y"nMÀäû‘y %"9p¯Y| KœGZ÷•.Õàšn™A³±z¹Ë·¿ ŽÖû1“2\r¤¤6˜¥ÔéÎEi 8G èA¢2’ñÜjß•L³]/w»liœ›déO+Òvß•¥['\Šw°HM<ï8]å›r.v<È1®1žS%— /6€ãDžšÀ=Ó²> Aª ã0,·KÔ{}úç6Y õáÂD§ÉÒ~ö·ZÙîyvù­×²cÙíûÈ2W£Ã±O—S€^vAeâØàÏ0¥k–”àê'[‚õÏ[‘L‡3$-Y ØšÈ߸y#×L7C}4˜åcO)n¶Žzõo—ô.8ŽË”Úm—Lšj¬·ØLÏ·Üb[ãËmÒR¶òHZV…áÑI×**ƒ3Ǿäs î)ç<ß±nR­Þc§Óêô]S|øìñßëg[÷š¨çŒÀ²Ý/Qí÷ëœØd(7ׇ œ 'IûÚÝhkg¹åÛæ4Û„S.>#dØ+'œ‹?1æ1O<ëlH $µ*%N8â›JQËÞ¾êÐ& Z¼%“yÍ.8ÄYfcZbyéj•eu¹í£’–ü˜Q%å8ëhJÈ<äÈ ™ØÆ/bÊ&XòkÎIoŠÃaHQÇ’&‡£;!°ßb{‡îÞöLjس ȱÛoR®;ƒSÆL$Åu‡l9ÑZ룒R¤oJ:$…M‚ŠlÅ£"½½k†ÛEeÆ!™N­[! òBIîO©iIï½FÑ^2ÍþLy8E†%¬•Ë„K¡°Ú|¹Xûò–êÀ¹Ç¾ùqïPu‰à¬›ŽLݺÛzv]ë+ySÙ·­ÉDZÃIJc%D—‹ä5Ó ×.üµÞ‚Ä9úÂñr¶ÚñËx¸ÎzeLÎmÆšK~QNÔ.<®§ò ¥Î1ˆ\!7ãçà]mìÜàJS•»ÍͲUÁAIZH PÚ{4jŠû;Ù‹FE{z× ¶ŠËŒC2Z¶Bä„“ÜŸRÒ4“ßz4¯ gBË­¸ÅžâÝÁ»Ì(÷(rœl±Æ+Íõ:$“Òà€¥/¹)*Ùêy?†ZØnÉ»sn+íNqƒ§¢· ¸´•+¦„!d¨“Ù($ëܦA€c¸Ç‰ Âny\ç­Å¨Ž5r‰jJÜsÌGiä}áo£Cï ÔßmëáEg³<{îG0¾âžsÍûå*Ýæ:}>¯EÕ7ÏŽÏñÞ¶u¿yªŽ6v)³ŒŠöõ®m—†e:µl„7É '¹>¥¤i'¾ôm?Ñtdr-ïeZÇÑ“ Á*’¸kJ”ˆÅcï¿|Isˆ«—º‚¶ùƒX1¼‚,+¾Zú-3mŒ]cÊE°ªR›t–Ì~ J\÷Bx…€Cö÷„cX¦F‹fM“Ý·K¶Ç¹B• Ї¤-!+B]aÉ w¥«¸Ø<¨!xˆÛ0œ»¶õ*ã¸1¥¯EÕ7ÏŽÏñÞ¶u¿yªŠz@ P( @ P( @ P( @ PAºü˜ÿ¶ÿ¡TŸZˆµ¥( @ PrWã-þÍæš~Ç{?㳿呬ߩÉmFJƒaá¶c™wvTö ÞíÆ²mú2b-/4ûO´ ’¤¸Ê¹'`žàèÔÑ㠌ߜŠMõ5cm㨞žÒJÑ$KLÞ<Âzždpê|“®{ïAYwñ¼e–™ÍÞ2«TL~ÔÕ¾Ûvˆ«U.-ÕÈqT­o¥$¢I4ø³–6/ÐääSgE‚ÃÕ¹ "$»´€·[dhžc^ýuQ²È2¬"áâ­ß8´dyuµ‹¤É7F&Æ„Ë Iyõ/ŠP™8•k˜u²IÞ€0[;âþ>þ]qšâoiƒw°µg›vB[7¤´ëo"àP]ê2ÞÓÔÙJ{¯—z \ƒ4Ų|ÂÂüÙ—¸öqÜaÇžZË@!×Ò¤úö’Ný#]«rÆÅúœŠlè°Xp:·!DD—v“°ë`ìÌkߣîª>'ÄÌ=Ÿó{Õ²nBl™ìiÍLsÉ2ÄÈ*‘(?¦ÐR^JJ“µ£’T±¤ö&Öü\ÇÚ¹»klßbN$äð†üúë ¾|>P ôúšéöåAOtÍp»¾k‰É¸ÃºÍÇ1˜Q`=Öm±.àÛ+[‡š9” (¯§®jâ€;’5A‹Èo— šûpÈ®®õ&\å;-õ| Ö¢£¯˜lö5Qmáä¼ßùüý›ƒðc²·#³"$¥É Ž˜yµ:×&‡r  ÐO`Ijmþ#Ymù}þá+"Èî²{o”•r6öaΊò^iæœe”>´iµ°ÐJCˆv ÿéŠÈ«Ì«yUñ 8¯Üª¦€ƒp)/ù…IR9ñ*SÅ{o©òG=÷ ‚÷‰ö‘”Ú^¶\¯PíV», ˜äÒ¤Li*RÊŸˆê‹. •†”²PQ) ¡ñO(Þ±¼—<½e¼«“±/s¤Ü”‰ðÛŽã<òÖZ¸”…'×´’wéîü<—‚Ûò?Ÿ³p~ vVävbDD”¹$Ó6§ZäÐîTÁ: ì 5v1ûNuyÉÈr9îÝíËa«è¶±ám’¥ õXe2€h-. „,„ñÐØr¿gØÅû6ƒ¦ñ•[žmf7·ã6йɘ…eº€êAQJ¸v{–’T£°C…û9Ã2?ìÙ-æÒm¦qQsuÖÚó·u³ÝN¼®NzP¯R²T­ì1Y òá“_nÕޤ˜§e¾¯ZÔTuó žÃæª&a× eªò‹…Æó|´8ÂyÅŸf TˆÎìiA%mòä;8ƒÜŸq ļãÃ<“Ä6rL¶%òTv¶Ùëª/ȺOl™ë6 NýIK¥JH*<”ª‚ŠNA‰Lñ2&Qºß2;Q’Ü»‚¤Û™‰!þ}´—ÜB[ÒP¥Ž)$Ž ­CÈ3Çr¼Þå9”Ìœ»„§¡DD—K…e|RÚÝlhžß,h|µU]|Q½cy.yzÊ1yW'b^çI¹)á·Æy嬴p-) O¯i$ïÒ5Þ#+T( @ P( @ P( @ P( ‚ ×äÇý·ý ¤úÔE­)@ P( ƒ’¿oökÿ4Óö;Ùÿÿ+üfýNKj2P(x–%pÌ'ɉTHlAˆäé³&-Ib,th)ÅñJ”G%% %*Q*º ±á6A÷Bå•W+Rb7kµ]ËËò^Ï jFÂ:…%Jãß3ÇŽûT·œÿhÈàã-.R.ͰõµèK+jkOv¶Ê‚N‰Ø!A$AF‚e×Ãiñxë*±Dyai¸r’ì5õ™C­„–™S‡iq#|5½÷×z šÁ3É.¸½ÅÆ\•gœüÖÉ%µ8ÓŠBŠI”’“­€uðDœK¸fäć*$6 ÄrtÙ“¤±:4âø¥J#’’•(•Ý„ÿæZoíÙ®¹’$g¡7qbèãîÆ^¸8ß˪Ù:àæ U´Ž'PIO„ùÈ]±®ãjn36±{]ÕO/É))‘°‚çT”„ðçÈ„ñßj|<6{è³ßó ²;ð›¸C¹:%»k.ko¢ÂÜïêì´'E Dh„,ß »1i‘y·\Õ"yévX 6òÛ 6ÚÒ¢‚•h§Ü¡AËÄ®„ù1!ʉ ˆ16dÅ©,EŽ8¾)Rˆä¤¤¥J%@wT\«ÂŒ…9 ±›…¯Ë h¼›·]B jG"ž|vB8ðçÌñã¾Õ\lNŒ™éÌìM²ð™óKŠáV¸!•<’IÖ”ØÑ÷èwª:¿…7m˯8~E–Ù¬ÏÙ%H†ô©(–ãºË¥µ%¾ƒ/¹‚¤$hwÑШ9føkø=Ù‹L‹Íºæ©£ÏK°zÁ·ØPy¶Ö•«E>å X–%pÌ'ɉTHlAˆäé³&-Ib,th)ÅñJ”G%% %*Q*º¢ìøK~EêEµûµ¡¨1­h½®ð§œ0Œ©)CÀ„HRÖ”†ùò:â5ƒáV@2cö…¯Ë&Ú/&í×P„ 5#‘O>;!xsæxñßj Öq[Z¯OÚ¥gøôXÍ´jä´Ìr3ûÖ’Ôuº•w=–ÚuÄïá°üÍð×ð{³™›uÍR!Gž—`õ‚o -° óm­*()VŠ}ÊqË3û³6©Ø€ùâ™3RúšåðIè¶âöOaé×ÎEQc' ~ߘÝðëÅþÑnvÉ*DIs$:ç—äË¥µqAq{Pì‚­wÐê øO…Ûî6¦ã3kµÝTòü€R’™.q%IHO|ˆOö ?ù–›ûvk®Ed‰èMÜXº8û†#ñ—®7Ųê¶N¸ù‚•m#‰ÐVåx­Ã¹·nžüY)‘©‘¤ÅY[2#ºžHq€­ðPAŠ£†9fbÿvfÕ"ûÐd4ÛðR’’v—Ü€=ÿôo> o0›‡d™®=nrv$ ÊóoE|:Ón¡-–XZÉ(t”ö=ýÛ üß »1i‘y·\Õ"yévX 6òÛ 6ÚÒ¢‚•h§Ü¡AÁfjù1q¤_-¶–Zhºä«ƒ‹Ki JÖµmCÒ„¨ëgZŠ4ƒÂkø¿¿ezéij4{Ro‹º©å˜~AA<_(.JÒß>G\wº‚¶ó€_m9 »Žc]¼4Ãö×`­JjcovmH桳°B’’;¨•{ðÞ^;™ËÃoY=‚2¡GfS·!ÕD-ºÓn  ¥²ã„¥ÔöKdûδ ¨*²¼Váˆ\Û·O~,”ÈŒÔÈÒb¬­™ÝO$8‚@Vˆø( €EQÅgjõ5Q_½[­L¡²ã’§¸´¶‚¥¬ìJ£ï:Ð$ÔÏ%Û/âËvÈìpc®w&no>áŠügJØKeÕ“Èz|Æ•´Ž'PK>_›½ÉµÉºÚ…ÖÝí˺ÞpÂò.Þ(.¥8„„†ùò:ãØÐ?Ñ=õ7©×®Ö† Æµ¢ô»ÂžpÂò+RR‡.žKZPçÈëˆÑ ¢ÊñK†!rjée7&3SbKˆ²¦dÇpm ¨%Z=Æ”Aª)¨ @ P( @ P( @ P( AëòcþÛþ…R}j"Ö” P( AÉ_Œ·û5ÿšiûìÿŽÎÿ•þF³~§%µ( Ç…™%¢ÈþAj½ÏjûI‚Ü×£ Ç}Úl%Em•1Å@%]•òHب6ÇÄ|Ewgq¿mÇM¼áícȼ*Ú£ËDÑ;ªcð*òåݷǧ¾:<5é ¯»x›†A¼ÆŽ›t»ô{~.œy«ºBmŠK‹uÇd<Àr;œRCî²m$ ’4ó»æ˜ø¯ía¼û"ÖÜ;j_tqçÛ.1”„³¨éôþB‚”’­¥*%g|^“d¹x‘ß±ì†âêå.æËÑšßM/>âÒÚÒûm«˜Iñ=Æ”{è‰d–‹#ùª÷=¨ _í& s^Œd3ôHfCju°•¶TÇ•vWÉ#b‚ë"ȱ›æSabWlŒÎ3df7)¶U=Tó8L~’ÊZäúÂAdöBv„ï°^Êñ›—ÞrüÈj÷‹Æ´H»{† g°ë/%hŠPT˜§Ë¡¾˜o]É „úh3¹%óɳŒBÙr½…c–|kuÂâÌ5¶™ Kξùe ¤¤©å6€Ri$„pbs ’^a”]2y¨Knܤ­þš~KH'ÐÚ~d¥:H2EQ¡ð³$´YÈ-W¹í@bÿi0[šôc!˜ï¢C2S­„¨­²¦8¨«²¾IöŠØýºüå¢Ù“&)ÃSÇ¿·Ä4ÜÁ/ÎuÐÒQÔm°áRR€´é* _,½ã™fy>æc ›}¾37\‚\i!¹òšZÖ§x¡¥<¢RPØR›EV·º+–\¬÷ãŒÛÔ̾,ÜZõ|‘u“.$iAMFrBÜ,”8ÒÕ(Ðô‚V=GGDc³ ’^a”]2y¨Knܤ­þš~KH'ÐÚ~d¥:H2EQ¡ð³$´YÈ-W¹í@bÿi0[šôc!˜ï¢C2S­„¨­²¦8¨«²¾I¦oˆVEäÖû< Õ¡ë4leôé7toŸ÷õJ^Ú`%ö›,pR:hô¤\±ñ•K…i¼3g‰÷Þ1ñ ¨f3íÈL”¼†ô§’ØXR­)ÑèY·A“Ê/˜V[â0»þF©–øâFÈoiŒèUÁÆÖµ:âRRR‹e ­!D¤)Zîh1†I/0Ê.™<Ô%·nRVÿM?%¤èm?2R$™"¨bL@‘‘Aöò¢3O%åÊ–‡ÖÚBO-i–Ü^δ4l÷ w¢¶ÙdŒZãã û&µxcT;Æ]Þ É‰b$»!jK2z9W …lé§½ žäDh¥x‡ÍËï 9~d5{ÅãZ$]½Ã3Øu—’´E(*LSåÐßL7®ä†Â}4YEŒß2› 2»dfq›#0¹M²©è¤‡œyÂcô–R×'Ö '²´'}‚ÅìŽÏ“åî6‰âr›¶Å2SL­ˆïHmTc´° M„„£Š@ÑÒR(1& HÈ ûNùѧ’òåKCëm!'–´Ën/gZN¶{;ÕWÖQžcvO¼A»Y³¸‚lÄõ@¼Æ‰+Vç]š™ u¶RêT@6•ñ+J’IOhŽÑüV±EÊf†rò™·A99O”{N\‘!/¦Q:äqm u8u6½lPUÜ|B³ÉÌXJr;]Á™XãvkýÎëR¢]ÞKR·Ca2t8²¡!¦RH42ûF[|µ5a 6+<{KNGަs‚–µвVéJJÉY ^¢h*¼<¶á—<‡YÞBÕªÙ•¿÷Æß"[©#„~L6âÛ 'ºø$wÕæolF[’1~Ìl’"ä6&í±gÀ%vûqeæŽÉaæáe"2[) ¯a{<Ï* Þ"aÍdí0Íþ2¯ö ³ÖçorbŸSέØª9<ÚP¦”¢ßmÏfœW+ñ Å1¼²ß¸vøÜ®‹‰%¨.HdùviN6ßÚÒÈÅÑT/I²\¼HÈoØöCñõr—seèÍHo¦—Ÿqimi}¶ÕÌ$‚x‚žãJ=ôD_-¸eÏ!Öwµj¶Geoýñ·È–êHá“ ¸¶Â‰î¾I]õAª“žÙíy}Úí|r>P›…¨[¡¿ŽËzÜÝ­’}&<ÔB@ ¤µýßÉqG‘Q&‚Ï*ñ7ÃaŸ\¯Ö|võp‹?…jL–¯ŽüwVZuM)qÓB˜VÐw·’¤„…~q|ðÃ2ñz×rn\èxÉkjç%å©õ) Åi! K(P 7Ò÷V Á P a’KÌ2‹¦O5 mÛ”•¿ÓOÉiúOÌ”§IæHª'øymÃ.y³¼…«U²;+ï¾D·RGü˜mŶOuð:H:廙wiÍ-13ëÕÚñšXßve‰P-3b@–å¦ ¶ÚÈβ•­”°… $´âvP¢A ?/þ%aò•ÜÕUýçñ¶¬ògÚ¤û- Iî—\ˆ‡XXi²Æ™ãÒ@N¥;Ù¶Eå>'¢ý^Ú´GbÙoCr¯Q Æ+’ŠËE kËl%!%'m8´ ï²;>O”G¸Ú'‰ÊnÛ4ÉM2¶#½!´qQŽÒÀ-4Ž)GIH ¥ÃDyD‰—û}¥l¤w®6Ó6"œz]l6æÓ¢O÷k·ÄQôÕÃÃLëĘóòLÁ–-Ðìì&d¡SQ®ZHHe„6Ò܌ʇýÐ _'iMAf]<ö{³ó Vál¼[n|y ´¢*J Q:}6ä¶–ú-”©´•”¨ÐYÞ>ú‚¾õŠäýé8õÖØãsÖ-4Ú’ðy.[SjA)q*qRI}Qc3ÃlÊÝ•JÂî¶bÝ ´‡å6ôèèi†Ö„-+[å}$¤¥Äw+ÖÔ¿µAUc·œ^ä»Eö%(C sJÒ¶Ö¤- A)ZT’RIƨõŽãW¼®ãì« 1"@io¯“¨i¶š@ÚÜqņнJ ž‚ÁÏ2ær1™Ö˜šÓ ”²ôÆŽPIKÞaK ôÈRt¾|O!£Þ ü>å(ÉF%&,8—%¶—[L»”h츅$) Cî8––))Yå¾Ûª95„ä.åR°§…ï CÑjeÆ4fÐóJ(Z:θ–ÉäQßÃt×›EǼN°]ãùyöÙ.Ô×4¯¦ój(Zy$”(°H?AßƯy]ÇÙVbD€Òß_'PÓm4µ¸ã‹!  z”@=‰ðç3/ܱn}5À<Ùk¡ÃŸ[­Ë¥Òáêêrá¯Aɬ w"°öb'©!H.Ýâ7ÀFÁD…:^÷ÛŠÎÏa³T~ÆÀ2Éy5ËfÖ‘s³­ô\ä–›j/E|S)A¤¥*íÈ«ŽÈÑî*;yÅ®J´_ayi)B8—¶Ö¤- A)Z!I$ª=c¸Õï+¸û*à H[ëäêm¦6·qd!´ïRˆç ´O†™©È^Æ ™(0šé\¦SŠBƒæAXg¤B“§9ñ<†zƒÉðï)núö91«d¬°™GÏÞ!ÄeÆ”R¶ßuÔ´èPP#‚•±²; é/Ã,¶C˜‹C3çEDØåwÈ";¬¯º$uº;PžÎƇqAEy´\qûÄëÞ?—Ÿm’ì9MsJúo6¢…§’IIÒƒð5G[†á’ÜÛ´Z× 2]‡œžÄFξGÖ„lüö~ ˜Þ’¹’Ü1#–®v§^br–ËMGSKàç7–°ÒRéäU¢HÑ;ÑáÆf¼‘X˜³jâˆþmARK)ß\¾UÒ q õ9ðÑêÕxu”µ~{šÕ²ÖXD£çïâ2ãJ ([oºêZt((ÁJØÙÐBÊqî=›mý˜­½&3s1¦±-µ²æÊekA ŽþíqG †á’ÜÛ´Z× 2]‡œžÄFξGÖ„lüö~ šÆ •ÉʦaLÚT«Å¹çØ–ÇY°†Á!Ò·JºiBJNÖUǶ÷AÒ7‡Ù\ËëøäXÝ—ƒ-ç:9ІxÉçÑ ú€çÏŽÈßjƒõ~åÍ_ÜÆŸ¶´ÌÖ˜L¥©éŒ70 ’—¼Â–éžIÒùñ<†z¢· Ço8½Év‹ì#JP‡@æ•¥m­!HZ‚R´©$¤’=탻dÓÐË+q¶‹Î­ù-Gi¦Á©nº¤¡jHÚ”;>4iðß4VH¬OØ¥7Gój ÒYL~úåò®k‰©Ï†ˆïP~§Ã\ÕY¸·±‚g³ιÎS)a1¸…Ì‚¾H¥I!Î|NÇ~ô\ðë/fü¬qûk,ËLtÌ+rkåÕ®/y‚¾LòH çÄ’÷TVdíç¹.Ñ}„cIJèÒ´­µ¤) BÐJV•$‚’A± ý°c—lšbàÚen6ÑyÕ¿%¨í4Ø -×T” mIR‡rƃÝçÈ1ûÊqû­±Öç¬6Zi;ÖK€ÔÚJ\J%$ƒ¾Æ‚á^ç-eW .M®,kµª(›1¹7(¬´ÃXZŸ[ 8ºƒòÿÚù÷PC‹€äÓïÒ1»{0%ˈÁ“!Ø÷H®Äi.*R\,%#’A%zñ=ûPWäíç¹*Ñ}…夥tâ\BÛZB´-¥hP …$~¨ý°c—lšbàÚen6ÑyÕ¿%¨í4Ø -×T” mIR‡rÆ‚Ñf«ÈŽ‹Â{1¼ëœä²†ˆP|¾T ©$9ωØïÞ èÏ…Ù³××ñÏfÅjdh^ÒqoÜ¢³Êztð·*Aä(,ƒ¾ÔÙ¯R23г"ʹÚ(_!yem €™=^‚p4Nûk`Š¢¶óh¸ã÷‰Ö ¼/>Û%Øršæ•ôÞmE O$’“¥6 àh:رû®I5P-,²§ÙuÅ¿!¸í4€@*[®©(Bv@Ú”È x{–·s~ÚÓZa2–^˜Ãqà )wÌ)a®™ N—ωä4{ÐzG‡šòEbbÍ«Š#ùµHi,¦?}rùWH5ăÔçÃDw¨?áîRÖJœFTXQ.Km.¶%Ü£GaÔ)!HRqÀÒÂ%+<·Ût›EǼN°]ãùyöÙ.Ô×4¯¦ój(Zy$”(°H?TC P( @ P( @ P( @ P( ¯ÉûoúIõ¨‹ZR@ P( %~2ßì×þi§ìw³þ;;þWùÍúœ–Ôd P(>á ÆØË™MŽ|˜޾ؕ§¿ÐŽãÈ•þ‹ŽòOM.!•£‘R{‘ê؃|r¸ìÉuIBД¤JÔJ”G%žä¨ùÕ•Ë7‡àÞ1÷£\ïÒîÑ¥¦ýË*2¥8´©OõzhQHßMJ î==ÆÂ›Æ¸ÉGŠ™EÁ‹…¶l[­ÞmÆ#ð. Lml;!Å •2µ¨Žü¥FÀؤD¯n6Æ\ÊlsäÀŽõöĨpÕ=þ„wD¨ïô\w’ziq ­Š“ÜPÞÀ}&]ŽÃ½;ŒG»=¼&_ú¶{@Mú=g mhJ>öµÔ¦ÀQRIØbr‹u¦ëâ9Ç#bz`EvöäIÑ"[S5 Rœ-¸V˜ãïa­†Ï¾A;¢®ïS…ã.{ Çìk>jìó¶rHŒ¶ôW'uÚR%¤¸Óòe âî»vR}Cdeük¼Ø.w»³òÆ=‚ÃÔâ£Ió-—P·@{@:R +%JI): óá ÆØË™MŽ|˜޾ؕ§¿ÐŽãÈ•þ‹ŽòOM.!•£‘R{‘êØ ŒüšÓ÷A eV[”EáÍc÷T·yDHåÑ(Ë5Îm‚ÚºH YRÓPÚ¶ œìâ—ˆx~) ën¶ÚmV¸Vyó„àìvR‡qÕÔ—Jç@­i<ŠErmÕï|T]Þ!ƒ;Ó¨­ÍœÌFcCgŠZk¨òÒÁ¤! rÙ×m“Eyñ®2Qâ¦Qpbám›ëw›qˆü ƒ[ÈqH%L­A*#¿i@°6)E‡[^ºä¶øÌH‚ÁKèuNMœÌF’”£·ZP; NϸlÕVë9±·pñ·%œÌìFçuÚmÚroÌù)¬9%e T†^J[QIåÁn¶ Ã`d¼‡•–^ì­Ýìhví…ŵ2Ï×S/°é€‰AI!‚ž¡så,‚á>º ¶^Î;”æøF îAi‹Ùi‰lºÜ–•D÷çžt6ò”C¶Ý)\Š[†#=ÉÆc—ÜòØòñ¤;„x­€Û ðCIBáTqí¯]r[|f$A`¥ô:§&Îf#IJQÛ-(Ð'gÜ6h¯²{RÝfñÅ Üñi*ˣܜ±ÊzãTåÁ´ZV¦‘É (ðx¾cŠ»ÄVHºãñ²ÅX¢ÅÆä}Ðc [òF`ÜãÛ¡®h|ô;ÛvÄ$ÛR–‰(BÜKaÂÌ(: ¾#@POÌo-/Åis<0Ììï™Xõ¾$…Þš‚ˆ’˜‘¦Ÿ[¬(é´•”qRV¾ ¨8Ⱥã1³i¶;\\zDlƒbßfÍ»t%M mç Y*–ˆ[-‘Ò$,Å4Vkƻ͂ç{±Û1Ï,cØ,1mN*4Ÿ2Ùu qd´¥!À’°T¤’ª"ÃÌJeû:é[í£²¹R—5ˆÊq #ïL©õ¡²ê‰!JÞOdš¥Ú¯AyÝñ«óØÜfÎ-ì»5¡WØÏÛd0…4–¢?1— RB§Jº¨¸„žHä ŠõëëB$¼àBÂê[™äQ UÛeg¼kŒ”x©”\¸[fÅºÝæÜb?àÄÆÖòR S+PJˆïÁZPl ŠDbj…@ P( @ P( @ P( @ PAºü˜ÿ¶ÿ¡TŸZˆµ¥( @ PrWã-þÍæš~ÇI¸Ä—!p¢R²£ÓR€!?áþúÅú¹/×_kß¾Œú•ýµ6¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓiö½ûèÏ©_ÛM¦CÚ÷ï£>¥m6™kß¾Œú•ý´Úd=¯~ú3êWöÓi‘Íé׉¾µ±|P®ZKKñßÏWi’fÑ2?øUöUì¾fÑ2?øUöS±áægý#ÿ…_e;fÑ2?øUöS±áægý#ÿ…_e;fÑ2?øUöS±áægý#ÿ…_e;fÑ2?øUöS±áægý#ÿ…_e; »!É)ëÄq6­s¿tüàU—hÞx=[3 îÛ^\”Üóºoª*Ò—B:@ž%IP·Ä•šúKá9‰á,¢|Û”©ïQD&›y¶Ñ*Ìùx2þÊBÜòîhû€â­ÔeQžX|5Æ®Ãp-92"\àB»Ï/]ã¼àaôòSMj*ZFôµlÉ3/ ¬˜rmöéY3KŸ>™–™Ks„DÙÔJKà!K tû’5À6®[ä4\ƒÉñ¨É¸Ü-évÜâúm\a¼‰PÜV¶h©´7Ç|¾p*ŠhRÝ1‰Ì!•9Ôº„¼Êl©$ÚÁBÓÛºT#±PogT}Ä,ð'øvýá ~á’^ØyP SØ$!¤• §j.-/v'\;@ˆ8å~]š»¥xüÛMÙ;ó¶V£Û\^ãL+ôGXZ¡¥ ©GJíAøŸorn6Ø6Œº7pº{R¢Èt³f¹tÝ+m*ÑD-H+ˆWz%CiÙ JT“£¢uA&_‚wö±Q2+ÁY–茮3ÏépYŒêÂÚIWMÀ{¤£ºFÒHWäßm¬‰›Å†ðݾçäd˜›’ÜY¨ÚÃ/6ûa­h-µ(lèŠ þ'Y^¼ø•o´cöx­Ì¼Û,E¨bµ·%I·ÆR¸¶ØJVã„ömF‚²ïáÒÜË-·Ë5ñ§n(´:»këRcÌX% ,¸„È%zZy ðV•Ú‚e†¯ š«sÙžç!—œ%¸.:UæÎ”…‡[A=ýÊHRNŽ”h,ÚÀZz׈ÃL•·æˆŒÓ« a˜jp0ËŽ’½­ÐéØ÷!°ty  ³Ã{–)o]ÐÞì÷hÑçª×-vçœ_”–UÒ_4#{ Y G$ Ò»PtÌü6V )VËÎiŽ»siÆÐ쪔ë!i )]˜Jyóù;íA&ãáÕê^aŽa±ïv Ž^áÆU¾lFœb2Ùp¨!Nre· »©H*÷lš·OòXQ ÈµÝl÷µ\¤À›s®—f¥jŒ­8Ú4Zq:')õ I û¿†wKs,H¶ß,ׯ¸¢Ðêí¯­I1`”4²â •éiäƒÁZWj9–¼6j­ÏdV{œ†^r4–à¸éTg›:Rm÷÷)!I::Q ‡ŠcsrüŽÝŒ[^ŽÌ«›éŽÓ’RÚT¯qQ?àjKáMϳ5w#±Ï„âႸn>¢ÛR›ql<¤­¤•]ù`£ºFÒLrìVMšõfµOÈl/Æ3Ñ®0£ºÔaÅ(%Ça’4J”[+ |{ £–YáÞA„ÄjFF¨‘‘%ÆcF•;!¤íMèq,Ù+åë;âˆ3B@ P( @ P( @ P( @ P( @ P( ë—ã1ÿfçù¢“ëQ ðÇ(û‹Êâå>GÎ{:_W¡Õéõ>ô¹hëßóR®àçoŒZáŠß›rb|›cÕM)[á‡Àa¾IXH!ò}ÈãòU½Tes’ø‚dlnà0+°bÃ4¢É¿6ê&Fa:B DT(ÿ´¡½€{€uñf~Kym–%æt{¢®^}E-GmcNÅ-§\˜$6P€¤„l(Š <ƒ:ÉòXÈ·\. jÜÒú[¡²ˆ°ÛV´h%´uÈŽ_95Eâg‰L¹zÆsu‘è¹.<-é\¥LE’!6Ûlž‡L) âÒ9¢ÑШ&;â•’·ÇÆpfâ@g"™|ß8‰oµ°†»GBTàâB”y¨èP]^¿´5Òc6tÛaÞý“ c Šýêø»Š’¶ÒG@›iC[#A vØ;Ø!ƒ/“çxåφ3‡=gŽnÊ»­Ç®~iejh¶[zF¸ûÈï²­ìVËÝ6ï %Þä-ð^Ûre–ÔçA¢ ¾)JÐÙÐU{¶~ÜŸâç-çÈZ§Å]ºs‡NU 0Ï-›iè÷$èî ënñNu ;l¶¡¹‘²–²†[¼’—‹E†ÈÙØ÷k]ê‹Xž/Y¬r­ßrøS`ǽ¦ý.;×>ºŸ}(R„/¤ž›iKŽh­^®ê:^3Ü-Q­þʳ¡™–Ç,0úßæž¥¸?Ä©FÂËýÆûë¾û\§ÄäxŽõ¶Ãy½dðmo\[‘5û¾E*ìÌT÷IS,ð JÔFÃŽvÐWs°Ìæwß»œÑùv曋 çƒlaçÒ#Dl£¶¥¬„$% O%ù(‘ÜÐirëäLž‰q²¤8ž +‰#¹íEY_¿´ÎáÐݺ%åOÙ22’/7ÅÜT‡L¥=6Ò–¶A HylEüÇÈ#DÃmÖ…âÖ;…í»ÖSò×9M«E°PÒHm´8éâµ]Ô{QUÙxäïšZ##Û%ÇU¦*û¥ˆÑ¸¦;G_2@:÷Ÿc”x‘ŽÞ,«±Ùp‡-ì?}öô1tT’âÊ•3´¶ÙK~®Ú<€ÞÔ£¢6sâ,|ºÉm±ÆµÜ‹{î¿æn—Cp“ëJÑmÂÚ 6êîIÝ+ýúßâˆn_.î ´Æ¼Ë„ªG”kÒ•¯ÒžKÐè'gݪy÷îç4~]¹¦âÃyÆ Ûyä4ˆÑ¨í©k! BSÉD¾J$w4\ºù½ø{ÀÚor1LtΎ܆åÄqäÏ“'¢\l©'ƒ¨ âHîFûQVWïís¸G´7n‰ySöLŒ‚$‹Íñw!ÆÁÓ)OM´¥­BRÄ[E?1ŲÑ0Ûu¡xµŽá{nçu”üµÎSjÑl4’m:B8­G—uÔW)>$¶ÏbZÊà[$´›tïœ6ažZ:!´§g]ÎÏÆˆƉö†-Æ×eCRíŽØÞaçæ’»p\‘Äl8_î7Ø'[;ì§x™Ž7j·Ù±œ!ëdxwô_Ö^ºù…¸°’Ð=$ñ@qìHﲯ}îAâ,_§56 Ч/kÅåÇÖó–øº¥»i*}*äh¤ó­$¨²|Im*1žÄµ•À¶Ii6èÞ8l$6Ã<´tCiNλŸ:í [®Ê†¥Û±¼ÃÎ?Í%vàþ¹#ˆØp¿Üo°N¶wØ9Nñ3nÕo³c8CÖÈðï迬½uó qa!% zIâ€ãØ‘ße^ú܃ÄX¾'Nj&lN^×!‹Ë­ç-ðuKv:ÒTúUÉÑIæ!ZIYü×*“fR/¬Á ¶´ãl@„µ–¡2l²JH#M¡ A'gÞj£Gvñv4×±¥1È–Þ=s-_nFäãàÿÕ‚Ëh)÷¿îÏ.ê'f ½ý¢”m ªÏ|šÕ¦ø‹Ò Û"T×;6´K)KmúSÛG|¶`…ˆx¥Eã²Í·µ ;W,q/MvXit)jÚ@AòNÎ’ï;ì¹îse¸Â¸ãÆ>mÑ&^×všò§ù‘!ôßKО›@:é %g×ÝgBƒœ¿UëÌ­–W¢dØòmèT¥LE’!¶Ûlž‡L) )i_|P::t³¯%f‘cBri›š™®Æ¼äòn,òHPi#¦)Cd­À=Ëö ƒ<³çH°c“>Ùn<¹&éu¸.é&;NpJ’ÚƒIPe%A°vOs@‹˜A¿øÛcÉ[·Yã^­íÄCË D8 :ÚJ”{–žGݾDûè8ç¹Í–ã ãŒcù·D™{]ÚkÊŸæD‡ÐC}/Bzmë¤$•Ÿ_u L·*‰˜fÒò©ö·Y:Bz#2GS¦B’—J€t¢‚>ã­ÖJñSný‹dVL&ïV0ÜxÈL«ëO¶üv‚ô’²— X<öF†¸÷Øð¼g¸Z£[ý•gC3-ŽYaõ¿Í=Kp‰R8…—ûö ×}ö׋’³H±¡H94ˆÍÍL×c^ry7y$(4‚ÓN”¡²VàåŽûYψ±òë%¶Ç×pB-ïºÿ™º] ÂO­(OE· h(dpØG«¹'t­9’Á–c™E“ò¢ÊÄ5Ï­~zJê?ÉI=.dï€']¨&Íñ*%ÏF7>À錤YÙylÍqMÁKéW[!%Á è ‚Ÿr÷Aï,Ͱ,‘ËÙÂo‘Ñff4Pö@Ó¢L6¹¦" QW÷› ò;ì<ÛÄeç#·w±ÅftKP$E!´G·ëÑ ·ÇԆκj*äP<¶8†:¨P( @ P( @ P( @ P( @ P( A]rüf?ìÜÿ4R}j-pK7ÝEó>_Ú—F!u¸séõ håÇczå½loç¥+q—xsf´X®Y1”JºÇ²ÝÓf¸76Ú!ºÛËK¥ @KÎ¥h=ù §½FU÷ÿ 3|]m±{¶Äb[ζËpSsŠìũϑ¨ÈpºR­+ŽŽÇ~âƒïÃ\×r#W0Z§J0X$³/r°¢Ê×ÁßPûÚ´®þêKá¶cˆÛ“w¾ÛXj¥=f'Ç’‘ '’š%¥«KH¤žéì‰G\‡ÂÜ×(jûo‡K®¶Ê! ¤W%©N  ˆèpºR­+ã¿qP~¹á^r‰Ö»{v˜ò]¼É0ᘷÒ\¢YS¸¤6à JÊHߺƒ–Gá®g‰Ûx¾ZÙjÖÊó3£ÈIê¡Ki_zZ½ JR¿’® ’’g¡>ÔYŒI~3eÔ¸¸ï†ÞH ”(¡IXI÷*IÑìAïTküN°[âg혵0Û¸[-™Nºò Çuho¨¥¸AqÕhÜ ‚¾ÿáÆe¢ëiOúä•ChŔ̡æF¶Â‹+PC£ÛjÒ»û¨<ݼ;ËìÞCÌÚÛ|\äyHªƒ-‰‰\OÞIak wÔŸB´®þê£I|ð¶åŽø|ÌË•™µ_edbÚÊ¢MD¾ièXÓ+Z:Ím'Ö ëz¨3ן s[ â7>̹²¼‹I‰)™GÍvûÂÃ+W{½«Jÿ Ü—ÃiX†¢ñ~¶°ÝÙwÿ"—؞ܔ†„r¥4KKSaiXõ$úÓØnƒç•E–5b•”dv¼f ¬µ&í5ˆ,­åqBVêÂT~ Ð\dXŠ Ý«=’½2oš0ßné 6°Ó€ë—7R{ÿiÅ Š@÷¿<+¼`—ˆö“q¶Ý ´Eèˆw¯<§a·8–ukHÎ)Y+)=”* Œ‡Éqh‘çÝâGò²œ[-¿kÛꤦԦV°…€ JB»ûª‹ ×…9¦8û1oñí6ù¼Û)bMò n‚àÚ¤¹!²4zŠJµP{ñ#Ã;‡7âJ»Z§´ë1œJã\bºèS±Ðé e§V´¤”…¨¬¤öP ÉGŽü¹ EŒÒy奶е)Dè>$š¢þíáÞ_fòfÖÛâç#ÊETlLJäz~òK XK¾¤ú¥w÷Pio>Ý,y7 *~™’&ÙÄš‰|ÒY$±¦V¤ušÚO¬ÖêY/†Ò± Eâýma»²ïþE/±=¹) åJh––¦ÂÒ±êIõ§°:Ý>Aánm‹©¶o–ØŒKuÖÙn nq]˜µ9ò5JU±¥èìwî(8_|9Ìq±Ý-)>jI†+)™\d}á}«¦ïîÕ¥…<ƒÊq™qàÝ 3æ%:¨í·cˆx Jè­|€P­+¿º¨ç“á9ãm_âÆiN-mýâkx8sme•«‚ÆÆÐ­(|Ô¯ØÍïTÞáycs€ÍÎ/ß¾¤gFÛ_¤lqÑ( Äi—å2ĉHŒÓŽ% yiR’ÚIÑQ }OnÔ—<-fí„ßžº3^}‚ÈÉ8™{Ñ8à[_|°AÁ"w„lMU¿î(öê&_ÑŒº§á9®t¤ú×É•€²x«Ðv‘@áUoû„Ê=º‰—ôc.©øF'NkŸÝ)>µòe`,…ž*ô¤PWåþÚl¶%d˜ÆT«Ü×EÙ¦-È&*š’V‚Í|ÚZPáJ‰J½i¨15B@ P( @ P( @ P( @ P( @ P( @ P( @ P( A]rüf?ìÜÿ4R}j.¼:»ÆÇò»eúj\{mÞ4ÇRÐjCjmj €NÖÈÿ})ZlïÄ«öi"TG_a‹:îÎbk|hh+Q!.8–·N¹+‘î{÷;Œ¦ÝüGŒ¿ñBÕ çY‰u‰rf<­%k –ÈB´Tøk±: ¼·ø•Šâ’¬í`ñn·ÎY%xÝÐÌ}y%¸é)ZÁq|%;ôž#T¼M³Úq/ bØ#F¿D~á’=rm‹Ó ± ²#¥<’Ú¾Mí@v‡–€ãA“É3,w ñaY¬ÛL™ÖGn1ä?õÜ~:8´JI 䔑Øüh7Ÿé£„‹$h0æºÝ¯#nòµ±[íc Z:A¸ëõ¬ -k$ÉÖˆc¯þ!Y®¸K˜ÜxÓS%q¬Œ…­ …CnR]îN‰}{wÒ·®ÛŸUF™âf!â-±»‚ï6!hLË|ˆÍ¦*Œ™m*mðáQæI)-Ž%GJ:y¿‡Vø¬vËeêñh{&bÿtjä†ã­l¶‘µ¯–ÒãNú}#Tó¨ÄõÒ‚\(ß«‰P {¶5Aõ9¾0[­ãzÛq¿ä÷ bôÍÕ™÷öÐÓ¬°ßBo‹®«¤JvIPÅ#gp{—㠎«0ÃMöâ‹~I"Q½pAi‚“|½¶”¸è+ôïÒª¿lvY†o·[òHÙë‚ HŒ˜ð›àµí´¥ÇA_§|†PTgyö9rÅN%‹?~—EÕ77]¼%Q›m¥·+A./hB]wÕ´ïcHN¨>sT( @ P( @ P( @ P( @ P( @ P( @ P( @ P(×/ÆcþÍÏóE'Ö¢ïì^vk’FÅm²bÇ“r˜mÙJRZAé¤íE)Q·À_¥kfxG’ZñûŽMvm…×}üž«Ž¥îü B&‡z‡s£¤Œ¼äž7N±À“Ÿã2Mõä4ë"j[b3ÝÐûªr28£^ð9(|SAçáv]gŽêî0ƒrÓtrÒÄ…®L·›NÝS(JH[hÚ6½€y§.ú ›­¥©§P¤-¥IPÑ{ÁGåüŸsèQÚ™3ÈaùˆÓ®ÛJ}GIi$§Edö ÍA\Õ†øÿ…šsœ¥ˆ ágrO¹‘¡ýáø#ßþG[Æ1’ãÍÆzÿ\íÌI\ëã!äyAX€Ø÷|ô” @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ ®¹~3önš)>µÿ/–¼kÄ]ö÷+ËA‡8­çx)|SÑzH$÷#Ü)JØÊñ0æÇÉnPáM/XâBãÐ…±LëHt¤/kÛèRÏÊVý):ÕF^óÖ°KõãmŸí/@‰jh¹?þqº(!ÇB\ŽŽi>ä€vN¶;ÐuÍ<@Äñ*¡Èul7*Â<Ö ¨©²äu­`x’¾eŸ P(;ÊDt|Œ‡ÝäÒKÝVC|ïÉ)Ò•É#¶”x“ù"ƒ…@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( uËñ˜ÿ³süÑIõ¨Ùx:³ÅlVãr˜ÄH‘r8/>ûîÛi´¸ÑR”¥h% I=…)_J‹›c­öIðš´ãlãy”{…ÆÙ÷‰Í-cŒÆúë[«RjBÒRР”íUNdYñ•Û›–ãÏ­ßbÝ?Õ.Œ¾oO­HQO~û §^ Š-gld¬ÓrLš$‡­~"0äE?%ÊÛ” ¥ôûú#‚„Ú@×ÃtÙ~Y34Æf^KUÖ6d´Zz³Zhňãgûµ)@5--ì6“ßc¹ ¹ÊÕ4ø…á¾[‘eÖ[‘‰ìx·9‰ÉaÎy¶ùSŠt¶ò×Ä$l¸}ïWqAøœòÇ~v×;ÄÌ{¤K_ˆ ¸qipµiWwRÛc¿—ô'Ò‘Çà;š^(LÉ¥øL…ey}» –rÇËñ'7,%-éHq²BSÜ”µ°Pt§z ø•Qg~±{ Pí›]ÃÏÀfvàHêˆýA¾‹½‡S­)ô~4 õ‹ØJ€ŸlÚî~3·GTGê ô]ì8:iHï£ñ _¬^ÂTûf×póð¸:¢?Po¢ïaÁÔëJG}e@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( A]rüf?ìÜÿ4R}j=Ú¾LÛК_¥N£%Ak÷78â§/ê±äÅÀ[xr=^¯O©½k\t=ûÞþ:ë¡ö\RmAhRNŠTÁ‚ë"Ír<©˜Ñ¯SSµ²ÌxŒÆl-zæáC(JTµqNÖAQâ6N¨(è @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ ®¹~3önš)>µí_&Gí¿èM/Ò´7ìf÷Œªop¼±¹Àfçïˆ_R3£m¯ÒN¶¸èˆd¿c7¼eP{…åÎ78¿|Bú‘m~’u°=ÇD|@ _±›Þ2¨ ½ÂòÆç›œ_¾!}Hζ¿I:Øã¢> PLðö%‚~yŽÁÊKviH­OZ—Á"9u!Í«ý‘Ç{?Þ ûUÒÕ%xÖ9oñO¶ã0dx€Ã2Û‹ ¸)6òØ YK`€’°—µµO%kt&ãŠTìkîë³ÙnnçaBˆÅ¹¨É™kR¾ûÉ´h+¤ꂊ‚Ô9+à‡äÆÛ'(³YíÈYú,ï»#q-‹ZS`„„vq{X]Í-6kv4‚æ1>ßrö¨Ÿs‰fePËnsm.™i ¼AÐ嵞@P|b¨P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( uËñ˜ÿ³süÑIõ¨÷jù2?mÿBi~•:Œ” @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( A]rüf?ìÜÿ4R}j=Ú¾LÛК_¥N£%@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ PW\¿û7?ÍŸZv¯“#ößô&—éS¨É@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(×/ÆcþÍÏóE'֣ݫäÈý·ý ¥úTê2P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( uËñ˜ÿ³süÑIõ¨÷jù2?mÿBi~•:Œ” @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( A]rüf?ìÜÿ4R}j=Ú¾LÛК_¥N£%@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ PW\¿û7?ÍŸZŽ1}£ÉáË”sEЯ•Ävÿ ~ú_¥ÏÛ¿áïÔ?®§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž‡¿Pþºzx~ýCúééáø{õë§§‡áïÔ?®žž#¿çŒ–Äîˆ! áÒGºw½ÿÃ÷Õ‹3ô•jù2?mÿBi~¥N£%@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ PW\¿û7?ÍŸZv¯“#ößô&—éS¨É@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(×/ÆcþÍÏóE'Ö£Ì 1ãõÐûÈl©ÎCš€Øâ‘Ûâ /ÒÍKö„Ó£ÿ?mDÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûhe=¡ôèÿÅOÛC)í§Gþ*~ÚOh@ý:?ñSöÐÊ{BéÑÿŠŸ¶†SÚ?NüTý´2žÐútâ§í¡”ö„Ó£ÿ?m §´ ~ø©ûheB˜û2$´Xu.!aE'`l§]ÿàjÅž:ÙØAõlh‘ØÔF7h. )vgµL=Õ䞇.‡_§Ç\¾Gn\½ÿ UƱ’¤D~EÈ>mHº-Ä© ÓAÅ6­é[ØlÀ‡ˆÚîA«”5ÉDA\µ²ô–ç4½ÒàPJ$ƒ²>q¢u¶Ž)Çíòhè"E½˜þÑŽ»o!©M)múTIO!ØUY}¦Ý®JÙ—%¹¤Iu–Ÿm–Øõ§Ò¥Ž #z÷üOøÐt¸âÖ‹1•pž¹nÂlE 2Ëí— ÞmKÑt „„+¸û{ªj9·e‡h¸Mž $Á‹oDÈáôÍO¡=©>âAsgàzfª¸§‚ní@ê¿Ó]ŸÚòºžL½¯wÉä5óëã¾ô›Åí/{%1Ñ9ö§?—g4ûji*pŽh( äÚ$G¾·­SDHû*ò44Ãrƒn?1O©'¬–¶£¤€8…h$Tv¯}v¬¾Ón×%l˒܈Ò$ºËO¶ËlúÓéRÇ‘½{þ'üh:\qkE˜Ê¸O\·a6"†™eöË…o6¥èºBBÜý½Õ5۲ô\&ÏP`Å·¢dpúæ§ÐžŠTŸq ¹³ð=3U]ÚÆ±’¤D~EÈ>mHº-Ä© ÓAÅ6­é[ØlÁÉ8í‰q“} œ‹j`*[Œ^æè„ñ㢢“¾=†û"ò%µv¢Û,¼øÊÆÔ–ºê§w¾Dvíß¾†ÀÞ‡ºŠÎDƒk‡p¹Ìi§‰iޤêRßd+ïiÚì9¨¨$쀃³TLkÆJ‘ù ùµ"è·¤'MØN¶v7¥lk`u³$ã¶%ÆMô*r-©€©n0\A{˜¢ÇŽŠŠNøöìh‹È–Ô]Ú‹l²óã+RZë¨ÜùÛ·~úzê+9 ®Âç1¦œz%¦:“©H}¯½§h#°æ¢ “²ÍQû3„ BvÕ|åI,£Ì²òÑq`rk¦É `úÞµAe÷j[ДâåDeõÊiäy¦$­¦ @¶4;ö(=û{û4[%)—»!7y †”u[%•¥I®<ÓéÐ=«ÝOUæ.5aO²"O~š»­ÆÚR:l¬>¦’¢ÚÐØØ=‰ß} ¢kXânvëcS¦­°$¸êRûl—œRCŽzS²¯yøq$ ‚ܽ•7•Ãó¥ô*d1¹ÌuéPž°Û|‡¨û»€46jè‰ä#[a^¦½Öø­0#3- ¸ÛŠ<–OaêJFô4V(%Ýñ«/VÛkÓ¼Õþ£ÊAmÔ¥*N‚AIÇ}t{ ÓG§lvx™[¶l›ŠW2ú’:ÉIPK+PH=½ÜTwêö𯱒¤D~EÈ>mHº-Ä© ÓAÅ6­é[ØlÀ‡ˆÚîA«”5ÉDA\µ²ô–ç4½ÒàPJ$ƒ²>q¢u¶ŽröTÞWΗШiÄfç1Ô[¥@zÃmò£îîÐÙ«¢¢=©‡òˆöW—§¦·m¼@y´©a$Úä7ó‚ÕÛN"ͽû‘7g`‚¶Ã­¤¼HQ$ñ<¯I ÷Žþúz;ÈÆmÐÜM¶eÆiaWi[)PàƒÓo¦áFŽÎÔžZî@íî £Èí Ø§&ÓÍÅËŽØ #€t÷âŽÞàÙÙÙµAU@ P( @ P( @ P( @ P( @ P( @ P( @ Ü[®‹bÚäë›–EjÒôFÞCÁS d¶ÛE[Úv®ñN¹ïƒ7÷G;Ìyž“½Ÿìíq:étº{÷ü­|}Ûø|*Ld“X‚‹—޶Sq4 ­”-ÐéÙ ù »ü{Ð.95ÆèËìLC*C¯¥ö€IX„ñ o¿¥Ä·[mi.Á[S.uZõHS‰›PõIì®ÛÑøŠKÌ'>ëžnßDwZe•E[j i Cd¨@$v#±4Áã‘Ü.l?BYJd<ÛÊ风ƒh(m¾‚’@ãï¦ Læ3˜a(ø }0ÕÌ©µK?+ŽÂObûIƒÌ\²D2˜»|e6ë.¸¶Ð½¾ZPRBö²Øñ Ý0@ní!¦g´„6=¢]V °¾)ïØïßîÒï>Ä·[mi.Á[S.uZõHS‰›PõIì®ÛÑøŠKÌ'>ëžnßDwZe•E[j i Cd¨@$v#±4Áã‘Ü.l?BYJd<ÛÊ风ƒh(m¾‚’@ãï¦Ýï1æzLrö³µÄë¥Òéïßòµñ÷oáð ÷'†"yh¯Gf;‘”Ó©QKͭΡ Ñ²´A¡Läå“䤶"ÄeDÛÒ†¤„5Öêz¾P=¶wÛß³ÞƒÏ%uŽãŽ…>ãoHu´·Ö„¥Kï­éJ'@l’iƒÏÝï1æzLrö³µÄë¥Òéïßòµñ÷oáð ÷'†"yh¯Gf;‘”Ó©QKͭΡ Ñ²´A¡Läå“䤶"ÄeDÛÒ†¤„5Öêz¾P=¶wÛß³ÞƒÏ%uŽãŽ…>ãoHu´·Ö„¥Kï­éJ'@l’iƒ¼L¾eµ ‹]º7¶œqÖ²§‹gi QßsÄ ÓèÌf4–š‡l·Åe•<´4ÓkãÉÖ‹k$•IøžÚÔÁ =ö\d[[m¶HµÉT¦v©j($+¿qèí|h/ŸÊÌ+e‘èñ­Ò%²‡ÞJÖ’¥ÅuRA(w×ÁâLr›„fØ`³æYŽäe¶êJ’ûkp¸Bûï|ŽÁ#B¨ä›ÌdË\“[ÚÐ#ïM:ø‚ç¿÷¨Ð/9ûâ[D´2„¶âݤ”‚¥Žýþ B?Á#ã³L9†N_ºÝâÀbN[½7&0 qö’ Rž\Šu´§º@'CdÓ:²9ʾ¿˜ó:¼“ÄðD) ÐÞýÊ:ïï }ÑÎóg¤Ç/gû;\Nº].žýÿ+_vþ pò‰ðÙ1ÖaÈÊiÔ—›Zù¾ûùZ ¡LÓyŒ™k’qëb›Zré§_Cœ÷þõ®e]œÍÉq!™,ÌLĹÒ![HHKdƒò¡ï÷÷¦Ž]¤¹ûrßND¤ËQò PÐïîõŸåAf¬Öè© —å¢|˲Р…m·V„£’}^ô„‚ïG¿~ÔÁWpºH¹¢0”–Ë‘™ @<Ü@>žgz$ÀëÜïªt @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(?ÿÙmdk-1.3.1/doc/img/ss_split.jpg0000644000175000017500000042737513747275312011670 ÿØÿà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.3.1/doc/img/ss_mix.jpg0000644000175000017500000021323113747275312011312 ÿØÿàJFIFÿÛC       ÿÛC ÿÀ&ÿÿÄ ÿÄa  !1S“ÑÒ"RTs‘24AQ’¡¢±²Ó#3UVa”•$BqÂ5br%6³Á7Cct‚– 8DWu˜´&Edh…µÃãÿÄÿÄ8 !1QS’ÑÒA“4a‘2r±"²#3qÁb¡ðÿÚ ?øúD‡ò’•ä_ ù«éLÌKη½?Ö}B¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒÓýgÔ)šCz¬ú…3HoOõŸP¦i éþ³êÍ!½?Ö}B™¤7§úϨS4†ôÿYõ fÞŸë>¡LÒ/Ey×)Z³sè­S3"̯׫þŸuf®c¡`Œm¾`—q3˜?â9iºªïc}( ¶JÂÖ7g¢>AH™ÕM¿B]‚ãuŸge´;2án÷Œ„8ÝÉ fÿÁAXiÉ) #"Sª–.‡¿òkyÃöÙ“Ÿ¹Úä¿jq¶n°£<µH·­d„¥ÐP|á¤èRÂUÀäie½ÚE(:ÅË“îO¤ã)œ›ØÎ ‰{@-•.[2#I|5¬6¤%–ÔÐYóB‚—‘#0FyjÑɛͮÕl¼š^o–سY¹Zãɹ4óÖÛ{ï-2g¡¢ µ4 œ…¤kRuœêYfl›g“/ø_J³\m0n—¸òP–%Êq.Üd¦[­¡ €•!Hm#QBI#‰9ÒÉv»“ëÜÛ†¶!轋œ C)cb­éq¿KææŸ=µ7W ¾^²Ý#†ù$½âQii«å’»óå›dI²C²R— ju:P¤„%cÎ!J(PHQàV34…$¥E'¤ª+Ê ò'pï7\ͪSé‰ÙÛΩ$Åu§™|@J¨Ì´æOM[%Ô9€»"ÛBíöû3ñ%Ü:cîêjrÖÊW+$‘¯V„Ò<ìÓææM,]ä®H±3 ·îòí³[ºÜ"Ûá»Õ©)*eÑšV•Ž (Ö FT±™~Àœ8ÅâMÂL"ÝžæÕ­JmÅ(IqÄ8´­Ÿ7ÎoCz³:NKG</v³Q['¸j/Å‘,3¤¼ÓO¡÷XÓ¶}m´µ¥†õy»G„çò¨p=Æ©3hg¿„ ^¯’-Ö <Ͳ*¤]Uˆd…nA+ Ô¢Û)VD­´„†ÊŠ”–/d›’vŸŸx‡}ÅVÈL² Ì9©/.<¦”´¥†”½¨…°xeÀä²]êy3·¦ ›oÅk„ìI,2 =½¡+b<ä´’d³¬+‰ÒM,·XƒÉîæ‹k‰¾X"=}qö­pÝ’èrS;¶KHI*@ÒV¤¤êHÕž`,fYÓ^ñ:,éjõe·Ë¿¾Z¶Cœû½%!ÂÚœP¤¥AcÎPRŠx®LÙ'H‡câ – ´D\Øê—«{yÊ\SzÓ¥²Øó¾ XW ò襋µšŠPuµòwG(ŽØÎÄà ·­bæa«N€ÁXVÛg³ËP<²ù:jÛVshÔ¬¼š^o–سY¹Zãɹ4óÖÛ{ï-2g¡¢ µ4 œ…¤kRuœée™²UžNÃx~m™È0^6Y—k¤‰’”)¶® cWB²)AGš3 9¢Y/ijø£ MÂÎÃÛM…>%Æ>õ l%©LHoRJu%*- IJ’#£¢“X›¡*)@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( D/ÖŸùóªyŠe~½_ôûªUÌO MŸ·…Q17•Ü ‰È6Z,%°3Ï=Y¤ðË,¾Z_D¶·lîQ­0p«mÞi–Æ•j Ù £nåÉ2’¯…ž"rÏW ˆãK¥µeò‘Ê¢qÄIﳋ±€UÕä¾õ’SvèêÕ­IBö¤©_%´ä2ã¬ÍÈ‹9…e¢ƒ¬ÜyCäú.2™ÊE‰‚eñÐW 4¸¬ÇòÖÌ8¥¡×îž* ҌȜ³WŽlÚme‹O+%¬j°«bû ›$g¢¶Õi1¦¡N­Ä)À]Am`¸RT¼ÒÃ….eÕfÁŽp$[~ zñøn84¸úކ‹\2Ü} ©JXSI£5„¨JFAF^ K+ ò“‚ÛŸ„1+z7'5o ²Ò™”…L\­kXR•:¿7J‚€HÔœÉðLOâc’ëƒb¾O»[¯­\l2’Ìe1$ˆ©–ãûg*½‘qÍY%AAfž&‘ªNân§¡ÐI"²Úš ó ò‰ àKÞ“ ÷nNí9šBtEÞ[ ÌÔIÌke) xôÕ‰Ñ&/)l'ÊÔ,;i¶YõêE–Mª\Ûr’‰Ö¹ÆSn°u @d”©$£0¥ ú X”šn½nåvºuõÛ…çb-æÜk™sÛµ=´º–V¤íW¡´ ’”sˇ’æT8ÇÐ1FÖhq$3. ewW Ó!ô²Ìv”’ $c£<À:–¾žš“7X‹4jŠÏ²&È»‚ˆdÏ…jv(uÔ«/4„-IgÓç §–‹}µæ-‘n˜q“frÒå÷RºŒä%öÔ€#B eÞ)RÆ¡˜Wg*¼hÝ¿â,Qz·]l«´*á5´.k@­.%¥wŽ4¹nm¯“ ¥ƒbÞO^ºÛ¯­\lRÃ1”Ät’"¦[’Î8T {"ãš²J‚‚Í€k•Æ7ZbòrùÈÝÛ‘PeáY{G­Ïg&Õ1C„ˆª'Ng£Z~ ‡Î3è"˜uÆ%7&-.q[Bƒ*Óoçk¬+Vûù!¸ûÄ·vl3­A:Ü_øP3ÌŸi3aÛ´Wöw±r7g¶Ýì·û„æå&Úä{«haç¶hB„ˆÈOëXóˆ.p⤠¸×,I®m-UMœ"»2P(;7#<œry‹ð¼«–-À|³^æ5=l"F µ±&[ ¶ …©Ä’J$tiR>zå]US:Lݨˆ–ûþùÿîûQÿòüOˬį­+hÿWΪ +^(¼[m°î‘!ÄŸ!ˆñî­†æ²Ú\RR‰ NA/X®ñ¬1(º¡@ Pt,!ÈÅór{yƸJéåp°=œë ![êbiÏyH<œó'3Àÿ•bªâš­+kÞÖРPnœ“òhç*ø‘ì' ÛmW'":í¹©ÅIä'-1Ю„©\r$üœ¬×^HºÄ]¬ß,w|5w—`¿ÛŸq€ê˜“ôé[k üúâ+Q11xF €$3' P}Oƒ°¬Ëž³b.Q9P…‚§_^C1-’à%Ç Ü´Ö¥>Þo))'dPç=[E¦ÔÅÛŠ:£¹VþÇ–nN¹4Ä|¢Y¹d…‰|›’Ì9Pã[PûM)¥¸™ Ù­!䨤§>Ž<êÑ5UÌs&›Eß4×v »Nç\3~ľQY!óëÿgË—³›?láG÷V²;]žZ—ÄiII›LAgQÿö_ÿúˆäKÿ›ÿ•sÿ‹ÿñŸök/ú¹v4ÂþFbi˜kÊ+%÷sÙÿÚY{Ô'µ¶•þ܆¬µi<8)*%t¦sEÙ˜²¨P(«“ïì™Ê§(¼œ\9E´Bm–šFÒÙ ðRõÑ ùå¯> ? ð=r«šjË-E31w‘ø¯¹S.2ó+-¸Û‰)RE$ ƒÀŠêÊŠkþÍŸÙ±Úx„ d›,&g›÷¢ñk— ¢4å±?)éËþ´jšs:í¯ÿ£âÉf[¸sû@Û®›Œ‡!¾bÙÐêY’€52áD£¡c4æ“Äf8W9Úf9ÒÖOõ|o^—2Aô?³=‰\‚ÿµC‹.e7^g5ï!½ÐÈË=ëO›²ËõžnuÇþ,çËf²éwϵْ@ P} ÈO!<žcþOÅx­Œmqº\qK˜nßoÃoAl¬¢öV³/$€—s:ÇÁd×LJ©ªÑnMDDÃiå#û\Û²2ï$ü›ò‰Îh „â­LúžÝý{MZ2AWË–y§_ýÓÿk4t|¥^† @ P( @ P( @ P( @ P( @ P( mþÇØíX7–û.¸Èذì³(ÜÄ‹Žë Ò˜oì¶ú”VNéÕТ2ã\±©ÍDÚ5j™´ŸÛ«rß}E«îŠb›`qÞ¡4U ®ÃJ‹iÍÀ­ZzT|iƒNZ"ñ©TÞ\Jº²P(?Eyƒ{‰È®ĶnMßÅwMþÖ˜' r}ËEà á<ÝžÖÄ8‹e–åíÂÊš¯"J›Ìæ TI$jèX¯F SU–*‹KŽWVJ¡ÿ³¿ýÊ›ÿÖ#ýèçþŽÿÝ¿©kõŸûKþ •qÄçùÿv©äê_þvkŸ‹_îùÿß\AþûÿzKÿ~¼¿\¯ÿíúÏøõW¦žPç<ЕBA7‚ñG‘˜š%òvÉ}ÜöŸö}ê&õ ím©¤k1«-Z‡ JOÉR¨Í"lúב^^¬vL9vå“òÉFƒl+·A†ì‰xŸ-H Ù íIi¼ˆÔ¥'"3ù«Í^Ì剙tŠ¿_%c|Nq¦.»b³hƒk7YK“¹ÂoC,ê?#ë'å$Ÿ–½4ÆX³œê„ªMgÞSÄ·knŸÉ¯"–«f·"UÆýuÃé37xÉHSÚ‹ »!Y˜• á‰E¢÷[‰dâŸíi<¿T¬<œ[nèç­·ŸÐÊ”…)$H[šU¥CNINHR“Ò®0g&Y’jÖï›1 ߟï÷;öã9Lz^í:Zch²­"Sž@|ÀW¢"Ñfô'ø°`LmeÆ&Ñè-”bJNm»¤ô˜ü ñÉ@ŽYTª3E–&ÏÒÄþÅùw Œq8jV"ºaw™‘a„»ÒÛerp2Õ¥¤ÉzÖ T¢2ÉH&¼ØÿóDut£’?ûk`ËM¿ àþPäíŒ9Š1KïI¿î‰¦Éh£??ŽgZ2 ƒ™X4Àªff›é \~¾K¯KAõçö-ÆØl³ƒù8ßÔ1Ç“ïb.Åy~OÉgi¯-iÏWrË3^lzgZ¿-ÿíº'ñËÿ±wÿY|ÿ÷ÿÇÈ®˜ÿý¹J9¸ud P( @ P( @ P( @ P( @ P( @ Puûö·þИnÉoö^P7{}®+P¢3ÍPW³e¤!:”ÉQÉ)2I9q&¹Î 7˜k4—Ïíoý¡1%’á‡o\ oû¤WaKgš £h˨(Zu%¡šTF`‚3àE#ˆ›Ä¥È+£%ƒkÁ\«r…ÉÛw°n'“nEΠIHB aD’”‡­5(…'%NDfk5QM\Ö&a«¿!ù.m¤¼ã®©j*9Ÿ˜ð¤Q@ Ø°ï(ü¡áK¶á,yˆ¬Ýt¾¸öë£ñ›S„•”¶  ˆJF}9$|Õ&šjç y„§ûqå¯ÿ¾ mÿÌÿ2§ü::Ayió§MºM‘r¹L~\Én­ùp¸ãÎ(•)kR³*Q$’OMk’,Ð( @ P( @ P( @ ›ºcœk|½ÄÄ·¬a{¸]íû=Òá*àó²cèYZ6n©EHÒ²T2#"IjE1h‚òÁ½_/x’æõë^'].tí¥Í·ÞsJBS©k%G$¥ fxÉV"#HT @ PKá\]‰0Mê&!Â×w­óá>‰ ¸Œ”‰Ì$”(«‚”2P#%òš“TZH›«â\oz—ˆqUÝë„ù¯ªCÎ/$‚†! )à”Œ’É |‚‘LZ ›¢*…A3ƒ±Ž$äÿBÅøBæ«}ÞÞVcI ¡ÍФ+ÍX)9¥JzjULU’&Τ¿íý¥\B›W)J@ƒ¦Ñ'þ„1˜ÿ1\ÿàaôk<¸¥ud P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( A\H»ÞÕJê49¤éË- ü üõ™RfËüÔŸ\‘ö<4¼—9©>¹#ìxiy.sR}rGØðÒò\æ¤úä±á¥ä¹ÍIõÉcÃKÉsš“ë’>dž—’ç5'×$} /%ÎjO®Hû^KœÔŸ\‘ö<4¼—9©>¹#ìxiy.sR}rGØðÒò\æ¤úä±á¥ä¹ÍIõÉcÃKÉu™p·fvÉ’òˆZJÓ‘@üiy"n·ZR@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( U«àÈößèMfy¤·¾LlvŒQ‰•…®qƒÞ!I‹lsh¤ì®²¨Çµ8”·‘Ìdá9fQ–Ë…°,ìy•†c_ñ<\[üq!,Û¢Dt%;ºëo€²5 ´•$æ((ÉŽƒ‰°]–ý‹¥H{*Õ%È‘-¹†cKBR· ©Éz•¤ƒæyƒæPEbl‡Ú‰Šïøb÷1è ¤Kz•,­fFòOCÎd»ä $«VgNYË…É3OâdáçnÙzìöëªMžÀ¹ïg*3Oè-%Ôä”mtë*ã§08äþ=Á àŒ»<Æb»s·c•¹Ù¨gJÝi¸ÑJdj ÍEA' ¨ü¹ÐdÅäc¾†ÿ(©s{³‰ÔÊ­J,µÇKî¡N3Ú¥ÊRBÂSç$« ŠäÂÔõÚ‹Múñt´â/LŠô; œÓ«im©t‚ ¦ÏæYsמE£aYwY8»̶YmÈ·è|ÚfºìÆ”ëL˜«q”¶î°§2NŽYŠ trq‚ñ5‹“ÛTlN‹mÎþ™mëE£Qœ÷8¾Û.JPX-$‚ÚR2#,’ [O%ÍÞ¬û•ßG¶Ecͽ8SkJ–„1qÝÔÑRò΢¤©G‡šŽ ó€]¶r åúéXrópºXäØÕ~L¨Öu¹4²™*Ц“ V§vÉ# æ>qPäV¯ÊFŸÉÕõ‹DÕÉ[s!5pŒ©PÕý“™€eD–Ö•$§28f #Jº|LûFÿj¬saVšmí°Njl WGvN*s›ÂÃÑV ’J‡™§Jµ¨Ï•…(9×þÕ0÷áaælö{];M_gçe§/“<è- 3Í»vûúËg8ëÙôv/èË?á§?úåòPd #»/= ¼˜ˆž±» 1±Ú-JV¬õ@Ÿ#<©qí³ G¼2m“.2aE ¥kjÚVùqz²¤¬Œ€I%E_7Êr¥ÄEòÐýŠë"Ó%ANGP²#0@ äxŒÁE ƒnu¬9ûM®U²‰Ðã­ÙM>è}+pqPE:rÓQ[ù>™-É)uÙZœå½ rÑ)y¡G'§ r5n¬G°s±§·ù¡-noJyàÞa¢ÑZ\FYñ!hÒ8Œõ$ðΗ½†™C<átº!·ÖÌD•©o7©( HQ*ÍD‚rϤÐ_·r.ç ©Q˜­ð:¸ŠL)¥!@\&ÊŠNCÎù3È\F½‡ãF°±x‘9ýr¥4–âëg0¢ wPÒ¾å¤ð#ç … P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ PeZ¾ mþ„ÖgšJZÝp—i¸EºÛÞ,ʆò$0àéCˆPRT?È€hË ^9d7^RÎ>k µ+vçíÑmMIó#¶ìWY:VQÇÏyn姉Q:j+†?‘'aÜS܆ñ-qÚmnmêá¶ÚBÏQo=?&yfzh&(ØEOb8/`iʱbGãÍv½ûÙS…+Cû ´~™ÄèSdäG˜Î‚NãËm®ô›¬+žu»uÅ’ÜXuÇÙ® MÙ Zöj.2 J‹g%–KÌfBò¢¼yTw,h‚©WÙ7µHÖ”—˜e¢ÐIHà69çŸø²Ë†dí?þÕ7>céÂ~LhÞþKvÛç£ÿF_ÃWËA›‡y]iÃqð¥ÃI‘6—íR\‰rÝd8—&‰AHsf°€RJT3èùýÇ–Eù¹6{þS¶mÌ¢[™iæ„ÚÚeÔ<¶×ĶêÒ ¤+<óÌ(#"r›ß{À·8XuHæï-GTÍFBõÊJ ôy¤„jÈç–¬¸é ©<ªiÃgsyØ¥ÙvÛ×_p6ºt‡-sãð³,ܬ"Ýj¶aù¸w|µÇ±?b¸2™…¥ÊmsÜš—[XIØ­-f<ØÉYÔqû=Æâ_°Úæ@†”¥™s··s%N þ`Qtø™öþ4Ñc› ´ÒjÓ|¶ÙÒܸևɶք¾©¢Í@§QoFgèÕ—ðù(/ŒVÈlK6¯ûTCÜD½¿™³Ùìµlôü=Ÿ›ž¬¾\³¥…Æ1t6’‰Y ““nU´¿¼’ÒT§‚‚Hω#À˜Xb£©»¬[ˆ„•!˜(€ë*Y!ÖÃ;%ñe©$ÿ—ñ ­‹ý¢;RmÍÙd›t’ÛŠhÎý2]F¬–—y #"“A -Ö’ã±™[M(ùˆ[šÔ‘üUÏÜ(-P(6Tb›RUj°úÞŸoŽÓ--Ùy°TØóV[ñã–¼©a2ì%Á¾Azjw—%¡Æ¤ì\K‹^gJJNY˜é ñ™Máù6$C¼êŠ.f¦ÚR¥5–\ASh9çòia|â¨ÒXT •¥OÃS[(nFÍiq†ÊâU¤˜R³'§§†t—ˆm² ³m¡õ˜iq¸‹nf-©jPBƃ¯IQâ4ž4B¿D·Ú¤Â‹o|H˜Áaåª^l¨ž­–Ÿ„>C«ã•,!h @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(Ä’ã*}( ¹ŸùRÄÅÙûÞŠ=Ǿ–KûÞŠ=Ǿ–,oïz(÷úX±¿½è£Ü{ébÆþ÷¢q屢ûÞŠ=Ǿ–,oïz(÷úX±¿½è£Ü{ébÆþ÷¢q屢ûÞŠ=Ǿ–,oïz(÷úX±¿½è£Ü{ébÆþ÷¢q屢-Iä–K+É sHâ ŽŸò¥ˆ‹1¶.zÓ¾ä÷U²›=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}É‰!ô ¼¥…!G%Òù‡ñ õŸÖ?íáM RÑ’ãHshÐÖ¬¶g†üU5i“×5ÙŸ]CLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔ4ÉëšìÏŠš†™=s]™ñSPÓ'®k³>*jdõÍvgÅMCLž¹®Ìø©¨i“×5ÙŸ5 2zæ»3⦡¦O\×f|TÔx•<—’ÛŠB‚’O‘ÐGñ?=ê .kSÈm.)¥DäÈGÎ?»=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÁ±sÖ÷'º– ‹ž´ï¹=Ô°l\õ§}Ébç­;îOu,=ißr{©`عëNû“ÝKÅÏZwÜžêX6.zÓ¾ä÷RÃÖ¥7稨…(f‚ˆ¤ñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰] Pxu!¶Ó©k:R Ètg÷I› »”ÿB?j¯ K¥àܧúûUxirðnSýýª¼4¹x7)þ„~Õ^\¼”ÿB?j¯ .^ Ê¡µW†—/å?ÐÚ«ÃK—ƒrŸèGíUá¥ËÁ¹Oô#öªðÒåàܧúûUxirðnSýýª¼4¹x7)þ„~Õ^\¼”ÿB?j¯ .^ Ê¡µW†—/å?ÐÚ«ÃK—ƒrŸèGíUá¥ËÁ¹Oô#öªðÒåàܧúûUxirðnSýýª¼4¹x7)þ„~Õ^\¼”ÿB?j¯ .^ Ê¡µW†—/å?«ÚŸ .^P­C2œˆ%$|Ä×V5UT ƒÖ£Ì}´¼Óm,jN§$|‡ K—…{”ÿB?j¯ .—ƒrŸèGíUá¥ËÁ¹Oô#öªðÒåàܧúûUxirðnSýýª¼4¹x7)þ„~Õ^\¼”ÿB?j¯ .^ Ê¡µW†—/å?ÐÚ«ÃK—ƒrŸèGíUá¥ËÁ¹Oô#öªðÒåáhj [n'JÐt¨˜èÏî"¬MÕí@ õ¦eHIq–ÛÑ™H+Yär=üµ.^Ê÷)þ„~Õ^]/å?ÐÚ«ÃK—ƒrŸèGíUá¥ËÁ¹Oô#öªðÒåàܧúûUxirðnSýýª¼4¹x7)þ„~Õ^\¼”ÿB?j¯ .^ Ê¡µW†—/å?ÐÚ«ÃK—ƒrŸèGíUá¥ËÂÑ6â™y+H óN`ƒžG?ú±7Uµ|e¿f¿½4ýh-+ã-û5ýé§èÊ·ÅŒþÝoGiÅrÍHå¡?=fy¤Ë/›àzŒ~É=Õò’Ø2^-¼ÇÃøzË\ùAe¦FÞ „)jó–BFIJòP¼˜sKÅ·˜øYcËŸ(,´ÏèÛÔ…-^rÈHÉ)Qâ~J”o7Àõý’{¨^Noê1û$÷P¼œßÔcöIî¡y9¾¨Çì“ÝBòõ6Ø+PB`Ç%G!ú4ôм¼æø£²Ou ÉÍð=F?džê“›àzŒ~É=Ô/'7Àõý’{¨^Noê1û$÷P¼œßÔcöIî¡y9¾¨Çì“ÝBòs|QÙ'º…äæø£²Ou ÉÍð=F?džê“›àzŒ~É=Ô/'7Àõý’{¨^Noê1û$÷P¼œßÔcöIî¡y9¾¨Çì“ÝBòs|QÙ'º…äæø£²Ou ÉÍð=F?džê–†YbjÐËHm%¤’y«æ­CQÉf?êÏ´_â5`ñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰mxo“ÌCаÎ!Åv±sÃM4䤸²—ÖTt´2!JJ㊌…˜ƳAë?íøRIä—¨Ã6éf¹YU7(Û2+SXóÒ­l¸3B¼ÒrÌ|‡Î(1âGT¹LÄC6§œKan¸BI9f¥ x“À ¦w&wvÙµJ°Ýmx…‹½ÀZXrØ·HNœ˜Py¶Ôu§"Iã’ŽF §rqrÂVôݹîÑx„&¹m}ûcÎ-1¥ j,¯ZsË2¤+IÉG#A¬DŽ©r™ˆ‡mO8–ÂÝp6„’rÍJ<8ñ'€FÓ;“;»lÚ¥Xn¶¼BÅÞà-,9l[¤ §NL(<Ûj :Ó‘¤ñÉG#PS‹¹8¹a+znÜ÷h¼B\¶¾ý±ç˜ÒÐ5W­9å™ HR¤ä£‘ Ö"GT¹LÄC6§œKan¸BI9f¥ x“À £iÉݶmR¬7[^!bïp–¶-ÒÓ§&mµiÈ€Rx䣑¨)ÅÜœ\°•½7n{´^! ®[_~Øó‹Lih‹+Ö„òÌ…$) ÒrQÈÐk#ª\¦b!Æ›SÎ%°·\ ¡$œ³RŽÕðd{oô&³<Ò_Jò_i·7É”|2㠉ܠ³py¸Ï6îÙÂÚB"  ãKWž¤æÃ:ˆ½ÈƱØo|ŸO`\«…îÖ\›šwû²›C­ì‚Ðjµ­KÐR<ä[ X¬wžOnQ,*—:ùë2EмæQÔ„:Øm(F@pV N¥Œˆè)öÕnÁö~Gãc;žxº?ˆ\·ç"\†Û %„¯"–œOóÈðéãžYPl˜òdœ5…®8…l%8œKS΃=ÙL)+Rn*XmM)H!:ƒ¹•gÃ*œ#‚pŽ' À´Æ#º™¯-7ËŽ_e¼Ê iý È%Zƒ€œÁ2 §`¼)а\xVÈqÅo¢cî·qrS u¦Á(TGú¤%Zƒ€æA€(9loŒµÿ:~ú¤%0l{d¼_c‰{)ç®Q›–TrHdº¼ÏÈ4“Dt\`ÅûrÈæÄÒäð§&vöa ÄaN´–s[Ô×A\ *ŠÎ{`ùë¶ÌeVpÞ;o ; ÉyBlR¡©D­EAÁ–J()OÀ•(X_Yl±%› GŽ«F4›`TeÊ’ãR£´IÚfæ ~LФðþP°¾ ²Ø%bK6VŒi6À¨Ë•%Æ¥Gi“´ÍÍ@ü™¡IáüxÐ^å¶U¦áÊŽÛ/4Û/Dµ-éKë”ë i ´„©Å äIɉ59‘ÊžÃð-±±N n6ž„ËÑž” JBƒoµ'5%À“ÅH:OÌ8Q\Úª @ P("æü}^ʼnua¨äÆú³íøXQ_oÙ¯ïM?AŸÖ?íáM "üYŸfŸº‘È—~Á˜û“NlX6Åz‰s»:æñu¼9kº0˜Ã~lÆTwÐYqNE4… ¥O8žˆÌÄÊ8Î'´Ç°â;¥–Î5Æ<n°ÌÈΥƤ6•—¤’PÈðùëJg㑽¢¿ªI<›¶àýªs­Æ[±Ö„Ɍ܆‰ÿ‰·R¤,$ŠŒ7QyO‘Ž"Úà¢ßla˜–ø¬<¦¬Pbº_m+CŒ¶Ìð@POü#!PiZˆôÖŸ)Q£-Ä¥×’Öж‚x¨'1«!Ç,ÆuGcW)8{5Þrùm¿Íë¨Kbíñ“ ;2´-µ4Ê\¢„þ“A9 ŠÕÃ(!1æ$ÂÌ`‡p†Äq¯‹|EÏmÚ¨‰–\m”:Ú ßVÝej_yê΃›Áj#ÓXf|¥FŒ·—^K[BÚ â œÆ¬‡³Õ\¤áì8ÖyËå¶ÿ7 b6® Y-‹·ÆL4ìÊжÔÓ)rBŠúMä2+W  „ǘ“ 1‚Âƾ.uñ=´[j¢&Ó¶ÅÛTëóԙȎc¼RÐRß(s5·Á9ä¾@À¼£áe»ß.w¸ñf`–iÛbíªuùêL‡äG1Þ)h)o”9šÛàœò_ˆÕ ‚!ïŽIö‰ü « Ç'­6§C() Z‚AZÂS™?)9?‰9UËbÌ„ùH½Î»Å]ï,ØPçáÛüB¨™Be™:]J@YÙ¸ÑàTG%U?¨rítÁ÷|iV”Âl–†žqÙíJIZ-ñÐ’ÛhH ¬ÿH…Ÿ7àçUU›kø˜öŽ~5VYžnÉ÷*2pU¶ñlU¾Öós-ÏÇŒ§l0%8ZFÑÇ›+SY$ù„©9åæüÐiw Ï\æ¿p’ˆèvBË‹Lxí°Ø'Ñm´¥Á ò ¨ß¹½Yð½ÙŒC+Ù­n1%L{…‘rÝ[ êŠêYmÓç AL¨d_ÍW'W Æ)Å—‰¸º%ŠûmâÝojäÔÇß^÷æ™R”Ã.Œ’VdœúH ¢¹¬Æ-øÌLf[m8¤"C!a·’Ai JTzF¤¤äx€xUGEä—y4ëžå^F·µ=/Ü,Å™Nµ=‘§P ¶•2ê”AKº@yÄtAw“›ž oâ»ÜüKlÃPn6˽¾ILKuIÞã¼Û@nì¸V¢H9tQ\Öc F–üf&3-¶œR!°ÛÉ ´…¥* =#RRr<@<*¢ÕA7ãêö(üK« G&2¾2ß³_Þš¿ª»Ai_oÙ¯ïM?F}«àÈößèMfy¤§F!¿¦Di¾\öÄ%¸N‰+× $¥-ó@’rË3FYP1¦1µ¶Z¶bËÌD)ÕßÓ?ܤÁ†R¨Ñž–âÚd(A9' HŠ nØß’Êo—ëÅ1ÁK"\¥¼2u—@è  P( @ ‹›ñõ{~%Õ†£“?êÏ´_â5aE|e¿f¿½4ýXÿ´…4€‹ñf}š~êG"Wh%ijC¸t¡ %Dô Ò¡÷‘RD8@õèýª{ë,ÚNpëÑûT÷дœá×£ö©ï¡i9¯GíSßBÒs„^Ú§¾…¤ç½µO} IÎ=z?jžú“œ zô~Õ=ô-'8@õèýª{èZNpëÑûT÷дœá×£ö©ï¡i9¯GíSßBÒs„^Ú§¾…¤ç½µO} IÎ=z?jžú“œ zô~Õ=ô-'8@õèýª{èZNpëÑûT÷дœá×£ö©ï¡i9¯GíSßBÒs„^Ú§¾…¤ç½µO} IÎ=v?h;èZQZÖ:âÔ?Ȩ‘õV£“Jê…A• l6á°Ó²šBÐÚR¤©`@Èð5„˜•îpëÑûT÷Ñ-'8@õèýª{èZNpëÑûT÷дœá×£ö©ï¡i9¯GíSßBÒs„^Ú§¾…¤ç½µO} IÎ=z?jžú“œ zô~Õ=ô-'8@õèýª{èZNpëÑûT÷д£”´»!÷[:µ‚’:IHûÁ­COj…A~¸¬GÙ=!¶Ö•¬µž*$tÿYI†O8@õèýª{ê%¤ç½µO} IÎ=z?jžú“œ zô~Õ=ô-'8@õèýª{èZNpëÑûT÷дœá×£ö©ï¡i9¯GíSßBÒs„^Ú§¾…¤ç½µO} IÎ=z?jžú–‡[~bÝeah ¡:’s‚¢xÿÔV¡¨YWÆ[ökûÓWô] ´¯Œ·ì×÷¦Ÿ£>Õðd{oô&³<Ò[ ü1‰mVØ—«¦¹Ã·ÏÄ—"#³#†£Z€JøqàMFP( @ Pe[-WKÜö­vkl©ód-FŠÊuÖy% žô ”áŒJ»ç“Ã×5^uìù¸DpÉ×–zvYkÏ.9eÑA‰q¶Ülóž¶]íò`ÌŽ­G’Òšuµ|ÊJ€ ÿ˜ ªÙjº^çµk³[eO› éj4VT뮳É(H$ð Pd§ bUß<˜F¹ªó¯gÍÂ#†N¼³Ó²Ë^yqË.Š K¶ãgœõ²ïo“duhz<–”Ó­«æRTüÅVËUÒ÷=«]šÛ*|ÙKQ¢²§]påžIBA'€=ƒ%8c®ùäÂ0õÍW{>n2uåž–ZóËŽYtPb\m·<ç­—{|˜3#«CÑä´¦m_2’ ?æ(*¶Z®—¹íZìÖÙSæÈ:Z•:ë‡,òJ <è)ÕwÏ&‡®j¼ëÙópˆá“¯,ôì²×ž\rË¢ƒãm¸Ùç=l»ÛäÁ™Z%¥4ëjù”•Aÿ1AU²Õt½Ïj×f¶ÊŸ6AÒÔh¬©×\9g’PIà@ Ëk â—ïŠÃ a««—„(¥VôCpÉI2 @k.=W uÂÓ5ëmÖˆRã«C±ä4¦Üm_2’ ?çAA7ãêö(üK« G&4ÕŸh¿ÄjŠøË~Íziú þ±ÿh? iâÌû4ýÔŽD®Ð()R’š¾|†C2MRº‰‚ûª^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥àz•%i ĨT{@ P((jâ†ÝXùÒÒ”=àRð=Ô®¢G`¾ê—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x Jê$v î¥à5+¨‘Ø/º—€Ô®¢G`¾ê^Rº‰‚û©x©+§çÈæ2 ÕP( uæHJ^G#¡µ(ÿAK†¥u;÷T¼¥u;÷Rð•ÔHìÝKÀjWQ#°_u/©]DŽÁ}Ô¼¥u;÷Rð•ÔHìÝKÀjWQ#°_u/©]DŽÁ}Ô¼¥u;÷Rð•ÔHìÝKÀ%aD€#¤(Gý [ÜP¯Œ·ì×÷¦Ÿ¢í¥|e¿f¿½4ý6bØS¥Ô’€øÔISfy¤¾šå]*iå:õ5™(´â)Ua”ì”®,ü¥%qÕ# Ô@â’•–y9é¨Ëç¡@ P( ³’ùøVÛ-2±TÏ2ÜøªiØ÷&á¢:ƒ©%ÇJÙp)q hèøBƒ”)¸^~)Ÿ# [çÆŽ©/*âÜÀòËŠ:ÛRh%e:¿æ4VËÈ’D§ñu¢#/=u¹a×c@b;¡¹Nóo2É þ‘qÐð%Dñò1!IK—©Y1å/N¶.d§~Sâj\\@½'ûÆâyhÏNŸðÐs^[òfé†m’Râ.vì7-ɧœ<ÃÁÇT†P7˜Ià)Ë!–@*äI"SøºÑ—žºÜ°ë± 1Ð܉'yŽ·™dH¸èx ’¢xŒŽyé J\½HÂÉ)x òpͱp“%;òŸRââé?Þ7ËF| tÿ†ƒšòß“7L3l’—s·a¸‘nM<àqæ:¤4ꀸ†ÂOANY ²W"IŸÅÖˆŒ¼õÖå‡]ˆî†äI;Ìu¼Ë$ƒúEÇCÀd•ÄdsȇHRRåêFLyKÅ“†m‹„™)ß”øš—/Iþñ¸€ÞZ3àS§ü4×–ü™ºa›d”¸‹» Ä‹riç0ðqÕ!§TÍÄ0¦x rÈe ¹H”þ.´Deç®·,:ìh Gt7"IÞc­æY$Ò.:$¨ž##žD:B’—/R0²cÊ^(<œ3l\$ÉNü§ÄÔ¸¸zO÷ÄòÑŸ?á æ¼·äÍÓ Û$¥Ä\íØn$[“O8y‡ƒŽ© : n!…0“ÀS–C,€UÈ’D§ñu¢#/=u¹a×c@b;¡¹Nóo2É þ‘qÐð%Dñò!µâ<бÆ3Ãø3oì\àaíb4 ®CñYmå¯fúZÝZTTlÂs+JS¤À4NX¥^Ōƻa»½•ût[|&nñÖÌÇb²št(T½$ðà>$': ¨‹›ñõ{~%Õ†£“?êÏ´_â5aE|e¿f¿½4ýXÿ´…4€‹ñf}š~êG"R‰Ã÷åÊ·ÁE’z¤Ý’…ÀdFY\´­E-',Ü P)9æA ж֦ÜB’´’•%C"éPøäohªI<’õ(=Bâ‚’¥(ä’~j ÖĘmÆZÄXzçj\”mLØŽ0]G¤°5â(¼1‰pÒ˜N#Ã×;Q”«lG.£ÒN°5#ˆ ŽBâ‚’¥(ä’~j ÖĘmÆZÄXzçj\”mLØŽ0]G¤°5â(¼1‰pÒ˜N#Ã×;Q”«lG.£ÒN°5#ˆ ŽBâ‚’¥(ä’~j ;¾Äøyøñ¯ørémzZBã·2Œ©äž‚€° ‡ÑAMó b\0ã,âL=s´¹!FS:#Œé$, ÇñÈBœPBT¥€2OÍA'w¸Ÿ?5ÿ]-¯KH\væCq•<“ÐPPâ:()¾aŒK†eœI‡®v—$#hÊgDq‚â}$…˜þ"‚9SŠBJ”£fIù¨$¯8_a×XcaÛ±ÙIÖÂ&Dq•:Ÿ!`jG@¾a|K†VËx“Üí+’£)Æ ¨ô’¡Ç¤PFP( ‚? ßlçã5c“l«u¶ãxœÅ®ÑLé²Vbê Ž®–W1-³ߥÚCŽ9=‹sÎFBQžµR’‘ÌçÃ#Q;ã«¥•ÌKlÁwév†ãŽObÜó‘”g­EÔ¤¤äs9ðÈçPc·„ñKÖq[Xjê»# Ù»rL7 T+PN•;–€u)#"zH-Q@ P("øäŸh?jÃqÉëM:û¨a†ÔãŽ(!@%JQ9é5FÂy5å_†Äbð¶7¤Û©ýåLç–Ð5§YF`Ye—W» ó \\³â;4ëTöBK‘fÆ[ (’P°3àÐ`ÐfÚþ&=£ŸU–g›.ˆPIÙ°Æ%Äi’¼=‡®wDÃFÒI…ÇÃ(ãç/@:GÄüÔ 6ĸ2W‡°õÎè˜hÚI0¢8øe|åèHàxŸš‚2‚N͆1.#L•áì=sº&6’L(Ž>G9zÒ8'æ Y°Æ%Äi’¼=‡®wDÃFÒI…ÇÃ(ãç/@:GÄüÔ” ‚.oÇÕìQø•VŽLe|e¿f¿½5Uv‚Ò¾2ß³_Þš~ŒûWÁ‘í¿ÐšÌóIgQ’@ P( @ P( @ P( ‚.oÇÕìQø—VŽLhÿ«>шՅñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰}É¢gžLײS7à ´’úY)ÊpAφ°Ké’öœ”A¬Ï4—­+Ö~9Ú+ð*¤“ɰ[\·59‡.ñdɆ•‚ó1¤%‡VŸ™.) ?Ä¡_åQ†ýÊÍã“ûœ{ 0Ͳ晌Ù`4^vöĦšB[ ²¶Ñjž«Xÿ|‘Z¥«ƒ×HmZ]SsTúe¥àÑKº†’H 9åÇ1•TwȬA°99N)²Üðä8¸Õ™“ábÃÒd$†v’ÐJÓdS³âH:×þ ¹Pƒu±òm*Û‹b΋u‹ 訟$<䄈î RšóS“-QôŸ8? YgAÈ--\ºCjÒꛚ§Ð#-/Š]Ô4²@IÏ.9ŒªŽùˆ8V')Å6[ž‡³2|,BøzL„ÎÒZ Czc€ŒŠv|IZÿÃ*n¶>M¥[qlYÑn³±a䇜‘Á*S^jraŪ>“ç§á+,è9¥«ƒ×HmZ]SsTúe¥àÑKº†’H 9åÇ1•QØñ]‹CÀRÃi°_ì7§±*•ßt“´¸Ë–ãm¥2c¬%¢†µ%)ËGÂRNÑyy°Er«‡ñfÁÖ¼x°^îOO™v棽9ÆÒ•1n$!)oŠÇ뚇šHsKW®Ú´º¦æ©ôËKÁ¢—u $,sËŽc*£±â» ‡€0¥†Ó`¿ØoObU*5¾é'iq—-ÆÛJdÇXKE jJS–„¤¢òó`ŠåWẫ­x ñ`½†#\žŸ2í: ÍGzs¥*b*ÜH BRßÖ+54$æ6–®]!µiuMÍSè–—ƒE.êHY $ç—ÆUGq›"NÃxã' \íOÚñrnNZ1¤®T÷ZRŸmjCa¶Ì$æÞZ” Zòób°9Rnü–7f’1w+–(]Ö;Wö[bP`ÇR]Pi.,è*,þ”‘´ ‘¦ˆâuB@ P(!SðöÎ~3V96”Ã?÷’Óÿ¿1ÿˆš²K¥_lw‹ç+\¡$ßeÙðÔ,G2eêbPm´¢S¡¼>IRZGI*= PŸˆÑ9CÅZã‹Þ+Õ7IŽHC*V¥!$ùºø•–ZÊs?-XÑZõ…¿â½Š?¬C3ÍÕð}›b(›íɯ.ß¶m¬C…KR\pêa ˆ¢€œüàK#Šh9‹…j-%IA'HQÌòfrû…TvLg›‹ðµ®ÑŒ°,s…-ñ'©¬RÛÏ´«veÇ ZÃ¥‚v€ÚÛÖ @OH5Yæâü-k´c, áK|Iêk¶óí*Ý™qÂV°é` 6¶õ¨Ò ª;.³ÍÅøZ×hÆX9–ø“ÔÖ)mçÚU»2ã„­aÒÁ;@mmëP '¤ƒ’¼Œ/œšò"Ë…/¦[!ÆŒ¸°]u/:‹”U­´¤…)(E#ˆH$ð¢¹ET( ‡¾9'Ú'ð&¬7žU§âix_•A!œ,Åú4ì3iƒ2;åô¡ ªê*ahZ|æÒ3Ô>-HäŸ/•Œ?i°Þ­nÚ-ÏÛv³Å¹¿m}Õ8¸.º›Z—çé!)q:³V—™=&´ª Û_ÄÇ´sñª²ÌóOÙ#áy ”q%âéH@1Dkrëã˜Y[íhF¾“Ç"è;%pîwžOìQp¤y¯Ïµâ÷'Nܤ†U6£ÒßÍ*ý4I |äçÆ ‚Ø”âtÈ_&ñåHn(÷š¾JYYgr–÷š¯îèJ$ üÐ3>rsâ7”)V©Øûαl‹ÄÇaènÁO,·—ðÒERä®ÎóÉýŠ.5ùö¼^äé۔ʢfÔa[ù¥_ F‰ “¤Oœœø†ÁlJq:d/“xò¤7”{ÍFß%,ˆŒ,³¹K{ÍW÷t%~hŸ99ñÊ«Tì}‰gXŠ ¶Eâc°ô7`§–[Ëøi"‚¨P("æü}^ʼnua¨äÆWÆ[ökûÓWõWh-+ã-û5ýé§èϵ|Ûý ¬Ï4–×Á8‡ Zí—«£PŒÁtC~%Æ4´­M„­‹‹Ð¤‡[Í*ÈùÝ4e@ P( qãÈ—!¨±XqçÞZ[m¶ÒTµ¬œ‚RIà ñæ]ŽêØ}¥¶ëj(Z’•‘‚ ŽÃW¼Wqæ« 1"@io¯S¨i¶š@Ín8âÈCh¥J ž‚Hrm$Væl®(¾(-möåò­–ËIi¯FG¦ ŒÄ8rõ…nj´_¡Ò’„:q.!m­!HZ‚P´(B’H?!ª=øj÷Šî<Õa†$H -õêu 6ÓH­ÇYmt©DóÐIM±¡ÄŠÂ|Í•Å÷Å% À£^ܾU²Ùi í5èÈôÔ˜‡^°­ÍV‹ô#RP‡@%Ä-µ¤) BÐJ…RIä5G¸w ^ñ]Çš¬0ĉ¥¾½N¡¦Úi5¸ã‹!  •(€>z !ɶ48‘XO™²¸¢>ø d´´kۗʶ[-$¦½š‚3áËÖ¹ªÑ~„cJJèĸ…¶´…!hZ BРA I ü†¨÷á«Þ+¸óU†‘ 4·×©Ô4ÛM f·qd!´Ò¥ÏA$96Ƈ+ ó6WGß –ƒ6{rùVËe¤ƒ´×£#ÓPFb9z·5Z/ÐŒiIB8—¶Ö¤- A(Z!I$ÕáÜ5{Åwj°Ã$–úõ:†›i¤ ÖãŽ,„6€:T¢ùè$äó3ˆÃ2-­15¦)eéŒ70 ’—·…,3³!IÉzôC#Æ Ävó…îK´_aÒR„:´­+mi Bд•¥I …$Aàjˆê¹¿W±Gâ]Xj91£þ¬ûEþ#VWÆ[ökûÓOÐgõûAøSH¿gÙ§î¤r%'Ï×ÍòÞgoVÄ´ˆOï ÚFKg6ÃjÏ4ž) Ë/’ƒçžòäHunºêŠÖµ¨©JQ9’IâI?-,ür7´?U$žIzŒ @ P( @ P( @ …OÂwÛ9øÍXäÛ*Ýr¸Ùç1t´Ï“ de‡‘Õ6ëJ J’AIþ Õ>U9O·Í›qÊ>(.ä´91öoä•%:R§šÈONy´;Íêóˆ®O^qÚmÎá#NÚTÉ yç4¤$jZÉQÉ ™èPaÐH[þ!Ø£î†g›"ª @ P( ‡¾9'ÚÀš°ÜrzÓ®°êaÅ6ãj BÐrRT`‚: Q°žR¹EUèb5cüFnÁO7W÷È9†öšµhÌ“§<³¥ AΟ:é1ë…ÎkòåHQ[¯¾áqÇzJ”¬É?ÄÐX ÍµüL{G?«,Ï6] P( @ PEÍøú½Š?ªÃQÉŒ¯Œ·ì×÷¦¯ê®ÐZWÆ[ökûÓOÑŸjø2=·úYži.»Šì®3È®l^0ûÏÛ.9’¢±~‚ô†Ú’!†NÅ— %µæ’¤i%A5Ì*¡@ P( £“|GfòÝs¾X-×(ÍÌŽµ91R†ê”º•)Ôî ©@ÁAc‡Á41åþÓˆñË…›[­QÔû¤nJ’D€\Q¬HuÂA¤Â(©þHn6Æ\Å69ò`GzûbT8jžþÂ;"Twö.;©;4¸†VEIâGœ3ÌDoÇá•ÜžÁ‰ºXŒŸ Ù±•7+zæ¢zf»Î°6e±°Úm2Í#Ïÿ?å~ål•?Z-ÒáI]ŠÁÝ-È/m£‡ö¯:[mÌÕ´Jò[Ô tp'¦‚®Hn6Æ\Å69ò`GzûbT8jžþÂ;"Twö.;©;4¸†VEIâGœ3Ìüq]É웥ˆÉò ›ySr·®j'¦a‹¼ëf[ ¦Ó,Ò<ÿñPsþWîVÉSðå¢Ý.•جíÒÜ‚öÚ8jó¥¶ÜÍ[D¡/%½AJGzh*ä†ãleÌScŸ&w¯¶%C†©ïì#¸ò%Gb㺓³KˆehÔTž$yÃ<ÀoÇá•ÜžÁ‰ºXŒŸ Ù±•7+zæ¢zf»Î°6e±°Úm2Í#Ïÿ?å~ål•?Z-ÒáI]ŠÁÝ-È/m£‡ö¯:[mÌÕ´Jò[Ô tp'¦‚®Hn6Æ\Å69ò`GzûbT8jžþÂ;"Twö.;©;4¸†VEIâGœ3Ìüq]É웥ˆÉò ›ySr·®j'¦a‹¼ëf[ ¦Ó,Ò<ÿñPsþWîVÉSðå¢Ý.•جíÒÜ‚öÚ8jó¥¶ÜÍ[D¡/%½AJGzh*ä†ãleÌScŸ&w¯¶%C†©ïì#¸ò%Gb㺓³KˆehÔTž$yÃ<ÀMbáj¾âŒ3f·É³ÜÃxzäÕ¾tˆ²›•©±%ÄY[£¸3Cˆ* VG"2RA@"¨÷ a+†0Ÿ&$9Q!±#“¦Ì˜µ%ˆ±ÑS‹Ò•(JJ@JT¢T: ±É6 ò…Ë*®V¤ÄnÖ/j»——¹sy)„m J”§F½gNœøTx· Ü0}É«|ée7*3SbKˆ²¶%Gpf‡T¬ŽDd¤‚ €EQîÂW a>LHr¢Cb G'M™1jKc£ §¥*Q””€”©D¨tc’lAå –U\­IˆÝ¬^Õw//ræòR3Ú•(#NzÎ9ð¨ ñn¸`û“VùÒ"ÊnTf¦Ä—elJŽàÍ ¨%YˆÉIAŠ£Ü%„®Â|˜åD†ÄŽN›2bÔ–"ÇFAN/JT¢5)))R‰Pè&Ç$؃Ê,ª¹Z“»X½ªî^^åÍä ¤f´)*PFõ:sáPAâÜ'pÁ÷&­ó¤E”ܨÍM‰."ÊØ•ÁšAPJ²9’’ ‚G¸K \1„ù1!ʉ ˆ16dÅ©,EŽŒ‚œ^”©DjRRR¥ 9ÐO5É%ÜߤÙåâ$H±íú›«‹}q„t€â6m)Ó™VZK`‚•§yÙqv+Ü+»-„é— %—3!æÛs9Ð8ƒ–c"h ‹›ñõ{~%Õ†£“?êÏ´_â5aE|e¿f¿½4ýXÿ´…4€‹ñf}š~êG"[æ·[ärSî/ÁŽä¸“,éŽúÚIq”­R5„(ŒÒ¥9åÓÏ¢§èÒ*Yøäoh¯Àª’O&ÁmŠÄéÌD•roiÕ„®T”¸¦š’ƒHZÈÿ•$ÿ Œ7ŽSð>ÂѬÒlX¶Ë1É6¨O;*gí^ZÐJ¤û @Bˆø:‚†q¨­C áûž,Äì3fd;:ç%¸¬$œZÎC3ò9“óUG^åkHÁX#]í|ŸI´¦Õu¸ÄrmÊšɺe2줼‚P¤6à 'R!& ÖùJº¬àl)mºÚlM^îirù%èHp\j+Ÿ£ŠÉ1ÚF`¥:AÏ0ë0 æ¬º¦CÈ*mA@-i$ø¤‚þdj޵‰ Äį’…¯ ÂíþÕ ÉðmP£ÀÖ«œ¦ÔZKm¥jBY™áQWù^·ØÂíinâ¸Ø‰øB}‚ܘMDŽ[*j+ÈЂë‡BÔÉc$+ô«Ïr¨P(1î“ìWøMIXæ­´P( @ P(ØEóÚ F{)¬‚ܘí¾ÒÁX)·¡‘è ŠHéÒî"rÑm ¯Øc‹Ä¦‘z°¶ôVaõ6–Ye¶m (È•lÓž‚JÁ$ª~#IånÛ ÑÊN!m²›L4LR£ÄÔ•4 ‚’•):T•'%(¨dHãV9,5 Ä#{~X†g›¨aNOð•ß_/·y‡¢ÎaP¶eöîZ k[Ip7IQXHËFÐ ºSAÎHBÔ„­+ $'<•üFyxªŽûÉîÃ/Aäó KµØžcÆ”åÑÙP¶³R¤ÈŽ wôÆÁ,!ÂÑ™QÏ^yžáÌ2ôO0Ä»]‰æ1œiN]• k1Õ*LˆàÇA,l -•õçTtLûWK9@6ÙjxZíðåël}é—WqŠÚŠdèÛdP¥'N¼²QáÆ¢·žJ,XSÂÂ8y¤aA¸±2>%ß·~tL¥8öÉLêý8JZØ)%Ÿ0²ç è8T( ‡¾9'Ú'ð&¬7ž´â™u $© h N`ü æþeT} s²ái|¥â›õúßcl˜R×pj;6v‘È}¸iÔ¸ÌÃÊ×)Å„¨€¥%D68gñ³•[bâ_a]›n›ûnjãø6–­¨[Kk%Fh6´­— 3̧<ÎyÕ…†™TfÚþ&=£ŸU–g›¦òk°¾&¶_¦Þñ}’Ñm2f4”OÚFZVØKê,°¤)(!JWóA¢\#3kñ#\#Ïi¥”"Lt¸xñ$8”¬ÿR~p*£­rwÏhÀ¶kâíÒïX™ût¡u½m#²Üb˜¬ù‹Ù8á’áÚ Ìzrãì|9†p0”ݾ×b¸‡ñåÊÄ£v…¾¡ES n+GBön:Z¶ƒAóž2â{Ù¡aÜsˆ°ý±epí—ip㨫2[må!'?—‚EDäî-žÑl×ÅÚ,3¥Þ±3öéBëzÚGe¸Å1Yó²qÃ%ô˜<ôåÄ'cáÌ3„¦íö»Ä?.V%´-ð½ *˜KqZ:³qÐúÕ´˜<ñ—ãØöÍ ãœE‡í‹+‡l»K‡EY’Ûo) 9ü¼( ª…‚.oÇÕìQø—VŽLe|e¿f¿½5Uv‚Ò¾2ß³_Þš~ŒûWÁ‘í¿ÐšÌóIu¼jp…›# `>P¬—;Fe\ÜkƒSnr€ )[XÉi 5­zÚ|ªQÍJ1—2ª @ Ù9?ÆOàŒK ðˆ°_a¹,.Bd[#L^Í+e·BƒkÈ”’“üE¬m‹$ã+ô‹³ñ 0…:æÅ1m‘¡š–T6„$-|x©Zñ4<–bKE‘üAj½ÏjûI‚Ü×£ Ç}Úl%Em•1¥@%\ðHÌT±å®ìîç¸é·œÖEáVÕ¦Z&‰ÛSAVî]ͽ;<ôäteæÐhܪb;Eöáddš‰±¬6fm†cqË ÉwjëÎ-¶ÈIB5¾¤¤¤ä‘掊 ù,Ä–‹#ø‚Õ{žÔ/ö“¹¯F2Žú$3!µ:ØJŠÛ*cJ€J¸+à‘˜ Ý(øEwgpß=ÇM¼àö°ò/ ¶¨Å2Ñ4NÚ˜ú ·rîméÙç§#£/6ƒFåSÚ/· $ $ÔMa³3l3ŽXnK»W^qm¶BJ­õ% ¥'$4tPWÉf$´YÄ«Üö 1´˜-Íz1ÌwÑ!™ ©ÖÂTVÙSTUÁ_ŒÅìyGÂ+»;†ùî:m絇‘xUµF)–‰¢vÔÇÐU»—soNÏ=9y´7*˜ŽÑ}¸Y Y&¢lk ™›a˜ÜrÃr]Úºó‹m²Po©))9$y£¢‚¾K1%¢Èþ µ^絋ý¤ÁnkÑŒ†c¾‰ ÈmN¶¢¶Ê˜Ò ® ø$f(7cÊ>]ÙÜ7ÏqÓo8=¬<‹Â­ª1L´M¶¦>‚­Ü»›zvyéÈèË͠ѹTÄv‹íÂÉÉ5cXlÌÛ Æã–’îÕל[m’„k}IH)IÉ#ÍòY‰-Gñª÷=¨ _í& s^Œd3ôHfCju°•¶TÆ••pWÁ#1A°Þ1œ)x¢ÎÎå1Ü;Ì8}»R/‘˜•™Ní–ó %„í[h©åŸCiÍ)Ï€k<¬b+>&ıæÚ¦oî3n‹uËw,óŒ´#'$h +š€R´ê h4Ê¢.oÇÕìQø—VŽLhÿ«>шՅñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰oÐ.V'$·›_?F—vij ¬@a§µÂj2¤jSËZÞj+FÚ—Àœô‘•OÑ£U³ñÈÞÑ_U$žIzŒ/J6qh͘ü‚ÃIa¢ë…zHÉ(N}  ‚Í|«õÚe–“/]¾ØóïÅgf‘³[Ú6§PŽ{$p$§†YœÃÛõþï‰îk¼_%ï2Üm¦ŠÃi@m´¶„„ ¤%J@ …k-­.$$”¡©!C‡ÎþFƒl½r«oâÔf˶°åÆÜ·=Í Ñt)KB[r;HZPµ+FzuYgÆ Åļ¡bÌ[ ûÔøæ*T²ÄX1â6ãäd]ZYBŽe˜Ö¬ÕÄñâh5Ê¡@ Ç¸|BO±_á5%cš>¶Ñ@ P( @ PfÙ.bËw‡wÜ#MÜÞCâ<’ài“˜ Ù©*Ë?™@ÿ ªG)ìOÄ7¬Gwäß Ü½ÌT÷‰›6Vee²™y)D¨¥jRs<*Xk˜£Ýq}úf$½ºÚæMXRöm†Ð”!#‚R”¥)t*ˆº Ä#{~X†g›9©ÓXŠü&f>Üy%öRát¤’’¤Ž È“–}š¨³A²Ú9HÆ–°íªó±„CÉlÌ­ÖÉÒèeå$¸ÈXà Ú“«åΠZ9HÆ–°íªó±„CÉlÌ­ÖÉÒèeå$¸ÈXà Ú“«å΃Zª6Œ7ÊN*Âv‰v+)³ˆSò‘*ÅZŸHRTµ¾ÊÔ¤…!* '  ñ¨1í8÷X­Ù-7ãLJRÓ“!-¸2q| ºÚ Ô”¨™Ìq5F¿@ P("øäŸhŸÀš°ÜrzÒÒÛ¨qm%Ô¥@”,*ôˆ9àAª7ÉÜ±ÝæâÙX¬a›)¸ÚÛ³Ü-‰nBá͌ڔ¥ÀãÊpg%!i ´• •™2Éf·‹qdü_pblȱ!³3p¡Ã†ÙCc£2–ÐT¬³R”J”TT¥I5y*ƒ6×ñ1íüj¬³<Ò1§M„æ>ÀÑaàÓ…;FÉ¡Yt¤8fƒcÂÜ¡âüñpíÕÚuäIÐìVdßH!/7µB¶N€H#J‡ÏPU†ùHƘMc¼ìÄ™ ˜­¼fd”ÈNy>‚êU³tfHŒ—üh5Ç]u÷VóÎ)ÇQRÖ£š”£Ä’OIª6-Ê/ÁŒ;ÝQ§^DÅf@mô‚ó{T+dè€â4¨|õXo”Œi„Ñ!;ÎÌI™ŠÛÆfIL„ç“è.¥[7FgôˆÉƃ\u×_uo<âœqÅ-j9©JшՅñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰] Pxu!ÆÕ¥h:’HÌte÷I‹‹»ìÿN?d¯K% ßgúqû%x©bÐo³ý8ý’¼T±h7Ùþœ~É^*X´ìÿN?d¯,Z ö§²WŠ–-û?ÓÙ+ÅKƒ}ŸéÇì•⥋A¾ÏôãöJñRÅ ßgúqû%x©bÐo³ý8ý’¼T±hP쉶¦]q …*ÒÙ”fI¥–Ðò¨P( @ P( AëR&0ÚYiÆŠ4§Sd>A˜"¥‹B½ö§²WŠ–KA¾ÏôãöJñRÅ ßgúqû%x©bÐo³ý8ý’¼T±h7Ùþœ~É^*X´ìÿN?d¯,Z ö§²WŠ–-û?ÓÙ+ÅKƒ}ŸéÇì•⥋A¾ÏôãöJñRÅ ßgúqû%x©bд5-Ç©k:”@Ète÷V"Êö@ PzÓÒ£¤¶Ëę̀ ’39ž‚>Z–-u{ìÿN?d¯,–ƒ}ŸéÇì•⥋A¾ÏôãöJñRÅ ßgúqû%x©bÐo³ý8ý’¼T±h7Ùþœ~É^*X´ìÿN?d¯,Z ö§²WŠ–-û?ÓÙ+ÅKƒ}ŸéÇì•⥋A¾ÏôãöJñRÅ¡h—qO<°¥¨ù£ Ï!—ýMX‹*Ú¾2ß³_Þš~‹´•ñ–ýšþôÓôgÚ¾ mþ„ÖgšK ÏÀ–U`éø³ â—®I´Iz¶˜Í•=¯IaµFh9…%µeÇNYåi•B@ P(v{d‹ÝÞ š*ÛCóäµµ8H@ZÔ ˆå™ã4\`»l¸J¶¾¤)Ø-…”RT•HÏ.Š ¼„Å’nNOº›m²Ëorçp”–6ËC)ZÔµ©ÇHIvd€* ý‘°›Ë…ÌQ–nÀœM΢.˜JXi)õå¶Û–¦œÁ:²ãA­ãŒ"Œ#> "\ÅÆÝv€ÍÎß(³±S¬9¨yíæ­ Jд¡šNDŽ4àŒ Ö,“rr}ÔÛm–[{—;„¤±¶ZJЀÞ¤…­N8Ú@*Hó³$A±ÿ²6yp¹Š2Ãm؉¹ÔB%Ó K %">¼¶Ûc²Ñ´Ó˜'V\h5¼q„Q„gÁDK˜¸Û®Ð¹Ûåv*u‡5=¼Õ¡iZ’”3Iȑƃ܄ŒnNOº›m²Ëorçp”–6ËC)ZÔµ©ÇHIvd€(6?öFÂo.1FXm»q7:ˆDºa)a¤¤G×–ÛlvZ6šsêË·Ž0Š0Œø(‰suÚ7;|¢ÎÅN°æ¡ç·š´-+BÒ@R†i98Ð{‚0ƒX²MÉÉ÷Sm¶Ymî\î’ÆÙhe+BCz’µ8ãi©#ÎÌÇþÈØMåÂæ(Ë ·`N&çQ—L%,4”ˆúòÛmŽËFÓN`Yq ÖñÆFŸ.bãn»@fço”YØ©ÖÔ<öóV…¥hZH PÍ'"GpFkI¹9>êm¶Ë-½ËÂRXÛ- ¥h@oRBÖ§m $yÙ’ ’¼`œ/†¯QY¿b«™²Ým]-“àZûÏ6âŠB\eÉ †ÈRJ²qy)30\£af Ä Øí·©WàÆ”ñ“ 1]aÇ›lV„ºèÔ”©䣑$|”½Q7ãêö(üK« G&4ÕŸh¿ÄjŠøË~Íziú þ±ÿh? i–„–ÚC{6Ž„„ç´j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»Cᦣĥå<—J’8(ž’?€ù¨/PZWÆ[ökûÓOÑ!iÓ“ú#mÄ‘ËBk3Í%Õ¯x÷ ¹ÉäŒë‰ïa×X]½›Ê Ù…±IqeE@è9%¤I)',£.mT( A°`|sˆ° ö=ëÝî0ÂirZ‡5ÈÛÓHXQieŠNYdAz ¼cŒñ9¼»xÄW«ÁekØ ³c´¥•Ð¥ž ô ‡ð ”äÛÁÂs.ñîÊžÔݸÀvM¿#&"ÒóO´û@©!JKŒ å©9‚xƒ‘¨6ÑË ŒßœŠMõ5a¶ðê'§G9%h’%¦na;MähÚ|–¼øÐiü¤âø8¶ålM¨MT-±«dw§e¼ÈÒ·qçJ‚T·^qY+ @ÌôÐWɶ1ƒ„æ]ãÝ•=¨7»q€ì›~FLE¥æŸiöRB”—AËRsñ#A¶ŽXlfüäRo¨±« ·‡Q=:9É+D‘-3të Úo «FÓàœµçÆƒOå'ÁÅ·+bmBj Ùm[#½;-æF•¸ë8T¥ºóŠÈ)Yg¦‚¾M±Œ'2ïì©íA½ÛŒdÛò2b-/4ûO´ ’¤¸ÊZ“˜'ˆ9 ´rÃc7ç"“}EXm¼:‰éÑÎIZ$‰i›§XNÓyZ6Ÿå¯>4)8¾-¹[jUËljÙéÙo24­Ç\yÀ’ •-לVAJÈ3=4òmŒ`á9—x÷eOj îÜ`;&ß‘“iy§Ú} T¥%ÆPrÔœÁÓí¤…).2ƒ–¤æ âF‚VóŽð÷á‰×hwi˜k Å iy(3'¶Û‹yÅ85éIu×W˜Ö­)WJˆâV!¾\15öሮ®í&\å;-õ|…kQQËæžæª#è"æü}^ʼnua¨äÆú³íøXQ_oÙ¯ïM?AŸÖ?íáM ] P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( Ai_oÙ¯ïM?F}«àÈößèMfy¤³¨É@ P( @ P( @ P( A7ãêö(üK« G&4ÕŸh¿ÄjŠøË~Íziú þ±ÿh? i–ÝââYo%Fn—ÿ†¦¢­Rz–»C᫨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓQá\-5Çÿh|4Ô{ªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚6%hK œ³ 'ä'æþ¨ @ P( @ P( n8´­-¶„¨¨ÅYteüÏAæ©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ôã»PÛ¤f’ R¬ú2þç »Ai_oÙ¯ïM?F}«àÈößèMfy¤º•û“k^äµ8šdÙg"í4¨™¤1‰1Ÿy´(e«m“(Qó²Hp$@åsº¡@ P( ƒàlE¯±ì¸~Ñq˜óH’ì8NIÝZZÂK«3Ï2@áÒ(-㈰5åÛ>"²Ümë ^À͆äs!¤¬¤8„¬qIˤf?§&Ø:,™w‘vL÷`Ù-Æ{±­ù 2Ö§ša¦%* Ry=*ÈÀœ…A¶ÿ±ë¿9(‹êìiÃmâ$@NŽrR×$DL-Z v›É)׳ø#=ð ÓùIÁðpÊØ«Qš˜7«cW8ìÎËy©n4ã.„‚¤:ˉÌ%9€C¢‚¾M°tY2ï"ì™îÁ²[Œ÷c[òe­O4ÃL4JT¥:òzU9 ·ýXÅùÉD_WcNo"ts’–¹""ajÐS´ÞIN½ŸÁèÏ…ŸÊNƒ„nVÅZŒÔÁ½[¹Çfv[Ì}Kq§p¤$!Ö\Na)Ìròmƒ âÉ—ydÏv ’Üg»ß“-jy¦a¢R •)×3Ò¬€< ÈPm¿ìzÆ/ÎJ"ú»pÛx‰£œ”µÉ V‚¦òJuìþÏF|(4þRp|#r¶*Ôf¦ êØÕÎ;3²Þcê[8Ë…! ©²âs N`è ¯“lL»È»&{°l–ã=ØÖü„™kSÍ0Ó •©N¼ž•dàNBƒmÿcÖ1~rQÕØÓ†ÛÄH€䥮Hˆ˜Z´í7’S¯gðFz3áA§ò“ƒàᕱV£50oVÆ®qÙ–óRÜiÆ\) Hu—˜Js‡EFnÂõö,lG|¸O¬2¦áLDgB”@ [NŒ†y‘§Î*ªzë‡p¶åfóƒ®qn³íëÔ»SA‰ÍÇ’R‡ÔÚ§ÊÒN@&š‚'Ø!á\y‰0½¹Çœ‹g»Ì€ÂÞ ¸¦ÚyhIQ¢3ÈŸÈ(ˆ¢.oÇÕìQø—VŽLhÿ«>шՅñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰] P( @ P( *øHÿ›ÿ#AU@ P( ‚Ó߬cÚªH»@ P( @ P( @ PZWÆ[ökûÓOÑZó:R Ö„f:@*ÿ:HÏæ¸~‹½²ûë,ÞNk‡è»Û/¾…俏~‹½²ûè^Nk‡è»Û/¾…俏~‹½²ûè^Nk‡è»Û/¾…俏~‹½²ûè^Nk‡è»Û/¾…å2+QK+d¬k^…,¨¤Ÿ”ÿ BÄÝC-å1JPK‹!ZNG ’zéZT·2Ûº·{wÏk½E¸_m³'ÄŽ°áb$ÄÅqJSúE4à<³c†c¦¨Ùoø×ßùK“Âw†¢O˜õÊTÞš.N:§ mí×$¶ ’4Ô¬óøð‚/”\MgÆxÂçŠíY–¾w’ôé1äÏL¼¤:êÜYB’ÓZQçBˆÈ棟Öꈹ¿W±Gâ]Xj91£þ¬ûEþ#VWÆ[ökûÓOÐgõûAøSH6àf]#0†B½É©„ZÁxí:Ô~~þ_5bdf[ž^ÐÆRŠ“§Rsù2Ö~rƒÌÓÄjÚ6r²¥Ë¤äg\C½‰]Ý3²#- ±¼-Ûª—t&v­%àÒ‚Š4iÌëÔ2¥Ë°Éž³_0}·crÄiµÍr$KXPf4¦Ð²•¸§“’•¤‚ |üÒ|Ê\»tÆøjÑŽw°`«]¬K8î݇m΢ÇئP¶æ‚ÉØ•• (#7¢¥†Ò¥ ÀFƒR´r5‡qTÈ`îP•qŒ»»69o?j1ÔÔ©tÅSiÚ«hË«eHÖJ’A(â[—Qfä*mÖÕ‚®ŽâF¦jØšÚ¢’«Tp§4>¿8kÔˆòW§ÍàÐãçf.å2íÔTéÒHÈ‘¥_'ÉUW( @ P( @ P( JøË~Íziú+WÂkÛ7øÅIä&ª0ê7L-‡®—¿Š¢á›}©ö¦ÃÈuNyÔ9´ ß’ZXWš’’RÉ'0GD\ òyƒí¶Ìom³ØÙ…':¸"â§Ÿ¸$JLG÷–JÔ%Å…£JóAøCΠ…ºal=pä½üU ÛíOµ6x@»ªsΡ͠^üâÒ¼Ԕ’–I9€‚:k”O0}¶Ùí¶{0¤àgXC7\Tó÷‰IˆþòÉZƒD¸°´iC~h?yÔR¨P(0n¿?¶ÿB©Ú…˜_ïžÑ_øj­JÏ&ÃFPr¥ÊõçL~y!ÀÖ{3xW± ™ÐŸ·´é»©ÆuÕ¾µ¢¥màGGý+ÏE‰Nz¹ºMYfÐäßÚ/Ù°-Ÿ áöøÏ²ó ކ’ó ¼P?áIpü®¸UMTDË5E¦ÎUzÿw/Ú5ÿˆšÜ¤sA«ã-û5ýé§ëK´•ñ–ýšþôÓôgÚ¾ mþ„ÖgšK:Œ” @ P( @ P( @ P(s~>¯bĺ°ÔrcGýYö‹üF¬(¯Œ·ì×÷¦Ÿ Ïëöƒð¦íúb,˜7DBu•0¥¨yËaà uñGGMlk7gmOÜ_vÇT8*Vl1*Jd:„åЧ†ÂŽyñOùPbPuK9S·á«zðæ#míKeä#^ÏWÂJ“ÒRNg†g2x|߬ÿÿÃØpçeÚ£ÿgäóµùÄÇGæÆ¿Áq6ÌMãgÿ›ö:ÿ¬«`ÄܯaMÛ>Ž«ÈR,Æ,2Æ®•i f®9Œ†YôŸŸémßúcÀÙçü>5ž‘h‹þþkÿgƒbÿÚ±±ãm#¬ÞfߟºÝ àlk‡põŠÿ†ñFxƒ}1w;¢a8Ò˜RÔ¥2èP:ú25ø~Õ¬Þ_´I¹È~Ão“Õ›äÊ]m9 p!G<øè*øHÿ›ÿ#AjkK~2›lf¬Ò@ùò ÿåRu»LõEý$÷Ö2ÈË·0ó+qÇPPTÌÃ>`‡k‰±Ûç·ÜÛmµióuìóË#§?—*¶T¬>X®V§æO³ÚÑsؾ>-ŽêÞÖ–\go“*N‘¬ÿf8',¸ð–K<ŸÊ…ª Ûù?ÂKévï÷-NÜLµ.D}{6vhÙ´‚ë„$êQ$f£¥º‰éßÚù7¬cq‰„Ú‹ÛQo3 …¨¢:ã%Ô«@Ú+dü‘О/Ÿ ŠÅœmïÖ1íáUYUÚ@ P( @ P( ‚Ò¾2ß³_Þš~ŠÕðšöÍþ1Ry ¤’• ³>#1Q†ÛråTËÜ=mÃ+7E´»‹¶öK’öjÔ€­£‹Ki ÉZZJ`pá•A“‰9[Äš×2«e¦4‹ªã¹wŸ…‰52?F^Ôµ#§Î! @R€*ÌÐc\¹F•2Á7[pņÊÍÑm.âí½‡R佚µ +hâÒÚB²V–’˜8eA“‰yYÄ¢Õ6Ý.ÙjŒýÝl9wŸ•¦MÍLÑ—Š–P8ùÇf”jP VfƒIª ¯Áí¿ÐªG6¡fûÆ'´Wþ«R³É°Ñ†Ü÷*Øê_(¬ò«:ô_Ä­HfA—±CAji BACa)ÒP€’Œóé5œ”åËøÖi½Ó\¼rÏså³§HޏVø‘Ñ "½A”ä „ž‚¥/3ŸÌ>JÎaÅŠªÍ.Szÿw/Ú5ÿˆšé)ÐjøË~ÍziúÒí¥|e¿f¿½4ýö¯ƒ#Û¡5™æ’윣Øð|Û Ëç&V¬*í–Ý":_•û§8°—Rûr׳)RÁóšA„ŒÆyË”Õ @ PlœŸà×ñ¾%…gD¨,0ä–!R.q¡¯f·U²Û­!ÅäNIHQþ‚Ö6ÂrpmúE¥ù0B]sb¨·8ÓNÍ+)BÂÔ¾R­'ø žK0Ý¢öþ ºÞà5=‹ ÎnÒŒvd>¹ Çm.¸’†ÂŸ Q Oü 5ìy8Â(»;‰9‘…[Æk¢Î«’„Q1sD‘‘¬+wææ­¦zròó¨4nU0å¢Åp²O²BD(×ë373 ¹öã;µu—Û„¨­ØR’J”rPóM|–a»EíüAu½Àj{ AœÜ'¥ìÈ}rŽÚ]p)% …>¢ž ø@h7cÉÆEÙÜIÌŒ*Þ0{X…u\”"‰‹š ìŒa[¸w75m3Ó×—A£r©‡-+…’}’!F¿Y™¹˜mÈ/·Ý«¬¸†Ü%EhÖ”’T£’‡œzh+ä³ Ú/oâ ­îSذZ æá=(ÇfCëÌvÒëI(l)ð¥¤ðO“A»N0Š.ÎâNdaVñƒÚÄ(³ªä¡L\Ñddk Ýù¹«ižœ†¼¼ê •L9h±\,“ì‘ 5úÌÍÌÃnA}¸Îí]eÄ6á*+F¶¤’¥”<ãÓA_%˜nÑ{]opžÅ‚Ðg7 éF;2\†c¶—\ ICaO…(…'‚~š Øòq„Qvws# ·ŒÖ!EW%¢bæˆ;##XVîÍÍ[Lôä5åçPhܪaËEŠádŸd„ˆQ¯Öfnfr íÆwjë.!· QZ5°¥$•(ä¡çš,#&ßÂçK +ÄgK+1ÇÐÙÔ@Õ›6¼Æ|<ì¾pj«g¾Yì6.Xñ6‰‡ M…õ>¾Â訑[¤·µ}N!ZB—PIÈ•|†#•Ì7iÂØ±»}¢è‡mñ%<Ãn©èí¾ãAN%‡•™uœÏš½JŽJPˆiUD\߫أñ.¬5˜ÑÿV}¢ÿ« +ã-û5ýé§è3úÇý ü)¤_‹3ìÓ÷R9»@ P( @ P( Uð‘ÿ7þF‚ª@ P( §¿XÇ´?…T‘v@ P( @ P( @ ´¯Œ·ì×÷¦Ÿ¢µ… H J’¡ŸF`‚>êN£'œ¤ú£]±ðÖm)cœ¤ú£]±ðÒÒXç)>¨×l|4´–9ÊOª5Û -%Žr“êvÇÃKIcœ¤ú£]±ðÒÒXç)>¨×l|4´–9ÊOª5Û -%–Ÿô¢Øq¤6–Õ«ÍYQ'">aóš± e([:Ûí•4­@+ ð q5Fw=Éõ»sᦩcžäú‹]¹ðÓRÇ=Éõ»sᦥ–%ÜdMk`¨í´’¤©D8TND:Ê Y†¯Œ·ì×÷¦Ÿª»Ai_oÙ¯ïM?D…¤ä#.|£?ð&³<Ò[ÍÛ”ISì2°í· Xì‘®.´õÁvæJæ)²JöŽ,!!D«Ca Ï.Q–§T( A~ß>]®|kœvRa¼‡Ù^­.!AI9ÁÈÀŒ¨)—*DéoN”æ·ä8§\V@jZŽdä8'ä –ÂX¶~Ÿ&\8±&1:#fØ…)‰QבSkÒ¤¨ IJJ’ R#* ±ÊÎ ò…ËÒ­¶¥DrÖ,Š´W¹sx(ùíB’«^½cV¬øÔx·\1…É«„èñb·3P¢Dˆ‚†"Çld†ÐT¬†dæ¥I$’MQîųð|ù2áʼn1‰Ñƒ6Ä)LJ޼Л^•%@jJT T•APMŽVq”.^•mµ*#–±dU ²½Ë›ÀGÈ/h½ZõëµgÆ ƒÅ¸²áŒ.M\'G‹¸±š…$D1;c$6€¢¥d3'5(’I$’jp–-ŸƒçÉ—,IŒNˆä°æ!JbTuäTÚô©*RR R¤¨‚Ê‚lr³ˆ<¡rô«m©Qµ‹"­•î\ÞÊ>A{@¤…êׯXÕ«>5-Å— arjá:L¸qbLbtG ͇1 S£¯"¦×¥IP’••%@¤FTc•œAå —¥[mJˆå¬Yh,¯ræðQò Ú…$/V½zÆ­Yñ¨ ñn,¸c “W ÑâÅn,f¡D‰ EŽØÉ  (©Y ÉÍJ$’I$š£^°ÝØ»?dƒvδƚ§’ÑWÈ£±qµð9’²áă`¼òŽÝ÷ÏÅ÷ †–åÔ¸äèze˜ï¼ã¥Å½šŸ.¶²£ÿ«q ÈdçN-Å· a><ɱbDjVàɲ†cGFz[@QRˆÍJ$©D’¢I4•D\߫أñ.¬5˜ÑÿV}¢ÿ« +ã-û5ýé§è3úÇý ü)¤f’R\p:®úX{»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾–¥†Ò ¿<”ñ­Gï4°¹@ P( @ P( @ PP¶á V¬Ó˜(ŽŸòÿ*XS»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úXz†[BµDå–jY,·[/—ûu¶3“#¡MÌL£½%N¥*i;K)QñQ@ãð…Œy`´áÌG2ßfÄ6ë¬t¾è’dK2l•êñ*’u±ç1Mò|h±X•2g±·ŽÛË•³iVÑ-¡å¯IJ¸¤y§,ŒFüpæEÉìf›]ˆIò ›èeP³·¢j禕»h#f;}žÏ,Ô<ÏðÐsþWí¶È³ðåÞÝeßlî2Û‚ÎÆ9jóEÆÛÉ;4­,¥Í!)_:(*ä†ÝlyÌS|Ÿ‡¬V%L†™ìmã¶òåGclãZU´KhykÒR®)iË"ñØe'±šmv!'È6o¡•BÎÞ‰«ž˜fVí ˜líö{<³Pó?ÃAÏù_¶Û"Ï×{tHQ—}°G¸Ën ;åý«Ío$ìÒ´²—4„¤ |è «’u±ç1Mò|h±X•2g±·ŽÛË•³iVÑ-¡å¯IJ¸¤y§,ˆoÇa”\žÆiµØ„Ÿ Ù¾†U ;z&®za™[¶‚6a³·ÙìòÍCÌÿ ?å~Ûl‹?]íÑ!F]öÁã-¸,ìc—ö¯4\m¼“³JÒÊ\Ò5𢂮HmÖÇœÅ7Éñ HzÅbTÈižÆÞ;o.Tv6Î5¥[D¶‡–½%*â‘æœ²!¿9†Qr{¦×b|ƒfúT,íèš¹é†enÚÙ†Îßg³Ë53ü4ÿ•ûm²,ü9w·D…wÛ{Œ¶à³±Ž_Ú¼Ñq¶òNÍ+K)sHJ@×ÀŠ oÝ´âH#Æ€ù[ÈeMÍ€ÄÆŠT m¼…£<ºYŠªÛ1C· ?Ëv,³`Û-¡n?ˆ§[!B~Ïc)Z’Ûm²ûkB:R€àH¨ŒYnÉxödD[clYÛjÖ§­ðYˆÔ·™N—¤lÙBQç»´P!#ÍÒ>J "¨‹›ñõ{~%Õ†£“?êÏ´_â5aE|e¿f¿½4ýXÿ´…4m†R¶Z–é*@$íUÓ—ùÔˆUÍÝ¿IÞÕ]õl†îߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°níúNöªï¥ƒwoÒwµW},»~“½ª»é`ÝÛôíUßKîߤïj®úX7vý'{UwÒÁ»·é;Ú«¾– Ý¿IÞÕ]ô°¥( ÈJR¥ä¤(VOAOÎOÑ~¨´¯Œ·ì×÷¦Ÿ£>Õðd{oô&³<Ò[¥ë”¬iˆ-Çv¼%è®lvå1Ymé;!“{w€ãÚGFÑJÊ£-f¨P( ‚¸ò$DÔ¨¯¸Ëì­.6ãj)ZaI#ˆ ñPxóÎÈuo¾êÜuÅ­kQ*R‰Ì’OI&‚Gâ[Þ¸ó­†` ´¶©¤:Û­,d¶ÜmÀ¤8‚:R Aù¨$‡)ÐbEbÎyÎâ¸ûš‰ŒÉ`ÇÑ£`X)Ùl´€6z4d:*ÌCˆïXªæ«½únó%HC@†ÒÚÚ„!B@% ò £Ü;‰oxRãζ‚<‚ÒØ^¦ën´±’Ûq·âéJæ ’¤cA‰‹9ç;Šãîj&3%ƒF`§e²ÒÙèÑè¨#1#½b«š®÷é»Ì•! KhChHJ„ ! ”€È*pî%½áK:Øfò KazšC­ºÒÆKmÆÜ Cˆ#¥*š‚Hr‘$V,çœî+¹¨˜Ì– }6‚–ËHg£FC¢ ŒÄ8ŽõŠ®j»ß¦ï2T„4m-¡ ¡!(B€„$R ª=ø–÷….<ëa˜#È--…êi¶ëK-·p) Ž”¨~j !ÊF4‘X³žs¸®>æ¢c2X1ôhØ v[- žŠ‚3â;Ö*¹ªï~›¼ÉRÐ!´¶„6„„¡BB H|‚¨¦Ã}Ÿ†îm]툆©,g£{‚ĶÁ#§fò‚GÈJsˆÈÐLLå/NÆ,ã÷fÂjüÊËÉ—Ù>n•)EÕ!¶Ò…¸Tµ¢’WžG>(5rI$’IшՅñ–ýšþôÓôýcþÐ~Ò/Å™öiû©‰] ŸÂ˜SÊxø‚Fÿ»sÛ®[-{m´ÞϤiÏkž®?£Ë´òp¾á‹}îÒþÞuÏ#Æ¥)ÖêÛJ­¢”ÍK È€I4¸’‡Èž=rïe¶\mÑà·y¹7j::ÓB¿õOésô.é !§4¬é j^êerM‰#Ünv–æn“"Ý Û• ñ Æ’VêB°TáGX6zH_HÉuUþÃ9OCÎX#4ÑZ™qçn°ÐÜw†Y²úÔèKùÃ&Ü)YùÈÒð—aZù$å ñ2}¾&R$Ûft†åIf1ÞÆyÇoj´í]áú´jWG"­ánƒ‘†¯‘lƒI€¦ Î[v‹ZB„–Е­²Œõ‚´ñ#.9g˜"‚2@ Pm÷ 'qâ1<9o¿pn¶è하Ám8âKŽç§^MœÐÈ(fAÍ!q17’H1`J‚Î-/bˆVïò­[K Œ¦PùB$ë:C.©%°ž dŒŒºy#†Å¦C(ÅšñD;x†EŸq!¤Ä[H{H‘¯‹Éaĺ¤lÂ@Ô52¥Âo$bÀ•œZ^Å,­ßåZ·–L¡ò„IÖu:†\ RKa<ÉÂO$pØ´Èe³^(‡coȳî$4˜‹ii5ñy,8—T˜H†¢FT¸®_$ca×f Xâ¯Qðô|Lì3m)‰º=³)Jem8º‰;0@ (¨eK—sZªP(ãxÀÁV\S‰ñ•æ$«ò%.4H6&¥6‹¥¿=ÕÊlŒÈÏ‚@ü´Þ9+˜åÞÝk‹iÝãÛ.Òq¹EŠ”¹&:RR·”ÚrÔ²œÊ²Ë§¦¥Æ%¿‘¾QîF@g%Òàõ¥ã.lx¡Z*c7\HÚdât§¥\têÒ¬­à»'%Øâ\9³¡¨Ûä?á>txnÙºÒòÒ§ŒÆ¤ (ŒÆ}4¼P¾M1²0ÑŪ²ånÓ,ÿygn#•‡Ì}{`ÑQ8Q£ˆãK‹ò-ˆ/Qܽ_à;Òl7;Ë*jcAKÞu—Á%Ô²·Bu”¨+  H5.—h׬?wÃÎÄfñ0¹Ðظ06ˆ^¶@[kóIË4r9òUQô æ Ãqñf"‹e™~‡gaå ¤¹ ¨$fHB|çI)$ñ)¨$NÁäÚ±&.·^1¡Z0jžß§· lë‰L¤Æ@mikZÓÀ¬3%\8®ŒÑÉ$Fî’dJÅa^=‘¼CÎè‚Têâ8êXBS¬~˜¾­‘AsH)QÔR32â¥rG=Âdɸ¸£ E²1MÕ«y[ïFyä°Ú¬~—l¢…$¸ ukŠG$‘ºI‘+„axöFñ;¢ S«ˆã©a Lr±úbú¶EÍ ¥GQHÌ®+o’fù)âÅ<ÆN'näͼ¹!øEÄ·’#ҥũ%À”ìÖu3+—k8óµƒoàźó„IÐc\b¼¸å‡K/ -!ƉVÍy#R†YH Õ‰ºµÊƒyÃ8 OÁžXâÌg>ÌÓ—cie¬âbu’áqÅmÛ)NJËÍJÏŠLo|‹ã»$«â…ÈV ò­²gªk,Ç/0¥%*uI%JKˆ(FZ—™ ¥@K—G^ù/Ç8vÊo÷{f"Eð™L¸ôPèͽ»(YqYŒ¶‰NyòÕ¹vEÏ’PìÖiwû-C·Æj\Ò&Ç[‘qhC{f’²ãJRFHZBˆ$’TBð]ìþH1õ¦ìÕŠílƒ{ªy; Wxl©¯„·5:6h=)ZòJÇ• —‚ïXäw”GæÜ`¦ÄÓj´ÛëÏ\#5”ÈB–Ã…õ¸-­)%.Ò3ÍIÞ—ÎGùFÃvé×;Þ1Z¶de ËaO²ÙXm.–R²æÉJ)Ý:c%Å.]®â ?vÂשxzýF¸Ase!¢Ь³ËR Iéù   P(6û†“ˆ¸ñž·ß¸7 ÛtvÊÌ`¶œq%ÇsÓ¯&Îhä3 渘›É$°%Ag—±D +wùV­À¥„ÆS(|¡uN¡—Ô’ØO²FF] <‘ÃbÓ!”bÍx¢¼C"ϸÒb-¤=¤H×Åä°â]R6a j‰Rá7’H1`J‚Î-/bˆVïò­[K Œ¦PùB$ë:C.©%°ž dŒŠá'’8lZd2ŒY¯C±·ˆdY÷LE´‡´‰ø¼–KªFÌ$ CQ#*\W/’1°ë³,qW¨øz>&v¶”ÄÝÙ”¥2¶œ]Ä‚˜N PT2¥Ë¹­U(-+ã-û5ýé§è»Ai_oÙ¯ïM?F}«àÈößèMfy¤³¨É@ P( @ P( @ P( A7ãêö(üK« G&4ÕŸh¿ÄjŠøË~Íziú þ±ÿh? iâÌû4ýÔŽD®Ðn™ßì¶y÷›n!–ä88†Í"Ò¹ˆh»º©jCˆqHT¶’$ ë\pÍžóÉÞ°b6¯ïœqï2lhÏ3¼ÖÃM´²â•æ­J% 4ŸRQ}³òy2y…ŠWvéŒm·‡˜jÍ. ho¼âƒ¥Ä„©õB@l­ %G_)ÌS†1vÂ8Šì£Œ£O‰3Ø/lÉb¤ƒ‰2|”­  ¤%Äf29“æêÊ–mÓÚeò{ˆlh¹)sn¹‹«M/ô‘ÒĤ©ÂHÈyΠdN¯;£ÉmUÔîܯáKÔ‹¬[.,ö—cbiw˜sïxgœ”ËíGNmêŽëŒº…GôRœÕšEK%œ;¹¢N&LËÝÂï%R"¦ š iY,I  ­K0NŸ˜ŠÒ ( ÚÕöÔžI¤á•JÊäæ"bzXЮ,&3¨+Õ–Ÿ„¤Œ³ÏEñmåC™0ö®Xâßz¹\,*±Dͳ—§)—5l¡n6ÛZ‚Kާ=¥µG²ñ®Rî\¡·ˆõ^nxI8˜Ä7ƒ­ËTAuÒéNËc³JÜ,¯5”Œ³¥¿–ÞT9“OjåŽ-÷«•«HlÛ9qšq²™sVÊãmµ¨!´¸êsÑÐ)mG²ñ®Rî\¡·ˆõ^nxI8˜Ä7ƒ­ËTAuÒéNËc³JÜ,¯5”Œ³¥¿tþP°{ØE8Á—pâ°ûQ¡á>nxIvKCûÉ|£g’\t¬:J’¢dÃ…ÕR@ ìöÜj¥òO‡°Í–Öð«°¸7sµ¯œ‘½m_R‘ñvÒ³AËÎPéÈÔ¶¨Ïgri6^ç{{Ük5‚S/V'.,¥¸ðËrØi•6´m¶¡¼”´è!'%§<ÊÒ%±ôÌ Ê&¹^UÑc¶OdzåÄ•&ÞúÐã[”@¡³e R\ ¤$ùÀ©<3‘ Œ—Ê.ÅלOuÅx‚Üî¸ÜçMbÃ6Û!Ë’ ÐÛñd6 :½ •…:”Ÿ9+RÖø—•87|.'X1fµ¾îc™j{ !W%–â¢3ˆnjc«6–Ô žJ’œ¼ÑVÅžÄÆ\žÈ»¹$ã3Lœö6mÆBœjblê„€V²Ø­HJ * X HJ G½B´Av"l÷¾sCÐØ}õnËg`ú Œd¯…¡Y§XଳU@ PHaÉqàb\énlØ5‡]VDéBV 9'€ù(7ˆXµ?íW^¬¸Ò×f·^eÎQ“t¶¹2$¸ÎHÚ%·#ìÔ’TÛÈ‚t Dl×¾Sð¾/»^p½Æþ¸Ö‰˜b&‰zzmøÒ‘(<¨ì$–™[Ô%I(B‘æù¤RÅ‘Îch â{E£ cËe¾×eÃH±=rºÚœ“â6ËêU°éR ®FÿõiQÒrÉa#{å? âûµç Üoëh™†"aø—§ Ð)ƒÊŽÂIi•¸BP„’„)ošE,Yí»`ëuú<+>,$Xp£v;&%v Êe©fJžîÈ%N¥*KòB‹e@«H'4¬4~W±›bv.–Û’.“U”]îÆTvîV·ÐÚ‚JAIm$”¤©HR´Uaa¤P(' rš¬!ÉjlÖG­†öqçh™hbaeÙ K­©öÖ„+ZHÍ$+‡ùT²0n8Ù«&ñ-Óî®Í½«M½Mmðµ’äxé­diQRÐèI Ùœ†òƒµšÌ·7…­!¥lKhÙ©yêéË*XJÞfa+ý·–lw‡±yžq-½«·6äµâŠmå­!IR´§fV B‰)è.‚*N1äòùÊÎ<ij®vµ‹˜ZðýÆñmz\&ÝÛ7ç;6¥œÙ%:›PŒÓÐBÓa_)\¤`ûöÄÛ5å·ß› Gm,ÛL6ÞT6d"AKHHm¤…-²Àd¡–y‘>õ°¼ìQnMÝË‘îø6¦Ë.þ–SlÁJ›È§4äXs‰É>oÄf°æX‚¦Ýz—Ã{ç‹{.i;vT}ºrø[5ùÉÿ#UQô ÚÕöÔžI¤á•JÊäæ"bzXЮ,&3¨+Õ–Ÿ„¤Œ³ÏEñmåC™0ö®Xâßz¹\,*±Dͳ—§)—5l¡n6ÛZ‚Kާ=¥µG²ñ®Rî\¡·ˆõ^nxI8˜Ä7ƒ­ËTAuÒéNËc³JÜ,¯5”Œ³¥¿–ÞT9“OjåŽ-÷«•«HlÛ9qšq²™sVÊãmµ¨!´¸êsÑÐ)mG²ñ®Rî\¡·ˆõ^nxI8˜Ä7ƒ­ËTAuÒéNËc³JÜ,¯5”Œ³¥¿tþP°{ØE8Á—pâ°ûQ¡á>nxIvKCûÉ|£g’\t¬:J’¢dÃ…ÕR‚Ò¾2ß³_Þš~‹´•ñ–ýšþôÓôHZT¤‡Ô’AféBk3Í%ÙñV9Æã‘È6¼WŒo—yXÆnþ¸\^·ÅRÙ qGNÕòáÌ|‘ÓóÔeÉj…@ P(6ÎKàa[–4´ÅÅS§2˓⥦£Û[˜‰ .¤Ý y°”À‘¯§àš ~P¡ax¦||-pŸ&:d¼L«spÃ+(hm(yФ–Déÿ”Q[/"J_Å×x<ÍÒÛ‡]‘øíŒw˜èyæRHý"#­â2RHâsf":B””^¤b¤È”ŒN98fæ©©Œù/™©mrÂ5ï‰g¯>%Z¿ÅAÍyoÉ릹ÉSŽ\î8n$«“¯6y狎¥ºNN-„°£Ä’Užg<ÈUÈ’„WñuÞ#Ï3t¶á×d@~;AÇãæ:y”’?HˆëxŒ”’8œÆY€é RQz‘Š“"R18äᛚ¦¦2wä¾f¥µËÔ?¼n$9ž¼ø•jÿ5å¿'®˜fç%N9s¸á¸’®N¼Ømçž.:”:êA98¶ÂIVyœó!W"J_Å×x<ÍÒÛ‡]‘øíŒw˜èyæRHý"#­â2RHâsf¤)IEêF*L‰HÄ㓆njš˜Éß’ùš–×,#Pþñ¸æzóâU«üT×–üžºa›œ•8åÎã†âJ¹:óa·žx¸êPë©äâØK Ø! š¤LYW7¨Þ°×ÓooQ½a¯¦)xv‹ûÖ´+å¦àÓ­Ò—ß1[7[PR’³%r ž—‚ËnH—!ÙR%´·^ZœZµ$f¢s'!æ—ozë }1KÀoQ½a¯¦)x ê7¬5ôÅ/½Fõ†¾˜¥à7¨Þ°×Ó¼õÖúb—€Þ£zÃ_LRðÔoXkéŠ^zë }1KÀoQ½a¯¦)x ê7¬5ôÅ/½Fõ†¾˜¥à7¨Þ°×Ó¼õÖúb—€Þ£zÃ_LRðÔoXkéŠ^zë }1KÀoQ½a¯¦)x ê7¬5ôÅ/½Fõ†¾˜¥àg¯ÌrÂÎ]Í£lbc“Ûc$y¯¸„!kÕ–£š[@Ë<¸p“RðY½Fõ†¾˜«x ê7¬5ôÅ/½Fõ†¾˜¥à7¨Þ°×Ó¼õÖúb—€Þ£zÃ_LRðÔoXkéŠ^zë }1KÀoQ½a¯¦)x ê7¬5ôÅ/½Fõ†¾˜¥à7¨Þ°×Ó¼õÖúb—€Þ£zÃ_LRðÔoXkéŠ^zë }1KÀoQ½a¯¦)x ê7¬5ôÅ/½Fõ†¾˜¥à7¨Þ°×Ó¼ ªùÊÆ+ÄVuØ.W¸" «mÇÛ‹,UIR3Ð^[-¥O™#YW=54,Õw¨Þ°×Óo½Fõ†¾˜¥à7¨Þ°×Ó¼õÖúb—€Þ£zÃ_LRðÔoXkéŠ^zë }1KÀoQ½a¯¦)x ê7¬5ôÅ/½Fõ†¾˜¥à7¨Þ°×Ó¼õÖúb—€Þ£zÃ_LRðÔoXkéŠ^zë }1KÀ¤:Ó’Q³q+ɵç¤ç—Ôýê‹JøË~Íziú3í_G¶ÿBk3Í%-2ãp¸ì9Ât‰;³)ŒÆÙÕ/dÒ~ iÌù©œ€à3£,z@ P( «]ÖédžÍÒËr•ls©©1^SN¶rË4­$ÀžƒA’œO‰Q|ò†æ›Î½§8‰n :òËV×=yåÃ<è1nW+âs×;½ÂLé’­é]S®¸¯JQ$Ÿó4Úî·K$ön–[”¨cMIŠòšu³–Y¥i Žô ”â|J‹ç”èÄ74Þuí9ÄKpI×–Z¶¹ëÏ.çA‹r¹\ož¹ÝîgL­oH’êuÅ|êR‰$ÿ™ ö×uºY'³t²Ü¥@›êjLW”Ó­œ²Í+Ip' Ðd§âT_<§F!¹¦ó¯iÎ"[‚N¼²ÕµÏ^ypÏ: [•ÊãxœõÎïp“:d…kzD—Të®+çR”I'üͶ»­ÒÉ=›¥–å*ØçSRb¼¦lå–iZH#=ƒ%8Ÿ¢ùå:1 Í7{NqÜuå–­®zóˆyÐbÜ®WÄç®w{„™Ó$+[Ò$º§]q_:”¢I?æh.Ùo·Ì7pEÛÞgZç6”I…!l:FD ‚3#ƃ>V=Ç3olbi˜Òúýâ+{&.Ü^T–‘ÇÍK¥Z’<åp/8üõLéó®s¸\¦?.T…ºûîqG¤©JÌ“üMQb‚.oÇÕìQø—VŽLhÿ«>шՅñ–ýšþôÓôýcþÐ~ÒÚ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(•ñ–ýšþôÓôgÚ¾ mþ„ÖgšKb¸áLSh¶Æ½]°ÕÖ¾n[´¹Üm—ó P W< EÐ( @ Pe[-WKÜö­vkl©ód-FŠÊuÖy% žô ”áŒJ»ç“Ã×5^uìù¸DpÉ×–zvYkÏ.9eÑA‰q¶Ülóž¶]íò`ÌŽ­G’Òšuµ|ÊJ€ ÿ˜ ªÙjº^çµk³[eO› éj4VT뮳É(H$ð Pd§ bUß<˜F¹ªó¯gÍÂ#†N¼³Ó²Ë^yqË.Š K¶ãgœõ²ïo“duhz<–”Ó­«æRTüÅVËUÒ÷=«]šÛ*|ÙKQ¢²§]påžIBA'€=ƒ%8c®ùäÂ0õÍW{>n2uåž–ZóËŽYtPb\m·<ç­—{|˜3#«CÑä´¦m_2’ ?æ(*¶Z®—¹íZìÖÙSæÈ:Z•:ë‡,òJ <è)ÕwÏ&‡®j¼ëÙópˆá“¯,ôì²×ž\rË¢ƒãm¸Ùç=l»ÛäÁ™Z%¥4ëjù”•Aÿ1ArÑe¼_ç"×b´Ì¹Lw=â0§V]9% “î ¾ÖÄÏÞÕ†˜Ã—G.éQB­è†á’d€Õž_&T— uÂÓ5ëmÖ ˆRã«C±ä4¦Üm_2’ ?çAA7ãêö(üK« G&4ÕŸh¿ÄjŠøË~Íziú þ±ÿh? ií@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( JøË~Íziú2 Jb:žmõ-Ýš”2Ò‘Ÿ~cYži1wq啞Oq¯D²Ý§›Õø;-øïª5ß` ’c0[ã´Å/ÍIH(ÏI‰iqnt‡é;دº©i9Ò¤ïb¾ê“!úNö+î¡i9Ò¤ïb¾ê“!úNö+î¡i9Ò¤ïb¾ê“!úNö+î¡im›â¬ dÅ–ëž.…v‘4Èï!Èo˜û—R¢µƒÒâ@:Iù JÎ<ĸ&íˆæOÂp.Ñb¼û®,Í‘¼—T§u£Lv´$‚<ÒGÏE´¥94Æø_DÅÆï.S/Ül& 2Ë.¥Ç©QË­%aµÔ¶òu¨isÏ#ÒÝWÊß'ªŠóüé8Ìs3d+ ¾T‘pI\}¶Ç ½Èlöºtp# é¡ii<§c|3‰NzÓ2KîÂÃÑàÎS¬ºV—›yí(Rʬ¥’Êu‘Óâ…¥ï&˜ß áȘ¸ÝåÊeû„Á†YeÔ¸â•*9u¤¬6 Ú–Â^Nµ #2yäE¥º¯•¾OUçùÒq˜æfÈV|>©"à’¸ûmŽA{ÙítèàGAÓBÒÒyNÆøgœ.õ¦d—Ý…‡£Áœ§Yt­/6óÚP¥”'YK%”ê#§‡E KÞM1¾Ñ1q»Ë”Ë÷ ƒ ²Ë©qÅ*TrëIXmAµ-„¼jFdóÈ‹Ku_+|žª+Ïó¤ã1Ìͬ2ø}REÁ%qöÛ‚÷!³ÚéÑÀŽƒ¦…¥¤òðÎ%8]ëLÉ/» Gƒ9N²éZ^mç´¡K(N²–K)ÔGOŠ—¼šc|/‡"bãw—)—î6e—RãŠT¨åÖ’°Úƒj[ y:Ô4ŒÈ9ç‘–ê¾Vù=TWŸçIÆc˜›!Xeðú¤‹‚Jãí¶9îCgµÓ£M KIå;áœJp»Ö™’_vreÒ´¼ÛÏiB–Pe,–S¨ Žž--rÁv„»Š ½ˆž³D›”y’¶„³¨(…!´•,f”9q ttŠZ[.+åFÇŬÍKW®b‰of 4ú£Ì™ „%).»³Zu¨¤(‚•$p= Ô-*yWÆØg_m×?2Cš³ÂˆÛ.Ç{odÞ‹®)#l±§=¢@I å¤ KJçH~“½Šûª––ï"Dµ:Ö­;4'5 §ˆ*ùÇña¨Ñf?êÏ´_â5`ñ–ýšþôÓôýcþÐ~ÒÚ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(œK»T8ÚRrJ’B•—N_ÀüÔ Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓPÕ'©k´>j¤õ-v‡ÃMCTž¥®Ðøi¨j“ÔµÚ 5 Rz–»CᦡªOR×h|4Ô5IêZ톚†©=K]¡ðÓQë(RÉyfT¥Žc‰'ÿ:@ñ_oÙ¯ïM?E‚ô–Þy,ÁuäêRAÈ#‡Y™´«Ýæì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf47™ÿ²d}wS1¡¼Ïý“#諺™ æì™E]ÔÌho3ÿdÈú*î¦cCyŸû&GÑWu3ÌÿÙ2>Š»©˜ÐÞgþÉ‘ôUÝLƆó?öL¢®êf4vC’S·ˆã6¬µƒÇŠ~p*ÄÞFùÈö¶c wmÃW—%7|í›êŠ´¥Ð'IRTáòƒRY—Cļ‘aÌ'‚.X¢|Û”©ïQD&›y¶Ñ*Ìùx2þe !nnîdzéVuDcË&¸já†iÄȉs ï<½wŽó‡Ó©M5”T´ŒòZ³Ñ1—%ÖL›}ºV&isñé™i”·4DM@줾°·OBFZjÕž¡j¸ƒâ|57…½.Ûœ^Í«Œ7‘*ŠË0ûEHÕÏNz¾p*ˆhRÝ1‰Ì!•9Ôº„¼Êl©$ÚÁBÓÊT#Poœ§Y]¼r•o´Ø-™z¶XKQ`Æj3NJ“oŒ¥im°” ­Ç È3Q¨"ñ&× FnñŽí wjzL+ÙÅ—–{7ê (…ŒÐBU’ŽF‚·ù/¼8-K÷{N"EÞâ›CJ¶¸îMÍVZYXy¶È'Va@ŽJáA7‰ð]» rN%µu°Þe+¦u·RÊc¦Jœm È+#ÀóI4ΨèØSYàOäíûÂýÃ^ØyP SØ$!¤• §5—¸–„P" 8¯’˳Wt¯Í´Ý‘s¿;ej=µÅça_™ahJs!C% ©#’¸PxžForn6Ø6ŒG‡îÜ.œÌ©Qd:Y‹3-[7JÛJ² (… )J²'*Ó‘|K 4»­žö«”˜£3nuÒâÌÔ­Q•“£ ²Ó‰È@§Î’—“ù˜vÖo,_ìטmLæùNÛ^qb,’•)-¯h„g¨!e*F¤ ÉG* nøbße”Ù"ñ~qéHd¨l™·¥[6ÜRtêÔ·ö\~ `äu ‚ö2“lr0ì%ß,78×Kjd[æÛÚTv”ʤ¾Þn©æYYXq·3[€!#V åòewÙÚÞÃ÷{V"níqM¡¥[wÌš¬´² ómœÕ«‚€(9•‚Ö)äöv¶ ËWÛ=æ fªÜûö×\ZcÊJul—´B ̤…!ZU’ŽT-à&µa(‰’´b _4ˆÍ:°–†§ ¸°UšÝñlŽ¡Gù{0=§"º{M€6—Zä”’Ì£ÍË2AèáTSŒ°jðlÕ[žÄV{œ†^r4–à¸éTg›9) ¶‚xô)!I9”j ìqÉØ×`]±~“tam‡-З%Ç’•¤((¬²"3NÓPÏàôÐc]ðž˄,7)²EâüãÒÉPÙ3oJ¶m¸¤éÕ©n%ì¸üÁÈêìe…&ØäaØK¾Xnq®–ÔÈ·Í·´¨í)•I}¼ÝS̲²°ãnf·:BF­ ËäÊï³µ½‡îö¬DÝÚâ›CJ¶8ï™5YieAæÛ9«WPr9+…¬SÉìì3l–¯¶{ÌÍU¹÷í®¸´Ç””êÙ/h„˜ !I B´«%¨$-Ü› œ%lf`gbùN.3rш![6Üs$•·öG %°r:zãȦ&ŒÍ½ÛUÚÍ{UÎU¾,f­îºV£5+1–C­£$¬´âxI)ó€$†ÂδXð••n\0õùÇñ³—)ÀHê.¶…æAà ž`ªƒWåWʸŠç2Z!Û››u˜`[(|D,!àØN–Ú9dŒÈ$ Ò’ž4í»“asƒ„­ŒÌ â,_)ÅÆnCš#±+fÛŽd’ Vâ^Èô¶GP /\yÄÑ™·»j»Y¯j¹Ê·ÅŒÕ½×JÔf¥f2Èu´d•–œO©%>p¤ØYÀ¶‹²­Ë†¿8þ6b²à…8CiEÖТœÈ<B³ÌPjüªà™XW\æKD;ssn³ `ˆå„< ÒÛG,‘™šRSÆ0¦`Öba¼4æ§×ˆ14‡ZRÚ!k 4¥3Ôã¡Ü‰  Ž @XÅ8Ü-uE™x–Ép’$®„Å}Ĉ¯¡A*K»d7ü1š8;…¬^Hî·9VvlXšÁubñpæ¤ËŒóá˜Ò´…hwhÒT3Nd))RNG"r É—ÈýlTLE`¸"ë2Ý•Æyü'˜Î¬-¤…lÜZJ8¤f’B?`+¾m¬DÍâÃxnßsÜd˜™Én,Ôf°Ë;ØC€„+,‚ÛPB†g"(3ùN²½yå*ßhÃöx­Ì¼Û,E¨bµ·%I·ÆR´¶ØJVã„ðf£AwäÎéne‰ÛåšøÓ·Z]µõ©1æ,†–\BÔ¼–H:’¸P`ã,¼5V籞ç!—œ%¸.:UæÎJBí ž= HRNG% 6° OZðŒ4É[x‡N"3N¬%†a©ÀÃ.8Jó[¡Ó˜èC`äu ‚Æ,äÞå…-ëºÝží<õZå®Üó‹Ý%„•l—­Ï0•¤jAЬ•‚æ3äÙXR­—œi‡]¹´ãhv UJuÆ´…­†Ì%:õŒþ|(2n<^¥ã 9ƒcÞì½ÃŒ«|Ø8Äe²áPBœÔËnp9©H*èÌš ·NEñ,(ÐdZî¶{Ú®R`FŒÍ¹×K‹3RµFVN6Œ‚ËN'"uŸ8RHGÝù3º[™bE¶ùf¾4íŇWm}jLy‹¡¥—€u¯%§R…d®8˯ÍU¹ìEg¹Èeç#In Ž•Fy³’°ëh'B’“‘ÉFƒ a¹¸¿۰ŵèìʹ¾˜í9!E-¥Jè* ý Q°â^JnxfÌÕýÜGcŸ ÅÃpÜ}E¶¥6âØyI[I!* º2ø`£ŠFi& \]…dÙ¯VkTüCa~4è1žq…Ö£Î)A.8 t‘‘*Ql¬òðE¬YÉÞ Á1‘ˆÕ3²$¸ÌhÁÒ§d4þÔÞCI`ž ^¯<ç¤ kB@ P( @ P( @ P( @ P( @ P( ë—Æcû7>ôR9µ ƒ“Qä^+‹Šwó›¥ív]žÓô@e«#—OÌi$¦àã·Æ¸a[ãSnLO“lp:©¥+b<0ø 7©+ >BOB4üg•FS8—” ˆ.Ønà0Ø1aÑdß›u#0œ‚Q ?âPÏ1˜'ˆ {¯+3ñ,lñm–%æt{¢®^}E-Gmc'b–Ó–¦ ” )!',ˆ ƒÄëâXÈ·\. jÜÒö[¡²ˆ°ÛVY F¬ŽZˆÕó“T@Po9JeËÖÆ6ë#Ñq.ô®R¦"É›m¶NÃf…iiŽÑ@är:ƒ1ÞT¬¾>ÀÍÄþÎ"™|Ýñßk0†V,„©Á¤…(ë9¨ä(&¯_Úé1›:m°ï ~ɈÄ_½_qRVÚHسm(k22 †`ç˜!a«â|w‡.xHa 3ƒž³Ç7e]Öã×=éejh¶[¢FH-=$qÌ«<Àj¶XÖé·xQ.÷!o‚ô†Û“,¶§6 µéH*VC3œªžíÛ“Ê|\qÞw Tø«·@.hÙʤÕ‘ÈìÛH'#Ä“‘Π»nåNu ;l¶¡¹‘±KX¡‡–ÆÁÒÑFCPÌŒÎc£,¸Õ±9^³Xå[¼—ÁNAƒö›ô¸ï\öê}ô¡HB½’vm¥.9)Z¼î*9 ‚Ä.Yî¨Öþj³¡™–Ç,0úßÖ¥¸?¤©Faeþ#>9qÏ€]Å<§#”w­¶ÍëÁµ½qnD×îøŠUÙ˜©â’¦YÐ2 JÔFaÇ8dÄæÎ3¾ùs—ni¸°Þq¨6Æy "4FÀj;jZÈBBP”êQ g©DŽ&ƒeÅ×Èxb÷Éîƒi½ÈÂ6˜é¹ ˈãÉŸ&NĸÙRN‡P¤‘ÄŒøQRWïís¸G´7n‰ySöL@Æ ‰"ó|]ÅHq°re)Ù¶”µ™% | êÌDüc…±h˜6Ýh^±Ü/mÜ–¹ÊmYÁ@CI!¶Ðã¤#JÔuqQáEGbxäîQ-ƒí’ãªÓ|RÄhÚS£—̆Ð]'3òÑ8£”Œ;x²®ÇeÁ[Ø~ûÏÒ7‹¢¤—P¤©œÒÛe-ùÜ2:€Ï5(ä@ccžQcâë%¶Ç×pB-ïºþótº„Ÿ=(NÅ· h(dhÌ#ÎâI΃ ÿ~·òÊ—Ë»‚Çí1­åÂU#tkÍJ׿§Ròœ‚s=P[Æwß.q£òíÍ7Î5ØÃÏ!¤FˆØ GmKYHJJ$ õ(‘ÄÐl¸ºù ^ù=Ðm7¹FÓ3£·!¹qy3äÉØ—*C‰Ðê´’8‘Ÿ *Jýý îwö†íÑ/*~ɈÄ$^o‹¸©6L¥;6Ò–³ „¤”Y‚‚ŸŒp¶ Û­ ÂÖ;…í»ÖSò×9M«"Ø(i$6Út„iZŽ®*<(«RyImª1bZÊà[$´›tîœ6aYˆm)ÌåÄæ~Z#:-í [®Ê†¥Û±¼ÃÎ?­%vàþZ‘¤f/ñð Ë3Ÿµ;”Ì8ݪßfÃ8!ëdxwô_Ö^ºï qa!% vIÒ€ÓÀ‘Ç2®šq(±yNœÔLlN^×!‹Ë­ç-ðuKv:ÒTúU©dRu€VI+O)-£•F1ìKY\ d–“n€]ѳ†ÂCl3«#‘ ¥9œ¸œÏËDg@å¢}¡‹qµÙPÔ»c¶7˜yÇõ¤®ÜËR4ŒÃ…þ#>9fsà§r™‡µ[ìØg=lþ‹úË×]án,$$´É:Px8æUÓAî å/)Óš‰‚â©ËÚä1yqõ¼å¾î©nÇZB ŸB µ#,ŠN° É%kø×GÄØÊEõ˜!6Öœmˆ–¢Ô&@m–IIdÚ s=&ª6;·+±¦½†”Æ‘-¼=s,¯·#rqð Ý‚Ëh)ú?Õ\TNf ý¢”m ªÏ|šÕ¦ø‹Ò Û*kœZ %”¥¶üàF”ðÈç«0Bà r¥Eã YfÛÚ…«–KÓ]–D Z³H(>IÌ䎓Ÿ…ǸæËq…qÃc›tI—µÝ¦¼©ûÈúˆoeæ'fкBIYóø¬ä(-Ëå1µ^°Î2¶Y^‰‰°òmèT¥LE’!¶Ûl†Ì) )i_¤P9€Îƒ+r¹+E AÄÒ#753]yÄòn,êHPi#fœ”¡™+p…Ž9ƒcË>:Eƒ NLûeº4ò䛥Ö໤˜í9¡*Kj %A”•ÀQÌž&A¿òÛcÄŠ-Û¬ñ¯Vöâ!å„¢m %J<KHN£Ñž¢zh,ãÜse¸Â¸áŒ1‡Íº$ËÚîÓ^TýäH}Ä7²ó³h]!$¬ùüVr˜·DÆÚ^*Ÿku˜Ó¤!×¢3$m6`$))t €H% è9dCl•ʦný…±“ÝãJà nj„ʾ´ûoÇh/$˜”¸JÁ×™ ´ñÌ<.Yî¨Öþj³¡™–Ç,0úßÖ¥¸?¤©Faeþ#>9qÏ€Q޹\•"Æ… âi›š™®Æ¼ây7u$(4‚³NJPÌ•¸BÇà ò‹Y-¶8Ö»‚o}×÷›¥ÐÜ$ùéBv-¸[AC#FawNtÖœgd°bÌ9Š,˜KuV#ïQ÷õ¯~’€vêRNËY9è„åƒ6o)Q.xyn}ÓH³²òÙš⛂—Ò­$¶BK‚AÈ ‚ž…çA^,ÆØ 9`[8&ùfcAubaµ¨”f˜ˆ(qE_¬Ì€À㘠Qát¥YŒ•§#˜ãÄPY½òkpó‘¸Ù‚Õ:Q‚À‰%™yÊ‹+^‡|áú5d®= Kɶ1Â6äÝï¶Ö†©FÙ‰ñä¤H Ô¦‰ijÉiÎIâžäHª.âKq®(jûo‡K®¶Ê! ¤W%©N ÐDt8])Vc%iÓÄqâ*\䯢u®Þݦ<—o2L8f-Â4†× dK*q·†ÜC4¬¤Œú(-b>Mqž¶&ñ|µ²Ô%­”%ægG“µB–Ò¿Dµy‹JR¿‚­ ’’kПj,Æ$¿ ™²ê\\wŠÃo$JP¤¬$ô*IÈð ñª6þS¬ø˜â=³ XÓ »…²Ñ)˜Të ?* wV†öŠ[„V@¨ž T÷þN1–1EÖÒŸï’U £S2†ò2Í…V ‡F¡›jÉ\z()»rw‹ìÛ†ókmñs‘ºETlLJäy¿¡%…¬%ß9>b²WŠ£d¾r[rüŸ32åfmWÙXŒ[YTI¨—­;K2µ£hË4Ÿ<Ë<ª zóÉ®5°®#sìÁk›+qi1%3(ï\?@°ÊÕ¡Þ#ôjÉ_‚wòm+òj/ëk Ý—ÜRûÛ’ÐŽT¦‰ijl-+rOžžå<ª$°ÕŠV(Äv¼3ÖZ“všÄVò´¡+ua *? C: ŒE„ìPníXðö%zdÝèÃ}»¤$ÚÃN–­n:¤óÿŠA*@è ¾P9+¼`KÄ{I¸Ûn†Z"ìD;„WžS0ÛšK :µ¤攬€•€ž F!Àø— D>ï>ë)ŲÛñf±-½ª@*mJekX ¡D+EQ!zä§aÇÙ‹i·È}æÙKo[thZ^Ô†ÈÈí •ePWÊG&wNn-Ä•vµOiÖc8•ƸÅuЧc¡ÒËN­iH+) P XIà¡A©GŽü¹ EŒÒy奶К”¢r”“TOݹ;ÅömÃyµ¶ø¹ÈÝ"ª ¶&%r<ßÐ’ÂÖ1Y+EËyä®é`ÀäÜ,¨]úf$M²9‰5õ¤²Ic&V¤m™f“ç‚@9gPZļ›JÂ<š‹ÅúÚÃweß÷¾Äöä¤4#•)¢ZZ› JÇœ“ç§€9gAˆ9-ÆØ]M³|¶Äb[®¶ËpSsŠìũϔd8])Vc%äsxŠ ÞNqŽÍÒÒ“½I0ѺÊfV™#/Ð/bµlÝãúµd¯áAo`,S†eǃv€Îñ)ÕGm¸³”CÀ€ZVÅkÐà$…d®=E¼O‚qq¶¯ñc4§¶ÿA5‰:FZÛYejб˜Í ÉCæ Æ¿a›ÞTÞánÆç›œ_Ò!{HÎŒÛ_šNYÐr#åƒ#L¿)–$JDfœq([ËJ”–ÒNED$@rž(7—9-fíNÁ7箌â Ï0²'@ÜœL¿Ñä@8×éž#åHÌgDîHØš«˜£ŸQ2þŒ2Ꞔblæ¹ú¥'Ï^¦VÈYÒ¯0æ‘@ÉUoòsê&_ц]SðŒMœ×?T¤ùëÔÊÀY :UæÒ(#ñ'ö›-‰X“ b¥^àFº.Í1nA1TÔ‚´ kÖÒÒ‡ TJUæÒ8Pi5B@ P( @ P( @ P( @ P( @ P( @ P( @ P( ArøÌfçÞŠG6¡5ÉÕÞ6ÅvËôÔ:¸öÛ¼iŽ¥  Ô†ÔÚÔ œË2?Î’KfÇ|¥_±¤‰Q}†,ë¸;9ˆq­ñ¡ ­D„¸âXBBÜ 9jV£ÄñâsŒ³nü£Æ_,r¡j„ó¬ÄºÄ¹3VIZÃ%²¬Š€ÏF\ Ê‚rßÊVÂ’¬í`x·[€gFįº‘gR[Ž’•¬“‹Ôé)ÏÍ:FT\¦Ùí8K“¶ѯѸbG®M±za¶$Dt§R[Bש¼Ôw0:²M§‰1–Ĭ+Í´ÉdvãCð_PmÇã£@[D¤IIËA¾¶Œ HÐaÍu»^#nòµ±‡­ö±° ­ ÜuùëC%­d‘èå‘ :ÿÊšë‚\ÃqãML•Ʋ2´ 6 ¹IwˆQ9ú4ð㒳ˆaϪŽ3”+1fåØÝÁw›´&e¾DfÓFL¶•6øp¨ë $”–Æ’£’ŽB ¿#òuo‰ Çl¶^¯‡±3û£W$7ke°¤ˆ¨-­z³KŽ8Jsó|Ñ•üÎ[0µ±‹“¶çe?cÅ1±s°À´´¶ZI˜¥EJ YQ çæå‘¸¼¥àœ ÈÞ bùp~Ó‹ÄÇYi”)(HѸ¾#Hóøgžy' (2fòÓn·],“ðñz\{v ‰vðí®Ô‚¶ ´¡Kˆo+'Õ  ÉÑ™»Šq>8`ì »ûë]õWu½ra¦‚P¦va°âó)áçpÕžy',¨5;÷“ y1Κwwýÿgžû—é¶Z?õYå§W—MQ…q[›s’ú£%Ôƒ p£1«Bˆ +,ò$ÉA¿cœ}g¾àøxe‹Î"ÄRãΑr¾²ÚˆÀmHÝZ!×T¤(¨(æ 3BrHãPQˆ1f½â›1•ë4´-^lïGm¶j+ ´àjB]*VÐ4xÓ§WIÊ‚C”.Qðÿ£ X#¾]Eä\’÷0@µ6Ø­2ˆªQZPóÖ¥=²!©ò‘‰¡couĶæä7s©[ip„§"#äù  ËåaŒY&!¶?tnèä(Q&Ã~#a†Ìx­±­§’éR‹YéSiË>“•™j·beÂûl7liŒ½2^ƒ!”¬·«äÔFƨës9lÂÖÆ,>NÛ”ýÆÄ ÎÃÒÒÙi$lJb•(€qeDƒŸ›–FÈ\¦`|ÆÞ bûpvÓ‹YĪçFZe+BÀhq~pÒ¿—<òNY…Å8Ÿ0v]ýõ®ú«ºÞ¹0ÓA(S;0Øqy”ðó¸jÏ<“–TÝyJþÙZåFÑ ×Z‰u‹qf<¼’¥†J…i*=f Ë…Ž4å6ÓvÙd8DUÕ›£í5‡ív…6¦ÂÒŒœˆ‚§\Åäâ´™:|ãl'yE©ûr.2î¬O\É—uÛã[d­µh!¯îêZ\XPZ¶ëó‰WE?(˜» âKt$[—6î%="]ÖU²4\BÒœšRc©Aâ¢òòQ*è ÕïÞLjäÇ:iÜß÷ýž{î_¦ÙhÿÕg–^v]5FM`Üú¢·K p£?;IP º3Pu9¼°[­ã ½m¸ßñ=à ^™º³>þÚu–Ó”&ôºê¶D§2J€ )œà®_,6; ¬Ã›íÅüI(Þ´ ´ˆÁI ½ ^m¥.: üÜõ œ¨ùa±ØUf4ßn(·âH؉Fõ¡¤F LxMèZóm)qÐWæç¨d„åAŽñö¹aS„°³÷éqä]SsuÛÀBU¶Ú[qâ´âóBë¾viÏ1’•9ª @ P( @ P( @ P( @ P( @ P( @ P( @ P( ë—Æcû7>ôR9µ ¾N°¼ìk‰#a[l˜±äܦ[vR”–vi9¨¥* pù¤ó%¶ÌäZðýÇ]§[aCµßF“µq´½ÇS¡(AÔÐÒ¯8q9’r5S‰92o N±À“ðÌ“}Dy :Èš–ØŒ÷>꜌(ˤ J*h1î|—bëí – VN!¢Z”¤…mFz! 9OF/´±bjÊ\DgC‰»]¤o·g*N”~Žz4œ²NTQÒ1v?·Ü9okµp~ãl…t…%• ¢Ã?5)^Dd@ ƒb›“ûíÍÂÆ¬Ý?ýþˆ[0d¶–`§?8íI+ùÉH?&’®4®'Æ6ûÞ »ÛÜ»;*á+;ui.%ÂUm-*sQ Õ£1ž|G? P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( uËã1ý›Ÿz)Ú„†²Üñ%Ýœ?e¼O¹Nn$Vu¥GV”§RˆHÌ3$ O2[%ÀXŸ Åb}â$UCêØnT+„y¬PSeÈëZÀ é$¾J2×è ò‘ÆCîêi%í«!½ñÔ”ä¥jHá’Ž’}Ab@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ‚:åñ˜þÍϽŽmCrä&t+g*ØVãr˜ÄH‘qŸ}÷m´Ú\h©JR² H’OI%Ò¢ãl1:ßdŸ «Ng ã(÷ ²+î)šZÆ™íÖ·V¤Ô…¤,¤¡A)ÍUg2,øevƦâÜ<úÝå&-Óû¥Ñ—Â! ò}jBˆBxñÌ‚œ¼àœÅ–±Û‚Ušn$ÄÑ$=kå‡")ù(­¹J ^Ï™ ðÉ/“:l_‹&cL0ë2ñ,iWXØÉh´íf´Ñ‹ÆÏêÔ¥Ôp´¶sÌ6“Ç1ÄÐLâµM<¡ro‹q.²ÜŒNg‹s˜œKsÈ}·ÊœS¥·–½!#2áó:<î"ƒÄãËùÛ\îPo1î‘-| 6àaÅ¥ÂÕ¥\]KmŽ;¿˜Ÿ5#OÈ8š \¨LÄÒù&B±^/·b g8¦_‰9¹a,nÞjC’ž$¥¬Á@ôR9µ í_G¶ÿBi<Él7ì3{Ã*€›Ü-ØÜà3s‹úD/iÑ›kóIË0:D| Q’ý†oxeP{…»œnqH…í#:3m~i9fAÈ” û ÞðÊ &÷ v78 Üâþ‘ ÚFtfÚüÒr̃‘(œžÄ°Oǘv*u-Ù¤]"µ=j^„ˆåÔ‡3WøFœó? ãPv«¥ªJðÖ·ò§…­¸f ŽPf[qa·&Þ[K)lPVöY¨u+,è1&áÅ*vòëYì·7qÄXP¢1nj2fZÔ¯ÒêmÚ Ùº ¢ µ JùÈø?lœQf³Ú-±ú,ï»#q-‹­)° ÂB88¼ÖWAËE¦ÍnÃH.a‰öû—: ÷0ÌK3*†[s[hØÉtËHPh¥âCVk:€ ãB@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(#®_ìÜûÑHæÔ+µ|Ûý ¤ó%FJ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ Ž¹|f?³sïE#›P®Õðd{oô&“Ì–u( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ‚:åñ˜þÍϽŽmB»WÁ‘í¿ÐšO2YÔd P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( ë—Æcû7>ôR9µ í_G¶ÿBi<ÉgQ’@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(#®_ìÜûÑHæÔ+µ|Ûý ¤ó%FJ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ Ž¹|f?³sïE#›P³áÙ-•¹©>bŽcJGÈ?¤ó&&WùúÕë_a]Õ.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™dçëW­}…wRæY9úÕë_a]Ô¹–N~µzרWu.e“Ÿ­^µöÝK™e"li¯´¸«+J°£¤€ )ˤV9¬E›MŽãp´aväÚ§H„ô‹¤¦Ýr;ªmKBŒP’RA ¬ÿ¯©NÑ‹²ìtUTÓ3UW˜™‹Ú(µíÒóþƒ‡´mUSLUM6¼^ךïÏ­£ý—|¯ÅŸ½ç]ñW)·w«òŸnœ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒz<¯ÅŸ½ç]ñSŠmÝêü§ÙÃöNÕ>1èò¿~ô]ÿwÅN)·w«òŸgÙ;TøÇ£ÊüYûÑwþuß8¦ÝÞ¯Ê}œ?díSã+ñgïEßù×|Tâ›wz¿)öpý“µOŒzbb‰r®6{=Âá%Ù2—&s*}啸¦Ð˜¥)*˜S_Ž$´c¾p£jÑ ”+#ç$G‡^©“eÄ7ü7!Éxvùpµ¾ëe—…%l-mž”’‚ IÈpè òUþû8JoSä Å¥JÉZö屓eyŸ;H$'<òó§Î¹É\Û”×åÈXHSϸ\Z‚@HÍD’rü ±@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ ½|ÿ»–oýúãÿ‡½õÿ’Ãÿ®¿üa¼¸_æñ?é£ÿ5£í÷Ë¥©¥± CA§´-½™ È @:…’Œ³ÈgÐ+žÕ‹NZmnvši«ÿ”M¿ì닳aãUš«ßý&cÿey]ë-¿Ñ`þMtßñºQüðþ\÷.µy×ôy]ë-¿Ñ`þM7ün”Ûiu Z“¯%èË%ÄgžFƒÔa{âæ= tJ\Ž„¸ê–ûhm)VE'hT‘ÌeÇÉK"X%9tzÙ?T3§¥#Qm(AVyf3Ï€xê=‘d¹™)†#~™qwħZx³²ÚêÏ<¾Ï.Ÿ“,øP_ò^÷¢2·f‚¥­´4ÙÐp—2Ñš5jH9Œ‰q 3†î*»Ã³IJzZÒœ‹‰Qh‘+æ’d…dr*ÆûÊŠˆ-f™(qm<óí¶—P•©:òQ¾Œ²Qž¸““„Y‡T¥<™Ϋ‚’•'h%†D 2<s*ÈØvZ®K·\èY޹O¨ä²Ò‚¾  <“‘Ì€r ¸Ö Ä2‡Ú·j4‡ÐózÔÒ€!aµñ«,‡òÈÒâÙÂ×Ñ54dÈJ’ûe¢Ð$í´iN}<)q''³&©Jy2W$-*NÐJ- ˆdx$æT‘°ìµ\—n¸гrŸQÉe¤%|@<x '#™åAnFºÅŠÜ¹ 4„; ¥&C{L–3I-êÔH•„ïáö#"^rVÓe±}·BŠ©iÍ*#PtçŸG4¸ºœ‰VPµ‡Gè”™L”ºs#J’•˜>h%_—baKüØÍJSo¥Jg7P•;¥E*I:” R|Ð èáÄP\8qé-K¶¡n?6;ϼ´¥ „:´g¨äœ’3*=&‚ÂpÕéSœ·˜‰K¬¶Z–óil6rÉ{B­Nc#žG>3cx‹’¥º–Eµ­k)!À¥•¥¤äs*éðÐ\¸a[õ­‡¤Nƒ³Lu¼¨R›Ìä ’’Hô(ŒŽc#ÄPV¬-w‡50§ÛÎÕIxì)¤¹æ ¨¨ŒÎIáždd <ÓÇ:X7<Êjݨ8ÒBCÍëSJ…„jÔSÄf¬²sË#K‹JôLn ˆ‚ãÒ¤¾Úš-‚A^Ð+@H ‚sȸñ8jô©Î[ÌD¥Ö[-Ky´¶9d½¡V'1‘Ï#Ÿ alšnI´%¤ªRÝK B\IdäP:zHãžT>EâL‚Õ´¤¨¡JT¦’–Ö2óJ²B¸5YáK‹IÃwe¶ZM±Ñ!¹°°§3SH R@fzNy€bƒL pÚŽì–¶i”ÞÙ¬Ô3R3#<º@$³éé(,P( @ P( @ P( @ P( @ P( @ P( @ P(7»t‹UÎk·v.š_ã®Éz¦á)²ue£AÓ˜ãžd ¾ZˆçëpŸ··÷t+õÛ¶— ú?UyókíîL{šßŠsBÈKŠ–•˜ü œÿóáAz¸Õ½V¹®ðóí¦*œJ¿½ þ”ðóT Èåæðñ‚ë×û[üDZ¤©6¸‘æ) -¨óès†YgÃShÏ,¼Ìú(#m÷ˆ,GÃM»$¤ÛîNH4¨ìÐVÑ èãÁ èÌðª#Õq'Ë~#Q]Cë^[x­º4• IÒË#Arذ¬3ÚC¿ß'-¶4é>k :Ôsèâ ØËþóÐK"ùm縒Õ(챪•¡\0–Þœ²Ïá3èãŸG ÂñeÞSˆùÇ'Ókܹ¿d½[MÛað²Ñ³ÿN&_-®~· ûq,èqB¿]»hÑÑépÏ£øÐdYq%®%®-¹Ù,¶ã–÷¢­Ç¢íÛefNÕ:¤¤Ÿ³¤T²o%ù³ºÅ—%«~ãňXl’¤hNA(RÇjtU°ß´±f´Šâ¶ò­ÏˆŽÊaO2‡7µfT„ƒŸ›¨gòP.÷»í—í\èÜd¸Ü¦IФ4VËkBPÚIH:óYTFæûkr$äÛßS<ÔKrT¤©QÙm:Ö~mkB2çãUYL]0òŸjòõà!ÔÙUuØ8VTÈÌå§Iá‘>#0f öÞÈ×6JºÝ"Ì•T54óQœCÌ´… ité`$d2Ô®#— XW(‘^¼\‹äÊy§ˆ4œÉuZV¼òá“e}A o¼Ab>mÙ%&ßrrD¥Gf‚¶ˆWGWFg…UM—ìÍ£ ^f]÷tÃuùA­ŠÔ§%­@#!QË/;HŽ'¢ ±oÅV´Åj3¯°ÊäA}…­Ø»vØqRËÉ B’B’@€9fH Ä¥»vQ{Z‹Hˆ˜Ù›r„W[ Õ³Ù¥¼ø éG8U·û…\·áåÔ©Šêt¨¥ ÒÚF®$f§T8ž N|A ™Å2mVËÆ&}7=¼™è1d°¦ÔV‚¥)DiÒ4²$œÇPG;|¶¯N½dÄxJt¡\B™ZQÃ,úHG¼ýnöâYÐ0þâ…~»vÑ££ÒáŸGñ È²âK\K\[s²YmÇ-ïE[EÛ¶Ê̪u!I!I!? 9fH¨, ÒÝ»(½‰-E¤DLl͹B+­…jÙìÒÞ|tŽ#*ŒvÞÃq1,K½¾ij37F”X-/Ìe% .s$g«$ñV@gA&éÛ øBA/?uD¤§#ç !ÀUžYt¨péãA?3X$Ü®tqbîýÄÛZV´†›ÐràT¤™èé?Æ {\¢^§¢ñÀ—%4’üp’u¤iÒœøhÈœrù*À† P( @ P( @ P( @ P( @ P( @ P( @ PIyGxÜ µ2C l2¢ˆí¥Å6?Â\ ÖGÀšÚ@ P( A•pºMº-¥Mu*Ø6m(m-¥ Ìœ‚RI=I4´ A•pºMº-¥Mu*Ø6m(m-¥ Ìœ‚RI=I4´ @ P( A}ù²¤Ççu5*C)Ò”©EDf:x’xÐX P(/Λ*å-éó]Ú>úŠÜ^3QùrŠ@ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P( @ P(ÿÙmdk-1.3.1/doc/img/ss_symbols.jpg0000644000175000017500000003257313747275312012215 ÿØÿàJFIFHHÿÛC  !"$"$ÿÛCÿÀ õ"ÿÄÿÄO!1"Vt´Ñ25ARSUc‘’”¡¢¤¥ÒÓá#4QT$aq•36DdBb²³„±ÁÿÄÿÄ*!1AQða¡2q±ÁñáÿÚ ?õr.’î$ÝfDDi!”!„µ‚8M¯'zs•ŸoúVç{ïøÃuù‘ÿJšWù›×—§ÍÙ¯2ôu«®îX,3ZÕ/Èm»LëÓ‘5\«¹IMÆÜd9+‹Ž¤¾ ¤ne’¤©àNæé®÷ßñ†ëó#þ•;߯¯ÌúUJLŸ{Ö*ÈoN\_¾Xä=r‘ -jÙ¶¨Ž´Ô[#{Úz"V\J^rH ÆÍËtçwnìë¥æßÒ{[÷i±/‘®V˜¶ëJorKИ‚RÃkHëiçï’à Ia³È¨áZÄvq2·»ßƯÌúTï}ÿn¿2?éWr”>÷ßñ†ëó#þ•;߯¯Ìú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.3.1/doc/img/Makefile.am0000644000175000017500000000131210770465100011322 ## 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.3.1/doc/img/ss_devform.jpg0000644000175000017500000001552313747275312012163 ÿØÿà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.3.1/doc/img/Makefile.in0000664000175000017500000003466715065042013011354 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/doc/mdk_mixvm.texi0000644000175000017500000007011013743070633011410 @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} sbt [NUMBER] This command changes the limit for the backtrace of executed instructions. If the number is omitted, the command prints the current limit. If you use a 0, backtraces are turned off. This can improve performance. If you wish for all the instructions to be logged, a -1 will enable that. The amount of memory required for unlimited backtraces can be substantial for long-running programs. @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.3.1/doc/mdk.info0000644000175000017500000100276514171330710010155 This is mdk.info, produced by makeinfo version 6.8 from mdk.texi. This manual is for GNU MDK (version 1.3.1, October, 2020), 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, 2020, 2022 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.3.1, October, 2020), 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, 2020, 2022 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.3.1, 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.3.1).  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.3.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.  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 makes sense for magnetic tape devices ('MOD' = 0-7): it shifts the read/write pointer by the number of blocks given by 'M' (if it equals zero, the tape is rewound), paper tape devices ('MOD' = 20): 'M' should be 0, the tape is rewound, and disk/drum devices ('MOD' = 8-15): it moves the read/write pointer to the block specified in rX and 'M' should be 0(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 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. 'ORIG', '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: sbt [NUMBER] This command changes the limit for the backtrace of executed instructions. If the number is omitted, the command prints the current limit. If you use a 0, backtraces are turned off. This can improve performance. If you wish for all the instructions to be logged, a -1 will enable that. The amount of memory required for unlimited backtraces can be substantial for long-running programs. -- 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'. Here is an screenshot showing how 'gmixvm' looks like when running with a couple of 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. The next figure shows the enter word dialog. 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 100) * 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 <1>: 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 76) * 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 94) * cbp: Debug commands. (line 23) * cbpa: Debug commands. (line 54) * cbpc: Debug commands. (line 91) * cbpm: Debug commands. (line 75) * cbpo: Debug commands. (line 87) * cbpr: Debug commands. (line 64) * 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 18) * 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 15) * 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 46) * pbt: Debug commands. (line 163) * pc: State commands. (line 20) * pddir: Configuration commands. (line 61) * pedit: Configuration commands. (line 31) * pflags: State commands. (line 61) * pline: Debug commands. (line 142) * pmem: State commands. (line 77) * pprog: File commands. (line 54) * preg: State commands. (line 26) * prompt: Configuration commands. (line 70) * psrc: File commands. (line 55) * pstat: State commands. (line 10) * psym: Debug commands. (line 97) * 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 45) * 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 90) * sbpm: Debug commands. (line 74) * sbpo: Debug commands. (line 86) * sbpr: Debug commands. (line 63) * sbt: Debug commands. (line 154) * scmf: Scheme commands. (line 19) * scmp: State commands. (line 62) * sddir: Configuration commands. (line 60) * 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 224) * STA: Storing operators. (line 12) * STi: Storing operators. (line 16) * stime: Configuration commands. (line 21) * STJ: Storing operators. (line 18) * strace: Debug commands. (line 115) * STX: Storing operators. (line 14) * STZ: Storing operators. (line 20) * SUB: Arithmetic operators. (line 12) * Symbols...: Menu and status bars. (line 43) * Toolbar(s): Menu and status bars. (line 49) * w2d: Debug commands. (line 241) * weval: Debug commands. (line 212)  Tag Table: Node: Top1206 Node: Introduction7427 Node: Acknowledgments10331 Node: Installing MDK12865 Node: Download13139 Node: Download-Footnotes13947 Ref: Download-Footnote-114007 Node: Requirements14208 Node: Basic installation15501 Node: Emacs support17029 Node: Special configure flags18571 Node: Supported platforms19809 Node: Supported platforms-Footnotes21336 Ref: Supported platforms-Footnote-121418 Node: MIX and MIXAL tutorial21741 Node: The MIX computer22694 Node: MIX architecture23012 Node: MIX instruction set28191 Node: Instruction structure28951 Node: Instruction structure-Footnotes31796 Ref: Instruction structure-Footnote-131882 Ref: Instruction structure-Footnote-232025 Node: Loading operators32128 Node: Storing operators34308 Node: Arithmetic operators35724 Node: Address transfer operators37292 Node: Comparison operators39465 Node: Jump operators40619 Node: Input-output operators43484 Node: Input-output operators-Footnotes44963 Ref: Input-output operators-Footnote-145051 Node: Conversion operators45369 Node: Shift operators46770 Node: Miscellaneous operators48333 Node: Execution times48993 Node: MIXAL50863 Node: Basic structure52481 Node: Basic structure-Footnotes55087 Ref: Basic structure-Footnote-155161 Ref: Basic structure-Footnote-255223 Node: MIXAL directives55431 Node: MIXAL directives-Footnotes60260 Ref: MIXAL directives-Footnote-160336 Node: Expressions60617 Node: W-expressions62205 Node: Local symbols65150 Node: Local symbols-Footnotes66778 Ref: Local symbols-Footnote-166848 Node: Literal constants66964 Node: Getting started67816 Node: Writing a source file68657 Node: Writing a source file-Footnotes71680 Ref: Writing a source file-Footnote-171766 Ref: Writing a source file-Footnote-271939 Node: Compiling72385 Node: Running the program73408 Node: Non-interactive mode75197 Node: Non-interactive mode-Footnotes77593 Ref: Non-interactive mode-Footnote-177677 Ref: Non-interactive mode-Footnote-277967 Node: Interactive mode78121 Node: Interactive mode-Footnotes81782 Ref: Interactive mode-Footnote-181858 Node: Debugging81973 Node: Using mixguile85543 Node: The mixguile shell86304 Node: Additional functions88036 Node: Defining new functions89734 Node: Hook functions92983 Node: Command hooks93487 Node: Break hooks98406 Node: Break hooks-Footnotes99560 Ref: Break hooks-Footnote-199626 Node: Scheme scripts99898 Node: Using Scheme in mixvm and gmixvm101729 Node: Emacs tools103417 Node: MIXAL mode104209 Node: MIXAL mode-Footnotes104909 Ref: MIXAL mode-Footnote-1104973 Node: Basics105049 Node: Help system106085 Node: Compiling and running106980 Node: GUD integration107891 Node: GUD integration-Footnotes108627 Ref: GUD integration-Footnote-1108701 Node: mixasm108917 Node: Invoking mixasm109552 Node: mixvm111402 Node: Invocation112296 Node: Commands114845 Node: Commands-Footnotes116508 Ref: Commands-Footnote-1116568 Ref: Commands-Footnote-2116689 Node: File commands116894 Node: Debug commands119987 Node: State commands129957 Node: Configuration commands133410 Node: Scheme commands136282 Node: Devices137386 Node: gmixvm140805 Node: Invoking gmixvm141646 Node: MIXVM console145615 Node: MIX virtual machine147209 Node: MIXAL source view148567 Node: MIX devices view149404 Node: Menu and status bars150481 Node: mixguile154542 Node: Invoking mixguile155178 Node: Scheme functions reference157613 Node: mixvm wrappers158620 Node: Hooks162697 Node: Additional VM functions165516 Node: Problems169875 Node: Copying170396 Node: GNU General Public License170726 Node: GNU Free Documentation License208294 Node: Concept Index230693 Node: Instructions and commands240003  End Tag Table  Local Variables: coding: utf-8 End: mdk-1.3.1/doc/mdk_gstart.texi0000644000175000017500000010635112622455635011567 @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.3.1/doc/mdk_mixguile.texi0000644000175000017500000003520212622455635012102 @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.3.1/doc/mdk.texi0000644000175000017500000001646114171056406010177 \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 October, 2020 @set EDITION 1.3.1 @set VERSION 1.3.1 @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, 2020, 2022 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.3.1/doc/mdk_copying.texi0000644000175000017500000015657712112755472011746 @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.3.1/doc/Makefile.am0000644000175000017500000000207412636564773010577 ## 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.3.1/doc/mdk_tut.texi0000644000175000017500000014034213743070633011071 @c -*-texinfo-*- @c This is part of the GNU MDK Reference Manual. @c Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2014, 2020 @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 makes sense for magnetic tape devices (@samp{MOD} = 0-7): it shifts the read/write pointer by the number of blocks given by @samp{M} (if it equals zero, the tape is rewound), paper tape devices (@samp{MOD} = 20): @samp{M} should be 0, the tape is rewound, and disk/drum devices (@samp{MOD} = 8-15): it moves the read/write pointer to the block specified in rX and @samp{M} should be 0@footnote{In Knuth's original definition, there are other control operations available, but they do not make sense when implementing the 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{ORIG}, @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.3.1/doc/mdk_bugs.texi0000644000175000017500000000137612112755472011220 @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.3.1/doc/Makefile.in0000664000175000017500000010070715065042013010565 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } 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 distdir-am 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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_TEXI2FLAGS) -I $(srcdir) $(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_TEXI2FLAGS) -I $(srcdir) $(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: -$(am__rm_rf) mdk.t2d mdk.t2p clean-aminfo: -$(am__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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/intl/0000775000175000017500000000000015065042311006775 5mdk-1.3.1/intl/gmo.h0000644000175000017500000001134514171035244007656 /* 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.3.1/intl/printf.c0000644000175000017500000001717714171035244010402 /* 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.3.1/intl/dngettext.c0000644000175000017500000000354214171035244011075 /* 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.3.1/intl/localcharset.c0000644000175000017500000002435714171035244011542 /* 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.3.1/intl/relocatable.h0000644000175000017500000000523514171035245011353 /* 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.3.1/intl/xsize.h0000644000175000017500000000672214171035245010242 /* 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.3.1/intl/loadmsgcat.c0000644000175000017500000010723714171035244011213 /* 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.3.1/intl/explodename.c0000644000175000017500000001064314171035244011370 /* 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.3.1/intl/bindtextdom.c0000644000175000017500000002312014171035244011402 /* 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.3.1/intl/l10nflist.c0000644000175000017500000002733014171035244010704 /* 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.3.1/intl/printf-args.c0000644000175000017500000000625314171035244011325 /* 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.3.1/intl/plural.c0000644000175000017500000011065115065042012010360 /* 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.3.1/intl/log.c0000644000175000017500000000530314171035244007645 /* 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.3.1/intl/wprintf-parse.h0000644000175000017500000000425714171035245011702 /* 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.3.1/intl/dcgettext.c0000644000175000017500000000341514171035244011061 /* 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.3.1/intl/locale.alias0000644000175000017500000000512214171035244011171 # 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.3.1/intl/plural-exp.h0000644000175000017500000000773314171035244011173 /* 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.3.1/intl/printf-args.h0000644000175000017500000000550214171035244011326 /* 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.3.1/intl/plural.y0000644000175000017500000001627114171035244010417 %{ /* 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.3.1/intl/dgettext.c0000644000175000017500000000336514171035244010722 /* 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.3.1/intl/gettext.c0000644000175000017500000000355014171035244010552 /* 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.3.1/intl/gettextP.h0000644000175000017500000001453014171035244010677 /* 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.3.1/intl/ngettext.c0000644000175000017500000000367014171035244010733 /* 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.3.1/intl/printf-parse.c0000644000175000017500000002733314171035244011505 /* 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.3.1/intl/dcigettext.c0000644000175000017500000010125314171035244011231 /* 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.3.1/intl/plural-exp.c0000644000175000017500000000765114171035244011165 /* 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.3.1/intl/ChangeLog0000644000175000017500000000010714171035244010467 2004-01-28 GNU * Version 0.14 released. mdk-1.3.1/intl/finddomain.c0000644000175000017500000001274314171035244011202 /* 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.3.1/intl/localename.c0000644000175000017500000007413514171035244011175 /* 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.3.1/intl/localcharset.h0000644000175000017500000000255714171035244011545 /* 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.3.1/intl/loadinfo.h0000644000175000017500000001332214171035244010664 /* 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.3.1/intl/ref-add.sin0000644000175000017500000000210114171035244010726 # 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.3.1/intl/eval-plural.h0000644000175000017500000000532214171035244011316 /* 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.3.1/intl/localealias.c0000644000175000017500000002334014171035244011336 /* 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.3.1/intl/intl-compat.c0000644000175000017500000000644314171035244011321 /* 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.3.1/intl/config.charset0000755000175000017500000004340614171035244011551 #! /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.3.1/intl/os2compat.h0000644000175000017500000000302214171035244010774 /* 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.3.1/intl/vasnprintf.c0000644000175000017500000005304414171035245011264 /* 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.3.1/intl/osdep.c0000644000175000017500000000164314171035244010201 /* 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.3.1/intl/textdomain.c0000644000175000017500000001066014171035245011243 /* 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.3.1/intl/ref-del.sin0000644000175000017500000000202414171035244010746 # 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.3.1/intl/dcngettext.c0000644000175000017500000000347014171035244011240 /* 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.3.1/intl/hash-string.h0000644000175000017500000000314114171035244011316 /* 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.3.1/intl/vasnwprintf.h0000644000175000017500000000330214171035245011450 /* 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.3.1/intl/os2compat.c0000644000175000017500000000550314171035244010775 /* 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.3.1/intl/printf-parse.h0000644000175000017500000000420714171035244011505 /* 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.3.1/intl/vasnprintf.h0000644000175000017500000000436014171035245011266 /* 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.3.1/intl/VERSION0000644000175000017500000000004614171035244007767 GNU gettext library from gettext-0.14 mdk-1.3.1/intl/libgnuintl.h.in0000644000175000017500000003114614171035244011651 /* 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.3.1/intl/Makefile.in0000644000175000017500000003762614171035244011002 # 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.3.1/intl/relocatable.c0000644000175000017500000003136014171035244011343 /* 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.3.1/INSTALL0000644000175000017500000003110312112755472007005 Installing 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.3.1/misc/0000775000175000017500000000000015065042311006762 5mdk-1.3.1/misc/mixal-mode.el0000644000175000017500000012506213743070633011275 ;;; mixal-mode.el --- Major mode for the mix asm language. -*- lexical-binding:t -*- ;; Copyright (C) 2003-2020 Free Software Foundation, Inc. ;; Author: Pieter E.J. Pareit ;; Maintainer: Jose A Ortega Ruiz ;; Created: 09 Nov 2002 ;; Version: 0.4 ;; Keywords: languages, Knuth, mix, mixal, asm, mixvm, The Art Of Computer Programming ;; This file is part of GNU Emacs. ;; GNU Emacs 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. ;; GNU Emacs is distributed in the hope that 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 GNU Emacs. If not, see . ;;; 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 ;; `https://ftp.gnu.org/pub/gnu/mdk'. ;; ;; To use this mode, place the following in your init file: ;; `(load-file "/PATH-TO-FILE/mixal-mode.el")'. ;; ;; When you load a file with the extension .mixal the mode will be started ;; automatically. If you want to start the mode manually, use `M-x mixal-mode'. ;; Font locking will work, the behavior of tabs is the same as Emacs's ;; 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.4: ;; 16/10/20: Jose A Ortega Ruiz ;; Add missed instructions: SLB,SRB,JAE,JAO,JXE,JXO ;; Version 0.3: ;; 12/10/05: Stefan Monnier ;; Use font-lock-syntactic-keywords to detect/mark comments. ;; Use [^ \t\n]+ to match the operand part of a line. ;; Drop mixal-operation-codes. ;; Build the mixal-operation-codes-alist immediately. ;; Use `interactive' in mixal-describe-operation-code. ;; Remove useless ".*$" at the end of some regexps. ;; Fix the definition of comment-start-skip. ;; 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-c\C-c" 'compile) (define-key map "\C-c\C-r" 'mixal-run) (define-key map "\C-c\C-d" 'mixal-debug) (define-key map "\C-h\C-o" '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))) ;; We need to do a bit more to make fontlocking for comments work. ;; See use of syntax-propertize-function. ;; (modify-syntax-entry ?* "<" st) (modify-syntax-entry ?\n ">" st) st) "Syntax table for `mixal-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-assembly-pseudoinstructions '("ORIG" "EQU" "CON" "ALF" "END") "List of possible assembly pseudoinstructions.") ;;;; 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 ;; FIXME: the codes FADD, FSUB, FMUL, FDIV, JRAD, and FCMP were in ;; mixal-operation-codes but not here. They should probably be added here. ;; ;; We used to define this with a backquote and subexps like ,(+ 8 3) for ;; better clarity, but the resulting code was too big and caused the ;; byte-compiler to eat up all the stack space. Even using ;; `eval-when-compile' didn't help because the byte-compiler insists on ;; compiling the code before evaluating it. '((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) (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) (LD1 loading "load I1" 9 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 than that will result in undefined behavior." 2) (LD2 loading "load I2" 10 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 than that will result in undefined behavior." 2) (LD3 loading "load I3" 11 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 than that will result in undefined behavior." 2) (LD4 loading "load I4" 12 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 than that will result in undefined behavior." 2) (LD5 loading "load I5" 13 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 than that will result in undefined behavior." 2) (LD6 loading "load I6" 14 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 than that will result in undefined behavior." 2) (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) (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) (LD1N loading "load I1 negative" 17 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 than that will result in undefined behavior." 2) (LD2N loading "load I2 negative" 18 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 than that will result in undefined behavior." 2) (LD3N loading "load I3 negative" 19 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 than that will result in undefined behavior." 2) (LD4N loading "load I4 negative" 20 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 than that will result in undefined behavior." 2) (LD5N loading "load I5 negative" 21 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 than that will result in undefined behavior." 2) (LD6N loading "load I6 negative" 22 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 than that will result in undefined behavior." 2) (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) (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) (ST1 storing "store I1" 25 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) (ST2 storing "store I2" 26 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) (ST3 storing "store I3" 27 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) (ST4 storing "store I4" 28 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) (ST5 storing "store I5" 29 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) (ST6 storing "store I6" 30 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) (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) (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) (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) (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) (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) (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) (ENTA address-transfer "enter A" 48 "Literal value is stored in rA. Indexed, stores value of index in rA." 1) (ENTX address-transfer "enter X" 55 "Literal value is stored in rX. Indexed, stores value of index in rX." 1) (ENT1 address-transfer "Enter rI1" 49 "Literal value is stored in rI1. Indexed, stores value of index in rI1." 1) (ENT2 address-transfer "Enter rI2" 50 "Literal value is stored in rI2. Indexed, stores value of index in rI2." 1) (ENT3 address-transfer "Enter rI3" 51 "Literal value is stored in rI3. Indexed, stores value of index in rI3." 1) (ENT4 address-transfer "Enter rI4" 52 "Literal value is stored in rI4. Indexed, stores value of index in rI4." 1) (ENT5 address-transfer "Enter rI5" 53 "Literal value is stored in rI5. Indexed, stores value of index in rI5." 1) (ENT6 address-transfer "Enter rI6" 54 "Literal value is stored in rI6. Indexed, stores value of index in rI6." 1) (ENNA address-transfer "enter negative A" 48 "Literal value is stored in rA with opposite sign. Indexed, stores value of index in rA with opposite sign." 1) (ENNX address-transfer "enter negative X" 55 "Literal value is stored in rX with opposite sign. Indexed, stores value of index in rX with opposite sign." 1) (ENN1 address-transfer "Enter negative rI1" 49 "Literal value is stored in rI1 with opposite sign. Indexed, stores value of index in rI1 with opposite sign." 1) (ENN2 address-transfer "Enter negative rI2" 50 "Literal value is stored in rI2 with opposite sign. Indexed, stores value of index in rI2 with opposite sign." 1) (ENN3 address-transfer "Enter negative rI3" 51 "Literal value is stored in rI3 with opposite sign. Indexed, stores value of index in rI3 with opposite sign." 1) (ENN4 address-transfer "Enter negative rI4" 52 "Literal value is stored in rI4 with opposite sign. Indexed, stores value of index in rI4 with opposite sign." 1) (ENN5 address-transfer "Enter negative rI5" 53 "Literal value is stored in rI5 with opposite sign. Indexed, stores value of index in rI5 with opposite sign." 1) (ENN6 address-transfer "Enter negative rI6" 54 "Literal value is stored in rI6 with opposite sign. Indexed, stores value of index in rI6 with opposite sign." 1) (INCA address-transfer "increase A" 48 "Increase register A with the literal value of M. On overflow the overflow toggle is set." 1) (INCX address-transfer "increase X" 55 "Increase register X with the literal value of M. On overflow the overflow toggle is set." 1) (INC1 address-transfer "increase I1" 49 "Increase register I1 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (INC2 address-transfer "increase I2" 50 "Increase register I2 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (INC3 address-transfer "increase I3" 51 "Increase register I3 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (INC4 address-transfer "increase I4" 52 "Increase register I4 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (INC5 address-transfer "increase I5" 53 "Increase register I5 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (INC6 address-transfer "increase I6" 54 "Increase register I6 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (DECA address-transfer "decrease A" 48 "Decrease register A with the literal value of M. On overflow the overflow toggle is set." 1) (DECX address-transfer "decrease X" 55 "Decrease register X with the literal value of M. On overflow the overflow toggle is set." 1) (DEC1 address-transfer "decrease I1" 49 "Decrease register I1 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (DEC2 address-transfer "decrease I2" 50 "Decrease register I2 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (DEC3 address-transfer "decrease I3" 51 "Decrease register I3 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (DEC4 address-transfer "decrease I4" 52 "Decrease register I4 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (DEC5 address-transfer "decrease I5" 53 "Decrease register I5 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (DEC6 address-transfer "decrease I6" 54 "Decrease register I6 with the literal value of M. The result is undefined when the result does not fit in 2 bytes." 1) (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) (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) (CMP1 comparison "compare I1" 57 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) (CMP2 comparison "compare I2" 58 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) (CMP3 comparison "compare I3" 59 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) (CMP4 comparison "compare I4" 60 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) (CMP5 comparison "compare I5" 61 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) (CMP6 comparison "compare I6" 62 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) (JMP jump "jump" 39 "Unconditional jump. Register J is set to the value of the next instruction that would have been executed when there was no jump." 1) (JSJ jump "jump, save J" 39 "Unconditional jump, but rJ is not modified." 1) (JOV jump "jump on overflow" 39 "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) (JNOV jump "Jump on no overflow" 39 "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) (JL jump "Jump on less" 39 "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) (JE jump "Jump on equal" 39 "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) (JG jump "Jump on greater" 39 "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) (JGE jump "Jump on not less" 39 "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) (JNE jump "Jump on not equal" 39 "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) (JLE jump "Jump on not greater" 39 "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) (JAN jump "jump A negative" 40 "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) (JAZ jump "jump A zero" 40 "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) (JAP jump "jump A positive" 40 "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) (JANN jump "jump A non-negative" 40 "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) (JANZ jump "jump A non-zero" 40 "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) (JANP jump "jump A non-positive" 40 "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) (JAE jump "jump A even" 40 "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) (JAO jump "jump A odd" 40 "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) (JXN jump "jump X negative" 47 "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) (JXZ jump "jump X zero" 47 "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) (JXP jump "jump X positive" 47 "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) (JXNN jump "jump X non-negative" 47 "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) (JXNZ jump "jump X non-zero" 47 "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) (JXNP jump "jump X non-positive" 47 "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) (JXE jump "jump X even" 47 "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) (JXO jump "jump X odd" 47 "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) (J1N jump "jump I1 negative" 41 "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) (J1Z jump "jump I1 zero" 41 "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) (J1P jump "jump I1 positive" 41 "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) (J1NN jump "jump I1 non-negative" 41 "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) (J1NZ jump "jump I1 non-zero" 41 "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) (J1NP jump "jump I1 non-positive" 41 "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) (J2N jump "jump I2 negative" 41 "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) (J2Z jump "jump I2 zero" 41 "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) (J2P jump "jump I2 positive" 41 "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) (J2NN jump "jump I2 non-negative" 41 "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) (J2NZ jump "jump I2 non-zero" 41 "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) (J2NP jump "jump I2 non-positive" 41 "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) (J3N jump "jump I3 negative" 41 "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) (J3Z jump "jump I3 zero" 41 "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) (J3P jump "jump I3 positive" 41 "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) (J3NN jump "jump I3 non-negative" 41 "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) (J3NZ jump "jump I3 non-zero" 41 "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) (J3NP jump "jump I3 non-positive" 41 "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) (J4N jump "jump I4 negative" 41 "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) (J4Z jump "jump I4 zero" 41 "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) (J4P jump "jump I4 positive" 41 "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) (J4NN jump "jump I4 non-negative" 41 "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) (J4NZ jump "jump I4 non-zero" 41 "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) (J4NP jump "jump I4 non-positive" 41 "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) (J5N jump "jump I5 negative" 41 "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) (J5Z jump "jump I5 zero" 41 "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) (J5P jump "jump I5 positive" 41 "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) (J5NN jump "jump I5 non-negative" 41 "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) (J5NZ jump "jump I5 non-zero" 41 "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) (J5NP jump "jump I5 non-positive" 41 "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) (J6N jump "jump I6 negative" 41 "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) (J6Z jump "jump I6 zero" 41 "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) (J6P jump "jump I6 positive" 41 "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) (J6NN jump "jump I6 non-negative" 41 "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) (J6NZ jump "jump I6 non-zero" 41 "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) (J6NP jump "jump I6 non-positive" 41 "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) (SLA miscellaneous "shift left A" 6 "Shift to A, M bytes left. Hero's will be added to the right." 2) (SRA miscellaneous "shift right A" 6 "Shift to A, M bytes right. Zeros will be added to the left." 2) (SLAX miscellaneous "shift left AX" 6 "Shift AX, M bytes left. Zeros will be added to the right." 2) (SRAX miscellaneous "shift right AX" 6 "Shift AX, M bytes right. Zeros will be added to the left." 2) (SLC miscellaneous "shift left AX circularly" 6 "Shift AX, M bytes left circularly. The bytes that fall off to the left will be added to the right." 2) (SRC miscellaneous "shift right AX circularly" 6 "Shift AX, M bytes right circularly. The bytes that fall off to the right will be added to the left." 2) (SLB miscellaneous "shift left AX binary" 6 "Shift AX, M binary places left." 2) (SRB miscellaneous "shift right AX binary" 6 "Shift AX, M binary places right." 2) (MOVE miscellaneous "move" 7 number "Move MOD words from M to the location stored in rI1." (+ 1 (* 2 number))) (NOP miscellaneous "no operation" 0 ignored "No operation, M and F are not used by the machine." 1) (HLT miscellaneous "halt" 5 "Halt. Stop instruction fetching." 1) (IN input-output "input" 36 unit "Transfer a block of words from the specified unit to memory. The transfer starts at address M." 1) (OUT input-output "output" 37 unit "Transfer a block of words from memory. The transfer starts at address M to the specified unit." 1) (IOC input-output "input-output control" 35 unit "Perform a control operation. The control operation is given by M on the specified unit." 1) (JRED input-output "jump ready" 38 unit "Jump to M if the specified unit is ready." 1) (JBUS input-output "jump busy" 34 unit "Jump to M if the specified unit is busy." 1) (NUM conversion "convert to numeric" 5 "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) (CHAR conversion "convert to characters" 5 "Convert the number stored in rA to a character representation. The converted character representation is stored in rAX." 10)) "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 a 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 a 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) ;;; Font-locking: (defconst mixal-syntax-propertize-function (syntax-propertize-rules ;; Normal comments start with a * in column 0 and end at end of line. ("^\\*" (0 "<")) ;; Every line can end with a comment which is placed after the operand. ;; I assume here that mnemonics without operands can not have a comment. ("^[[:alnum:]]*[ \t]+[[:alnum:]]+[ \t]+[^ \n\t]+[ \t]*\\([ \t]\\)[^\n \t]" (1 "<")))) (defvar mixal-font-lock-keywords `(("^\\([A-Z0-9a-z]+\\)" (1 mixal-font-lock-label-face)) (,(regexp-opt (mapcar (lambda (x) (symbol-name (car x))) mixal-operation-codes-alist) '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-Z0-9a-z]+[ \t]+\\(=.*=\\)" (1 font-lock-constant-face))) "Keyword highlighting specification for `mixal-mode'.") ;; (makunbound 'mixal-font-lock-keywords) (defvar mixal-describe-operation-code-history nil "History list for describe operation code.") (defun mixal-describe-operation-code (op-code) "Display the full documentation of OP-CODE." (interactive (list (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 completion 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 (assq (intern-soft (current-word)) mixal-operation-codes-alist)) (prompt (concat "Describe operation code " (if have-default (concat "(default " (current-word) "): ") ": ")))) ;; As the operation code to the user. (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 mixal file in current buffer, assumes that file has been compiled." (interactive) (if (fboundp 'mixvm) (mixvm (concat "mixvm -r -t -d " (file-name-sans-extension (buffer-file-name)))) (error "mixvm.el needs to be loaded to run `mixvm'"))) (defun mixal-debug () "Start mixvm for debugging. Assumes that file has been compiled with debugging support." (interactive) (if (fboundp 'mixvm) (mixvm (concat "mixvm " (file-name-sans-extension (buffer-file-name)))) (error "mixvm.el needs to be loaded to run `mixvm'"))) ;;;###autoload (define-derived-mode mixal-mode prog-mode "mixal" "Major mode for the mixal asm language." (set (make-local-variable 'comment-start) "*") (set (make-local-variable 'comment-start-skip) "^\\*[ \t]*") (set (make-local-variable 'font-lock-defaults) '(mixal-font-lock-keywords)) (set (make-local-variable 'syntax-propertize-function) mixal-syntax-propertize-function) ;; 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 " (if buffer-file-name (shell-quote-argument buffer-file-name))))) (provide 'mixal-mode) ;;; mixal-mode.el ends here mdk-1.3.1/misc/mixvm.el0000644000175000017500000001422013743070633010372 ;;; mixvm.el --- mdk's mixvm / Emacs gud interaction ;; Copyright (C) 2001, 2019 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-number (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.3.1/misc/Makefile.am0000644000175000017500000000114110770465100010734 ## 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.3.1/misc/Makefile.in0000664000175000017500000004100515065042013010746 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/config.guess0000755000175000017500000014306714770044664010317 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2024-07-27' # 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: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system '$me' is run on. Options: -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-2024 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 # Just in case it came from the environment. GUESS= # 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. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { 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" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c17 c99 c89 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver 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 } # 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 ; 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/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #if defined(__ANDROID__) LIBC=android #else #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #elif defined(__LLVM_LIBC__) LIBC=llvm #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; 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". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; 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) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) 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. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 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. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) 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 test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; 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. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; 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'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; 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) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # 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:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) 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; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int 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 GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *: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 test -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 GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 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 test -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 test "$HP_ARCH" = ""; then 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 test "$HP_ARCH" = hppa2.0w then 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 GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) 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; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; 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*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; 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:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; 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/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 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/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-pc-managarm-mlibc" ;; *:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __ARM_EABI__ #ifdef __ARM_PCS_VFP ABI=eabihf #else ABI=eabi #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; esac fi GUESS=$CPU-unknown-linux-$LIBCABI ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` 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 GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; kvx:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; kvx:cos:*:*) GUESS=$UNAME_MACHINE-unknown-cos ;; kvx:mbr:*:*) GUESS=$UNAME_MACHINE-unknown-mbr ;; loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __i386__ ABI=x86 #else #ifdef __ILP32__ ABI=x32 #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in x86) CPU=i686 ;; x32) LIBCABI=${LIBC}x32 ;; esac fi GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; 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. GUESS=i386-sequent-sysv4 ;; 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. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; 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 GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; 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 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; 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 configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; 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*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; ppc:Haiku:*:*) # Haiku running on Apple PowerPC GUESS=powerpc-apple-haiku ;; *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$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 # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *: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 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; *:Ironclad:*:*) GUESS=$UNAME_MACHINE-unknown-ironclad ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif int main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&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 fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mdk-1.3.1/configure0000775000175000017500000140310115064375041007666 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for GNU MDK 1.3.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and 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 ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU MDK' PACKAGE_TARNAME='mdk' PACKAGE_VERSION='1.3.1' PACKAGE_STRING='GNU MDK 1.3.1' PACKAGE_BUGREPORT='bug-mdk@gnu.org' PACKAGE_URL='https://www.gnu.org/software/mdk/' ac_unique_file="mixlib/mix.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_func_c_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 CPP EGREP GREP 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 am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__xargs_n am__rm_f_notfound AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS 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 am__quote' 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 case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures GNU MDK 1.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/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.3.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU MDK configure 1.3.1 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { 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 (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) eval "$3=yes" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # 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\"" printf "%s\n" "$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 printf "%s\n" "$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 case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to run 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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { 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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status ;; esac 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_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_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 (void) { 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 (void) { 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 case e in #( e) 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 ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { 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 (void) { 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 case e in #( e) 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 ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else case e in #( e) ac_lo= ac_hi= ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # 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 (void) { 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 case e in #( e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam 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 (void) { return $2; } static unsigned long int ulongval (void) { return $2; } #include #include int main (void) { 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.3.1, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H" as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE" # Auxiliary files required by this configure script. ac_aux_files="config.guess config.sub compile missing install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.17' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5 printf %s "checking whether sleep supports fractional seconds... " >&6; } if test ${am_cv_sleep_fractional_seconds+y} then : printf %s "(cached) " >&6 else case e in #( e) if sleep 0.001 2>/dev/null then : am_cv_sleep_fractional_seconds=yes else case e in #( e) am_cv_sleep_fractional_seconds=no ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_sleep_fractional_seconds" >&5 printf "%s\n" "$am_cv_sleep_fractional_seconds" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking filesystem timestamp resolution" >&5 printf %s "checking filesystem timestamp resolution... " >&6; } if test ${am_cv_filesystem_timestamp_resolution+y} then : printf %s "(cached) " >&6 else case e in #( e) # Default to the worst case. am_cv_filesystem_timestamp_resolution=2 # Only try to go finer than 1 sec if sleep can do it. # Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, # - 1 sec is not much of a win compared to 2 sec, and # - it takes 2 seconds to perform the test whether 1 sec works. # # Instead, just use the default 2s on platforms that have 1s resolution, # accept the extra 1s delay when using $sleep in the Automake tests, in # exchange for not incurring the 2s delay for running the test for all # packages. # am_try_resolutions= if test "$am_cv_sleep_fractional_seconds" = yes; then # Even a millisecond often causes a bunch of false positives, # so just try a hundredth of a second. The time saved between .001 and # .01 is not terribly consequential. am_try_resolutions="0.01 0.1 $am_try_resolutions" fi # In order to catch current-generation FAT out, we must *modify* files # that already exist; the *creation* timestamp is finer. Use names # that make ls -t sort them differently when they have equal # timestamps than when they have distinct timestamps, keeping # in mind that ls -t prints the *newest* file first. rm -f conftest.ts? : > conftest.ts1 : > conftest.ts2 : > conftest.ts3 # Make sure ls -t actually works. Do 'set' in a subshell so we don't # clobber the current shell's arguments. (Outer-level square brackets # are removed by m4; they're present so that m4 does not expand # ; be careful, easy to get confused.) if ( set X `ls -t conftest.ts[12]` && { test "$*" != "X conftest.ts1 conftest.ts2" || test "$*" != "X conftest.ts2 conftest.ts1"; } ); then :; else # 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". printf "%s\n" ""Bad output from ls -t: \"`ls -t conftest.ts[12]`\""" >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment. See 'config.log' for more details" "$LINENO" 5; } fi for am_try_res in $am_try_resolutions; do # Any one fine-grained sleep might happen to cross the boundary # between two values of a coarser actual resolution, but if we do # two fine-grained sleeps in a row, at least one of them will fall # entirely within a coarse interval. echo alpha > conftest.ts1 sleep $am_try_res echo beta > conftest.ts2 sleep $am_try_res echo gamma > conftest.ts3 # We assume that 'ls -t' will make use of high-resolution # timestamps if the operating system supports them at all. if (set X `ls -t conftest.ts?` && test "$2" = conftest.ts3 && test "$3" = conftest.ts2 && test "$4" = conftest.ts1); then # # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, # because we don't need to test make. make_ok=true if test $am_try_res != 1; then # But if we've succeeded so far with a subsecond resolution, we # have one more thing to check: make. It can happen that # everything else supports the subsecond mtimes, but make doesn't; # notably on macOS, which ships make 3.81 from 2006 (the last one # released under GPLv2). https://bugs.gnu.org/68808 # # We test $MAKE if it is defined in the environment, else "make". # It might get overridden later, but our hope is that in practice # it does not matter: it is the system "make" which is (by far) # the most likely to be broken, whereas if the user overrides it, # probably they did so with a better, or at least not worse, make. # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html # # Create a Makefile (real tab character here): rm -f conftest.mk echo 'conftest.ts1: conftest.ts2' >conftest.mk echo ' touch conftest.ts2' >>conftest.mk # # Now, running # touch conftest.ts1; touch conftest.ts2; make # should touch ts1 because ts2 is newer. This could happen by luck, # but most often, it will fail if make's support is insufficient. So # test for several consecutive successes. # # (We reuse conftest.ts[12] because we still want to modify existing # files, not create new ones, per above.) n=0 make=${MAKE-make} until test $n -eq 3; do echo one > conftest.ts1 sleep $am_try_res echo two > conftest.ts2 # ts2 should now be newer than ts1 if $make -f conftest.mk | grep 'up to date' >/dev/null; then make_ok=false break # out of $n loop fi n=`expr $n + 1` done fi # if $make_ok; then # Everything we know to check worked out, so call this resolution good. am_cv_filesystem_timestamp_resolution=$am_try_res break # out of $am_try_res loop fi # Otherwise, we'll go on to check the next resolution. fi done rm -f conftest.ts? # (end _am_filesystem_timestamp_resolution) ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_filesystem_timestamp_resolution" >&5 printf "%s\n" "$am_cv_filesystem_timestamp_resolution" >&6; } # This check should not be cached, as it may vary across builds of # different projects. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "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). am_build_env_is_sane=no am_has_slept=no rm -f conftest.file for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file if ( 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 test "$2" = conftest.file ); then am_build_env_is_sane=yes break fi # Just in case. sleep "$am_cv_filesystem_timestamp_resolution" am_has_slept=yes done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_build_env_is_sane" >&5 printf "%s\n" "$am_build_env_is_sane" >&6; } if test "$am_build_env_is_sane" = no; then as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi # 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 test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1 then : else case e in #( e) ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ;; esac 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=`printf "%s\n" "$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 MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 ('*'coreutils) '* | \ *'BusyBox '* | \ '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 ;; esac fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use plain mkdir -p, # in the hope it doesn't have the bugs of ancient mkdir. MKDIR_P='mkdir -p' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 AM_DEFAULT_VERBOSITY=1 # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else case e in #( e) if printf "%s\n" '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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } AM_BACKSLASH='\' am__rm_f_notfound= if (rm -f && rm -fr && rm -rf) 2>/dev/null then : else case e in #( e) am__rm_f_notfound='""' ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking xargs -n works" >&5 printf %s "checking xargs -n works... " >&6; } if test ${am_cv_xargs_n_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3" then : am_cv_xargs_n_works=yes else case e in #( e) am_cv_xargs_n_works=no ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_xargs_n_works" >&5 printf "%s\n" "$am_cv_xargs_n_works" >&6; } if test "$am_cv_xargs_n_works" = yes then : am__xargs_n='xargs -n' else case e in #( e) am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "" "$am__xargs_n_arg"; done; }' ;; esac fi 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.3.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # 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 -' # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi ac_config_headers="$ac_config_headers config.h" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else case e in #( e) USE_MAINTAINER_MODE=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 printf "%s\n" "$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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$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= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 thus: # 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 printf %s "checking for library containing strerror... " >&6; } if test ${ac_cv_search_strerror+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char strerror (void); int main (void) { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_strerror=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_strerror+y} then : break fi done if test ${ac_cv_search_strerror+y} then : else case e in #( e) ac_cv_search_strerror=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 printf "%s\n" "$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$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= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 thus: # 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$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 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LEX+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 printf "%s\n" "$LEX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %{ #ifdef __cplusplus extern "C" #endif int yywrap(void); %} %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ #ifdef __cplusplus yyless ((yyinput () != 0)); #else yyless ((input () != 0)); #endif } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int yywrap (void) { return 1; } int main (void) { return ! yylex (); } _ACEOF { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex output file root" >&5 printf %s "checking for lex output file root... " >&6; } if test ${ac_cv_prog_lex_root+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_lex_root=unknown { { 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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && 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 fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 printf "%s\n" "$ac_cv_prog_lex_root" >&6; } if test "$ac_cv_prog_lex_root" = unknown then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find output from $LEX; giving up on $LEX" >&5 printf "%s\n" "$as_me: WARNING: cannot find output from $LEX; giving up on $LEX" >&2;} LEX=: LEXLIB= fi LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test ${LEXLIB+y} then : else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex library" >&5 printf %s "checking for lex library... " >&6; } if test ${ac_cv_lib_lex+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_LIBS="$LIBS" ac_found=false for ac_cv_lib_lex in 'none needed' -lfl -ll 'not found'; do case $ac_cv_lib_lex in #( 'none needed') : ;; #( 'not found') : break ;; #( *) : LIBS="$ac_cv_lib_lex $ac_save_LIBS" ;; #( *) : ;; esac 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_found=: fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if $ac_found; then break fi done LIBS="$ac_save_LIBS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 printf "%s\n" "$ac_cv_lib_lex" >&6; } if test "$ac_cv_lib_lex" = 'not found' then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required lex library not found; giving up on $LEX" >&5 printf "%s\n" "$as_me: WARNING: required lex library not found; giving up on $LEX" >&2;} LEX=: LEXLIB= elif test "$ac_cv_lib_lex" = 'none needed' then : LEXLIB='' else case e in #( e) LEXLIB=$ac_cv_lib_lex ;; esac fi ac_save_LIBS="$LIBS" LIBS= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing yywrap" >&5 printf %s "checking for library containing yywrap... " >&6; } if test ${ac_cv_search_yywrap+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char yywrap (void); int main (void) { return yywrap (); ; return 0; } _ACEOF for ac_lib in '' fl l do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_yywrap=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_yywrap+y} then : break fi done if test ${ac_cv_search_yywrap+y} then : else case e in #( e) ac_cv_search_yywrap=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_yywrap" >&5 printf "%s\n" "$ac_cv_search_yywrap" >&6; } ac_res=$ac_cv_search_yywrap if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" LEXLIB="$LIBS" fi LIBS="$ac_save_LIBS" ;; esac fi if test "$LEX" != : then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 printf %s "checking whether yytext is a pointer... " >&6; } if test ${ac_cv_prog_lex_yytext_pointer+y} then : printf %s "(cached) " >&6 else case e in #( e) # 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 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_compile "$LINENO" then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then printf "%s\n" "#define YYTEXT_POINTER 1" >>confdefs.h fi 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac 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+y} 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 case e in #( e) werr=false ;; esac 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 printf %s "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test ${enable_nls+y} then : enableval=$enable_nls; USE_NLS=$enableval else case e in #( e) USE_NLS=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MSGFMT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 printf "%s\n" "$MSGFMT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_GMSGFMT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 printf "%s\n" "$GMSGFMT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_XGETTEXT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 printf "%s\n" "$XGETTEXT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MSGMERGE+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 printf "%s\n" "$MSGMERGE" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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,^.*/,,'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for strerror in -lcposix" >&5 printf %s "checking for strerror in -lcposix... " >&6; } if test ${ac_cv_lib_cposix_strerror+y} then : printf %s "(cached) " >&6 else case e in #( e) 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. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char strerror (void); int main (void) { return strerror (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_cposix_strerror=yes else case e in #( e) ac_cv_lib_cposix_strerror=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cposix_strerror" >&5 printf "%s\n" "$ac_cv_lib_cposix_strerror" >&6; } if test "x$ac_cv_lib_cposix_strerror" = xyes then : LIBS="$LIBS -lcposix" fi ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" # Autoupdate added the next two lines to ensure that your configure # script's behavior did not change. They are probably safe to remove. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" EGREP_TRADITIONAL=$EGREP ac_cv_path_EGREP_TRADITIONAL=$EGREP { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 printf %s "checking for an ANSI C-conforming const... " >&6; } if test ${ac_cv_c_const+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __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}; /* IBM 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; } { /* IBM 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 case e in #( e) ac_cv_c_const=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then printf "%s\n" "#define const /**/" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for signed" >&5 printf %s "checking for signed... " >&6; } if test ${bh_cv_c_signed+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { signed char x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : bh_cv_c_signed=yes else case e in #( e) bh_cv_c_signed=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $bh_cv_c_signed" >&5 printf "%s\n" "$bh_cv_c_signed" >&6; } if test $bh_cv_c_signed = no; then printf "%s\n" "#define signed /**/" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 printf %s "checking for inline... " >&6; } if test ${ac_cv_c_inline+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 (void) {return 0; } $ac_kw foo_t foo (void) {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.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 printf "%s\n" "$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 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 case e in #( e) printf "%s\n" "#define off_t long int" >>confdefs.h ;; esac 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 case e in #( e) printf "%s\n" "#define size_t unsigned int" >>confdefs.h ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 printf %s "checking for long long... " >&6; } if test ${ac_cv_type_long_long+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ long long ll = 1LL; int i = 63; int main (void) { 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 case e in #( e) ac_cv_type_long_long=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long" >&5 printf "%s\n" "$ac_cv_type_long_long" >&6; } if test $ac_cv_type_long_long = yes; then printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long double" >&5 printf %s "checking for long double... " >&6; } if test ${gt_cv_c_long_double+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_long_double=yes else case e in #( e) gt_cv_c_long_double=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_long_double" >&5 printf "%s\n" "$gt_cv_c_long_double" >&6; } if test $gt_cv_c_long_double = yes; then printf "%s\n" "#define HAVE_LONG_DOUBLE 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5 printf %s "checking for wchar_t... " >&6; } if test ${gt_cv_c_wchar_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wchar_t foo = (wchar_t)'\0'; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_wchar_t=yes else case e in #( e) gt_cv_c_wchar_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5 printf "%s\n" "$gt_cv_c_wchar_t" >&6; } if test $gt_cv_c_wchar_t = yes; then printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 printf %s "checking for wint_t... " >&6; } if test ${gt_cv_c_wint_t+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include wint_t foo = (wchar_t)'\0'; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_wint_t=yes else case e in #( e) gt_cv_c_wint_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5 printf "%s\n" "$gt_cv_c_wint_t" >&6; } if test $gt_cv_c_wint_t = yes; then printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 printf %s "checking for inttypes.h... " >&6; } if test ${jm_ac_cv_header_inttypes_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { 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 case e in #( e) jm_ac_cv_header_inttypes_h=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_inttypes_h" >&5 printf "%s\n" "$jm_ac_cv_header_inttypes_h" >&6; } if test $jm_ac_cv_header_inttypes_h = yes; then printf "%s\n" "#define HAVE_INTTYPES_H_WITH_UINTMAX 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5 printf %s "checking for stdint.h... " >&6; } if test ${jm_ac_cv_header_stdint_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { 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 case e in #( e) jm_ac_cv_header_stdint_h=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $jm_ac_cv_header_stdint_h" >&5 printf "%s\n" "$jm_ac_cv_header_stdint_h" >&6; } if test $jm_ac_cv_header_stdint_h = yes; then printf "%s\n" "#define HAVE_STDINT_H_WITH_UINTMAX 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5 printf %s "checking for intmax_t... " >&6; } if test ${gt_cv_c_intmax_t+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 (void) { intmax_t x = -1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_c_intmax_t=yes else case e in #( e) gt_cv_c_intmax_t=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5 printf "%s\n" "$gt_cv_c_intmax_t" >&6; } if test $gt_cv_c_intmax_t = yes; then printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "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 test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" 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. # 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. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac 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 case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac 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 ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$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. # 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. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac 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 case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac 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 case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 printf %s "checking for egrep -e... " >&6; } if test ${ac_cv_path_EGREP_TRADITIONAL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then : fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi if test "$ac_cv_path_EGREP_TRADITIONAL" then : ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; 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_TRADITIONAL=$EGREP_TRADITIONAL fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf() supports POSIX/XSI format strings" >&5 printf %s "checking whether printf() supports POSIX/XSI format strings... " >&6; } if test ${gt_cv_func_printf_posix+y} then : printf %s "(cached) " >&6 else case e in #( e) 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_TRADITIONAL "notposix" >/dev/null 2>&1 then : gt_cv_func_printf_posix="guessing no" else case e in #( e) gt_cv_func_printf_posix="guessing yes" ;; esac fi rm -rf conftest* else case e in #( e) 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 case e in #( e) gt_cv_func_printf_posix=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_printf_posix" >&5 printf "%s\n" "$gt_cv_func_printf_posix" >&6; } case $gt_cv_func_printf_posix in *yes) printf "%s\n" "#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! { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 printf %s "checking for working alloca.h... " >&6; } if test ${ac_cv_working_alloca_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { 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 case e in #( e) ac_cv_working_alloca_h=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 printf "%s\n" "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 printf %s "checking for alloca... " >&6; } if test ${ac_cv_func_alloca_works+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_func_alloca_works=$ac_cv_working_alloca_h if test "$ac_cv_func_alloca_works" != yes then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef alloca # ifdef __GNUC__ # define alloca __builtin_alloca # elif defined _MSC_VER # include # define alloca _alloca # else # ifdef __cplusplus extern "C" # endif void *alloca (size_t); # endif #endif int main (void) { 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 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 printf "%s\n" "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then printf "%s\n" "#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 printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 printf %s "checking stack direction for C alloca... " >&6; } if test ${ac_cv_c_stack_direction+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : ac_cv_c_stack_direction=0 else case e in #( e) 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 case e in #( e) ac_cv_c_stack_direction=-1 ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 printf "%s\n" "$ac_cv_c_stack_direction" >&6; } printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h fi ac_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 printf %s "checking for working mmap... " >&6; } if test ${ac_cv_func_mmap_fixed_mapped+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on platforms where we know the result. linux*) ac_cv_func_mmap_fixed_mapped=yes ;; # If we don't know, assume the worst. *) ac_cv_func_mmap_fixed_mapped=no ;; esac else case e in #( e) 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. */ #include #include #ifndef getpagesize /* Prefer sysconf to the legacy getpagesize function, as getpagesize has been removed from POSIX and is limited to page sizes that fit in 'int'. */ # ifdef _SC_PAGESIZE # define getpagesize() sysconf (_SC_PAGESIZE) # elif defined _SC_PAGE_SIZE # define getpagesize() sysconf (_SC_PAGE_SIZE) # elif HAVE_GETPAGESIZE int getpagesize (); # else # 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 #endif int main (void) { char *data, *data2, *data3; const char *cdata2; long 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); /* 'return 8;' not currently used. */ /* 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); free (data); free (data3); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_mmap_fixed_mapped=yes else case e in #( e) ac_cv_func_mmap_fixed_mapped=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C Library 2.1 or newer" >&5 printf %s "checking whether we are using the GNU C Library 2.1 or newer... " >&6; } if test ${ac_cv_gnu_library_2_1+y} then : printf %s "(cached) " >&6 else case e in #( e) 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_TRADITIONAL "Lucky GNU user" >/dev/null 2>&1 then : ac_cv_gnu_library_2_1=yes else case e in #( e) ac_cv_gnu_library_2_1=no ;; esac fi rm -rf conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gnu_library_2_1" >&5 printf "%s\n" "$ac_cv_gnu_library_2_1" >&6; } GLIBC21="$ac_cv_gnu_library_2_1" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether integer division by zero raises SIGFPE" >&5 printf %s "checking whether integer division by zero raises SIGFPE... " >&6; } if test ${gt_cv_int_divbyzero_sigfpe+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case e in #( e) 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 case e in #( e) gt_cv_int_divbyzero_sigfpe=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_int_divbyzero_sigfpe" >&5 printf "%s\n" "$gt_cv_int_divbyzero_sigfpe" >&6; } case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac printf "%s\n" "#define INTDIV0_RAISES_SIGFPE $value" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unsigned long long" >&5 printf %s "checking for unsigned long long... " >&6; } if test ${ac_cv_type_unsigned_long_long+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned long long ull = 1ULL; int i = 63; int main (void) { 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 case e in #( e) ac_cv_type_unsigned_long_long=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long" >&5 printf "%s\n" "$ac_cv_type_unsigned_long_long" >&6; } if test $ac_cv_type_unsigned_long_long = yes; then printf "%s\n" "#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' printf "%s\n" "#define uintmax_t $ac_type" >>confdefs.h else printf "%s\n" "#define HAVE_UINTMAX_T 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5 printf %s "checking for inttypes.h... " >&6; } if test ${gt_cv_header_inttypes_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_header_inttypes_h=yes else case e in #( e) gt_cv_header_inttypes_h=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_header_inttypes_h" >&5 printf "%s\n" "$gt_cv_header_inttypes_h" >&6; } if test $gt_cv_header_inttypes_h = yes; then printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h fi if test $gt_cv_header_inttypes_h = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the inttypes.h PRIxNN macros are broken" >&5 printf %s "checking whether the inttypes.h PRIxNN macros are broken... " >&6; } if test ${gt_cv_inttypes_pri_broken+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef PRId32 char *p = PRId32; #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : gt_cv_inttypes_pri_broken=no else case e in #( e) gt_cv_inttypes_pri_broken=yes ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_inttypes_pri_broken" >&5 printf "%s\n" "$gt_cv_inttypes_pri_broken" >&6; } fi if test "$gt_cv_inttypes_pri_broken" = yes; then printf "%s\n" "#define PRI_MACROS_BROKEN 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes then : printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5 printf %s "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_TRADITIONAL "Found it" >/dev/null 2>&1 then : result=yes fi rm -rf conftest* if test -z "$result"; then if ac_fn_c_compute_int "$LINENO" "~(size_t)0 / 10" "res_hi" "#include " then : else case e in #( e) result=? ;; esac fi if ac_fn_c_compute_int "$LINENO" "~(size_t)0 % 10" "res_lo" "#include " then : else case e in #( e) result=? ;; esac fi if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include " then : else case e in #( e) result=? ;; esac 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 (void) { ; 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.beam 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $result" >&5 printf "%s\n" "$result" >&6; } if test "$result" != yes; then printf "%s\n" "#define SIZE_MAX $result" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes then : printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h fi 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+y} then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else case e in #( e) with_gnu_ld=no ;; esac 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${acl_cv_path_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi LD="$acl_cv_path_LD" if test -n "$LD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${acl_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else case e in #( e) # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 printf %s "checking for shared library run path origin... " >&6; } if test ${acl_cv_rpath+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 printf "%s\n" "$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+y} then : enableval=$enable_rpath; : else case e in #( e) enable_rpath=yes ;; esac 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+y} 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 case e in #( e) printf "%s\n" "#define ptrdiff_t long" >>confdefs.h ;; esac fi ac_fn_c_check_header_compile "$LINENO" "argz.h" "ac_cv_header_argz_h" "$ac_includes_default" if test "x$ac_cv_header_argz_h" = xyes then : printf "%s\n" "#define HAVE_ARGZ_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes then : printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes then : printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "nl_types.h" "ac_cv_header_nl_types_h" "$ac_includes_default" if test "x$ac_cv_header_nl_types_h" = xyes then : printf "%s\n" "#define HAVE_NL_TYPES_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" if test "x$ac_cv_header_malloc_h" = xyes then : printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default" if test "x$ac_cv_header_stddef_h" = xyes then : printf "%s\n" "#define HAVE_STDDEF_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes then : printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes then : printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes then : printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes then : printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "asprintf" "ac_cv_func_asprintf" if test "x$ac_cv_func_asprintf" = xyes then : printf "%s\n" "#define HAVE_ASPRINTF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "fwprintf" "ac_cv_func_fwprintf" if test "x$ac_cv_func_fwprintf" = xyes then : printf "%s\n" "#define HAVE_FWPRINTF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" if test "x$ac_cv_func_getcwd" = xyes then : printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getegid" "ac_cv_func_getegid" if test "x$ac_cv_func_getegid" = xyes then : printf "%s\n" "#define HAVE_GETEGID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid" if test "x$ac_cv_func_geteuid" = xyes then : printf "%s\n" "#define HAVE_GETEUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getgid" "ac_cv_func_getgid" if test "x$ac_cv_func_getgid" = xyes then : printf "%s\n" "#define HAVE_GETGID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getuid" "ac_cv_func_getuid" if test "x$ac_cv_func_getuid" = xyes then : printf "%s\n" "#define HAVE_GETUID 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy" if test "x$ac_cv_func_mempcpy" = xyes then : printf "%s\n" "#define HAVE_MEMPCPY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "munmap" "ac_cv_func_munmap" if test "x$ac_cv_func_munmap" = xyes then : printf "%s\n" "#define HAVE_MUNMAP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" if test "x$ac_cv_func_putenv" = xyes then : printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" if test "x$ac_cv_func_setenv" = xyes then : printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes then : printf "%s\n" "#define HAVE_SETLOCALE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" if test "x$ac_cv_func_snprintf" = xyes then : printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy" if test "x$ac_cv_func_stpcpy" = xyes then : printf "%s\n" "#define HAVE_STPCPY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes then : printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" if test "x$ac_cv_func_strdup" = xyes then : printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strtoul" "ac_cv_func_strtoul" if test "x$ac_cv_func_strtoul" = xyes then : printf "%s\n" "#define HAVE_STRTOUL 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch" if test "x$ac_cv_func_tsearch" = xyes then : printf "%s\n" "#define HAVE_TSEARCH 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen" if test "x$ac_cv_func_wcslen" = xyes then : printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__argz_count" "ac_cv_func___argz_count" if test "x$ac_cv_func___argz_count" = xyes then : printf "%s\n" "#define HAVE___ARGZ_COUNT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__argz_stringify" "ac_cv_func___argz_stringify" if test "x$ac_cv_func___argz_stringify" = xyes then : printf "%s\n" "#define HAVE___ARGZ_STRINGIFY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__argz_next" "ac_cv_func___argz_next" if test "x$ac_cv_func___argz_next" = xyes then : printf "%s\n" "#define HAVE___ARGZ_NEXT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "__fsetlocking" "ac_cv_func___fsetlocking" if test "x$ac_cv_func___fsetlocking" = xyes then : printf "%s\n" "#define HAVE___FSETLOCKING 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _snprintf is declared" >&5 printf %s "checking whether _snprintf is declared... " >&6; } if test ${ac_cv_have_decl__snprintf+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #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 case e in #( e) ac_cv_have_decl__snprintf=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snprintf" >&5 printf "%s\n" "$ac_cv_have_decl__snprintf" >&6; } if test $ac_cv_have_decl__snprintf = yes; then gt_value=1 else gt_value=0 fi printf "%s\n" "#define HAVE_DECL__SNPRINTF $gt_value" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _snwprintf is declared" >&5 printf %s "checking whether _snwprintf is declared... " >&6; } if test ${ac_cv_have_decl__snwprintf+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #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 case e in #( e) ac_cv_have_decl__snwprintf=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl__snwprintf" >&5 printf "%s\n" "$ac_cv_have_decl__snwprintf" >&6; } if test $ac_cv_have_decl__snwprintf = yes; then gt_value=1 else gt_value=0 fi printf "%s\n" "#define HAVE_DECL__SNWPRINTF $gt_value" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether feof_unlocked is declared" >&5 printf %s "checking whether feof_unlocked is declared... " >&6; } if test ${ac_cv_have_decl_feof_unlocked+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #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 case e in #( e) ac_cv_have_decl_feof_unlocked=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_feof_unlocked" >&5 printf "%s\n" "$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 printf "%s\n" "#define HAVE_DECL_FEOF_UNLOCKED $gt_value" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fgets_unlocked is declared" >&5 printf %s "checking whether fgets_unlocked is declared... " >&6; } if test ${ac_cv_have_decl_fgets_unlocked+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #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 case e in #( e) ac_cv_have_decl_fgets_unlocked=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_fgets_unlocked" >&5 printf "%s\n" "$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 printf "%s\n" "#define HAVE_DECL_FGETS_UNLOCKED $gt_value" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getc_unlocked is declared" >&5 printf %s "checking whether getc_unlocked is declared... " >&6; } if test ${ac_cv_have_decl_getc_unlocked+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #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 case e in #( e) ac_cv_have_decl_getc_unlocked=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_decl_getc_unlocked" >&5 printf "%s\n" "$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 printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $gt_value" >>confdefs.h 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 printf %s "checking for iconv... " >&6; } if test ${am_cv_func_iconv+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 (void) { 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.beam \ 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 (void) { 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.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 printf "%s\n" "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 printf %s "checking how to link with libiconv... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 printf "%s\n" "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi if test "$am_cv_func_iconv" = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 printf %s "checking for iconv declaration... " >&6; } if test ${am_cv_proto_iconv+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : am_cv_proto_iconv_arg1="" else case e in #( e) am_cv_proto_iconv_arg1="const" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam 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);" ;; esac fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${ac_t:- }$am_cv_proto_iconv" >&5 printf "%s\n" "${ac_t:- }$am_cv_proto_iconv" >&6; } printf "%s\n" "#define ICONV_CONST $am_cv_proto_iconv_arg1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5 printf %s "checking for nl_langinfo and CODESET... " >&6; } if test ${am_cv_langinfo_codeset+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { char* cs = nl_langinfo(CODESET); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_langinfo_codeset=yes else case e in #( e) am_cv_langinfo_codeset=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5 printf "%s\n" "$am_cv_langinfo_codeset" >&6; } if test $am_cv_langinfo_codeset = yes; then printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h fi if test $ac_cv_header_locale_h = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 printf %s "checking for LC_MESSAGES... " >&6; } if test ${am_cv_val_LC_MESSAGES+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : am_cv_val_LC_MESSAGES=yes else case e in #( e) am_cv_val_LC_MESSAGES=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 printf "%s\n" "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then printf "%s\n" "#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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_INTLBISON+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_INTLBISON="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi INTLBISON=$ac_cv_prog_INTLBISON if test -n "$INTLBISON"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLBISON" >&5 printf "%s\n" "$INTLBISON" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$INTLBISON" && break done if test -z "$INTLBISON"; then ac_verc_fail=yes else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking version of bison" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_prog_version" >&5 printf "%s\n" "$ac_prog_version" >&6; } fi if test $ac_verc_fail = yes; then INTLBISON=: fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 printf %s "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test ${enable_nls+y} then : enableval=$enable_nls; USE_NLS=$enableval else case e in #( e) USE_NLS=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether included gettext is requested" >&5 printf %s "checking whether included gettext is requested... " >&6; } # Check whether --with-included-gettext was given. if test ${with_included_gettext+y} then : withval=$with_included_gettext; nls_cv_force_use_gnu_gettext=$withval else case e in #( e) nls_cv_force_use_gnu_gettext=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nls_cv_force_use_gnu_gettext" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 printf %s "checking for GNU gettext in libc... " >&6; } if test ${gt_cv_func_gnugettext1_libc+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main (void) { 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 case e in #( e) gt_cv_func_gnugettext1_libc=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libc" >&5 printf "%s\n" "$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+y} 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 printf %s "checking for GNU gettext in libintl... " >&6; } if test ${gt_cv_func_gnugettext1_libintl+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 (void) { 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 case e in #( e) gt_cv_func_gnugettext1_libintl=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ 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 (void) { 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.beam \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 printf "%s\n" "$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 printf "%s\n" "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 printf %s "checking whether to use NLS... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 printf "%s\n" "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 printf %s "checking how to link with libintl... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 printf "%s\n" "$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 printf "%s\n" "#define HAVE_GETTEXT 1" >>confdefs.h printf "%s\n" "#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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.37" >&5 printf %s "checking for intltool >= 0.37... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_INTLTOOL_UPDATE+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_UPDATE="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 printf "%s\n" "$INTLTOOL_UPDATE" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_INTLTOOL_MERGE+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_MERGE="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 printf "%s\n" "$INTLTOOL_MERGE" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_INTLTOOL_EXTRACT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 printf "%s\n" "$INTLTOOL_EXTRACT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_XGETTEXT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_XGETTEXT="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 printf "%s\n" "$XGETTEXT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MSGMERGE+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_MSGMERGE="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 printf "%s\n" "$MSGMERGE" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_MSGFMT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_MSGFMT="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 printf "%s\n" "$MSGFMT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_GMSGFMT+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 printf "%s\n" "$GMSGFMT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_INTLTOOL_PERL+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_INTLTOOL_PERL="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 printf "%s\n" "$INTLTOOL_PERL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 printf %s "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"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 printf "%s\n" "$IT_PERL_VERSION" >&6; } fi if test "xno-xml" != "xno-xml"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 printf %s "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "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 GETTEXT_PACKAGE=mdk printf "%s\n" "#define GETTEXT_PACKAGE \"$GETTEXT_PACKAGE\"" >>confdefs.h test "x$prefix" = xNONE && prefix=$ac_default_prefix printf "%s\n" "#define LOCALEDIR \"${prefix}/share/locale\"" >>confdefs.h # Check whether --with-readline was given. if test ${with_readline+y} 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 case e in #( e) readl=true ;; esac fi if test x$readl = xtrue; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for initscr in -lncurses" >&5 printf %s "checking for initscr in -lncurses... " >&6; } if test ${ac_cv_lib_ncurses_initscr+y} then : printf %s "(cached) " >&6 else case e in #( e) 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. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char initscr (void); int main (void) { return initscr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_ncurses_initscr=yes else case e in #( e) ac_cv_lib_ncurses_initscr=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_initscr" >&5 printf "%s\n" "$ac_cv_lib_ncurses_initscr" >&6; } if test "x$ac_cv_lib_ncurses_initscr" = xyes then : printf "%s\n" "#define HAVE_LIBNCURSES 1" >>confdefs.h LIBS="-lncurses $LIBS" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find ncurses lib" >&5 printf "%s\n" "$as_me: WARNING: Cannot find ncurses lib" >&2;}; readl=false ;; esac fi fi if test x$readl = xtrue; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 printf %s "checking for readline in -lreadline... " >&6; } if test ${ac_cv_lib_readline_readline+y} then : printf %s "(cached) " >&6 else case e in #( e) 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. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char readline (void); int main (void) { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_readline_readline=yes else case e in #( e) ac_cv_lib_readline_readline=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 printf "%s\n" "$ac_cv_lib_readline_readline" >&6; } if test "x$ac_cv_lib_readline_readline" = xyes then : printf "%s\n" "#define HAVE_LIBREADLINE 1" >>confdefs.h LIBS="-lreadline $LIBS" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GNU readline lib" >&5 printf "%s\n" "$as_me: WARNING: Cannot find GNU readline lib" >&2;}; readl=false ;; esac fi fi if test x$readl = xtrue; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for add_history in -lhistory" >&5 printf %s "checking for add_history in -lhistory... " >&6; } if test ${ac_cv_lib_history_add_history+y} then : printf %s "(cached) " >&6 else case e in #( e) 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. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char add_history (void); int main (void) { return add_history (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_history_add_history=yes else case e in #( e) ac_cv_lib_history_add_history=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_history_add_history" >&5 printf "%s\n" "$ac_cv_lib_history_add_history" >&6; } if test "x$ac_cv_lib_history_add_history" = xyes then : printf "%s\n" "#define HAVE_LIBHISTORY 1" >>confdefs.h LIBS="-lhistory $LIBS" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GNU history lib" >&5 printf "%s\n" "$as_me: WARNING: Cannot find GNU history lib" >&2;}; readl=false ;; esac fi 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 : printf "%s\n" "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h fi 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 printf "%s\n" "$PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for glib-2.0 >= 2.0" >&5 printf %s "checking for glib-2.0 >= 2.0... " >&6; } if test -n "$GLIB_CFLAGS"; then pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$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=$? printf "%s\n" "$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" && \ { { printf "%s\n" "$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=$? printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi # Check whether --with-guile was given. if test ${with_guile+y} 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 case e in #( e) wguile=true ;; esac fi if test x$wguile = xtrue; then pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for guile-3.0 >= 3.0" >&5 printf %s "checking for guile-3.0 >= 3.0... " >&6; } if test -n "$GUILE_CFLAGS"; then pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-3.0 >= 3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "guile-3.0 >= 3.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-3.0 >= 3.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" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-3.0 >= 3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "guile-3.0 >= 3.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-3.0 >= 3.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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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-3.0 >= 3.0" 2>&1` else GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-3.0 >= 3.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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } wguile=false else GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS GUILE_LIBS=$pkg_cv_GUILE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } wguile=true fi if test x$wguile = xfalse; then pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for guile-2.2 >= 2.2" >&5 printf %s "checking for guile-2.2 >= 2.2... " >&6; } if test -n "$GUILE_CFLAGS"; then pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.2 >= 2.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "guile-2.2 >= 2.2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-2.2 >= 2.2" 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" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.2 >= 2.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "guile-2.2 >= 2.2") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-2.2 >= 2.2" 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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.2 >= 2.2" 2>&1` else GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-2.2 >= 2.2" 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } wguile=false else GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS GUILE_LIBS=$pkg_cv_GUILE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } wguile=true fi if test x$wguile = xfalse; then pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for guile-2.0 >= 2.0" >&5 printf %s "checking for guile-2.0 >= 2.0... " >&6; } if test -n "$GUILE_CFLAGS"; then pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$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=$? printf "%s\n" "$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" && \ { { printf "%s\n" "$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=$? printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } wguile=false else GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS GUILE_LIBS=$pkg_cv_GUILE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } wguile=true fi fi 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+y} 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 case e in #( e) gui=true ;; esac fi if test x$gui = xtrue; then pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gtk+-3.0 >= 3.14 pango >= 1.4" >&5 printf %s "checking for gtk+-3.0 >= 3.14 pango >= 1.4... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.14 pango >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.14 pango >= 1.4") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.14 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" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.14 pango >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.14 pango >= 1.4") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.14 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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+-3.0 >= 3.14 pango >= 1.4" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-3.0 >= 3.14 pango >= 1.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&5 printf "%s\n" "$as_me: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&2;} gui=false elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find GTK+/Glade/Pango: the GUI shall not be built" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "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 : printf "%s\n" "#define HAVE_GETOPT_LONG 1" >>confdefs.h else case e in #( e) case " $LIBOBJS " in *" getopt_long.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext" ;; esac ;; 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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; esac 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 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 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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU MDK $as_me 1.3.1, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" 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 ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ GNU MDK config.status 1.3.1 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' 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 ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # 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+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || 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=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac 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@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t 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"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # 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 || printf "%s\n" 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) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See 'config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi 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.3.1/samples/0000775000175000017500000000000015065042311007473 5mdk-1.3.1/samples/hello.mixal0000644000175000017500000000021010770465100011544 * 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.3.1/samples/primes.result0000644000175000017500000000704510770465100012161 FIRST 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.3.1/samples/permutations.cardrd0000644000175000017500000000024010770465100013323 ( A C F G ) ( B C D ) ( A E D ) ( F A D E ) ( B g F a E ) = mdk-1.3.1/samples/mystery.mixal0000644000175000017500000000045312112755472012174 * 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.3.1/samples/tests/0000775000175000017500000000000015065042311010635 5mdk-1.3.1/samples/tests/stress1.mixal0000644000175000017500000000024610770465100013220 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.3.1/samples/tests/minus_zero.mixal0000644000175000017500000000032213415024407014001 ORIG 3000 START ENTA 1 STA 1000 LDA 0 DECA 1 ADD 1000 HLT END 3000 mdk-1.3.1/samples/tests/bt.mixal0000644000175000017500000000010310770465100012211 ORIG 0 BEG JMP *+1 JMP *+1 FOO JMP BAR BAR HLT END BEG mdk-1.3.1/samples/tests/cbp.mixal0000644000175000017500000000031610770465100012356 * 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.3.1/samples/tests/dup_f.mixal0000644000175000017500000000006213415160546012712 START LDA 1(4:4),1(5:5) HLT END START mdk-1.3.1/samples/tests/stress4.mixal0000644000175000017500000000015010770465100013215 ORIG 2000 ST NOP ENTA FUT ** Whoa, mdk tells me FUT is never defined... FUT EQU 69 HLT END ST mdk-1.3.1/samples/tests/stress6.mixal0000644000175000017500000000032510770465100013223 * 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.3.1/samples/tests/stress0.mixal0000644000175000017500000000017010770465100013213 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.3.1/samples/tests/ldan.mixal0000644000175000017500000000012212112755472012531 VAR ORIG *+1 BEGIN LDAN VAR(1:5) LDXN VAR(1:5) HLT END BEGIN mdk-1.3.1/samples/tests/lockonw.mixal0000644000175000017500000000007210770465100013265 * test for bug #5654 START CMPA =0=(1:4) END START mdk-1.3.1/samples/tests/Makefile.am0000644000175000017500000000137713415160517012625 ## Process this file with automake to produce Makefile.in # Copyright (C) 2006, 2019 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 \ minus_zero.mixal dup_f.mixal \ stress0.mixal stress1.mixal stress2.mixal stress4.mixal \ stress5.mixal stress6.mixal mdk-1.3.1/samples/tests/stress2.mixal0000644000175000017500000000014112112755472013221 ORIG 1999 ST NOP SYM EQU ST+1 SYM2 CON SYM2+1 SYM3 ORIG SYM3+2 HLT SYM4 END SYM4+1 mdk-1.3.1/samples/tests/stress5.mixal0000644000175000017500000000051410770465100013222 * 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.3.1/samples/tests/Makefile.in0000664000175000017500000003477715065042013012643 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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, 2019 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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 \ minus_zero.mixal dup_f.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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/samples/tests/negwrite.mixal0000644000175000017500000000012710770465100013436 * test for bug #5649: invalid address in OUT START OUT -1(18) HLT END START mdk-1.3.1/samples/permutations.mixal0000644000175000017500000000211110770465100013175 * 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.3.1/samples/elevator.mixal0000644000175000017500000002242712112755472012306 *** 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.3.1/samples/primes.mixal0000644000175000017500000000120110770465100011741 * 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.3.1/samples/echo.mixal0000644000175000017500000000031110770465100011361 * 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.3.1/samples/Makefile.am0000644000175000017500000000135413415160443011454 ## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2004, 2006, 2013, 2019 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.3.1/samples/isains.mixal0000644000175000017500000000417212112755472011750 B 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.3.1/samples/Makefile.in0000664000175000017500000005126515065042013011470 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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, 2019 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 distdir-am 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/autogen.sh0000755000175000017500000000350512112755472007762 #!/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.3.1/config.rpath0000755000175000017500000003521314171035244010265 #! /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=/' < 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, 2019, 2020, 2022 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.3.1/aclocal.m40000664000175000017500000022404215064375041007623 # generated automatically by aclocal 1.17 -*- Autoconf -*- # Copyright (C) 1996-2024 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.72],, [m4_warning([this file was generated for autoconf 2.72. 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) 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], ...) # pkg.m4 - Macros to locate and use pkg-config. -*- Autoconf -*- # serial 12 (pkg-config-0.29.2) 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.2]) 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 occurrence 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 $2]) _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 dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2024 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.17' 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.17], [], [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.17])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-2024 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-2024 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-2024 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 thus: # 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-2024 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2024 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 m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])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_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([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 ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) 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 AC_REQUIRE([_AM_PROG_RM_F]) AC_REQUIRE([_AM_PROG_XARGS_N]) 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-2024 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-2024 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-2024 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([OPTIONS]) # ---------------------- # 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_PROVIDE_IFELSE([AC_PROG_LEX], [], [AC_PROG_LEX($@)]) dnl Do not dnl on previous line, or output has "fiif". if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2024 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-2024 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 whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2024 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 MISSING="\${SHELL} '$am_aux_dir/missing'" 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-2024 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], [m4_warn([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 m4_warn([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-2024 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-2024 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) 2022-2024 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_RM_F # --------------- # Check whether 'rm -f' without any arguments works. # https://bugs.gnu.org/10828 AC_DEFUN([_AM_PROG_RM_F], [am__rm_f_notfound= AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""']) AC_SUBST(am__rm_f_notfound) ]) # Copyright (C) 2001-2024 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-2024 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_SLEEP_FRACTIONAL_SECONDS # ---------------------------- AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl AC_CACHE_CHECK([whether sleep supports fractional seconds], am_cv_sleep_fractional_seconds, [dnl AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes], [am_cv_sleep_fractional_seconds=no]) ])]) # _AM_FILESYSTEM_TIMESTAMP_RESOLUTION # ----------------------------------- # Determine the filesystem's resolution for file modification # timestamps. The coarsest we know of is FAT, with a resolution # of only two seconds, even with the most recent "exFAT" extensions. # The finest (e.g. ext4 with large inodes, XFS, ZFS) is one # nanosecond, matching clock_gettime. However, it is probably not # possible to delay execution of a shell script for less than one # millisecond, due to process creation overhead and scheduling # granularity, so we don't check for anything finer than that. (See below.) AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS]) AC_CACHE_CHECK([filesystem timestamp resolution], am_cv_filesystem_timestamp_resolution, [dnl # Default to the worst case. am_cv_filesystem_timestamp_resolution=2 # Only try to go finer than 1 sec if sleep can do it. # Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, # - 1 sec is not much of a win compared to 2 sec, and # - it takes 2 seconds to perform the test whether 1 sec works. # # Instead, just use the default 2s on platforms that have 1s resolution, # accept the extra 1s delay when using $sleep in the Automake tests, in # exchange for not incurring the 2s delay for running the test for all # packages. # am_try_resolutions= if test "$am_cv_sleep_fractional_seconds" = yes; then # Even a millisecond often causes a bunch of false positives, # so just try a hundredth of a second. The time saved between .001 and # .01 is not terribly consequential. am_try_resolutions="0.01 0.1 $am_try_resolutions" fi # In order to catch current-generation FAT out, we must *modify* files # that already exist; the *creation* timestamp is finer. Use names # that make ls -t sort them differently when they have equal # timestamps than when they have distinct timestamps, keeping # in mind that ls -t prints the *newest* file first. rm -f conftest.ts? : > conftest.ts1 : > conftest.ts2 : > conftest.ts3 # Make sure ls -t actually works. Do 'set' in a subshell so we don't # clobber the current shell's arguments. (Outer-level square brackets # are removed by m4; they're present so that m4 does not expand # ; be careful, easy to get confused.) if ( set X `[ls -t conftest.ts[12]]` && { test "$[]*" != "X conftest.ts1 conftest.ts2" || test "$[]*" != "X conftest.ts2 conftest.ts1"; } ); then :; else # 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_ECHO_UNQUOTED( ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""], [AS_MESSAGE_LOG_FD]) AC_MSG_FAILURE([ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment.]) fi for am_try_res in $am_try_resolutions; do # Any one fine-grained sleep might happen to cross the boundary # between two values of a coarser actual resolution, but if we do # two fine-grained sleeps in a row, at least one of them will fall # entirely within a coarse interval. echo alpha > conftest.ts1 sleep $am_try_res echo beta > conftest.ts2 sleep $am_try_res echo gamma > conftest.ts3 # We assume that 'ls -t' will make use of high-resolution # timestamps if the operating system supports them at all. if (set X `ls -t conftest.ts?` && test "$[]2" = conftest.ts3 && test "$[]3" = conftest.ts2 && test "$[]4" = conftest.ts1); then # # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, # because we don't need to test make. make_ok=true if test $am_try_res != 1; then # But if we've succeeded so far with a subsecond resolution, we # have one more thing to check: make. It can happen that # everything else supports the subsecond mtimes, but make doesn't; # notably on macOS, which ships make 3.81 from 2006 (the last one # released under GPLv2). https://bugs.gnu.org/68808 # # We test $MAKE if it is defined in the environment, else "make". # It might get overridden later, but our hope is that in practice # it does not matter: it is the system "make" which is (by far) # the most likely to be broken, whereas if the user overrides it, # probably they did so with a better, or at least not worse, make. # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html # # Create a Makefile (real tab character here): rm -f conftest.mk echo 'conftest.ts1: conftest.ts2' >conftest.mk echo ' touch conftest.ts2' >>conftest.mk # # Now, running # touch conftest.ts1; touch conftest.ts2; make # should touch ts1 because ts2 is newer. This could happen by luck, # but most often, it will fail if make's support is insufficient. So # test for several consecutive successes. # # (We reuse conftest.ts[12] because we still want to modify existing # files, not create new ones, per above.) n=0 make=${MAKE-make} until test $n -eq 3; do echo one > conftest.ts1 sleep $am_try_res echo two > conftest.ts2 # ts2 should now be newer than ts1 if $make -f conftest.mk | grep 'up to date' >/dev/null; then make_ok=false break # out of $n loop fi n=`expr $n + 1` done fi # if $make_ok; then # Everything we know to check worked out, so call this resolution good. am_cv_filesystem_timestamp_resolution=$am_try_res break # out of $am_try_res loop fi # Otherwise, we'll go on to check the next resolution. fi done rm -f conftest.ts? # (end _am_filesystem_timestamp_resolution) ])]) # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION]) # This check should not be cached, as it may vary across builds of # different projects. 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). am_build_env_is_sane=no am_has_slept=no rm -f conftest.file for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file if ( 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 test "$[]2" = conftest.file ); then am_build_env_is_sane=yes break fi # Just in case. sleep "$am_cv_filesystem_timestamp_resolution" am_has_slept=yes done AC_MSG_RESULT([$am_build_env_is_sane]) if test "$am_build_env_is_sane" = no; then AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ]) 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-2024 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 # ---------------- # Enable less verbose build rules support. AC_DEFUN([_AM_SILENT_RULES], [AM_DEFAULT_VERBOSITY=1 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 ]) 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]) 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 dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls dnl to AM_SILENT_RULES to change the default value. AC_CONFIG_COMMANDS_PRE([dnl case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; esac 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 ])dnl ]) # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or # empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_REQUIRE([_AM_SILENT_RULES]) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])]) # Copyright (C) 2001-2024 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-2024 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-2024 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 x$am_uid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work]) elif 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 x$gm_gid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work]) elif 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 # Copyright (C) 2022-2024 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_XARGS_N # ---------------- # Check whether 'xargs -n' works. It should work everywhere, so the fallback # is not optimized at all as we never expect to use it. AC_DEFUN([_AM_PROG_XARGS_N], [AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])]) AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }' ])dnl AC_SUBST(am__xargs_n) ]) 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.3.1/config.h.in0000664000175000017500000002053715064375041010011 /* config.h.in. Generated from configure.ac by autoheader. */ /* 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 works. */ #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 '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_STDIO_H /* 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 all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* 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 as 'unsigned int' if doesn't define. */ #undef size_t /* Define to unsigned long or unsigned long long if and don't define. */ #undef uintmax_t mdk-1.3.1/compile0000755000175000017500000001670514767572401007354 #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2024-06-19.01; # UTC # Copyright (C) 1999-2024 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* | MSYS*) 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/* | msys/*) 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 | *.lo | *.[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 . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mdk-1.3.1/COPYING0000644000175000017500000010451312112755472007015 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.3.1/THANKS0000644000175000017500000000573012636570514006701 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, 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.3.1/ChangeLog0000644000175000017500000004420615065042311007525 2025-09-23 Jose Antonio Ortega Ruiz Compilation fixes for gcc 15 (Peter Pentchev) 2022-01-16 Jose Antonio Ortega Ruiz version bump autoupdate updates Fix: missing MIX_CMD_SBT Thanks to Kevin Sun. 2020-10-31 Jose Antonio Ortega Ruiz Images for the PDF and DVI manuals NEWS for 1.3.0 New gendocs.sh version 2020-10-20 Jose Antonio Ortega Ruiz Interface nits 2020-10-19 Jose Antonio Ortega Ruiz goto address dialog Year range in --version messages Nit: Ctrl+q to quit Version bump First fully functional GTK3 Current line and breakpoint icons Gimme back my fonts (deprecated) Stock icon for quit app attach/detach buttons 2020-10-18 Jose Antonio Ortega Ruiz mixgtk_widget_factory_get_by_name Show/hide toolbars Toolbars visible again gtk-builder-tool simplify Use g_error_free gtk_widget_reparent deprecation G_INLINE_FUNC deprecated Work in progress Mirgration to GTK+3: widget lookup fixes Mirgration to GTK+3: seemingly safe changes mixal-mode.el synchronised with emacs's 2020-10-16 Jose Antonio Ortega Ruiz Doc versions updates 2020-10-15 Jose Antonio Ortega Ruiz Typo Support for Guile 3.x NEWS updated Documentation typo (fixes #59239) 2019-04-09 Jose Antonio Ortega Ruiz Change vm->address_list from GSList to GQueue The current emulator uses an unbounded linked list for tracking the memory locations our program has traveled through. On a 64 bit system, this requires 16 bytes of data for every instruction a MIX program performs. For small programs that are light on computation cycles, this does not cause a noticeable issue. For programs that execute hundreds of millions of instructions, this causes the memory footprint of the virtual machine to explode. I have attached an example MIXAL program that will cause the VM to grow to over 3 GB of memory usage when run. To run the sample, compile coin-opt.mixal (attached), run it in mixvm, and enter 499 at the prompt. Or use the following steps. This patch changes all the appropriate references to GQueue references and also caps the backtrace at 1000, which can be changed in the mixlib/mix_vm.h header. I feel like 1000 is a reasonable limit for the vast majority of debugging needs. Most people are looking back at the most recent 100 instructions or so. You can get the original behavior (unlimited tracing) back by setting the MIX_MAXTRACE to -1, albeit with a slightly higher memory cost (24 bytes per instruction). Or you can turn it off entirely by setting it to 0. Using a queue doesn't change the logic of the program in any significant way, and it allows programs to run for an extended period of time without consuming all the memory on the machine and slowing down to a crawl. -Kevin Brunelle 2019-04-09 Jose Antonio Ortega Ruiz GTK Console input no longer overruns buffer Patch by Kevin Brunelle The console input in gmixvm will only read 70 characters, but the outer loop used 70 (the characters) instead of 14 (the number of words). This caused the VM to read past the end of the buffer and write 56 words of junk into the emulator. 2019-04-09 Jose Antonio Ortega Ruiz Support IOC commands for disk/drum devices Thanks to Kevin Brunelle There is a minor fix included with regards to tape devices. The test was failing if M == 0, when it should fail when M != 0. NOTICE: This patch changes the behavior of the VM and changes the function parameters for the ioc_ function. Documentation changes are included. Permits the following: LDX BLKNUM IOC 0(8) OUT ADDR(8) Write block from ADDR into disk[BLKNUM] IOC 0(8) IN ADDR(8) Read block from disk[BLKNUM] into ADDR ... BLKNUM CON 45000 Example possible block on disk I was having an issue writing a block to a drive and then reading back the same block. Because it is impossible to move the SEEK_CUR pointer backwards on a disk device, there was no way for a program to read back a block that it wrote to a disk without restarting or fiddling with ~/.mdk/disk?.dev files and symbolic links. I have added a function parameter to the ioc_ function and used it to pass the value of rX to ioc_. This permits us to use IOC commands to move the read/write head on a disk/drum device. I believe that this conforms to the potential meaning of Knuth's description of IOC for disk/drum devices. I have put in tests to verify that rX is positive and M = 0. I have updated the documentation to reflect this new behavior. This makes disks much more usable. Note: I won't be offended if this patch is rejected because it changed the behavior of the VM. I think it fits the spirit and enhances the functionality in a way that some might find useful. I wanted it for something I was working on, and I felt others might want the same. The thing with the paper-tape should be fixed, though. 2019-03-20 Jose Antonio Ortega Ruiz NEWS and version bump 2019-03-20 Jose Antonio Ortega Ruiz Fix: correctly rewind tape According to the specification, if M < 0, the tape is skipped backwards M blocks, or to the beginning of the tape, whichever comes first. In the implementation, we don't check to verify that we aren't seeking past the beginning of the file. This causes fseek(3) to fail, and it leaves us at the position we were at. Diagnosis and fix by Kevin Brunelle. 2019-03-19 Jose Antonio Ortega Ruiz NEWS updates Fix: allow access to last mem cell in devices (#9773) Author: Kevin Brunelle 2019-03-11 Jose Antonio Ortega Ruiz Obsolete string-to-int removed in favour of string-to-number Thanks to Thomas Matecki. Fixes #bug 55877 and makes mixvm, Philip King's child, work again! 2019-01-08 Jose Antonio Ortega Ruiz Version 1.2.10 NEWS for 1.2.10 Fix for mixasm infinite loop on invalid F-specs (bug #32452) Thanks to Sascha Wilde. Fix for bug #43634: keep sign of rA for ADD/SUB yielding 0 Fix for bug #47208: correctly store immediate constants We were taking only the first 3 bits of the index byte in a the word representing immediate constants, so that, for instance, =262143=, representing 00 00 63 63 63, was stored as 00 00 07 63 63. Flex generation fix (invalid noreject removed) 2019-01-07 Jose Antonio Ortega Ruiz Flex by-products added to CLEANFILES Looking for guile 2.2 during configuration 2015-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-24 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). 2009-10-04 Jose Antonio Ortega Ruiz Migration of gmixvm's glade file to Glade 3. 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. 2009-10-01 Jose Antonio Ortega Ruiz Guile: not using the deprecated gh_* interface. 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 2008-03-20 Jose Antonio Ortega Ruiz NEWS update for 1.2.4 Minor TODO updates Manual generation scripts updated and ignoring doc/manual 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-15 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 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 2006-08-08 Jose Antonio Ortega Ruiz 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 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 2006-08-06 Jose Antonio Ortega Ruiz Define missing ac variable GETTEXT_PACKAGE git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-24 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-24 Jose Antonio Ortega Ruiz Warnings as errors git-archimport-id: mdk@sv.gnu.org/mdk--devel--1--patch-8 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-20 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.3.1/m4/0000775000175000017500000000000015065042311006347 5mdk-1.3.1/m4/gettext.m40000644000175000017500000004513014171035245010223 # 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.3.1/m4/progtest.m40000644000175000017500000000563414171035245010413 # 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.3.1/m4/stdint_h.m40000644000175000017500000000205314171035245010350 # 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.3.1/m4/lib-link.m40000644000175000017500000005534314171035245010247 # 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.3.1/m4/longlong.m40000644000175000017500000000164314171035245010357 # 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.3.1/m4/wchar_t.m40000644000175000017500000000155314171035245010167 # 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.3.1/m4/ulonglong.m40000644000175000017500000000204214171035245010536 # 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.3.1/m4/uintmax_t.m40000644000175000017500000000235014171035245010544 # 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.3.1/m4/inttypes_h.m40000644000175000017500000000210314171035245010716 # 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.3.1/m4/isc-posix.m40000644000175000017500000000213314171035245010451 # 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.3.1/m4/longdouble.m40000644000175000017500000000230014171035245010661 # longdouble.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 compiler supports the 'long double' type. dnl Prerequisite: AC_PROG_CC AC_DEFUN([gt_TYPE_LONGDOUBLE], [ AC_CACHE_CHECK([for long double], gt_cv_c_long_double, [if test "$GCC" = yes; then gt_cv_c_long_double=yes else AC_TRY_COMPILE([ /* 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]; ], , 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.3.1/m4/printf-posix.m40000644000175000017500000000310614171035245011176 # 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.3.1/m4/inttypes-pri.m40000644000175000017500000000222714171035245011206 # 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.3.1/m4/inttypes.m40000644000175000017500000000171714171035245010421 # 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.3.1/m4/po.m40000644000175000017500000004265214171035245007163 # 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" <, 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.3.1/m4/glibc21.m40000644000175000017500000000172714171035245007766 # 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.3.1/m4/lcmessage.m40000644000175000017500000000261614171035245010504 # 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.3.1/m4/wint_t.m40000644000175000017500000000153114171035245010040 # 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.3.1/m4/intdiv0.m40000644000175000017500000000356514171035245010122 # 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.3.1/m4/xsize.m40000644000175000017500000000103114171035245007671 # 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.3.1/m4/signed.m40000644000175000017500000000140114171035245010001 # 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.3.1/m4/size_max.m40000644000175000017500000000407214171035245010356 # 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.3.1/m4/codeset.m40000644000175000017500000000157614171035245010173 # 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.3.1/m4/lib-ld.m40000644000175000017500000000675614171035245007715 # 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.3.1/m4/iconv.m40000644000175000017500000000665314171035245007664 # 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.3.1/m4/intmax.m40000644000175000017500000000217214171035245010036 # 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.3.1/intltool-update.in0000664000175000017500000000000015065042012011407 mdk-1.3.1/mixguile/0000775000175000017500000000000015065042311007652 5mdk-1.3.1/mixguile/mixguile-commands.scm0000644000175000017500000001263512112755472013736 ;; -*-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.3.1/mixguile/mixguile_cmd_dispatcher.h0000644000175000017500000000353312112755472014632 /* -*-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.3.1/mixguile/mixguile.c0000644000175000017500000000651112112755472011573 /* -*-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.3.1/mixguile/mixguile_cmd_dispatcher.c0000644000175000017500000000677312112755472014636 /* -*-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.3.1/mixguile/mixguile_main.c0000644000175000017500000000444712112755472012605 /* -*-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.3.1/mixguile/xmixguile_cmd_dispatcher.c0000664000175000017500000003444215064374670015030 /* -*-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", (scm_func_t)mixvm_cmd_, 2, 0, 0}, {"mixvm-status", (scm_func_t)mixvm_status_, 0, 0, 0}, {"mix-last-result", (scm_func_t)mix_last_result_, 0, 0, 0}, {"mix-reg", (scm_func_t)mix_reg_, 1, 0, 0}, {"mix-set-reg!", (scm_func_t)mix_set_reg_, 2, 0, 0}, {"mix-cell", (scm_func_t)mix_cell_, 1, 0, 0}, {"mix-set-cell!", (scm_func_t)mix_set_cell_, 2, 0, 0}, {"mix-over", (scm_func_t)mix_over_, 0, 0, 0}, {"mix-loc", (scm_func_t)mix_loc_, 0, 0, 0}, {"mix-set-over!", (scm_func_t)mix_set_over_, 1, 0, 0}, {"mix-cmp", (scm_func_t)mix_cmp_, 0, 0, 0}, {"mix-up-time", (scm_func_t)mix_uptime_, 0, 0, 0}, {"mix-lap-time", (scm_func_t)mix_laptime_, 0, 0, 0}, {"mix-prog-time", (scm_func_t)mix_progtime_, 0, 0, 0}, {"mix-prog-name", (scm_func_t)mix_prog_name_, 0, 0, 0}, {"mix-prog-path", (scm_func_t)mix_prog_path_, 0, 0, 0}, {"mix-src-name", (scm_func_t)mix_src_name_, 0, 0, 0}, {"mix-src-path", (scm_func_t)mix_src_path_, 0, 0, 0}, {"mix-src-line-no", (scm_func_t)mix_src_line_no_, 0, 0, 0}, {"mix-src-line", (scm_func_t)mix_src_line_, 0, 1, 0}, {"mix-ddir", (scm_func_t)mix_ddir_, 0, 0, 0}, {"mix-set-cmp!", (scm_func_t)mix_set_cmp_, 1, 0, 0}, {"mix-add-pre-hook", (scm_func_t)mix_add_pre_hook_, 2, 0, 0}, {"mix-add-post-hook", (scm_func_t)mix_add_post_hook_, 2, 0, 0}, {"mix-add-global-pre-hook", (scm_func_t)mix_add_global_pre_hook_, 1, 0, 0}, {"mix-add-global-post-hook", (scm_func_t)mix_add_global_post_hook_, 1, 0, 0}, {NULL} }; mdk-1.3.1/mixguile/xmixguile_cmd_dispatcher.h0000664000175000017500000000410115064374670015022 /* -*-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.3.1/mixguile/mixguile.scm0000644000175000017500000000173312112755472012134 ;; -*-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.3.1/mixguile/Makefile.am0000644000175000017500000000257712262422653011646 ## 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.3.1/mixguile/Makefile.in0000664000175000017500000006314215065042013011644 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cr 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_RANLIB = $(RANLIB) 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__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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mixguile.Po \ ./$(DEPDIR)/mixguile_cmd_dispatcher.Po \ ./$(DEPDIR)/mixguile_main.Po \ ./$(DEPDIR)/xmixguile_cmd_dispatcher.Po 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 ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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)" && $(am__rm_f) $$files clean-binPROGRAMS: -$(am__rm_f) $(bin_PROGRAMS) clean-noinstLIBRARIES: -$(am__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)$(libmixguile_a_RANLIB) libmixguile.a 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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixguile_cmd_dispatcher.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixguile_main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmixguile_cmd_dispatcher.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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) $(LIBRARIES) $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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 -f ./$(DEPDIR)/mixguile.Po -rm -f ./$(DEPDIR)/mixguile_cmd_dispatcher.Po -rm -f ./$(DEPDIR)/mixguile_main.Po -rm -f ./$(DEPDIR)/xmixguile_cmd_dispatcher.Po -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 -f ./$(DEPDIR)/mixguile.Po -rm -f ./$(DEPDIR)/mixguile_cmd_dispatcher.Po -rm -f ./$(DEPDIR)/mixguile_main.Po -rm -f ./$(DEPDIR)/xmixguile_cmd_dispatcher.Po -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 am--depfiles 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/mixguile/mixguile-vm-stat.scm0000644000175000017500000000452512112755472013527 ;; -*-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.3.1/mixguile/mixguile.h0000644000175000017500000000424212112755472011577 /* -*-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.3.1/configure.ac0000644000175000017500000001260614171056267010254 # Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, # 2010, 2013, 2014, 2015, 2019, 2020, 2022 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.3.1],[bug-mdk@gnu.org],[mdk]) AC_CONFIG_SRCDIR([mixlib/mix.h]) AM_INIT_AUTOMAKE AM_CONFIG_HEADER(config.h) AM_MAINTAINER_MODE AC_SEARCH_LIBS([strerror],[cposix]) AC_PROG_CC dnl AM_PROG_CC_STDC dnl m4_warn([obsolete], dnl [The preprocessor macro `STDC_HEADERS' is obsolete. dnl Except in unusual embedded environments, you can safely include all dnl ISO C90 headers unconditionally.])dnl dnl # Autoupdate added the next two lines to ensure that your configure dnl # script's behavior did not change. They are probably safe to remove. dnl AC_CHECK_INCLUDES_DEFAULT dnl AC_PROG_EGREP 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 IT_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-3.0 >= 3.0,[wguile=true],[wguile=false]) if test x$wguile = xfalse; then PKG_CHECK_MODULES(GUILE,guile-2.2 >= 2.2,[wguile=true],[wguile=false]) if test x$wguile = xfalse; then PKG_CHECK_MODULES(GUILE,guile-2.0 >= 2.0,[wguile=true],[wguile=false]) fi fi 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+-3.0 >= 3.14 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.3.1/ABOUT-NLS0000644000175000017500000015111614171035244007205 Notes 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.3.1/test-driver0000755000175000017500000001213714767572401010167 #! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2024-06-19.01; # UTC # Copyright (C) 2011-2024 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 <. GNU Automake home page: . General help using GNU software: . END } test_name= # Used for reporting. log_file= # Where to save the output of the test script. trs_file= # Where to save the metadata of the test run. expect_failure=no color_tests=no collect_skipped_logs=yes enable_hard_errors=yes while test $# -gt 0; do case $1 in --help) print_usage; exit $?;; --version) echo "test-driver (GNU Automake) $scriptversion"; exit $?;; --test-name) test_name=$2; shift;; --log-file) log_file=$2; shift;; --trs-file) trs_file=$2; shift;; --color-tests) color_tests=$2; shift;; --collect-skipped-logs) collect_skipped_logs=$2; shift;; --expect-failure) expect_failure=$2; shift;; --enable-hard-errors) enable_hard_errors=$2; shift;; --) shift; break;; -*) usage_error "invalid option: '$1'";; *) break;; esac shift done missing_opts= test x"$test_name" = x && missing_opts="$missing_opts --test-name" test x"$log_file" = x && missing_opts="$missing_opts --log-file" test x"$trs_file" = x && missing_opts="$missing_opts --trs-file" if test x"$missing_opts" != x; then usage_error "the following mandatory options are missing:$missing_opts" fi if test $# -eq 0; then usage_error "missing argument" fi if test $color_tests = yes; then # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. red='' # Red. grn='' # Green. lgn='' # Light green. blu='' # Blue. mgn='' # Magenta. std='' # No color. else red= grn= lgn= blu= mgn= std= fi do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' trap "st=129; $do_exit" 1 trap "st=130; $do_exit" 2 trap "st=141; $do_exit" 13 trap "st=143; $do_exit" 15 # Test script is run here. We create the file first, then append to it, # to ameliorate tests themselves also writing to the log file. Our tests # don't, but others can (automake bug#35762). : >"$log_file" "$@" >>"$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=$collect_skipped_logs;; 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mdk-1.3.1/README0000644000175000017500000000271612112755472006644 Welcome 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.3.1/lib/0000775000175000017500000000000015065042311006575 5mdk-1.3.1/lib/getopt_long.c0000644000175000017500000007434210770465100011215 /* 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.3.1/lib/darwin.c0000644000175000017500000000175512262406153010157 /* -*-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.3.1/lib/Makefile.am0000644000175000017500000000131512262424754010562 ## 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.3.1/lib/getopt.h0000644000175000017500000001052610770465100010175 /* 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.3.1/lib/Makefile.in0000664000175000017500000004661615065042013010576 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 = cr 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_RANLIB = $(RANLIB) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = $(DEPDIR)/getopt_long.Po ./$(DEPDIR)/darwin.Po 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: -$(am__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)$(libreplace_a_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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/darwin.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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 -f $(DEPDIR)/getopt_long.Po -rm -f ./$(DEPDIR)/darwin.Po -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 -f $(DEPDIR)/getopt_long.Po -rm -f ./$(DEPDIR)/darwin.Po -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 am--depfiles 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/ylwrap0000755000175000017500000001545714767572401007245 #! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2024-06-19.01; # UTC # Copyright (C) 1996-2024 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 ;; -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 . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v|--v*) echo "ylwrap (GNU Automake) $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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mdk-1.3.1/intltool-merge.in0000664000175000017500000000000015065042012011224 mdk-1.3.1/ChangeLog.10000644000175000017500000010274110770465100007666 ***** 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.3.1/mixutils/0000775000175000017500000000000015065042311007705 5mdk-1.3.1/mixutils/mixvm.c0000644000175000017500000000664212622454575011156 /* -*-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.3.1/mixutils/mixasm.c0000644000175000017500000000643212112755472011303 /* -*-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.3.1/mixutils/mixvm_command.c0000644000175000017500000001630512622454575012651 /* -*-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.3.1/mixutils/mixasm_comp.c0000644000175000017500000000435312112755472012321 /* -*-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.3.1/mixutils/mixvm_command.h0000644000175000017500000000240412112755472012643 /* -*-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.3.1/mixutils/mixasm_comp.h0000644000175000017500000000223512112755472012323 /* -*-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.3.1/mixutils/mixvm_loop.h0000644000175000017500000000242212112755472012176 /* -*-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.3.1/mixutils/mixvm_loop.c0000644000175000017500000001043512112755472012174 /* -*-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.3.1/mixutils/Makefile.am0000644000175000017500000000176012262430211011657 ## 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.3.1/mixutils/Makefile.in0000664000175000017500000005436415065042013011705 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mixasm.Po ./$(DEPDIR)/mixasm_comp.Po \ ./$(DEPDIR)/mixvm.Po ./$(DEPDIR)/mixvm_command.Po \ ./$(DEPDIR)/mixvm_loop.Po 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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)" && $(am__rm_f) $$files clean-binPROGRAMS: -$(am__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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixasm_comp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixvm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixvm_command.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mixvm_loop.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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 -f ./$(DEPDIR)/mixasm.Po -rm -f ./$(DEPDIR)/mixasm_comp.Po -rm -f ./$(DEPDIR)/mixvm.Po -rm -f ./$(DEPDIR)/mixvm_command.Po -rm -f ./$(DEPDIR)/mixvm_loop.Po -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 -f ./$(DEPDIR)/mixasm.Po -rm -f ./$(DEPDIR)/mixasm_comp.Po -rm -f ./$(DEPDIR)/mixvm.Po -rm -f ./$(DEPDIR)/mixvm_command.Po -rm -f ./$(DEPDIR)/mixvm_loop.Po -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 am--depfiles 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/Makefile.am0000644000175000017500000000173212622454575010023 ## 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.3.1/mixlib/0000775000175000017500000000000015065042311007313 5mdk-1.3.1/mixlib/mix_vm.h0000644000175000017500000001720313743070633010715 /* ---------------------- 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; /* Maximum number of addresses for backtraces: -1 = unlimited, 0 = off */ enum { MIX_MAX_TRACE_AMOUNT = 500 }; /* 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 GQueue * mix_vm_get_backtrace (const mix_vm_t *vm); /* Get the maximum number of instructions we will trace */ gint mix_vm_get_max_trace (const mix_vm_t *vm); /* Set the maximum number of instructions we will trace */ void mix_vm_set_max_trace (mix_vm_t *vm, gint val); #endif /* MIX_VM_H */ mdk-1.3.1/mixlib/mix_eval_scanner.l0000644000175000017500000001434313415001604012725 /* -*-c-*- ------------------ mix_eval_scanner.l : * scanner used by mix_eval_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2004, 2006, 2007, 2008, 2019 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 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.3.1/mixlib/xmix_vm_command.c0000644000175000017500000000353412112755472012600 /* -*-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.3.1/mixlib/xmix_device.c0000644000175000017500000001313613743070633011716 /* -*-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, mix_word_t val) { int m; FILE *file; long diskblock; m = mix_short_magnitude(arg); if (mix_short_is_negative(arg)) m = -m; m *= sizeof (mix_word_t) * SIZES_[dev->type]; diskblock = mix_word_magnitude(val); if (mix_word_is_negative(val)) diskblock = -diskblock; diskblock *= 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 || (ftell (file) + m <= 0 )) rewind (file); else fseek (file, m, SEEK_CUR); } if (dev->type >= mix_dev_DISK_0 && dev->type <= mix_dev_DISK_7) { // move read/write head to block if (m != 0 || diskblock < 0) return FALSE; else fseek (file, diskblock, SEEK_SET); } 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.3.1/mixlib/mix_src_file.h0000644000175000017500000000327412112755472012064 /* -*-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.3.1/mixlib/mix_src_file.c0000644000175000017500000000761312112755472012060 /* -*-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.3.1/mixlib/mix_eval_scanner.c0000664000175000017500000016052715065042244012734 #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 6 #define YY_FLEX_SUBMINOR_VERSION 4 #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 #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_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 #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #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) #define YY_LINENO_REWIND_TO(ptr) /* 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_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. */ int 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 = NULL; /**< 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 = NULL; 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 ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const 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() (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; 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 yynoreturn yy_fatal_error ( const 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 = (int) (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 const 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 const 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 const YY_CHAR 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 const YY_CHAR yy_meta[14] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const 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 const 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 const 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 const 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, 2019 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); #line 581 "mix_eval_scanner.c" #define YY_NO_INPUT 1 #line 584 "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 #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr ); #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const 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, (size_t) 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 = '*'; \ int 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 = (int) fread(buf, 1, (yy_size_t) 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 /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; 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( ); } { #line 80 "../../mixlib/mix_eval_scanner.l" #line 84 "../../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 837 "mix_eval_scanner.c" while ( /*CONSTCOND*/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 { 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[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 1113 "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 user's declarations */ } /* 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) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); 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), 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_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int 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, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (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) { yy_state_type yy_current_state; 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 ) { 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[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 ) { int yy_is_jam; 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[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + 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; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp ) { 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. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; 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) = (int) 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; } #endif #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 = (int) ((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 0; 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( (yy_size_t) (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 ); } /* 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) { yy_size_t 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; /* After all that talk, this was set to 1 anyways... */ (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. */ yy_size_t 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 NULL; 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 = (int) (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 = NULL; 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 (const char * yystr ) { return yy_scan_bytes( yystr, (int) 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 (const 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 = (yy_size_t) (_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_size_t) (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 yynoreturn yy_fatal_error (const char* msg ) { 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 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) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (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 = NULL; yyout = NULL; #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, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return 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 realloc(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.3.1/mixlib/mix_vm_clock.h0000644000175000017500000000314012112755472012063 /* -*-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.3.1/mixlib/mix_ins.h0000644000175000017500000001416712622454575011100 /* -*-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.3.1/mixlib/mix_predicate.h0000644000175000017500000000424112112755472012231 /* -*-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.3.1/mixlib/mix_config.c0000644000175000017500000001725412112755472011541 /* -*-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.3.1/mixlib/mix_device.c0000644000175000017500000000761113743070633011527 /* -*-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, mix_word_t val) { g_return_val_if_fail (dev != NULL, FALSE); g_assert (dev->vtable != NULL); return (dev->vtable->ioc) (dev, arg, val); } gboolean mix_device_busy (const mix_device_t *dev) { g_return_val_if_fail (dev != NULL, FALSE); return (dev->vtable->busy) (dev); } mdk-1.3.1/mixlib/xmix_device.h0000644000175000017500000000534613743070633011727 /* -*-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, mix_word_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.3.1/mixlib/mix_symbol_table.c0000644000175000017500000001252413415023270012732 /* -*-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.3.1/mixlib/xmix_parser.h0000644000175000017500000000741112112755472011757 /* -*-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.3.1/mixlib/completion.c0000644000175000017500000003117112262421371011554 /* 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.3.1/mixlib/xmix_io.h0000644000175000017500000000354712112755472011100 /* -*-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.3.1/mixlib/mix_vm_clock.c0000644000175000017500000000356312112755472012067 /* -*-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.3.1/mixlib/mix_parser.h0000644000175000017500000000743512112755472011575 /* -*-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.3.1/mixlib/xmix_io.c0000644000175000017500000000327612112755472011072 /* -*-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.3.1/mixlib/mix_code_file.h0000644000175000017500000000633512112755472012210 /* -*-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.3.1/mixlib/xmix_vm_handlers.h0000644000175000017500000000406713743070633012771 /* -*-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 (sbt_); 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.3.1/mixlib/xmix_vm_command.h0000644000175000017500000000631012262420755012577 /* -*-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.3.1/mixlib/gettext.h0000644000175000017500000000576312112755472011112 /* 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.3.1/mixlib/xmix_vm.c0000644000175000017500000004302513743201230011066 /* ---------------------- xmix_vm.c : * Implementation of the functions declared in xmix_vm.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2003, 2004, 2007, 2010, 2013, 2019, 2020 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 */ static inline mix_address_t get_M_ (const mix_vm_t *vm, const mix_ins_t *ins); static inline mix_word_t get_V_ (const mix_vm_t *vm, const mix_ins_t *ins); static inline mix_device_t * get_dev_ (mix_vm_t *vm, mix_fspec_t type); static inline 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))); } static inline 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))); } static inline 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; mix_word_t val; 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); val = get_rX_ (vm); fail_if_not_ (vm, mix_device_ioc (dev, addr, val), 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.3.1/mixlib/mix_file.h0000644000175000017500000000372012112755472011211 /* -*-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.3.1/mixlib/mix_io.h0000644000175000017500000000637712112755472010714 /* -*-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.3.1/mixlib/mix_eval.c0000644000175000017500000001124712112755472011217 /* -*-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.3.1/mixlib/mix_vm_dump.c0000644000175000017500000001001012112755472011722 /* ---------------------- 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.3.1/mixlib/mix_predicate.c0000644000175000017500000001367412112755472012236 /* -*-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.3.1/mixlib/mix_vm_command.c0000644000175000017500000003724312262420271012404 /* -*-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.3.1/mixlib/mix_code_file.c0000644000175000017500000002146312112755472012202 /* -*-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.3.1/mixlib/testsuite/0000775000175000017500000000000015065042311011344 5mdk-1.3.1/mixlib/testsuite/mix_vm_ins_t.c0000644000175000017500000003422113415031447014130 /* ---------------------- 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_vm_set_rA(vm, mix_word_new_bn(0,0,0,0,1)); mix_vm_set_addr_contents(vm, 1000, mix_word_new_b(0,0,0,0,1)); fill_test_desc_(&test,vm,&ins); test.rA_a = MIX_WORD_MINUS_ZERO; run_test_(&test, vm, dc); mix_vm_set_rA(vm, mix_word_new_b(0,0,0,0,1)); mix_vm_set_addr_contents(vm, 1000, mix_word_new_bn(0,0,0,0,1)); fill_test_desc_(&test,vm,&ins); test.rA_a = MIX_WORD_ZERO; 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.3.1/mixlib/testsuite/test.h0000644000175000017500000000247310770465100012423 /* ** 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.3.1/mixlib/testsuite/mix_parser_t.c0000644000175000017500000000402312112755472014132 /* -*-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.3.1/mixlib/testsuite/mix_eval_t.c0000644000175000017500000000655510770465100013573 /* -*-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.3.1/mixlib/testsuite/mix_types_t.c0000644000175000017500000002705310770465100014004 /*----------------------- 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.3.1/mixlib/testsuite/mix_device_t.c0000644000175000017500000000375710770465100014104 /* -*-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.3.1/mixlib/testsuite/mix_ins_t.c0000644000175000017500000000477210770465100013434 /*----------------------- 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.3.1/mixlib/testsuite/Makefile.am0000644000175000017500000000257612262422647013342 ## 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.3.1/mixlib/testsuite/Makefile.in0000664000175000017500000011575715065042013013350 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/mix_device_t.Po \ ./$(DEPDIR)/mix_eval_t.Po ./$(DEPDIR)/mix_ins_t.Po \ ./$(DEPDIR)/mix_parser_t.Po ./$(DEPDIR)/mix_types_t.Po \ ./$(DEPDIR)/mix_vm_ins_t.Po 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)` 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 ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } 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" \ $$am__collect_skipped_logs \ --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 '$(IGNORE_SKIPPED_LOGS)'; then \ am__collect_skipped_logs='--collect-skipped-logs no'; \ else \ am__collect_skipped_logs=''; \ fi; \ 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` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: -$(am__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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_eval_t.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_ins_t.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_parser_t.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_types_t.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_ins_t.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .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"; \ }; \ output_system_information () \ { \ echo; \ { uname -a | $(AWK) '{ \ printf "System information (uname -a):"; \ for (i = 1; i < NF; ++i) \ { \ if (i != 2) \ printf " %s", $$i; \ } \ printf "\n"; \ }'; } 2>&1; \ if test -r /etc/os-release; then \ echo "Distribution information (/etc/os-release):"; \ sed 8q /etc/os-release; \ elif test -r /etc/issue; then \ echo "Distribution information (/etc/issue):"; \ cat /etc/issue; \ fi; \ }; \ please_report () \ { \ echo "Some test(s) failed. Please report this to $(PACKAGE_BUGREPORT),"; \ echo "together with the test-suite.log file (gzipped) and your system"; \ echo "information. Thanks."; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ output_system_information; \ 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"$(AM_TESTSUITE_SUMMARY_HEADER)"$${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) for debugging.$${std}";\ if test -n "$(PACKAGE_BUGREPORT)"; then \ please_report | sed -e "s/^/$${col}/" -e s/'$$'/"$${std}"/; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @$(am__rm_f) $(RECHECK_LOGS) @$(am__rm_f) $(RECHECK_LOGS:.log=.trs) @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @$(am__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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(TEST_LOGS) -$(am__rm_f) $(TEST_LOGS:.log=.trs) -$(am__rm_f) $(TEST_SUITE_LOG) clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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 -f ./$(DEPDIR)/mix_device_t.Po -rm -f ./$(DEPDIR)/mix_eval_t.Po -rm -f ./$(DEPDIR)/mix_ins_t.Po -rm -f ./$(DEPDIR)/mix_parser_t.Po -rm -f ./$(DEPDIR)/mix_types_t.Po -rm -f ./$(DEPDIR)/mix_vm_ins_t.Po -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 -f ./$(DEPDIR)/mix_device_t.Po -rm -f ./$(DEPDIR)/mix_eval_t.Po -rm -f ./$(DEPDIR)/mix_ins_t.Po -rm -f ./$(DEPDIR)/mix_parser_t.Po -rm -f ./$(DEPDIR)/mix_types_t.Po -rm -f ./$(DEPDIR)/mix_vm_ins_t.Po -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 am--depfiles 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/mixlib/mix_predicate_list.c0000644000175000017500000000610512112755472013260 /* -*-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.3.1/mixlib/mix_file.c0000644000175000017500000001020412112755472011177 /* -*-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.3.1/mixlib/xmix_eval.h0000644000175000017500000000312112112755472011404 /* -*-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.3.1/mixlib/mix_scanner.c0000664000175000017500000037172315065042243011726 #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 6 #define YY_FLEX_SUBMINOR_VERSION 4 #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 #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_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 #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #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) #define YY_LINENO_REWIND_TO(ptr) /* 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_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. */ int 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 = NULL; /**< 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 = NULL; 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 ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const 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() (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; 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 yynoreturn yy_fatal_error ( const 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 = (int) (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 72 #define YY_END_OF_BUFFER 73 /* 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 const flex_int16_t yy_acclist[360] = { 0, 73, 2, 72, 3, 72, 1, 2, 72, 10, 72, 4, 10, 72, 11, 72, 10, 72, 9, 10, 72, 16392, 25, 72, 12, 25, 72, 13, 72, 24, 25, 72, 25, 72, 24, 25, 72, 24, 25, 72, 24, 25, 72, 24, 25, 72, 24, 25, 72, 24, 25, 72, 48, 72, 47, 72, 48, 72, 48, 72, 48, 72, 48, 72, 48, 72, 52, 72, 51, 72, 52, 72, 52, 72, 52, 72, 52, 72, 56, 72, 72, 56, 72,16438, 56, 72, 56, 72,16438, 56, 72, 16438, 64, 72, 63, 64, 72, 63, 72, 60, 64, 72, 64, 72, 64, 72, 61, 64, 72, 64, 72, 62, 64, 72, 71, 72, 70, 71, 72, 70, 72, 71, 72, 71, 72, 71, 72, 71, 72, 71, 72, 35, 72, 34, 35, 72, 35, 72, 34, 35, 72, 34, 35, 72, 35, 72, 34, 35, 72, 35, 72, 34, 35, 72, 35, 72, 34, 35, 72, 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,16438,16438,16438, 36,16438,16438,16438, 59, 57, 58, 57, 61, 61, 62, 62, 62, 68, 69, 69, 69, 67, 68, 65, 67, 68, 66, 67, 68, 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, 55, 55, 8246,16438,16438,16438, 55, 53, 8246, 58, 58, 69, 69, 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, 55, 55,16438,16438, 55, 55, 69, 69, 69, 34, 34, 34, 34, 34, 27, 29, 31, 33, 8200, 21, 23, 21, 14, 23, 41, 39, 37, 69, 69, 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 const flex_int16_t yy_accept[433] = { 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, 84, 86, 89, 92, 94, 97, 99, 102, 104, 106, 109, 111, 114, 116, 119, 121, 123, 125, 127, 129, 131, 133, 136, 138, 141, 144, 146, 149, 151, 154, 156, 159, 160, 161, 161, 163, 166, 169, 172, 172, 174, 176, 177, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 192, 192, 192, 192, 192, 192, 193, 195, 196, 197, 197, 197, 197, 197, 199, 199, 199, 200, 200, 200, 200, 200, 200, 202, 203, 203, 203, 203, 203, 203, 204, 205, 206, 206, 208, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 220, 220, 220, 220, 221, 221, 222, 223, 225, 228, 231, 231, 231, 231, 231, 231, 231, 232, 233, 234, 234, 235, 236, 237, 238, 238, 239, 240, 240, 241, 242, 242, 243, 243, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 253, 253, 253, 253, 253, 253, 254, 254, 255, 256, 256, 256, 256, 256, 258, 258, 261, 261, 261, 261, 261, 261, 262, 263, 264, 265, 266, 267, 268, 270, 271, 272, 272, 272, 272, 272, 272, 273, 274, 274, 274, 274, 274, 275, 276, 277, 278, 278, 279, 280, 280, 280, 282, 282, 282, 284, 284, 284, 286, 286, 286, 288, 288, 288, 289, 290, 291, 293, 295, 297, 299, 300, 300, 300, 300, 301, 301, 301, 301, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 305, 306, 307, 308, 309, 309, 309, 310, 311, 312, 313, 313, 313, 313, 313, 314, 315, 315, 315, 315, 316, 317, 318, 319, 320, 321, 321, 322, 324, 324, 325, 327, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 329, 329, 329, 330, 331, 332, 332, 332, 332, 332, 332, 332, 332, 333, 334, 335, 337, 339, 340, 340, 340, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 342, 342, 342, 342, 342, 343, 344, 346, 347, 348, 348, 348, 349, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 352, 353, 354, 355, 355, 355, 355, 357, 358, 358, 358, 358, 358, 358, 358, 359, 360, 360, 360, 360, 360 } ; static const YY_CHAR 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 const YY_CHAR 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 const flex_int16_t yy_base[599] = { 0, 819, 0, 9, 25, 41, 0, 88, 104, 120, 136, 152, 168, 184, 200, 216, 232, 248, 264, 271, 272, 277, 278, 283, 284, 814, 3467, 3467, 0, 3467, 0, 3467, 285, 298, 3467, 3, 3467, 301, 292, 324, 338, 379, 276, 287, 298, 3467, 3467, 393, 345, 408, 352, 447, 3467, 3467, 462, 349, 476, 515, 3467, 3467, 359, 361, 523, 421, 3467, 3467, 3467, 364, 370, 428, 784, 376, 770, 3467, 3467, 3467, 562, 429, 483, 576, 590, 3467, 492, 430, 604, 613, 431, 506, 438, 509, 459, 537, 0, 4, 764, 412, 480, 540, 541, 608, 320, 544, 341, 467, 543, 621, 628, 637, 557, 3467, 651, 0, 665, 0, 338, 303, 478, 354, 509, 3467, 512, 670, 0, 761, 608, 683, 654, 3467, 698, 0, 703, 694, 713, 723, 3467, 738, 0, 3467, 553, 743, 0, 648, 756, 3467, 0, 770, 0, 784, 567, 780, 787, 795, 803, 788, 811, 819, 827, 3467, 750, 747, 741, 630, 730, 729, 0, 668, 3467, 662, 834, 847, 861, 875, 882, 753, 889, 896, 3467, 3467, 3467, 910, 924, 931, 767, 937, 939, 947, 961, 970, 842, 3467, 979, 988, 1002, 1016, 3467, 1019, 1022, 3467, 1025, 1028, 3467, 1032, 368, 1028, 1035, 1042, 1049, 1058, 1072, 1086, 423, 451, 1089, 1127, 1142, 1157, 1100, 678, 1075, 3467, 1106, 3467, 3467, 1108, 792, 1165, 1110, 3467, 659, 3467, 1173, 1183, 1198, 1212, 1226, 0, 1123, 3467, 1234, 1242, 1250, 1264, 3467, 0, 656, 1267, 1281, 1295, 824, 1302, 1308, 1315, 1323, 852, 1331, 1339, 1348, 1357, 1366, 1375, 915, 1384, 1393, 659, 1310, 3467, 656, 1407, 3467, 632, 1410, 3467, 618, 1413, 3467, 523, 699, 1409, 1416, 1430, 3467, 1434, 1437, 1440, 687, 1443, 1458, 1473, 3467, 1476, 606, 1482, 3467, 1480, 1487, 1494, 1502, 1511, 1521, 1531, 1541, 941, 1551, 1561, 928, 1576, 1590, 593, 1604, 1601, 1609, 592, 1623, 1626, 1640, 1647, 1654, 1661, 571, 952, 1668, 1675, 1683, 1692, 1701, 1708, 1051, 1710, 1718, 1727, 3467, 3467, 3467, 3467, 820, 3467, 1741, 544, 0, 1676, 3467, 1081, 1167, 1738, 1745, 1753, 1762, 1772, 1780, 1195, 1782, 3467, 1790, 1800, 3467, 1808, 1815, 1823, 1831, 1839, 1847, 1854, 1861, 1869, 1878, 1887, 1896, 3467, 1910, 0, 510, 1746, 0, 1908, 1916, 1924, 1932, 1939, 1946, 1954, 1963, 1973, 1983, 1992, 2000, 495, 1203, 2007, 2014, 2022, 2031, 2040, 2054, 0, 0, 491, 2015, 3467, 0, 2052, 2060, 1207, 1223, 2067, 2074, 2082, 2091, 2101, 2110, 2118, 2126, 2140, 0, 0, 0, 482, 467, 2075, 3467, 0, 2138, 2146, 2154, 2162, 2170, 462, 3467, 3467, 2178, 2186, 441, 3467, 2201, 2215, 2229, 2243, 2257, 2271, 2285, 2299, 2313, 415, 2326, 295, 2338, 2350, 2355, 2360, 2372, 698, 2385, 708, 2391, 887, 394, 386, 1033, 2396, 2408, 1178, 2415, 2427, 1313, 2432, 2444, 1414, 2457, 2465, 2478, 1485, 2491, 2504, 1516, 2511, 2517, 2523, 374, 364, 343, 336, 322, 1546, 2535, 2547, 1652, 2552, 2564, 2569, 1767, 2574, 2586, 2593, 2606, 2614, 2627, 2641, 2655, 2661, 2666, 2671, 2676, 2688, 2700, 2713, 2727, 2741, 2747, 1795, 2752, 2759, 2767, 2780, 2792, 2805, 2819, 2826, 2832, 2845, 308, 305, 2858, 2870, 1813, 2875, 2880, 1852, 2886, 2893, 2900, 1937, 2907, 2920, 2934, 2948, 2962, 2968, 2973, 2985, 2998, 3005, 3012, 1968, 3020, 3033, 3045, 3058, 3065, 3071, 3084, 3097, 3102, 2096, 3108, 3115, 3120, 2320, 3127, 3134, 3146, 3157, 3168, 2322, 3175, 3182, 3188, 2323, 3195, 3201, 3207, 3213, 3220, 3232, 3243, 3254, 3265, 3272, 3278, 3285, 3292, 2325, 3298, 3305, 3317, 3328, 3339, 3350, 3364, 3375, 3382, 2336, 3388, 3395, 3402, 3412, 3423, 3430, 3436, 3446, 3453 } ; static const flex_int16_t yy_def[599] = { 0, 432, 432, 433, 433, 431, 5, 434, 434, 435, 435, 436, 436, 437, 437, 438, 438, 439, 439, 18, 18, 18, 18, 18, 18, 431, 431, 431, 440, 431, 431, 431, 441, 442, 431, 431, 431, 431, 443, 444, 445, 445, 41, 41, 41, 431, 431, 431, 446, 446, 447, 448, 431, 431, 431, 449, 449, 450, 431, 431, 431, 451, 451, 452, 431, 431, 431, 453, 453, 453, 454, 453, 455, 431, 431, 431, 431, 456, 457, 456, 458, 431, 431, 459, 459, 460, 459, 84, 459, 84, 459, 84, 440, 431, 441, 442, 442, 442, 442, 431, 461, 442, 431, 462, 462, 431, 443, 463, 431, 431, 444, 41, 464, 41, 41, 41, 41, 41, 41, 431, 465, 465, 47, 431, 49, 448, 466, 431, 431, 125, 431, 447, 447, 467, 431, 468, 125, 431, 469, 469, 54, 56, 450, 431, 142, 470, 142, 471, 472, 472, 431, 473, 474, 471, 474, 475, 474, 431, 476, 477, 476, 476, 478, 479, 480, 479, 431, 481, 481, 431, 482, 483, 431, 484, 484, 485, 431, 431, 431, 486, 483, 487, 488, 489, 488, 431, 490, 491, 492, 431, 493, 491, 490, 494, 431, 192, 495, 431, 192, 496, 431, 431, 431, 431, 497, 498, 499, 500, 501, 501, 209, 209, 209, 431, 502, 503, 431, 504, 504, 431, 505, 431, 431, 506, 507, 508, 507, 431, 431, 431, 509, 510, 431, 511, 512, 513, 514, 431, 431, 515, 516, 517, 431, 518, 519, 431, 520, 521, 522, 522, 523, 524, 431, 525, 525, 526, 431, 527, 528, 431, 529, 529, 530, 531, 531, 431, 532, 532, 431, 533, 533, 431, 534, 534, 431, 431, 431, 535, 536, 537, 431, 431, 431, 431, 209, 538, 503, 504, 431, 431, 505, 505, 431, 431, 506, 506, 539, 431, 507, 540, 431, 541, 541, 542, 431, 543, 544, 545, 545, 546, 547, 548, 548, 549, 521, 431, 522, 550, 431, 551, 551, 552, 526, 553, 528, 554, 555, 555, 556, 557, 431, 431, 431, 431, 431, 431, 558, 559, 560, 431, 431, 431, 561, 561, 562, 539, 563, 540, 564, 565, 565, 431, 566, 542, 431, 567, 550, 431, 551, 568, 431, 554, 554, 569, 431, 555, 570, 431, 571, 572, 573, 431, 574, 431, 561, 575, 431, 564, 564, 576, 431, 565, 577, 578, 568, 431, 579, 579, 580, 569, 581, 570, 582, 583, 584, 585, 586, 431, 587, 588, 575, 431, 589, 589, 590, 576, 591, 577, 431, 579, 592, 582, 583, 584, 587, 593, 586, 586, 431, 594, 431, 589, 595, 596, 592, 597, 431, 431, 598, 595, 431, 0, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431 } ; static const flex_int16_t yy_nxt[3515] = { 0, 431, 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, 244, 96, 115, 243, 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, 244, 158, 157, 114, 108, 109, 108, 160, 157, 211, 159, 103, 103, 158, 103, 104, 112, 103, 119, 119, 119, 276, 165, 119, 211, 120, 120, 119, 120, 121, 163, 120, 119, 126, 127, 126, 276, 99, 127, 99, 120, 120, 127, 120, 121, 124, 120, 128, 282, 100, 282, 95, 147, 148, 148, 129, 148, 149, 155, 148, 157, 169, 185, 185, 161, 158, 170, 186, 192, 371, 185, 129, 134, 134, 134, 195, 283, 134, 283, 120, 120, 134, 120, 121, 135, 120, 119, 137, 137, 137, 371, 185, 137, 426, 138, 138, 198, 138, 139, 203, 138, 143, 143, 143, 204, 99, 143, 99, 138, 138, 371, 138, 139, 141, 138, 172, 173, 100, 173, 371, 174, 210, 181, 144, 182, 182, 183, 182, 184, 183, 182, 193, 194, 193, 196, 197, 196, 210, 371, 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, 371, 212, 198, 203, 334, 100, 100, 103, 204, 100, 108, 109, 108, 232, 154, 166, 166, 166, 233, 334, 166, 166, 167, 167, 166, 167, 168, 238, 167, 176, 176, 176, 239, 183, 177, 178, 167, 167, 176, 167, 168, 170, 167, 166, 166, 166, 242, 237, 166, 166, 167, 167, 166, 167, 168, 179, 167, 188, 189, 188, 340, 99, 181, 99, 182, 182, 183, 182, 184, 186, 182, 181, 333, 182, 182, 183, 182, 184, 190, 182, 202, 103, 103, 125, 103, 104, 332, 103, 103, 103, 157, 103, 104, 106, 103, 158, 202, 103, 103, 125, 103, 104, 206, 103, 108, 109, 108, 218, 219, 218, 331, 103, 103, 330, 103, 104, 110, 103, 108, 109, 108, 243, 245, 142, 304, 103, 103, 246, 103, 104, 213, 103, 219, 164, 120, 214, 134, 134, 134, 142, 339, 134, 339, 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, 335, 224, 224, 225, 224, 226, 230, 224, 227, 134, 134, 134, 164, 162, 134, 335, 120, 120, 134, 120, 121, 232, 120, 119, 160, 138, 233, 137, 137, 137, 243, 172, 137, 158, 138, 138, 174, 138, 139, 145, 138, 137, 137, 137, 216, 256, 137, 94, 138, 138, 257, 138, 139, 164, 138, 236, 237, 236, 238, 241, 242, 241, 148, 239, 147, 148, 148, 162, 148, 149, 297, 148, 153, 148, 148, 298, 148, 149, 151, 148, 147, 148, 148, 431, 148, 149, 155, 148, 147, 148, 148, 27, 148, 149, 155, 148, 147, 148, 148, 431, 148, 149, 315, 148, 147, 148, 148, 316, 148, 149, 155, 148, 245, 264, 265, 264, 167, 246, 166, 166, 166, 367, 431, 166, 166, 167, 167, 166, 167, 168, 252, 167, 176, 176, 176, 254, 367, 177, 178, 167, 167, 176, 167, 168, 170, 167, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 179, 167, 248, 248, 431, 248, 249, 159, 248, 248, 248, 159, 248, 249, 174, 248, 248, 248, 431, 248, 249, 250, 248, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 259, 167, 166, 166, 166, 261, 431, 166, 166, 167, 167, 166, 167, 168, 179, 167, 252, 253, 304, 253, 354, 254, 259, 260, 256, 260, 300, 261, 182, 257, 181, 302, 182, 182, 183, 182, 184, 357, 182, 188, 189, 188, 358, 431, 181, 431, 182, 182, 183, 182, 184, 186, 182, 181, 431, 182, 182, 183, 182, 184, 190, 182, 181, 431, 182, 182, 183, 182, 184, 431, 182, 181, 431, 182, 182, 183, 182, 184, 190, 182, 193, 194, 193, 431, 431, 181, 431, 182, 182, 183, 182, 184, 192, 182, 267, 268, 267, 196, 197, 196, 270, 271, 270, 199, 200, 199, 273, 274, 273, 195, 201, 431, 201, 103, 103, 198, 103, 104, 171, 103, 103, 103, 171, 103, 104, 204, 103, 103, 103, 275, 103, 104, 277, 103, 103, 103, 364, 103, 104, 431, 103, 365, 431, 103, 103, 275, 103, 104, 206, 103, 279, 280, 279, 218, 219, 218, 431, 103, 103, 431, 103, 104, 112, 103, 281, 109, 281, 108, 225, 108, 431, 103, 103, 351, 103, 104, 112, 103, 287, 288, 287, 431, 431, 288, 291, 292, 291, 288, 284, 431, 216, 431, 289, 293, 294, 297, 294, 431, 295, 224, 298, 308, 237, 308, 284, 119, 119, 119, 431, 431, 119, 431, 120, 120, 119, 120, 121, 431, 120, 119, 119, 119, 119, 431, 431, 119, 431, 120, 120, 119, 120, 121, 214, 120, 119, 119, 119, 119, 431, 431, 119, 431, 120, 120, 119, 120, 121, 285, 120, 119, 300, 301, 373, 301, 431, 302, 223, 374, 224, 224, 225, 224, 226, 187, 224, 227, 223, 187, 224, 224, 225, 224, 226, 230, 224, 227, 137, 137, 137, 431, 380, 137, 431, 138, 138, 381, 138, 139, 408, 138, 137, 137, 137, 409, 225, 137, 431, 138, 138, 351, 138, 139, 233, 138, 137, 137, 137, 431, 420, 137, 431, 138, 138, 421, 138, 139, 305, 138, 147, 148, 148, 431, 148, 149, 431, 148, 147, 148, 148, 431, 148, 149, 239, 148, 147, 148, 148, 431, 148, 149, 309, 148, 312, 242, 312, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 431, 167, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 246, 167, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 313, 167, 315, 264, 265, 264, 248, 316, 248, 248, 431, 248, 249, 205, 248, 248, 248, 205, 248, 249, 250, 248, 318, 319, 319, 431, 319, 320, 431, 319, 318, 319, 319, 431, 319, 320, 254, 319, 318, 319, 319, 431, 319, 320, 321, 319, 181, 431, 182, 182, 183, 182, 184, 431, 182, 181, 431, 182, 182, 183, 182, 184, 257, 182, 181, 431, 182, 182, 183, 182, 184, 323, 182, 325, 431, 326, 326, 183, 326, 327, 431, 326, 325, 431, 326, 326, 183, 326, 327, 261, 326, 325, 431, 326, 326, 183, 326, 327, 328, 326, 267, 268, 267, 270, 271, 270, 273, 274, 273, 103, 103, 431, 103, 104, 215, 103, 103, 103, 215, 103, 104, 277, 103, 279, 280, 336, 337, 281, 109, 281, 282, 109, 282, 283, 109, 283, 119, 119, 119, 431, 431, 119, 431, 120, 120, 119, 120, 121, 431, 120, 119, 119, 119, 119, 431, 431, 119, 431, 120, 120, 119, 120, 121, 285, 120, 119, 218, 219, 218, 220, 221, 220, 431, 431, 222, 291, 292, 291, 222, 341, 342, 342, 431, 342, 343, 234, 342, 293, 431, 234, 431, 431, 295, 341, 342, 342, 431, 342, 343, 295, 342, 341, 342, 342, 431, 342, 343, 344, 342, 223, 431, 224, 224, 225, 224, 226, 240, 224, 227, 223, 240, 224, 224, 225, 224, 226, 298, 224, 227, 223, 431, 224, 224, 225, 224, 226, 346, 224, 227, 348, 431, 349, 349, 225, 349, 350, 247, 349, 351, 348, 247, 349, 349, 225, 349, 350, 302, 349, 351, 348, 431, 349, 349, 225, 349, 350, 352, 349, 351, 137, 137, 137, 431, 431, 137, 431, 138, 138, 431, 138, 139, 431, 138, 137, 137, 137, 431, 431, 137, 431, 138, 138, 431, 138, 139, 305, 138, 308, 237, 308, 147, 148, 148, 431, 148, 149, 431, 148, 147, 148, 148, 431, 148, 149, 309, 148, 312, 242, 312, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 431, 167, 166, 166, 166, 431, 431, 166, 166, 167, 167, 166, 167, 168, 313, 167, 248, 248, 431, 248, 249, 175, 248, 248, 248, 175, 248, 249, 316, 248, 248, 248, 431, 248, 249, 355, 248, 357, 339, 109, 339, 319, 358, 318, 319, 319, 431, 319, 320, 431, 319, 318, 319, 319, 431, 319, 320, 321, 319, 181, 431, 182, 182, 183, 182, 184, 431, 182, 181, 431, 182, 182, 183, 182, 184, 323, 182, 360, 361, 364, 361, 431, 362, 326, 365, 325, 431, 326, 326, 183, 326, 327, 431, 326, 325, 431, 326, 326, 183, 326, 327, 328, 326, 279, 280, 368, 337, 373, 396, 397, 396, 342, 374, 341, 342, 342, 431, 342, 343, 431, 342, 341, 342, 342, 431, 342, 343, 344, 342, 223, 431, 224, 224, 225, 224, 226, 258, 224, 227, 223, 258, 224, 224, 225, 224, 226, 346, 224, 227, 376, 377, 380, 377, 431, 378, 349, 381, 348, 431, 349, 349, 225, 349, 350, 299, 349, 351, 348, 299, 349, 349, 225, 349, 350, 352, 349, 351, 248, 248, 431, 248, 249, 317, 248, 248, 248, 317, 248, 249, 355, 248, 318, 319, 319, 431, 319, 320, 431, 319, 318, 319, 319, 431, 319, 320, 358, 319, 318, 319, 319, 431, 319, 320, 383, 319, 385, 386, 386, 431, 386, 387, 255, 386, 360, 431, 255, 431, 431, 362, 385, 386, 386, 431, 386, 387, 362, 386, 385, 386, 386, 431, 386, 387, 388, 386, 325, 431, 326, 326, 183, 326, 327, 431, 326, 325, 431, 326, 326, 183, 326, 327, 365, 326, 325, 431, 326, 326, 183, 326, 327, 390, 326, 279, 280, 392, 337, 341, 342, 342, 431, 342, 343, 431, 342, 341, 342, 342, 431, 342, 343, 374, 342, 341, 342, 342, 431, 342, 343, 399, 342, 401, 402, 402, 431, 402, 403, 262, 402, 376, 431, 262, 431, 431, 378, 401, 402, 402, 431, 402, 403, 378, 402, 401, 402, 402, 431, 402, 403, 404, 402, 348, 431, 349, 349, 225, 349, 350, 303, 349, 351, 348, 303, 349, 349, 225, 349, 350, 381, 349, 351, 348, 431, 349, 349, 225, 349, 350, 406, 349, 351, 318, 319, 319, 431, 319, 320, 431, 319, 318, 319, 319, 431, 319, 320, 383, 319, 408, 417, 418, 417, 386, 409, 385, 386, 386, 431, 386, 387, 431, 386, 385, 386, 386, 431, 386, 387, 388, 386, 325, 431, 326, 326, 183, 326, 327, 431, 326, 325, 431, 326, 326, 183, 326, 327, 390, 326, 279, 280, 411, 337, 341, 342, 342, 431, 342, 343, 431, 342, 341, 342, 342, 431, 342, 343, 399, 342, 420, 417, 418, 417, 402, 421, 401, 402, 402, 431, 402, 403, 431, 402, 401, 402, 402, 431, 402, 403, 404, 402, 348, 431, 349, 349, 225, 349, 350, 359, 349, 351, 348, 359, 349, 349, 225, 349, 350, 406, 349, 351, 385, 386, 386, 431, 386, 387, 431, 386, 385, 386, 386, 431, 386, 387, 409, 386, 385, 386, 386, 431, 386, 387, 423, 386, 279, 280, 411, 337, 401, 402, 402, 431, 402, 403, 431, 402, 401, 402, 402, 431, 402, 403, 421, 402, 401, 402, 402, 431, 402, 403, 428, 402, 385, 386, 386, 431, 386, 387, 431, 386, 385, 386, 386, 431, 386, 387, 423, 386, 401, 402, 402, 431, 402, 403, 431, 402, 401, 402, 402, 431, 402, 403, 428, 402, 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, 431, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 101, 366, 101, 375, 382, 366, 410, 375, 382, 431, 410, 101, 111, 111, 111, 431, 431, 422, 431, 111, 111, 422, 111, 111, 113, 113, 113, 431, 431, 431, 431, 113, 113, 431, 113, 113, 125, 125, 431, 431, 125, 133, 133, 431, 431, 133, 136, 136, 136, 431, 431, 136, 431, 136, 136, 136, 136, 136, 136, 146, 146, 146, 431, 431, 146, 431, 146, 146, 431, 146, 146, 156, 156, 156, 431, 156, 156, 175, 175, 431, 431, 175, 180, 180, 180, 431, 431, 180, 180, 180, 180, 180, 180, 180, 191, 431, 191, 191, 191, 191, 191, 100, 431, 100, 431, 431, 431, 431, 431, 431, 431, 431, 100, 207, 207, 431, 207, 207, 112, 112, 112, 431, 431, 431, 431, 112, 112, 431, 112, 112, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 231, 431, 231, 231, 231, 231, 231, 231, 135, 135, 135, 431, 431, 135, 431, 135, 135, 135, 135, 135, 135, 145, 145, 145, 431, 431, 145, 431, 145, 145, 431, 145, 145, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 152, 152, 152, 431, 152, 152, 156, 156, 156, 431, 156, 156, 155, 155, 155, 431, 155, 155, 171, 171, 171, 431, 431, 171, 171, 171, 171, 171, 171, 171, 180, 180, 180, 431, 431, 180, 180, 180, 180, 180, 180, 180, 251, 251, 431, 251, 251, 179, 179, 179, 431, 431, 179, 179, 179, 179, 179, 179, 179, 255, 255, 431, 431, 255, 262, 262, 431, 431, 262, 187, 187, 187, 431, 431, 187, 431, 187, 187, 187, 187, 187, 191, 431, 191, 191, 191, 191, 191, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 190, 431, 190, 190, 190, 190, 190, 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, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 205, 205, 431, 205, 205, 278, 278, 431, 278, 278, 206, 206, 431, 206, 206, 207, 207, 431, 207, 207, 113, 113, 113, 431, 431, 431, 431, 113, 113, 431, 113, 113, 215, 215, 215, 431, 431, 215, 431, 215, 215, 215, 215, 215, 215, 286, 286, 286, 431, 431, 286, 431, 286, 286, 286, 286, 286, 286, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 296, 296, 431, 431, 296, 303, 303, 431, 431, 303, 230, 431, 230, 230, 230, 230, 230, 230, 231, 431, 231, 231, 231, 231, 231, 231, 234, 234, 234, 431, 431, 234, 431, 234, 234, 431, 234, 234, 306, 306, 306, 431, 431, 306, 431, 306, 306, 431, 306, 306, 235, 235, 431, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 240, 240, 240, 431, 240, 240, 310, 310, 310, 431, 310, 310, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 247, 247, 247, 431, 431, 247, 247, 247, 247, 247, 247, 247, 314, 314, 314, 431, 431, 314, 314, 314, 314, 314, 314, 314, 250, 250, 431, 250, 250, 251, 251, 431, 251, 251, 322, 322, 322, 431, 322, 322, 258, 431, 258, 258, 258, 258, 258, 324, 431, 324, 324, 324, 324, 324, 329, 431, 329, 329, 329, 329, 329, 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, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 277, 277, 431, 277, 277, 278, 278, 431, 278, 278, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 285, 285, 285, 431, 431, 285, 431, 285, 285, 285, 285, 285, 285, 345, 345, 345, 431, 345, 345, 347, 431, 347, 347, 347, 347, 347, 347, 353, 431, 353, 353, 353, 353, 353, 353, 305, 305, 305, 431, 431, 305, 431, 305, 305, 431, 305, 305, 306, 306, 306, 431, 431, 306, 431, 306, 306, 431, 306, 306, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 309, 309, 309, 431, 309, 309, 310, 310, 310, 431, 310, 310, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 313, 313, 313, 431, 431, 313, 313, 313, 313, 313, 313, 313, 356, 356, 431, 356, 356, 321, 321, 321, 431, 321, 321, 323, 431, 323, 323, 323, 323, 323, 363, 363, 431, 431, 363, 328, 431, 328, 328, 328, 328, 328, 329, 431, 329, 329, 329, 329, 329, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 372, 431, 372, 372, 372, 372, 372, 372, 372, 372, 372, 344, 344, 344, 431, 344, 344, 346, 431, 346, 346, 346, 346, 346, 346, 379, 379, 431, 431, 379, 352, 431, 352, 352, 352, 352, 352, 352, 355, 355, 431, 355, 355, 384, 384, 384, 431, 384, 384, 389, 389, 389, 431, 389, 389, 391, 431, 391, 391, 391, 391, 391, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 394, 431, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 398, 431, 398, 398, 398, 398, 398, 398, 398, 398, 398, 400, 400, 400, 431, 400, 400, 405, 405, 405, 431, 405, 405, 407, 431, 407, 407, 407, 407, 407, 407, 383, 383, 383, 431, 383, 383, 388, 388, 388, 431, 388, 388, 390, 431, 390, 390, 390, 390, 390, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 413, 431, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 431, 414, 414, 414, 414, 414, 414, 414, 414, 414, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 419, 431, 419, 419, 419, 419, 419, 419, 419, 419, 419, 399, 399, 399, 431, 399, 399, 404, 404, 404, 431, 404, 404, 406, 431, 406, 406, 406, 406, 406, 406, 424, 424, 424, 431, 424, 424, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 427, 431, 427, 427, 427, 427, 427, 427, 427, 427, 427, 429, 429, 429, 431, 429, 429, 423, 423, 423, 431, 423, 423, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 428, 428, 428, 431, 428, 428, 25, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431 } ; static const flex_int16_t yy_chk[3515] = { 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, 443, 42, 38, 32, 443, 32, 37, 37, 33, 37, 37, 43, 37, 43, 519, 32, 42, 518, 100, 32, 100, 32, 39, 39, 39, 44, 43, 115, 43, 39, 39, 480, 39, 39, 39, 39, 40, 40, 40, 102, 44, 102, 115, 40, 40, 479, 40, 40, 40, 40, 48, 48, 478, 48, 55, 48, 114, 50, 50, 55, 50, 40, 50, 60, 60, 60, 61, 60, 60, 67, 60, 61, 114, 477, 67, 68, 40, 41, 41, 41, 68, 71, 117, 476, 41, 41, 71, 41, 41, 41, 41, 47, 47, 47, 202, 455, 47, 117, 47, 47, 47, 47, 47, 454, 47, 47, 49, 49, 49, 202, 95, 49, 95, 49, 49, 49, 49, 49, 49, 49, 49, 210, 95, 210, 441, 63, 63, 63, 49, 63, 63, 63, 63, 69, 77, 83, 86, 69, 69, 77, 83, 86, 430, 88, 49, 51, 51, 51, 88, 211, 51, 211, 51, 51, 51, 51, 51, 51, 51, 51, 54, 54, 54, 425, 90, 54, 416, 54, 54, 90, 54, 54, 103, 54, 56, 56, 56, 103, 96, 56, 96, 56, 56, 415, 56, 56, 56, 56, 78, 78, 96, 78, 395, 78, 116, 82, 56, 82, 82, 82, 82, 82, 385, 82, 87, 87, 87, 89, 89, 89, 116, 370, 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, 337, 118, 91, 104, 275, 97, 98, 104, 104, 101, 108, 108, 108, 138, 62, 76, 76, 76, 138, 275, 76, 76, 76, 76, 76, 76, 76, 148, 76, 79, 79, 79, 148, 318, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 311, 307, 80, 80, 80, 80, 80, 80, 80, 80, 80, 84, 84, 84, 290, 99, 84, 99, 84, 84, 84, 84, 84, 84, 84, 85, 272, 85, 85, 85, 85, 85, 85, 85, 99, 105, 105, 124, 105, 105, 269, 105, 106, 106, 161, 106, 106, 106, 106, 161, 99, 107, 107, 124, 107, 107, 107, 107, 110, 110, 110, 126, 126, 126, 266, 110, 110, 263, 110, 110, 110, 110, 112, 112, 112, 244, 167, 141, 228, 112, 112, 167, 112, 112, 121, 112, 217, 165, 121, 121, 125, 125, 125, 141, 284, 125, 284, 125, 125, 125, 125, 125, 125, 125, 125, 128, 128, 128, 131, 131, 128, 131, 449, 131, 128, 130, 449, 130, 130, 130, 130, 130, 451, 130, 130, 132, 451, 132, 132, 132, 132, 132, 132, 132, 132, 133, 276, 133, 133, 133, 133, 133, 133, 133, 133, 135, 135, 135, 163, 162, 135, 276, 135, 135, 135, 135, 135, 139, 135, 135, 160, 139, 139, 142, 142, 142, 159, 173, 142, 158, 142, 142, 173, 142, 142, 142, 142, 145, 145, 145, 123, 182, 145, 94, 145, 145, 182, 145, 145, 72, 145, 147, 147, 147, 149, 153, 153, 153, 149, 149, 150, 150, 150, 70, 150, 150, 224, 150, 151, 151, 151, 224, 151, 151, 151, 151, 152, 152, 152, 25, 152, 152, 152, 152, 154, 154, 154, 1, 154, 154, 154, 154, 155, 155, 155, 0, 155, 155, 248, 155, 156, 156, 156, 248, 156, 156, 156, 156, 168, 188, 188, 188, 168, 168, 169, 169, 169, 334, 0, 169, 169, 169, 169, 169, 169, 169, 253, 169, 170, 170, 170, 253, 334, 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, 453, 172, 174, 174, 453, 174, 174, 174, 174, 175, 175, 0, 175, 175, 175, 175, 179, 179, 179, 0, 0, 179, 179, 179, 179, 179, 179, 179, 260, 179, 180, 180, 180, 260, 0, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 304, 181, 304, 181, 183, 183, 184, 183, 301, 183, 184, 184, 185, 301, 185, 185, 185, 185, 185, 319, 185, 186, 186, 186, 319, 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, 456, 203, 204, 204, 456, 204, 204, 204, 204, 205, 205, 201, 205, 205, 205, 205, 206, 206, 326, 206, 206, 0, 206, 326, 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, 341, 212, 0, 209, 209, 341, 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, 236, 236, 236, 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, 342, 225, 0, 225, 230, 342, 230, 230, 230, 230, 230, 459, 230, 230, 231, 459, 231, 231, 231, 231, 231, 231, 231, 231, 232, 232, 232, 0, 349, 232, 0, 232, 232, 349, 232, 232, 386, 232, 233, 233, 233, 386, 401, 233, 0, 233, 233, 401, 233, 233, 233, 233, 234, 234, 234, 0, 402, 234, 0, 234, 234, 402, 234, 234, 234, 234, 238, 238, 238, 0, 238, 238, 0, 238, 239, 239, 239, 0, 239, 239, 239, 239, 240, 240, 240, 0, 240, 240, 240, 240, 241, 241, 241, 245, 245, 245, 0, 0, 245, 245, 245, 245, 245, 245, 245, 0, 245, 246, 246, 246, 0, 0, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 0, 0, 247, 247, 247, 247, 247, 247, 247, 247, 247, 249, 264, 264, 264, 249, 249, 250, 250, 0, 250, 250, 462, 250, 251, 251, 462, 251, 251, 251, 251, 252, 252, 252, 0, 252, 252, 0, 252, 254, 254, 254, 0, 254, 254, 254, 254, 255, 255, 255, 0, 255, 255, 255, 255, 256, 0, 256, 256, 256, 256, 256, 0, 256, 257, 0, 257, 257, 257, 257, 257, 257, 257, 258, 0, 258, 258, 258, 258, 258, 258, 258, 259, 0, 259, 259, 259, 259, 259, 0, 259, 261, 0, 261, 261, 261, 261, 261, 261, 261, 262, 0, 262, 262, 262, 262, 262, 262, 262, 267, 267, 267, 270, 270, 270, 273, 273, 273, 277, 277, 0, 277, 277, 465, 277, 278, 278, 465, 278, 278, 278, 278, 279, 279, 279, 279, 281, 281, 281, 282, 282, 282, 283, 283, 283, 285, 285, 285, 0, 0, 285, 0, 285, 285, 285, 285, 285, 0, 285, 285, 286, 286, 286, 0, 0, 286, 0, 286, 286, 286, 286, 286, 286, 286, 286, 287, 287, 287, 289, 289, 289, 0, 0, 289, 291, 291, 291, 289, 293, 293, 293, 0, 293, 293, 469, 293, 294, 294, 469, 294, 0, 294, 295, 295, 295, 0, 295, 295, 295, 295, 296, 296, 296, 0, 296, 296, 296, 296, 297, 0, 297, 297, 297, 297, 297, 472, 297, 297, 298, 472, 298, 298, 298, 298, 298, 298, 298, 298, 299, 0, 299, 299, 299, 299, 299, 299, 299, 299, 300, 0, 300, 300, 300, 300, 300, 481, 300, 300, 302, 481, 302, 302, 302, 302, 302, 302, 302, 302, 303, 0, 303, 303, 303, 303, 303, 303, 303, 303, 305, 305, 305, 0, 0, 305, 0, 305, 305, 0, 305, 305, 0, 305, 306, 306, 306, 0, 0, 306, 0, 306, 306, 0, 306, 306, 306, 306, 308, 308, 308, 309, 309, 309, 0, 309, 309, 0, 309, 310, 310, 310, 0, 310, 310, 310, 310, 312, 312, 312, 313, 313, 313, 0, 0, 313, 313, 313, 313, 313, 313, 313, 0, 313, 314, 314, 314, 0, 0, 314, 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 0, 315, 315, 484, 315, 316, 316, 484, 316, 316, 316, 316, 317, 317, 0, 317, 317, 317, 317, 320, 339, 339, 339, 320, 320, 321, 321, 321, 0, 321, 321, 0, 321, 322, 322, 322, 0, 322, 322, 322, 322, 323, 0, 323, 323, 323, 323, 323, 0, 323, 324, 0, 324, 324, 324, 324, 324, 324, 324, 325, 325, 327, 325, 0, 325, 327, 327, 328, 0, 328, 328, 328, 328, 328, 0, 328, 329, 0, 329, 329, 329, 329, 329, 329, 329, 336, 336, 336, 336, 343, 371, 371, 371, 343, 343, 344, 344, 344, 0, 344, 344, 0, 344, 345, 345, 345, 0, 345, 345, 345, 345, 346, 0, 346, 346, 346, 346, 346, 488, 346, 346, 347, 488, 347, 347, 347, 347, 347, 347, 347, 347, 348, 348, 350, 348, 0, 348, 350, 350, 352, 0, 352, 352, 352, 352, 352, 507, 352, 352, 353, 507, 353, 353, 353, 353, 353, 353, 353, 353, 355, 355, 0, 355, 355, 522, 355, 356, 356, 522, 356, 356, 356, 356, 357, 357, 357, 0, 357, 357, 0, 357, 358, 358, 358, 0, 358, 358, 358, 358, 359, 359, 359, 0, 359, 359, 359, 359, 360, 360, 360, 0, 360, 360, 525, 360, 361, 361, 525, 361, 0, 361, 362, 362, 362, 0, 362, 362, 362, 362, 363, 363, 363, 0, 363, 363, 363, 363, 364, 0, 364, 364, 364, 364, 364, 0, 364, 365, 0, 365, 365, 365, 365, 365, 365, 365, 366, 0, 366, 366, 366, 366, 366, 366, 366, 368, 368, 368, 368, 373, 373, 373, 0, 373, 373, 0, 373, 374, 374, 374, 0, 374, 374, 374, 374, 375, 375, 375, 0, 375, 375, 375, 375, 376, 376, 376, 0, 376, 376, 529, 376, 377, 377, 529, 377, 0, 377, 378, 378, 378, 0, 378, 378, 378, 378, 379, 379, 379, 0, 379, 379, 379, 379, 380, 0, 380, 380, 380, 380, 380, 541, 380, 380, 381, 541, 381, 381, 381, 381, 381, 381, 381, 381, 382, 0, 382, 382, 382, 382, 382, 382, 382, 382, 383, 383, 383, 0, 383, 383, 0, 383, 384, 384, 384, 0, 384, 384, 384, 384, 387, 396, 396, 396, 387, 387, 388, 388, 388, 0, 388, 388, 0, 388, 389, 389, 389, 0, 389, 389, 389, 389, 390, 0, 390, 390, 390, 390, 390, 0, 390, 391, 0, 391, 391, 391, 391, 391, 391, 391, 392, 392, 392, 392, 399, 399, 399, 0, 399, 399, 0, 399, 400, 400, 400, 0, 400, 400, 400, 400, 403, 417, 417, 417, 403, 403, 404, 404, 404, 0, 404, 404, 0, 404, 405, 405, 405, 0, 405, 405, 405, 405, 406, 0, 406, 406, 406, 406, 406, 551, 406, 406, 407, 551, 407, 407, 407, 407, 407, 407, 407, 407, 408, 408, 408, 0, 408, 408, 0, 408, 409, 409, 409, 0, 409, 409, 409, 409, 410, 410, 410, 0, 410, 410, 410, 410, 411, 411, 411, 411, 420, 420, 420, 0, 420, 420, 0, 420, 421, 421, 421, 0, 421, 421, 421, 421, 422, 422, 422, 0, 422, 422, 422, 422, 423, 423, 423, 0, 423, 423, 0, 423, 424, 424, 424, 0, 424, 424, 424, 424, 428, 428, 428, 0, 428, 428, 0, 428, 429, 429, 429, 0, 429, 429, 429, 429, 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, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 440, 440, 0, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 442, 555, 442, 561, 565, 555, 579, 561, 565, 0, 579, 442, 444, 444, 444, 0, 0, 589, 0, 444, 444, 589, 444, 444, 445, 445, 445, 0, 0, 0, 0, 445, 445, 0, 445, 445, 446, 446, 0, 0, 446, 447, 447, 0, 0, 447, 448, 448, 448, 0, 0, 448, 0, 448, 448, 448, 448, 448, 448, 450, 450, 450, 0, 0, 450, 0, 450, 450, 0, 450, 450, 452, 452, 452, 0, 452, 452, 457, 457, 0, 0, 457, 458, 458, 458, 0, 0, 458, 458, 458, 458, 458, 458, 458, 460, 0, 460, 460, 460, 460, 460, 461, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 461, 463, 463, 0, 463, 463, 464, 464, 464, 0, 0, 0, 0, 464, 464, 0, 464, 464, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 467, 0, 467, 467, 467, 467, 467, 467, 468, 468, 468, 0, 0, 468, 0, 468, 468, 468, 468, 468, 468, 470, 470, 470, 0, 0, 470, 0, 470, 470, 0, 470, 470, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 473, 473, 473, 0, 473, 473, 474, 474, 474, 0, 474, 474, 475, 475, 475, 0, 475, 475, 482, 482, 482, 0, 0, 482, 482, 482, 482, 482, 482, 482, 483, 483, 483, 0, 0, 483, 483, 483, 483, 483, 483, 483, 485, 485, 0, 485, 485, 486, 486, 486, 0, 0, 486, 486, 486, 486, 486, 486, 486, 487, 487, 0, 0, 487, 489, 489, 0, 0, 489, 490, 490, 490, 0, 0, 490, 0, 490, 490, 490, 490, 490, 491, 0, 491, 491, 491, 491, 491, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 493, 0, 493, 493, 493, 493, 493, 494, 494, 494, 494, 494, 494, 494, 494, 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, 497, 497, 498, 498, 0, 498, 498, 499, 499, 0, 499, 499, 500, 500, 0, 500, 500, 501, 501, 501, 0, 0, 0, 0, 501, 501, 0, 501, 501, 502, 502, 502, 0, 0, 502, 0, 502, 502, 502, 502, 502, 502, 503, 503, 503, 0, 0, 503, 0, 503, 503, 503, 503, 503, 503, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 504, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, 506, 506, 0, 0, 506, 508, 508, 0, 0, 508, 509, 0, 509, 509, 509, 509, 509, 509, 510, 0, 510, 510, 510, 510, 510, 510, 511, 511, 511, 0, 0, 511, 0, 511, 511, 0, 511, 511, 512, 512, 512, 0, 0, 512, 0, 512, 512, 0, 512, 512, 513, 513, 0, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 515, 515, 515, 0, 515, 515, 516, 516, 516, 0, 516, 516, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 520, 520, 520, 0, 0, 520, 520, 520, 520, 520, 520, 520, 521, 521, 521, 0, 0, 521, 521, 521, 521, 521, 521, 521, 523, 523, 0, 523, 523, 524, 524, 0, 524, 524, 526, 526, 526, 0, 526, 526, 527, 0, 527, 527, 527, 527, 527, 528, 0, 528, 528, 528, 528, 528, 530, 0, 530, 530, 530, 530, 530, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 535, 0, 535, 535, 536, 536, 0, 536, 536, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, 538, 538, 538, 0, 0, 538, 0, 538, 538, 538, 538, 538, 538, 539, 539, 539, 0, 539, 539, 540, 0, 540, 540, 540, 540, 540, 540, 542, 0, 542, 542, 542, 542, 542, 542, 543, 543, 543, 0, 0, 543, 0, 543, 543, 0, 543, 543, 544, 544, 544, 0, 0, 544, 0, 544, 544, 0, 544, 544, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 546, 546, 546, 0, 546, 546, 547, 547, 547, 0, 547, 547, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 549, 549, 549, 0, 0, 549, 549, 549, 549, 549, 549, 549, 550, 550, 0, 550, 550, 552, 552, 552, 0, 552, 552, 553, 0, 553, 553, 553, 553, 553, 554, 554, 0, 0, 554, 556, 0, 556, 556, 556, 556, 556, 557, 0, 557, 557, 557, 557, 557, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 560, 0, 560, 560, 560, 560, 560, 560, 560, 560, 560, 562, 562, 562, 0, 562, 562, 563, 0, 563, 563, 563, 563, 563, 563, 564, 564, 0, 0, 564, 566, 0, 566, 566, 566, 566, 566, 566, 567, 567, 0, 567, 567, 568, 568, 568, 0, 568, 568, 569, 569, 569, 0, 569, 569, 570, 0, 570, 570, 570, 570, 570, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 572, 0, 572, 572, 572, 572, 572, 572, 572, 572, 572, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 574, 0, 574, 574, 574, 574, 574, 574, 574, 574, 574, 575, 575, 575, 0, 575, 575, 576, 576, 576, 0, 576, 576, 577, 0, 577, 577, 577, 577, 577, 577, 578, 578, 578, 0, 578, 578, 580, 580, 580, 0, 580, 580, 581, 0, 581, 581, 581, 581, 581, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 0, 583, 583, 583, 583, 583, 583, 583, 583, 583, 584, 0, 584, 584, 584, 584, 584, 584, 584, 584, 584, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 587, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 588, 588, 588, 0, 588, 588, 590, 590, 590, 0, 590, 590, 591, 0, 591, 591, 591, 591, 591, 591, 592, 592, 592, 0, 592, 592, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 594, 0, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, 595, 595, 0, 595, 595, 596, 596, 596, 0, 596, 596, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 598, 598, 598, 0, 598, 598, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431 } ; 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, 2019 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 1568 "mix_scanner.c" #line 1570 "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 #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr ); #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const 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, (size_t) 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 = '*'; \ int 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 = (int) fread(buf, 1, (yy_size_t) 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 /*LINTED*/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 { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; 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( ); } { #line 151 "../../mixlib/mix_scanner.l" #line 156 "../../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 1840 "mix_scanner.c" while ( /*CONSTCOND*/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 { 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 >= 432 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; *(yy_state_ptr)++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 3467 ); 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_LINENO_REWIND_TO(yy_cp - 1); (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_LINENO_REWIND_TO(yy_cp - 1); (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_LINENO_REWIND_TO(yy_cp - 1); (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_LINENO_REWIND_TO(yy_cp - 1); (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: /* rule 54 can match eol */ YY_RULE_SETUP #line 486 "../../mixlib/mix_scanner.l" { ENTER_EVAL (); } YY_BREAK case 55: YY_RULE_SETUP #line 490 "../../mixlib/mix_scanner.l" { RETURN_ERROR (MIX_PERR_INV_FSPEC, g_strdup_printf ("(%s", yytext)); } YY_BREAK case 56: YY_RULE_SETUP #line 494 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_FSPEC, yytext); YY_BREAK case 57: YY_RULE_SETUP #line 499 "../../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 58: YY_RULE_SETUP #line 504 "../../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 59: YY_RULE_SETUP #line 513 "../../mixlib/mix_scanner.l" { expr_val = eval_binop_ (yytext, expr_val, mix_short_to_word_fast (parser->loc_count)); } YY_BREAK case 60: YY_RULE_SETUP #line 517 "../../mixlib/mix_scanner.l" unput_word_ (mix_short_to_word_fast (parser->loc_count)); YY_BREAK case 61: YY_RULE_SETUP #line 518 "../../mixlib/mix_scanner.l" expr_val = mix_word_new (atol (yytext)); YY_BREAK case 62: YY_RULE_SETUP #line 519 "../../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 63: /* rule 63 can match eol */ YY_RULE_SETUP #line 526 "../../mixlib/mix_scanner.l" unput (yytext[0]); unput_word_ (expr_val); yy_pop_state (); YY_BREAK case 64: YY_RULE_SETUP #line 527 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_EXPR, yytext); YY_BREAK case 65: YY_RULE_SETUP #line 531 "../../mixlib/mix_scanner.l" { is_fp = TRUE; wexpr_val_tmp = mix_word_new (atol (yytext)); } YY_BREAK case 66: YY_RULE_SETUP #line 535 "../../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 67: /* rule 67 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ YY_LINENO_REWIND_TO(yy_cp - 1); (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 550 "../../mixlib/mix_scanner.l" wexpr_val = mix_word_new (atol (yytext)); YY_BREAK case 68: /* rule 68 can match eol */ *yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ YY_LINENO_REWIND_TO(yy_cp - 1); (yy_c_buf_p) = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 551 "../../mixlib/mix_scanner.l" ENTER_EVAL (); YY_BREAK case 69: *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 552 "../../mixlib/mix_scanner.l" /* eat comma if followed by expression */ YY_BREAK case 70: /* rule 70 can match eol */ YY_RULE_SETUP #line 553 "../../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 71: YY_RULE_SETUP #line 562 "../../mixlib/mix_scanner.l" RETURN_ERROR (MIX_PERR_INV_EXPR, NULL); YY_BREAK case 72: YY_RULE_SETUP #line 565 "../../mixlib/mix_scanner.l" ECHO; YY_BREAK #line 2636 "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 user's declarations */ } /* 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) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); 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), 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_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int 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, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (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) { yy_state_type yy_current_state; 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 ) { 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 >= 432 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 ) { int yy_is_jam; 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 >= 432 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 431); if ( ! yy_is_jam ) *(yy_state_ptr)++ = yy_current_state; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp ) { 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. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; 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) = (int) 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; } #endif #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 = (int) ((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 0; 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( (yy_size_t) (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 ); } /* 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) { yy_size_t 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; /* After all that talk, this was set to 1 anyways... */ (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. */ yy_size_t 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 NULL; 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 = (int) (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 = NULL; 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 (const char * yystr ) { return yy_scan_bytes( yystr, (int) 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 (const 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 = (yy_size_t) (_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_size_t) (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 yynoreturn yy_fatal_error (const char* msg ) { 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 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) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (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 = NULL; yyout = NULL; #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, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return 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 realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 565 "../../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.3.1/mixlib/mix_vm_command.h0000644000175000017500000002161014171044646012411 /* -*-c-*- ---------------- mix_vm_command.h : * declarations for mix_vm_command_t, describing commands issued to a vm * ------------------------------------------------------------------ * Copyright (C) 2001, 2006, 2007, 2014, 2022 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_SBT, /* set backtrace limit */ 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.3.1/mixlib/mix_io.c0000644000175000017500000001150112112755472010670 /* -*-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.3.1/mixlib/mix_vm.c0000644000175000017500000004372413743070633010717 /* -*-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_queue_free (vm->address_list); vm->address_list = g_queue_new (); } } /* 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->max_backtrace_amount = MIX_MAX_TRACE_AMOUNT; vm->address_list = g_queue_new (); 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_queue_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); if ( vm->max_backtrace_amount != 0 ) { g_queue_push_head (vm->address_list, GINT_TO_POINTER ((gint)get_loc_ (vm))); if ( vm->max_backtrace_amount > 0 && g_queue_get_length (vm->address_list) > vm->max_backtrace_amount ) { g_queue_pop_tail (vm->address_list); } } 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); if ( vm->max_backtrace_amount != 0 ) { g_queue_push_head (vm->address_list, GINT_TO_POINTER ((gint)get_loc_ (vm))); if ( vm->max_backtrace_amount > 0 && g_queue_get_length (vm->address_list) > vm->max_backtrace_amount ) { g_queue_pop_tail (vm->address_list); } } 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 */ GQueue * mix_vm_get_backtrace (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, NULL); return vm->address_list; } gint mix_vm_get_max_trace (const mix_vm_t *vm) { g_return_val_if_fail (vm != NULL, -2); return vm->max_backtrace_amount; } void mix_vm_set_max_trace (mix_vm_t *vm, gint val) { g_return_if_fail (vm != NULL); g_return_if_fail (val >= -1); vm->max_backtrace_amount = val; } mdk-1.3.1/mixlib/mix.c0000644000175000017500000000522313743203364010204 /* -*-c-*- -------------- mix.c : * Implementation of the functions declared in mix.h * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2005, 2006, 2007, 2008, 2009, 2014, 2020 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-2020 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.3.1/mixlib/mix_types.c0000644000175000017500000003664213415031363011433 /* -*-c-*- ------------------ mix_types.c : * Implementation file for mix_types.h declarations. * ------------------------------------------------------------------ * Copyright (C) 2000, 2001, 2002, 2004, 2006, 2007, 2019 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 { result |= mix_word_sign (x); } } else { result = mix_word_magnitude (x) - mix_word_magnitude (y); if (result < 0) result = -result|mix_word_sign (y); else result = result|mix_word_sign (x); } 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 *l = dif|mix_word_sign (x); } } 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.3.1/mixlib/mix_scanner.l0000644000175000017500000004066113415162376011736 /* -*-c-*- -------------- mix_scanner.l : * Lexical scanner used by mix_parser_t * ------------------------------------------------------------------ * Copyright (C) 2000, 2003, 2004, 2006, 2007, 2008, 2009, 2019 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 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}/")"(({ws}+.*\n)|\n) { ENTER_EVAL (); } {expr}")".+ { RETURN_ERROR (MIX_PERR_INV_FSPEC, g_strdup_printf ("(%s", yytext)); } . 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.3.1/mixlib/mix_symbol_table.h0000644000175000017500000000645212112755472012753 /* -*-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.3.1/mixlib/mix_device.h0000644000175000017500000000667313743070633011543 /* -*-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, mix_word_t val); /* Check if a device is busy */ extern gboolean mix_device_busy (const mix_device_t *dev); #endif /* MIX_DEVICE_H */ mdk-1.3.1/mixlib/xmix_vm_handlers.c0000644000175000017500000011136113743201230012745 /* -*-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, 2020 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)"}, { "sbt", cmd_sbt_, N_("Set limit on backtrace of executed instructions"), "sbt [LIMIT] (e.g sbt 100)"}, { "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_error_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 const gchar *NULLSTR = "(null)"; 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; GQueue *add = mix_vm_get_backtrace (dis->vm); while (g_queue_get_length (add) > k && (no == 0 || k < no)) { BUFFER[0] = '\0'; address = GPOINTER_TO_INT (g_queue_peek_nth (add, k)); 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 ( (j < SIZE - 1) && (BUFFER[j] != '\n') && (BUFFER[j] != '\r') && (BUFFER[j] != '\f') && (BUFFER[j] != '\0') ) j++; BUFFER[j] = '\0'; } if ( (strlen (BUFFER) == 0) || !(strcmp(NULLSTR,BUFFER)) ) 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; } return TRUE; } gboolean cmd_sbt_ (mix_vm_cmd_dispatcher_t *dis, const gchar *arg) { gint no = atoi (arg); GQueue *add = mix_vm_get_backtrace (dis->vm); if ( strlen(arg) == 0 ) { log_message_ (dis, "Backtrace limit is %d instructions", mix_vm_get_max_trace(dis->vm)); } else { if ( no >= -1 ) { log_message_ (dis, "Backtrace limit changed from %d to %d instructions", mix_vm_get_max_trace(dis->vm), no); mix_vm_set_max_trace (dis->vm, no); /* We might have shrunk the queue and need to resize it */ if ( no >= 0 ) { while ( g_queue_get_length (add) > no ) { g_queue_pop_tail(add); } } } else { log_error_ (dis, "Error: %d is not a valid number of instructions.", no); } } 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.3.1/mixlib/mix_config.h0000644000175000017500000000562512112755472011545 /* -*-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.3.1/mixlib/mix_types.h0000644000175000017500000002277512622454575011457 /* -*-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.3.1/mixlib/xmix_vm.h0000644000175000017500000001142313743070633011103 /* ---------------------- 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_]; gint max_backtrace_amount; /* the limit of backtraces */ 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 */ GQueue *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.3.1/mixlib/mix_ins.c0000644000175000017500000002211112622454575011057 /* -*-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.3.1/mixlib/completion.h0000644000175000017500000000476412262421405011567 /* 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.3.1/mixlib/Makefile.am0000644000175000017500000000331313414746125011277 ## Process this file with automake to produce Makefile.in # Copyright (C) 2000, 2001, 2006, 2014, 2019 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\" CLEANFILES = mix_scanner.c mix_eval_scanner.c 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.3.1/mixlib/mix_parser.c0000644000175000017500000004417713415023121011556 /* -*-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 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); } } static void update_ls_ (gpointer symbol, gpointer value, gpointer parser) { /* add an instruction on current location and update refs to it */ mix_word_t w = (mix_word_t) GPOINTER_TO_UINT (value); mix_parser_t *par = (mix_parser_t *) parser; update_future_refs_ (par, (const gchar *)symbol, TRUE); add_raw_ (par, w, 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 */ 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.3.1/mixlib/mix_vm_dump.h0000644000175000017500000000563312112755472011746 /* ---------------------- 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.3.1/mixlib/mix_eval.h0000644000175000017500000000614512112755472011225 /* -*-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.3.1/mixlib/Makefile.in0000664000175000017500000007406115065042013011307 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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, 2019 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 = cr 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_RANLIB = $(RANLIB) 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__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/completion.Po ./$(DEPDIR)/mix.Po \ ./$(DEPDIR)/mix_code_file.Po ./$(DEPDIR)/mix_config.Po \ ./$(DEPDIR)/mix_device.Po ./$(DEPDIR)/mix_eval.Po \ ./$(DEPDIR)/mix_eval_scanner.Po ./$(DEPDIR)/mix_file.Po \ ./$(DEPDIR)/mix_ins.Po ./$(DEPDIR)/mix_io.Po \ ./$(DEPDIR)/mix_parser.Po ./$(DEPDIR)/mix_predicate.Po \ ./$(DEPDIR)/mix_predicate_list.Po ./$(DEPDIR)/mix_scanner.Po \ ./$(DEPDIR)/mix_src_file.Po ./$(DEPDIR)/mix_symbol_table.Po \ ./$(DEPDIR)/mix_types.Po ./$(DEPDIR)/mix_vm.Po \ ./$(DEPDIR)/mix_vm_clock.Po ./$(DEPDIR)/mix_vm_command.Po \ ./$(DEPDIR)/mix_vm_dump.Po ./$(DEPDIR)/xmix_device.Po \ ./$(DEPDIR)/xmix_io.Po ./$(DEPDIR)/xmix_vm.Po \ ./$(DEPDIR)/xmix_vm_command.Po ./$(DEPDIR)/xmix_vm_handlers.Po 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 distdir-am 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)` 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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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 CLEANFILES = mix_scanner.c mix_eval_scanner.c 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: -$(am__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)$(libmix_a_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@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_code_file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_config.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_device.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_eval.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_eval_scanner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_ins.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_io.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_predicate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_predicate_list.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_scanner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_src_file.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_symbol_table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_clock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_command.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mix_vm_dump.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_device.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_io.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_vm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_vm_command.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmix_vm_handlers.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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: -$(am__rm_f) $(CLEANFILES) distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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." -$(am__rm_f) mix_eval_scanner.c -$(am__rm_f) mix_scanner.c clean: clean-recursive clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/completion.Po -rm -f ./$(DEPDIR)/mix.Po -rm -f ./$(DEPDIR)/mix_code_file.Po -rm -f ./$(DEPDIR)/mix_config.Po -rm -f ./$(DEPDIR)/mix_device.Po -rm -f ./$(DEPDIR)/mix_eval.Po -rm -f ./$(DEPDIR)/mix_eval_scanner.Po -rm -f ./$(DEPDIR)/mix_file.Po -rm -f ./$(DEPDIR)/mix_ins.Po -rm -f ./$(DEPDIR)/mix_io.Po -rm -f ./$(DEPDIR)/mix_parser.Po -rm -f ./$(DEPDIR)/mix_predicate.Po -rm -f ./$(DEPDIR)/mix_predicate_list.Po -rm -f ./$(DEPDIR)/mix_scanner.Po -rm -f ./$(DEPDIR)/mix_src_file.Po -rm -f ./$(DEPDIR)/mix_symbol_table.Po -rm -f ./$(DEPDIR)/mix_types.Po -rm -f ./$(DEPDIR)/mix_vm.Po -rm -f ./$(DEPDIR)/mix_vm_clock.Po -rm -f ./$(DEPDIR)/mix_vm_command.Po -rm -f ./$(DEPDIR)/mix_vm_dump.Po -rm -f ./$(DEPDIR)/xmix_device.Po -rm -f ./$(DEPDIR)/xmix_io.Po -rm -f ./$(DEPDIR)/xmix_vm.Po -rm -f ./$(DEPDIR)/xmix_vm_command.Po -rm -f ./$(DEPDIR)/xmix_vm_handlers.Po -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 -f ./$(DEPDIR)/completion.Po -rm -f ./$(DEPDIR)/mix.Po -rm -f ./$(DEPDIR)/mix_code_file.Po -rm -f ./$(DEPDIR)/mix_config.Po -rm -f ./$(DEPDIR)/mix_device.Po -rm -f ./$(DEPDIR)/mix_eval.Po -rm -f ./$(DEPDIR)/mix_eval_scanner.Po -rm -f ./$(DEPDIR)/mix_file.Po -rm -f ./$(DEPDIR)/mix_ins.Po -rm -f ./$(DEPDIR)/mix_io.Po -rm -f ./$(DEPDIR)/mix_parser.Po -rm -f ./$(DEPDIR)/mix_predicate.Po -rm -f ./$(DEPDIR)/mix_predicate_list.Po -rm -f ./$(DEPDIR)/mix_scanner.Po -rm -f ./$(DEPDIR)/mix_src_file.Po -rm -f ./$(DEPDIR)/mix_symbol_table.Po -rm -f ./$(DEPDIR)/mix_types.Po -rm -f ./$(DEPDIR)/mix_vm.Po -rm -f ./$(DEPDIR)/mix_vm_clock.Po -rm -f ./$(DEPDIR)/mix_vm_command.Po -rm -f ./$(DEPDIR)/mix_vm_dump.Po -rm -f ./$(DEPDIR)/xmix_device.Po -rm -f ./$(DEPDIR)/xmix_io.Po -rm -f ./$(DEPDIR)/xmix_vm.Po -rm -f ./$(DEPDIR)/xmix_vm_command.Po -rm -f ./$(DEPDIR)/xmix_vm_handlers.Po -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 \ am--depfiles 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/mixlib/mix_predicate_list.h0000644000175000017500000000373212112755472013270 /* -*-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.3.1/mixlib/mix.h0000644000175000017500000000355412112755472010217 /* -*-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.3.1/po/0000775000175000017500000000000015065042311006445 5mdk-1.3.1/po/Makefile.in.in0000644000175000017500000001575615065042012011051 # 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@ localedir = @localedir@ 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)$(localedir)/$$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)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(localedir)/$$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.3.1/po/POTFILES.in0000644000175000017500000000113412112755472010150 # 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.3.1/po/ChangeLog0000644000175000017500000000665610770465100010155 2004-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.3.1/po/Makevars0000644000175000017500000000207310770465100010064 # 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.3.1/po/de.po0000644000175000017500000011023210770465100007315 # 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.3.1/po/LINGUAS0000644000175000017500000000004310770465100007410 # Set of available translations de mdk-1.3.1/missing0000755000175000017500000001706014767572401007370 #! /bin/sh # Common wrapper for a few potentially missing GNU and other programs. scriptversion=2024-06-07.14; # UTC # shellcheck disable=SC2006,SC2268 # we must support pre-POSIX shells # Copyright (C) 1996-2024 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 autogen autoheader autom4te automake autoreconf bison flex help2man lex makeinfo perl yacc Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Report bugs to . GNU Automake home page: . General help using GNU software: ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing (GNU Automake) $scriptversion" 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=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake|autoreconf) 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'" autoheader_deps="'acconfig.h'" automake_deps="'Makefile.am'" aclocal_deps="'acinclude.m4'" case $normalized_program in aclocal*) echo "You should only need it if you modified $aclocal_deps or" echo "$configure_deps." ;; autoconf*) echo "You should only need it if you modified $configure_deps." ;; autogen*) echo "You should only need it if you modified a '.def' or '.tpl' file." echo "You may want to install the GNU AutoGen package:" echo "<$gnu_software_URL/autogen/>" ;; autoheader*) echo "You should only need it if you modified $autoheader_deps or" echo "$configure_deps." ;; automake*) echo "You should only need it if you modified $automake_deps or" echo "$configure_deps." ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." ;; autoreconf*) echo "You should only need it if you modified $aclocal_deps or" echo "$automake_deps or $autoheader_deps or $automake_deps or" echo "$configure_deps." ;; 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/>" ;; 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/>" ;; 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>" ;; 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/>" ;; perl*) echo "You should only need it to run GNU Autoconf, GNU Automake, " echo " assorted other tools, or if you modified a Perl source file." echo "You may want to install the Perl 5 language interpreter:" echo "<$perl_URL>" ;; *) 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 program_details "$normalized_program" } 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mdk-1.3.1/install-sh0000755000175000017500000003611514767572401007777 #!/bin/sh # install - install a program, script, or datafile scriptversion=2024-06-19.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Report bugs to . GNU Automake home page: . General help using GNU software: ." while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: mdk-1.3.1/Makefile.in0000664000175000017500000007066615065042013010032 # Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 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)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) 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 distdir-am 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)` 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 -700 -exec chmod u+rwx {} ';' \ ; 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 = -9 DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = \ find . \( -type f -a \! \ \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -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@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ 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__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ 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 $(AM_V_at)rm -f stamp-h1 $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_GEN)($(am__cd) $(top_srcdir) && $(AUTOHEADER)) $(AM_V_at)rm -f stamp-h1 $(AM_V_at)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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) $(AM_V_at)$(MKDIR_P) "$(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) | eval GZIP= gzip $(GZIP_ENV) -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-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(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) | eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= 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*) \ eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ 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) $(AM_DISTCHECK_DVI_TARGET) \ && $(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: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__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 dist-zstd 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: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% mdk-1.3.1/ChangeLog.20000644000175000017500000003302112112755472007667 2006-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.