ggobi-2.1.12/0000755000175000017500000000000014651542215006432 5ggobi-2.1.12/po/0000755000175000017500000000000014651542215007050 5ggobi-2.1.12/po/remove-potcdate.sin0000644000175000017500000000066014651530011012572 # Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } ggobi-2.1.12/po/Makefile.in.in0000644000175000017500000003170714651530011011441 # Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2005 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.14.4 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ localedir = $(datadir)/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = @MKINSTALLDIRS@ mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: stamp-po all-no: # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkinstalldirs) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkinstalldirs) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo 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 stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$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; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ $(SHELL) ./config.status force: # 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: ggobi-2.1.12/po/boldquot.sed0000644000175000017500000000033114651530011011302 s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g ggobi-2.1.12/po/en@quot.header0000644000175000017500000000226314651530011011547 # All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # ggobi-2.1.12/po/insert-header.sin0000644000175000017500000000124014651530011012221 # Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } ggobi-2.1.12/po/POTFILES.in0000644000175000017500000000011214651527764010553 # This is where we will put the files that we have marked for translation ggobi-2.1.12/po/quot.sed0000644000175000017500000000023114651530011010440 s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g ggobi-2.1.12/po/Makevars0000644000175000017500000000345014651527764010502 # 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_ --language=C # 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 = GGobi Developers # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = ggobi-help@lists.ggobi.org # 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 = ggobi-2.1.12/po/Rules-quot0000644000175000017500000000337614651530011010773 # Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$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 "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header ggobi-2.1.12/po/en@boldquot.header0000644000175000017500000000247114651530011012411 # All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # ggobi-2.1.12/src/0000755000175000017500000000000014651542215007221 5ggobi-2.1.12/src/lineedit.c0000644000175000017500000004637514651527764011135 /* lineedit.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include "vars.h" #include "externs.h" /*--------------------------------------------------------------------*/ gboolean record_add (eeMode mode, gint a, gint b, gchar * lbl, gchar * id, gchar ** vals, GGobiData * d, GGobiData * e, ggobid * gg) { gchar *s1, *s2; gint i, j; GList *l, *sl; splotd *sp; displayd *dsp; GGobiData *dtarget = d; greal *raw = NULL, x; vartabled *vt; gboolean found_missings = false; /*-- eventually check whether a->b already exists before adding --*/ if (mode == ADDING_EDGES) { g_assert (e->edge.n == e->nrows); g_assert (a >= 0 && b >= 0 && a != b); dtarget = e; } /*-- Make sure the id is unique -- usually only if adding points --*/ if (dtarget->idTable && id) { gchar *stmp; if (id && strlen (id) > 0) stmp = g_strdup (id); else stmp = g_strdup_printf ("%d", dtarget->nrows + 1); for (i = 0; i < dtarget->nrows; i++) { if (strcmp (stmp, dtarget->rowIds[i]) == 0) { g_printerr ("That id (%s) is already used (record %d)\n", stmp, i); g_free (stmp); return false; } } g_free (stmp); } if (dtarget->ncols) { raw = (greal *) g_malloc (dtarget->ncols * sizeof (greal)); for (j = 0; j < dtarget->ncols; j++) { vt = vartable_element_get (j, dtarget); if (strcmp (vals[j], "NA") == 0) { /*-- got a missing --*/ raw[j] = (greal) 0.0; /*-- or what? --*/ found_missings = true; } else { x = (greal) atof (vals[j]); if (vt->vartype == categorical) { /* Loop over levels, and add to the one that is closest to x. * Also, increment vt->level_counts[level] */ gint k, level = 0, dist, ddist = 0; for (k = 0; k < vt->nlevels; k++) { dist = fabs ((greal) vt->level_values[k] - x); if (k == 0) ddist = dist; /* initialize ddist */ else { if (dist < ddist) { level = k; ddist = dist; } } } raw[j] = (greal) vt->level_values[level]; vt->level_counts[level]++; /* then update the table -- ugh -- no event for this yet. I should make the expose event repopulate the table ... and I should update the table whenever any cases are added, categorical or not, come to think of it. nNAs could change, as well as Any of the real variable stats. */ { if (d->vartable_tree_view[categorical] != NULL) { GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path; vartable_iter_from_varno (j, d, &model, &iter); path = gtk_tree_model_get_path (model, &iter); gtk_tree_path_append_index (path, level); gtk_tree_model_get_iter (model, &iter, path); gtk_tree_path_free (path); gtk_list_store_set (GTK_LIST_STORE (model), &iter, VT_LEVEL_COUNT, vt->level_counts[level], -1); } } } else raw[j] = x; } } } /*-- Here's what the datad needs --*/ /* * some of this can be encapsulated as datad_record_add, as long * as problems with the sequence of operations don't arise. */ dtarget->nrows += 1; /*-- add a row label --*/ if (lbl && strlen (lbl) > 0) { rowlabel_add (lbl, dtarget); } else { s1 = g_strdup_printf ("%d", dtarget->nrows); rowlabel_add (s1, dtarget); } /*-- if necessary, add an id --*/ if (dtarget->idTable) { if (id && strlen (id) > 0) { datad_record_id_add (id, dtarget); } else { s2 = g_strdup_printf ("%d", dtarget->nrows); datad_record_id_add (s2, dtarget); /*-- don't free s2 --*/ } } pipeline_arrays_check_dimensions (dtarget); /* * Resetting rows_in_plot causes a rows_in_plot_changed * signal to be emitted, and the tour responds to that. */ rows_in_plot_set (dtarget, gg); /*-- allocate and initialize brushing arrays --*/ br_glyph_ids_add (dtarget, gg); /*-- this is adding the brushing color when it should use the color of the points, really --*/ br_color_ids_add (dtarget, gg); /* A default color was assigned during the reallocation; override it * only if adding edges */ if (mode == ADDING_EDGES) { dtarget->color.els[dtarget->nrows - 1] = dtarget->color_now.els[dtarget->nrows - 1] = d->color.els[a]; } br_hidden_alloc (dtarget); vectorb_realloc (&dtarget->pts_under_brush, dtarget->nrows); clusters_set (dtarget, gg); if (found_missings) { arrays_add_rows (&dtarget->missing, dtarget->nrows); for (j = 0; j < dtarget->ncols; j++) { if (strcmp (vals[j], "NA") == 0) { /*-- got a missing --*/ ggobi_data_set_missing(dtarget, dtarget->nrows - 1, j); } } } /*-- read in the data, push it through the first part of the pipeline --*/ if (dtarget->ncols) { for (j = 0; j < dtarget->ncols; j++) { dtarget->raw.vals[dtarget->nrows - 1][j] = dtarget->tform.vals[dtarget->nrows - 1][j] = raw[j]; tform_to_world_by_var (j, dtarget, gg); } } if (mode == ADDING_EDGES) { edges_alloc (e->nrows, e); e->edge.sym_endpoints[dtarget->nrows - 1].a = g_strdup (d->rowIds[a]); e->edge.sym_endpoints[dtarget->nrows - 1].b = g_strdup (d->rowIds[b]); e->edge.sym_endpoints[dtarget->nrows - 1].jpartner = -1; /* XXX */ unresolveAllEdgePoints (e); resolveEdgePoints (e, d); /* * If this is the first edge in the edge set, do something to * make it show up in the display menu. */ if (e->nrows == 1) { void GGOBI (edge_menus_update) (ggobid * gg); GGOBI (edge_menus_update) (gg); } } else { GSList *l; GGobiData *dd; for (l = gg->d; l; l = l->next) { dd = (GGobiData *) l->data; if (dd != dtarget && dd->edge.n > 0) { if (hasEdgePoints (dd, dtarget)) { unresolveAllEdgePoints (dd); resolveEdgePoints (dd, dtarget); } } } } /* DTL: So need to call unresolveEdgePoints(e, d) to remove it from the list of previously resolved entries. Can do better by just re-allocing the endpoints in the DatadEndpoints struct and putting the new entry into that, except we have to check it resolves correctly, etc. So unresolveEdgePoints() will just cause entire collection to be recomputed. */ /* * This will be handled with signals, where each splotd listens * for (maybe) point_added or edge_added events. * New bug: sp->bar needs to be reinitialized. This code needs * to be class-sensitive, and it isn't. */ /* could put some code in splot_record_add */ if (mode == ADDING_EDGES) { for (l = gg->displays; l; l = l->next) { dsp = (displayd *) l->data; if (dsp->e == e) { for (sl = dsp->splots; sl; sl = sl->next) { sp = (splotd *) sl->data; if (sp != NULL) splot_edges_realloc (dtarget->nrows - 1, sp, e); } } } } if (dtarget->ncols) { for (l = gg->displays; l; l = l->next) { dsp = (displayd *) l->data; if (dsp->d == dtarget) { for (sl = dsp->splots; sl; sl = sl->next) { sp = (splotd *) sl->data; if (sp != NULL) splot_points_realloc (dtarget->nrows - 1, sp, d); /*-- this is only necessary if there are variables, I think --*/ if (GGOBI_IS_EXTENDED_SPLOT (sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (klass->alloc_whiskers) sp->whiskers = klass->alloc_whiskers (sp->whiskers, sp, d->nrows, d); /*-- each plot type should have its own realloc routines --*/ if (GGOBI_IS_BARCHART_SPLOT (sp)) { barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); barchart_clean_init (bsp); barchart_recalc_counts (bsp, d, gg); } } } } } } /* */ /* Adding the first edge: This is almost working, but the edge menu isn't being initialized, and the edges don't appear */ displays_tailpipe (FULL, gg); return true; } /* * Add a data record, filling in all values with reasonable defaults. * This is executed when the middle or right button is used for edge * editing. */ void record_add_defaults (GGobiData * d, GGobiData * e, displayd * display, ggobid * gg) { cpaneld *cpanel = &display->cpanel; GGobiData *dtarget; gchar *lbl; gchar **vals = NULL; gint j; dtarget = (cpanel->ee_mode == ADDING_EDGES) ? e : d; if (dtarget->ncols) { void fetch_default_record_values (gchar ** vals, GGobiData *, displayd *, ggobid * gg); vals = (gchar **) g_malloc (dtarget->ncols * sizeof (gchar *)); fetch_default_record_values (vals, dtarget, display, gg); } lbl = g_strdup_printf ("%d", dtarget->nrows + 1); /* record label and id */ if (cpanel->ee_mode == ADDING_EDGES) { record_add (cpanel->ee_mode, gg->edgeedit.a, d->nearest_point, lbl, lbl, vals, d, e, gg); } else if (cpanel->ee_mode == ADDING_POINTS) { record_add (cpanel->ee_mode, -1, -1, lbl, lbl, vals, d, e, gg); } if (dtarget->ncols) { for (j = 0; j < dtarget->ncols; j++) g_free (vals[j]); g_free (vals); } } /*--------------------------------------------------------------------*/ void edgeedit_init (ggobid * gg) { gg->edgeedit.a = -1; /*-- index of point where new edge begins --*/ } gint find_nearest_edge (splotd * sp, displayd * display, ggobid * gg) { gint sqdist, near, j, lineid, xdist; gint from, to, yd; icoords a, b, distab, distac, c; gfloat proj; gboolean doit; GGobiData *e = display->e; GGobiData *d = display->d; icoords *mpos = &sp->mousepos; lineid = -1; near = 20 * 20; /* If nothing is close, don't show any label */ if (e && e->edge.n > 0) { endpointsd *endpoints = resolveEdgePoints (e, d); if (!endpoints) return (-1); xdist = sqdist = 1000 * 1000; for (j = 0; j < e->edge.n; j++) { doit = edge_endpoints_get (j, &from, &to, d, endpoints, e); doit = doit && (!d->hidden_now.els[from] && !d->hidden_now.els[to]); if (doit) { a.x = sp->screen[from].x; a.y = sp->screen[from].y; b.x = sp->screen[to].x; b.y = sp->screen[to].y; distab.x = b.x - a.x; distab.y = b.y - a.y; distac.x = mpos->x - a.x; distac.y = mpos->y - a.y; /* vertical lines */ if (distab.x == 0 && distab.y != 0) { sqdist = distac.x * distac.x; if (BETWEEN (a.y, b.y, mpos->y)); else { yd = MIN (abs (distac.y), abs (mpos->y - b.y)); sqdist += (yd * yd); } if (sqdist <= near) { near = sqdist; lineid = j; } } /* horizontal lines */ else if (distab.y == 0 && distab.x != 0) { sqdist = distac.y * distac.y; if (sqdist <= near && (gint) fabs ((gfloat) distac.x) < xdist) { near = sqdist; xdist = (gint) fabs ((gfloat) distac.x); lineid = j; } } /* other lines */ else if (distab.x != 0 && distab.y != 0) { proj = ((gfloat) ((distac.x * distab.x) + (distac.y * distab.y))) / ((gfloat) ((distab.x * distab.x) + (distab.y * distab.y))); c.x = (gint) (proj * (gfloat) (b.x - a.x)) + a.x; c.y = (gint) (proj * (gfloat) (b.y - a.y)) + a.y; if (BETWEEN (a.x, b.x, c.x) && BETWEEN (a.y, b.y, c.y)) { sqdist = (mpos->x - c.x) * (mpos->x - c.x) + (mpos->y - c.y) * (mpos->y - c.y); } else { sqdist = MIN ((mpos->x - a.x) * (mpos->x - a.x) + (mpos->y - a.y) * (mpos->y - a.y), (mpos->x - b.x) * (mpos->x - b.x) + (mpos->y - b.y) * (mpos->y - b.y)); } if (sqdist < near) { near = sqdist; lineid = j; } } } } /* if this edge is bidirectional, figure out which segment we really want to highlight. Use the distance from the mouse to the two endpoints to decide. */ if (lineid != -1) { j = endpoints[lineid].jpartner; if (j != -1 && !e->hidden_now.els[j]) { edge_endpoints_get (lineid, &from, &to, d, endpoints, e); a.x = sp->screen[from].x; a.y = sp->screen[from].y; b.x = sp->screen[to].x; b.y = sp->screen[to].y; if ((mpos->x - a.x) * (mpos->x - a.x) + (mpos->y - a.y) * (mpos->y - a.y) > (mpos->x - b.x) * (mpos->x - b.x) + (mpos->y - b.y) * (mpos->y - b.y)) { lineid = j; } } } } return (lineid); } /*--------------------------------------------------------------------*/ /* Reverse pipeline code for populating the table of variable values */ /*--------------------------------------------------------------------*/ /* * I want these routines to work for point motion (movepts.c) and * for line editing (lineedit.c). They require different arguments. * And they all need to be moved now, too, maybe some to splot.c or * maybe all to pipeline.c. ... and what about the class-based * methodology? Hmm. */ void pt_screen_to_plane (icoords * screen, gint id, gboolean horiz, gboolean vert, gcoords * eps, gcoords * planar, splotd * sp) { gcoords prev_planar; gfloat scale_x, scale_y; greal precis = (greal) PRECISION1; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; if (id >= 0) { /* when moving points, initialize new planar values */ eps->x = 0; eps->y = 0; planar->x = sp->planar[id].x; planar->y = sp->planar[id].y; prev_planar.x = sp->planar[id].x; prev_planar.y = sp->planar[id].y; } if (horiz) { /* relevant distinction for moving points */ screen->x -= sp->max.x / 2; planar->x = (greal) screen->x * precis / sp->iscale.x; planar->x += (greal) sp->pmid.x; } if (vert) { /* relevant distinction for moving points */ screen->y -= sp->max.y / 2; planar->y = (greal) screen->y * precis / sp->iscale.y; planar->y += (greal) sp->pmid.y; } if (id >= 0) { /* when moving points */ if (horiz) eps->x = planar->x - prev_planar.x; if (vert) eps->y = planar->y - prev_planar.y; } } void pt_plane_to_world (splotd * sp, gcoords * planar, gcoords * eps, greal * world) { displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; gint j, var; switch (cpanel->pmode) { /* only valid for scatterplots? */ case P1PLOT: if (display->p1d_orientation == VERTICAL) world[sp->p1dvar] = planar->y; else world[sp->p1dvar] = planar->x; break; case XYPLOT: world[sp->xyvars.x] = planar->x; world[sp->xyvars.y] = planar->y; break; case TOUR1D: /*if (!gg->is_pp) { */ for (j = 0; j < display->t1d.nactive; j++) { var = display->t1d.active_vars.els[j]; world[var] += (eps->x * (greal) display->t1d.F.vals[0][var]); } /*} */ break; case TOUR2D3: for (j = 0; j < display->t2d3.nactive; j++) { var = display->t2d3.active_vars.els[j]; world[var] += (eps->x * (greal) display->t2d3.F.vals[0][var] + eps->y * (greal) display->t2d3.F.vals[1][var]); } break; case TOUR2D: /*if (!gg->is_pp) { */ for (j = 0; j < display->t2d.nactive; j++) { var = display->t2d.active_vars.els[j]; world[var] += (eps->x * (greal) display->t2d.F.vals[0][var] + eps->y * (greal) display->t2d.F.vals[1][var]); } /*} */ break; case COTOUR: /*if (!gg->is_pp) { */ for (j = 0; j < display->tcorr1.nactive; j++) { var = display->tcorr1.active_vars.els[j]; world[var] += (eps->x * (greal) display->tcorr1.F.vals[0][var]); } for (j = 0; j < display->tcorr2.nactive; j++) { var = display->tcorr2.active_vars.els[j]; world[var] += (eps->y * (greal) display->tcorr2.F.vals[0][var]); } /*} */ break; default: g_printerr ("reverse pipeline not yet implemented for this projection\n"); } } void pt_world_to_raw_by_var (gint j, greal * world, greal * raw, GGobiData * d) { gfloat precis = PRECISION1; gfloat ftmp, rdiff; gfloat x; vartabled *vt = vartable_element_get (j, d); rdiff = vt->lim.max - vt->lim.min; ftmp = (gfloat) (world[j]) / precis; x = (ftmp + 1.0) * .5 * rdiff; x += vt->lim.min; raw[j] = x; } void pt_screen_to_raw (icoords * screen, gint id, gboolean horiz, gboolean vert, greal * raw, gcoords * eps, GGobiData * d, splotd * sp, ggobid * gg) { gint j; gcoords planar; greal *world = (greal *) g_malloc0 (d->ncols * sizeof (greal)); pt_screen_to_plane (screen, id, horiz, vert, eps, &planar, sp); pt_plane_to_world (sp, &planar, &planar, world); for (j = 0; j < d->ncols; j++) pt_world_to_raw_by_var (j, world, raw, d); g_free (world); } void fetch_default_record_values (gchar ** vals, GGobiData * dtarget, displayd * display, ggobid * gg) { gint j; gcoords eps; vartabled *vt; if (dtarget == display->d) { /*-- use the screen position --*/ greal *raw = (greal *) g_malloc (dtarget->ncols * sizeof (greal)); pt_screen_to_raw (&gg->current_splot->mousepos, -1, true, true, /* no id, both horiz and vert are true */ raw, &eps, dtarget, gg->current_splot, gg); for (j = 0; j < dtarget->ncols; j++) { vt = vartable_element_get (j, dtarget); if (vt->vartype == categorical) { /* Loop over levels, and choose the one that is closest to x. */ gint k, level = 0, dist, ddist = 0; for (k = 0; k < vt->nlevels; k++) { dist = fabs ((greal) vt->level_values[k] - raw[j]); if (k == 0) ddist = dist; /* initialize ddist */ else { if (dist < ddist) { level = k; ddist = dist; } } } vals[j] = g_strdup_printf ("%d", vt->level_values[level]); /*vals[j] = g_strdup_printf ("%d", (gint) floor(raw[j]+.5)); */ } else vals[j] = g_strdup_printf ("%g", raw[j]); } g_free (raw); } else { /* for edges, use NA's */ for (j = 0; j < dtarget->ncols; j++) vals[j] = g_strdup ("NA"); } } ggobi-2.1.12/src/display_tree.h0000644000175000017500000000273314651527764012017 /* display_tree.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef DISPLAY_TREE_H #define DISPLAY_TREE_H 1 #include #include "ggobi.h" #include "vars.h" /* Global variables for the window containing a tree listing plots within displays */ typedef struct { GtkWidget *window; GtkWidget *tree; GtkTreeModel *model; } DisplayTree; extern DisplayTree display_tree; void display_add_tree(displayd *display); gchar *display_tree_label(displayd *display); GtkTreeView *plot_tree_display(ggobid *gg); void show_display_tree_cb (GtkWidget *widget, ggobid *); void show_display_tree (ggobid *gg, GtkWidget *widget); void splot_add_tree(displayd *display, GtkTreeIter *parent); gchar *splot_tree_label (splotd *, GGobiData *, ggobid *); void display_tree_delete_cb(GtkWidget *w, GdkEvent *event, ggobid *gg); gboolean tree_display_entry_remove(displayd *display, GtkWidget *w, ggobid *gg); void display_tree_child_select(GtkTreeSelection *, gpointer cbd); #endif ggobi-2.1.12/src/scale_ui.c0000644000175000017500000004132614651527764011113 /* scale_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" #include void scale_update_set (gboolean update, displayd * dsp, ggobid * gg) { cpaneld *cpanel = &dsp->cpanel; GtkWidget *panel = mode_panel_get_by_name (GGOBI (getIModeName) (SCALE), gg); GtkWidget *w; GtkUpdateType policy; cpanel->scale.updateAlways_p = update; if (cpanel->scale.updateAlways_p) policy = GTK_UPDATE_CONTINUOUS; else policy = GTK_UPDATE_DISCONTINUOUS; /* When the update policy changes, change the update policy of the range widgets as well */ w = widget_find_by_name (panel, "SCALE:x_zoom"); gtk_range_set_update_policy (GTK_RANGE (w), policy); w = widget_find_by_name (panel, "SCALE:y_zoom"); gtk_range_set_update_policy (GTK_RANGE (w), policy); w = widget_find_by_name (panel, "SCALE:x_pan"); gtk_range_set_update_policy (GTK_RANGE (w), policy); w = widget_find_by_name (panel, "SCALE:y_pan"); gtk_range_set_update_policy (GTK_RANGE (w), policy); } /* Use the hscale widget name to find the corresponding adjustment */ static GtkAdjustment * scale_adjustment_find_by_name (gchar * name, ggobid * gg) { GtkWidget *panel, *w; panel = mode_panel_get_by_name ("Scale", gg); w = widget_find_by_name (panel, name); if (GTK_IS_HSCALE (w)) return (gtk_range_get_adjustment (GTK_RANGE (w))); else return NULL; } static void increment_adjustment (GtkAdjustment * adj, gdouble step, gdouble eps) { gdouble value = adj->value + step; value = MAX (value, adj->lower); value = MIN (value, adj->upper); if (fabs (value - adj->value) > eps) gtk_adjustment_set_value (adj, value); } static void zoom_cb (GtkAdjustment * adj, ggobid * gg) { displayd *display = gg->current_display; splotd *sp = gg->current_splot; cpaneld *cpanel = &display->cpanel; gchar *name = (gchar *) g_object_get_data (G_OBJECT (adj), "name"); greal oscalex = sp->scale.x, oscaley = sp->scale.y; GtkAdjustment *adj_other; // step and eps are in the space of the adjustment values; // exp_eps is in the space of the scaling values. gdouble expvalue = pow (10., adj->value), step = 0.0; // exp10 gdouble eps = .0001, exp_eps = .001; /* this unappealing case arises when cpanel_scale_set is resetting adjustment values, which calls the associated callbacks. */ if (display != sp->displayptr) return; if (strcmp (name, "SCALE:x_zoom_adj") == 0) { cpanel->scale.zoomval.x = adj->value; step = adj->value - log10 (sp->scale.x); sp->scale.x = expvalue; if (cpanel->scale.fixAspect_p && fabs (step) > eps) { adj_other = scale_adjustment_find_by_name ("SCALE:y_zoom", gg); sp->scale.y = pow (10., adj_other->value + step); increment_adjustment (adj_other, step, eps); } } else { cpanel->scale.zoomval.y = adj->value; step = adj->value - log10 (sp->scale.y); sp->scale.y = expvalue; if (cpanel->scale.fixAspect_p && fabs (step) > eps) { adj_other = scale_adjustment_find_by_name ("SCALE:x_zoom", gg); sp->scale.x = pow (10.0, adj_other->value + step); increment_adjustment (adj_other, step, eps); } } if (fabs (oscalex - sp->scale.x) > exp_eps || fabs (oscaley - sp->scale.y) > exp_eps) { splot_plane_to_screen (display, cpanel, sp, gg); ruler_ranges_set (false, display, sp, gg); splot_redraw (sp, FULL, gg); } } static void pan_cb (GtkAdjustment * adj, ggobid * gg) { displayd *display = gg->current_display; splotd *sp = gg->current_splot; cpaneld *cpanel = &display->cpanel; gchar *name = (gchar *) g_object_get_data (G_OBJECT (adj), "name"); /* this unappealing case arises when cpanel_scale_set is resetting adjustment values, which calls the associated callbacks. */ if (display != sp->displayptr) return; if (strcmp (name, "SCALE:x_pan_adj") == 0) { cpanel->scale.panval.x = adj->value; sp->pmid.x = -1 * adj->value; } else { cpanel->scale.panval.y = adj->value; sp->pmid.y = -1 * adj->value; } splot_plane_to_screen (display, cpanel, sp, gg); ruler_ranges_set (false, display, sp, gg); splot_redraw (sp, FULL, gg); } void scale_pan_reset (displayd * display) { ggobid *gg = display->ggobi; splotd *sp = gg->current_splot; GtkAdjustment *adj; gdouble value = 0.0; adj = scale_adjustment_find_by_name ("SCALE:y_pan", gg); gtk_adjustment_set_value (adj, value); adj = scale_adjustment_find_by_name ("SCALE:x_pan", gg); gtk_adjustment_set_value (adj, value); /* If we've been scaling using the scale widgets, the following is redundant, but we need it if we've been scaling by direct manipulation */ sp->pmid.x = sp->pmid.y = 0; splot_plane_to_screen (display, &display->cpanel, sp, gg); ruler_ranges_set (false, gg->current_display, sp, gg); splot_redraw (sp, FULL, gg); } void scale_zoom_reset (displayd * dsp) { ggobid *gg = dsp->ggobi; splotd *sp = gg->current_splot; GtkAdjustment *adj; gdouble value = log10 (SCALE_DEFAULT); adj = scale_adjustment_find_by_name ("SCALE:y_zoom", gg); gtk_adjustment_set_value (adj, value); adj = scale_adjustment_find_by_name ("SCALE:x_zoom", gg); gtk_adjustment_set_value (adj, value); /* If we've been scaling using the scale widgets, the following is redundant, but we need it if we've been scaling by direct manipulation */ sp->scale.x = sp->scale.y = SCALE_DEFAULT; splot_plane_to_screen (dsp, &dsp->cpanel, sp, gg); ruler_ranges_set (false, dsp, sp, gg); splot_redraw (sp, FULL, gg); } /*--------------------------------------------------------------------*/ /* Resetting various state variables */ /*--------------------------------------------------------------------*/ static void aspect_ratio_cb (GtkToggleButton * button, ggobid * gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->scale.fixAspect_p = button->active; } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ /* If ctrl-alt-p is pressed, toggle on and off click-style panning. If ctrl-alt-z is pressed, toggle on and off click-style zooming. */ static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; return false; } static gint motion_notify_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp) { gboolean button1_p, button2_p; ggobid *gg = GGobiFromSPlot (sp); displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; /*-- get the mouse position and find out which buttons are pressed --*/ mousepos_get_motion (w, event, &button1_p, &button2_p, sp); /*-- if neither button is pressed, we shouldn't have gotten the event --*/ if (!button1_p && !button2_p) return false; /*-- I'm not sure this could ever happen --*/ if (sp->mousepos.x == sp->mousepos_o.x && sp->mousepos.y == sp->mousepos_o.y) return false; if (button1_p) { pan_by_drag (sp, gg); } else if (button2_p) { zoom_by_drag (sp, gg); } if (cpanel->scale.updateAlways_p) { /*-- redisplay this plot --*/ splot_plane_to_screen (display, &display->cpanel, sp, gg); ruler_ranges_set (false, gg->current_display, sp, gg); splot_redraw (sp, FULL, gg); } else { splot_redraw (sp, QUICK, gg); } sp->mousepos_o.x = sp->mousepos.x; sp->mousepos_o.y = sp->mousepos.y; return true; } static gint scroll_cb (GtkWidget *w, GdkEventScroll *event, splotd *sp) { /* For now, make this a fixed-ratio zoom. Most people don't have horizontal mouse wheels. */ gfloat factor = 1.0, xscale = sp->scale.x, yscale = sp->scale.y; if (event->direction == GDK_SCROLL_UP) factor += SCALE_SCROLL_INC; else if (event->direction == GDK_SCROLL_DOWN) factor -= SCALE_SCROLL_INC; xscale *= factor; yscale *= factor; splot_zoom(sp, xscale, yscale); return(true); } static gint button_press_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); gboolean button1_p, button2_p; mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); gg->current_splot = sp->displayptr->current_splot = sp; gg->current_display = (displayd *) sp->displayptr; sp->mousepos_o.x = sp->mousepos.x; sp->mousepos_o.y = sp->mousepos.y; sp->mousedownpos.x = sp->mousepos.x; sp->mousedownpos.y = sp->mousepos.y; sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (motion_notify_cb), (gpointer) sp); return retval; } static gint button_release_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); GdkModifierType state; displayd *dsp = sp->displayptr; cpaneld *cpanel = &dsp->cpanel; gg->buttondown = 0; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); gdk_pointer_ungrab (event->time); disconnect_motion_signal (sp); if (!cpanel->scale.updateAlways_p) { displayd *display = sp->displayptr; /*-- redisplay this plot --*/ splot_plane_to_screen (display, &display->cpanel, sp, gg); ruler_ranges_set (false, gg->current_display, sp, gg); splot_redraw (sp, FULL, gg); } else { splot_redraw (sp, QUICK, gg); } return retval; } void scale_event_handlers_toggle (splotd * sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window), "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK (button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK (button_release_cb), (gpointer) sp); sp->scroll_id = g_signal_connect (G_OBJECT (sp->da), "scroll_event", G_CALLBACK (scroll_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); disconnect_scroll_signal (sp); } } void cpanel_scale_make (ggobid * gg) { modepaneld *panel; GtkWidget *f, *vb; GtkAdjustment *adjx, *adjy; GtkWidget *sbarx, *sbary; GtkWidget *tgl; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup (GGOBI (getIModeName) (SCALE)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /*-- frame and vbox for zoom controls --*/ f = gtk_frame_new ("Zoom"); gtk_box_pack_start (GTK_BOX (panel->w), f, false, false, 0); vb = gtk_vbox_new (true, 0); gtk_container_add (GTK_CONTAINER (f), vb); /* value, lower, upper, step_increment, page_increment, page_size */ adjx = (GtkAdjustment *) gtk_adjustment_new (log10 (SCALE_DEFAULT), -1.0, 1.0, 0.05, 0.05, 0.0); g_object_set_data (G_OBJECT (adjx), "name", "SCALE:x_zoom_adj"); g_signal_connect (G_OBJECT (adjx), "value_changed", G_CALLBACK (zoom_cb), gg); sbarx = gtk_hscale_new (GTK_ADJUSTMENT (adjx)); gtk_widget_set_name (sbarx, "SCALE:x_zoom"); scale_set_default_values (GTK_SCALE (sbarx)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbarx, "Zoom horizontally", NULL); gtk_box_pack_start (GTK_BOX (vb), sbarx, true, true, 0); adjy = (GtkAdjustment *) gtk_adjustment_new (log10 (SCALE_DEFAULT), -1.0, 1.0, 0.05, 0.05, 0.0); g_object_set_data (G_OBJECT (adjy), "name", "SCALE:y_zoom_adj"); g_signal_connect (G_OBJECT (adjy), "value_changed", G_CALLBACK (zoom_cb), gg); sbary = gtk_hscale_new (GTK_ADJUSTMENT (adjy)); gtk_widget_set_name (sbary, "SCALE:y_zoom"); scale_set_default_values (GTK_SCALE (sbary)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbary, "Zoom vertically", NULL); gtk_box_pack_start (GTK_BOX (vb), sbary, true, true, 0); tgl = gtk_check_button_new_with_mnemonic ("Fixed _aspect"); gtk_widget_set_name (tgl, "SCALE:aspect_ratio_tgl"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Fix the aspect ratio while zooming.", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (aspect_ratio_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vb), tgl, false, false, 3); /*-- frame and vbox for pan controls --*/ f = gtk_frame_new ("Pan"); gtk_box_pack_start (GTK_BOX (panel->w), f, false, false, 0); vb = gtk_vbox_new (true, 0); gtk_container_add (GTK_CONTAINER (f), vb); /* value, lower, upper, step_increment, page_increment, page_size */ adjx = (GtkAdjustment *) gtk_adjustment_new (0.0, -2 * PRECISION1, 2 * PRECISION1, 200, 400, 0.0); g_object_set_data (G_OBJECT (adjx), "name", "SCALE:x_pan_adj"); g_signal_connect (G_OBJECT (adjx), "value_changed", G_CALLBACK (pan_cb), gg); sbarx = gtk_hscale_new (GTK_ADJUSTMENT (adjx)); gtk_widget_set_name (sbarx, "SCALE:x_pan"); scale_set_default_values (GTK_SCALE (sbarx)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbarx, "Pan horizontally", NULL); gtk_box_pack_start (GTK_BOX (vb), sbarx, true, true, 0); adjy = (GtkAdjustment *) gtk_adjustment_new (0.0, -2 * PRECISION1, 2 * PRECISION1, 200, 400, 0.0); g_object_set_data (G_OBJECT (adjy), "name", "SCALE:y_pan_adj"); g_signal_connect (G_OBJECT (adjy), "value_changed", G_CALLBACK (pan_cb), gg); sbary = gtk_hscale_new (GTK_ADJUSTMENT (adjy)); gtk_widget_set_name (sbary, "SCALE:y_pan"); scale_set_default_values (GTK_SCALE (sbary)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbary, "Pan vertically", NULL); gtk_box_pack_start (GTK_BOX (vb), sbary, true, true, 0); gtk_widget_show_all (panel->w); } /*--------------------------------------------------------------------*/ /* Control panel updating */ /*--------------------------------------------------------------------*/ void cpanel_scale_init (cpaneld * cpanel, ggobid * gg) { cpanel->scale.updateAlways_p = true; cpanel->scale.fixAspect_p = false; cpanel->scale.zoomval.x = log10 (SCALE_DEFAULT); cpanel->scale.zoomval.y = log10 (SCALE_DEFAULT); cpanel->scale.panval.x = 0.0; cpanel->scale.panval.y = 0.0; } void cpanel_scale_set (displayd * display, cpaneld * cpanel, ggobid * gg) { GtkWidget *w; GtkWidget *panel = mode_panel_get_by_name (GGOBI (getIModeName) (SCALE), gg); GtkAdjustment *adj; if (panel == (GtkWidget *) NULL) return; w = widget_find_by_name (panel, "SCALE:aspect_ratio_tgl"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), cpanel->scale.fixAspect_p); /* One by one, find the adjustments and reset them */ adj = scale_adjustment_find_by_name ("SCALE:x_zoom", gg); gtk_adjustment_set_value (adj, cpanel->scale.zoomval.x); adj = scale_adjustment_find_by_name ("SCALE:y_zoom", gg); gtk_adjustment_set_value (adj, cpanel->scale.zoomval.y); adj = scale_adjustment_find_by_name ("SCALE:x_pan", gg); gtk_adjustment_set_value (adj, cpanel->scale.panval.x); adj = scale_adjustment_find_by_name ("SCALE:y_pan", gg); gtk_adjustment_set_value (adj, cpanel->scale.panval.y); } ggobi-2.1.12/src/svd.c0000644000175000017500000001645314651527764010126 /* * svdcomp - SVD decomposition routine. * Takes an mxn matrix a and decomposes it into udv, where u,v are * left and right orthogonal transformation matrices, and d is a * diagonal matrix of singular values. * * This routine is adapted from svdecomp.c in XLISP-STAT 2.1 which is * code from Numerical Recipes adapted by Luke Tierney and David Betz. * * Input to dsvd is as follows: * a = mxn matrix to be decomposed, gets overwritten with u * m = row dimension of a * n = column dimension of a * w = returns the vector of singular values of a * v = returns the right orthogonal transformation matrix */ #include #include #define SIGN(a, b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) #ifdef __cplusplus extern "C" { #endif gint dsvd (gdouble **a, gint m, gint n, gfloat *w, gdouble **v); #ifdef __cplusplus } #endif static gdouble PYTHAG (gdouble a, gdouble b) { gdouble at = fabs(a), bt = fabs(b), ct, result; if (at > bt) { ct = bt / at; result = at * sqrt(1.0 + ct * ct); } else if (bt > 0.0) { ct = at / bt; result = bt * sqrt(1.0 + ct * ct); } else result = 0.0; return(result); } gint dsvd (gdouble **a, gint m, gint n, gfloat *w, gdouble **v) { gint flag, i, its, j, jj, k, l = 0, nm = 0; // compiler pacification gdouble c, f, h, s, x, y, z; gdouble anorm = 0.0, g = 0.0, scale = 0.0; gdouble *rv1; if (m < n) { g_printerr ("#rows must be > #cols \n"); return (0); } rv1 = (gdouble *) g_malloc (n*sizeof (gdouble)); /* Householder reduction to bidiagonal form */ for (i = 0; i < n; i++) { /* left-hand reduction */ l = i + 1; rv1[i] = scale * g; g = s = scale = 0.0; if (i < m) { for (k = i; k < m; k++) scale += fabs (a[k][i]); if (scale) { for (k = i; k < m; k++) { a[k][i] = (a[k][i]/scale); s += (a[k][i] * a[k][i]); } f = a[i][i]; g = -SIGN(sqrt (s), f); h = f * g - s; a[i][i] = (f - g); if (i != n - 1) { for (j = l; j < n; j++) { for (s = 0.0, k = i; k < m; k++) s += (a[k][i] * a[k][j]); f = s / h; for (k = i; k < m; k++) a[k][j] += (f * a[k][i]); } } for (k = i; k < m; k++) a[k][i] = (a[k][i]*scale); } } w[i] = (gfloat)(scale * g); /* right-hand reduction */ g = s = scale = 0.0; if (i < m && i != n - 1) { for (k = l; k < n; k++) scale += fabs(a[i][k]); if (scale) { for (k = l; k < n; k++) { a[i][k] = (a[i][k]/scale); s += (a[i][k] * a[i][k]); } f = a[i][l]; g = -SIGN(sqrt(s), f); h = f * g - s; a[i][l] = (f - g); for (k = l; k < n; k++) rv1[k] = a[i][k] / h; if (i != m - 1) { for (j = l; j < m; j++) { for (s = 0.0, k = l; k < n; k++) s += (a[j][k] * a[i][k]); for (k = l; k < n; k++) a[j][k] += (s * rv1[k]); } } for (k = l; k < n; k++) a[i][k] = (a[i][k]*scale); } } anorm = MAX (anorm, (fabs ((gdouble)w[i]) + fabs(rv1[i]))); } /* accumulate the right-hand transformation */ for (i = n - 1; i >= 0; i--) { if (i < n - 1) { if (g) { for (j = l; j < n; j++) v[j][i] = ((a[i][j] / a[i][l]) / g); /* double division to avoid underflow */ for (j = l; j < n; j++) { for (s = 0.0, k = l; k < n; k++) s += (a[i][k] * v[k][j]); for (k = l; k < n; k++) v[k][j] += (s * v[k][i]); } } for (j = l; j < n; j++) v[i][j] = v[j][i] = 0.0; } v[i][i] = 1.0; g = rv1[i]; l = i; } /* accumulate the left-hand transformation */ for (i = n - 1; i >= 0; i--) { l = i + 1; g = (gdouble)w[i]; if (i < n - 1) for (j = l; j < n; j++) a[i][j] = 0.0; if (g) { g = 1.0 / g; if (i != n - 1) { for (j = l; j < n; j++) { for (s = 0.0, k = l; k < m; k++) s += (a[k][i] * a[k][j]); f = (s / a[i][i]) * g; for (k = i; k < m; k++) a[k][j] += (f * a[k][i]); } } for (j = i; j < m; j++) a[j][i] = (a[j][i]*g); } else { for (j = i; j < m; j++) a[j][i] = 0.0; } ++a[i][i]; } /* diagonalize the bidiagonal form */ for (k = n - 1; k >= 0; k--) { /* loop over singular values */ for (its = 0; its < 30; its++) { /* loop over allowed iterations */ flag = 1; for (l = k; l >= 0; l--) { /* test for splitting */ nm = l - 1; if (fabs (rv1[l]) + anorm == anorm) { flag = 0; break; } if (fabs ((gdouble)w[nm]) + anorm == anorm) break; } if (flag) { c = 0.0; s = 1.0; for (i = l; i <= k; i++) { f = s * rv1[i]; if (fabs(f) + anorm != anorm) { g = (gdouble)w[i]; h = PYTHAG(f, g); w[i] = (gfloat)h; h = 1.0 / h; c = g * h; s = (- f * h); for (j = 0; j < m; j++) { y = a[j][nm]; z = a[j][i]; a[j][nm] = (y * c + z * s); a[j][i] = (z * c - y * s); } } } } z = (gdouble)w[k]; if (l == k) { /* convergence */ if (z < 0.0) { /* make singular value nonnegative */ w[k] = (gfloat)(-z); for (j = 0; j < n; j++) v[j][k] = (-v[j][k]); } break; } if (its >= 30) { g_free (rv1); g_printerr ("No convergence after 30,000! iterations \n"); return(0); } /* shift from bottom 2 x 2 minor */ x = (gdouble)w[l]; nm = k - 1; y = (gdouble)w[nm]; g = rv1[nm]; h = rv1[k]; f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2.0 * h * y); g = PYTHAG(f, 1.0); f = ((x - z) * (x + z) + h * ((y / (f + SIGN(g, f))) - h)) / x; /* next QR transformation */ c = s = 1.0; for (j = l; j <= nm; j++) { i = j + 1; g = rv1[i]; y = (gdouble)w[i]; h = s * g; g = c * g; z = PYTHAG(f, h); rv1[j] = z; c = f / z; s = h / z; f = x * c + g * s; g = g * c - x * s; h = y * s; y = y * c; for (jj = 0; jj < n; jj++) { x = (gdouble)v[jj][j]; z = (gdouble)v[jj][i]; v[jj][j] = (gfloat)(x * c + z * s); v[jj][i] = (gfloat)(z * c - x * s); } z = PYTHAG (f, h); w[j] = (gfloat)z; if (z) { z = 1.0 / z; c = f * z; s = h * z; } f = (c * g) + (s * y); x = (c * y) - (s * g); for (jj = 0; jj < m; jj++) { y = a[jj][j]; z = a[jj][i]; a[jj][j] = (y * c + z * s); a[jj][i] = (z * c - y * s); } } rv1[l] = 0.0; rv1[k] = f; w[k] = (gfloat)x; } } g_free (rv1); return (1); } ggobi-2.1.12/src/varcircles.c0000644000175000017500000006061414651527764011465 /* varcircles.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" #ifdef ENABLE_CAIRO #include #endif static GtkWidget *varcircle_create (gint, GGobiData *, ggobid * gg); static void varcircle_draw (gint, GGobiData *, ggobid * gg); static gboolean da_expose_cb (GtkWidget *, GdkEventExpose *, gpointer cbd); GtkWidget *varcircles_get_nth (gint which, gint jvar, GGobiData * d); static void varcircle_pack (GtkWidget *, GGobiData *); /*-------------------------------------------------------------------------*/ /* utilities */ /*-------------------------------------------------------------------------*/ #define VB 0 #define LBL 1 #define DA 2 void varcircles_visibility_set (displayd * display, ggobid * gg) { ProjectionMode projection; gint j; GtkWidget *box; GGobiData *d; GList *children; gint n = 0; if (!display) return; projection = pmode_get (display, gg); d = display->d; children = gtk_container_get_children (GTK_CONTAINER (d->vcirc_ui.table)); switch (projection) { case TOUR2D3: for (j = 0; j < d->ncols; j++) { box = varcircles_get_nth (VB, j, d); /* if in the subset but not among the children, pack and unref */ if (display->t2d3.subset_vars_p.els[j]) { if (g_list_index (children, box) == -1) { gtk_box_pack_start (GTK_BOX (d->vcirc_ui.table), box, false, false, 2); gtk_box_reorder_child (GTK_BOX (d->vcirc_ui.table), box, n); gtk_widget_show_all (box); if (G_OBJECT (box)->ref_count > 1) gtk_widget_unref (box); } n++; /* if not in the subset but among the children, ref and remove */ } else { if (g_list_index (children, box) >= 0) { gtk_widget_ref (box); gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), box); } } } break; case TOUR1D: for (j = 0; j < d->ncols; j++) { box = varcircles_get_nth (VB, j, d); if (display->t1d.subset_vars_p.els[j]) { /* in the subset */ if (g_list_index (children, box) == -1) { /* but not among children */ gtk_box_pack_start (GTK_BOX (d->vcirc_ui.table), box, false, false, 2); gtk_box_reorder_child (GTK_BOX (d->vcirc_ui.table), box, n); gtk_widget_show_all (box); if (G_OBJECT (box)->ref_count > 1) gtk_widget_unref (box); } n++; } else { /* not in the subset */ if (g_list_index (children, box) >= 0) { /* but among children */ gtk_widget_ref (box); gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), box); } } } break; case TOUR2D: for (j = 0; j < d->ncols; j++) { box = varcircles_get_nth (VB, j, d); /* if in the subset but not among the children, pack and unref */ if (display->t2d.subset_vars_p.els[j]) { if (g_list_index (children, box) == -1) { gtk_box_pack_start (GTK_BOX (d->vcirc_ui.table), box, false, false, 2); gtk_box_reorder_child (GTK_BOX (d->vcirc_ui.table), box, n); gtk_widget_show_all (box); if (G_OBJECT (box)->ref_count > 1) gtk_widget_unref (box); } n++; /* if not in the subset but among the children, ref and remove */ } else { if (g_list_index (children, box) >= 0) { gtk_widget_ref (box); gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), box); } } } break; case COTOUR: for (j = 0; j < d->ncols; j++) { box = varcircles_get_nth (VB, j, d); /* if in either subset but not among the children, pack and unref */ if (display->tcorr1.subset_vars_p.els[j] || display->tcorr2.subset_vars_p.els[j]) { if (g_list_index (children, box) == -1) { gtk_box_pack_start (GTK_BOX (d->vcirc_ui.table), box, false, false, 2); gtk_box_reorder_child (GTK_BOX (d->vcirc_ui.table), box, n); gtk_widget_show_all (box); if (G_OBJECT (box)->ref_count > 1) gtk_widget_unref (box); } n++; /* if not in the subset but among the children, ref and remove */ } else { if (g_list_index (children, box) >= 0) { /* among children */ gtk_widget_ref (box); gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), box); } } } break; default: break; } } GtkWidget * varcircles_get_nth (gint which, gint jvar, GGobiData * d) { GtkWidget *w = NULL; switch (which) { case VB: w = (GtkWidget *) g_slist_nth_data (d->vcirc_ui.vb, jvar); break; case LBL: w = (GtkWidget *) g_slist_nth_data (d->vcirc_ui.label, jvar); break; case DA: w = (GtkWidget *) g_slist_nth_data (d->vcirc_ui.da, jvar); break; default: break; } return w; } void varcircles_delete_nth (gint jvar, GGobiData * d) { GtkWidget *w; GdkPixmap *pix; w = varcircles_get_nth (LBL, jvar, d); d->vcirc_ui.label = g_slist_remove (d->vcirc_ui.label, (gpointer) w); w = varcircles_get_nth (DA, jvar, d); d->vcirc_ui.da = g_slist_remove (d->vcirc_ui.da, (gpointer) w); pix = (GdkPixmap *) g_slist_nth_data (d->vcirc_ui.da_pix, jvar); d->vcirc_ui.da_pix = g_slist_remove (d->vcirc_ui.da_pix, (gpointer) w); w = (GtkWidget *) g_slist_nth_data (d->vcirc_ui.vb, jvar); if (w != NULL) { if (w->parent) { // If it has been packed, unpack it. g_object_ref (G_OBJECT (w)); // so it isn't destroyed when removed gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), w); } d->vcirc_ui.vb = g_slist_remove (d->vcirc_ui.vb, (gpointer) w); } } void varcircle_label_set (gint j, GGobiData * d) { GtkWidget *w = varcircles_get_nth (LBL, j, d); if (w != NULL) gtk_label_set_text (GTK_LABEL (w), ggobi_data_get_transformed_col_name(d, j)); } /* * Return to the default cursor */ void varcircles_cursor_set_default (GGobiData * d) { GdkWindow *window = GTK_WIDGET (d->varpanel_ui.hpane)->window; gdk_cursor_destroy (d->vcirc_ui.cursor); d->vcirc_ui.jcursor = 0; gdk_window_set_cursor (window, NULL); } static gint manip_select_cb (GtkWidget * w, GdkEvent * event, GGobiData * d) { GdkWindow *window = GTK_WIDGET (d->varpanel_ui.hpane)->window; d->vcirc_ui.cursor = gdk_cursor_new (GDK_HAND2); gdk_window_set_cursor (window, d->vcirc_ui.cursor); d->vcirc_ui.jcursor = (gint) GDK_HAND2; return true; } #ifdef FREEZE_IMPLEMENTED static gint freeze_select_cb (GtkWidget * w, GdkEvent * event, GGobiData * d) { g_printerr ("not yet implemented\n"); return true; } #endif static gint da_manip_expose_cb (GtkWidget * w, GdkEvent * event, GGobiData * d) { ggobid *gg = GGobiFromWidget (w, true); #ifdef ENABLE_CAIRO cairo_t *c = gdk_cairo_create (w->window); gdk_cairo_set_source_color (c, &gg->vcirc_manip_color); cairo_rectangle (c, 0, 0, w->allocation.width, w->allocation.height); cairo_fill (c); cairo_destroy (c); #else GdkGC *gc = gdk_gc_new (w->window); gdk_gc_set_foreground (gc, &gg->vcirc_manip_color); gdk_draw_rectangle (w->window, gc, true, 0, 0, w->allocation.width, w->allocation.height); gdk_gc_destroy (gc); #endif return true; } #ifdef FREEZE_IMPLEMENTED static gint da_freeze_expose_cb (GtkWidget * w, GdkEvent * event, GGobiData * d) { ggobid *gg = GGobiFromWidget (w, true); #ifdef ENABLE_CAIRO cairo_t *c = gdk_cairo_create (w->window); gdk_cairo_set_source_color (c, &gg->vcirc_freeze_color); cairo_rectangle (c, 0, 0, w->allocation.width, w->allocation.height); cairo_fill (c); cairo_destroy (c); #else GdkGC *gc = gdk_gc_new (w->window); gdk_gc_set_foreground (gc, &gg->vcirc_freeze_color); gdk_draw_rectangle (w->window, gc, true, 0, 0, w->allocation.width, w->allocation.height); gdk_gc_destroy (gc); #endif return true; } #endif /*-- hide the circles interface --*/ void varcircles_show (gboolean show, GGobiData * d, displayd * display, ggobid * gg) { GtkWidget *basement = widget_find_by_name (gg->main_window, "BASEMENT"); GtkWidget *parent = (d->vcirc_ui.ebox)->parent; if (show) { /* * Add the ebox for the table of variable circles/rectangles * to the paned widget */ if (display) varcircles_visibility_set (display, gg); /* reparent the variable circles */ if (parent == basement) { gtk_widget_ref (d->vcirc_ui.ebox); gtk_container_remove (GTK_CONTAINER (basement), d->vcirc_ui.ebox); gtk_paned_pack2 (GTK_PANED (d->varpanel_ui.hpane), d->vcirc_ui.ebox, true, true); gtk_widget_show (d->vcirc_ui.ebox); } else if (parent == NULL) { gtk_paned_pack2 (GTK_PANED (d->varpanel_ui.hpane), d->vcirc_ui.ebox, true, true); } } else { /*-- remove circles/rectangles --*/ if (parent == d->varpanel_ui.hpane) { gtk_widget_hide (d->vcirc_ui.ebox); gtk_widget_ref (d->vcirc_ui.ebox); gtk_container_remove (GTK_CONTAINER (d->varpanel_ui.hpane), d->vcirc_ui.ebox); gtk_box_pack_start (GTK_BOX (basement), d->vcirc_ui.ebox, false, false, 0); } /*-- set the handle position all the way to the right --*/ gtk_paned_set_position (GTK_PANED (d->varpanel_ui.hpane), -1); /*-- adjust the reference count --*/ /* #if GTK_MAJOR_VERSION == 1 if (GTK_OBJECT (d->vcbox_ui.ebox)->ref_count > 1) #else if (G_OBJECT (d->vcbox_ui.ebox)->ref_count > 1) #endif gtk_widget_unref (d->vcbox_ui.ebox); */ } } /*-- create the variable circles interface --*/ void varcircles_populate (GGobiData * d, ggobid * gg) { gint j; GtkWidget *vb, *da; d->vcirc_ui.jcursor = 0; /*-- start with the default cursor --*/ d->vcirc_ui.cursor = NULL; /*-- don't pack this in the hpane yet --*/ d->vcirc_ui.ebox = gtk_event_box_new (); gtk_widget_show (d->vcirc_ui.ebox); d->vcirc_ui.vbox = gtk_vbox_new (false, 0); gtk_container_add (GTK_CONTAINER (d->vcirc_ui.ebox), d->vcirc_ui.vbox); gtk_widget_show (d->vcirc_ui.vbox); /*-- the first child of the vbox: the scrolled window, with table --*/ d->vcirc_ui.swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (d->vcirc_ui.swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (d->vcirc_ui.swin), GTK_SHADOW_NONE); gtk_box_pack_start (GTK_BOX (d->vcirc_ui.vbox), d->vcirc_ui.swin, true, true, 0); gtk_widget_show (d->vcirc_ui.swin); d->vcirc_ui.table = gtk_vbox_new (false, 0); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (d->vcirc_ui.swin), d->vcirc_ui.table); { GList *children; GtkWidget *foo; children = gtk_container_get_children (GTK_CONTAINER (d->vcirc_ui.swin)); foo = g_list_nth_data (children, 0); if (GTK_IS_VIEWPORT (foo)) { gtk_viewport_set_shadow_type (GTK_VIEWPORT (foo), GTK_SHADOW_NONE); } } gtk_widget_show (d->vcirc_ui.table); /*-- da and label are freed in varcircle_clear --*/ d->vcirc_ui.vb = NULL; d->vcirc_ui.da = NULL; d->vcirc_ui.label = NULL; d->vcirc_ui.da_pix = NULL; for (j = 0; j < d->ncols; j++) { vb = varcircle_create (j, d, gg); varcircle_pack (vb, d); } /*-- the second child of the vbox: an hbox with buttons --*/ d->vcirc_ui.hbox = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (d->vcirc_ui.vbox), d->vcirc_ui.hbox, false, false, 2); gtk_widget_show (d->vcirc_ui.hbox); /* -- a drawing area to place next to the manip button as a color key -- */ da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (da, false); gtk_widget_set_size_request (GTK_WIDGET (da), 8, 8); gtk_widget_set_events (da, GDK_EXPOSURE_MASK); gtk_box_pack_start (GTK_BOX (d->vcirc_ui.hbox), da, false, false, 2); GGobi_widget_set (da, gg, true); g_signal_connect (G_OBJECT (da), "expose_event", G_CALLBACK (da_manip_expose_cb), d); gtk_widget_show (da); d->vcirc_ui.manip_btn = gtk_button_new_with_label ("Manip"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), d->vcirc_ui.manip_btn, "Click here, then click on the variable you wish to manipulate", NULL); gtk_box_pack_start (GTK_BOX (d->vcirc_ui.hbox), d->vcirc_ui.manip_btn, true, true, 2); g_signal_connect (G_OBJECT (d->vcirc_ui.manip_btn), "button_press_event", G_CALLBACK (manip_select_cb), d); gtk_widget_show (d->vcirc_ui.manip_btn); #ifdef FREEZE_IMPLEMENTED /* -- a drawing area to place next to the freeze button as a color key -- */ da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (da, false); gtk_widget_set_size_request (GTK_WIDGET (da), 8, 8); gtk_widget_set_events (da, GDK_EXPOSURE_MASK); gtk_box_pack_start (GTK_BOX (d->vcirc_ui.hbox), da, false, false, 2); GGobi_widget_set (da, gg, true); g_signal_connect (G_OBJECT (da), "expose_event", G_CALLBACK (da_freeze_expose_cb), d); gtk_widget_show (da); d->vcirc_ui.freeze_btn = gtk_button_new_with_label ("Freeze"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), d->vcirc_ui.freeze_btn, "Click here, then click on the variable you wish to freeze", NULL); gtk_box_pack_start (GTK_BOX (d->vcirc_ui.hbox), d->vcirc_ui.freeze_btn, true, true, 2); g_signal_connect (G_OBJECT (d->vcirc_ui.freeze_btn), "button_press_event", G_CALLBACK (freeze_select_cb), d); gtk_widget_show (d->vcirc_ui.freeze_btn); #endif } void varcircles_delete (gint nc, gint jvar, GGobiData * d, ggobid * gg) { gint j; GtkWidget *w; GdkPixmap *pix; if (nc > 0 && nc < d->ncols) { /*-- forbid deleting every circle --*/ for (j = jvar; j < jvar + nc; j++) { w = varcircles_get_nth (LBL, j, d); d->vcirc_ui.label = g_slist_remove (d->vcirc_ui.label, w); w = varcircles_get_nth (DA, j, d); d->vcirc_ui.da = g_slist_remove (d->vcirc_ui.da, w); w = varcircles_get_nth (VB, j, d); d->vcirc_ui.vb = g_slist_remove (d->vcirc_ui.vb, w); /*-- without a ref, this will be destroyed --*/ gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), w); pix = (GdkPixmap *) g_slist_nth_data (d->vcirc_ui.da, jvar); d->vcirc_ui.da_pix = g_slist_remove (d->vcirc_ui.da_pix, pix); gdk_pixmap_unref (pix); } } } /*-- this destroys them all -- it's not yet called anywhere --*/ void varcircles_clear (ggobid * gg) { GtkWidget *w; gint j; GSList *l; GGobiData *d; GdkPixmap *pix; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; for (j = 0; j < d->vcirc_ui.nvars; j++) { /*-- variable not initialized --*/ w = varcircles_get_nth (LBL, j, d); d->vcirc_ui.label = g_slist_remove (d->vcirc_ui.label, w); w = varcircles_get_nth (DA, j, d); d->vcirc_ui.da = g_slist_remove (d->vcirc_ui.da, w); w = varcircles_get_nth (VB, j, d); d->vcirc_ui.vb = g_slist_remove (d->vcirc_ui.vb, w); gtk_container_remove (GTK_CONTAINER (d->vcirc_ui.table), w); pix = (GdkPixmap *) g_slist_nth_data (d->vcirc_ui.da, j); d->vcirc_ui.da_pix = g_slist_remove (d->vcirc_ui.da_pix, pix); gdk_pixmap_unref (pix); } } } /*-- responds to a button_press_event --*/ static gint varcircle_sel_cb (GtkWidget * w, GdkEvent * event, gint jvar) { ggobid *gg = GGobiFromWidget (w, true); displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; splotd *sp = gg->current_splot; GGobiData *d = datad_get_from_notebook (gg->varpanel_ui.notebook, gg); if (d != display->d) return true; if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *bevent = (GdkEventButton *) event; gint mouse = bevent->button; gboolean alt_mod, shift_mod, ctrl_mod; /*-- respond only to button 1 and button 2 --*/ if (mouse != 1 && mouse != 2) return false; /* looking for modifiers; don't know which ones we'll want */ alt_mod = ((bevent->state & GDK_MOD1_MASK) == GDK_MOD1_MASK); shift_mod = ((bevent->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK); ctrl_mod = ((bevent->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK); /* */ /*-- general variable selection --*/ varsel (w, cpanel, sp, jvar, -1 /* toggle */ , mouse, alt_mod, ctrl_mod, shift_mod, d, gg); varcircles_refresh (d, gg); return true; } return false; } static GtkWidget * varcircle_create (gint j, GGobiData * d, ggobid * gg) { GtkWidget *vb, *lbl, *da; vb = gtk_hbox_new (false, 0); d->vcirc_ui.vb = g_slist_append (d->vcirc_ui.vb, vb); gtk_container_set_border_width (GTK_CONTAINER (vb), 1); /*-- a drawing area to contain the variable circle --*/ da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (da, false); d->vcirc_ui.da = g_slist_append (d->vcirc_ui.da, da); gtk_widget_set_size_request (GTK_WIDGET (da), VAR_CIRCLE_DIAM + 2, VAR_CIRCLE_DIAM + 2); gtk_widget_set_events (da, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), da, "Click left to select or deselect", NULL); g_signal_connect (G_OBJECT (da), "expose_event", G_CALLBACK (da_expose_cb), GINT_TO_POINTER (j)); g_signal_connect (G_OBJECT (da), "button_press_event", G_CALLBACK (varcircle_sel_cb), GINT_TO_POINTER (j)); g_object_set_data (G_OBJECT (da), "datad", d); GGobi_widget_set (GTK_WIDGET (da), gg, true); /*gtk_container_add (GTK_CONTAINER (vb), da); */ gtk_box_pack_start (GTK_BOX (vb), da, false, false, 0); /*-- label --*/ lbl = gtk_label_new (ggobi_data_get_col_name(d, j)); gtk_misc_set_alignment (GTK_MISC (lbl), 0, .5); /*- x: left, y: middle --*/ d->vcirc_ui.label = g_slist_append (d->vcirc_ui.label, lbl); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), lbl, "Click left on the circle to select or deselect", NULL); g_object_set_data (G_OBJECT (lbl), "datad", d); GGobi_widget_set (GTK_WIDGET (lbl), gg, true); /*gtk_container_add (GTK_CONTAINER (vb), lbl); */ gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); gtk_widget_show_all (vb); return (vb); } static void varcircle_pack (GtkWidget * vb, GGobiData * d) { gtk_box_pack_start (GTK_BOX (d->vcirc_ui.table), vb, false, false, 2); } void varcircles_refresh (GGobiData * d, ggobid * gg) { gint j; GtkWidget *da; for (j = 0; j < d->ncols; j++) { da = varcircles_get_nth (DA, j, d); if (GTK_WIDGET_REALIZED (da) && GTK_WIDGET_VISIBLE (da)) varcircle_draw (j, d, gg); } } void varcircle_draw (gint jvar, GGobiData * d, ggobid * gg) { gboolean chosen = false; splotd *sp = gg->current_splot; displayd *display; cpaneld *cpanel; gint k, len; GtkWidget *da = varcircles_get_nth (DA, jvar, d); GdkPixmap *da_pix; #ifdef ENABLE_CAIRO cairo_t *c; double radius = VAR_CIRCLE_DIAM / 2.0; #endif if (sp == NULL || jvar < 0 || jvar >= d->ncols) return; /*-- return --*/ display = (displayd *) sp->displayptr; if (display == NULL || display->d != d) return; /*-- return --*/ cpanel = &display->cpanel; if (gg->selvarfg_GC == NULL) init_var_GCs (da, gg); if ((len = g_slist_length (d->vcirc_ui.da_pix)) < d->ncols) { for (k = len; k < d->ncols; k++) { d->vcirc_ui.da_pix = g_slist_append (d->vcirc_ui.da_pix, gdk_pixmap_new (da->window, VAR_CIRCLE_DIAM + 1, VAR_CIRCLE_DIAM + 1, -1)); /* * clear and initialize each pixmap here, because they may be * exposed out of sequence, and then noise is drawn to the * variable circle on the screen. */ da_pix = g_slist_nth_data (d->vcirc_ui.da_pix, k); gdk_draw_rectangle (da_pix, gg->unselvarbg_GC, true, 0, 0, VAR_CIRCLE_DIAM + 1, VAR_CIRCLE_DIAM + 1); #ifdef ENABLE_CAIRO c = gdk_cairo_create (da_pix); cairo_arc (c, radius, radius, radius, 0, 2 * M_PI); cairo_set_source_rgb (c, 0, 0, 0); cairo_fill_preserve (c); cairo_set_source_rgb (c, 1.0, 1.0, 1.0); cairo_stroke (c); cairo_destroy (c); #else gdk_draw_arc (da_pix, gg->selvarbg_GC, true, 0, 0, VAR_CIRCLE_DIAM, VAR_CIRCLE_DIAM, 0, 64 * 360); gdk_draw_arc (da_pix, gg->unselvarfg_GC, false, 0, 0, VAR_CIRCLE_DIAM, VAR_CIRCLE_DIAM, 0, 64 * 360); #endif } } da_pix = g_slist_nth_data (d->vcirc_ui.da_pix, jvar); /*-- clear the pixmap --*/ gdk_draw_rectangle (da_pix, gg->unselvarbg_GC, true, 0, 0, VAR_CIRCLE_DIAM + 1, VAR_CIRCLE_DIAM + 1); #ifdef ENABLE_CAIRO c = gdk_cairo_create (da_pix); cairo_arc (c, radius, radius, radius - 1, 0, 2 * M_PI); cairo_set_source_rgb (c, 1.0, 1.0, 1.0); cairo_fill_preserve (c); cairo_set_source_rgb (c, 0, 0, 0); #else /*-- add a filled circle for the background --*/ gdk_draw_arc (da_pix, gg->selvarbg_GC, true, 0, 0, VAR_CIRCLE_DIAM, VAR_CIRCLE_DIAM, 0, 64 * 360); #endif /*-- add the appropriate line --*/ if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->varcircle_draw) chosen = klass->varcircle_draw (display, jvar, da_pix, gg); } /* * add an open circle for the outline */ if (chosen) { #ifdef ENABLE_CAIRO cairo_set_line_width (c, 2); #else gdk_draw_arc (da_pix, gg->selvarfg_GC, false, 0, 0, VAR_CIRCLE_DIAM, VAR_CIRCLE_DIAM, 0, 64 * 360); #endif } else { #ifdef ENABLE_CAIRO cairo_set_line_width (c, 1); #else gdk_draw_arc (da_pix, gg->unselvarfg_GC, false, 0, 0, VAR_CIRCLE_DIAM, VAR_CIRCLE_DIAM, 0, 64 * 360); #endif } #ifdef ENABLE_CAIRO cairo_stroke (c); cairo_destroy (c); #endif /* * copy the pixmap to the window */ gdk_draw_drawable (da->window, gg->unselvarfg_GC, da_pix, 0, 0, 0, 0, VAR_CIRCLE_DIAM + 1, VAR_CIRCLE_DIAM + 1); } void tour_draw_circles (GGobiData * d, ggobid * gg) { gint j; for (j = 0; j < d->ncols; j++) { varcircle_draw (j, d, gg); } } gboolean da_expose_cb (GtkWidget * w, GdkEventExpose * event, gpointer cbd) { ggobid *gg = GGobiFromWidget (w, true); gint j = GPOINTER_TO_INT (cbd); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (w), "datad"); GtkWidget *da = varcircles_get_nth (DA, j, d); GdkPixmap *da_pix = g_slist_nth_data (d->vcirc_ui.da_pix, j); if (j >= d->ncols) return false; if (da_pix == NULL) { varcircle_draw (j, d, gg); } else { gdk_draw_pixmap (da->window, gg->unselvarfg_GC, da_pix, 0, 0, 0, 0, VAR_CIRCLE_DIAM + 1, VAR_CIRCLE_DIAM + 1); } return true; } /*-- used in cloning and appending variables; see vartable.c --*/ void varcircles_add (gint nc, GGobiData * d, ggobid * gg) { gint j; GtkWidget *vb; gint n = g_slist_length (d->vcirc_ui.vb); /*-- create the variable circles --*/ for (j = n; j < nc; j++) { vb = varcircle_create (j, d, gg); /* varcircle_pack (vb, d); */ } gtk_widget_show_all (gg->varpanel_ui.notebook); } ggobi-2.1.12/src/io.c0000644000175000017500000002124014651527764007727 /*-- io.c -- routines that support the file io user interface --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /*-- (should be called fileio_ui.c) --*/ #include #ifdef USE_STRINGS_H #include #endif #include #include #include "vars.h" #include "externs.h" #include "writedata.h" #include "write_xml.h" #include "plugin.h" #define READ_FILESET 0 #define EXTEND_FILESET 1 #define WRITE_FILESET 2 void filesel_ok (GtkWidget * chooser) { extern const gchar *key_get (void); gchar *pluginModeName; ggobid *gg; guint action, len; gchar *fname, *filename; gboolean firsttime; gg = (ggobid *) g_object_get_data (G_OBJECT (chooser), key_get ()); fname = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); action = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (chooser), "action")); len = strlen (fname); switch (action) { case READ_FILESET: { gint which; GGobiPluginInfo *plugin; GtkWidget *combo; combo = (GtkWidget *) g_object_get_data (G_OBJECT (chooser), "PluginTypeCombo"); which = gtk_combo_box_get_active (GTK_COMBO_BOX (combo)); { // Testing URL reading interface GtkWidget *entry; gchar *url; GList *els, *l; gint k = 0; entry = (GtkWidget *) g_object_get_data (G_OBJECT (chooser), "URLEntry"); if (entry) { url = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); if (g_utf8_strlen(url, -1) > 0) { fname = url; // Reset fname if (which == 0) { els = getInputPluginSelections (gg); for (l = els, k = 0; l; l = l->next, k++) { if (g_ascii_strncasecmp((gchar *) l->data, "url", 3) == 0) break; } which = k; // Reset combo box value } } } } plugin = getInputPluginByModeNameIndex (which, &pluginModeName); firsttime = (g_slist_length (gg->d) == 0); if (fileset_read_init (fname, pluginModeName, plugin, gg)) /*-- destroy and rebuild the menu every time data is read in --*/ display_menu_build (gg); g_free (pluginModeName); /* * If this is the first data read in, we need a call to * full_viewmode_set to initialize the mode and projection, * and to make the Options menu appear. */ /*if (firsttime) { gg->pmode = XYPLOT; GGOBI (full_viewmode_set) (XYPLOT, DEFAULT_IMODE, gg); }*/ } break; case EXTEND_FILESET: /*-- not yet enabled --*/ break; case WRITE_FILESET: switch (gg->save.format) { case XMLDATA: { XmlWriteInfo *info = g_new0(XmlWriteInfo, 1); /*-- if fname already contains ".xml", then don't add it --*/ if (len >= 4 && g_ascii_strncasecmp (&fname[len - 4], ".xml", 4) == 0) filename = g_strdup (fname); else filename = g_strdup_printf ("%s.xml", fname); info->useDefault = true; write_xml ((const gchar *) filename, gg, info); g_free (filename); g_free(info); } break; case CSVDATA: /*-- if fname already contains ".csv", then don't add it --*/ if (len >= 4 && g_ascii_strncasecmp (&fname[len - 4], ".csv", 4) == 0) filename = g_strdup (fname); else filename = g_strdup_printf ("%s.csv", fname); g_printerr ("writing %s\n", filename); write_csv ((const gchar *) filename, gg); g_free (filename); break; case BINARYDATA: /*-- not yet implemented --*/ break; case MYSQL_DATA: /*-- never will be implemented --*/ break; } break; } g_free (fname); } static void filename_get_configure (GtkWidget * chooser, guint type, ggobid * gg) { extern const gchar *key_get (void); const gchar *key = key_get (); g_object_set_data (G_OBJECT (chooser), "action", GINT_TO_POINTER (type)); g_object_set_data (G_OBJECT (chooser), key, gg); if (gg->input && gg->input->baseName) { gchar *cwd = g_get_current_dir(); gchar *dir; if (g_path_is_absolute(gg->input->dirName)) dir = g_strdup(gg->input->dirName); else dir = g_build_filename(cwd, gg->input->dirName, NULL); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), dir); g_free(dir); g_free(cwd); } } GtkWidget * createOutputFileSelectionDialog (const gchar * title) { GtkWidget *chooser; chooser = gtk_file_chooser_dialog_new (title, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); return (chooser); } GtkWidget * createInputFileSelectionDialog (gchar * title, ggobid * gg) { GtkWidget *chooser, *combo, *hbox, *lbl; GList *els, *l; els = getInputPluginSelections (gg); chooser = gtk_file_chooser_dialog_new (title, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); hbox = gtk_hbox_new (false, 5); lbl = gtk_label_new_with_mnemonic ("Input _Type:"); gtk_box_pack_start (GTK_BOX (hbox), lbl, false, false, 0); combo = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), combo); for (l = els; l; l = l->next) { gtk_combo_box_append_text (GTK_COMBO_BOX (combo), l->data); g_free (l->data); } g_list_free (els); gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0); gtk_box_pack_start (GTK_BOX (hbox), combo, false, false, 0); g_object_set_data (G_OBJECT (chooser), "PluginTypeCombo", combo); { // Testing URL reading interface GtkWidget *entry; lbl = gtk_label_new_with_mnemonic ("_URL:"); gtk_box_pack_start (GTK_BOX (hbox), lbl, false, false, 0); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 20); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), entry); gtk_box_pack_start (GTK_BOX (hbox), entry, true, true, 0); g_object_set_data (G_OBJECT (chooser), "URLEntry", entry); } /*button = gtk_button_new_with_mnemonic("Enter _Location"); gtk_box_pack_start(GTK_BOX(hbox), button, false, false, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(location_button_clicked_cb), chooser); */ gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (chooser), hbox); gtk_widget_show_all (hbox); return (chooser); } /*--------------------------------------------------------------------------*/ /* reading files */ /*--------------------------------------------------------------------------*/ void filename_get_r (ggobid * gg) { GtkWidget *chooser; chooser = createInputFileSelectionDialog ("Read ggobi data", gg); filename_get_configure (chooser, READ_FILESET, gg); if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) filesel_ok (chooser); gtk_widget_destroy (chooser); } /*--------------------------------------------------------------------------*/ /* writing files */ /*--------------------------------------------------------------------------*/ void filename_get_w (GtkWidget * w, ggobid * gg) { GtkWidget *chooser; const gchar *title; if (gg->save.format == XMLDATA) title = "Specify base name for new xml file"; else if (gg->save.format == CSVDATA) title = "Specify base name for new csv file"; else title = "Specify base name"; // Should not happen /* Here we would get from somewhere a list of datads in the save * window. If writing in csv, loop through the list, opening the * chooser once for each csv file. I think I'll stick with one * file for the csv mode for the time being ... */ chooser = createOutputFileSelectionDialog (title); filename_get_configure (chooser, WRITE_FILESET, gg); if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT) filesel_ok (chooser); gtk_widget_destroy (chooser); } ggobi-2.1.12/src/brush.c0000644000175000017500000007527314651527764010462 /* brush.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include "vars.h" #include "externs.h" /* */ static gboolean active_paint_points (splotd *, GGobiData * d, ggobid * gg); static gboolean active_paint_edges (splotd *, GGobiData * e, ggobid * gg); static gboolean build_symbol_vectors (cpaneld *, GGobiData *, ggobid *); /* */ /*----------------------------------------------------------------------*/ /* Glyph utility: called in read_data */ /*----------------------------------------------------------------------*/ /* convert a glyph size into a line width */ gint lwidth_from_gsize (gint size) { return ((size < 3) ? 0 : (size - 2) * 2); } /* This refers to the stored ltype, apparently */ gint ltype_from_gtype (gint gtype) { gint ltype; /* These ltypes are the three EDGETYPES; should be an enum */ if (gtype == FC || gtype == FR) ltype = SOLID; else if (gtype == OC || gtype == OR) ltype = WIDE_DASH; else ltype = NARROW_DASH; return ltype; } /* sets dashes and returns a gtk line attribute */ gint set_lattribute_from_ltype (gint ltype, ggobid * gg) { gint8 dash_list[2]; gint lattr = GDK_LINE_SOLID; switch (ltype) { /* one of the three EDGETYPES; should be an enum */ case SOLID: lattr = GDK_LINE_SOLID; break; case WIDE_DASH: lattr = GDK_LINE_ON_OFF_DASH; dash_list[0] = 8; dash_list[1] = 2; gdk_gc_set_dashes (gg->plot_GC, 0, dash_list, 2); break; case NARROW_DASH: lattr = GDK_LINE_ON_OFF_DASH; dash_list[0] = 4; dash_list[1] = 2; gdk_gc_set_dashes (gg->plot_GC, 0, dash_list, 2); break; } return lattr; } void find_glyph_type_and_size (gint gid, glyphd * glyph) { /* gid ranges from 0:42, type from 0 to 6, size from 0 to 7 */ if (gid == 0) { glyph->type = glyph->size = 0; /*-- single-pixel point --*/ } else { glyph->type = ((gid - 1) / (gint) (NGLYPHSIZES)) + 1; glyph->size = ((gid - 1) % (gint) (NGLYPHSIZES)); } } /*----------------------------------------------------------------------*/ /*-- called by brush_motion, brush_mode_cb, and in the api --*/ gboolean brush_once (gboolean force, splotd * sp, ggobid * gg) { /* * Determine which bins the brush is currently sitting in. * bin0 is the bin which contains of the upper left corner of the * brush; bin1 is the one containing of the lower right corner. */ displayd *display = sp->displayptr; GGobiData *d = display->d; GGobiData *e = display->e; brush_coords *brush_pos = &sp->brush_pos; icoords *bin0 = &d->brush.bin0; icoords *bin1 = &d->brush.bin1; gboolean changed = false; cpaneld *cpanel = &display->cpanel; if (force) { /*-- force the bin to be the entire screen --*/ bin0->x = 0; bin0->y = 0; bin1->x = d->brush.nbins - 1; bin1->y = d->brush.nbins - 1; } else { gint ulx = MIN (brush_pos->x1, brush_pos->x2); gint uly = MIN (brush_pos->y1, brush_pos->y2); gint lrx = MAX (brush_pos->x1, brush_pos->x2); gint lry = MAX (brush_pos->y1, brush_pos->y2); if (!point_in_which_bin (ulx, uly, &bin0->x, &bin0->y, d, sp)) { bin0->x = MAX (bin0->x, 0); bin0->x = MIN (bin0->x, d->brush.nbins - 1); bin0->y = MAX (bin0->y, 0); bin0->y = MIN (bin0->y, d->brush.nbins - 1); } if (!point_in_which_bin (lrx, lry, &bin1->x, &bin1->y, d, sp)) { bin1->x = MAX (bin1->x, 0); bin1->x = MIN (bin1->x, d->brush.nbins - 1); bin1->y = MAX (bin1->y, 0); bin1->y = MIN (bin1->y, d->brush.nbins - 1); } } /* * Now paint. */ if (!cpanel->br.edge_targets /*cpanel->br.point_targets*/) { changed = active_paint_points (sp, d, gg); } if (cpanel->br.edge_targets) { if (e != NULL) changed = active_paint_edges (sp, e, gg); } return (changed); } void brush_prev_vectors_update (GGobiData * d, ggobid * gg) { gint m, i; g_assert (d->color.nels == d->nrows); if (d->color_prev.nels < d->nrows) { vectors_realloc (&d->color_prev, d->nrows); vectorb_realloc (&d->hidden_prev, d->nrows); vectorg_realloc (&d->glyph_prev, d->nrows); } for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; d->color_prev.els[i] = d->color.els[i]; d->hidden_prev.els[i] = d->hidden.els[i]; d->glyph_prev.els[i].size = d->glyph.els[i].size; d->glyph_prev.els[i].type = d->glyph.els[i].type; } } void brush_undo (splotd * sp, GGobiData * d, ggobid * gg) { gint m, i; if (!d) return; g_assert (d->color.nels == d->nrows); for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; d->color.els[i] = d->color_now.els[i] = d->color_prev.els[i]; d->hidden.els[i] = d->hidden_now.els[i] = d->hidden_prev.els[i]; d->glyph.els[i].type = d->glyph_now.els[i].type = d->glyph_prev.els[i].type; d->glyph.els[i].size = d->glyph_now.els[i].size = d->glyph_prev.els[i].size; } } void reinit_transient_brushing (displayd * dsp, ggobid * gg) { /* * If a new variable is selected or a variable is transformed * during transient brushing, we may want to restore all points to * the permanent value. After calling this routine, re-execute * brush_once() to brush the points that are now underneath the brush. * For now, don't make the same change for persistent brushing. */ gint i, m, k; GGobiData *d = dsp->d; GGobiData *e = dsp->e; cpaneld *cpanel = &dsp->cpanel; gboolean point_painting_p = (cpanel->br.point_targets != br_off); gboolean edge_painting_p = (cpanel->br.edge_targets != br_off); g_assert (d->color.nels == d->nrows); if (point_painting_p) { for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; d->color_now.els[i] = d->color.els[i]; d->glyph_now.els[i].type = d->glyph.els[i].type; d->glyph_now.els[i].size = d->glyph.els[i].size; d->hidden_now.els[i] = d->hidden.els[i]; } } if (edge_painting_p && e != NULL) { for (k = 0; k < e->edge.n; k++) { e->color_now.els[k] = e->color.els[k]; e->glyph_now.els[k].type = e->glyph.els[k].type; e->glyph_now.els[k].size = e->glyph.els[k].size; e->hidden_now.els[k] = e->hidden.els[k]; } } } void brush_set_pos (gint x, gint y, splotd * sp) { brush_coords *brush = &sp->brush_pos; brush_coords *obrush = &sp->brush_pos_o; gint xdist = brush->x2 - brush->x1; gint ydist = brush->y2 - brush->y1; /*-- copy the current coordinates to the backup brush structure --*/ obrush->x1 = brush->x1; obrush->y1 = brush->y1; obrush->x2 = brush->x2; obrush->y2 = brush->y2; /* * (x2,y2) is the corner that's moving. */ brush->x1 = x - xdist; brush->x2 = x; brush->y1 = y - ydist; brush->y2 = y; } static gboolean binning_permitted (displayd * display, ggobid * gg) { GGobiData *e = display->e; gboolean permitted = true; if (gg->linkby_cv) return (false); if (GGOBI_IS_EXTENDED_DISPLAY (display)) { /* If there is a function to determine this, call it. Otherwise just get the value of binning_ok in the class. */ GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->binningPermitted) { return (klass->binningPermitted (display)); } return (klass->binning_ok); } /*-- if we're drawing edges --*/ if (e != NULL && e->edge.n > 0) { if (display->options.edges_undirected_show_p || display->options.edges_directed_show_p || display->options.whiskers_show_p) { permitted = false; } } return permitted; } gboolean brush_once_and_redraw (gboolean binningp, splotd * sp, displayd * display, ggobid * gg) { cpaneld *cpanel = &display->cpanel; gboolean changed = false; if (cpanel->br.brush_on_p) { changed = brush_once (!binningp, sp, gg); if (binningp && binning_permitted (display, gg)) { if (changed) { splot_redraw (sp, BINNED, gg); if (cpanel->br.updateAlways_p) { displays_plot (sp, FULL, gg); } } else { /*-- just redraw the brush --*/ splot_redraw (sp, QUICK, gg); } } else { /* no binning */ splot_redraw (sp, FULL, gg); if (cpanel->br.updateAlways_p) displays_plot (sp, FULL, gg); } } else { /*-- we're not brushing, and we just need to redraw the brush --*/ splot_redraw (sp, QUICK, gg); } return (changed); } gboolean brush_motion (icoords * mouse, gboolean button1_p, gboolean button2_p, cpaneld * cpanel, splotd * sp, ggobid * gg) { displayd *display = sp->displayptr; brush_coords *brush_pos = &sp->brush_pos; if (button1_p) { brush_set_pos (mouse->x, mouse->y, sp); } else if (button2_p) { brush_pos->x2 = mouse->x; brush_pos->y2 = mouse->y; } return (brush_once_and_redraw (true, sp, display, gg)); /* binning permitted */ } static gboolean under_brush (gint k, splotd * sp) /* * Determine whether point k is under the brush. */ { brush_coords *brush_pos = &sp->brush_pos; gint pt; gint x1 = MIN (brush_pos->x1, brush_pos->x2); gint x2 = MAX (brush_pos->x1, brush_pos->x2); gint y1 = MIN (brush_pos->y1, brush_pos->y2); gint y2 = MAX (brush_pos->y1, brush_pos->y2); pt = (sp->screen[k].x <= x2 && sp->screen[k].y <= y2 && sp->screen[k].x >= x1 && sp->screen[k].y >= y1) ? 1 : 0; return (pt); } /*----------------------------------------------------------------------*/ /* Dealing with the brush */ /*----------------------------------------------------------------------*/ static void brush_boundaries_set (cpaneld * cpanel, icoords * obin0, icoords * obin1, icoords * imin, icoords * imax, GGobiData * d, ggobid * gg) { icoords *bin0 = &d->brush.bin0; icoords *bin1 = &d->brush.bin1; if (cpanel->br.mode == BR_TRANSIENT) { imin->x = MIN (bin0->x, obin0->x); imin->y = MIN (bin0->y, obin0->y); imax->x = MAX (bin1->x, obin1->x); imax->y = MAX (bin1->y, obin1->y); } else { imin->x = bin0->x; imin->y = bin0->y; imax->x = bin1->x; imax->y = bin1->y; } } void brush_draw_label (splotd * sp, GdkDrawable * drawable, GGobiData * d, ggobid * gg) { PangoRectangle rect; PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (sp->da), NULL); if (d->npts_under_brush > 0) { gchar *str = g_strdup_printf ("%d", d->npts_under_brush); layout_text (layout, str, &rect); gdk_draw_layout (drawable, gg->plot_GC, sp->max.x - rect.width - 5, 5, layout); g_free (str); } g_object_unref (G_OBJECT (layout)); } void brush_draw_brush (splotd * sp, GdkDrawable * drawable, GGobiData * d, ggobid * gg) { /* * Use brush_pos to draw the brush. */ displayd *display = sp->displayptr; cpaneld *cpanel = &display->cpanel; gboolean point_painting_p = (cpanel->br.point_targets != br_off); gboolean edge_painting_p = (cpanel->br.edge_targets != br_off); gboolean selection_p = !point_painting_p && !edge_painting_p; colorschemed *scheme = gg->activeColorScheme; brush_coords *brush_pos = &sp->brush_pos; gint x1 = MIN (brush_pos->x1, brush_pos->x2); gint x2 = MAX (brush_pos->x1, brush_pos->x2); gint y1 = MIN (brush_pos->y1, brush_pos->y2); gint y2 = MAX (brush_pos->y1, brush_pos->y2); if (cpanel->br.mode == BR_TRANSIENT) { gint8 dash_list[2]; gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_ON_OFF_DASH, GDK_CAP_ROUND, GDK_JOIN_ROUND); /* just selection: set special dash pattern and draw like points */ if (selection_p) { dash_list[0] = 2; dash_list[1] = 2; } else { /* otherwise set to default */ dash_list[0] = 4; dash_list[1] = 4; } gdk_gc_set_dashes(gg->plot_GC, 0, dash_list, 2); } if (point_painting_p || selection_p) { /* set brush color for points */ if (cpanel->br.point_targets == br_shadow) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); } else if (cpanel->br.point_targets == br_unshadow) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); } else if ((scheme->rgb[gg->color_id].red != scheme->rgb_bg.red || scheme->rgb[gg->color_id].blue != scheme->rgb_bg.blue || scheme->rgb[gg->color_id].green != scheme->rgb_bg.green) && !selection_p) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[gg->color_id]); } else { /* for selection (at least) */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); } gdk_draw_rectangle (drawable, gg->plot_GC, false, x1, y1, (x2 > x1) ? (x2 - x1) : (x1 - x2), (y2 > y1) ? (y2 - y1) : (y1 - y2)); /* Mark the corner to which the cursor will be attached */ gdk_draw_rectangle (drawable, gg->plot_GC, true, brush_pos->x2 - 1, brush_pos->y2 - 1, 2, 2); /* * highlight brush: but only in the current display */ if (cpanel->br.brush_on_p && display == gg->current_display) { gdk_draw_rectangle (drawable, gg->plot_GC, false, x1 - 1, y1 - 1, (x2 > x1) ? (x2 - x1 + 2) : (x1 - x2 + 2), (y2 > y1) ? (y2 - y1 + 2) : (y1 - y2 + 2)); /* Mark the corner to which the cursor will be attached */ gdk_draw_rectangle (drawable, gg->plot_GC, true, brush_pos->x2 - 2, brush_pos->y2 - 2, 4, 4); } } if (edge_painting_p) { /* set brush color for edges */ if (cpanel->br.edge_targets == br_shadow) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); } else if (cpanel->br.point_targets == br_unshadow) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); } else if ((scheme->rgb[gg->color_id].red != scheme->rgb_bg.red) || (scheme->rgb[gg->color_id].blue != scheme->rgb_bg.blue) || (scheme->rgb[gg->color_id].green != scheme->rgb_bg.green)) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[gg->color_id]); } else { /* I don't remember what this is for ... -- dfs */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); } gdk_draw_line (drawable, gg->plot_GC, x1 + (x2 - x1) / 2, y1, x1 + (x2 - x1) / 2, y2); gdk_draw_line (drawable, gg->plot_GC, x1, y1 + (y2 - y1) / 2, x2, y1 + (y2 - y1) / 2); if (cpanel->br.brush_on_p) { gdk_draw_line (drawable, gg->plot_GC, x1 + (x2 - x1) / 2 + 1, y1, x1 + (x2 - x1) / 2 + 1, y2); gdk_draw_line (drawable, gg->plot_GC, x1, y1 + (y2 - y1) / 2 + 1, x2, y1 + (y2 - y1) / 2 + 1); } } if (cpanel->br.mode == BR_TRANSIENT) gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } /*----------------------------------------------------------------------*/ /* Glyph brushing */ /*----------------------------------------------------------------------*/ /* * This currently isn't using the same arguments as its * _color_ and _hidden_ cousins because we can't brush on line * type yet. */ gboolean update_glyph_vectors (gint i, gboolean changed, gboolean * hit_by_brush, GGobiData * d, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; gboolean doit = true; /* setting the value of changed */ if (!changed) { if (hit_by_brush[i]) { doit = (d->glyph_now.els[i].size != gg->glyph_id.size || d->glyph_now.els[i].type != gg->glyph_id.type); } else { doit = (d->glyph_now.els[i].size != d->glyph.els[i].size || d->glyph_now.els[i].type != d->glyph.els[i].type); } } /* */ if (doit) { if (hit_by_brush[i]) { switch (cpanel->br.mode) { case BR_PERSISTENT: d->glyph.els[i].size = d->glyph_now.els[i].size = gg->glyph_id.size; d->glyph.els[i].type = d->glyph_now.els[i].type = gg->glyph_id.type; break; case BR_TRANSIENT: d->glyph_now.els[i].size = gg->glyph_id.size; d->glyph_now.els[i].type = gg->glyph_id.type; break; } } else { d->glyph_now.els[i].size = d->glyph.els[i].size; d->glyph_now.els[i].type = d->glyph.els[i].type; } } return (doit); } /*----------------------------------------------------------------------*/ /* Color brushing */ /*----------------------------------------------------------------------*/ gboolean update_color_vectors (gint i, gboolean changed, gboolean * hit_by_brush, GGobiData * d, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; gboolean doit = true; /* setting the value of doit */ if (!changed) { if (hit_by_brush[i]) { /*-- if persistent, compare against color instead of color_now --*/ doit = (cpanel->br.mode == BR_TRANSIENT) ? (d->color_now.els[i] != gg->color_id) : (d->color.els[i] != gg->color_id); } else { doit = (d->color_now.els[i] != d->color.els[i]); /*-- ?? --*/ } } /* */ /* * If doit is false, it's guaranteed that there will be no change. */ if (doit) { if (hit_by_brush[i]) { switch (cpanel->br.mode) { case BR_PERSISTENT: d->color.els[i] = d->color_now.els[i] = gg->color_id; break; case BR_TRANSIENT: d->color_now.els[i] = gg->color_id; break; } } else d->color_now.els[i] = d->color.els[i]; } return (doit); } /*----------------------------------------------------------------------*/ /* Shadow brushing */ /*----------------------------------------------------------------------*/ gboolean update_hidden_vectors (gint i, gboolean changed, gboolean * hit_by_brush, GGobiData * d, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; gboolean doit = true; /* * First find out if this will result in a change; this in * order to be able to return that information. */ if (!changed) { if (hit_by_brush[i]) /* This test covers the case where a transient brush has first * covered all the points of interest, and then persistent * brushing has been activated. -- dfs */ doit = d->hidden_now.els[i] != true || (cpanel->br.mode == BR_PERSISTENT && d->hidden.els[i] != true); else doit = (d->hidden_now.els[i] != d->hidden.els[i]); } /* */ /* * If doit is false, it's guaranteed that there will be no change. */ if (doit) { if (hit_by_brush[i]) { switch (cpanel->br.mode) { case BR_PERSISTENT: d->hidden.els[i] = d->hidden_now.els[i] = true; break; case BR_TRANSIENT: d->hidden_now.els[i] = true; break; } } else d->hidden_now.els[i] = d->hidden.els[i]; } return (doit); } /* This routine named in honor of the Bizarro world of the Superman comics, where everything is backwards. */ gboolean bizarro_update_hidden_vectors (gint i, gboolean changed, gboolean * hit_by_brush, GGobiData * d, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; gboolean doit = true; /* * First find out if this will result in a change; this in * order to be able to return that information. */ if (!changed) { if (hit_by_brush[i]) /* This test covers the case where a transient brush has first * covered all the points of interest, and then persistent * brushing has been activated. -- dfs */ doit = d->hidden_now.els[i] == true || (cpanel->br.mode == BR_PERSISTENT && d->hidden.els[i] == true); else doit = (d->hidden_now.els[i] != d->hidden.els[i]); } /* */ /* * If doit is false, it's guaranteed that there will be no change. */ if (doit) { if (hit_by_brush[i]) { switch (cpanel->br.mode) { case BR_PERSISTENT: d->hidden.els[i] = d->hidden_now.els[i] = false; break; case BR_TRANSIENT: d->hidden_now.els[i] = false; break; } } else { switch (cpanel->br.mode) { case BR_PERSISTENT: d->hidden_now.els[i] = d->hidden.els[i]; break; case BR_TRANSIENT: d->hidden_now.els[i] = true; break; } } } return (doit); } /*----------------------------------------------------------------------*/ /* Handle all symbols in one loop through a bin */ /*----------------------------------------------------------------------*/ static gboolean build_symbol_vectors (cpaneld * cpanel, GGobiData * d, ggobid * gg) { gint ih, iv, m, j, k; /*-- these look suspicious -- dfs --*/ static icoords obin0 = { BRUSH_NBINS / 2, BRUSH_NBINS / 2 }; static icoords obin1 = { BRUSH_NBINS / 2, BRUSH_NBINS / 2 }; icoords imin, imax; gboolean changed = false; gint nd = g_slist_length (gg->d); gboolean (*f) (cpaneld *, GGobiData *, ggobid *) = NULL; /* These two are needed for the extended display. Should the method be on the extended splot or the display (as it is now). The choice is somewhat arbitrary since the method for the barchart doesn't seem to do much with the display or plot. It is just used to check if we have a barchart. */ splotd *sp = gg->current_splot; displayd *display = (displayd *) sp->displayptr; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { f = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->build_symbol_vectors; if (f) { changed = f (cpanel, d, gg); } } /* * None of the following code makes any sense for the barchart... */ if (!f) { brush_boundaries_set (cpanel, &obin0, &obin1, &imin, &imax, d, gg); for (ih = imin.x; ih <= imax.x; ih++) { for (iv = imin.y; iv <= imax.y; iv++) { for (m = 0; m < d->brush.binarray[ih][iv].nels; m++) { /* * j is the row number; k is the index of rows_in_plot.els[] */ j = d->rows_in_plot.els[k = d->brush.binarray[ih][iv].els[m]]; switch (cpanel->br.point_targets) { case br_candg: /*-- color and glyph --*/ changed = update_color_vectors (j, changed, d->pts_under_brush.els, d, gg); changed = update_glyph_vectors (j, changed, d->pts_under_brush.els, d, gg); break; case br_color: changed = update_color_vectors (j, changed, d->pts_under_brush.els, d, gg); break; case br_glyph: /*-- glyph type and size --*/ changed = update_glyph_vectors (j, changed, d->pts_under_brush.els, d, gg); break; case br_shadow: /*-- hidden --*/ changed = update_hidden_vectors (j, changed, d->pts_under_brush.els, d, gg); break; case br_unshadow: changed = bizarro_update_hidden_vectors (j, changed, d->pts_under_brush.els, d, gg); break; case br_off: ; break; } /*-- link by id --*/ if (!gg->linkby_cv && nd > 1) symbol_link_by_id (false, j, d, gg); /*-- --*/ } } } } obin0.x = d->brush.bin0.x; obin0.y = d->brush.bin0.y; obin1.x = d->brush.bin1.x; obin1.y = d->brush.bin1.y; return (changed); } /*----------------------------------------------------------------------*/ /* active_paint_points */ /*----------------------------------------------------------------------*/ /* * Set pts_under_brush[j] to 1 if point j is inside the rectangular brush. */ gboolean active_paint_points (splotd * sp, GGobiData * d, ggobid * gg) { gint ih, iv, j, pt; gboolean changed; displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; gint (*f) (splotd * sp, GGobiData *, ggobid *) = NULL; BrushTargetType ttype; g_assert (d->pts_under_brush.nels == d->nrows); if (GGOBI_IS_EXTENDED_SPLOT (sp)) { f = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp)->active_paint_points; if (f) { d->npts_under_brush = f (sp, d, gg); } } if (!f) { /* Zero out pts_under_brush[] before looping */ d->npts_under_brush = 0; for (j = 0; j < d->nrows_in_plot; j++) d->pts_under_brush.els[d->rows_in_plot.els[j]] = 0; /* * d->brush.binarray[][] only represents the * cases in rows_in_plot.els[] so there's no need to test for that. */ ttype = cpanel->br.point_targets; for (ih = d->brush.bin0.x; ih <= d->brush.bin1.x; ih++) { for (iv = d->brush.bin0.y; iv <= d->brush.bin1.y; iv++) { for (j = 0; j < d->brush.binarray[ih][iv].nels; j++) { pt = d->rows_in_plot.els[d->brush.binarray[ih][iv].els[j]]; /* * Ignore hidden cases unless shadow or unshadow brushing. */ if (d->hidden_now.els[pt] && (ttype != br_shadow && ttype != br_unshadow)) { continue; } if (splot_plot_case (pt, d, sp, display, gg)) { if (under_brush (pt, sp)) { d->npts_under_brush++; d->pts_under_brush.els[pt] = 1; } } } } } } changed = false; if (cpanel->br.brush_on_p) { if (gg->linkby_cv) { /*-- link by categorical variable --*/ changed = build_symbol_vectors_by_var (cpanel, d, gg); } else { /*-- link by id --*/ changed = build_symbol_vectors (cpanel, d, gg); } } return (changed); } /*----------------------------------------------------------------------*/ /* Edge brushing */ /*----------------------------------------------------------------------*/ static gboolean xed_by_brush (gint k, displayd * display, ggobid * gg) /* * Determine whether edge k intersects the brush */ { GGobiData *d = display->d; GGobiData *e = display->e; splotd *sp = gg->current_splot; gboolean intersect; glong x1 = sp->brush_pos.x1; glong y1 = sp->brush_pos.y1; glong x2 = sp->brush_pos.x2; glong y2 = sp->brush_pos.y2; gint a, b; endpointsd *endpoints; endpoints = resolveEdgePoints (e, d); if (!endpoints || !edge_endpoints_get (k, &a, &b, d, endpoints, e)) return false; /*-- test for intersection with the vertical edge --*/ intersect = lines_intersect (x1 + (x2 - x1) / 2, y1, x1 + (x2 - x1) / 2, y2, sp->screen[a].x, sp->screen[a].y, sp->screen[b].x, sp->screen[b].y); /* intersect = isCrossed (x1 + (x2 - x1)/2, y1, x1 + (x2 - x1)/2, y2, (gdouble) sp->screen[a].x, (gdouble) sp->screen[a].y, (gdouble) sp->screen[b].x, (gdouble) sp->screen[b].y); */ /*-- I wonder if Lee's method is truly faster --- it requires doubles, which forces me to do a lot of casting. I should figure out how to test it --*/ if (intersect != 1) { intersect = lines_intersect (x1, y1 + (y2 - y1) / 2, x2, y1 + (y2 - y1) / 2, sp->screen[a].x, sp->screen[a].y, sp->screen[b].x, sp->screen[b].y); /* intersect = isCrossed (x1, y1 + (y2 - y1)/2, x2, y1 + (y2 - y1)/2, (gdouble) sp->screen[a].x, (gdouble) sp->screen[a].y, (gdouble) sp->screen[b].x, (gdouble) sp->screen[b].y); */ } return (intersect == 1); } /*-- link by id --*/ static gboolean build_edge_symbol_vectors (cpaneld * cpanel, GGobiData * e, ggobid * gg) { gint i; gboolean changed = false; gint nd = g_slist_length (gg->d); /* * I'm not doing any checking here to verify that the edges * are displayed. */ for (i = 0; i < e->edge.n; i++) { switch (cpanel->br.edge_targets) { case br_candg: /*-- color and glyph --*/ changed = update_color_vectors (i, changed, e->edge.xed_by_brush.els, e, gg); changed = update_glyph_vectors (i, changed, e->edge.xed_by_brush.els, e, gg); break; case br_color: /*-- color --*/ changed = update_color_vectors (i, changed, e->edge.xed_by_brush.els, e, gg); break; case br_glyph: /*-- line width and line type --*/ changed = update_glyph_vectors (i, changed, e->edge.xed_by_brush.els, e, gg); break; case br_shadow: /*-- hidden --*/ changed = update_hidden_vectors (i, changed, e->edge.xed_by_brush.els, e, gg); break; case br_unshadow: changed = bizarro_update_hidden_vectors (i, changed, e->edge.xed_by_brush.els, e, gg); break; case br_off: ; break; } /*-- link by id --*/ if (!gg->linkby_cv && nd > 1) symbol_link_by_id (false, i, e, gg); /*-- --*/ } return (changed); } static gboolean active_paint_edges (splotd * sp, GGobiData * e, ggobid * gg) { gint k; gboolean changed; displayd *display = sp->displayptr; cpaneld *cpanel = &display->cpanel; g_assert (e->edge.xed_by_brush.nels == e->edge.n); /* Zero out xed_by_brush[] before looping */ e->edge.nxed_by_brush = 0; for (k = 0; k < e->edge.n; k++) e->edge.xed_by_brush.els[k] = false; for (k = 0; k < e->edge.n; k++) { if (xed_by_brush (k, display, gg)) { e->edge.nxed_by_brush++; e->edge.xed_by_brush.els[k] = true; } } changed = false; if (cpanel->br.brush_on_p) { if (gg->linkby_cv) { /*-- link by categorical variable: presently unavailable --*/ /*changed = build_symbol_vectors_by_var (cpanel, e, gg);*/ /* Simply brush without linking */ changed = build_edge_symbol_vectors (cpanel, e, gg); } else { /*-- link by id --*/ changed = build_edge_symbol_vectors (cpanel, e, gg); } } return (changed); } ggobi-2.1.12/src/GGobiAppClass.c0000644000175000017500000000212414651527764011736 #include "GGobiApp.h" #include "ggobi.h" void ggobi_app_class_init (GGobiAppClass * klass); void ggobi_app_init (GGobiApp * app); /** This registers and returns a unique GType representing the ggobi app class. */ GType ggobi_app_get_type (void) { static GType app_type = 0; if (!app_type) { static const GTypeInfo app_info = { sizeof (GGobiAppClass), NULL, NULL, (GClassInitFunc) ggobi_app_class_init, NULL, NULL, sizeof (GGobiApp), 0, (GInstanceInitFunc) ggobi_app_init, NULL }; app_type = g_type_register_static (G_TYPE_OBJECT, "GGobiApp", &app_info, 0); } return app_type; } void ggobi_app_init (GGobiApp * app) { } void ggobi_app_class_init (GGobiAppClass * klass) { /* why is this stored as the "DATAD_ADDED_SIGNAL" ? */ //GGobiSignals[DATAD_ADDED_SIGNAL] = g_signal_new ("new_ggobi", GGOBI_TYPE_APP, G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_GGOBI); } ggobi-2.1.12/src/menus.c0000644000175000017500000001236014651527764010452 /*-- menus.c: menus in the display menubar that change with the mode; */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /* * These menus have migrated from the main menubar to the display * menubar. */ static gboolean pmode_has_display_menu (ProjectionMode pmode) { return (pmode == TOUR1D || pmode == TOUR2D || pmode == COTOUR); } static const gchar *tour1d_pmode_ui = "" " " " " " " " " " " " " " " ""; static const gchar *tour2d_pmode_ui = "" " " " " " " " " " " " " " " " " " " " " ""; static const gchar *cotour_pmode_ui = "" " " " " " " " " " " " " " " ""; static const gchar *brush_imode_ui = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; static const gchar *scale_imode_ui = "" " " " " " " " " " " " " " " ""; gboolean imode_has_display_menu (InteractionMode imode) { return (imode == SCALE || imode == BRUSH); } void display_mode_menus_update (ProjectionMode pmode_prev, InteractionMode imode_prev, displayd * display, ggobid * gg) { ProjectionMode pmode = display->cpanel.pmode; InteractionMode imode = display->cpanel.imode; const gchar *ui = NULL; GError *error = NULL; if (imode != imode_prev) { /* Remove any existing imode submenu */ if (imode_has_display_menu (imode_prev)) { gtk_ui_manager_remove_ui (display->menu_manager, display->imode_merge_id); /* I don't understand why all these tests are necessary ... dfs */ /*if (GTK_IS_MENU_ITEM(display->imode_item)) gtk_menu_item_remove_submenu (GTK_MENU_ITEM (display->imode_item)); if (GTK_IS_WIDGET(display->imode_item)) gtk_widget_destroy (display->imode_item); display->imode_item = NULL; */ } /* If the new mode has an imode menu, build it */ if (imode_has_display_menu (imode)) { if (imode == BRUSH) { ui = brush_imode_ui; } else if (imode == SCALE) { ui = scale_imode_ui; } if (ui) display->imode_merge_id = gtk_ui_manager_add_ui_from_string (display->menu_manager, ui, -1, &error); if (ui == NULL || error) { g_message ("Failed to load display imode ui!\n"); g_error_free (error); } } } /* I'm not completely certain I have the correct test here */ if (pmode != pmode_prev && imode == DEFAULT_IMODE) { /* Remove any existing pmode submenu */ if (pmode_has_display_menu (pmode_prev) && display->pmode_merge_id) { gtk_ui_manager_remove_ui (display->menu_manager, display->pmode_merge_id); /*gtk_menu_item_remove_submenu (GTK_MENU_ITEM (display->pmode_item)); gtk_widget_destroy (display->pmode_item); display->pmode_item = NULL; */ } /* Do we need to be in the default imode for this? I don't see why */ /* If the new mode has a pmode menu, build it */ if (pmode_has_display_menu (pmode)) { if (pmode == TOUR1D) { ui = tour1d_pmode_ui; } else if (pmode == TOUR2D) { ui = tour2d_pmode_ui; } else if (pmode == COTOUR) { ui = cotour_pmode_ui; } display->pmode_merge_id = gtk_ui_manager_add_ui_from_string (display->menu_manager, ui, -1, &error); if (error) { g_message ("Failed to load display pmode ui!\n"); g_error_free (error); } } } } ggobi-2.1.12/src/cpanel.c0000644000175000017500000000451414651527764010567 /* cpanel.c : control panel */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" void scatterplot_cpanel_init (cpaneld * cpanel, ProjectionMode pmode, InteractionMode imode, ggobid * gg) { cpanel->pmode = pmode; /* XYPlot */ cpanel->imode = imode; /* DEFAULT */ /*-- 1d plots --*/ cpanel->p1d.type = ASH; cpanel_p1d_init (cpanel, gg); cpanel_xyplot_init (cpanel, gg); cpanel_t2d3_init (cpanel, gg); cpanel_t2d_init (cpanel, gg); cpanel_t1d_init (cpanel, gg); cpanel_tcorr_init (cpanel, gg); cpanel_brush_init (cpanel, gg); cpanel_scale_init (cpanel, gg); cpanel_edgeedit_init (cpanel, gg); cpanel_identify_init (cpanel, gg); } void scatmat_cpanel_init (cpaneld * cpanel, ggobid * gg) { cpanel->pmode = EXTENDED_DISPLAY_PMODE; cpanel->imode = DEFAULT_IMODE; /*-- 1d plots --*/ cpanel->p1d.type = ASH; cpanel_p1d_init (cpanel, gg); /*-- available modes --*/ cpanel_brush_init (cpanel, gg); cpanel_identify_init (cpanel, gg); } void parcoords_cpanel_init (cpaneld * cpanel, ggobid * gg) { cpanel->pmode = EXTENDED_DISPLAY_PMODE; cpanel->imode = DEFAULT_IMODE; /*-- 1d plots --*/ cpanel->p1d.type = DOTPLOT; cpanel_p1d_init (cpanel, gg); cpanel->parcoords_arrangement = ARRANGE_ROW; /*-- available modes --*/ cpanel_brush_init (cpanel, gg); cpanel_identify_init (cpanel, gg); } void cpanel_set (displayd * display, ggobid * gg) { cpaneld *cpanel = &display->cpanel; gboolean displaytype_known = true; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { displaytype_known = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->cpanel_set (display, cpanel, gg); } if (displaytype_known) { viewmode_set (cpanel->pmode, cpanel->imode, gg); } } ggobi-2.1.12/src/marshal.c0000644000175000017500000002130014651527764010744 #include #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_char (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_long #define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* NONE:OBJECT,POINTER,OBJECT (marshal.list:1) */ void ggobi_marshal_VOID__OBJECT_POINTER_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_POINTER_OBJECT) (gpointer data1, gpointer arg_1, gpointer arg_2, gpointer arg_3, gpointer data2); register GMarshalFunc_VOID__OBJECT_POINTER_OBJECT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_POINTER_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_pointer (param_values + 2), g_marshal_value_peek_object (param_values + 3), data2); } /* NONE:OBJECT,INT,OBJECT (marshal.list:2) */ void ggobi_marshal_VOID__OBJECT_INT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__OBJECT_INT_OBJECT) (gpointer data1, gpointer arg_1, gint arg_2, gpointer arg_3, gpointer data2); register GMarshalFunc_VOID__OBJECT_INT_OBJECT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__OBJECT_INT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_int (param_values + 2), g_marshal_value_peek_object (param_values + 3), data2); } /* NONE:POINTER,INT,OBJECT (marshal.list:3) */ void ggobi_marshal_VOID__POINTER_INT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__POINTER_INT_OBJECT) (gpointer data1, gpointer arg_1, gint arg_2, gpointer arg_3, gpointer data2); register GMarshalFunc_VOID__POINTER_INT_OBJECT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__POINTER_INT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_pointer (param_values + 1), g_marshal_value_peek_int (param_values + 2), g_marshal_value_peek_object (param_values + 3), data2); } /* NONE:INT,INT,OBJECT (marshal.list:4) */ void ggobi_marshal_VOID__INT_INT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data) { typedef void (*GMarshalFunc_VOID__INT_INT_OBJECT) (gpointer data1, gint arg_1, gint arg_2, gpointer arg_3, gpointer data2); register GMarshalFunc_VOID__INT_INT_OBJECT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_VOID__INT_INT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_int (param_values + 2), g_marshal_value_peek_object (param_values + 3), data2); } ggobi-2.1.12/src/sphere_ui.c0000644000175000017500000005422014651527764011307 /* sphere_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" /*-------------------------------------------------------------------------*/ GGobiData * datad_get_from_window (GtkWidget * window) { GGobiData *d = NULL; GtkWidget *tree_view; if (window != NULL) { tree_view = get_tree_view_from_object (G_OBJECT (window)); if (tree_view != NULL) d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); } return d; } /*-------------------------------------------------------------------------*/ /* routines for manipulating the gui */ /*-------------------------------------------------------------------------*/ void sphere_enable (gboolean sens, ggobid * gg) { if (gg->sphere_ui.apply_btn != NULL) { gtk_widget_set_sensitive (gg->sphere_ui.apply_btn, sens); } } void sphere_condnum_set (gfloat x, ggobid * gg) { if (gg->sphere_ui.condnum_entry != NULL) { gchar *lbl = g_strdup_printf ("%5.1f", x); gtk_entry_set_text (GTK_ENTRY (gg->sphere_ui.condnum_entry), lbl); g_free (lbl); } } void sphere_variance_set (gfloat x, GGobiData * d, ggobid * gg) { if (gg->sphere_ui.variance_entry != NULL) { gchar *lbl = g_strdup_printf ("%.2e", x); gtk_entry_set_text (GTK_ENTRY (gg->sphere_ui.variance_entry), lbl); g_free (lbl); } } /*-- reset the spinner max and value --*/ void sphere_npcs_range_set (gint n, ggobid * gg) { if (gg->sphere_ui.npcs_adj != NULL) { GTK_ADJUSTMENT (gg->sphere_ui.npcs_adj)->upper = (gfloat) n; gtk_adjustment_set_value (GTK_ADJUSTMENT (gg->sphere_ui.npcs_adj), (gfloat) n); } } /*-------------------------------------------------------------------------*/ /* callbacks */ /*-------------------------------------------------------------------------*/ static void deleteit (ggobid * gg) { GSList *l; gtk_widget_hide (gg->sphere_ui.window); for (l = gg->d; l; l = l->next) sphere_free ((GGobiData *) l->data); gdk_pixmap_unref (gg->sphere_ui.scree_pixmap); gtk_widget_destroy (gg->sphere_ui.window); gg->sphere_ui.window = NULL; gg->sphere_ui.scree_da = NULL; gg->sphere_ui.scree_pixmap = NULL; gg->sphere_ui.condnum_entry = NULL; gg->sphere_ui.variance_entry = NULL; gg->sphere_ui.stdized_entry = NULL; gg->sphere_ui.apply_btn = NULL; gg->sphere_ui.npcs_adj = (GtkObject *) NULL; } void sphere_npcs_set_cb (GtkAdjustment * adj, ggobid * gg) { gint n = (gint) adj->value; GGobiData *d = datad_get_from_window (gg->sphere_ui.window); if (d != NULL) sphere_npcs_set (n, d, gg); } static void vars_stdized_cb (GtkToggleButton * btn, ggobid * gg) { GGobiData *d = datad_get_from_window (gg->sphere_ui.window); d->sphere.vars_stdized = btn->active; } void vars_stdized_send_event (GGobiData * d, ggobid * gg) { if (gg->sphere_ui.stdized_entry != NULL && GTK_IS_WIDGET (gg->sphere_ui.stdized_entry) && GTK_WIDGET_VISIBLE (gg->sphere_ui.stdized_entry)) { gboolean rval = false; g_signal_emit_by_name (G_OBJECT (gg->sphere_ui.stdized_entry), "expose_event", (gpointer) d, (gpointer) & rval); } } static void sphere_apply_cb (GtkWidget * w, ggobid * gg) { /* * finally, sphere the number of principal components selected; * executed when the apply button is pressed */ gfloat firstpc, lastpc; GGobiData *d = datad_get_from_window (gg->sphere_ui.window); if (d == NULL) return; if (d->sphere.eigenval.els == NULL) return; firstpc = d->sphere.eigenval.els[0]; lastpc = d->sphere.eigenval.els[d->sphere.npcs - 1]; if (d->sphere.npcs > 0 && d->sphere.npcs <= d->sphere.vars.nels) { if (lastpc == 0.0 || firstpc / lastpc > 10000.0) { quick_message ("Need to choose fewer PCs. Var-cov close to singular.", false); } else { /*-- set up the variables into which sphered data will be written --*/ if (spherize_set_pcvars (d, gg)) { /* * sphere the variables in d->sphere.vars * into the variables in d->sphere.pcvars */ spherize_data (&d->sphere.vars, &d->sphere.pcvars, d, gg); sphere_varcovar_set (d, gg); /* pc_axes_sensitive_set (true);*/ /*-- these three lines replicated from transform.c --*/ limits_set (d, false, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } } } } /* static void scree_restore_cb (GtkWidget *w, ggobid *gg) { extern void sphere_malloc (gint, GGobiData *, ggobid *); GGobiData *d = datad_get_from_window (gg->sphere_ui.window); if (d != NULL && d->sphere.vars_sphered.nels > 0) { gint ncols = d->sphere.vars_sphered.nels; if (d->sphere.vars.els == NULL || d->sphere.vars.nels != ncols) { sphere_malloc (ncols, d, gg); } vectori_copy (&d->sphere.vars_sphered, &d->sphere.vars); vars_stdized_send_event (d, gg); scree_plot_make (gg); } else { g_printerr ("sorry, there are no sphered variables to use\n"); } } */ /* * update the scree plot when the number or identity of the selected * variables has changed, or after the variables are transformed */ static void scree_update_cb (GtkWidget * w, GGobiData * d) { ggobid *gg = GGobiFromWidget (w, true); spherevars_set (gg); scree_plot_make (gg); } /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget * w, ggobid * gg) { deleteit (gg); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget * w, GdkEvent * event, ggobid * gg) { deleteit (gg); } /*-------------------------------------------------------------------------*/ /* Scree plot */ /*-------------------------------------------------------------------------*/ #define SCREE_WIDTH 200 #define SCREE_HEIGHT 100 gboolean scree_mapped_p (ggobid * gg) { return (gg->sphere_ui.scree_da != NULL); } static gint scree_configure_cb (GtkWidget * w, GdkEventConfigure * event, ggobid * gg) { if (gg->sphere_ui.scree_pixmap != NULL) gdk_pixmap_unref (gg->sphere_ui.scree_pixmap); gg->sphere_ui.scree_pixmap = gdk_pixmap_new (w->window, w->allocation.width, w->allocation.height, -1); return false; } static gint scree_expose_cb (GtkWidget * w, GdkEventConfigure * event, ggobid * gg) { gint margin = 10; gint j; gint xpos, ypos, xstrt = 0, ystrt = 0; // compiler pacification gchar *tickmk; GGobiData *d = datad_get_from_window (gg->sphere_ui.window); gint wid = w->allocation.width, hgt = w->allocation.height; gint *sphvars, nels; gfloat *evals; colorschemed *scheme = gg->activeColorScheme; PangoLayout *layout; CHECK_GG (gg); /* clear the pixmap */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (gg->sphere_ui.scree_pixmap, gg->plot_GC, true, 0, 0, wid, hgt); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_line (gg->sphere_ui.scree_pixmap, gg->plot_GC, margin, hgt - margin, wid - margin, hgt - margin); gdk_draw_line (gg->sphere_ui.scree_pixmap, gg->plot_GC, margin, hgt - margin, margin, margin); if (d != NULL) { sphvars = (gint *) g_malloc (d->ncols * sizeof (gint)); evals = (gfloat *) g_malloc (d->ncols * sizeof (gfloat)); eigenvals_get (evals, d); nels = d->sphere.vars.nels; for (j = 0; j < nels; j++) { PangoRectangle rect; xpos = (gint) (((gfloat) (wid - 2 * margin)) / (gfloat) (nels - 1) * j + margin); ypos = (gint) (((gfloat) (hgt - margin)) - evals[j] / evals[0] * (hgt - 2 * margin)); tickmk = g_strdup_printf ("%d", j + 1); layout = gtk_widget_create_pango_layout (gg->sphere_ui.scree_da, NULL); layout_text (layout, tickmk, &rect); gdk_draw_layout (gg->sphere_ui.scree_pixmap, gg->plot_GC, xpos, hgt - margin / 2 - 0.75 * rect.height, layout); g_object_unref (G_OBJECT (layout)); g_free (tickmk); if (j > 0) gdk_draw_line (gg->sphere_ui.scree_pixmap, gg->plot_GC, xstrt, ystrt, xpos, ypos); xstrt = xpos; ystrt = ypos; } g_free ((gpointer) sphvars); g_free ((gpointer) evals); } gdk_draw_pixmap (w->window, gg->plot_GC, gg->sphere_ui.scree_pixmap, 0, 0, 0, 0, w->allocation.width, w->allocation.height); return false; } /* * Calculate the svd and display results in a scree plot * Called when the sphere panel is opened, and when the update * button is pressed. */ void scree_plot_make (ggobid * gg) { GGobiData *d = datad_get_from_window (gg->sphere_ui.window); if (pca_calc (d, gg)) { /*-- spherevars_set is called here --*/ gboolean rval = false; g_signal_emit_by_name (G_OBJECT (gg->sphere_ui.scree_da), "expose_event", (gpointer) gg, (gpointer) & rval); pca_diagnostics_set (d, gg); } else { if (d->sphere.npcs > 0) quick_message ("Variance-covariance is identity already!\n", false); } } /*-------------------------------------------------------------------------*/ /* Create and map the sphere panel */ /*-------------------------------------------------------------------------*/ void sphere_panel_open (ggobid * gg) { GtkWidget *frame0, *vbox, *vb, *hb, *table, *frame; GtkWidget *label; GtkWidget *spinner; GGobiData *d; GtkWidget *notebook = NULL; // compiler pacification /*-- for the tree_view of sphered variables --*/ GtkWidget *scrolled_window; gchar *titles[1] = { "sphered variables" }; GtkListStore *model; /*-- --*/ /*-- if used before we have data, bail out --*/ if (gg->d == NULL || g_slist_length (gg->d) == 0) /**/ return; /* * Maybe I'll change this, and leave all the following entries * and lists blank until variables are chosen in the new variable list. */ if (gg->sphere_ui.window == NULL) { d = gg->current_display->d; } else { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (gg->sphere_ui.window)); d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); } spherevars_set (gg); if (gg->sphere_ui.window == NULL) { GtkWidget *btn; gg->sphere_ui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->sphere_ui.window), "Sphere Variables"); g_signal_connect (G_OBJECT (gg->sphere_ui.window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) gg); gtk_container_set_border_width (GTK_CONTAINER (gg->sphere_ui.window), 10); /*-- partition the screen vertically: scree plot, choose nPCs, apply --*/ vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (gg->sphere_ui.window), vbox); /* Create a notebook, set the position of the tabs */ notebook = create_variable_notebook (vbox, GTK_SELECTION_MULTIPLE, all_vartypes, all_datatypes, G_CALLBACK (NULL), NULL, gg); /*-- use correlation matrix? --*/ btn = gtk_check_button_new_with_mnemonic ("Use _correlation matrix"); gtk_widget_set_name (btn, "SPHERE:std_button"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "When this button is checked the correlation matrix is used to generate the PCs, otherwise the variance-covariance matrix is used", NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), TRUE); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (vars_stdized_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 1); /*-- update scree plot when n selected vars changes --*/ btn = gtk_button_new_with_mnemonic ("_Update scree plot"); GGobi_widget_set (btn, gg, true); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Update scree plot when a new set of variables is selected, or when variables are transformed", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (scree_update_cb), gg); /*-- scree plot --*/ frame = gtk_frame_new ("Scree plot"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_container_set_border_width (GTK_CONTAINER (frame), 2); gtk_box_pack_start (GTK_BOX (vbox), frame, true, true, 2); /*-- stick a box in here so we can control the border width --*/ vb = gtk_vbox_new (false, 2); gtk_container_set_border_width (GTK_CONTAINER (vb), 4); gtk_container_add (GTK_CONTAINER (frame), vb); gg->sphere_ui.scree_da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->sphere_ui.scree_da, false); gtk_widget_set_size_request (GTK_WIDGET (gg->sphere_ui.scree_da), SCREE_WIDTH, SCREE_HEIGHT); gtk_box_pack_start (GTK_BOX (vb), gg->sphere_ui.scree_da, true, true, 1); g_signal_connect (G_OBJECT (gg->sphere_ui.scree_da), "expose_event", G_CALLBACK (scree_expose_cb), (gpointer) gg); g_signal_connect (G_OBJECT (gg->sphere_ui.scree_da), "configure_event", G_CALLBACK (scree_configure_cb), (gpointer) gg); /*-- element 3 of vbox: controls in a labelled frame --*/ frame0 = gtk_frame_new ("Prepare to sphere"); //gtk_frame_set_shadow_type (GTK_FRAME (frame0), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbox), frame0, false, false, 1); table = gtk_table_new (3, 2, false); gtk_table_set_col_spacings (GTK_TABLE (table), 4); gtk_container_add (GTK_CONTAINER (frame0), table); gtk_container_set_border_width (GTK_CONTAINER (table), 4); /*-- current variance --*/ label = gtk_label_new_with_mnemonic ("Set number of _PCs"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /* Spinner: number of principal components */ /*-- the parameters of the adjustment should be reset each time --*/ gg->sphere_ui.npcs_adj = gtk_adjustment_new ((gfloat) d->sphere.vars.nels, 1.0, (gfloat) d->sphere.vars.nels, 1.0, 5.0, 0.0); g_signal_connect (G_OBJECT (gg->sphere_ui.npcs_adj), "value_changed", G_CALLBACK (sphere_npcs_set_cb), gg); spinner = gtk_spin_button_new (GTK_ADJUSTMENT (gg->sphere_ui.npcs_adj), 0, 0); gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinner); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), spinner, "Specify the number of principal components", NULL); gtk_table_attach (GTK_TABLE (table), spinner, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); /*-- total variance --*/ label = gtk_label_new_with_mnemonic ("_Variance"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); gg->sphere_ui.variance_entry = gtk_entry_new (); gtk_label_set_mnemonic_widget (GTK_LABEL (label), gg->sphere_ui.variance_entry); gtk_editable_set_editable (GTK_EDITABLE (gg->sphere_ui.variance_entry), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->sphere_ui.variance_entry, "The percentage of variance accounted for by the first n principal components", NULL); gtk_widget_show (gg->sphere_ui.variance_entry); gtk_entry_set_text (GTK_ENTRY (gg->sphere_ui.variance_entry), "-"); gtk_table_attach (GTK_TABLE (table), gg->sphere_ui.variance_entry, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0); /*-- condition number --*/ label = gtk_label_new_with_mnemonic ("Condition _number"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); gg->sphere_ui.condnum_entry = gtk_entry_new (); gtk_label_set_mnemonic_widget (GTK_LABEL (label), gg->sphere_ui.condnum_entry); gtk_editable_set_editable (GTK_EDITABLE (gg->sphere_ui.condnum_entry), false); gtk_entry_set_text (GTK_ENTRY (gg->sphere_ui.condnum_entry), "-"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->sphere_ui.condnum_entry, "The condition number for the specified number of principal components", NULL); gtk_table_attach (GTK_TABLE (table), gg->sphere_ui.condnum_entry, 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0); frame = gtk_frame_new ("Sphere"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_container_set_border_width (GTK_CONTAINER (frame), 2); gtk_box_pack_start (GTK_BOX (vbox), frame, false, false, 2); vb = gtk_vbox_new (false, 2); gtk_container_set_border_width (GTK_CONTAINER (vb), 4); gtk_container_add (GTK_CONTAINER (frame), vb); /*-- last: after choosing nPCs, the apply button --*/ gg->sphere_ui.apply_btn = gtk_button_new_with_mnemonic ("_Apply sphering, add PCs to data"); gtk_box_pack_start (GTK_BOX (vb), gg->sphere_ui.apply_btn, false, false, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->sphere_ui.apply_btn, "Apply principal components transformation to the selected variables, adding 'number of PCs' variables to the data set", NULL); g_signal_connect (G_OBJECT (gg->sphere_ui.apply_btn), "clicked", G_CALLBACK (sphere_apply_cb), gg); /*-- list to show the currently sphered variables --*/ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vb), scrolled_window, true, true, 0); model = gtk_list_store_new (1, G_TYPE_STRING); gg->sphere_ui.tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); gtk_widget_set_size_request (gg->sphere_ui.tree_view, -1, 70); populate_tree_view (gg->sphere_ui.tree_view, titles, G_N_ELEMENTS (titles), true, GTK_SELECTION_SINGLE, NULL, NULL); gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (gg->sphere_ui.tree_view), false); widget_initialize (gg->sphere_ui.tree_view, false); gtk_container_add (GTK_CONTAINER (scrolled_window), gg->sphere_ui.tree_view); /*-- --*/ /* * Di and I decided there's no good reason to have this button. gg->sphere_ui.restore_btn = gtk_button_new_with_label ("Restore scree plot"); GGobi_widget_set (gg->sphere_ui.restore_btn, gg, true); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->sphere_ui.restore_btn, "Restore the scree plot to reflect the current principal components", NULL); g_signal_connect (G_OBJECT (gg->sphere_ui.restore_btn), "clicked", G_CALLBACK (scree_restore_cb), gg); gtk_box_pack_start (GTK_BOX (vb), gg->sphere_ui.restore_btn, false, false, 0); */ /*-- close button --*/ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), false, true, 2); hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 1); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_box_pack_start (GTK_BOX (hb), btn, true, false, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Close the sphering window", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); g_object_set_data (G_OBJECT (gg->sphere_ui.window), "notebook", notebook); gtk_widget_show_all (vbox); } gdk_flush (); gtk_widget_show_all (gg->sphere_ui.window); /*-- play around with making this notebook larger --*/ if (notebook && GTK_IS_NOTEBOOK(notebook) && g_list_length (GTK_NOTEBOOK (notebook)->children) > 0) { gint page; GtkWidget *swin, *tree_view; GtkAdjustment *adj; page = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook)); swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page); if (swin) { adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (swin)); tree_view = GTK_BIN (swin)->child; if (tree_view->allocation.height < adj->upper) { gint sz = MIN (tree_view->allocation.height * 2, adj->upper); gtk_widget_set_size_request (tree_view, -1, sz); } /* g_printerr ("value %f lower %f upper %f size %f\n", adj->value, adj->lower, adj->upper, adj->page_size); g_printerr ("swin height %d\n", swin->allocation.height); g_printerr ("tree_view height %d\n", tree_view->allocation.height); */ } } /*-- --*/ scree_plot_make (gg); } ggobi-2.1.12/src/noop-toggle.c0000644000175000017500000000512114651527764011552 /*-- noop-toggle.c --*/ #include "noop-toggle.h" #include static GtkObjectClass *parent_class = NULL; static void ggobi_noop_toggle_button_destroy (GtkObject * obj) { if (parent_class->destroy) parent_class->destroy (obj); } static gint button_press_event (GtkWidget * w, GdkEventButton * event) { /* Handle your button presses here and return TRUE. If you want the event to be passed on to the parent class to handle, just return FALSE. You have total control, and should be able to get any button-press semantics you can dream up... */ /*-- I want it to do nothing whatever -- dfs --*/ return TRUE; } static void ggobi_noop_toggle_button_class_init (GGobiNoopToggleButtonClass * klass) { GtkObjectClass *object_class = (GtkObjectClass *) klass; GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); parent_class = g_type_class_peek (GTK_TYPE_TOGGLE_BUTTON); object_class->destroy = ggobi_noop_toggle_button_destroy; widget_class->button_press_event = button_press_event; } static void ggobi_noop_toggle_button_init (GGobiNoopToggleButton * obj) { /* Initialize any state here. */ } GType ggobi_noop_toggle_button_get_type (void) { static GType ggobi_noop_toggle_button_type = 0; if (!ggobi_noop_toggle_button_type) { static const GTypeInfo ggobi_noop_toggle_button_info = { sizeof (GGobiNoopToggleButtonClass), NULL, NULL, (GClassInitFunc) ggobi_noop_toggle_button_class_init, NULL, NULL, sizeof (GGobiNoopToggleButton), 0, (GInstanceInitFunc) ggobi_noop_toggle_button_init, NULL }; ggobi_noop_toggle_button_type = g_type_register_static (GTK_TYPE_TOGGLE_BUTTON, "GGobiNoopToggleButton", &ggobi_noop_toggle_button_info, 0); } return ggobi_noop_toggle_button_type; } GtkWidget * ggobi_noop_toggle_button_new (void) { /* Do initialization up in _init(), not here. If you need to pass in args to _new, write a _construct() function that takes those args and applies them to the object you build here before returning it. */ return GTK_WIDGET (g_object_new (ggobi_noop_toggle_button_get_type (), NULL)); } GtkWidget * ggobi_noop_toggle_button_new_with_label (const gchar * label) { GtkWidget *noop_toggle_button; GtkWidget *label_widget; noop_toggle_button = ggobi_noop_toggle_button_new (); label_widget = gtk_label_new (label); gtk_misc_set_alignment (GTK_MISC (label_widget), 0, 0.5); gtk_container_add (GTK_CONTAINER (noop_toggle_button), label_widget); gtk_widget_show (label_widget); return noop_toggle_button; } ggobi-2.1.12/src/edges.c0000644000175000017500000003066214651527764010417 /* edges.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /* Which include file should this be in? */ void GGOBI (edge_menus_update) (ggobid * gg); /* --------------------------------------------------------------- */ /* Dynamic allocation section */ /* --------------------------------------------------------------- */ /* * The brushing arrays are handled in brush_init.c, and the * edges and arrowheads arrays are handled in splot.c */ void edges_alloc (gint nsegs, GGobiData * d) { d->edge.n = nsegs; d->edge.sym_endpoints = (SymbolicEndpoints *) g_realloc (d->edge.sym_endpoints, nsegs * sizeof (SymbolicEndpoints)); vectorb_alloc (&d->edge.xed_by_brush, nsegs); } void edges_free (GGobiData * d, ggobid * gg) { gpointer ptr; vectorb_free (&d->edge.xed_by_brush); ptr = (gpointer) d->edge.sym_endpoints; g_free (ptr); d->edge.n = 0; } /* --------------------------------------------------------------- */ /* Add and delete edges */ /* --------------------------------------------------------------- */ /** Allocate space for another edge observation and set the locations of the rows. */ gboolean edge_add (gint a, gint b, gchar * lbl, gchar * id, GGobiData * d, GGobiData * e, ggobid * gg) { gchar *s1, *s2; gint n = e->edge.n; GList *l, *sl; splotd *sp; displayd *dsp; /*-- while the code is evolving ... --*/ g_printerr ("lbl %s id %s\n", lbl, id); g_assert (e->edge.n == e->nrows); /*-- eventually check whether a->b already exists before adding --*/ /*-- Here's what the datad needs --*/ /* * some of this can be encapsulated as datad_record_add, as long * as problems with the sequence of operations don't arise. */ e->nrows += 1; /*-- add a row label --*/ if (!lbl) { s1 = g_strdup_printf ("%d", n + 1); rowlabel_add(s1, e); /*-- don't free s1 --*/ } else rowlabel_add (lbl, e); /*-- if necessary, add an id --*/ if (e->idTable) { if (!id) { s2 = g_strdup_printf ("%d", n + 1); datad_record_id_add (s2, e); /*-- don't free s2 --*/ } // we never add the id itself? } pipeline_arrays_check_dimensions (e); rows_in_plot_set (e, gg); /*-- allocate and initialize brushing arrays --*/ br_glyph_ids_add (e, gg); br_color_ids_add (e, gg); br_hidden_alloc (e); vectorb_realloc (&e->pts_under_brush, e->nrows); clusters_set (e, gg); arrays_add_rows (&e->missing, e->nrows); edges_alloc (e->nrows, e); e->edge.sym_endpoints[n].a = g_strdup (d->rowIds[a]); e->edge.sym_endpoints[n].b = g_strdup (d->rowIds[b]); e->edge.sym_endpoints[n].jpartner = -1; /* XXX */ unresolveAllEdgePoints (e); resolveEdgePoints (e, d); /* DTL: So need to call unresolveEdgePoints(e, d) to remove it from the list of previously resolved entries. Can do better by just re-allocing the endpoints in the DatadEndpoints struct and putting the new entry into that, except we have to check it resolves correctly, etc. So unresolveEdgePoints() will just cause entire collection to be recomputed. */ /* * This will be handled with signals, where each splotd listens * for (maybe) point_added or edge_added events. */ for (l = gg->displays; l; l = l->next) { dsp = (displayd *) l->data; if (dsp->e == e) { for (sl = dsp->splots; sl; sl = sl->next) { sp = (splotd *) sl->data; if (sp != NULL) { splot_edges_realloc (n, sp, e); /*-- this is only necessary if there are variables, I think --*/ if (e->ncols && GGOBI_IS_EXTENDED_SPLOT (sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (klass->alloc_whiskers) sp->whiskers = klass->alloc_whiskers (sp->whiskers, sp, e->nrows, e); } } } } } /*-- I need to reallocate whiskers for some displays --*/ displays_tailpipe (FULL, gg); /*-- I don't yet know what I need to reallocate for the tour --*/ return true; } /* --------------------------------------------------------------- */ /* Add an edgeset */ /* --------------------------------------------------------------- */ /** This sets the data set as the source of the edge information for all the plots within the display. */ GGobiData * setDisplayEdge (displayd * dpy, GGobiData * e) { GList *l; GGobiData *old = NULL; if (resolveEdgePoints (e, dpy->d)) { dpy->e = e; /* Now update all displays, not just this one. Events could also be used, but this is not too bad. */ GGOBI (edge_menus_update) (e->gg); } for (l = dpy->splots; l; l = l->next) { splotd *sp; sp = (splotd *) l->data; splot_edges_realloc (-1, sp, e); } return (old); } /** This looks for the first dataset that can be used as a source of edge information with the point dataset associated with the given display. @see setDisplayEdge. */ gboolean edgeset_add (displayd * display) { GGobiData *d; GGobiData *e; gint k; gboolean added = false; ggobid *gg; if (!display) return (false); d = display->d; gg = GGobiFromDisplay (display); if (gg->d != NULL) { gint nd = g_slist_length (gg->d); if (d->idTable) { for (k = 0; k < nd; k++) { e = (GGobiData *) g_slist_nth_data (gg->d, k); if ( /* e != d && */ e->edge.n > 0) { setDisplayEdge (display, e); added = true; break; } } } } return added; } /** Invoked when the user selected an item in the Edges menu on a scatterplot to control whether edges are displayed or not on the plot. */ void edgeset_add_cb (GtkAction * action, GGobiData * e) { ggobid *gg = e->gg; displayd *display = GGOBI_DISPLAY (g_object_get_data (G_OBJECT (action), "display")); if (GTK_IS_TOGGLE_ACTION (action) && !gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) return; if (e != display->e) { setDisplayEdge (display, e); display_plot (display, FULL, gg); /*- moving edge drawing */ } /* * If no edge option is true, then turn on undirected edges. */ if (!display->options.edges_undirected_show_p && !display->options.edges_directed_show_p && !display->options.edges_arrowheads_show_p) { GtkAction *action = gtk_ui_manager_get_action (display->menu_manager, "/menubar/Edges/ShowUndirectedEdges"); gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), true); } } /* * I don't know who commented this out, but I know that we want to be * sure this is done -- and probably after all edges have been read. * We can eliminate duplicate edges as we read them in, but these * reversed edges also need to be detected. dfs */ #if 0 void GGobi_cleanUpEdgeRelationships (struct _EdgeData *edge, int startPosition) { int k, i, start, end; for (i = startPosition; i < edge->n; i++) { end = edge->endpoints[i].b; start = edge->endpoints[i].a; for (k = 0; k < i; k++) { if (edge->endpoints[k].a == end && edge->endpoints[k].b == start) { edge->endpoints[i].jpartner = k; edge->endpoints[k].jpartner = i; } } } } #endif /* --------------------------------------------------------------- */ /* Utilities */ /* --------------------------------------------------------------- */ gboolean edge_endpoints_get (gint k, gint * a, gint * b, GGobiData * d, endpointsd * endpoints, GGobiData * e) { gboolean ok; *a = endpoints[k].a; *b = endpoints[k].b; ok = (*a >= 0 && *a < d->nrows && *b >= 0 && *b < d->nrows); return ok; } gint edgesets_count (ggobid * gg) { gint k, ne = 0; gint nd = g_slist_length (gg->d); GGobiData *e; for (k = 0; k < nd; k++) { e = (GGobiData *) g_slist_nth_data (gg->d, k); if (e->edge.n > 0) ne++; } return ne; } /******************************************************************************/ /* A constant used to identify that we have resolved the edgepoints and there were none. */ static endpointsd DegenerateEndpoints; /* Do the computations to lookup the different source and destination records in the target dataset (d) to get the record numbers given the symbolic names in the edgeset specification (sym). */ static endpointsd * computeResolvedEdgePoints (GGobiData * e, GGobiData * d) { endpointsd *ans; GHashTable *tbl = d->idTable; int ctr = 0, i; guint *tmp; gboolean resolved_p = false; ans = g_malloc (sizeof (endpointsd) * e->edge.n); if (tbl == NULL) { ans = &DegenerateEndpoints; return ans; } for (i = 0; i < e->edge.n; i++, ctr++) { tmp = (guint *) g_hash_table_lookup (tbl, e->edge.sym_endpoints[i].a); if (!tmp) { ans[ctr].a = -1; continue; } ans[ctr].a = *tmp; tmp = (guint *) g_hash_table_lookup (tbl, e->edge.sym_endpoints[i].b); if (!tmp) { ans[ctr].a = ans[ctr].b = -1; continue; } else { ans[ctr].b = *tmp; ans[ctr].jpartner = e->edge.sym_endpoints[i].jpartner; if (!resolved_p && ans[ctr].a != -1) resolved_p = true; } } if (ctr == 0 || resolved_p == false) { g_free (ans); ans = &DegenerateEndpoints; } return (ans); } static endpointsd * do_resolveEdgePoints (GGobiData * e, GGobiData * d, gboolean compute) { endpointsd *ans = NULL; DatadEndpoints *ptr; GList *tmp; if (e->edge.n < 1) return (NULL); /* Get the entry in the table for this dataset (d). Use the name for now. */ for (tmp = e->edge.endpointList; tmp; tmp = tmp->next) { ptr = (DatadEndpoints *) tmp->data; if (GGOBI_DATA (ptr->data) == d) { ans = ptr->endpoints; break; } } /* If it is already computed but empty, then return NULL. */ if (ans == &DegenerateEndpoints) return (NULL); /* So no entry in the table yet. So compute the endpoints and add that to the table. */ if (ans == NULL && compute) { /* resolve the endpoints */ ans = computeResolvedEdgePoints (e, d); ptr = (DatadEndpoints *) g_malloc (sizeof (DatadEndpoints)); ptr->data = G_OBJECT (d); ptr->endpoints = ans; /* (ans == &DegenerateEndpoints) ? NULL : ans; */ e->edge.endpointList = g_list_append (e->edge.endpointList, ptr); } if (ans == &DegenerateEndpoints) return (NULL); return (ans); } /* Find the resolved edgepoints array associated with this dataset (d) by resolving the symbolic edge definitions in e. */ endpointsd * resolveEdgePoints (GGobiData * e, GGobiData * d) { return (do_resolveEdgePoints (e, d, true)); } gboolean hasEdgePoints (GGobiData * e, GGobiData * d) { return (do_resolveEdgePoints (e, d, false) ? true : false); } static void cleanEdgePoint (gpointer data, gpointer userData) { DatadEndpoints *el = (DatadEndpoints *) data; if (el && el->endpoints) { g_free (el->endpoints); } } void unresolveAllEdgePoints (GGobiData * e) { if (e->edge.endpointList) { g_list_foreach (e->edge.endpointList, cleanEdgePoint, NULL); g_list_free (e->edge.endpointList); e->edge.endpointList = NULL; } } gboolean unresolveEdgePoints (GGobiData * e, GGobiData * d) { DatadEndpoints *ptr; GList *tmp; if (e->edge.n < 1) return (false); for (tmp = e->edge.endpointList; tmp; tmp = tmp->next) { ptr = (DatadEndpoints *) tmp->data; if (GGOBI_DATA (ptr->data) == d) { if (ptr->endpoints) g_free (ptr->endpoints); /* equivalent to g_list_remove(e->edge.endpointList, tmp) except we don't do the extra looping. Probably minute since # of datasets is small! */ if (tmp == e->edge.endpointList) { e->edge.endpointList = tmp->next; } else { tmp->prev = tmp->next; } return (true); } } return (false); } ggobi-2.1.12/src/tour.c0000644000175000017500000004755314651527764010330 /* tour.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "stdlib.h" #include #ifdef USE_STRINGS_H #include #endif #include #include /*#include #include */ #include #include "vars.h" #include "externs.h" void zero_tau (vector_f tau, gint projdim) { gint k; for (k=0; k 1.0-tol) ok = false; /* If the two vectors are close to being equal */ return(ok); } /* checks columns of matrix are orthonormal */ gboolean checkcolson(gdouble **ut, gint datadim, gint projdim) { gint j, k; gdouble tol = 0.01; gboolean ok = true;/* true means cols are o.n. */ for (j=0; j tol) { ok = false; return(ok); } } for (j=0; j tol) { ok = false; return(ok); } } } return(ok); } gboolean checkequiv(gdouble **Fa, gdouble **Fz, gint datadim, gint projdim) { gint j; gdouble ftmp, tol = 0.0001; gboolean ok = true; /* false = the two are the same */ for (j=0; jd; gint datadim = d->ncols;*/ gint j, k; for (j=0; j If dimension of the intersection is equal to dimension of proj, dI=ndim, we should stop here, and set Ft to be Fa but this is equivalent to setting the lambda's to be 1.0 at this stage.*/ dI = 0; for (i=0; i 1.0-tol) { dI++; lambda.els[i] = 1.0; } } /* Compute principal angles */ for (i=0; i dI) { /* Span is ok - proceed */ /* Rotate Fa to get Ga */ for (i=0; i tol) { tau.els[i] /= dist_az; } else tau.els[i] = 0.0; } *pdist_az = dist_az; *ptang = tang; } else { arrayd_copy(&Fa, &F); arrayd_copy(&Fa, &Ga); arrayd_copy(&Fz, &Gz); arrayd_copy(&Fz, &Va); arrayd_copy(&Fa, &G); *pdist_az = dist_az; *ptang = tang; } /* printf("dist_az %f \n",dist_az);*/ /* free temporary arrays */ g_free ((gpointer) pairs); for (j=0; j<2; j++) g_free (ptinc[j]); g_free (ptinc); g_free (e); return(0); } /* path */ /* Generate the interpolation frame. No preprojection is done */ void tour_reproject(vector_f tinc, array_d G, array_d Ga, array_d Gz, array_d F, array_d Va, gint datadim, gint projdim) { gint i, j, k; gdouble tmpd1, tmpd2, tmpd; gfloat **ptinc = (gfloat **) g_malloc (2 * sizeof (gfloat *)); for (i=0; i<2; i++) ptinc[i] = (gfloat *) g_malloc (projdim * sizeof (gfloat)); for (i=0; i= dist_az) attheend = true; if (!attheend) { for (i=0; i= dist_az) arewethereyet = true; } else if (basmeth == 1) { if (*indxval <= *oindxval) { arewethereyet = true; } /* if (tang >= dist_az) arewethereyet = true; */ } return(arewethereyet); } gboolean reached_target2(vector_f tinc, vector_f tau, gint basmeth, gfloat *indxval, gfloat *oindxval, gint projdim) { gboolean arewethereyet = false; gfloat tol=0.01; gint i; if (basmeth == 1) { if (*indxval < *oindxval) { arewethereyet = true; *indxval = *oindxval; } else *oindxval = *indxval; } else { for (i=0; i= 50)) step = (gfloat) pow((double)(slidepos-50)/100.,(gdouble)1.5) + 0.0225; */ if (slidepos < 30.) step = (slidepos - 5.)/2000.; else if (slidepos >= 30. && slidepos < 90.) step = (gfloat) pow((double)(slidepos-30.)/100.,(gdouble)1.5) + 0.0125; else step = (gfloat) pow((double)(slidepos)/100.,(gdouble)2.0) - 0.81 + 0.477; delta = (step*M_PI_2)/(10.0); } *st = step; *dlt = delta; } void gt_basis (array_d Fz, gint nactive, vector_i active_vars, gint datadim, gint projdim) /* * Generate d random p dimensional vectors to form new ending basis */ { gint i, j, k, check = 1, nvals = nactive*projdim, ntimes; gdouble frunif[2]; gdouble r, fac, frnorm[2]; gboolean oddno; if ((nvals % 2) == 1) oddno = true; else oddno=false; if (oddno) ntimes = nvals/2+1; else ntimes = nvals/2; /* * Method suggested by Press, Flannery, Teukolsky, and Vetterling (1986) * "Numerical Recipes" p.202-3, for generating random normal variates . */ /* Zero out Fz before filling; this might fix a bug we are encountering with returning from a receive tour. */ for (j=0; j projdim) { for (j=0; j 1) { for (k=0; k #include #include "vars.h" #include "externs.h" /*-------------------------------------------------------------------------*/ /* variable limits */ /*-------------------------------------------------------------------------*/ /** * limits_adjust: * @min: minimum value * @max: maximumum value * * Adjust limits to add 10% extra space. * */ void limits_adjust (gfloat * min, gfloat * max) { if (*max - *min == 0) { if (*min == 0.0) { *min = -1.0; *max = 1.0; } else { *min = 0.9 * *min; *max = 1.1 * *max; } } if (*max < *min) { gfloat ftmp = *max; *max = *min; *min = ftmp; } } /** * Specify the limits used: from data or user specification */ void limits_set_from_vartable (vartabled * vt) { gfloat min, max; if (vt->lim_specified_p) { min = vt->lim_specified_tform.min; max = vt->lim_specified_tform.max; } else { min = vt->lim_tform.min; max = vt->lim_tform.max; } limits_adjust (&min, &max); vt->lim.min = min; vt->lim.max = max; } /* * Set limits for raw variable */ static void limits_raw_set_by_var (GGobiData * d, gint j, gboolean visible_only) { gint i, m; vartabled *vt = vartable_element_get (j, d); greal min, max; min = G_MAXFLOAT; max = -G_MAXFLOAT; if (visible_only) { /*-- if using visible cases only --*/ for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; if (!d->missings_show_p && ggobi_data_is_missing(d, i,j)); else { if (d->raw.vals[i][j] < min) min = d->raw.vals[i][j]; if (d->raw.vals[i][j] > max) max = d->raw.vals[i][j]; } } } else { for (i = 0; i < d->nrows; i++) { if (!d->missings_show_p && ggobi_data_is_missing(d, i,j)); else { if (d->raw.vals[i][j] < min) min = d->raw.vals[i][j]; if (d->raw.vals[i][j] > max) max = d->raw.vals[i][j]; } } } vt->lim_raw.min = min; vt->lim_raw.max = max; } /* * Set limits for all raw variables */ static void limits_raw_set (GGobiData * d, gboolean visible_only) { gint j; g_assert (d->raw.nrows == d->nrows); g_assert (d->raw.ncols == d->ncols); for (j = 0; j < d->ncols; j++) limits_raw_set_by_var (d, j, visible_only); } /* * Set limits for tranformed variable */ static void limits_tform_set_by_var (GGobiData * d, gint j, gboolean visible_only) { gint i, m; vartabled *vt = vartable_element_get (j, d); greal min, max; min = G_MAXFLOAT; max = -G_MAXFLOAT; if (visible_only) { for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; if (!d->missings_show_p && ggobi_data_is_missing(d, i, j)); else { if (d->tform.vals[i][j] < min) min = d->tform.vals[i][j]; if (d->tform.vals[i][j] > max) max = d->tform.vals[i][j]; } } } else { for (i = 0; i < d->nrows; i++) { if (!d->missings_show_p && ggobi_data_is_missing(d, i, j)); else { if (d->tform.vals[i][j] < min) min = d->tform.vals[i][j]; if (d->tform.vals[i][j] > max) max = d->tform.vals[i][j]; } } } vt->lim_tform.min = min; vt->lim_tform.max = max; } void limits_display_set_by_var (GGobiData * d, gint j, gboolean visible_only) { gint i, m, np = 0; gfloat sum = 0.0; gfloat *x = (gfloat *) g_malloc (d->nrows * sizeof (gfloat)); vartabled *vt = vartable_element_get (j, d); greal min, max; min = G_MAXFLOAT; max = -G_MAXFLOAT; if (visible_only) { for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; /*-- lim_display and stats: only use non-missing cases --*/ if (ggobi_data_is_missing(d, i, j)); else { if (d->tform.vals[i][j] < min) min = d->tform.vals[i][j]; if (d->tform.vals[i][j] > max) max = d->tform.vals[i][j]; sum += d->tform.vals[i][j]; x[np] = d->tform.vals[i][j]; np++; } } } else { for (i = 0; i < d->nrows; i++) { if (ggobi_data_is_missing(d, i, j)); else { if (d->tform.vals[i][j] < min) min = d->tform.vals[i][j]; if (d->tform.vals[i][j] > max) max = d->tform.vals[i][j]; sum += d->tform.vals[i][j]; x[np] = d->tform.vals[i][j]; np++; } } } vt->lim_display.min = min; vt->lim_display.max = max; vt->mean = sum / np; /*-- median: sort the temporary vector, and find its center --*/ qsort ((void *) x, np, sizeof (gfloat), fcompare); vt->median = ((np % 2) != 0) ? x[(np - 1) / 2] : (x[np / 2 - 1] + x[np / 2]) / 2.; g_free ((gpointer) x); } static void limits_tform_set (GGobiData * d, gboolean visible_only) { gint j; g_assert (d->tform.nrows == d->nrows); g_assert (d->tform.ncols == d->ncols); for (j = 0; j < d->ncols; j++) { limits_tform_set_by_var (d, j, visible_only); limits_display_set_by_var (d, j, visible_only); } } void limits_set (GGobiData * d, gboolean do_raw, gboolean do_tform, gboolean visible_only) { gint j; vartabled *vt; if (do_raw) limits_raw_set (d, visible_only); if (do_tform) limits_tform_set (d, visible_only); for (j = 0; j < d->ncols; j++) { vt = vartable_element_get (j, d); limits_set_from_vartable (vt); } } void limits_set_by_var (GGobiData * d, gint j, gboolean do_raw, gboolean do_tform, gboolean visible_only) { vartabled *vt = vartable_element_get (j, d); if (do_raw) limits_raw_set_by_var (d, j, visible_only); if (do_tform) limits_tform_set_by_var (d, j, visible_only); limits_set_from_vartable (vt); } ggobi-2.1.12/src/write_xml.c0000644000175000017500000003571014651527764011341 /* write_xml.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "write_xml.h" /* Takes the current data in the specified ggobid structure and writes the XML file corresponding to this configuration. This can be used to convert the original data formats to XML, if that is desired. (More likely to be correct than writing a Perl script!) Alas, it can't be relied upon for all file conversions, because ggobi doesn't read all xgobi-style data files, with .lines as a prominent example. ggobi also doesn't read xgobi-style .colors files. */ #include #include #include "writedata.h" XmlWriteInfo *updateXmlWriteInfo(GGobiData *d, ggobid *gg, XmlWriteInfo *info); /* if a string contains an ampersand, write it as & ... etc ... --*/ static void write_xml_string(FILE *f, gchar *str) { gchar *fmtstr = g_markup_printf_escaped("%s", str); fprintf(f, "%s", fmtstr); g_free(fmtstr); } static void write_xml_string_fmt(FILE *f, gchar *fmt, gchar *str) { gchar *fmtstr = g_markup_printf_escaped(fmt, str); fprintf(f, "%s", fmtstr); g_free(fmtstr); } gboolean write_xml (const gchar *filename, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { FILE *f; gboolean ok = false; /* *GGobiData *d; *GSList *tmp = gg->d; */ f = fopen (filename,"w"); if (f == NULL) { return (false); } write_xml_stream (f, gg, filename, xmlWriteInfo); fclose(f); return ok; } gboolean write_xml_stream (FILE *f, ggobid *gg, const gchar *filename, XmlWriteInfo *xmlWriteInfo) { gint numDatasets, i; GGobiData *d; numDatasets = g_slist_length(gg->d); // g_printerr ("numDatasets %d\n", numDatasets); write_xml_header (f, -1, gg, xmlWriteInfo); for(i = 0; i < numDatasets; i++) { d = (GGobiData *) g_slist_nth_data(gg->d, i); if(xmlWriteInfo->useDefault) updateXmlWriteInfo(d, gg, xmlWriteInfo); write_xml_dataset(f, d, gg, xmlWriteInfo); } write_xml_footer(f, gg, xmlWriteInfo); return(true); } gboolean write_xml_dataset(FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { if (d->edge.n && !d->ncols) { write_xml_edges(f, d, gg, xmlWriteInfo); } else { write_dataset_header (f, d, gg, xmlWriteInfo); write_xml_description (f, gg, xmlWriteInfo); write_xml_variables (f, d, gg, xmlWriteInfo); write_xml_records (f, d, gg, xmlWriteInfo); write_dataset_footer(f, gg, xmlWriteInfo); } return(true); } gboolean write_xml_header (FILE *f, int numDatasets, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { fprintf(f, ""); fprintf(f, "\n"); fprintf(f, ""); fprintf(f, "\n\n"); if(numDatasets < 0) numDatasets = g_slist_length(gg->d); fprintf(f, "\n", numDatasets); /* fflush(f);*/ return(true); } gboolean write_xml_description (FILE *f, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { fprintf(f,"\n"); /*XXX*/ fprintf(f, "This is XML created by GGobi\n"); fprintf(f,"\n"); return(true); } gboolean write_xml_variables (FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { gint j; if (gg->save.column_ind == ALLCOLS) { fprintf(f,"\n", d->ncols); for(j = 0; j < d->ncols; j++) { write_xml_variable (f, d, gg, j, xmlWriteInfo); fprintf(f,"\n"); } } else if (gg->save.column_ind == SELECTEDCOLS) { /*-- work out which columns to save --*/ gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint ncols = selected_cols_get (cols, d, gg); if (ncols == 0) ncols = plotted_cols_get (cols, d, gg); fprintf(f,"\n", ncols); for(j = 0; j < ncols; j++) { write_xml_variable (f, d, gg, cols[j], xmlWriteInfo); fprintf(f,"\n"); } g_free (cols); } fprintf(f,"\n"); return(true); } gboolean write_xml_variable(FILE *f, GGobiData *d, ggobid *gg, gint j, XmlWriteInfo *xmlWriteInfo) { vartabled *vt = vartable_element_get (j, d); gchar* varname = g_strstrip( (gg->save.stage == TFORMDATA) ? ggobi_data_get_transformed_col_name(d, j) : ggobi_data_get_col_name(d, j) ); if (vt->vartype == categorical) { gint k; write_xml_string_fmt(f, " nickname) write_xml_string_fmt(f, " nickname=\"%s\"", vt->nickname); fprintf(f, ">\n"); fprintf(f, " \n", vt->nlevels); for (k=0; knlevels; k++) { fprintf(f, " ", vt->level_values[k]); /* Add any needed html/xml markup to level names */ write_xml_string(f, vt->level_names[k]); fprintf(f, "\n"); } fprintf(f, " \n"); fprintf(f, " "); } else { fprintf(f, " <"); if (vt->vartype == real) fprintf(f, "realvariable"); if (vt->vartype == integer) fprintf(f, "integervariable"); if (vt->vartype == counter) fprintf(f, "countervariable"); write_xml_string_fmt(f, " name=\"%s\"", varname); if (vt->nickname) write_xml_string_fmt(f, " nickname=\"%s\"", vt->nickname); fprintf(f, "/>"); } return(true); } /* gboolean write_edge_record_p (gint i, GGobiData *e, ggobid *gg) { * If e is an edge set, then * loop over all other datads and test their rowids to decide * whether this case should be drawn. Use sampled and hidden. * XXX We can't really do this, because we don't know what * edgeset may have been associated with what nodeset. gboolean save_case = true; GGobiData *d; GSList *l; gint a, b; if (e->edge.n == e->nrows) { for (l = gg->d; l; l=l->next) { d = (GGobiData *) l->data; endpointsd *endpoints = resolveEdgePoints(e, d); if (endpoints) { if (!edge_endpoints_get (i, &a, &b, d, endpoints, e) || !d->sampled.els[a] || !d->sampled.els[b] || d->excluded.els[a] || d->excluded.els[b]) { save_case = false; break; } } } } return save_case; } */ static void writeFloat(FILE *f, double value) { fprintf(f, "%g", value); } static void writeInt(FILE *f, int value) { fprintf(f, "%d", value); } static void writeEntry(FILE *f, vartyped vtype, double value) { switch (vtype) { case categorical: case integer: case counter: writeInt(f, (int) value); break; default: writeFloat (f, value); } } gboolean write_xml_records(FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { gint i, j, m, n = 0; vartyped *vartypes; vartabled *vt; vartypes = (vartyped *) g_malloc(d->ncols * sizeof(vartyped)); for (j=0; jncols; j++) { vt = vartable_element_get (j, d); vartypes[j] = vt->vartype; } /*-- figure out how many records we're about to save. --*/ if (gg->save.row_ind == ALLROWS) n = d->nrows; else if (gg->save.row_ind == DISPLAYEDROWS) n = d->nrows_in_plot; fprintf(f, "useDefault) { /* fprintf(f, " glyphSize=\"%s\"", xmlWriteInfo->defaultGlyphSizeName); fprintf(f, " glyphType=\"%s\"", xmlWriteInfo->defaultGlyphTypeName); */ fprintf(f, " glyph=\"%s %s\"", xmlWriteInfo->defaultGlyphTypeName, xmlWriteInfo->defaultGlyphSizeName); fprintf(f, " color=\"%s\"", xmlWriteInfo->defaultColorName); } if (ggobi_data_has_missings(d)) { if (gg->save.missing_ind == MISSINGSNA) fprintf(f, " missingValue=\"%s\"", "na"); /*-- otherwise write the "imputed" value --*/ } fprintf(f, ">\n"); if (gg->save.row_ind == ALLROWS) { for (i = 0; i < d->nrows; i++) { fprintf(f, "\n"); } } else { /*-- if displaying visible rows only --*/ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; fprintf(f, "\n"); } } fprintf(f, "\n"); g_free (vartypes); return(true); } /* * I want this to write records as well as records. */ gboolean write_xml_record (FILE *f, GGobiData *d, ggobid *gg, gint i, vartyped *vartypes, XmlWriteInfo *xmlWriteInfo) { gint j; gchar *gstr, *gtypestr = NULL; /*-- ids if present --*/ if (d->rowIds) { write_xml_string_fmt(f, " id=\"%s\"", d->rowIds[i]); } /*-- if the record is hidden, indicate that --*/ if (d->hidden_now.els[i]) { fprintf(f, " hidden=\"true\""); } /*-- edges if present and requested --*/ if (gg->save.edges_p && d->edge.n && i < d->edge.n) { write_xml_string_fmt(f, " source=\"%s\"", d->edge.sym_endpoints[i].a); write_xml_string_fmt(f, " destination=\"%s\"", d->edge.sym_endpoints[i].b); } if (d->rowlab && d->rowlab->data && (gstr = (gchar *) g_array_index (d->rowlab, gchar *, i))) { fprintf(f, " label=\""); write_xml_string(f, gstr); fprintf(f, "\""); } if (!xmlWriteInfo->useDefault || xmlWriteInfo->defaultColor != d->color.els[i]) { fprintf(f, " color=\"%d\"", d->color.els[i]); } /* fprintf(f, " glyphSize=\"%d\"", d->glyph[i].size); fprintf(f, " glyphType=\"%d\"", d->glyph[i].type); */ if (!xmlWriteInfo->useDefault || xmlWriteInfo->defaultGlyphType != d->glyph.els[i].type || xmlWriteInfo->defaultGlyphSize != d->glyph.els[i].size) { switch (d->glyph.els[i].type) { case PLUS: gtypestr = "plus"; break; case X: gtypestr = "x"; break; case OR: gtypestr = "or"; break; case FR: gtypestr = "fr"; break; case OC: gtypestr = "oc"; break; case FC: gtypestr = "fc"; break; case DOT_GLYPH: gtypestr = "."; break; case UNKNOWN_GLYPH: default: gtypestr=NULL; break; } fprintf (f, " glyph=\"%s %d\"", gtypestr, d->glyph.els[i].size); } fprintf(f, ">\n"); if (gg->save.column_ind == ALLCOLS && d->ncols > 0) { for(j = 0; j < d->ncols; j++) { /*-- if missing, figure out what to write --*/ if (ggobi_data_has_missings(d) && ggobi_data_is_missing(d, i, j) && gg->save.missing_ind != MISSINGSIMPUTED) { fprintf (f, ""); } else { /*-- if not missing, just write the data --*/ writeEntry (f, vartypes[j], (gg->save.stage == TFORMDATA) ? d->tform.vals[i][j] : d->raw.vals[i][j]); } if (j < d->ncols-1 ) fprintf(f, " "); } } else if (gg->save.column_ind == SELECTEDCOLS && d->ncols > 0) { /*-- work out which columns to save --*/ gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint k, ncols = selected_cols_get (cols, d, gg); if (ncols == 0) ncols = plotted_cols_get (cols, d, gg); for(k = 0; k < ncols; k++) { j = cols[k]; if (ggobi_data_is_missing(d, i, j) && gg->save.missing_ind != MISSINGSIMPUTED) { fprintf (f, ""); } else { writeEntry (f, vartypes[j], (gg->save.stage == TFORMDATA) ? d->tform.vals[i][j] : d->raw.vals[i][cols[j]]); } if (j < ncols-1 ) fprintf(f, " "); } g_free (cols); } return (true); } gboolean write_xml_edges (FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { gint i, j; vartyped *vartypes; vartabled *vt; if (d->edge.n < 1) return(true); /* fprintf(f, "\n", d->edge.n, d->name); There seems to be a need to write the defaults in the case where we started with ascii data and added edges; in this case the edges are written as rather than as a new datad, and maybe that's the problem. dfs */ fprintf(f, "edge.n); write_xml_string_fmt(f, "name=\"%s\" ", (gchar *)d->name); fprintf(f, "color=\"%d\" glyphType=\"%s\" glyphSize=\"%s\">\n", xmlWriteInfo->defaultColor, xmlWriteInfo->defaultGlyphTypeName, xmlWriteInfo->defaultGlyphSizeName); vartypes = (vartyped *) g_malloc(d->ncols * sizeof(vartyped)); for (j=0; jncols; j++) { vt = vartable_element_get (j, d); vartypes[j] = vt->vartype; } for(i = 0; i < d->edge.n; i++) { fprintf(f, "\n"); } fprintf(f, "\n"); g_free (vartypes); return(true); } gboolean write_dataset_header (FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { fprintf(f,"name); fprintf(f,">\n"); return(true); } gboolean write_dataset_footer(FILE *f, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { fprintf(f,"\n"); return(true); } gboolean write_xml_footer(FILE *f, ggobid *gg, XmlWriteInfo *xmlWriteInfo) { fprintf(f,"\n"); return(true); } XmlWriteInfo * updateXmlWriteInfo(GGobiData *d, ggobid *gg, XmlWriteInfo *info) { int i, n, numGlyphSizes; gint *colorCounts, *glyphTypeCounts, *glyphSizeCounts, count; gchar *str; gint ncolors = gg->activeColorScheme->n; colorCounts = g_malloc0(sizeof(gint) * ncolors); glyphTypeCounts = g_malloc0(sizeof(gint) * UNKNOWN_GLYPH); numGlyphSizes = NGLYPHSIZES; glyphSizeCounts = g_malloc0(sizeof(gint) * numGlyphSizes); n = GGOBI(nrecords)(d); for(i = 0 ; i < n ; i++) { colorCounts[d->color.els[i]]++; glyphSizeCounts[d->glyph.els[i].size]++; glyphTypeCounts[d->glyph.els[i].type]++; } count = -1; for(i = 0 ; i < ncolors; i++) { if(colorCounts[i] > count) { info->defaultColor = i; count= colorCounts[i]; } } count = -1; for(i = 0 ; i < UNKNOWN_GLYPH; i++) { if(glyphTypeCounts[i] > count) { info->defaultGlyphType = i; count= glyphTypeCounts[i]; } } count = -1; for(i = 0 ; i < numGlyphSizes; i++) { if(glyphSizeCounts[i] > count) { info->defaultGlyphSize = i; count= glyphSizeCounts[i]; } } /* if(gg->colorNames && (str = gg->colorNames[info->defaultColor]) && str[0]) info->defaultColorName = g_strdup(str); else { */ info->defaultColorName = str = g_malloc(5 * sizeof(char)); sprintf(str, "%d", info->defaultColor); /* } */ info->defaultGlyphSizeName = str = g_malloc(5 * sizeof(char)); sprintf(str, "%d", info->defaultGlyphSize); str = (gchar *) GGOBI(getGlyphTypeName)(info->defaultGlyphType); info->defaultGlyphTypeName = g_strdup(str); return(info); } ggobi-2.1.12/src/varseldata.h0000644000175000017500000000060414651527764011454 /*-- varseldatad.h --*/ #ifndef VARSELDATA_H #define VARSELDATA_H /* typedef struct _ggobid ggobid; */ typedef struct { splotd *sp; gint jvar; gint btn; /*-- emulate button press --*/ gint alt_mod; /*-- emulate the alt key --*/ gint shift_mod; /*-- emulate the shift key --*/ gint ctrl_mod; /*-- emulate the control key --*/ ggobid *gg; } varseldatad; #endif ggobi-2.1.12/src/missing.c0000644000175000017500000001302114651527764010767 /* missing.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include /*#include */ /*#include */ #include #include #include "vars.h" #include "externs.h" /*--------------------------------------------------------------------*/ /* Memory management routines */ /*--------------------------------------------------------------------*/ void missing_arrays_add_cols (GGobiData * d) { if (d->missing.ncols < d->ncols) { arrays_add_cols (&d->missing, d->ncols); } } void missing_arrays_add_rows (gint nrows, GGobiData * d) { arrays_add_rows (&d->missing, nrows); } /*------------------------------------------------------------------*/ /* Scaling and jittering missing value plots */ /*------------------------------------------------------------------*/ /* * For the datad currently selected in gg->impute.notebook, * generate a new datad using d->missing. Maybe I should only * create missingness variables for those variables which have * missing values ... * */ // FIXME: create with the GGobiData api void missings_datad_cb (GtkWidget * w, ggobid * gg) { GObject *obj = G_OBJECT (gg->impute.window); GtkWidget *tree_view = get_tree_view_from_object (obj); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); static gchar *lnames[] = { "present", "missing" }; if (!ggobi_data_has_missings(d)) return; GtkWidget *notebook; GGobiData *dnew; gint i, j, k; vartabled *vt, *vtnew; gint *cols; gint *cols_with_missings, ncols_with_missings; ncols_with_missings = 0; cols_with_missings = g_malloc (d->ncols * sizeof (gint)); for (j = 0; j < d->ncols; j++) { if (ggobi_data_get_col_n_missing(d, j)) cols_with_missings[ncols_with_missings++] = j; } notebook = (GtkWidget *) g_object_get_data (obj, "notebook"); dnew = ggobi_data_new (d->nrows, ncols_with_missings); dnew->name = g_strdup_printf ("%s (missing)", d->name); for (i = 0; i < d->nrows; i++) { for (j = 0; j < ncols_with_missings; j++) { k = cols_with_missings[j]; dnew->raw.vals[i][j] = (gfloat) ggobi_data_is_missing(d, i, k); } } /* * ids to support linking: if the current datad doesn't * have ids, they need to be assigned. */ if (d->rowIds == NULL) { gchar **rowids = (gchar **) g_malloc (d->nrows * sizeof (gchar *)); for (i = 0; i < d->nrows; i++) rowids[i] = g_strdup_printf ("%d", i); datad_record_ids_set (d, rowids, true); for (i = 0; i < d->nrows; i++) g_free (rowids[i]); g_free (rowids); } datad_record_ids_set (dnew, d->rowIds, true); /*-- --*/ /* * I'm going to make all the variables categorical. For the moment, * there can be only two categories: present (0), missing (1). In * the future, we might want to support other categories: censored, * left-censored, etc. */ for (j = 0; j < ncols_with_missings; j++) { k = cols_with_missings[j]; vt = vartable_element_get (k, d); vtnew = vartable_element_get (j, dnew); vtnew->collab = g_strdup (vt->collab); vtnew->collab_tform = g_strdup (vtnew->collab); /*-- categorical variable definitions --*/ vtnew->vartype = categorical; vtnew->nlevels = 2; vtnew->level_values = (gint *) g_malloc (sizeof (gint) * 2); vtnew->level_counts = (gint *) g_malloc (sizeof (gchar *) * 2); vtnew->level_names = (gchar **) g_malloc (sizeof (gchar *) * 2); for (i = 0; i < 2; i++) { vtnew->level_values[i] = i; vtnew->level_names[i] = g_strdup (lnames[i]); } vtnew->level_counts[0] = d->nrows - ggobi_data_get_col_n_missing(d, j); vtnew->level_counts[1] = ggobi_data_get_col_n_missing(d, j); /*-- prepare to jitter, and set limits to [0,1] --*/ vtnew->lim_specified_p = true; /*-- user-specified limits --*/ vtnew->lim_specified.min = 0.0; vtnew->lim_specified_tform.min = 0.0; vtnew->lim_specified.max = 1.0; vtnew->lim_specified_tform.max = 1.0; vtnew->jitter_factor = .2; } for (i = 0; i < d->nrows; i++) { g_array_append_val (dnew->rowlab, g_array_index (d->rowlab, gchar *, i)); } datad_init (dnew, gg, false); /*-- jitter the data --*/ /*-- forces unnecessary redisplay, unfortunately --*/ cols = g_malloc (dnew->ncols * sizeof (gint)); for (i = 0; i < dnew->ncols; i++) cols[i] = i; rejitter (cols, dnew->ncols, dnew, gg); /*-- copy the existing glyph and color --*/ for (i = 0; i < d->nrows; i++) { dnew->color.els[i] = d->color.els[i]; dnew->color_now.els[i] = d->color_now.els[i]; dnew->glyph.els[i].type = d->glyph.els[i].type; dnew->glyph_now.els[i].type = d->glyph_now.els[i].type; dnew->glyph.els[i].size = d->glyph.els[i].size; dnew->glyph_now.els[i].size = d->glyph_now.els[i].size; } /*-- this should be executed in response to any datad_added event --*/ display_menu_build (gg); g_free (cols); g_free (cols_with_missings); } ggobi-2.1.12/src/identify_ui.c0000644000175000017500000003623714651527764011644 /*-- identify_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" static void notebook_current_page_set (displayd *, GtkWidget *, ggobid *); static void identify_target_cb (GtkWidget * w, ggobid * gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; gboolean edges_displayed = (display->e != NULL && (display->options.edges_directed_show_p || display->options.edges_undirected_show_p || display->options.edges_arrowheads_show_p)); cpanel->id_target_type = (enum idtargetd) gtk_combo_box_get_active (GTK_COMBO_BOX (w)); if (!edges_displayed && cpanel->id_target_type == identify_edges) { quick_message ("Sorry, need to display edges before labeling them.", false); gtk_combo_box_set_active (GTK_COMBO_BOX (w), (gint) identify_points); } else { GtkWidget *pnl, *notebook; pnl = mode_panel_get_by_name (GGOBI (getIModeName) (IDENT), gg); if (pnl) { notebook = widget_find_by_name (pnl, "IDENTIFY:notebook"); if (notebook) notebook_current_page_set (display, notebook, gg); } } displays_plot (NULL, QUICK, gg); } static void recenter_cb (GtkWidget * w, ggobid * gg) { GGobiData *d = gg->current_display->d; gint k = -1; if (g_slist_length (d->sticky_ids) >= 1) { k = GPOINTER_TO_INT (d->sticky_ids->data); } recenter_data (k, d, gg); } static void id_remove_labels_cb (GtkWidget * w, ggobid * gg) { displayd *dsp = gg->current_display; cpaneld *cpanel = &gg->current_display->cpanel; GGobiData *d; gboolean ok = true; if (cpanel->id_target_type == identify_points) d = dsp->d; else { d = dsp->e; ok = (d != NULL); } g_slist_free (d->sticky_ids); d->sticky_ids = (GSList *) NULL; /* This will become an event on the datad when we move to Gtk objects (soon now!) */ g_signal_emit (G_OBJECT (gg), GGobiSignals[STICKY_POINT_REMOVED_SIGNAL], 0, -1, (gint) UNSTICKY, d); displays_plot (NULL, QUICK, gg); } static void id_all_sticky_cb (GtkWidget * w, ggobid * gg) { gint i, m; GGobiData *d = NULL; displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; if (cpanel->id_target_type == identify_edges) { /* Make sure there is an edge set and it is displayed */ if (dsp->e != NULL && (dsp->options.edges_directed_show_p || dsp->options.edges_undirected_show_p || dsp->options.edges_arrowheads_show_p)) { d = dsp->e; } } else d = dsp->d; if (d) { /*-- clear the list before adding to avoid redundant entries --*/ g_slist_free (d->sticky_ids); d->sticky_ids = (GSList *) NULL; for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; d->sticky_ids = g_slist_append (d->sticky_ids, GINT_TO_POINTER (i)); } /* This will become an event on the datad when we move to Gtk objects (soon now!) */ g_signal_emit (G_OBJECT (gg), GGobiSignals[STICKY_POINT_ADDED_SIGNAL], 0, -1, (gint) STICKY, d); displays_plot (NULL, QUICK, gg); } } enum { RECORD_ID_INDEX = -3, RECORD_LABEL_INDEX, RECORD_NUMBER_INDEX }; static void label_selected_cb (GtkTreeSelection * treesel, ggobid * gg) { gint *vars, nvars, i; displayd *display = gg->current_display; if (display) { cpaneld *cpanel = &display->cpanel; vars = get_selections_from_tree_view (GTK_WIDGET (gtk_tree_selection_get_tree_view (treesel)), &nvars); cpanel->id_display_type = 0; for (i = 0; i < nvars; i++) { if (vars[i] < 0) cpanel->id_display_type |= 1 << -vars[i]; else cpanel->id_display_type |= 1; } displays_plot (NULL, QUICK, gg); } } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ return false; } static gint motion_notify_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp) { gint k; ggobid *gg = GGobiFromSPlot (sp); GGobiData *d = gg->current_display->d; gboolean button1_p, button2_p; gint nd = g_slist_length (gg->d); cpaneld *cpanel = &gg->current_display->cpanel; GGobiPointMoveEvent ev; /* * w = sp->da * sp = g_object_get_data(G_OBJECT (w), "splotd")); */ mousepos_get_motion (w, event, &button1_p, &button2_p, sp); if (GGOBI_IS_EXTENDED_SPLOT (sp)) { gboolean changed; gboolean (*f) (icoords, splotd * sp, GGobiData *, ggobid *); f = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp)->identify_notify; if (f) { changed = f (sp->mousepos, sp, d, gg); if (changed) { displays_plot (NULL, QUICK, gg); } return (true); } } if (cpanel->id_target_type == identify_points) { k = find_nearest_point (&sp->mousepos, sp, d, gg); d->nearest_point = k; /*-- link by id --*/ if (nd > 1) identify_link_by_id (k, d, gg); /*-- --*/ if (k != d->nearest_point_prev) { displays_plot (NULL, QUICK, gg); #ifdef EXPLICIT_IDENTIFY_HANDLER if (gg->identify_handler.handler) { (gg->identify_handler.handler) (gg->identify_handler.user_data, k, sp, w, gg); } #endif if (k != d->nearest_point_prev) { ev.d = d; ev.id = k; /* This will become an event on the datad when we move to Gtk objects (soon now!) - note: this came long ago */ g_signal_emit (G_OBJECT (gg), GGobiSignals[IDENTIFY_POINT_SIGNAL], 0, sp, k, d); displays_plot (NULL, QUICK, gg); d->nearest_point_prev = k; } } } else { GGobiData *e = gg->current_display->e; if (e && e->edge.n) { k = find_nearest_edge (sp, gg->current_display, gg); e->nearest_point = k; if (e->nearest_point != e->nearest_point_prev) { ev.d = e; ev.id = k; /*-- perhaps this should be an IDENTIFY_EDGE_SIGNAL ... --*/ g_signal_emit (G_OBJECT (gg), GGobiSignals[IDENTIFY_POINT_SIGNAL], 0, sp, k, e); displays_plot (NULL, QUICK, gg); e->nearest_point_prev = k; } } } return true; /* no need to propagate the event */ } static gint button_press_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { /* * If nearest_point is a member of gg->sticky_ids, remove it; if * it isn't, add it. */ ggobid *gg = GGobiFromSPlot (sp); displayd *dsp = sp->displayptr; cpaneld *cpanel = &dsp->cpanel; GGobiData *d = NULL; if (cpanel->id_target_type == identify_edges) { if (dsp->e != NULL) d = dsp->e; } else d = dsp->d; if (!d) return false; sticky_id_toggle (d, gg); return true; } static gint button_release_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); gg->buttondown = 0; return true; } void identify_event_handlers_toggle (splotd * sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window), "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK (button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK (button_release_cb), (gpointer) sp); sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (motion_notify_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); disconnect_motion_signal (sp); } } static const gchar *label_prefices[] = { "Record ID", "Record Label", "Record Number" }; static const gchar ** label_prefix_func (GtkWidget * notebook, GGobiData * d, gint * sel_prefix, gint * n_prefices) { gint offset = d->rowIds ? 0 : 1; *n_prefices = G_N_ELEMENTS (label_prefices) - offset; *sel_prefix = 1 - offset; return (label_prefices + offset); } /*----------------------------------------------------------------------*/ /* Making the control panel */ /*----------------------------------------------------------------------*/ static gchar *target_lbl[] = { "Points", "Edges", }; void cpanel_identify_make (ggobid * gg) { modepaneld *panel; GtkWidget *btn, *opt; GtkWidget *notebook; GtkWidget *frame, *framevb; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup (GGOBI (getIModeName) (IDENT)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /*-- option menu --*/ opt = gtk_combo_box_new_text (); gtk_widget_set_name (opt, "IDENTIFY:target_option_menu"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Label points or edges", NULL); gtk_box_pack_start (GTK_BOX (panel->w), opt, false, false, 0); populate_combo_box (opt, target_lbl, G_N_ELEMENTS (target_lbl), G_CALLBACK (identify_target_cb), gg); /*-- provide a variable list so that any variable can be the label --*/ notebook = create_prefixed_variable_notebook (panel->w, GTK_SELECTION_MULTIPLE, all_vartypes, all_datatypes, G_CALLBACK (label_selected_cb), NULL, gg, label_prefix_func); gtk_widget_set_name (notebook, "IDENTIFY:notebook"); // experiment -- dfs gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), false); g_object_set_data (G_OBJECT (panel->w), "notebook", notebook); /*-- button for removing all labels --*/ btn = gtk_button_new_with_mnemonic ("_Remove labels"); gtk_widget_set_name (btn, "IDENTIFY:remove_sticky_labels"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Remove all labels", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (id_remove_labels_cb), gg); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); /* * button for making all labels sticky */ btn = gtk_button_new_with_mnemonic ("Label all"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Make all labels sticky, or persistent (to make the nearest point label sticky, click middle or right in the plot)", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (id_all_sticky_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); /*-- frame around button for resetting center --*/ frame = gtk_frame_new ("Recenter data"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (panel->w), frame, false, false, 3); framevb = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (framevb), 4); gtk_container_add (GTK_CONTAINER (frame), framevb); btn = gtk_button_new_with_mnemonic ("Re_center"); gtk_widget_set_name (btn, "IDENT:recenter_btn"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Make one point sticky, and then click here to recenter the data around that point. (If there are no sticky labels, restore default centering.)", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (recenter_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (framevb), btn, false, false, 0); /*-- --*/ gtk_widget_show_all (panel->w); } /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ void cpanel_identify_init (cpaneld * cpanel, ggobid * gg) { cpanel->id_display_type = ID_RECORD_LABEL; } /* called from cpanel_identify_set and when id_target_type is selected */ static void notebook_current_page_set (displayd * display, GtkWidget * notebook, ggobid * gg) { GtkWidget *swin; GGobiData *d = display->d, *paged, *e = display->e; gint page_num; cpaneld *cpanel = &display->cpanel; if (notebook == NULL) { return; } /* * For each page of the notebook, get its child, the scrolled * window. Get the datad that the scrolled window knows about, * and compare it with display->d */ page_num = 0; swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page_num); while (swin) { paged = (GGobiData *) g_object_get_data (G_OBJECT (swin), "datad"); if (paged == d && cpanel->id_target_type == identify_points) { gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), page_num); break; } else if (e != NULL && paged == e && cpanel->id_target_type == identify_edges) { gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), page_num); break; } page_num += 1; swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page_num); } gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), false); } void cpanel_identify_set (displayd * display, cpaneld * cpanel, ggobid * gg) { GtkWidget *w; GtkWidget *pnl = mode_panel_get_by_name (GGOBI (getIModeName) (IDENT), gg); if (pnl == (GtkWidget *) NULL) return; w = widget_find_by_name (pnl, "IDENTIFY:notebook"); notebook_current_page_set (display, w, gg); w = widget_find_by_name (pnl, "IDENTIFY:target_option_menu"); gtk_combo_box_set_active (GTK_COMBO_BOX (w), (gint) cpanel->id_target_type); } ggobi-2.1.12/src/time_ui.c0000644000175000017500000001220414651527764010753 /* time_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of time series code: Nicholas Lewin-Koh */ #include #include "vars.h" #include "externs.h" /*----------------------------------------------------------------------*/ /* Callbacks */ /*----------------------------------------------------------------------*/ #ifdef TS_EXTENSIONS_IMPLEMENTED /* * Toggles between a single plot with all selected series and individual * plots of all selected series */ static gchar *arrangement_lbl[] = { "Split", "Joint" }; static void arrangement_cb (GtkWidget * w, ggobid * gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); g_printerr ("cbd: %s\n", arrangement_lbl[indx]); if (indx != gg->current_display->cpanel.tsplot_arrangement) tsplot_reset_arrangement (gg->current_display, indx, gg); gg->current_display->cpanel.tsplot_arrangement = indx; } #endif #ifdef TS_EXTENSIONS_IMPLEMENTED /* * "Common" scales all series by * argmax(argmax(var[i]) forall i)-argmin(argmin(var[i] forall i)), * while "Independent" scales each series independently by its min * and max to [0,1]. */ static gchar *varscale_lbl[] = { "Common", "Independent" }; static void varscale_cb (GtkWidget * w, ggobid * gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); g_printerr ("cbd: %s\n", varscale_lbl[indx]); } #endif /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ GtkWidget * cpanel_tsplot_make (ggobid * gg) { #ifdef TS_EXTENSIONS_IMPLEMENTED GtkWidget *vb, *lbl, *opt; #endif GtkWidget *cpanel; cpanel = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (cpanel), 5); #ifdef TS_EXTENSIONS_IMPLEMENTED /* * arrangement of plots, row or column */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (cpanel), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Layout:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), lbl); gtk_container_set_border_width (GTK_CONTAINER (opt), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Arrange the time series as single plot or several plots", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_combo_box (opt, arrangement_lbl, G_N_ELEMENTS (arrangement_lbl), arrangement_cb, gg); #endif /* * Variable scales */ #ifdef TS_EXTENSIONS_IMPLEMENTED vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (cpanel), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Sc_ales:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Scale variables (and variable groups) on a common scale, or independently", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_combo_box (opt, varscale_lbl, G_N_ELEMENTS (varscale_lbl), varscale_cb, gg); #endif gtk_widget_show_all (cpanel); return (cpanel); } /*--------------------------------------------------------------------*/ /* Resetting the main menubar */ /*--------------------------------------------------------------------*/ static const gchar *mode_ui_str = "" " " " " " " " " " " " " " " " " ""; const gchar * tsplot_mode_ui_get (displayd * display) { return (mode_ui_str); } /*--------------------------------------------------------------------*/ /* End of main menubar section */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Control panel updating */ /*--------------------------------------------------------------------*/ /*-- there already exists tsplot_cpanel_init --*/ void cpanel_tsplot_set (displayd * display, cpaneld * cpanel, GtkWidget * panelWidget, ggobid * gg) { } ggobi-2.1.12/src/varpanel_ui.c0000644000175000017500000005521614651527764011637 /* varpanel_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include #include "noop-toggle.h" #include "vars.h" #include "externs.h" /*-------------------------------------------------------------------------*/ /* Listen for display_selected events */ /*-------------------------------------------------------------------------*/ /* Update variable selection panel */ void varpanel_show_page_cb (ggobid * gg, displayd * display, GGobiData * d) { varpanel_show_page (display, gg); } /* Update tooltips */ void varpanel_tooltips_set_cb (ggobid * gg, displayd * display, GGobiData * d) { varpanel_tooltips_set (display, gg); } /*-------------------------------------------------------------------------*/ /* utilities */ /*-------------------------------------------------------------------------*/ static gchar *varpanel_names[] = { "xtoggle", "ytoggle", "ztoggle", "label" }; /*-- return the hbox --*/ GtkWidget * varpanel_container_get_nth (gint jvar, GGobiData * d) { GtkWidget *w; w = (GtkWidget *) g_slist_nth_data (d->vcbox_ui.box, jvar); return w; } GtkWidget * varpanel_widget_get_nth (gint jbutton, gint jvar, GGobiData * d) { GtkWidget *box, *child; box = (GtkWidget *) varpanel_container_get_nth (jvar, d); if (!box) return (NULL); child = (GtkWidget *) g_object_get_data (G_OBJECT (box), varpanel_names[jbutton]); return child; } void varpanel_label_set (gint j, GGobiData * d) { GtkWidget *label = varpanel_widget_get_nth (VARSEL_LABEL, j, d); /*-- the label is actually a button; this is the label --*/ GtkWidget *labelw; if (!label || !GTK_IS_BIN (label)) return; labelw = GTK_BIN (label)->child; if (!labelw) return; /*-- make sure it stays left-aligned --*/ gtk_misc_set_alignment (GTK_MISC (labelw), 0, .5); gtk_label_set_text (GTK_LABEL (labelw), ggobi_data_get_col_name(d, j)); } GtkWidget * varpanel_widget_set_visible (gint jbutton, gint jvar, gboolean show, GGobiData * d) { GtkWidget *box, *child; gboolean visible; box = (GtkWidget *) varpanel_container_get_nth (jvar, d); child = (GtkWidget *) g_object_get_data (G_OBJECT (box), varpanel_names[jbutton]); visible = GTK_WIDGET_VISIBLE (child); if (visible != show) { if (show) gtk_widget_show (child); else gtk_widget_hide (child); } return child; } void varpanel_delete_nth (gint jvar, GGobiData * d) { GtkWidget *box = varpanel_container_get_nth (jvar, d); if (box != NULL) { d->vcbox_ui.box = g_slist_remove (d->vcbox_ui.box, (gpointer) box); gtk_widget_destroy (box); } } /*-------------------------------------------------------------------------*/ /* Variable selection */ /*-------------------------------------------------------------------------*/ void varpanel_toggle_set_active (gint jbutton, gint jvar, gboolean active, GGobiData * d) { gboolean active_prev; GtkWidget *w; if (jvar >= 0 && jvar < d->ncols) { w = varpanel_widget_get_nth (jbutton, jvar, d); if (w && GTK_WIDGET_REALIZED (w)) { active_prev = GTK_TOGGLE_BUTTON (w)->active; if (active != active_prev) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), active); } } } } void varsel (GtkWidget * w, cpaneld * cpanel, splotd * sp, gint jvar, gint toggle, gint mousebtn, gint alt_mod, gint ctrl_mod, gint shift_mod, GGobiData * d, ggobid * gg) { displayd *display = (displayd *) sp->displayptr; gboolean redraw = false; if (display == NULL /*|| !GGOBI_IS_WINDOW_DISPLAY (display) || !GTK_IS_WIDGET (GGOBI_WINDOW_DISPLAY (display)->window)*/) { g_printerr ("Bug? I see no active display\n"); return; } if (GGOBI_IS_EXTENDED_DISPLAY (display)) { redraw = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->variable_select (w, display, sp, jvar, toggle, mousebtn, cpanel, gg); } /* * I'm not sure what we use this for, but it causes a problem for * the composite displays when a plot is deleted. For example, when * a plot is deleted in the parallel coordinates plot, error * messages are generated by this signal_emit, presumably because sp * is NULL for some subroutine called by this guy. If sp has to be * the current splot, that case is suppressed. ml * * Maybe I just figured it out -- in some of the composite displays, * the splot that was current at the start of this routine has been * destroyed, so sp is now null, or pointing at junk. -- dfs */ sp = gg->current_splot; if (sp == gg->current_splot) g_signal_emit (G_OBJECT (gg), GGobiSignals[VARIABLE_SELECTION_SIGNAL], 0, display->d, jvar, sp); /*-- overkill for scatmat: could redraw one row, one column --*/ /*-- overkill for parcoords: need to redraw at most 3 plots --*/ if (redraw) { display_tailpipe (display, FULL, gg); if (imode_get (gg) == BRUSH) { display_tailpipe (display, NONE, gg); brush_once_and_redraw (true, sp, display, gg); /* binning ok */ } } } /*------------------------------------------------------------------------*/ void varpanel_show_page (displayd * display, ggobid * gg) { GtkNotebook *nb; gint page, page_new; GGobiData *d = display->d, *paged = NULL; GList *l, *children; GtkWidget *child, *tab_label; GtkWidget *pagechild; if (gg->varpanel_ui.notebook == NULL) return; nb = GTK_NOTEBOOK (gg->varpanel_ui.notebook); page = gtk_notebook_get_current_page (nb); if (page < 0) return; page_new = 0; children = gtk_container_get_children (GTK_CONTAINER (gg->varpanel_ui.notebook)); for (l = children; l; l = l->next) { child = l->data; tab_label = (GtkWidget *) gtk_notebook_get_tab_label (nb, child); if (tab_label && GTK_IS_LABEL (tab_label)) { if (strcmp (GTK_LABEL (tab_label)->label, d->name) == 0) { if (page != page_new) { // Set the buttons on 'page' to be insensitive pagechild = gtk_notebook_get_nth_page (nb, page); if (pagechild) paged = g_object_get_data (G_OBJECT (pagechild), "datad"); if (paged) varpanel_set_sensitive (paged, false, gg); // Set the current page, and make its buttons sensitive gtk_notebook_set_current_page (nb, page_new); varpanel_set_sensitive (d, true, gg); if (gg->status_message_func) gg->status_message_func ((gchar *) NULL, gg); break; } } } page_new++; } } void varpanel_switch_page_cb (GtkNotebook * notebook, GtkNotebookPage * page, gint page_num, ggobid * gg) { varpanel_reinit (gg); gdk_flush (); /*-- describe the datad being selected in the console statusbar --*/ if (gg->status_message_func) { GGobiData *d = (GGobiData *) g_slist_nth_data (gg->d, page_num); if (d) { gchar *msg = g_strdup_printf ("%s: %d x %d (%s)", d->name, d->nrows, d->ncols, gg->input->fileName); gg->status_message_func (msg, gg); g_free (msg); } } } /*-- here's where we'd reset what's selected according to the current mode --*/ void varpanel_refresh (displayd * display, ggobid * gg) { splotd *sp = gg->current_splot; GGobiData *d; if (display) { d = display->d; if (sp != NULL && d != NULL) { if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->varpanel_refresh (display, sp, d); } } } else { /* * if there's no display, but I can get hold of a datad, * use it to turn off all the buttons. */ if (g_slist_length (gg->d) > 0) { d = datad_get_from_notebook (gg->varpanel_ui.notebook, gg); if (d) { gint j; for (j = 0; j < d->ncols; j++) { /*varpanel_widget_set_visible (VARSEL_X, j, false, d); */ varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } } } } } /*-- responds to a button_press_event --*/ static gint varsel_cb (GtkWidget * w, GdkEvent * event, GGobiData * d) { ggobid *gg = GGobiFromWidget (w, true); displayd *display = gg->current_display; splotd *sp = gg->current_splot; cpaneld *cpanel; if (display == NULL) return 0; cpanel = &display->cpanel; if (d != display->d) return true; if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *bevent = (GdkEventButton *) event; gint mousebutton = -1; gint togglebutton = -1; gboolean alt_mod, shift_mod, ctrl_mod; gint j, jvar; jvar = -1; for (j = 0; j < d->ncols; j++) { if (varpanel_widget_get_nth (VARSEL_X, j, d) == w) { togglebutton = VARSEL_X; jvar = j; break; } else if (varpanel_widget_get_nth (VARSEL_Y, j, d) == w) { togglebutton = VARSEL_Y; jvar = j; break; } else if (varpanel_widget_get_nth (VARSEL_Z, j, d) == w) { togglebutton = VARSEL_Z; jvar = j; break; } else if (varpanel_widget_get_nth (VARSEL_LABEL, j, d) == w) { togglebutton = -1; mousebutton = bevent->button; jvar = j; break; } } /* looking for modifiers; don't know which ones we'll want */ alt_mod = ((bevent->state & GDK_MOD1_MASK) == GDK_MOD1_MASK); shift_mod = ((bevent->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK); ctrl_mod = ((bevent->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK); /* */ /*-- general variable selection --*/ varsel (w, cpanel, sp, jvar, togglebutton, mousebutton, alt_mod, ctrl_mod, shift_mod, d, gg); varpanel_refresh (display, gg); return true; } return false; } /*-------------------------------------------------------------------------*/ /* adding and deleting variables */ /*------------------------------------------------------------------*/ static void varpanel_add_row (gint j, GGobiData * d, ggobid * gg) { GtkWidget *box, *xw, *yw, *zw, *label; gboolean sens = false; GList *displays; for (displays = gg->displays; !sens && displays; displays = g_list_next (displays)) if (GGOBI_DISPLAY (displays->data)->d == d) sens = true; box = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (d->vcbox_ui.vbox), box, false, false, 1); xw = ggobi_noop_toggle_button_new_with_label (" X "); gtk_widget_set_sensitive (xw, sens); gtk_box_pack_start (GTK_BOX (box), xw, false, false, 2); GGobi_widget_set (xw, gg, true); g_object_set_data (G_OBJECT (box), varpanel_names[VARSEL_X], xw); g_signal_connect (G_OBJECT (xw), "button_press_event", G_CALLBACK (varsel_cb), d); gtk_widget_show (xw); yw = ggobi_noop_toggle_button_new_with_label (" Y "); gtk_widget_set_sensitive (yw, sens); gtk_box_pack_start (GTK_BOX (box), yw, false, false, 2); GGobi_widget_set (yw, gg, true); g_object_set_data (G_OBJECT (box), varpanel_names[VARSEL_Y], yw); g_signal_connect (G_OBJECT (yw), "button_press_event", G_CALLBACK (varsel_cb), d); gtk_widget_show (yw); zw = ggobi_noop_toggle_button_new_with_label (" Z "); gtk_widget_set_sensitive (zw, sens); gtk_box_pack_start (GTK_BOX (box), zw, false, false, 2); GGobi_widget_set (zw, gg, true); g_object_set_data (G_OBJECT (box), varpanel_names[VARSEL_Z], zw); g_signal_connect (G_OBJECT (zw), "button_press_event", G_CALLBACK (varsel_cb), d); /*-- hide this widget by default --*/ /*-- the label is actually a button, with the old behavior --*/ label = gtk_button_new_with_label (ggobi_data_get_col_name(d, j)); gtk_widget_set_sensitive (label, sens); gtk_button_set_relief (GTK_BUTTON (label), GTK_RELIEF_NONE); GGobi_widget_set (label, gg, true); g_object_set_data (G_OBJECT (box), varpanel_names[VARSEL_LABEL], label); g_signal_connect (G_OBJECT (label), "button_press_event", G_CALLBACK (varsel_cb), d); gtk_box_pack_start (GTK_BOX (box), label, false, false, 2); gtk_widget_show (label); d->vcbox_ui.box = g_slist_append (d->vcbox_ui.box, box); gtk_widget_show (box); } void varpanel_widgets_add (gint nc, GGobiData * d, ggobid * gg) { gint j; gint nd = g_slist_length (gg->d); gint n = g_slist_length (d->vcbox_ui.box); /*-- create the variable widgets --*/ for (j = n; j < nc; j++) varpanel_add_row (j, d, gg); /* * If there were no variables before, a tab hasn't been added; * add one now. */ if (n == 0) { gtk_notebook_append_page (GTK_NOTEBOOK (gg->varpanel_ui.notebook), d->varpanel_ui.hpane, gtk_label_new (d->name)); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gg->varpanel_ui.notebook), nd > 1); } } /*-------------------------------------------------------------------------*/ /* handle the addition of new variables */ /*-------------------------------------------------------------------------*/ void varpanel_addvar_cb (ggobid * gg, vartabled * vt, gint which, GGobiData * d, void *p) { /*-- variable toggle buttons and circles --*/ varpanel_widgets_add (d->ncols, d, gg); varcircles_add (d->ncols, d, gg); /*-- make sure the right toggle widgets and circles are showing --*/ /* this gives the wrong result when the variable being added is not displayed in the current display. And I don't know what the mode is for the other datad. This suggests that I have to run these two routines whenever the tab changes in the variable selection panel. But even then it may not correspond to the current display. So it really suggests that the variable selection panel has to keep track of its own projection. Add a variable to varpanel_ui in datad.h? -- dfs */ varpanel_refresh (gg->current_display, gg); varcircles_visibility_set (gg->current_display, gg); } /*-------------------------------------------------------------------------*/ /* initialize and populate the var panel */ /*-------------------------------------------------------------------------*/ void varpanel_set_sensitive (GGobiData * d, gboolean sensitive_p, ggobid * gg) { GtkWidget *vbox = d->vcbox_ui.vbox, *hb; GList *vblist, *hblist; /* The vbox has one child per row, an hbox. */ vblist = gtk_container_get_children (GTK_CONTAINER (vbox)); while (vblist) { hb = (GtkWidget *) vblist->data; hblist = gtk_container_get_children (GTK_CONTAINER (hb)); while (hblist) { gtk_widget_set_sensitive ((GtkWidget *) hblist->data, sensitive_p); hblist = hblist->next; } vblist = vblist->next; } } /* Respond to display_new events */ void varpanel_set_sensitive_cb (ggobid * gg, displayd * display) { varpanel_set_sensitive (display->d, true, gg); } /*-------------------------------------------------------------------------*/ /* * build the notebook to contain a paned widget which will contain * checkboxes on the left and circles/rectangles on the right */ void varpanel_make (GtkWidget * parent, ggobid * gg) { gg->varpanel_ui.layoutByRow = true; /*-- for the circles --*/ gg->selvarfg_GC = NULL; gg->varpanel_ui.notebook = gtk_notebook_new (); gtk_notebook_set_show_border (GTK_NOTEBOOK (gg->varpanel_ui.notebook), FALSE); gtk_notebook_set_scrollable (GTK_NOTEBOOK (gg->varpanel_ui.notebook), TRUE); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (gg->varpanel_ui.notebook), GTK_POS_TOP); g_signal_connect (G_OBJECT (gg->varpanel_ui.notebook), "switch-page", G_CALLBACK (varpanel_switch_page_cb), gg); gtk_box_pack_start (GTK_BOX (parent), gg->varpanel_ui.notebook, true, true, 2); /*-- prepare to respond to variable_added events --*/ g_signal_connect (G_OBJECT (gg), "variable_added", G_CALLBACK (varpanel_addvar_cb), NULL); gtk_widget_show (gg->varpanel_ui.notebook); } void varpanel_clear (GGobiData * d, ggobid * gg) { GList *pages; gint npages; gint k; if (gg->varpanel_ui.notebook != NULL && GTK_WIDGET_REALIZED (gg->varpanel_ui.notebook)) { pages = gtk_container_get_children (GTK_CONTAINER (gg->varpanel_ui.notebook)); npages = g_list_length (pages); for (k = 0; k < npages; k++) gtk_notebook_remove_page (GTK_NOTEBOOK (gg->varpanel_ui.notebook), 0); } } /*-- for each datad: hpane, ebox, scrolled window, vbox; in varpanel_add_row, an hbox, togglebuttons and label --*/ void varpanel_populate (GGobiData * d, ggobid * gg) { gint j, nd; GList *children; GtkWidget *foo; nd = ndatad_with_vars_get (gg); /*-- we don't know the length of gg->d when the notebook is created --*/ gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gg->varpanel_ui.notebook), nd > 1); /*-- create a paned widget --*/ d->varpanel_ui.hpane = gtk_hpaned_new (); /* not possible to set gutter size in GTK2 */ //gtk_paned_set_gutter_size (GTK_PANED(d->varpanel_ui.hpane), 0); /*-- set the handle position all the way to the right --*/ gtk_paned_set_position (GTK_PANED (d->varpanel_ui.hpane), -1); g_object_set_data (G_OBJECT (d->varpanel_ui.hpane), "datad", d); /*setdata */ /*-- only add a tab if there are variables --*/ if (g_slist_length (d->vartable) > 0 || d->ncols > 0) { gtk_notebook_append_page (GTK_NOTEBOOK (gg->varpanel_ui.notebook), d->varpanel_ui.hpane, gtk_label_new (d->name)); } /* Check if we have been here before and already created the box, etc.. */ if (d->vcbox_ui.ebox && GTK_IS_WIDGET (d->vcbox_ui.ebox)) return; /*-- create an ebox, and put it in the hpane --*/ d->vcbox_ui.ebox = gtk_event_box_new (); gtk_paned_pack1 (GTK_PANED (d->varpanel_ui.hpane), d->vcbox_ui.ebox, true, true); /*-- create a scrolled window, and put it in the ebox --*/ d->vcbox_ui.swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (d->vcbox_ui.swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (d->vcbox_ui.ebox), d->vcbox_ui.swin); /*-- add a vbox to the swin --*/ d->vcbox_ui.vbox = gtk_vbox_new (false, 1); gtk_container_set_border_width (GTK_CONTAINER (d->vcbox_ui.vbox), 2); g_signal_connect (G_OBJECT (gg), "display_new", G_CALLBACK (varpanel_set_sensitive_cb), NULL); /* Connecting to display_selected event */ g_signal_connect (G_OBJECT (gg), "display_selected", G_CALLBACK (varpanel_show_page_cb), d); g_signal_connect (G_OBJECT (gg), "display_selected", G_CALLBACK (varpanel_tooltips_set_cb), d); /* */ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (d->vcbox_ui.swin), d->vcbox_ui.vbox); /* Set shadow type for viewport */ children = gtk_container_get_children (GTK_CONTAINER (d->vcbox_ui.swin)); foo = g_list_nth_data (children, 0); if (GTK_IS_VIEWPORT (foo)) gtk_viewport_set_shadow_type (GTK_VIEWPORT (foo), GTK_SHADOW_NONE); gtk_widget_show_all (d->varpanel_ui.hpane); gdk_flush (); d->vcbox_ui.box = NULL; for (j = 0; j < d->ncols; j++) varpanel_add_row (j, d, gg); } /*-------------------------------------------------------------------------*/ /* API; not used */ /*-------------------------------------------------------------------------*/ void GGOBI (selectScatterplotX) (GtkWidget * w, gint jvar, ggobid * gg) { displayd *display = gg->current_display; GGobiExtendedDisplayClass *klass; if (!GGOBI_IS_EXTENDED_DISPLAY (display)) return; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->select_X) klass->select_X (w, display, jvar, gg); } /*-------------------------------------------------------------------------*/ /* context-sensitive tooltips */ /*-------------------------------------------------------------------------*/ void varpanel_tooltips_set (displayd * display, ggobid * gg) { gint j; GGobiData *d; GtkWidget *wx, *wy, *wz, *label; if (display == NULL) { d = datad_get_from_notebook (gg->varpanel_ui.notebook, gg); if (d) { for (j = 0; j < d->ncols; j++) { if ((wx = varpanel_widget_get_nth (VARSEL_X, j, d)) == NULL) break; label = varpanel_widget_get_nth (VARSEL_LABEL, j, d); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Unable to plot without a display", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Unable to plot without a display", NULL); } } } else { d = display->d; /*-- for each variable, current datad only --*/ for (j = 0; j < d->ncols; j++) { if ((wx = varpanel_widget_get_nth (VARSEL_X, j, d)) == NULL) break; wy = varpanel_widget_get_nth (VARSEL_Y, j, d); wz = varpanel_widget_get_nth (VARSEL_Z, j, d); label = varpanel_widget_get_nth (VARSEL_LABEL, j, d); if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->varpanel_tooltips_set) klass->varpanel_tooltips_set (display, gg, wx, wy, wz, label); } } } } ggobi-2.1.12/src/p1d.c0000644000175000017500000001655414651527764010020 /* p1d.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * The 1d plots use the values of world_data (or missing_world_data) * for the variable of interest, but they use tform (or missing) * to do the spreading calculations, which are done in floating point. * * At the very end, to deal with jittering, they remove the jitter * from the selected variable and add it to the spread direction. */ #include #include "vars.h" #include "externs.h" /* * min and max for 'forget it' dotplot's texturing axis; * they're defined so as to locate the plot in the center of * the window, with the texturing values returned on a range * of [0,100]. * * The min and max are calculated on the fly for the ash. */ #define FORGETITAXIS_MIN -100. #define FORGETITAXIS_MAX 200. RedrawStyle p1d_activate (gint state, displayd * display, ggobid * gg) { GList *slist; splotd *sp; GGobiData *d = display->d; if (state) { for (slist = display->splots; slist; slist = slist->next) { sp = (splotd *) slist->data; if (sp->p1dvar >= d->ncols) sp->p1dvar = 0; } varpanel_refresh (display, gg); } else { /* * Turn cycling off when leaving the mode, but don't worry * for now about turning it on when re-entering. */ GtkWidget *pnl; pnl = mode_panel_get_by_name (GGOBI (getPModeName) (P1PLOT), gg); if (pnl) { GtkWidget *w = widget_find_by_name (pnl, "P1PLOT:cycle_toggle"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), off); } } return NONE; } void p1d_spread_var (displayd * display, gfloat * yy, splotd * sp, GGobiData * d, ggobid * gg) { /* * Set up the next dot plot. */ gint i; gfloat del = 1.; gint option = 1, stages = 3; gfloat min, max, mean; cpaneld *cpanel = &display->cpanel; if (sp->p1d.spread_data.nels != d->nrows) vectorf_realloc (&sp->p1d.spread_data, d->nrows); switch (cpanel->p1d.type) { case TEXTURE: sp->p1d.lim.min = FORGETITAXIS_MIN; sp->p1d.lim.max = FORGETITAXIS_MAX; textur (yy, sp->p1d.spread_data.els, d->nrows_in_plot, option, del, stages, gg); break; case ASH: do_ash1d (yy, d->nrows_in_plot, cpanel->p1d.nbins, cpanel->p1d.nASHes, sp->p1d.spread_data.els, &min, &max, &mean); /* * Instead of using the returned minimum, set the minimum to 0. * This scales the plot so that the baseline (also set to 0) is * within the range, the connecting lines look terrific, and the * plot makes more sense. */ sp->p1d.lim.min = 0.0; sp->p1d.lim.max = max; sp->p1d.mean = mean; break; case DOTPLOT: sp->p1d.lim.min = FORGETITAXIS_MIN; sp->p1d.lim.max = FORGETITAXIS_MAX; for (i = 0; i < d->nrows_in_plot; i++) sp->p1d.spread_data.els[i] = 50; /*-- halfway between _MIN and _MAX --*/ break; } } void p1d_reproject (splotd * sp, greal ** world_data, GGobiData * d, ggobid * gg) { /* * Project the y variable down from the ncols-dimensional world_data[] * to the 2-dimensional array planar[]; get the x variable directly * from p1d.spread_data[]. */ gint i, m, jvar = 0; gfloat rdiff, ftmp; gfloat precis = PRECISION1; displayd *display = (displayd *) sp->displayptr; gfloat *yy; if (sp == NULL) return; yy = (gfloat *) g_malloc (d->nrows_in_plot * sizeof (gfloat)); jvar = sp->p1dvar; /* * in order to have jittering in the direction of the variable * instead of in the direction of the "spreading variable", we * have to apply the ASH (in particular) after the jitter has * been added in. That is, we have to ASH the world data instead * of the tform data. By some unexpected miracle, all the scaling * still works. */ for (i = 0; i < d->nrows_in_plot; i++) yy[i] = d->world.vals[d->rows_in_plot.els[i]][jvar]; /*yy[i] = d->tform.vals[d->rows_in_plot.els[i]][jvar]; */ p1d_spread_var (display, yy, sp, d, gg); /* Then project it */ rdiff = sp->p1d.lim.max - sp->p1d.lim.min; for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; /* * Use p1d.spread_data[i] not [m] because p1d.spread_data[] is * populated only up to d->nrows_in_plot */ ftmp = -1.0 + 2.0 * (sp->p1d.spread_data.els[i] - sp->p1d.lim.min) / rdiff; if (display->p1d_orientation == VERTICAL) { sp->planar[m].x = (glong) (precis * ftmp); sp->planar[m].y = (glong) world_data[m][jvar]; } else { sp->planar[m].x = (glong) world_data[m][jvar]; sp->planar[m].y = (glong) (precis * ftmp); } } g_free ((gpointer) yy); } gboolean p1d_varsel (splotd * sp, gint jvar, gint * jprev, gint toggle, gint mouse) { gboolean redraw = true; displayd *display = (displayd *) sp->displayptr; gint orientation = display->p1d_orientation; gboolean allow = true; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { allow = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->allow_reorientation; } /*-- if button == -1, don't change orientation. That protects changes made during cycling --*/ if (allow && mouse > 0) display->p1d_orientation = (mouse == 1) ? HORIZONTAL : VERTICAL; redraw = (orientation != display->p1d_orientation) || (jvar != sp->p1dvar); *jprev = sp->p1dvar; sp->p1dvar = jvar; if (orientation != display->p1d_orientation) scatterplot_show_rulers (display, P1PLOT); return redraw; } /*---------------------------------------------------------------------*/ void ash_baseline_set (icoords * baseline, splotd * sp) { greal ftmp, precis = (greal) PRECISION1; greal pl, gtmp; gint iscr; /* ftmp = -1 + 2.0 * (0 - sp->p1d.lim.min)/ (sp->p1d.lim.max - sp->p1d.lim.min); */ ftmp = -1 /* and the rest of the usual expression is 0 now */ ; pl = (greal) (precis * ftmp); /*-- HORIZONTAL --*/ gtmp = pl - sp->pmid.y; iscr = (gint) (gtmp * sp->iscale.y / precis); iscr += (sp->max.y / 2); baseline->y = iscr; /*-- VERTICAL --*/ gtmp = pl - sp->pmid.x; iscr = (gint) (gtmp * sp->iscale.x / precis); iscr += (sp->max.x / 2); baseline->x = iscr; } /*--------------------------------------------------------------------*/ /* Cycling */ /*--------------------------------------------------------------------*/ gint p1dcycle_func (ggobid * gg) { displayd *display = gg->current_display; GGobiData *d = gg->current_display->d; splotd *sp = gg->current_splot; cpaneld *cpanel = &display->cpanel; gint varno, jvar_prev; if (cpanel->p1d.cycle_dir == 1) { varno = sp->p1dvar + 1; if (varno == d->ncols) { varno = 0; } } else { varno = sp->p1dvar - 1; if (varno < 0) { varno = d->ncols - 1; } } if (varno != sp->p1dvar) { jvar_prev = sp->p1dvar; if (p1d_varsel (sp, varno, &jvar_prev, -1, -1)) { varpanel_refresh (display, gg); display_tailpipe (display, FULL, gg); } } return true; } ggobi-2.1.12/src/read_csv.h0000644000175000017500000000020114651527764011105 #ifndef READ_CSV_H #define READ_CSV_H gboolean isCSVFile (const gchar * fileName, ggobid * gg, GGobiPluginInfo * plugin); #endif ggobi-2.1.12/src/barchartClass.c0000644000175000017500000004750414651527764012107 /* barchartClass.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of barchart and histogram code: Heike Hofmann */ #include "ggobi.h" #include "barchartDisplay.h" #include #include "externs.h" #include /* Making these available to ggobiClass.c */ static gboolean barchartVarSel (GtkWidget * w, displayd * display, splotd * sp, gint jvar, gint toggle, gint mouse, cpaneld * cpanel, ggobid * gg); static gint barchartVarIsPlotted (displayd * dpy, gint * cols, gint ncols, GGobiData * d); static gboolean barchartCPanelSet (displayd * dpy, cpaneld * cpanel, ggobid * gg); static void barchartDisplaySet (displayd * dpy, ggobid * gg); static void barchartDestroy (GtkObject *); static void barchartPlaneToScreen (splotd * sp, GGobiData * d, ggobid * gg); void barchart_clean_init (barchartSPlotd * sp); void barchart_recalc_counts (barchartSPlotd * sp, GGobiData * d, ggobid * gg); static gboolean barchart_build_symbol_vectors (cpaneld *, GGobiData *, ggobid *); static void barchartVarpanelRefresh (displayd * display, splotd * sp, GGobiData * d); static gboolean barchartHandlesInteraction (displayd * dpy, gint action); static void barchartVarpanelTooltipsSet (displayd * dpy, ggobid * gg, GtkWidget * wx, GtkWidget * wy, GtkWidget * wz, GtkWidget * label); static gint barchartPlottedColsGet (displayd * display, gint * cols, GGobiData * d, ggobid * gg); static GtkWidget *barchartCPanelWidget (displayd * dpy, gchar ** modeName, ggobid * gg); static gboolean barchartEventHandlersToggle (displayd * dpy, splotd * sp, gboolean state, ProjectionMode, InteractionMode); static gboolean barchartKeyEventHandled (GtkWidget *, displayd *, splotd *, GdkEventKey *, ggobid *); void barchartRulerRangesSet (gboolean, displayd *, splotd *, ggobid *); static void setShowAxesOption (displayd * display, gboolean active) { g_printerr("(setShowAxesOption) active %d\n", active); switch (display->cpanel.pmode) { case EXTENDED_DISPLAY_PMODE: scatterplot_show_vrule (display, active); break; default: break; } } static gboolean varpanelHighd (displayd * display) { gint proj = display->cpanel.pmode; return (proj == TOUR1D || proj == TOUR2D3 || proj == TOUR2D || proj == COTOUR); } static gint barchart_is_variable_plotted (displayd * display, gint * cols, gint ncols, GGobiData * d) { gint j; ggobid *gg = display->d->gg; splotd *sp = gg->current_splot; gint jplotted = -1; for (j = 0; j < ncols; j++) { if (sp->p1dvar == cols[j]) { jplotted = sp->p1dvar; return jplotted; } } return (-1); } /* barchart splot methods*/ static gchar * barchart_tree_label (splotd * sp, GGobiData * d, ggobid * gg) { return(ggobi_data_get_col_name(d, sp->p1dvar)); } gboolean barchartVarSel (GtkWidget * w, displayd * display, splotd * sp, gint jvar, gint toggle, gint mouse, cpaneld * cpanel, ggobid * gg) { gint jvar_prev = -1; gboolean redraw = false; GGobiData *d = display->d; switch (cpanel->pmode) { case TOUR1D: redraw = tour1d_varsel (w, jvar, toggle, mouse, d, gg); default: redraw = p1d_varsel(sp, jvar, &jvar_prev, toggle, mouse); break; } if (redraw) { barchart_clean_init (GGOBI_BARCHART_SPLOT (sp)); barchart_recalc_counts (GGOBI_BARCHART_SPLOT (sp), d, d->gg); } return (true); } gint barchartVarIsPlotted (displayd * dpy, gint * cols, gint ncols, GGobiData * d) { int j; splotd *sp = (splotd *) dpy->splots->data; for (j = 0; j < ncols; j++) { if (sp->p1dvar == cols[j]) { return (sp->p1dvar); } } return (-1); } gboolean barchartCPanelSet (displayd * dpy, cpaneld * cpanel, ggobid * gg) { GtkWidget *w; w = GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget; if (!w) { GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget = w = cpanel_barchart_make (gg); } cpanel_barchart_set (dpy, cpanel, w, gg); cpanel_brush_set (dpy, cpanel, gg); cpanel_identify_set (dpy, cpanel, gg); return (true); } void barchartDisplaySet (displayd * dpy, ggobid * gg) { } /* This is for the barchart SPlot Class */ static void barchartDestroy (GtkObject * obj) { if (obj && GGOBI_BARCHART_SPLOT (obj)->bar) { GtkObjectClass *klass; barchartSPlotd *sp; sp = GGOBI_BARCHART_SPLOT (obj); /* Goal here is to get the class object for the parent of the GGOBI_TYPE_EXTENDED_SPLOT class so that we can call its destroy method. Need to get the class of the barchart and then constrain it to the extended splot class. */ klass = g_type_class_peek_parent (GGOBI_EXTENDED_SPLOT_GET_CLASS (sp)); barchart_free_structure (sp); vectori_free (&sp->bar->index_to_rank); g_free ((gpointer) sp->bar); sp->bar = NULL; klass->destroy (GTK_OBJECT (sp)); } } void barchartPlaneToScreen (splotd * sp, GGobiData * d, ggobid * gg) { barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); barchart_recalc_dimensions (sp, d, gg); barchart_recalc_group_dimensions (bsp, gg); } void barchartWorldToPlane (splotd * sp, GGobiData * d, ggobid * gg) { barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); /* Commenting these two lines out to fix this bug: After dragging to reset the number of bars, leaving the barplot interaction mode sets the number of bars. Question: Will this introduce new bugs???? dfs, June 2008 barchart_clean_init(bsp); barchart_recalc_counts(bsp, d, gg); */ } /*----------------------------------------------------------------------*/ /* local helper function for barcharts, */ /* called by build_symbol_vectors */ /*----------------------------------------------------------------------*/ gboolean barchart_build_symbol_vectors (cpaneld * cpanel, GGobiData * d, ggobid * gg) { gboolean changed = FALSE; gint j, m; gint nd = g_slist_length (gg->d); for (j = 0; j < d->nrows_in_plot; j++) { m = d->rows_in_plot.els[j]; switch (cpanel->br.point_targets) { case br_candg: /*-- color and glyph --*/ changed = update_color_vectors (m, changed, d->pts_under_brush.els, d, gg); changed = update_glyph_vectors (m, changed, d->pts_under_brush.els, d, gg); break; case br_color: changed = update_color_vectors (m, changed, d->pts_under_brush.els, d, gg); break; case br_glyph: /*-- glyph type and size --*/ changed = update_glyph_vectors (m, changed, d->pts_under_brush.els, d, gg); break; case br_shadow: changed = update_hidden_vectors (m, changed, d->pts_under_brush.els, d, gg); break; case br_unshadow: changed = bizarro_update_hidden_vectors (m, changed, d->pts_under_brush.els, d, gg); break; case br_off: ; break; } /*-- link by id --*/ if (!gg->linkby_cv && nd > 1) symbol_link_by_id (false, j, d, gg); /*-- --*/ } return changed; } void barchartVarpanelRefresh (displayd * display, splotd * sp, GGobiData * d) { cpaneld *cpanel = &display->cpanel; gint j; switch (cpanel->pmode) { case TOUR1D: for (j=0; jncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } for (j=0; jt1d.nsubset; j++) { varpanel_toggle_set_active (VARSEL_X, display->t1d.subset_vars.els[j], true, d); } break; default: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active(VARSEL_X, j, (j == sp->p1dvar), d); varpanel_toggle_set_active(VARSEL_Y, j, false, d); varpanel_widget_set_visible(VARSEL_Y, j, false, d); varpanel_toggle_set_active(VARSEL_Z, j, false, d); varpanel_widget_set_visible(VARSEL_Z, j, false, d); } break; } } gboolean barchartHandlesInteraction (displayd * dpy, gint action) { InteractionMode imode = (InteractionMode) action; return ( /*imode == SCALE || */ imode == BRUSH || imode == IDENT || imode == DEFAULT_IMODE); } /*--------------------------------------------------------------------*/ /* Barchart: Options menu */ /*--------------------------------------------------------------------*/ void barchartVarpanelTooltipsSet (displayd * dpy, ggobid * gg, GtkWidget * wx, GtkWidget * wy, GtkWidget * wz, GtkWidget * label) { gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Click to replace a variable", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click to replace a variable", NULL); } gint barchartPlottedColsGet (displayd * display, gint * cols, GGobiData * d, ggobid * gg) { gint ncols = 0; cols[ncols++] = gg->current_splot->p1dvar; return (ncols); } GtkWidget * barchartCPanelWidget (displayd * dpy, gchar ** modeName, ggobid * gg) { GtkWidget *w = GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget; if (!w) { GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget = w = cpanel_barchart_make (gg); } *modeName = "Bar Chart"; return (w); } gboolean barchartEventHandlersToggle (displayd * dpy, splotd * sp, gboolean state, ProjectionMode pmode, InteractionMode imode) { if (imode == IDENT) { identify_event_handlers_toggle (sp, state); // Generic method } else if (imode == BRUSH) { brush_event_handlers_toggle (sp, state); // Generic method } else if (imode == DEFAULT_IMODE) { barchart_event_handlers_toggle (dpy, sp, state, pmode, imode); } return (false); } static gboolean barchartKeyEventHandled (GtkWidget * w, displayd * display, splotd * sp, GdkEventKey * event, ggobid * gg) { gboolean ok = true; ProjectionMode pmode = NULL_PMODE; InteractionMode imode = DEFAULT_IMODE; if (event->state == 0 || event->state == GDK_CONTROL_MASK) { switch (event->keyval) { case GDK_h: case GDK_H: pmode = EXTENDED_DISPLAY_PMODE; break; case GDK_t: case GDK_T: pmode = TOUR1D; break; case GDK_b: case GDK_B: imode = BRUSH; break; case GDK_i: case GDK_I: imode = IDENT; break; default: ok = false; break; } if (ok) { GGOBI (full_viewmode_set) (pmode, imode, gg); } } else { ok = false; } return ok; } /* This is an abbreviated version of the scatterplot version */ void barchartScreenToTform (cpaneld * cpanel, splotd * sp, icoords * scr, fcoords * tfd, ggobid * gg) { gcoords planar, world; greal precis = (greal) PRECISION1; greal ftmp, max, min, rdiff; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gfloat scale_x, scale_y; vartabled *vt; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; /* * screen to plane */ planar.x = (scr->x - sp->max.x / 2) * precis / sp->iscale.x; planar.x += sp->pmid.x; planar.y = (scr->y - sp->max.y / 2) * precis / sp->iscale.y; planar.y += sp->pmid.y; /* * plane to world */ switch (cpanel->pmode) { case TOUR1D: break; /* Sheesh, I haven't even decided what I want the pmode to be */ case EXTENDED_DISPLAY_PMODE: case DEFAULT_PMODE: vt = vartable_element_get (sp->p1dvar, d); max = vt->lim.max; min = vt->lim.min; rdiff = max - min; if (display->p1d_orientation == HORIZONTAL) { /* x */ world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; } else { /* y */ world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } break; default: break; } } void barchartDisplayClassInit (GGobiBarChartDisplayClass * klass) { klass->parent_class.treeLabel = klass->parent_class.titleLabel = "Barchart"; klass->parent_class.create = barchart_new; klass->parent_class.createWithVars = barchart_new_with_vars; klass->parent_class.variable_select = barchartVarSel; klass->parent_class.variable_plotted_p = barchartVarIsPlotted; klass->parent_class.cpanel_set = barchartCPanelSet; klass->parent_class.display_unset = NULL; klass->parent_class.display_set = barchartDisplaySet; klass->parent_class.mode_ui_get = barchart_mode_ui_get; klass->parent_class.variable_plotted_p = barchart_is_variable_plotted; klass->parent_class.build_symbol_vectors = barchart_build_symbol_vectors; /* Because of the kludgey implementation of the barchart class, I can't make this quit trying to set ruler ranges. Instead, I'm going to create a function that's simply a noop. dfs June 2008 */ // klass->parent_class.ruler_ranges_set = ruler_ranges_set; klass->parent_class.ruler_ranges_set = barchartRulerRangesSet; klass->parent_class.varpanel_highd = varpanelHighd; klass->parent_class.varpanel_refresh = barchartVarpanelRefresh; klass->parent_class.handles_interaction = barchartHandlesInteraction; klass->parent_class.xml_describe = NULL; klass->parent_class.varpanel_tooltips_set = barchartVarpanelTooltipsSet; klass->parent_class.plotted_vars_get = barchartPlottedColsGet; klass->parent_class.imode_control_box = barchartCPanelWidget; klass->parent_class.allow_reorientation = false; klass->parent_class.binning_ok = false; klass->parent_class.event_handlers_toggle = barchartEventHandlersToggle; klass->parent_class.splot_key_event_handled = barchartKeyEventHandled; klass->parent_class.set_show_axes_option = setShowAxesOption; } void barchart_identify_cues_draw (gboolean nearest_p, gint k, splotd * rawsp, GdkDrawable * drawable, ggobid * gg) { barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (rawsp); PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (rawsp->da), NULL); gint i, nbins; gchar *string; icoords mousepos = rawsp->mousepos; colorschemed *scheme = gg->activeColorScheme; gint level; gint j; nbins = sp->bar->nbins; gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); if (sp->bar->low_pts_missing && sp->bar->bar_hit[0]) { string = g_strdup_printf ("%ld point%s < %.2f", sp->bar->low_bin->count, sp->bar->low_bin->count == 1 ? "" : "s", sp->bar->breaks[0] + sp->bar->offset); gdk_draw_rectangle (drawable, gg->plot_GC, FALSE, sp->bar->low_bin->rect.x, sp->bar->low_bin->rect.y, sp->bar->low_bin->rect.width, sp->bar->low_bin->rect.height); layout_text (layout, string, NULL); gdk_draw_layout (drawable, gg->plot_GC, mousepos.x, mousepos.y, layout); g_free (string); } for (i = 1; i < nbins + 1; i++) { if (sp->bar->bar_hit[i]) { if (sp->bar->is_histogram) { string = g_strdup_printf ("%ld point%s in (%.2f,%.2f)", sp->bar->bins[i - 1].count, sp->bar->bins[i - 1].count == 1 ? "" : "s", sp->bar->breaks[i - 1] + sp->bar->offset, sp->bar->breaks[i] + sp->bar->offset); } else { gchar *levelName; vartabled *var; var = (vartabled *) g_slist_nth_data (rawsp->displayptr->d->vartable, rawsp->p1dvar); /* dfs */ j = i - 1; level = checkLevelValue (var, (gdouble) sp->bar->bins[j].value); if (level == -1) { string = g_strdup_printf ("%ld point%s missing", sp->bar->bins[j].count, sp->bar->bins[j].count == 1 ? "" : "s"); } else { levelName = var->level_names[level]; string = g_strdup_printf ("%ld point%s in %s", sp->bar->bins[j].count, sp->bar->bins[j].count == 1 ? "" : "s", levelName); } /* --- */ #ifdef PREV levelName = var->level_names[i - 1]; sprintf (string, "%ld point%s in %s", sp->bar->bins[i - 1].count, sp->bar->bins[i - 1].count == 1 ? "" : "s", levelName); #endif } gdk_draw_rectangle (drawable, gg->plot_GC, FALSE, sp->bar->bins[i - 1].rect.x, sp->bar->bins[i - 1].rect.y, sp->bar->bins[i - 1].rect.width, sp->bar->bins[i - 1].rect.height); layout_text (layout, string, NULL); gdk_draw_layout (drawable, gg->plot_GC, mousepos.x, mousepos.y, layout); g_free (string); } } if (sp->bar->high_pts_missing && sp->bar->bar_hit[nbins + 1]) { string = g_strdup_printf ("%ld point%s > %.2f", sp->bar->high_bin->count, sp->bar->high_bin->count == 1 ? "" : "s", sp->bar->breaks[nbins] + sp->bar->offset); gdk_draw_rectangle (drawable, gg->plot_GC, FALSE, sp->bar->high_bin->rect.x, sp->bar->high_bin->rect.y, sp->bar->high_bin->rect.width, sp->bar->high_bin->rect.height); layout_text (layout, string, NULL); gdk_draw_layout (drawable, gg->plot_GC, mousepos.x, mousepos.y, layout); g_free (string); } g_object_unref (G_OBJECT (layout)); } void barchartSPlotClassInit (GGobiBarChartSPlotClass * klass) { /* barcharts need more attention than redrawing the brush */ klass->extendedSPlotClass.splot.redraw = FULL; klass->extendedSPlotClass.tree_label = barchart_tree_label; klass->extendedSPlotClass.identify_notify = barchart_identify_bars; klass->extendedSPlotClass.add_markup_cues = barchart_add_bar_cues; #if BARCHART_SCALE klass->extendedSPlotClass.add_scaling_cues = barchart_scaling_visual_cues_draw; #endif klass->extendedSPlotClass.add_identify_cues = barchart_identify_cues_draw; klass->extendedSPlotClass.add_plot_labels = barchart_splot_add_plot_labels; klass->extendedSPlotClass.redraw = barchart_redraw; klass->extendedSPlotClass.screen_to_tform = barchartScreenToTform; klass->extendedSPlotClass.world_to_plane = barchartWorldToPlane; klass->extendedSPlotClass.plane_to_screen = barchartPlaneToScreen; klass->extendedSPlotClass.active_paint_points = barchart_active_paint_points; GTK_OBJECT_CLASS (klass)->destroy = barchartDestroy; klass->extendedSPlotClass.plotted_vars_get = splot1DVariablesGet; } ggobi-2.1.12/src/vars.h0000644000175000017500000000036414651527764010304 /*-- vars.h --*/ #ifndef GGOBI_VARS_H #define GGOBI_VARS_H #ifdef GGOBIINTERN #define GGOBI_ #else #define GGOBI_ extern #endif #include "defines.h" #include "types.h" #include "ggobi-data.h" #include "ggobi.h" #include "display.h" #endif ggobi-2.1.12/src/scatmat.c0000644000175000017500000002644714651527764010772 /* scatmat.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifdef USE_STRINGS_H #include #endif #include #include #include "vars.h" #include "externs.h" #include "scatmatClass.h" #include "scatterplotClass.h" #define WIDTH 200 #define HEIGHT 200 #define MAXNVARS 4 /* only used to set up the initial matrix */ static const gchar *scatmat_ui = "" " " " " " " " " " " ""; displayd * scatmat_new (displayd * display, gboolean use_window, gboolean missing_p, gint numRows, gint * rows, gint numCols, gint * cols, GGobiData * d, ggobid * gg) { GtkWidget *vbox, *frame; gint i, j, ctr; gint width, height; gint scr_width, scr_height; gint scatmat_nvars; splotd *sp; windowDisplayd *wdpy = NULL; if (!display) display = g_object_new (GGOBI_TYPE_SCATMAT_DISPLAY, NULL); GGOBI_WINDOW_DISPLAY(display)->useWindow = use_window; display_set_values (display, d, gg); if (GGOBI_IS_WINDOW_DISPLAY (display)) wdpy = GGOBI_WINDOW_DISPLAY (display); /* If the caller didn't specify the rows and columns, use the default which is the number of variables in the dataset or the maximum number of columns within a scatterplot matrix. ! Need to check rows and cols are allocated. ! */ if (numRows == 0 || numCols == 0) { scatmat_nvars = MIN (d->ncols, sessionOptions->info->numScatMatrixVars); if (scatmat_nvars < 0) { scatmat_nvars = d->ncols; } /* Initialize display with the plotted variables in the current display, if appropriate */ if (gg->current_display != NULL && gg->current_display != display && gg->current_display->d == d && GGOBI_IS_EXTENDED_DISPLAY (gg->current_display)) { gint k, nplotted_vars; gint *plotted_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); displayd *dsp = gg->current_display; nplotted_vars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dsp)->plotted_vars_get (dsp, plotted_vars, d, gg); scatmat_nvars = MAX (scatmat_nvars, nplotted_vars); for (j = 0; j < nplotted_vars; j++) rows[j] = cols[j] = plotted_vars[j]; j = nplotted_vars; for (k = 0; k < d->ncols; k++) { if (!in_vector (k, plotted_vars, nplotted_vars)) { rows[j] = cols[j] = k; j++; if (j == scatmat_nvars) break; } } g_free (plotted_vars); } else { for (j = 0; j < scatmat_nvars; j++) rows[j] = cols[j] = j; } } else { scatmat_nvars = numRows; } display->p1d_orientation = HORIZONTAL; scatmat_cpanel_init (&display->cpanel, gg); /* * make the matrix take up no more than some fraction * the screen by default, and make the plots square. */ scr_width = gdk_screen_width () / 2; scr_height = gdk_screen_height () / 2; width = (WIDTH * scatmat_nvars > scr_width) ? (scr_width / scatmat_nvars) : WIDTH; height = (HEIGHT * scatmat_nvars > scr_height) ? (scr_height / scatmat_nvars) : HEIGHT; width = height = MIN (width, height); /* */ if (wdpy && wdpy->useWindow) display_window_init (GGOBI_WINDOW_DISPLAY (display), width * scatmat_nvars, height * scatmat_nvars, 5, gg); /* * Add the main menu bar */ vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); display->menu_manager = display_menu_manager_create (display); if (wdpy && wdpy->useWindow) { gtk_container_add (GTK_CONTAINER (wdpy->window), vbox); display->menubar = create_menu_bar (display->menu_manager, scatmat_ui, wdpy->window); /* * After creating the menubar, and populating the file menu, * add the Options and Link menus another way */ gtk_box_pack_start (GTK_BOX (vbox), display->menubar, false, true, 0); } /* * splots in a table */ frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 3); gtk_box_pack_start (GTK_BOX (vbox), frame, true, true, 1); gtk_widget_show (frame); display->table = gtk_table_new (scatmat_nvars, scatmat_nvars, false); gtk_container_add (GTK_CONTAINER (frame), display->table); display->splots = NULL; ctr = 0; for (i = 0; i < scatmat_nvars; i++) { for (j = 0; j < scatmat_nvars; j++, ctr++) { /* Can we use SCATTER_SPLOT or do we need SCATMAT_SPLOT. */ sp = g_object_new (GGOBI_TYPE_SCATMAT_SPLOT, NULL); splot_init (sp, display, gg); sp->xyvars.x = rows[i]; sp->xyvars.y = cols[j]; sp->p1dvar = (rows[i] == cols[j]) ? cols[j] : -1; display->splots = g_list_append (display->splots, (gpointer) sp); gtk_table_attach (GTK_TABLE (display->table), sp->da, i, i + 1, j, j + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); gtk_widget_show (sp->da); } } gtk_widget_show (display->table); /*-- position the display toward the lower left of the main window --*/ if (wdpy && wdpy->useWindow) { display_set_position (wdpy, gg); gtk_widget_show_all (wdpy->window); } else { gtk_container_add (GTK_CONTAINER (display), vbox); } return display; } /* * Find out whether a variable is selected */ static gint scatmat_var_selected (gint jvar, displayd * display) { gint pos = -1; GList *l; GtkTableChild *child; GtkWidget *da; splotd *sp; for (l = (GTK_TABLE (display->table))->children; l; l = l->next) { child = (GtkTableChild *) l->data; da = child->widget; sp = (splotd *) g_object_get_data (G_OBJECT (da), "splotd"); if (sp->p1dvar == jvar) { pos = child->left_attach; break; } } return pos; } static splotd * scatmat_add_plot (gint xvar, gint yvar, gint col, gint row, displayd * display, ggobid * gg) { splotd *sp_new; sp_new = g_object_new (GGOBI_TYPE_SCATMAT_SPLOT, NULL); splot_init (sp_new, display, gg); sp_new->xyvars.x = xvar; sp_new->xyvars.y = yvar; sp_new->p1dvar = (sp_new->xyvars.x == sp_new->xyvars.y) ? xvar : -1; gtk_table_attach (GTK_TABLE (display->table), sp_new->da, col, col + 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); gtk_widget_show (sp_new->da); /* We don't care where, I think */ display->splots = g_list_append (display->splots, (gpointer) sp_new); return sp_new; } gboolean scatmat_varsel_simple (cpaneld * cpanel, splotd * sp, gint jvar, gint * jvar_prev, ggobid * gg) { gboolean redraw = true; gboolean Delete = false; gint k; GList *l; splotd *s, *sp_new; GtkWidget *da; GtkTableChild *child; displayd *display = gg->current_display; gint jpos, *vars, nvars; GGobiData *d = display->d; /* Simple: if jvar is among the plotted variables, delete it; otherwise, append it */ if ((jpos = scatmat_var_selected (jvar, display)) >= 0) { l = (GTK_TABLE (display->table))->children; while (l) { Delete = false; child = (GtkTableChild *) l->data; l = l->next; da = child->widget; if (child->left_attach == jpos) Delete = true; else if (child->left_attach > jpos) { child->left_attach--; child->right_attach--; } if (child->top_attach == jpos) { Delete = true; } else if (child->top_attach > jpos) { child->top_attach--; child->bottom_attach--; } if (Delete) { s = (splotd *) g_object_get_data (G_OBJECT (da), "splotd"); display->splots = g_list_remove (display->splots, (gpointer) s); /* * add a reference to da here, because it's going to be * destroyed in splot_free, and we don't want it destroyed * as a result of gtk_container_remove. */ gtk_widget_ref (da); gtk_container_remove (GTK_CONTAINER (display->table), da); if (s == gg->current_splot) sp_event_handlers_toggle (s, off, cpanel->pmode, cpanel->imode); splot_free (s, display, gg); } } vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nvars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->plotted_vars_get (display, vars, d, gg); gtk_table_resize (GTK_TABLE (display->table), nvars, nvars); /* Make the first plot the current plot */ gg->current_splot = (splotd *) g_list_nth_data (display->splots, 0); display->current_splot = gg->current_splot; /* Turn any event handlers back on */ sp_event_handlers_toggle (gg->current_splot, on, cpanel->pmode, cpanel->imode); redraw = false; /*-- individual plots don't need a redraw --*/ g_free (vars); } // End of deleting a variable. else { /* Append a variable. Don't change current_splot. */ vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nvars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->plotted_vars_get (display, vars, d, gg); /* * Now create the new plots and fill in the new row/column. * Work out the correct p1dvar/xyvars values for each new plot. */ for (k = 0; k < nvars; k++) { sp_new = scatmat_add_plot (jvar, vars[k], nvars, k, display, gg); if (k != nvars) { /*-- except at the intersection, do it twice --*/ sp_new = scatmat_add_plot (vars[k], jvar, k, nvars, display, gg); } } sp_new = scatmat_add_plot (jvar, jvar, nvars, nvars, display, gg); /* I don't think it's possible to initialize brushing until the data has run through the pipeline. Since I can't cleanly add a plot in brushing mode, I think it's best to switch back to the default mode. -- dfs */ GGOBI (full_viewmode_set) (EXTENDED_DISPLAY_PMODE, DEFAULT_IMODE, gg); /* Set up the new splot for drag and drop */ sp_event_handlers_toggle (sp_new, on, cpanel->pmode, cpanel->imode); gtk_table_resize (GTK_TABLE (display->table), nvars, nvars); redraw = true; g_free (vars); } return redraw; } #undef WIDTH #undef HEIGHT #undef MAXNVARS ggobi-2.1.12/src/GGStructSizes.c0000644000175000017500000000336014651527764012043 /* GGStructSizes.c */ #ifndef GGStructSizes_C #define GGStructSizes_C typedef struct { unsigned int size; const char *const name; } GGobi_StructSize; #ifdef USE_DBMS #include "dbms.h" #endif #define GG_StructEntry(type) {sizeof(type), #type} static const GGobi_StructSize ggobiStructs[] = { GG_StructEntry (ggobid), GG_StructEntry (GGobiData), GG_StructEntry (displayd), GG_StructEntry (splotd), GG_StructEntry (vartabled), GG_StructEntry (GGobiOptions) #ifdef USE_DBMS , GG_StructEntry (DBMSLoginInfo) #endif }; extern const GGobi_StructSize *GGOBI (getStructs) (int *n); const GGobi_StructSize * #ifdef GGOBI_MAIN GGOBI (getStructs) (int *n) #else GGOBI (getGGobiStructs) (int *n) #endif { *n = sizeof (ggobiStructs) / sizeof (ggobiStructs[0]); return (ggobiStructs); } #ifndef GGOBI_MAIN #include gboolean checkGGobiStructSizes () { const GGobi_StructSize *local, *internal; int nlocal, ninternal; int i, j; gboolean ok = false; local = GGOBI (getStructs) (&nlocal); internal = GGOBI (getGGobiStructs) (&ninternal); if (nlocal != ninternal) g_printerr ("Different number of structures in table (%d != %d)!\n", nlocal, ninternal); for (i = 0; i < nlocal; i++) { for (j = 0; j < ninternal; j++) if (strcmp (local[i].name, internal[j].name) == 0) { if (local[i].size != internal[j].size) { g_printerr ("Inconsistent struct sizes for %s: %d != %d\n", local[i].name, local[i].size, internal[j].size); } ok = true; break; } if (j == ninternal) { g_printerr ("No entry for `%s' struct in the internals\n", local[i].name); ok = false; } } return (ok); } #endif #endif ggobi-2.1.12/src/tour1d_ui.c0000644000175000017500000006140014651527764011235 /* tour1d_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" #include "tour.h" /* This function initializes the tour variables - it should only be called more than once, when a new tour is started since a new subset of variable might be used, or when there is new data. */ void cpanel_t1d_init (cpaneld *cpanel, ggobid *gg) { cpanel->t1d.paused = false; cpanel->t1d.step = TOURSTEP0; cpanel->t1d.nASHes = 20; cpanel->t1d.nbins = 200; cpanel->t1d.vert = false; cpanel->t1d.pp_indx = 0; cpanel->t1d.ASH_add_lines_p = false; cpanel->t1d.slidepos = sessionOptions->defaultTour1dSpeed; cpanel->t1d.ASH_smooth = 0.19; } static void ASH_add_lines_cb (GtkToggleButton *button, ggobid *gg) { cpaneld *cpanel = &gg->current_display->cpanel; cpanel->t1d.ASH_add_lines_p = button->active; splot_redraw (gg->current_splot, FULL, gg); } /*-- scatterplot only; need a different routine for parcoords --*/ void cpanel_tour1d_set (displayd *display, cpaneld *cpanel, ggobid* gg) /* * To handle the case where there are multiple scatterplots * which may have different tour options and parameters selected */ { GtkWidget *w, *btn; GtkWidget *pnl = mode_panel_get_by_name(GGOBI(getPModeName)(TOUR1D), gg); GtkAdjustment *adj; /*-- speed --*/ w = widget_find_by_name (pnl, "TOUR1D:speed_bar"); adj = gtk_range_get_adjustment (GTK_RANGE (w)); gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), cpanel->t1d.slidepos); /*-- paused --*/ btn = widget_find_by_name (pnl, "TOUR1D:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), cpanel->t1d.paused); /*-- ASH smoothness parameter --*/ w = widget_find_by_name (pnl, "TOUR1D:ASH_add_lines"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), cpanel->t1d.ASH_add_lines_p); /* ASH smoothness */ w = widget_find_by_name (pnl, "TOUR1D:ASH_smooth"); adj = gtk_range_get_adjustment (GTK_RANGE (w)); gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), cpanel->t1d.ASH_smooth); /*-- manual manip --*/ /*-- PC axes --*/ /*-- backtracking --*/ /*-- local scan --*/ /*-- path len... --*/ } static void speed1d_set_cb (GtkAdjustment *adj, ggobid *gg) { tour1d_speed_set(adj->value, gg); } static void tour1d_pause_cb (GtkToggleButton *button, ggobid *gg) { displayd *dsp = gg->current_display; tour1d_pause (&dsp->cpanel, button->active, dsp, gg); } static void reinit_cb (GtkWidget *w, ggobid *gg) { tour1d_reinit(gg); } static void scramble_cb (GtkWidget *w, ggobid *gg) { tour1d_scramble(gg); } static void t1d_snap_cb (GtkWidget *w, ggobid *gg) { tour1d_snap(gg); } static void t1d_video_cb (GtkToggleButton *button, ggobid *gg) { tour1d_video(gg); } static void t1d_ash_sm_cb (GtkAdjustment *adj, ggobid *gg) { cpaneld *cpanel = &gg->current_display->cpanel; splotd *sp = gg->current_splot; /*-- adj->value ranges from .01 to .5; min value for nASHes = 1 --*/ cpanel->t1d.nASHes = (gint) ((gfloat) cpanel->t1d.nbins * (adj->value / 2.0)); cpanel->t1d.ASH_smooth = adj->value; display_tailpipe (gg->current_display, FULL, gg); /* Reinits the vertical height for the ashes */ if(sp) sp->tour1d.initmax = true; } /* static void tour1d_vert_cb (GtkToggleButton *button, ggobid *gg) { tour1d_vert (&gg->current_display->cpanel, button->active); } */ static void tour1dpp_cb (GtkWidget *w, ggobid *gg) { tour1dpp_window_open (gg); } #ifdef TOUR_ADV_IMPLEMENTED static void tour1dadv_cb (GtkWidget *w, ggobid *gg) { tour1dadv_window_open (gg); } #endif void cpanel_tour1d_make (ggobid *gg) { modepaneld *panel; GtkWidget *frame, *framevb, *box, *btn, *sbar, *vb, *lbl; GtkObject *adj; panel = (modepaneld *) g_malloc(sizeof(modepaneld)); gg->control_panels = g_list_append(gg->control_panels, (gpointer) panel); panel->name = g_strdup(GGOBI(getPModeName)(TOUR1D)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /* * speed scrollbar */ /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ adj = gtk_adjustment_new (sessionOptions->defaultTour1dSpeed, 0.0, MAX_TOUR_SPEED, 1.0, 1.0, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (speed1d_set_cb), (gpointer) gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_widget_set_name (sbar, "TOUR1D:speed_bar"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust speed of tour motion", NULL); scale_set_default_values (GTK_SCALE (sbar)); gtk_box_pack_start (GTK_BOX (panel->w), sbar, false, false, 1); /* * Box to hold 'pause' toggle and 'reinit' button */ box = gtk_hbox_new (true, 1); btn = gtk_check_button_new_with_mnemonic ("_Pause"); gtk_widget_set_name (btn, "TOUR1D:pause_button"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Stop tour motion temporarily (keyboard shortcut: w)", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (tour1d_pause_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * Box to hold 'Reinit' toggle and 'Scramble' button */ box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic("_Reinit"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (reinit_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_button_new_with_mnemonic ("Scr_amble"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection to random value", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (scramble_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * snapshot and video stream controls */ /*box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic ("_Snap"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Take a snapshot of this frame to re-generate plot outside ggobi", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (t1d_snap_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_check_button_new_with_mnemonic ("Vid_eo"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Save sequence of projection frames out to file", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (t1d_video_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); */ /*-- frame around ASH parameters --*/ frame = gtk_frame_new ("ASH parameters"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (panel->w), frame, false, false, 3); framevb = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (framevb), 4); gtk_container_add (GTK_CONTAINER (frame), framevb); /*-- ASH line segments --*/ btn = gtk_check_button_new_with_mnemonic ("ASH: add _lines"); gtk_widget_set_name (btn, "TOUR1D:ASH_add_lines"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "When displaying ASHes, add lines connecting each point to the baseline.", NULL); /*-- cpanel may not be available, so initialize this to false --*/ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), false); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (ASH_add_lines_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (framevb), btn, false, false, 0); /*-- ASH smoothness --*/ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (framevb), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("ASH s_moothness:"); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); /*-- value, lower, upper, step --*/ adj = gtk_adjustment_new (0.19, 0.02, 0.5, 0.01, .01, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (t1d_ash_sm_cb), gg); /* sbar = gtk_hscale_new (GTK_ADJUSTMENT (gg->ash.smoothness_adj));*/ sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_widget_set_name (sbar, "TOUR1D:ASH_smooth"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust ASH smoothness", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 1); /* * Box to hold 'vertical' button */ #ifdef TOUR_ADV_IMPLEMENTED box = gtk_hbox_new (true, 1); btn = gtk_check_button_new_with_mnemonic ("V_ertical"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Change orientation of plot", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (tour1d_vert_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); #endif /* * projection pursuit button */ btn = gtk_button_new_with_mnemonic ("Pro_jection pursuit ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for tour projection pursuit", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tour1dpp_cb), gg); /* * advanced features button */ #ifdef TOUR_ADV_IMPLEMENTED btn = gtk_button_new_with_mnemonic ("Advanced _features ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for additional grand tour features", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tour1dadv_cb), gg); #endif gtk_widget_show_all (panel->w); } /*----------------------------------------------------------------------*/ /* Advanced features panel and callbacks */ /*----------------------------------------------------------------------*/ /* The following are considered advanced features for now: local tour step/go tour interpolation methods (geodesic, HH, Givens) path length history section tour */ #ifdef TOUR_ADV_IMPLEMENTED static gchar *pathlen_lbl[] = {"1/10", "1/5", "1/4", "1/3", "1/2", "1", "2", "10", "Infinite"}; static void pathlen_cb (GtkWidget *w, ggobid *gg) { gint indx = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); g_printerr ("cbd: %s\n", pathlen_lbl[indx]); } #endif #ifdef TOUR_ADV_IMPLEMENTED static gchar *interp_lbl[] = {"Geodesic", "Householder", "Givens"}; static void interp_cb (GtkWidget *w, ggobid *gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX(w)); g_printerr ("cbd: %s\n", interp_lbl[indx]); } #endif #ifdef TOUR_ADV_IMPLEMENTED static void localscan_cb (GtkToggleButton *button) { g_printerr ("local scan: %d\n", button->active); } #endif #ifdef TOUR_ADV_IMPLEMENTED static void step_cb (GtkToggleButton *tgl, GtkWidget *btn) { g_printerr ("step: %d\n", tgl->active); gtk_widget_set_sensitive (btn, tgl->active); } static void go_cb (GtkButton *button, ggobid *gg) { displayd *dsp = gg->current_display; tour1d_do_step (dsp, gg); } #endif #ifdef TOUR_ADV_IMPLEMENTED static void storebases_cb (GtkToggleButton *button) { g_printerr ("store bases: %d\n", button->active); } #endif #ifdef TOUR_ADV_IMPLEMENTED /* * Section callbacks */ static void section_cb (GtkToggleButton *button) { g_printerr ("local scan: %d\n", button->active); } static void epsilon_cb (GtkAdjustment *adj, gpointer cbd) { g_printerr ("epsilon %f\n", adj->value); } static void hide_cb (GtkWidget *w ) { gtk_widget_hide (w); } #endif #ifdef TOUR_ADV_IMPLEMENTED static GtkWidget *window = NULL; /* Note to self - this should be removed */ static void tour1dadv_window_open (ggobid *gg) { GtkWidget *vbox, *box, *btn, *opt, *tgl, *entry; GtkWidget *pathlen_opt, *vb, *hb, *lbl, *sbar, *notebook; GtkObject *adj; if (window == NULL) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Advanced Tour"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Create a new notebook, place the position of the tabs */ notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); gtk_container_add (GTK_CONTAINER (window), notebook); /*-- vbox to be placed in the notebook page --*/ vbox = gtk_vbox_new (false, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); /*-- local scan toggle --*/ tgl = gtk_check_button_new_with_label ("Local scan"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Perform the tour within a small local region", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (localscan_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (vbox), tgl, false, false, 1); /*-- Box to hold 'step' toggle and 'go' button --*/ box = gtk_hbox_new (true, 2); tgl = gtk_check_button_new_with_mnemonic ("_Step"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Prepare to run the grand tour one step at a time", NULL); gtk_box_pack_start (GTK_BOX (box), tgl, true, true, 1); btn = gtk_button_new_with_mnemonic ("_Go"); gtk_widget_set_sensitive (btn, false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Take one step of the grand tour", NULL); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (go_cb), (gpointer) gg); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (step_cb), GTK_WIDGET (btn)); gtk_box_pack_start (GTK_BOX (vbox), box, false, false, 1); lbl = gtk_label_new_with_mnemonic ("G_eneral"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, lbl); /*-- path length option menu inside frame --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Path _length:"); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); pathlen_opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), pathlen_opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), pathlen_opt, "Set the path length", NULL); gtk_box_pack_end (GTK_BOX (hb), pathlen_opt, false, false, 0); populate_combo_box (pathlen_opt, pathlen_lbl, G_N_ELEMENTS(pathlen_lbl), G_CALLBACK(pathlen_cb), gg); /*-- interpolation option menu inside hbox --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Interpolation: "); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Set the interpolation method", NULL); gtk_box_pack_end (GTK_BOX (hb), opt, false, false, 0); populate_combo_box (opt, interp_lbl, G_N_ELEMENTS(interp_lbl), G_CALLBACK(interp_cb), gg); /*-- tour history functions: vbox to be placed in the notebook page --*/ vb = gtk_vbox_new (true, 0); gtk_container_set_border_width (GTK_CONTAINER (vb), 4); lbl = gtk_label_new_with_mnemonic ("_History"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vb, lbl); /*-- Store bases toggle --*/ tgl = gtk_check_button_new_with_mnemonic ("_Store bases"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Store basis vectors", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (storebases_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (vb), tgl, false, false, 0); /*-- Number of bases stored; a label and a text entry --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Number of bases stored:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- Number of bases stored; a label and a text entry --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Current base pair: "); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_start (GTK_BOX (hb), entry, false, false, 0); entry = gtk_entry_new (); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- Return to basis x --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); tgl = gtk_check_button_new_with_mnemonic ("_Return to basis"); gtk_box_pack_start (GTK_BOX (hb), tgl, false, false, 0); entry = gtk_entry_new (); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- Display basis as bitmap --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); tgl = gtk_check_button_new_with_mnemonic ("_Display basis"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Display basis as bitmap", NULL); gtk_box_pack_start (GTK_BOX (hb), tgl, false, false, 0); entry = gtk_entry_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "Enter bitmap number", NULL); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- section tour widgets: vbox to be placed in the notebook page --*/ box = gtk_vbox_new (false, 0); gtk_container_set_border_width (GTK_CONTAINER (box), 4); lbl = gtk_label_new_with_mnemonic ("_Section"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), box, lbl); tgl = gtk_check_button_new_with_mnemonic ("S_ection"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Downlight points that are not within epsilon of the center plane", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (section_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (box), tgl, false, false, 1); /*-- vbox for label and rangewidget --*/ vb = gtk_vbox_new (true, 0); gtk_box_pack_start (GTK_BOX (box), vb, false, false, 1); lbl = gtk_label_new_with_mnemonic ("_Epsilon:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); adj = gtk_adjustment_new (1.0, 0.0, 1.0, 0.01, .01, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (epsilon_cb), NULL); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Set the width of the cross-section", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); /*-- Close button --*/ btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect_swapped (G_OBJECT (btn), "clicked", G_CALLBACK(G_CALLBACK) (hide_cb), (GtkObject*) window); gtk_box_pack_start (GTK_BOX (vbox), btn, false, true, 2); } gtk_widget_show_all (window); } #endif /*----------------------------------------------------------------------*/ /* I/O events */ /*----------------------------------------------------------------------*/ /*-- called from the Options menu --*/ void tour1d_io_cb (GtkWidget *w, gpointer *cbd) { /* gchar *lbl = (gchar *) cbd; g_printerr ("cbd: %s\n", lbl); */ } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget *w, GdkEventKey *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ if (event->keyval == GDK_w || event->keyval == GDK_W) { /*-- turn pause on and off --*/ GtkWidget *pnl = mode_panel_get_by_name(GGOBI(getPModeName)(TOUR1D), gg); GtkWidget *pause_button = NULL; pause_button = widget_find_by_name (pnl, "TOUR1D:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_button), !cpanel->t1d.paused); return true; } return false; } static gint motion_notify_cb (GtkWidget *w, GdkEventMotion *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); gboolean button1_p, button2_p; mousepos_get_motion (w, event, &button1_p, &button2_p, sp); /*-- if neither button is pressed, we shouldn't have gotten the event --*/ if (!button1_p && !button2_p) return false; tour1d_manip(sp->mousepos.x, sp->mousepos.y, sp, gg); return true; } static gint button_press_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { gboolean button1_p, button2_p; mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK(motion_notify_cb), (gpointer) sp); tour1d_manip_init(sp->mousepos.x, sp->mousepos.y, sp); return true; } static gint button_release_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { gboolean retval = true; GdkModifierType state; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); tour1d_manip_end(sp); gdk_pointer_ungrab (event->time); return retval; } void tour1d_event_handlers_toggle (splotd *sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), "key_press_event", G_CALLBACK(key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK(button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK(button_release_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); } } ggobi-2.1.12/src/ggobi-API.c0000644000175000017500000011525314651527764011026 /*-- ggobi-API.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include "GGobiAPI.h" #include "ggobi.h" #include "ggobi-data.h" #include "types.h" #include "vars.h" #include "externs.h" #include "display.h" #include "plugin.h" extern const gchar *const GlyphNames[]; void warning (const char *msg); #ifdef __cplusplus extern "C" { #endif void GGOBI (displays_release) (ggobid * gg); void GGOBI (display_release) (displayd * display, ggobid * gg); void GGOBI (splot_release) (splotd * sp, displayd * display, ggobid * gg); void GGOBI (data_release) (GGobiData *, ggobid * gg); void GGOBI (vartable_free) (GGobiData *, ggobid * gg); void GGOBI (vardatum_free) (vartabled * var, ggobid * gg); #ifdef __cplusplus } #endif const gchar *GGOBI (getFileName) (ggobid * gg) { return (gg->input->fileName); } const gchar *GGOBI (setFileName) (const gchar * fileName, DataMode data_mode, ggobid * gg) { const gchar *old = g_strdup (GGOBI (getFileName) (gg)); fileset_read_init (fileName, NULL, NULL, gg); display_menu_build (gg); return (old); } DataMode GGOBI (getDataMode) (ggobid * gg) { return (gg->input->mode); } DataMode GGOBI (setDataMode) (DataMode newMode, ggobid * gg) { DataMode old = gg->input->mode; sessionOptions->data_mode = newMode; gg->input->mode = newMode; return (old); } /** Caller should now free the return value, but not the elements of the array. This is computed dynamically by querying each of the input plugins for its collection of mode names. */ const gchar **GGOBI (getDataModeNames) (int *n) { int ctr = 0, num, k, i; GList *plugins; const gchar **ans; GGobiPluginInfo *plugin; plugins = sessionOptions->info->inputPlugins; num = g_list_length (plugins); for (i = 0; i < num; i++) { plugin = g_list_nth_data (plugins, i); ctr += plugin->info.i->numModeNames; } ans = (const gchar **) g_malloc (sizeof (gchar *) * ctr); ctr = 0; for (i = 0; i < num; i++) { plugin = g_list_nth_data (plugins, i); for (k = 0; k < plugin->info.i->numModeNames; k++) { ans[ctr++] = plugin->info.i->modeNames[k]; } } if (n) *n = ctr; return (ans); } gchar **GGOBI (getVariableNames) (gint transformed, GGobiData * d, ggobid * gg) { gchar **names; gint nc = d->ncols, j; names = (gchar **) g_malloc (sizeof (gchar *) * nc); for (j = 0; j < nc; j++) { names[j] = transformed ? ggobi_data_get_transformed_col_name(d, j) : ggobi_data_get_col_name(d, j); } return (names); } void GGOBI (setVariableName) (gint j, gchar * name, gboolean transformed, GGobiData * d, ggobid * gg) { if (transformed) ggobi_data_set_transformed_col_name(d, j, name); else ggobi_data_set_col_name(d, j, name); } /* Closes the specified display */ void GGOBI (destroyCurrentDisplay) (ggobid * gg) { display_free (gg->current_display, false, gg); } MissingValue_p GGobiMissingValue; MissingValue_p GGobi_setMissingValueIdentifier (MissingValue_p f) { MissingValue_p old = GGobiMissingValue; GGobiMissingValue = f; return (old); } static const gchar *const DefaultRowNames = NULL; const gchar *const * getDefaultRowNamesPtr () { return ((const gchar * const *) &DefaultRowNames); } void setRowNames (GGobiData * d, gchar ** rownames) { int i; gchar *lbl; for (i = 0; i < d->nrows; i++) { lbl = (rownames != (gchar **) & DefaultRowNames && rownames != (gchar **) NULL && rownames[i] != (gchar *) NULL) ? g_strdup (rownames[i]) : g_strdup_printf ("%d", i + 1); g_array_append_val (d->rowlab, lbl); } } /* An initial attempt to allow new data to be introduced to the Ggobi session, replacing the existing contents. There are still a few details remaining regarding the scaling on the axes, etc. (See ruler_ranges_set in scatterplot.c) The reverse pipeline data has not been established correctly and the computation is incorrect. Specifically, the routine splot_screen_to_tform() is not When this works, we will take the calls for the different stages and put them in separate routines. */ /*-- need two of these now, one to replace and one to append --*/ void GGOBI (setData) (gdouble * values, gchar ** rownames, gchar ** colnames, gint nr, gint nc, GGobiData * d, gboolean cleanup, ggobid * gg, gchar ** ids, gboolean duplicate, InputDescription * desc) { gint i, j; gchar *lbl; gchar *varname; if (cleanup) { /* Release all the displays associated with this datad and then release all the GUI components and memory for this datad. This may need some reworking in order to release exactly the right things, no more and no less. */ GGOBI (displays_release) (gg); varpanel_clear (d, gg); GGOBI (data_release) (d, gg); /* ?? */ gtk_ui_manager_remove_ui (gg->main_menu_manager, gg->mode_merge_id); /*submenu_destroy (gg->pmode_item); submenu_destroy (gg->imode_item); */ } d->input = desc; if (d->name == NULL) d->name = g_strdup (desc->fileName); if (gg->input == NULL) gg->input = desc; d->ncols = nc; d->nrows = nr; vectori_init_null (&d->rows_in_plot); d->nrows_in_plot = d->nrows; /*-- for now --*/ arrayf_alloc (&d->raw, nr, nc); if (ids) { datad_record_ids_set (d, ids, duplicate); } rowlabels_alloc (d); vartable_alloc (d); vartable_init (d); br_glyph_ids_alloc (d); br_glyph_ids_init (d); br_color_ids_alloc (d); br_color_ids_init (d); br_hidden_alloc (d); br_hidden_init (d); if (values && d->vartable) { /* the person who created the datad is taking care of populating it. */ for (j = 0; j < nc; j++) { varname = (colnames != NULL && colnames[j] != NULL) ? colnames[j] : NULL; ggobi_data_set_col_name(d, j, varname); for (i = 0; i < nr; i++) { if (j == 0) { lbl = (rownames != NULL && rownames[i] != NULL) ? g_strdup (rownames[i]) : g_strdup_printf ("%d", i + 1); g_array_append_val (d->rowlab, lbl); /* g_free (lbl); */ } if (values) ggobi_data_set_raw_value(d, i, j, values[i + j * nr]); } } } if (rownames && d->rowlab->len == 0) setRowNames (d, rownames); /* Now recompute and display the top plot. */ if (nc > 0 && datad_init (d, gg, cleanup) != NULL) { /* Have to patch up the displays list since we removed every entry and that makes for meaningless entries. IS THIS TRUE? Only if cleanup was specified! This looks very dangerous. Should use g_list_remove(); */ gg->displays->next = NULL; } display_menu_build (gg); } /* These are all for freeing the currently held data. */ void GGOBI (displays_release) (ggobid * gg) { GList *dlist; displayd *display; /* We have to be careful here as we are removing all the elements of the singly-linked list. When we remove the last one, the ->next value of the dlist becomes non-NULL. Hence we are getting garbage. Accordingly, we count down from the total number to remove using num and when this is 0, we exit. This should leave the slist allocated, but empty. We have to patch the list up afterwards. */ gint num = g_list_length (gg->displays); for (dlist = gg->displays; dlist != NULL; dlist = dlist->next, num--) { if (num == 0) break; display = (displayd *) dlist->data; /* display_release(display, gg); */ display_free (display, true, gg); } } void GGOBI (display_release) (displayd * display, ggobid * gg) { display_free (display, true, gg); } void GGOBI (splot_release) (splotd * sp, displayd * display, ggobid * gg) { splot_free (sp, display, gg); } /* Not in the API for the moment. A "protected" routine. */ void GGOBI (data_release) (GGobiData * d, ggobid * gg) { void vartable_free (GGobiData * d); if (d == NULL) return; if (d->rowlab) { rowlabels_free (d); d->rowlab = NULL; } vartable_free (d); } /**XX*/ const gchar *const *GGOBI (getViewTypes) (int *n) { *n = NDISPLAYTYPES; return (ViewTypes); } const gint *GGOBI (getViewTypeIndices) (gint * n) { extern const gint ViewTypeIndices[]; *n = NDISPLAYTYPES; return (ViewTypeIndices); } displayd *GGOBI (newScatterplot) (gint ix, gint iy, gboolean use_window, GGobiData * d, ggobid * gg) { displayd *display = NULL; gint vars[2]; vars[0] = ix; vars[1] = iy; display = scatterplot_new_with_vars (use_window, false, 2, vars, d, gg); #ifdef FORCE_ADD_DISPLAY display_add (display, gg); #endif return (display); } displayd *GGOBI (newScatmat) (gint * rows, gint * columns, gint nr, gint nc, gboolean use_window, GGobiData * d, ggobid * gg) { displayd *display; display = scatmat_new (NULL, use_window, false, nr, rows, nc, columns, d, gg); #ifdef FORCE_ADD_DISPLAY display_add (display, gg); /*XX the caller should add this display. */ #endif return (display); } displayd *GGOBI (newParCoords) (gint * vars, gint numVars, gboolean use_window, GGobiData * d, ggobid * gg) { displayd *display = NULL; display = parcoords_new (display, use_window, false, numVars, vars, d, gg); #ifdef FORCE_ADD_DISPLAY display_add (display, gg); /*XX the caller should add this display. */ #endif return (display); } displayd *GGOBI (newTimeSeries) (gint * yvars, gint numVars, gboolean use_window, GGobiData * d, ggobid * gg) { displayd *display = NULL; display = tsplot_new (display, use_window, false, numVars, yvars, d, gg); #ifdef FORCE_ADD_DISPLAY display_add (display, gg); /*XX the caller should add this display. */ #endif return (display); } displayd *GGOBI (createPlot) (int type, char **varnames) { displayd *display = NULL; /* display_new(type); */ return (display); } const gchar *GGOBI (getCurrentDisplayType) (ggobid * gg) { /*XX */ return (GGOBI (getViewTypeName) (gg->current_display)); } const gchar *GGOBI (getViewTypeName) (displayd * dpy) { gchar *val; if (!GGOBI_IS_EXTENDED_DISPLAY (dpy)) return (NULL); /* or use gtk_type_name(GTK_OBJECT_TYPE(dpy)) */ val = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dpy)->treeLabel; return (val); } /* Pointer to the raw data managed by GGobi. Don't touch this. */ const gfloat **GGOBI (getRawData) (GGobiData * d, ggobid * gg) { return ((const gfloat **) d->raw.vals); } /* Pointer to the second transformation of the data managed by GGobi. Don't touch this. */ const gfloat **GGOBI (getTFormData) (GGobiData * d, ggobid * gg) { return ((const gfloat **) d->tform.vals); } /* Returns a reference to the labels used to identify the observations. Do not change this as it is not a copy. */ const gchar **GGOBI (getCaseNames) (GGobiData * d, ggobid * gg) { gchar **rowlab = (gchar **) g_malloc (sizeof (gchar *) * d->nrows); gint i; for (i = 0; i < d->nrows; i++) rowlab[i] = (gchar *) g_array_index (d->rowlab, gchar *, i); return ((const gchar **) rowlab); } /* This does not copy the label, so it is assumed that the caller has already allocated the space using the appropriate GTK memory model. If it is apparent that this is being called from contexts that use a very different memory model (e.g. S/R), we can change the behaviour to copy this. Similarly, this can be modified to return the previous value, but the caller will have to free that pointer. */ void GGOBI (setCaseName) (gint index, const gchar * label, GGobiData * d, ggobid * gg) { gchar *old; if (index < 0 || index >= d->nrows) { warning ("Index is out of range of observations in setCaseName"); return; } old = g_array_index (d->rowlab, gchar *, index); g_free (old); g_array_insert_val (d->rowlab, index, label); } void warning (const gchar * msg) { fprintf (stderr, "%s\n", msg); fflush (stderr); } /*-------------------------------------------------------------------------*/ /* setting and getting point glyph types and sizes */ /*-------------------------------------------------------------------------*/ gint *GGOBI (getGlyphTypes) (int *n) { static gint *glyphIds = NULL; *n = UNKNOWN_GLYPH - 1; /* -1 since we start at 1 */ if (glyphIds == NULL) { gint i; glyphIds = (gint *) g_malloc (*n * sizeof (gint)); for (i = 0; i < *n; i++) { glyphIds[i] = mapGlyphName (GlyphNames[i]); } } return (glyphIds); } const gchar *const *GGOBI (getGlyphTypeNames) (gint * n) { *n = UNKNOWN_GLYPH - 1; /* -1 since we start at 1; starting at 0 now */ return ((const gchar * const *) GlyphNames); } gchar const *GGOBI (getGlyphTypeName) (gint type) { gchar const *ans; ans = GlyphNames[type]; return (ans); } gint *GGOBI (getCaseGlyphTypes) (gint * ids, gint n, GGobiData * d, ggobid * gg) { gint i; gint *ans = (gint *) g_malloc (n * sizeof (gint)); for (i = 0; i < n; i++) ans[i] = GGOBI (getCaseGlyphType) (ids[i], d, gg); return (ids); } gint GGOBI (getCaseGlyphType) (gint id, GGobiData * d, ggobid * gg) { gint index = d->rows_in_plot.els[id]; return (d->glyph_now.els[index].type); } gint *GGOBI (getCaseGlyphSizes) (gint * ids, gint n, GGobiData * d, ggobid * gg) { gint i; gint *ans = (gint *) g_malloc (n * sizeof (gint)); for (i = 0; i < n; i++) ans[i] = GGOBI (getCaseGlyphSize) (ids[i], d, gg); return (ids); } gint GGOBI (getCaseGlyphSize) (gint id, GGobiData * d, ggobid * gg) { gint index = d->rows_in_plot.els[id]; return (d->glyph_now.els[index].size); } void GGOBI (setCaseGlyph) (gint index, gint type, gint size, GGobiData * d, ggobid * gg) { if (type > -1) { if (type >= NGLYPHTYPES) g_printerr ("Illegal glyph type: %d\n", type); else d->glyph.els[index].type = d->glyph_now.els[index].type = type; } if (size > -1) { if (size >= NGLYPHSIZES) g_printerr ("Illegal glyph size: %d\n", size); else d->glyph.els[index].size = d->glyph_now.els[index].size = size; } } void GGOBI (setCaseGlyphs) (gint * ids, gint n, gint type, gint size, GGobiData * d, ggobid * gg) { gint i, doit = 1; /* * Make sure glyphs are legal before assigning. (It's safe to * ignore values of -1, because those are likely to be deliberately * set by the calling routine as an indication to do nothing.) * Do the check here to avoid generating large numbers of * error messages. */ if (type >= NGLYPHTYPES) { g_printerr ("Illegal glyph type: %d\n", type); doit = 0; } if (size >= NGLYPHSIZES) { g_printerr ("Illegal glyph size: %d\n", size); doit = 0; } if (doit) for (i = 0; i < n; i++) GGOBI (setCaseGlyph) (ids[i], type, size, d, gg); } /*-------------------------------------------------------------------------*/ /* setting and getting point colors */ /*-------------------------------------------------------------------------*/ void GGOBI (setCaseColor) (gint pt, gint colorIndex, GGobiData * d, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; /*-- temporary fix --*/ if (colorIndex < 0 || colorIndex > scheme->n - 1) colorIndex = 0; d->color.els[pt] = d->color_now.els[pt] = colorIndex; } void GGOBI (setCaseColors) (gint * pts, gint howMany, gint colorIndex, GGobiData * d, ggobid * gg) { gint i; for (i = 0; i < howMany; i++) d->color.els[pts[i]] = d->color_now.els[pts[i]] = colorIndex; } gint GGOBI (getCaseColor) (gint pt, GGobiData * d, ggobid * gg) { return (d->color_now.els[pt]); } gint *GGOBI (getCaseColors) (gint * pts, gint howMany, GGobiData * d, ggobid * gg) { gint i; gint *ans = (gint *) g_malloc (howMany * sizeof (gint)); for (i = 0; i < howMany; i++) ans[i] = GGOBI (getCaseColor) (pts[i], d, gg); return (ans); } /*-------------------------------------------------------------------------*/ /* setting and getting the point hidden state */ /*-------------------------------------------------------------------------*/ void GGOBI (setCaseHidden) (gint pt, gboolean hidden_p, GGobiData * d, ggobid * gg) { d->hidden.els[pt] = d->hidden_now.els[pt] = hidden_p; /*-- don't replot --*/ } void GGOBI (setCaseHiddens) (gint * pts, gint howMany, gboolean hidden_p, GGobiData * d, ggobid * gg) { gint i; for (i = 0; i < howMany; i++) GGOBI (setCaseHidden) (pts[i], hidden_p, d, gg); displays_plot (NULL, FULL, gg); } gboolean GGOBI (getCaseHidden) (gint pt, GGobiData * d, ggobid * gg) { return (d->hidden_now.els[pt]); } gboolean *GGOBI (getCaseHiddens) (gint * pts, gint howMany, GGobiData * d, ggobid * gg) { gint i; gboolean *ans = (gboolean *) g_malloc (howMany * sizeof (gboolean)); for (i = 0; i < howMany; i++) ans[i] = GGOBI (getCaseHidden) (pts[i], d, gg); return (ans); } /*-------------------------------------------------------------------------*/ /* setting and getting edges */ /*-------------------------------------------------------------------------*/ gboolean GGOBI (getShowLines) () { return (GGOBI (getDefaultDisplayOptions) ()->edges_undirected_show_p); } /* uh.. this takes a boolean value but always shows lines... what's up */ gboolean GGOBI (setShowLines) (displayd * dsp, gboolean val) { GtkAction *action; gboolean old = GGOBI (getShowLines) (); /*GGOBI(getDefaultDisplayOptions)()->edges_undirected_show_p = val; */ dsp->options.edges_undirected_show_p = true; action = gtk_ui_manager_get_action (dsp->menu_manager, "/menubar/Edges/ShowUndirectedEdges"); if (action) gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), true); return (old); } /* setShowAxes will require this code: { GtkWidget *topmenu, *menu, *item; topmenu = widget_find_by_name (dspnew->menubar, "DISPLAY:options_topmenu"); if (topmenu) { menu = GTK_MENU_ITEM(topmenu)->submenu; if (menu) { item = widget_find_by_name (menu, "DISPLAY:show_axes"); if (item) { gtk_check_menu_item_set_active ((GtkCheckMenuItem *) item, false); } } } } */ DisplayOptions *GGOBI (getDefaultDisplayOptions) () { return (&DefaultDisplayOptions); } displayd *GGOBI (getDisplay) (gint which, ggobid * gg) { displayd *display = NULL; if (which < g_list_length (gg->displays)) display = (displayd *) g_list_nth_data (gg->displays, which); return (display); } DisplayOptions *GGOBI (getDisplayOptions) (int displayNum, ggobid * gg) { DisplayOptions *options = NULL; if (displayNum < 0) options = GGOBI (getDefaultDisplayOptions) (); else { displayd *display; display = GGOBI (getDisplay) (displayNum, gg); if (display) options = &(display->options); } return (options); } displayd *GGOBI (getCurrentDisplay) (ggobid * gg) { return (gg->current_display); } gint GGOBI (getCurrentDisplayIndex) (ggobid * gg) { return (g_list_index (gg->displays, gg->current_display)); } gint GGOBI (getCurrentPlotIndex) (ggobid * gg) { int val = -1; displayd *d; if (gg->current_splot) { d = GGOBI (getCurrentDisplay) (gg); val = g_list_index (d->splots, gg->current_splot); } return (val); } displayd *GGOBI (setCurrentDisplay) (int which, ggobid * gg) { displayd *d; d = GGOBI (getDisplay) (which, gg); if (d != NULL) display_set_current (d, gg); return (d); } splotd *GGOBI (getPlot) (displayd * display, int which) { splotd *sp = (splotd *) g_list_nth_data (display->splots, which); return (sp); } gint GGOBI (getNumGGobis) () { extern gint num_ggobis; return (num_ggobis); } /* Whether to destory the window or not. If this is being called from an event handler in response to the window being destroyed, we would get a circularity. However, when called programmatically from within the process (or from e.g. R) we need to force it to be closed. */ gboolean GGOBI (close) (ggobid * gg, gboolean closeWindow) { gboolean val = true; if (gg->close_pending) return (false); gg->close_pending = true; /* close plugin instances */ closePlugins (gg); procs_activate (off, gg->pmode, gg->current_display, gg); display_free_all (gg); if (closeWindow && gg->main_window) gtk_widget_destroy (gg->main_window); if (gg->display_tree.window) gtk_widget_destroy (gg->display_tree.window); if (gg->vartable_ui.window) gtk_widget_destroy (gg->vartable_ui.window); if (gg->color_ui.symbol_window) gtk_widget_destroy (gg->color_ui.symbol_window); if (gg->wvis.window) gtk_widget_destroy (gg->wvis.window); if (gg->svis.window) gtk_widget_destroy (gg->svis.window); gg->close_pending = false; /* Now fix up the list of ggobi's */ val = ggobi_remove (gg) != -1; if (GGobi_getNumGGobis () == 0 && sessionOptions->info->quitWithNoGGobi && gtk_main_level () > 0) { gtk_main_quit (); } return (val); } #ifdef EXPLICIT_IDENTIFY_HANDLER void GGOBI (setIdentifyHandler) (IdentifyProc proc, void *data, ggobid * gg) { gg->identify_handler.handler = proc; gg->identify_handler.user_data = data; } #endif void GGOBI (getBrushSize) (gint * w, gint * h, ggobid * gg) { splotd *sp = gg->current_splot; *w = ABS (sp->brush_pos.x1 - sp->brush_pos.x2); *h = ABS (sp->brush_pos.y1 - sp->brush_pos.y2); } void GGOBI (getBrushLocation) (gint * x, gint * y, ggobid * gg) { splotd *sp = gg->current_splot; *x = MIN (sp->brush_pos.x1, sp->brush_pos.x2); *y = MIN (sp->brush_pos.y1, sp->brush_pos.y2); } void redraw (splotd * sp, ggobid * gg) { brush_once (true, sp, gg); display_plot (sp->displayptr, FULL, gg); } void GGOBI (setBrushSize) (int w, int h, ggobid * gg) { splotd *sp = gg->current_splot; displayd *display = sp->displayptr; sp->brush_pos.x1 = MIN (sp->brush_pos.x1, sp->brush_pos.x2); sp->brush_pos.y1 = MIN (sp->brush_pos.y1, sp->brush_pos.y2); sp->brush_pos.x2 = sp->brush_pos.x1 + w; sp->brush_pos.y2 = sp->brush_pos.y1 + h; brush_once (true, sp, gg); redraw (sp, gg); display_plot (display, FULL, gg); } void GGOBI (setBrushLocation) (gint x, gint y, ggobid * gg) { gint wd, ht; splotd *sp = gg->current_splot; GGOBI (getBrushSize) (&wd, &ht, gg); sp->brush_pos.x1 = x; sp->brush_pos.y1 = y; sp->brush_pos.x2 = x + wd; sp->brush_pos.y2 = y + ht; brush_once (true, sp, gg); redraw (sp, gg); } gboolean GGOBI (setBrushGlyph) (gint type, gint size, ggobid * gg) { if (type > -1) gg->glyph_id.type = type; if (size > -1) gg->glyph_id.size = size; return (true); /* Should be true iff there is a change. */ } void GGOBI (getBrushGlyph) (gint * type, gint * size, ggobid * gg) { *type = gg->glyph_id.type; *size = gg->glyph_id.size; } /* Returns the dimensions of the specified splot in pixels which can then be used for specifying. */ void GGOBI (getPlotPixelSize) (gint * w, gint * h, splotd * sp) { /* Temp */ *w = -1; *h = -1; } splotd *GGOBI (getSPlot) (gint which, displayd * display) { splotd *sp = (splotd *) g_list_nth_data (display->splots, which); return (sp); } gint GGOBI (setPMode) (const gchar * name, ggobid * gg) { ProjectionMode old = pmode_get (gg->current_display, gg); ProjectionMode newMode = (ProjectionMode) GGOBI (getPModeId) (name); if (newMode != NULL_PMODE) GGOBI (full_viewmode_set) (newMode, DEFAULT_IMODE, gg); return (old); } gint GGOBI (getPModeId) (const gchar * name) { gint n, i; const gchar *const *names = GGOBI (getPModeNames) (&n); for (i = 0; i < n; i++) { if (strcmp (names[i], name) == 0) return (i); } return (-1); } const gchar *GGOBI (getPModeName) (int which) { int n; const gchar *const *names; names = GGOBI (getPModeNames) (&n); return (names[which]); } const gchar *GGOBI (getPModeScreenName) (int which, displayd * display) { if (which == EXTENDED_DISPLAY_PMODE) { gchar *name; GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->imode_control_box (display, &name, display-> ggobi); return name; } return (GGOBI (getPModeName) (which)); } gint GGOBI (setIMode) (const gchar * name, ggobid * gg) { InteractionMode old = imode_get (gg); InteractionMode newMode = (InteractionMode) GGOBI (getIModeId) (name); if (newMode != NULL_PMODE) GGOBI (full_viewmode_set) (NULL_PMODE, newMode, gg); return (old); } gint GGOBI (getIModeId) (const gchar * name) { gint n, i; const gchar *const *names = GGOBI (getIModeNames) (&n); for (i = 0; i < n; i++) { if (strcmp (names[i], name) == 0) return (i); } return (-1); } const gchar *GGOBI (getIModeName) (int which) { int n; const gchar *const *names; names = GGOBI (getIModeNames) (&n); return (names[which]); } const gchar *GGOBI (getIModeScreenName) (int which, displayd * display) { if (which == DEFAULT_IMODE) return (GGOBI (getPModeScreenName) (display->cpanel.pmode, display)); return (GGOBI (getIModeName) (which)); } const gchar *GGOBI (getPModeKey) (int which) { int n; const gchar *const *keys = GGOBI (getPModeKeys) (&n); return (keys[which]); } /* gint GGOBI(getModeId)(const gchar *name) { gint n, i; const gchar *const *names = GGOBI(getOpModeNames)(&n); for(i = 0; i < n; i++) { if(strcmp(names[i],name) == 0) return(i); } return(-1); } const gchar * GGOBI(getModeName)(int which) { int n; const gchar *const *names = GGOBI(getOpModeNames)(&n); return(names[which]); } */ gint GGOBI (setBrushColor) (gint cid, ggobid * gg) { gint old = gg->color_id; if (cid > -1 && cid < gg->activeColorScheme->n) gg->color_id = cid; return (old); } gint GGOBI (getBrushColor) (ggobid * gg) { return (gg->color_id); } const gchar *GGOBI (getColorName) (gint cid, ggobid * gg, gboolean inDefault) { if (cid >= 0 && cid < gg->activeColorScheme->n) { return ((gchar *) g_array_index (gg->activeColorScheme->colorNames, gchar *, cid)); } return (NULL); } static gint addVariableInternal (gdouble * vals, gint num, gchar * name, gchar ** levels, gint * values, gint * counts, gint numLevels, gboolean update, GGobiData * d, ggobid * gg) { /*if (d->ncols < 1) { gchar ** rnames = (gchar **) &DefaultRowNames; GGOBI(setData)(NULL, rnames, &name, num, d->ncols, d, false, gg, NULL, false, d->input); datad_init(d, gg, false); } */ if (num > d->nrows && d->ncols > 0) { num = d->nrows; g_warning ("Variable length (%d) exceeds the number of dataset rows (%d)", num, d->nrows); } newvar_add_with_values (vals, num, name, numLevels > 0 ? categorical : real, numLevels, levels, values, counts, d); if (update) gdk_flush (); return (d->ncols - 1); } /*-- this is really addRealVariable --*/ gint GGOBI (addVariable) (gdouble * vals, gint num, gchar * name, gboolean update, GGobiData * d, ggobid * gg) { return (addVariableInternal (vals, num, name, NULL, NULL, NULL, 0, update, d, gg)); } /* It's hard to get the sequence right of adding a variable, updating its data, updating the variable table structure, setting the variable's type, emitting an event saying that a variable has been added, and updating the GUI. .... This works for now, but the code is not pretty. We're making only very limted use of the event we emit. dfs 2/7 */ gint GGOBI (addCategoricalVariable) (gdouble * vals, gint num, gchar * name, gchar ** levels, gint * values, gint * counts, gint numLevels, gboolean update, GGobiData * d, ggobid * gg) { return (addVariableInternal (vals, num, name, levels, values, counts, numLevels, update, d, gg)); } /* The idea of the update argument is that we can defer recomputing the statistics for all the variables and then the transformations. This is useful when we know we will be adding more variables before redisplaying. For example, for(i = 0; i < n; i++) GGOBI(setVariableValues)(i, values[i], gg->nrows, i == n-1, gg); causes the update to be done only for the last variable. */ gboolean GGOBI (setVariableValues) (gint whichVar, gdouble * vals, gint num, gboolean update, GGobiData * d, ggobid * gg) { gint i; for (i = 0; i < num; i++) { d->raw.vals[i][whichVar] = d->tform.vals[i][whichVar] = vals[i]; } if (update) { GGOBI (update_data) (d, gg); } return (true); } void GGOBI (update_data) (GGobiData * d, ggobid * gg) { limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); } gint GGOBI (removeVariable) (gchar * name, GGobiData * d, ggobid * gg) { gint which = GGOBI (getVariableIndex) (name, d, gg); if (which > -1 && which < d->ncols) return (GGOBI (removeVariableByIndex) (which, d, gg)); return (-1); } gint GGOBI (removeVariableByIndex) (gint which, GGobiData * d, ggobid * gg) { gint i, j; for (i = 0; i < d->nrows; i++) { for (j = which + 1; j < d->ncols; j++) { /*XXX Fill in */ } } d->ncols--; return (-1); } gint GGOBI (getVariableIndex) (const gchar * name, GGobiData * d, ggobid * gg) { gint j; for (j = 0; j < d->ncols; j++) { if (strcmp (ggobi_data_get_col_name(d, j), name) == 0) return (j); } return (-1); } void GGOBI (setPlotRange) (double *x, double *y, int plotNum, displayd * display, gboolean pixels, ggobid * gg) { splotd *sp; sp = GGOBI (getPlot) (display, plotNum); if (pixels) { } else { splot_zoom (sp, *x, *y); } /* fcoords tfmin, tfmax; tfmin.x = x[0]; tfmin.y = y[0]; tfmax.x = x[1]; tfmax.y = y[1]; if (GTK_WIDGET_VISIBLE (display->hrule)) { if (((gfloat) GTK_RULER (display->hrule)->lower != tfmin.x) || ((gfloat) GTK_RULER (display->hrule)->upper != tfmax.x)) { GTK_RULER_set_range (GTK_RULER (display->hrule), (gdouble) tfmin.x, (gdouble) tfmax.x); } } if (GTK_WIDGET_VISIBLE (display->vrule)) { if (((gfloat) GTK_RULER (display->vrule)->upper != tfmin.y) || ((gfloat) GTK_RULER (display->vrule)->lower != tfmax.y)) { GTK_RULER_set_range (GTK_RULER (display->vrule), (gdouble) tfmax.y, (gdouble) tfmin.y); } } */ } /* This handles the raising and lowering or the iconifying or de-iconifying of one or more windows. If which is negative, the operation applies to all the displays with the ggobid instance. Otherwise, the operation applies just to the display indexed by which. The two logical arguments indicate whether to raise/lower or iconify/deiconify. Within these two operation types, the up argument indicates whether to raise or lower, an iconify or deiconify. */ gboolean GGOBI (raiseWindow) (int which, gboolean raiseOrIcon, gboolean up, ggobid * gg) { windowDisplayd *display; gboolean ok = false; int start, end, i; if (which < 0) { start = 0; end = g_list_length (gg->displays); } else { end = which + 1; start = which; } for (i = start; i < end; i++) { display = (windowDisplayd *) g_list_nth_data (gg->displays, i); if (GGOBI_IS_WINDOW_DISPLAY (display) == false) continue; if (raiseOrIcon) { if (up) gdk_window_raise (display->window->window); else gdk_window_lower (display->window->window); } else { if (up) gtk_widget_hide_all (display->window); else gtk_widget_show_all (display->window); } } ok = true; gdk_flush (); return (ok); } gchar *GGOBI (getDescription) (ggobid * gg) { if (!gg->input) return (NULL); return (g_strdup (gg->input->fileName)); } /* Finds the index of the dataset named `name' in the specified ggobid object. */ int GGOBI (datasetIndex) (const char *name, const ggobid * const gg) { GGobiData *d; int ctr = 0; GSList *tmp = gg->d; while (tmp) { d = (GGobiData *) tmp->data; if (strcmp (name, d->name) == 0) return (ctr); ctr++; tmp = tmp->next; } return (-1); } /* Returns the names of the different datasets maintained in the specified ggobid object. */ gchar **GGOBI (getDatasetNames) (gint * n, ggobid * gg) { gint i; GGobiData *d; gchar **names; GSList *tmp = gg->d; *n = g_slist_length (gg->d); names = (gchar **) g_malloc (sizeof (gchar *) * (*n)); for (i = 0; i < *n; i++) { d = (GGobiData *) tmp->data; names[i] = g_strdup (d->name); tmp = tmp->next; } return (names); } /* Added to the API and to avoid breaking code (e.g. in RSggobi) we add it here with a new name GGOBI(ggobi_get). */ ggobid *GGOBI (ggobi_get) (gint which) { return (ggobi_get (which)); } gint GGOBI (ncols) (GGobiData * data) { return (data->ncols); } gint GGOBI (nrecords) (GGobiData * data) { return (data->nrows); } /* This is the routine one uses to register a handler for key press events for the numbered keys, i.e. 0, 1, ..., 9 One can specify null values for each of these to remove the handler and have these events discarded. See notes/NumberedKeys.*, splot.c and ggobi.h also for more details */ KeyEventHandler *GGOBI (registerNumberedKeyEventHandler) (KeyEventHandlerFunc routine, void *userData, char *description, ReleaseData * releaseData, ggobid * gg, ProgrammingLanguage lang) { KeyEventHandler *old = gg->NumberedKeyEventHandler; KeyEventHandler *newValue; if (routine == NULL) newValue = NULL; else { newValue = g_malloc (1 * sizeof (KeyEventHandler)); newValue->handlerRoutine = routine; newValue->userData = userData; newValue->description = g_strdup (description); newValue->language = lang; newValue->releaseData = releaseData; } gg->NumberedKeyEventHandler = newValue; return (old); } KeyEventHandler *GGOBI (removeNumberedKeyEventHandler) (ggobid * gg) { return (GGOBI (registerNumberedKeyEventHandler (NULL, NULL, NULL, NULL, gg, C))); } #include "config.h" static const gchar *version_date = GGOBI_RELEASE_DATE; static const int GgobiVersionNumbers[] = { MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION }; static const gchar *version_string = PACKAGE_VERSION; const char *GGOBI (getVersionDate) () { return (version_date); } const char *GGOBI (getVersionString) () { return (version_string); } const int *GGOBI (getVersionNumbers) () { return (GgobiVersionNumbers); } GGobiData *GGOBI (data_get) (gint which, const ggobid * const gg) { GGobiData *data = NULL; if (gg->d != NULL) data = g_slist_nth_data (gg->d, which); return (data); } GGobiData *GGOBI (data_get_by_name) (const gchar * const name, const ggobid * const gg) { gint which; GGobiData *data = NULL; which = GGOBI (datasetIndex) (name, gg); if (which > -1) { data = GGOBI (data_get) (which, gg); } return (NULL); } void GGobi_setSessionOptions (GGobiOptions * opts) { sessionOptions = opts; } const gchar * GGobi_getLevelName (vartabled * vt, double value) { int which = 0; for (which = 0; which < vt->nlevels; which++) { if (vt->level_values[which] == (int) value) return (vt->level_names[which]); } return (NULL); } void GGobi_setDataName (const char *const name, GGobiData * d) { if (d->name) g_free ((gchar *) d->name); d->name = g_strdup (name); /* Update the different labels. */ } /* sets the tour projection matrix, F */ gboolean GGOBI (setTour2DProjectionMatrix) (gdouble * Fvalues, gint ncols, gint ndim, gboolean vals_scaled, ggobid * gg) { ProjectionMode vm = pmode_get (gg->current_display, gg); displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; GGobiData *d = dsp->d; gboolean candoit = true; gint i, j; if ((ncols != d->ncols) || ndim != 2) candoit = false; if (candoit) { /* Set the scatterplot display mode to be tour2d */ if (vm != TOUR2D) { /* Needs to be filled in */ } /* Pause the tour */ if (!cpanel->t2d.paused) tour2d_pause (cpanel, true, dsp, gg); /* Set the projection vector F */ for (i = 0; i < ndim; i++) for (j = 0; j < ncols; j++) dsp->t2d.F.vals[i][j] = Fvalues[i + j * 2]; /* If the values are scaled, then we need to multiply them by the tform data, else we multiply them by the world data */ if (vals_scaled) { /* Needs to be filled in */ } else { display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } } return (candoit); } const gdouble **GGOBI (getTour2DProjectionMatrix) (gint ncols, gint ndim, gboolean vals_scaled, ggobid * gg) { displayd *dsp = gg->current_display; GGobiData *d = dsp->d; gdouble **Fvals; gint i, j; ncols = d->ncols; ndim = 2; Fvals = (gdouble **) g_malloc (sizeof (gdouble *) * ncols); if (vals_scaled) { /* run the F values through the reverse pipeline */ } else { for (i = 0; i < ndim; i++) for (j = 0; j < ncols; j++) Fvals[i][j] = dsp->t2d.F.vals[i][j]; } return ((const gdouble **) Fvals); } guint getGGobiSignal (GGobiSignalType which) { /* XXX assert(which > -1 && which < MAX_GGOBI_SIGNALS); */ return (GGobiSignals[which]); } GSList *GGOBI (getExtendedDisplayTypes) () { return (ExtendedDisplayTypes); } ggobi-2.1.12/src/vartable.h0000644000175000017500000000426414651527764011134 /*-- vartable.h --*/ #ifndef VARTABLE_H #define VARTABLE_H #include "types.h" enum { VT_VARNAME, VT_TFORM, VT_REAL_USER_MIN, VT_REAL_USER_MAX, VT_REAL_DATA_MIN, VT_REAL_DATA_MAX, VT_MEAN, VT_MEDIAN, VT_NLEVELS, VT_LEVEL_NAME, VT_LEVEL_VALUE, VT_LEVEL_COUNT, VT_CAT_USER_MIN, VT_CAT_USER_MAX, VT_CAT_DATA_MIN, VT_CAT_DATA_MAX, VT_NMISSING, NCOLS_VT }; typedef enum {ADDVAR_ROWNOS = 0, ADDVAR_BGROUP} NewVariableType; extern const double AddVarRowNumbers; extern const double AddVarBrushGroup; typedef enum {real, categorical, integer, counter, uniform, all_vartypes} vartyped; /* * A vartabled object is not a table, but rather an entry in a table: * it's all the data for a single variable, and it is used to populate * a row in the variable manipulation table. Now that is done using a * GtkTreeModel, so be careful before adding or moving an element in * this structure. */ typedef struct { GObject *d; /*-- the parent datad --*/ gchar *collab, *collab_tform; gchar *nickname; /*-- very short name to use in tour axis labels --*/ /*-- is this variable categorical? --*/ vartyped vartype; gboolean isTime; /*-- categorical_p --*/ gint nlevels; gint *level_values; gint *level_counts; gchar **level_names; /*-- strings --*/ /*-- unadjusted, unaffected by imputation --*/ gfloat mean, median; lims lim_raw; /*-- range of the raw data --*/ lims lim_tform; /*-- range of d->tform --*/ /* * the limits to be put into the table: presently, this is * lim_tform but it excludes any missing values. */ lims lim_display; /* * If the user has supplied limits, lim_specified_p = true * and the limits are stored in lim_specified.{min,max} */ gboolean lim_specified_p; lims lim_specified; lims lim_specified_tform; lims lim; /*-- limits in use: lim_specified_tform or lim_tform --*/ /*-- transformations --*/ gint tform0; gfloat domain_incr; /*-- stage 0 --*/ gfloat (*domain_adj) (gfloat x, gfloat incr); gfloat (*inv_domain_adj) (gfloat x, gfloat incr); gint tform1; gfloat param; gint tform2; /*-- jittering --*/ gfloat jitter_factor; /*-- in variable table --*/ gboolean selected; } vartabled; #endif ggobi-2.1.12/src/splot.c0000644000175000017500000006432414651527764010473 /* splot.c: an individual scatterplot */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include #include "vars.h" #include "externs.h" #include "ggobi-renderer-factory.h" /*--------------------------------------------------------------------*/ /* Events */ /*--------------------------------------------------------------------*/ static gint splot_configure_cb (GtkWidget *w, GdkEventConfigure *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; GGobiRendererFactory *factory = ggobi_renderer_factory_new(); GGobiRenderer *renderer; /* * Somehow when a new splot is added to a table, the initial * configuration event for the drawing_area occurs before the * drawing_area has been properly sized. Maybe I'm not executing * calls in the proper order? This protects me in the meantime. */ if (w->allocation.width < 2 || w->allocation.height < 2) { return false; } /* * This is not the best place to do this, perhaps, but it works * nicely here -- it makes certain that plots in the scatterplot * matrix are correctly initialized. (And I don't know why, either) */ if (sp->pixmap0 == NULL) { /*-- ie, splot being initialized --*/ splot_world_to_plane (cpanel, sp, gg); } /*-- Create new backing pixmaps of the appropriate size --*/ if (sp->pixmap0 != NULL) gdk_pixmap_unref (sp->pixmap0); if (sp->pixmap1 != NULL) gdk_pixmap_unref (sp->pixmap1); /* sp->pixmap0 = gdk_pixmap_new (w->window, w->allocation.width, w->allocation.height, -1); sp->pixmap1 = gdk_pixmap_new (w->window, w->allocation.width, w->allocation.height, -1); */ renderer = ggobi_renderer_factory_create(factory, w->window); sp->pixmap0 = GDK_DRAWABLE(renderer); renderer = ggobi_renderer_factory_create(factory, w->window); sp->pixmap1 = GDK_DRAWABLE(renderer); g_object_unref(G_OBJECT(factory)); if (cpanel->imode == BRUSH) { sp->brush_pos.x1 = (gint) ((gfloat) sp->brush_pos.x1 * (gfloat) (w->allocation.width) / (gfloat) (sp->max.x)); sp->brush_pos.x2 = (gint) ((gfloat) sp->brush_pos.x2 * (gfloat) (w->allocation.width) / (gfloat) (sp->max.x)); sp->brush_pos.y1 = (gint) ((gfloat) sp->brush_pos.y1 * (gfloat) (w->allocation.height)/ (gfloat) (sp->max.y)); sp->brush_pos.y2 = (gint) ((gfloat) sp->brush_pos.y2 * (gfloat) (w->allocation.height) / (gfloat) (sp->max.y)); } sp->max.x = w->allocation.width; sp->max.y = w->allocation.height; splot_plane_to_screen (display, cpanel, sp, gg); if (cpanel->imode == BRUSH) { if (GGOBI_IS_EXTENDED_SPLOT(sp)) { void (*f)(GGobiData *, splotd *, ggobid *); GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); f = klass->splot_assign_points_to_bins; if(f) { f(d, sp, gg); // need to exclude area plots } } } sp->redraw_style = FULL; gtk_widget_queue_draw (sp->da); /* if no window, then the ruler ranges have not yet been set: set them now */ if (GGOBI_IS_WINDOW_DISPLAY(display) && !GGOBI_WINDOW_DISPLAY(display)->useWindow) ruler_ranges_set(true, display, sp, gg); return false; } static gint splot_expose_cb (GtkWidget *w, GdkEventExpose *event, splotd *sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); /*-- sanity checks --*/ if (sp->pixmap0 == NULL || sp->pixmap1 == NULL) return retval; if (w->allocation.width < 2 || w->allocation.height < 2) return retval; splot_redraw (sp, sp->redraw_style, gg); return retval; } void splot_connect_expose_handler (gboolean idled, splotd *sp) { if (idled) // if idle_proc running g_signal_handlers_disconnect_by_func (G_OBJECT (sp->da), G_CALLBACK(splot_expose_cb), GTK_OBJECT (sp)); else g_signal_connect (G_OBJECT (sp->da), "expose_event", G_CALLBACK(splot_expose_cb), (gpointer) sp); } /*-- this will be called by a key_press_cb for each scatterplot mode --*/ gboolean splot_event_handled (GtkWidget *w, GdkEventKey *event, cpaneld *cpanel, splotd *sp, ggobid *gg) { static guint32 etime = (guint32) 0; gboolean common_event = true; displayd *display = (displayd *) NULL; /* In composite displays, we sometimes find ourselves trying to * process an event on a deleted splot. I'm not sure if that's a bug * that should be fixed properly, or whether doing some error-checking * is an adequate response. At the moment, I think I'm seeing gtk * bugs in addition to our own. -- dfs */ if (!sp) return false; if (sp->displayptr) { display = ValidateDisplayRef((displayd *) sp->displayptr, gg, false); } if (!display) return false; /* * I can't say this is the best way to handle this bug, but it * seems to work. By switching modes before the processing * of the keypress is completed, I somehow start an infinite * loop in the new mode -- as soon as its key press signal handler * is connected, it starts handling the identical key press * event that was just handled in the previous mode. This test of * event->time ensures that the same key press event won't be handled * a second time. There's got to be a better way ... */ if (event->time == etime) return false; /*-- already processed --*/ if(GGOBI_IS_EXTENDED_DISPLAY(display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS(display); if (klass->splot_key_event_handled) { common_event = klass->splot_key_event_handled(w, display, sp, event, gg); } } etime = event->time; return common_event; } void sp_event_handlers_toggle (splotd *sp, gboolean state, ProjectionMode pmode, InteractionMode imode) { displayd *display = (displayd *) sp->displayptr; /* scatmat and parcoords are handling everything now and returning false; ts and barchart are handling their own and then returning to the switch statement; scatterplot doesn't have one of these routines yet. dfs 8/31/2005 */ if(GGOBI_IS_EXTENDED_DISPLAY(display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS(display); if(klass->event_handlers_toggle && klass->event_handlers_toggle(display, sp, state, pmode, imode) == false) { return; } } switch (imode) { case DEFAULT_IMODE: switch (pmode) { case P1PLOT: p1d_event_handlers_toggle (sp, state); break; case XYPLOT: xyplot_event_handlers_toggle (sp, state); break; case TOUR1D: tour1d_event_handlers_toggle (sp, state); break; case TOUR2D3: tour2d3_event_handlers_toggle (sp, state); break; case TOUR2D: tour2d_event_handlers_toggle (sp, state); break; case COTOUR: ctour_event_handlers_toggle (sp, state); break; default: break; } break; case SCALE: scale_event_handlers_toggle (sp, state); break; case BRUSH: brush_event_handlers_toggle (sp, state); break; case IDENT: identify_event_handlers_toggle (sp, state); break; case EDGEED: edgeedit_event_handlers_toggle (sp, state); break; case MOVEPTS: movepts_event_handlers_toggle (sp, state); break; default: break; } } void splot_set_current (splotd *sp, gboolean state, ggobid *gg) { /* * Turn on or off the event handlers in sp */ if (sp != NULL) { displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; sp_event_handlers_toggle (sp, state, cpanel->pmode, cpanel->imode); imode_activate (sp, cpanel->pmode, cpanel->imode, state, gg); /* * this is now the only place varpanel_refresh is called in * changing the current display and splot; we'll see if it's * adequate -- and it's probably overkill sometimes, too. */ if (state == on) { varpanel_refresh (display, gg); } } } void GGOBI(splot_set_current_full)(displayd *display, splotd *sp, ggobid *gg) { splotd *sp_prev = gg->current_splot; /*-- display and cpanel for outgoing current_splot --*/ displayd *display_prev = NULL; cpaneld *cpanel = NULL; /*ProjectionMode pmode_prev = gg->pmode;*/ InteractionMode imode_prev = gg->imode; if (sp != sp_prev) { if (sp_prev != NULL) { splot_set_current (sp_prev, off, gg); display_prev = (displayd *) sp_prev->displayptr; cpanel = &display_prev->cpanel; /* * This feels like a kludge, but I don't know where else to do * it. We want to handle a special case: we're brushing in a * multi-plot display, and we move to a new splot within the * same display. * In the future, there may be other things we want to undo, but * for now we just want to turn off the effects of in the * previous splot. */ if (g_list_length (display_prev->splots) > 1 /*-- multi-plot display --*/ && display == display_prev) /*-- display not changing --*/ { reinit_transient_brushing (display, gg); } if (gg->current_display != display) display_set_current (display, gg); /* old one off, new one on */ } gg->current_splot = sp->displayptr->current_splot = sp; splot_set_current (sp, on, gg); /*main_miscmenus_update (pmode_prev, imode_prev, display_prev, gg);*/ /* * if the previous splot is in transient brushing mode, a FULL * redraw is required. * * if the previous splot is in identify, a QUICK redraw is required * * otherwise, just redraw the borders of the two affected splots */ if (imode_prev == NULL_IMODE || cpanel == NULL) displays_plot (NULL, FULL, gg); if (imode_prev == BRUSH && cpanel->br.mode == BR_TRANSIENT) displays_plot (NULL, FULL, gg); else if (imode_prev == IDENT) displays_plot (NULL, QUICK, gg); else { /* remove border from the previous splot */ if (sp_prev != NULL) splot_redraw (sp_prev, QUICK, gg); /* add border to current_splot */ splot_redraw (sp, QUICK, gg); } } } static gint splot_set_current_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); displayd *display = (displayd *) sp->displayptr; GGOBI(splot_set_current_full)(display, sp, gg); return false; /* so that other button press handlers also get the event */ } /* --------------------------------------------------------------- */ /* Dynamic allocation section */ /* --------------------------------------------------------------- */ void splot_points_realloc (gint nrows_prev, splotd *sp, GGobiData *d) { gint i; vectorf_realloc (&sp->p1d.spread_data, d->nrows); sp->planar = (gcoords *) g_realloc (sp->planar, d->nrows * sizeof (gcoords)); sp->screen = (icoords *) g_realloc (sp->screen, d->nrows * sizeof (icoords)); for (i=nrows_prev; inrows; i++) { sp->planar[i].x = sp->planar[i].y = 0.0; sp->screen[i].x = sp->screen[i].y = 0; } } void splot_edges_realloc (gint nedges_prev, splotd *sp, GGobiData *e) { gint i; sp->edges = (GdkSegment *) g_realloc ((gpointer) sp->edges, e->edge.n * sizeof (GdkSegment)); sp->arrowheads = (GdkSegment *) g_realloc ((gpointer) sp->arrowheads, e->edge.n * sizeof (GdkSegment)); /*-- these aren't useful values, but they're finite --*/ if (nedges_prev > 0) { for (i=nedges_prev; iedge.n; i++) { sp->edges[i].x1 = sp->edges[i].x2 = 0; sp->arrowheads[i].x1 = sp->arrowheads[i].x2 = 0; } } } void splot_alloc (splotd *sp, displayd *display, ggobid *gg) { GGobiData *d; gint nr; if(!display) return; d = display->d; nr = d->nrows; sp->planar = (gcoords *) g_malloc (nr * sizeof (gcoords)); sp->screen = (icoords *) g_malloc (nr * sizeof (icoords)); vectorf_init_null (&sp->p1d.spread_data); vectorf_alloc (&sp->p1d.spread_data, nr); if(GGOBI_IS_EXTENDED_SPLOT(sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); if(klass->alloc_whiskers) sp->whiskers = klass->alloc_whiskers(sp->whiskers, sp, nr, d); } } void splot_free (splotd *sp, displayd *display, ggobid *gg) { gtk_widget_hide (sp->da); g_free ((gpointer) sp->planar); g_free ((gpointer) sp->screen); vectorf_free (&sp->p1d.spread_data); #ifdef WIN32 win32_drawing_arrays_free (sp); #endif if(GGOBI_IS_EXTENDED_SPLOT(sp)) gtk_object_destroy(GTK_OBJECT(sp)); else gtk_widget_destroy (GTK_WIDGET(sp)); } splotd * splot_new (displayd *display, gint width, gint height, ggobid *gg) { splotd *sp; sp = g_object_new(GGOBI_TYPE_SPLOT, NULL); splot_init(sp, display, gg); return(sp); } void splot_init(splotd *sp, displayd *display, ggobid *gg) { /* * Initialize the widget portion of the splot object */ brush_pos_init (sp); //splot_dimension_set (sp, width, height); /* * Let it be possible to get a pointer to the splotd object * from the drawing area; and to gg as well. */ g_object_set_data(G_OBJECT (sp->da), "splotd", (gpointer) sp); GGobi_widget_set (sp->da, gg, true); gtk_widget_set_double_buffered(sp->da, false); g_signal_connect (G_OBJECT (sp->da), "expose_event", G_CALLBACK(splot_expose_cb), (gpointer) sp); g_signal_connect (G_OBJECT (sp->da), "configure_event", G_CALLBACK(splot_configure_cb), (gpointer) sp); g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK(splot_set_current_cb), (gpointer) sp); gtk_widget_set_events (sp->da, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); /* Init some dimension attributes */ sp->pmid.x = sp->pmid.y = sp->max.x = sp->max.y = 0; /* * Initialize the data portion of the splot object */ sp->edges = NULL; sp->arrowheads = NULL; splot_alloc (sp, display, gg); sp->displayptr = display; sp->pixmap0 = NULL; sp->pixmap1 = NULL; /* could become splot_p1d_init ();*/ sp->p1dvar = 0; /* could become splot_xyplot_init ();*/ sp->xyvars.x = 0; sp->xyvars.y = 1; /* could become splot_scale_init ();*/ sp->scale.x = sp->scale.y = SCALE_DEFAULT; sp->tour_scale.x = sp->tour_scale.y = TOUR_SCALE_DEFAULT; sp->key_press_id = 0; sp->press_id = 0; sp->release_id = 0; sp->motion_id = 0; /* tour inits */ sp->tour1d.initmax = true; sp->tour2d3.initmax = true; sp->tour2d.initmax = true; sp->tourcorr.initmax = true; #ifdef WIN32 sp->win32.npoints = 0; #endif /* g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), "key_press_event", G_CALLBACK(raise_control_panel), (gpointer) gg); */ g_signal_emit(G_OBJECT(gg), GGobiSignals[SPLOT_NEW_SIGNAL], 0, sp); } void splot_get_dimensions (splotd *sp, gint *width, gint *height) { *width = sp->da->allocation.width; *height = sp->da->allocation.height; } /*----------------------------------------------------------------------*/ /* pipeline for scatterplot */ /*----------------------------------------------------------------------*/ void splot_world_to_plane (cpaneld *cpanel, splotd *sp, ggobid *gg) /* * project the data from world_data[], * the data expressed in 'world coordinates,' to planar[], the * data expressed in 'projection coordinates.' */ { displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; /* * This may be the place to respond to the possibility that a * plotted variable has just been deleted. It's no big deal for * the scatterplot -- unless one of the plotted variables is now * beyond d->ncols. */ if(GGOBI_IS_EXTENDED_SPLOT(sp)) { GGOBI_EXTENDED_SPLOT_GET_CLASS(sp)->world_to_plane(sp, d, gg); } } void splot_plane_to_screen (displayd *display, cpaneld *cpanel, splotd *sp, ggobid *gg) /* * Use the data in projection coordinates and rescale it to the * dimensions of the current plotting window, writing it into screen. */ { gint i, k; greal scale_x, scale_y; GGobiData *d = display->d; greal gtmp; GGobiExtendedSPlotClass *klass = NULL; greal precis = (greal) PRECISION1; if(GGOBI_IS_EXTENDED_SPLOT(sp)) { klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); if(klass->plane_to_screen) { klass->plane_to_screen(sp, d, gg); return; } } /* scale_x = (greal) (cpanel->projection == TOUR2D) ? sp->tour_scale.x : sp->scale.x; scale_y = (greal) (cpanel->projection == TOUR2D) ? sp->tour_scale.y : sp->scale.y;*/ /* with the tour rescaling itself into the planar box limits, this shouldn't be needed any more */ scale_x = sp->scale.x; scale_y = sp->scale.y; /* * Calculate is, a scale factor. Scale so as to use the entire * plot window (well, as much of the plot window as scale.x and * scale.y permit.) */ scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; /* * Calculate new coordinates. */ for (k=0; knrows_in_plot; k++) { i = d->rows_in_plot.els[k]; /*-- scale from world to plot window --*/ gtmp = sp->planar[i].x - sp->pmid.x; sp->screen[i].x = (gint) (gtmp * sp->iscale.x / precis); gtmp = sp->planar[i].y - sp->pmid.y; sp->screen[i].y = (gint) (gtmp * sp->iscale.y / precis); /*-- shift into middle of plot window --*/ sp->screen[i].x += (sp->max.x / 2); sp->screen[i].y += (sp->max.y / 2); } if(klass && klass->sub_plane_to_screen) { klass->sub_plane_to_screen(sp, display, d, gg); } } /*----------------------------------------------------------------------*/ /* reverse pipeline for scatterplot */ /*----------------------------------------------------------------------*/ /* * In order to compute the limits for the rulers, I need to * run a pair of points through the reverse pipeline -- but * without having any impact on the pipeline data structures. * * This should probably be replaced with pt_screen_to_raw * in lineedit.c. I just have to make sure the results are * consistent. -- dfs */ /* void splot_screen_to_tform (cpaneld *cpanel, splotd *sp, icoords *scr, fcoords *tfd, ggobid *gg) { gcoords planar, world; greal precis = (greal) PRECISION1; greal ftmp, max, min, rdiff; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gfloat scale_x, scale_y; vartabled *vt, *vtx, *vty; g_return_if_fail (cpanel->pmode == XYPLOT || cpanel->pmode == P1PLOT || cpanel->pmode == TOUR1D || cpanel->pmode == TOUR2D3 || cpanel->pmode == TOUR2D || cpanel->pmode == COTOUR); scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; * * screen to plane * planar.x = (scr->x - sp->max.x/2) * precis / sp->iscale.x ; planar.x += sp->pmid.x; planar.y = (scr->y - sp->max.y/2) * precis / sp->iscale.y ; planar.y += sp->pmid.y; * * plane to world * switch (cpanel->pmode) { case P1PLOT: vt = vartable_element_get (sp->p1dvar, d); max = vt->lim.max; min = vt->lim.min; rdiff = max - min; if (display->p1d_orientation == HORIZONTAL) { world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; } else { world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } break; case XYPLOT: vtx = vartable_element_get (sp->xyvars.x, d); max = vtx->lim.max; min = vtx->lim.min; rdiff = max - min; world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; vty = vartable_element_get (sp->xyvars.y, d); max = vty->lim.max; min = vty->lim.min; rdiff = max - min; world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; break; default: break; } } */ /* * The remainder of the reverse pipeline routines operate on * the ggobi data structures. */ void splot_screen_to_plane (splotd *sp, gint pt, gcoords *eps, gboolean horiz, gboolean vert) { gcoords prev_planar; greal precis = (greal) PRECISION1; gfloat scale_x, scale_y; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; if (horiz) { sp->screen[pt].x -= sp->max.x/2; prev_planar.x = sp->planar[pt].x; sp->planar[pt].x = (greal) sp->screen[pt].x * precis / sp->iscale.x ; sp->planar[pt].x += (greal) sp->pmid.x; eps->x = sp->planar[pt].x - prev_planar.x; } if (vert) { sp->screen[pt].y -= sp->max.y/2; prev_planar.y = sp->planar[pt].y; sp->planar[pt].y = (greal) sp->screen[pt].y * precis / sp->iscale.y ; sp->planar[pt].y += (greal) sp->pmid.y; eps->y = sp->planar[pt].y - prev_planar.y; } } /* void splot_plane_to_world (splotd *sp, gint ipt, ggobid *gg) { displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; switch (cpanel->pmode) { case P1PLOT: if (display->p1d_orientation == VERTICAL) d->world.vals[ipt][sp->p1dvar] = (greal) sp->planar[ipt].y; else d->world.vals[ipt][sp->p1dvar] = (greal) sp->planar[ipt].x; break; case XYPLOT: d->world.vals[ipt][sp->xyvars.x] = (greal) sp->planar[ipt].x; d->world.vals[ipt][sp->xyvars.y] = (greal) sp->planar[ipt].y; break; case TOUR1D: { gint j, var; for (j=0; jt1d.nactive; j++) { var = display->t1d.active_vars.els[j]; d->world.vals[ipt][var] += (gg->movepts.eps.x * (greal) display->t1d.F.vals[0][var]); } } break; case TOUR2D3: { gint j, var; for (j=0; jt2d3.nactive; j++) { var = display->t2d3.active_vars.els[j]; d->world.vals[ipt][var] += (gg->movepts.eps.x * (greal) display->t2d3.F.vals[0][var] + gg->movepts.eps.y * (greal) display->t2d3.F.vals[1][var]); } } break; case TOUR2D: { gint j, var; for (j=0; jt2d.nactive; j++) { var = display->t2d.active_vars.els[j]; d->world.vals[ipt][var] += (gg->movepts.eps.x * (greal) display->t2d.F.vals[0][var] + gg->movepts.eps.y * (greal) display->t2d.F.vals[1][var]); } } break; case COTOUR: { gint j, var; for (j=0; jtcorr1.nactive; j++) { var = display->tcorr1.active_vars.els[j]; d->world.vals[ipt][var] += (gg->movepts.eps.x * (greal) display->tcorr1.F.vals[0][var]); } for (j=0; jtcorr2.nactive; j++) { var = display->tcorr2.active_vars.els[j]; d->world.vals[ipt][var] += (gg->movepts.eps.y * (greal) display->tcorr2.F.vals[0][var]); } } break; default: g_printerr ("reverse pipeline not yet implemented for this projection\n"); } } */ /* void splot_reverse_pipeline (splotd *sp, gint ipt, gcoords *eps, gboolean horiz, gboolean vert, ggobid *gg) { displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; splot_screen_to_plane (sp, ipt, eps, horiz, vert); splot_plane_to_world (sp, ipt, gg); world_to_raw (ipt, sp, d, gg); } */ /* ---------------------------------------------------------------------*/ /* Pack up some of short signal routines */ /* ---------------------------------------------------------------------*/ /*-- this one isn't attached to sp->da, but we'll bundle it anyway --*/ void disconnect_key_press_signal (splotd *sp) { displayd *display; if (sp) { display = (displayd *) sp->displayptr; if (sp->key_press_id && GGOBI_IS_WINDOW_DISPLAY(display)) { g_signal_handler_disconnect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), sp->key_press_id); sp->key_press_id = 0; } } } void disconnect_button_press_signal (splotd *sp) { if (sp && sp->press_id) { g_signal_handler_disconnect (G_OBJECT (sp->da), sp->press_id); sp->press_id = 0; } } void disconnect_button_release_signal (splotd *sp) { if (sp && sp->release_id) { g_signal_handler_disconnect (G_OBJECT (sp->da), sp->release_id); sp->release_id = 0; } } void disconnect_motion_signal (splotd *sp) { if (sp && sp->motion_id) { g_signal_handler_disconnect (G_OBJECT (sp->da), sp->motion_id); sp->motion_id = 0; } } void disconnect_scroll_signal (splotd *sp) { if (sp && sp->scroll_id) { g_signal_handler_disconnect (G_OBJECT (sp->da), sp->scroll_id); sp->scroll_id = 0; } } /*--------------------------------------------------------------------*/ /* Cursors */ /*--------------------------------------------------------------------*/ /* * Return to the default cursor */ void splot_cursor_unset (splotd *sp) { GdkWindow *window = sp->da->window; if (!GTK_WIDGET_REALIZED(sp->da)) return; sp->jcursor = 0; if (sp->cursor != NULL) gdk_cursor_destroy (sp->cursor); sp->cursor = NULL; gdk_window_set_cursor (window, NULL); } void splot_cursor_set (GdkCursorType jcursor, splotd *sp) { GdkWindow *window = sp->da->window; if (!GTK_WIDGET_REALIZED(sp->da)) return; sp->cursor = gdk_cursor_new (sp->jcursor); gdk_window_set_cursor (window, sp->cursor); } ggobi-2.1.12/src/xyplot_ui.c0000644000175000017500000001713614651527764011365 /*-- xyplot_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" /*--------------------------------------------------------------------*/ /* Cycling */ /*--------------------------------------------------------------------*/ static const gchar *const fix_axis_lbl[] = {"No fixed axes", "Fix X", "Fix Y"}; static void fix_axis_cb (GtkWidget *w, ggobid *gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->xyplot.cycle_axis = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); } void xyplot_cycle_activate (gboolean state, cpaneld *cpanel, ggobid *gg) { if (state) { gg->xyplot.cycle_id = g_timeout_add (cpanel->xyplot.cycle_delay, (GSourceFunc) xycycle_func, (gpointer) gg); cpanel->xyplot.cycle_p = true; } else { if (gg->xyplot.cycle_id) { g_source_remove (gg->xyplot.cycle_id); gg->xyplot.cycle_id = 0; cpanel->xyplot.cycle_p = false; } } } static void cycle_cb (GtkToggleButton *button, ggobid *gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->xyplot.cycle_p = button->active; xyplot_cycle_activate (cpanel->xyplot.cycle_p, cpanel, gg); } static void cycle_speed_cb (GtkAdjustment *adj, ggobid *gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->xyplot.cycle_delay = -1 * (guint32) adj->value; if (cpanel->xyplot.cycle_p) { g_source_remove (gg->xyplot.cycle_id); gg->xyplot.cycle_id = g_timeout_add (cpanel->xyplot.cycle_delay, (GSourceFunc) xycycle_func, (gpointer) gg); } } static void chdir_cb (GtkButton *button, ggobid* gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->xyplot.cycle_dir = -1 * cpanel->xyplot.cycle_dir; } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget *w, GdkEventKey *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ return false; } void xyplot_event_handlers_toggle (splotd *sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->window) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), "key_press_event", G_CALLBACK(key_press_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); } } /*--------------------------------------------------------------------*/ void cpanel_xyplot_make (ggobid *gg) { modepaneld *panel; GtkWidget *frame, *vb, *cycle_tgl, *chdir_btn, *cycle_sbar, *opt; /* Make a panel, and add it to the GList gg->control_panels. */ panel = (modepaneld *) g_malloc(sizeof(modepaneld)); gg->control_panels = g_list_append(gg->control_panels, (gpointer) panel); panel->name = g_strdup(GGOBI(getPModeName)(XYPLOT)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); frame = gtk_frame_new ("Plot cycling"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (panel->w), frame, false, false, 3); vb = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (vb), 4); gtk_container_add (GTK_CONTAINER (frame), vb); cycle_tgl = gtk_check_button_new_with_mnemonic ("_Cycle"); gtk_widget_set_name (cycle_tgl, "XYPLOT:cycle_toggle"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), cycle_tgl, "Cycle through pairwise plots", NULL); g_signal_connect (G_OBJECT (cycle_tgl), "toggled", G_CALLBACK (cycle_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vb), cycle_tgl, false, false, 3); /* * make an option menu */ opt = gtk_combo_box_new_text (); gtk_widget_set_name (opt, "XYPLOT:cycle_axis"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Fix one of the axes during plot cycling or let them both float", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_combo_box (opt, (gchar**) fix_axis_lbl, G_N_ELEMENTS(fix_axis_lbl), G_CALLBACK(fix_axis_cb), gg); /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ gg->xyplot.cycle_delay_adj = (GtkAdjustment *) gtk_adjustment_new (-1.0 * 1000 /* cpanel->xyplot.cycle_delay */, -5000.0, -250.0, 100.0, 1000.0, 0.0); g_signal_connect (G_OBJECT (gg->xyplot.cycle_delay_adj), "value_changed", G_CALLBACK (cycle_speed_cb), gg); cycle_sbar = gtk_hscale_new (GTK_ADJUSTMENT (gg->xyplot.cycle_delay_adj)); scale_set_default_values (GTK_SCALE (cycle_sbar)); gtk_box_pack_start (GTK_BOX (vb), cycle_sbar, false, false, 1); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), cycle_sbar, "Adjust cycling speed", NULL); chdir_btn = gtk_button_new_with_mnemonic ("Change di_rection"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), chdir_btn, "Change cycling direction", NULL); gtk_box_pack_start (GTK_BOX (vb), chdir_btn, false, false, 1); g_signal_connect (G_OBJECT (chdir_btn), "clicked", G_CALLBACK (chdir_cb), gg); gtk_widget_show_all (panel->w); } /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ void cpanel_xyplot_init (cpaneld *cpanel, ggobid *gg) { /*-- cycling --*/ cpanel->xyplot.cycle_dir = FORWARD; cpanel->xyplot.cycle_p = false; cpanel->xyplot.cycle_axis = NOFIXED; cpanel->xyplot.cycle_delay = 1000; } void cpanel_xyplot_set (displayd *display, cpaneld *cpanel, ggobid* gg) /* * To handle the case where there are multiple scatterplots * which may have different xyplot cycling options and parameters selected */ { GtkWidget *pnl, *w; pnl = (GtkWidget *) mode_panel_get_by_name(GGOBI(getPModeName)(XYPLOT), gg); if (pnl) { /*-- Cycling on or off --*/ w = widget_find_by_name (pnl, "XYPLOT:cycle_toggle"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), cpanel->xyplot.cycle_p); /*-- Cycling speed --*/ gtk_adjustment_set_value (GTK_ADJUSTMENT (gg->xyplot.cycle_delay_adj), -1 * (gfloat) cpanel->xyplot.cycle_delay); /*-- Cycling axis --*/ w = widget_find_by_name (pnl, "XYPLOT:cycle_axis"); gtk_combo_box_set_active (GTK_COMBO_BOX(w), cpanel->xyplot.cycle_axis); } } ggobi-2.1.12/src/Makefile.in0000644000175000017500000015105114651530034011205 # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 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@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = ggobi$(EXEEXT) # Windows specific @OS_WIN32_TRUE@am__append_1 = libggobi.def @OS_WIN32_TRUE@am__append_2 = -Wc,-s -no-undefined -export-symbols libggobi.def subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(pkginclude_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ "$(DESTDIR)$(pkgincludedir)" PROGRAMS = $(bin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = $(libggobi_la_GOBS) am__objects_1 = am__objects_2 = $(am__objects_1) am__objects_3 = array.lo ash1d.lo barchart.lo barchartClass.lo \ barchart_ui.lo brush.lo brush_api.lo brush_bins.lo \ brush_init.lo brush_link.lo brush_ui.lo color.lo color_ui.lo \ cpanel.lo display.lo display_tree.lo display_ui.lo edges.lo \ exclusion.lo exclusion_ui.lo extendedDisplay.lo fileio.lo \ ggobi-API.lo ggobi.lo GGobiAppClass.lo ggobiClass.lo \ identify.lo identify_ui.lo impute.lo impute_ui.lo io.lo \ jitter.lo jitter_ui.lo limits.lo lineedit.lo lineedit_ui.lo \ main_ui.lo make_ggobi.lo marshal.lo menus.lo missing.lo \ movepts.lo movepts_ui.lo noop-toggle.lo p1d.lo p1d_ui.lo \ parcoords.lo parcoordsClass.lo parcoords_ui.lo plugin.lo \ pipeline.lo ppcorr_ui.lo print.lo read_init.lo read_color.lo \ read_csv.lo read_xml.lo scale_api.lo scale_drag.lo scale_ui.lo \ scatmat.lo scatmatClass.lo scatmat_ui.lo scatterplot.lo \ scatterplotClass.lo scatterplot_ui.lo schemes.lo schemes_ui.lo \ sphere.lo sphere_ui.lo splash.lo splot.lo sp_plot.lo \ sp_plot_axes.lo sp_plot_edges.lo subset.lo subset_ui.lo svd.lo \ texture.lo timeplot.lo time_ui.lo tour.lo tour1d.lo \ tour1d_pp.lo tour1d_pp_ui.lo tour1d_ui.lo tour2d.lo tour2d3.lo \ tour2d3_ui.lo tour2d_pp.lo tour2d_pp_ui.lo tour2d_ui.lo \ tourcorr.lo tourcorr_ui.lo tour_pp.lo transform.lo \ transform_ui.lo tsdisplay.lo tsPlot.lo utils.lo utils_gdk.lo \ utils_pango.lo utils_ui.lo varchange.lo varcircles.lo \ varpanel_ui.lo vartable.lo vartable_nbook.lo vartable_ui.lo \ vector.lo win32_draw.lo writedata_ui.lo write_csv.lo \ write_xml.lo wvis.lo wvis_ui.lo xlines.lo xyplot.lo \ xyplot_ui.lo $(am__objects_2) am_libggobi_la_OBJECTS = $(am__objects_3) $(am__objects_2) libggobi_la_OBJECTS = $(am_libggobi_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libggobi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libggobi_la_LDFLAGS) $(LDFLAGS) -o $@ am_ggobi_OBJECTS = ggobiMain.$(OBJEXT) ggobi_OBJECTS = $(am_ggobi_OBJECTS) ggobi_DEPENDENCIES = libggobi.la ggobi_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(ggobi_LDFLAGS) $(LDFLAGS) -o $@ 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@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/GGobiAppClass.Plo \ ./$(DEPDIR)/array.Plo ./$(DEPDIR)/ash1d.Plo \ ./$(DEPDIR)/barchart.Plo ./$(DEPDIR)/barchartClass.Plo \ ./$(DEPDIR)/barchart_ui.Plo ./$(DEPDIR)/brush.Plo \ ./$(DEPDIR)/brush_api.Plo ./$(DEPDIR)/brush_bins.Plo \ ./$(DEPDIR)/brush_init.Plo ./$(DEPDIR)/brush_link.Plo \ ./$(DEPDIR)/brush_ui.Plo ./$(DEPDIR)/color.Plo \ ./$(DEPDIR)/color_ui.Plo ./$(DEPDIR)/cpanel.Plo \ ./$(DEPDIR)/display.Plo ./$(DEPDIR)/display_tree.Plo \ ./$(DEPDIR)/display_ui.Plo ./$(DEPDIR)/edges.Plo \ ./$(DEPDIR)/exclusion.Plo ./$(DEPDIR)/exclusion_ui.Plo \ ./$(DEPDIR)/extendedDisplay.Plo ./$(DEPDIR)/fileio.Plo \ ./$(DEPDIR)/ggobi-API.Plo ./$(DEPDIR)/ggobi.Plo \ ./$(DEPDIR)/ggobiClass.Plo ./$(DEPDIR)/ggobiMain.Po \ ./$(DEPDIR)/identify.Plo ./$(DEPDIR)/identify_ui.Plo \ ./$(DEPDIR)/impute.Plo ./$(DEPDIR)/impute_ui.Plo \ ./$(DEPDIR)/io.Plo ./$(DEPDIR)/jitter.Plo \ ./$(DEPDIR)/jitter_ui.Plo ./$(DEPDIR)/limits.Plo \ ./$(DEPDIR)/lineedit.Plo ./$(DEPDIR)/lineedit_ui.Plo \ ./$(DEPDIR)/main_ui.Plo ./$(DEPDIR)/make_ggobi.Plo \ ./$(DEPDIR)/marshal.Plo ./$(DEPDIR)/menus.Plo \ ./$(DEPDIR)/missing.Plo ./$(DEPDIR)/movepts.Plo \ ./$(DEPDIR)/movepts_ui.Plo ./$(DEPDIR)/noop-toggle.Plo \ ./$(DEPDIR)/p1d.Plo ./$(DEPDIR)/p1d_ui.Plo \ ./$(DEPDIR)/parcoords.Plo ./$(DEPDIR)/parcoordsClass.Plo \ ./$(DEPDIR)/parcoords_ui.Plo ./$(DEPDIR)/pipeline.Plo \ ./$(DEPDIR)/plugin.Plo ./$(DEPDIR)/ppcorr_ui.Plo \ ./$(DEPDIR)/print.Plo ./$(DEPDIR)/read_color.Plo \ ./$(DEPDIR)/read_csv.Plo ./$(DEPDIR)/read_init.Plo \ ./$(DEPDIR)/read_xml.Plo ./$(DEPDIR)/scale_api.Plo \ ./$(DEPDIR)/scale_drag.Plo ./$(DEPDIR)/scale_ui.Plo \ ./$(DEPDIR)/scatmat.Plo ./$(DEPDIR)/scatmatClass.Plo \ ./$(DEPDIR)/scatmat_ui.Plo ./$(DEPDIR)/scatterplot.Plo \ ./$(DEPDIR)/scatterplotClass.Plo \ ./$(DEPDIR)/scatterplot_ui.Plo ./$(DEPDIR)/schemes.Plo \ ./$(DEPDIR)/schemes_ui.Plo ./$(DEPDIR)/sp_plot.Plo \ ./$(DEPDIR)/sp_plot_axes.Plo ./$(DEPDIR)/sp_plot_edges.Plo \ ./$(DEPDIR)/sphere.Plo ./$(DEPDIR)/sphere_ui.Plo \ ./$(DEPDIR)/splash.Plo ./$(DEPDIR)/splot.Plo \ ./$(DEPDIR)/subset.Plo ./$(DEPDIR)/subset_ui.Plo \ ./$(DEPDIR)/svd.Plo ./$(DEPDIR)/texture.Plo \ ./$(DEPDIR)/time_ui.Plo ./$(DEPDIR)/timeplot.Plo \ ./$(DEPDIR)/tour.Plo ./$(DEPDIR)/tour1d.Plo \ ./$(DEPDIR)/tour1d_pp.Plo ./$(DEPDIR)/tour1d_pp_ui.Plo \ ./$(DEPDIR)/tour1d_ui.Plo ./$(DEPDIR)/tour2d.Plo \ ./$(DEPDIR)/tour2d3.Plo ./$(DEPDIR)/tour2d3_ui.Plo \ ./$(DEPDIR)/tour2d_pp.Plo ./$(DEPDIR)/tour2d_pp_ui.Plo \ ./$(DEPDIR)/tour2d_ui.Plo ./$(DEPDIR)/tour_pp.Plo \ ./$(DEPDIR)/tourcorr.Plo ./$(DEPDIR)/tourcorr_ui.Plo \ ./$(DEPDIR)/transform.Plo ./$(DEPDIR)/transform_ui.Plo \ ./$(DEPDIR)/tsPlot.Plo ./$(DEPDIR)/tsdisplay.Plo \ ./$(DEPDIR)/utils.Plo ./$(DEPDIR)/utils_gdk.Plo \ ./$(DEPDIR)/utils_pango.Plo ./$(DEPDIR)/utils_ui.Plo \ ./$(DEPDIR)/varchange.Plo ./$(DEPDIR)/varcircles.Plo \ ./$(DEPDIR)/varpanel_ui.Plo ./$(DEPDIR)/vartable.Plo \ ./$(DEPDIR)/vartable_nbook.Plo ./$(DEPDIR)/vartable_ui.Plo \ ./$(DEPDIR)/vector.Plo ./$(DEPDIR)/win32_draw.Plo \ ./$(DEPDIR)/write_csv.Plo ./$(DEPDIR)/write_xml.Plo \ ./$(DEPDIR)/writedata_ui.Plo ./$(DEPDIR)/wvis.Plo \ ./$(DEPDIR)/wvis_ui.Plo ./$(DEPDIR)/xlines.Plo \ ./$(DEPDIR)/xyplot.Plo ./$(DEPDIR)/xyplot_ui.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=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 = $(libggobi_la_SOURCES) $(ggobi_SOURCES) DIST_SOURCES = $(libggobi_la_SOURCES) $(ggobi_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(pkginclude_HEADERS) 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)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIBTEX = @BIBTEX@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GGOBI_RELEASE_DATE = @GGOBI_RELEASE_DATE@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOB2 = @GOB2@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MICRO_VERSION = @MICRO_VERSION@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PDFLATEX = @PDFLATEX@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PLUGIN_DIRS = @PLUGIN_DIRS@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SRC_DEBUG = @SRC_DEBUG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localedir_c = @localedir_c@ localedir_c_make = @localedir_c_make@ 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@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = libggobi.la libggobi_la_GOBS = data.gob renderer.gob renderer-factory.gob renderer-cairo.gob libggobi_la_GOBSOURCES = $(libggobi_la_GOBS:%.gob=ggobi-%.c) libggobi_la_GOBHEADERS = $(libggobi_la_GOBS:%.gob=ggobi-%.h) libggobi_la_GOBOBJECTS = $(libggobi_la_GOBS:%.gob=ggobi-%.lo) libggobi_la_GOBSTAMPS = $(libggobi_la_GOBS:%.gob=.%.gob.stamp) libggobi_la_LDFLAGS = @GTK_LIBS@ @GMODULE_LIBS@ @LIBXML_LIBS@ -lm \ $(am__append_2) libggobi_la_BUILT = array.c ash1d.c barchart.c barchartClass.c \ barchart_ui.c brush.c brush_api.c brush_bins.c brush_init.c brush_link.c \ brush_ui.c color.c color_ui.c cpanel.c display.c display_tree.c display_ui.c \ edges.c exclusion.c exclusion_ui.c extendedDisplay.c fileio.c ggobi-API.c \ ggobi.c GGobiAppClass.c ggobiClass.c identify.c identify_ui.c \ impute.c impute_ui.c io.c jitter.c jitter_ui.c limits.c lineedit.c \ lineedit_ui.c main_ui.c make_ggobi.c marshal.c menus.c missing.c \ movepts.c movepts_ui.c noop-toggle.c p1d.c p1d_ui.c parcoords.c \ parcoordsClass.c parcoords_ui.c plugin.c pipeline.c ppcorr_ui.c print.c \ read_init.c read_color.c read_csv.c read_xml.c scale_api.c scale_drag.c \ scale_ui.c scatmat.c scatmatClass.c scatmat_ui.c scatterplot.c \ scatterplotClass.c scatterplot_ui.c schemes.c schemes_ui.c sphere.c \ sphere_ui.c splash.c splot.c sp_plot.c sp_plot_axes.c sp_plot_edges.c \ subset.c subset_ui.c svd.c texture.c timeplot.c time_ui.c tour.c tour1d.c \ tour1d_pp.c tour1d_pp_ui.c tour1d_ui.c tour2d.c tour2d3.c tour2d3_ui.c \ tour2d_pp.c tour2d_pp_ui.c tour2d_ui.c tourcorr.c tourcorr_ui.c tour_pp.c \ transform.c transform_ui.c tsdisplay.c tsPlot.c utils.c utils_gdk.c \ utils_pango.c utils_ui.c varchange.c varcircles.c varpanel_ui.c vartable.c \ vartable_nbook.c vartable_ui.c vector.c win32_draw.c writedata_ui.c \ write_csv.c write_xml.c wvis.c wvis_ui.c xlines.c xyplot.c \ xyplot_ui.c $(libggobi_la_GOBSOURCES) libggobi_la_SOURCES = $(libggobi_la_BUILT) $(libggobi_la_GOBSTAMPS) libggobi_la_LIBADD = $(libggobi_la_GOBOBJECTS) libggobi_la_DEPENDENCIES = $(libggobi_la_GOBOBJECTS) $(am__append_1) pkginclude_HEADERS = GGobiAPI.h ggobiClass.h tour1d_pp.h GGobiApp.h \ noop-toggle.h tour2d_pp.h GGobiEvents.h parcoordsClass.h tour_pp.h \ barchartDisplay.h plugin.h tsPlot.h brushing.h print.h tsdisplay.h \ colorscheme.h read_csv.h types.h config.h read_init.h vars.h cpanel.h \ read_xml.h varseldata.h defines.h scatmatClass.h vartable.h display.h \ scatterplotClass.h display_tree.h splash.h write_xml.h ggobi-intl.h \ externs.h splot.h writedata.h fileio.h testEvents.h ggobi.h tour.h \ $(libggobi_la_GOBHEADERS) GGStructSizes.c marshal.h BUILT_SOURCES = $(libggobi_la_GOBSTAMPS) $(libggobi_la_GOBSOURCES) $(libggobi_la_GOBHEADERS) MAINTAINERCLEANFILES = $(BUILT_SOURCES) ggobi_SOURCES = ggobiMain.c ggobi_LDADD = libggobi.la INCLUDES = @SRC_DEBUG@ @GTK_CFLAGS@ @GMODULE_CFLAGS@ @LIBXML_CFLAGS@ EXTRA_DIST = $(libggobi_la_GOBS) @OS_WIN32_TRUE@ggobi_LDFLAGS = -mwindows -s all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(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 src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/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: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 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 \ || test -f $$p1 \ ; 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) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libggobi.la: $(libggobi_la_OBJECTS) $(libggobi_la_DEPENDENCIES) $(EXTRA_libggobi_la_DEPENDENCIES) $(AM_V_CCLD)$(libggobi_la_LINK) -rpath $(libdir) $(libggobi_la_OBJECTS) $(libggobi_la_LIBADD) $(LIBS) ggobi$(EXEEXT): $(ggobi_OBJECTS) $(ggobi_DEPENDENCIES) $(EXTRA_ggobi_DEPENDENCIES) @rm -f ggobi$(EXEEXT) $(AM_V_CCLD)$(ggobi_LINK) $(ggobi_OBJECTS) $(ggobi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GGobiAppClass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ash1d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/barchart.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/barchartClass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/barchart_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush_api.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush_bins.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush_link.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpanel.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_tree.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edges.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exclusion.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exclusion_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extendedDisplay.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ggobi-API.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ggobi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ggobiClass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ggobiMain.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/identify.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/identify_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impute.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/impute_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jitter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jitter_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lineedit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lineedit_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_ggobi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/marshal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menus.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/missing.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movepts.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movepts_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/noop-toggle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p1d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/p1d_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parcoords.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parcoordsClass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parcoords_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipeline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppcorr_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_color.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_csv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_init.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_xml.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scale_api.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scale_drag.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scale_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatmat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatmatClass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatmat_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatterplot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatterplotClass.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatterplot_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schemes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schemes_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sp_plot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sp_plot_axes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sp_plot_edges.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sphere_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splash.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/splot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subset.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subset_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/svd.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texture.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeplot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour1d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour1d_pp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour1d_pp_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour1d_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour2d3.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour2d3_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour2d_pp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour2d_pp_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour2d_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tour_pp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tourcorr.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tourcorr_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsPlot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsdisplay.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils_gdk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils_pango.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varchange.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varcircles.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varpanel_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vartable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vartable_nbook.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vartable_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32_draw.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_csv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_xml.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writedata_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wvis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wvis_ui.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xlines.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xyplot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xyplot_ui.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ 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) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pkgincludeHEADERS: $(pkginclude_HEADERS) @$(NORMAL_INSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)" || 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_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \ done uninstall-pkgincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgincludedir)'; $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) config.h install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/GGobiAppClass.Plo -rm -f ./$(DEPDIR)/array.Plo -rm -f ./$(DEPDIR)/ash1d.Plo -rm -f ./$(DEPDIR)/barchart.Plo -rm -f ./$(DEPDIR)/barchartClass.Plo -rm -f ./$(DEPDIR)/barchart_ui.Plo -rm -f ./$(DEPDIR)/brush.Plo -rm -f ./$(DEPDIR)/brush_api.Plo -rm -f ./$(DEPDIR)/brush_bins.Plo -rm -f ./$(DEPDIR)/brush_init.Plo -rm -f ./$(DEPDIR)/brush_link.Plo -rm -f ./$(DEPDIR)/brush_ui.Plo -rm -f ./$(DEPDIR)/color.Plo -rm -f ./$(DEPDIR)/color_ui.Plo -rm -f ./$(DEPDIR)/cpanel.Plo -rm -f ./$(DEPDIR)/display.Plo -rm -f ./$(DEPDIR)/display_tree.Plo -rm -f ./$(DEPDIR)/display_ui.Plo -rm -f ./$(DEPDIR)/edges.Plo -rm -f ./$(DEPDIR)/exclusion.Plo -rm -f ./$(DEPDIR)/exclusion_ui.Plo -rm -f ./$(DEPDIR)/extendedDisplay.Plo -rm -f ./$(DEPDIR)/fileio.Plo -rm -f ./$(DEPDIR)/ggobi-API.Plo -rm -f ./$(DEPDIR)/ggobi.Plo -rm -f ./$(DEPDIR)/ggobiClass.Plo -rm -f ./$(DEPDIR)/ggobiMain.Po -rm -f ./$(DEPDIR)/identify.Plo -rm -f ./$(DEPDIR)/identify_ui.Plo -rm -f ./$(DEPDIR)/impute.Plo -rm -f ./$(DEPDIR)/impute_ui.Plo -rm -f ./$(DEPDIR)/io.Plo -rm -f ./$(DEPDIR)/jitter.Plo -rm -f ./$(DEPDIR)/jitter_ui.Plo -rm -f ./$(DEPDIR)/limits.Plo -rm -f ./$(DEPDIR)/lineedit.Plo -rm -f ./$(DEPDIR)/lineedit_ui.Plo -rm -f ./$(DEPDIR)/main_ui.Plo -rm -f ./$(DEPDIR)/make_ggobi.Plo -rm -f ./$(DEPDIR)/marshal.Plo -rm -f ./$(DEPDIR)/menus.Plo -rm -f ./$(DEPDIR)/missing.Plo -rm -f ./$(DEPDIR)/movepts.Plo -rm -f ./$(DEPDIR)/movepts_ui.Plo -rm -f ./$(DEPDIR)/noop-toggle.Plo -rm -f ./$(DEPDIR)/p1d.Plo -rm -f ./$(DEPDIR)/p1d_ui.Plo -rm -f ./$(DEPDIR)/parcoords.Plo -rm -f ./$(DEPDIR)/parcoordsClass.Plo -rm -f ./$(DEPDIR)/parcoords_ui.Plo -rm -f ./$(DEPDIR)/pipeline.Plo -rm -f ./$(DEPDIR)/plugin.Plo -rm -f ./$(DEPDIR)/ppcorr_ui.Plo -rm -f ./$(DEPDIR)/print.Plo -rm -f ./$(DEPDIR)/read_color.Plo -rm -f ./$(DEPDIR)/read_csv.Plo -rm -f ./$(DEPDIR)/read_init.Plo -rm -f ./$(DEPDIR)/read_xml.Plo -rm -f ./$(DEPDIR)/scale_api.Plo -rm -f ./$(DEPDIR)/scale_drag.Plo -rm -f ./$(DEPDIR)/scale_ui.Plo -rm -f ./$(DEPDIR)/scatmat.Plo -rm -f ./$(DEPDIR)/scatmatClass.Plo -rm -f ./$(DEPDIR)/scatmat_ui.Plo -rm -f ./$(DEPDIR)/scatterplot.Plo -rm -f ./$(DEPDIR)/scatterplotClass.Plo -rm -f ./$(DEPDIR)/scatterplot_ui.Plo -rm -f ./$(DEPDIR)/schemes.Plo -rm -f ./$(DEPDIR)/schemes_ui.Plo -rm -f ./$(DEPDIR)/sp_plot.Plo -rm -f ./$(DEPDIR)/sp_plot_axes.Plo -rm -f ./$(DEPDIR)/sp_plot_edges.Plo -rm -f ./$(DEPDIR)/sphere.Plo -rm -f ./$(DEPDIR)/sphere_ui.Plo -rm -f ./$(DEPDIR)/splash.Plo -rm -f ./$(DEPDIR)/splot.Plo -rm -f ./$(DEPDIR)/subset.Plo -rm -f ./$(DEPDIR)/subset_ui.Plo -rm -f ./$(DEPDIR)/svd.Plo -rm -f ./$(DEPDIR)/texture.Plo -rm -f ./$(DEPDIR)/time_ui.Plo -rm -f ./$(DEPDIR)/timeplot.Plo -rm -f ./$(DEPDIR)/tour.Plo -rm -f ./$(DEPDIR)/tour1d.Plo -rm -f ./$(DEPDIR)/tour1d_pp.Plo -rm -f ./$(DEPDIR)/tour1d_pp_ui.Plo -rm -f ./$(DEPDIR)/tour1d_ui.Plo -rm -f ./$(DEPDIR)/tour2d.Plo -rm -f ./$(DEPDIR)/tour2d3.Plo -rm -f ./$(DEPDIR)/tour2d3_ui.Plo -rm -f ./$(DEPDIR)/tour2d_pp.Plo -rm -f ./$(DEPDIR)/tour2d_pp_ui.Plo -rm -f ./$(DEPDIR)/tour2d_ui.Plo -rm -f ./$(DEPDIR)/tour_pp.Plo -rm -f ./$(DEPDIR)/tourcorr.Plo -rm -f ./$(DEPDIR)/tourcorr_ui.Plo -rm -f ./$(DEPDIR)/transform.Plo -rm -f ./$(DEPDIR)/transform_ui.Plo -rm -f ./$(DEPDIR)/tsPlot.Plo -rm -f ./$(DEPDIR)/tsdisplay.Plo -rm -f ./$(DEPDIR)/utils.Plo -rm -f ./$(DEPDIR)/utils_gdk.Plo -rm -f ./$(DEPDIR)/utils_pango.Plo -rm -f ./$(DEPDIR)/utils_ui.Plo -rm -f ./$(DEPDIR)/varchange.Plo -rm -f ./$(DEPDIR)/varcircles.Plo -rm -f ./$(DEPDIR)/varpanel_ui.Plo -rm -f ./$(DEPDIR)/vartable.Plo -rm -f ./$(DEPDIR)/vartable_nbook.Plo -rm -f ./$(DEPDIR)/vartable_ui.Plo -rm -f ./$(DEPDIR)/vector.Plo -rm -f ./$(DEPDIR)/win32_draw.Plo -rm -f ./$(DEPDIR)/write_csv.Plo -rm -f ./$(DEPDIR)/write_xml.Plo -rm -f ./$(DEPDIR)/writedata_ui.Plo -rm -f ./$(DEPDIR)/wvis.Plo -rm -f ./$(DEPDIR)/wvis_ui.Plo -rm -f ./$(DEPDIR)/xlines.Plo -rm -f ./$(DEPDIR)/xyplot.Plo -rm -f ./$(DEPDIR)/xyplot_ui.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pkgincludeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES 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)/GGobiAppClass.Plo -rm -f ./$(DEPDIR)/array.Plo -rm -f ./$(DEPDIR)/ash1d.Plo -rm -f ./$(DEPDIR)/barchart.Plo -rm -f ./$(DEPDIR)/barchartClass.Plo -rm -f ./$(DEPDIR)/barchart_ui.Plo -rm -f ./$(DEPDIR)/brush.Plo -rm -f ./$(DEPDIR)/brush_api.Plo -rm -f ./$(DEPDIR)/brush_bins.Plo -rm -f ./$(DEPDIR)/brush_init.Plo -rm -f ./$(DEPDIR)/brush_link.Plo -rm -f ./$(DEPDIR)/brush_ui.Plo -rm -f ./$(DEPDIR)/color.Plo -rm -f ./$(DEPDIR)/color_ui.Plo -rm -f ./$(DEPDIR)/cpanel.Plo -rm -f ./$(DEPDIR)/display.Plo -rm -f ./$(DEPDIR)/display_tree.Plo -rm -f ./$(DEPDIR)/display_ui.Plo -rm -f ./$(DEPDIR)/edges.Plo -rm -f ./$(DEPDIR)/exclusion.Plo -rm -f ./$(DEPDIR)/exclusion_ui.Plo -rm -f ./$(DEPDIR)/extendedDisplay.Plo -rm -f ./$(DEPDIR)/fileio.Plo -rm -f ./$(DEPDIR)/ggobi-API.Plo -rm -f ./$(DEPDIR)/ggobi.Plo -rm -f ./$(DEPDIR)/ggobiClass.Plo -rm -f ./$(DEPDIR)/ggobiMain.Po -rm -f ./$(DEPDIR)/identify.Plo -rm -f ./$(DEPDIR)/identify_ui.Plo -rm -f ./$(DEPDIR)/impute.Plo -rm -f ./$(DEPDIR)/impute_ui.Plo -rm -f ./$(DEPDIR)/io.Plo -rm -f ./$(DEPDIR)/jitter.Plo -rm -f ./$(DEPDIR)/jitter_ui.Plo -rm -f ./$(DEPDIR)/limits.Plo -rm -f ./$(DEPDIR)/lineedit.Plo -rm -f ./$(DEPDIR)/lineedit_ui.Plo -rm -f ./$(DEPDIR)/main_ui.Plo -rm -f ./$(DEPDIR)/make_ggobi.Plo -rm -f ./$(DEPDIR)/marshal.Plo -rm -f ./$(DEPDIR)/menus.Plo -rm -f ./$(DEPDIR)/missing.Plo -rm -f ./$(DEPDIR)/movepts.Plo -rm -f ./$(DEPDIR)/movepts_ui.Plo -rm -f ./$(DEPDIR)/noop-toggle.Plo -rm -f ./$(DEPDIR)/p1d.Plo -rm -f ./$(DEPDIR)/p1d_ui.Plo -rm -f ./$(DEPDIR)/parcoords.Plo -rm -f ./$(DEPDIR)/parcoordsClass.Plo -rm -f ./$(DEPDIR)/parcoords_ui.Plo -rm -f ./$(DEPDIR)/pipeline.Plo -rm -f ./$(DEPDIR)/plugin.Plo -rm -f ./$(DEPDIR)/ppcorr_ui.Plo -rm -f ./$(DEPDIR)/print.Plo -rm -f ./$(DEPDIR)/read_color.Plo -rm -f ./$(DEPDIR)/read_csv.Plo -rm -f ./$(DEPDIR)/read_init.Plo -rm -f ./$(DEPDIR)/read_xml.Plo -rm -f ./$(DEPDIR)/scale_api.Plo -rm -f ./$(DEPDIR)/scale_drag.Plo -rm -f ./$(DEPDIR)/scale_ui.Plo -rm -f ./$(DEPDIR)/scatmat.Plo -rm -f ./$(DEPDIR)/scatmatClass.Plo -rm -f ./$(DEPDIR)/scatmat_ui.Plo -rm -f ./$(DEPDIR)/scatterplot.Plo -rm -f ./$(DEPDIR)/scatterplotClass.Plo -rm -f ./$(DEPDIR)/scatterplot_ui.Plo -rm -f ./$(DEPDIR)/schemes.Plo -rm -f ./$(DEPDIR)/schemes_ui.Plo -rm -f ./$(DEPDIR)/sp_plot.Plo -rm -f ./$(DEPDIR)/sp_plot_axes.Plo -rm -f ./$(DEPDIR)/sp_plot_edges.Plo -rm -f ./$(DEPDIR)/sphere.Plo -rm -f ./$(DEPDIR)/sphere_ui.Plo -rm -f ./$(DEPDIR)/splash.Plo -rm -f ./$(DEPDIR)/splot.Plo -rm -f ./$(DEPDIR)/subset.Plo -rm -f ./$(DEPDIR)/subset_ui.Plo -rm -f ./$(DEPDIR)/svd.Plo -rm -f ./$(DEPDIR)/texture.Plo -rm -f ./$(DEPDIR)/time_ui.Plo -rm -f ./$(DEPDIR)/timeplot.Plo -rm -f ./$(DEPDIR)/tour.Plo -rm -f ./$(DEPDIR)/tour1d.Plo -rm -f ./$(DEPDIR)/tour1d_pp.Plo -rm -f ./$(DEPDIR)/tour1d_pp_ui.Plo -rm -f ./$(DEPDIR)/tour1d_ui.Plo -rm -f ./$(DEPDIR)/tour2d.Plo -rm -f ./$(DEPDIR)/tour2d3.Plo -rm -f ./$(DEPDIR)/tour2d3_ui.Plo -rm -f ./$(DEPDIR)/tour2d_pp.Plo -rm -f ./$(DEPDIR)/tour2d_pp_ui.Plo -rm -f ./$(DEPDIR)/tour2d_ui.Plo -rm -f ./$(DEPDIR)/tour_pp.Plo -rm -f ./$(DEPDIR)/tourcorr.Plo -rm -f ./$(DEPDIR)/tourcorr_ui.Plo -rm -f ./$(DEPDIR)/transform.Plo -rm -f ./$(DEPDIR)/transform_ui.Plo -rm -f ./$(DEPDIR)/tsPlot.Plo -rm -f ./$(DEPDIR)/tsdisplay.Plo -rm -f ./$(DEPDIR)/utils.Plo -rm -f ./$(DEPDIR)/utils_gdk.Plo -rm -f ./$(DEPDIR)/utils_pango.Plo -rm -f ./$(DEPDIR)/utils_ui.Plo -rm -f ./$(DEPDIR)/varchange.Plo -rm -f ./$(DEPDIR)/varcircles.Plo -rm -f ./$(DEPDIR)/varpanel_ui.Plo -rm -f ./$(DEPDIR)/vartable.Plo -rm -f ./$(DEPDIR)/vartable_nbook.Plo -rm -f ./$(DEPDIR)/vartable_ui.Plo -rm -f ./$(DEPDIR)/vector.Plo -rm -f ./$(DEPDIR)/win32_draw.Plo -rm -f ./$(DEPDIR)/write_csv.Plo -rm -f ./$(DEPDIR)/write_xml.Plo -rm -f ./$(DEPDIR)/writedata_ui.Plo -rm -f ./$(DEPDIR)/wvis.Plo -rm -f ./$(DEPDIR)/wvis_ui.Plo -rm -f ./$(DEPDIR)/xlines.Plo -rm -f ./$(DEPDIR)/xyplot.Plo -rm -f ./$(DEPDIR)/xyplot_ui.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ uninstall-pkgincludeHEADERS .MAKE: all check install install-am install-exec install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-libtool 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-libLTLIBRARIES \ install-man install-pdf install-pdf-am \ install-pkgincludeHEADERS install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ uninstall-pkgincludeHEADERS .PRECIOUS: Makefile #$(libggobi_la_GOBSOURCES): $(libggobi_la_GOBSOURCES:ggobi-%.c=%.gob) # @GOB2@ --no-touch $(patsubst ggobi-%.c,%.gob,$@) .%.gob.stamp: %.gob @GOB2@ --no-touch --no-private-header $< @touch $@ # The .def file is autogenerated now from all symbols, until we clean up # ggobi to the point where we can actually maintain the .def file. libggobi.def: $(libggobi_la_BUILT:%.c=.libs/%.o) echo EXPORTS > $@ nm -g --defined-only $(libggobi_la_BUILT:%.c=.libs/%.o) > tmp sed -n '/^........ [T|C] _/s/^........ [T|C] _/ /p' tmp >> $@ rm tmp # 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: ggobi-2.1.12/src/win32_draw.c0000644000175000017500000003460114651527764011304 /*-- win32_draw.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #include "scatterplotClass.h" #include "parcoordsClass.h" #include "tsdisplay.h" /* * Batched drawing: I may need to continue drawing this * way to achieve adequate speed in Windows. * * ... But I see I'm only able to do batched drawing for * plusses, x'es and points. That's not very interesting. */ #ifdef WIN32 static void drawing_arrays_alloc (splotd *sp, GGobiData *d, ggobid *gg); static void build_circle (icoords *, gint, arcd *, gint, gshort); static void build_plus (icoords *, gint, GdkSegment *, gint, gshort); static void build_rect (icoords *, gint, rectd *, gint, gshort); static void build_x (icoords *, gint, GdkSegment *, gint, gshort); static void build_whisker_segs (gint j, gint *nwhisker_segs, splotd *sp); static void build_ash_segs (gint, gint *nsegs, splotd *sp); /* * ... just noticed these: should they become part of the splotd * instead of sitting here as statics? I think so. * static gint maxn = 0; static GdkPoint *points; static GdkSegment *segs; static GdkSegment *whisker_segs; static GdkSegment *ash_segs; static rectd *open_rects; static rectd *filled_rects; static arcd *open_arcs; static arcd *filled_arcs; */ static void drawing_arrays_alloc (splotd *sp, GGobiData *d, ggobid *gg) { gint n = d->nrows; if (sp->win32.npoints == 0) { sp->win32.points = (GdkPoint *) g_malloc (n * sizeof (GdkPoint)); sp->win32.segs = (GdkSegment *) g_malloc (2 * n * sizeof (GdkSegment)); sp->win32.whisker_segs = (GdkSegment *) g_malloc (2*n*sizeof (GdkSegment)); sp->win32.ash_segs = (GdkSegment *) g_malloc (n * sizeof (GdkSegment)); sp->win32.open_rects = (rectd *) g_malloc (n * sizeof (rectd)); sp->win32.filled_rects = (rectd *) g_malloc (n * sizeof (rectd)); sp->win32.open_arcs = (arcd *) g_malloc (n * sizeof (arcd)); sp->win32.filled_arcs = (arcd *) g_malloc (n * sizeof (arcd)); } else { sp->win32.points = (GdkPoint *) g_realloc (sp->win32.points, n * sizeof (GdkPoint)); sp->win32.segs = (GdkSegment *) g_realloc (sp->win32.segs, 2 * n * sizeof (GdkSegment)); sp->win32.whisker_segs = (GdkSegment *) g_realloc (sp->win32.whisker_segs, 2 * n * sizeof (GdkSegment)); sp->win32.ash_segs = (GdkSegment *) g_realloc (sp->win32.ash_segs, n * sizeof (GdkSegment)); sp->win32.open_rects = (rectd *) g_realloc (sp->win32.open_rects, n * sizeof (rectd)); sp->win32.filled_rects = (rectd *) g_realloc (sp->win32.filled_rects, n * sizeof (rectd)); sp->win32.open_arcs = (arcd *) g_realloc (sp->win32.open_arcs, n * sizeof (arcd)); sp->win32.filled_arcs = (arcd *) g_realloc (sp->win32.filled_arcs, n * sizeof (arcd)); } sp->win32.npoints = n; } void win32_drawing_arrays_free (splotd *sp){ if (sp->win32.npoints) { g_free ((gpointer) sp->win32.points); g_free ((gpointer) sp->win32.segs); g_free ((gpointer) sp->win32.whisker_segs); g_free ((gpointer) sp->win32.ash_segs); g_free ((gpointer) sp->win32.open_rects); g_free ((gpointer) sp->win32.filled_rects); g_free ((gpointer) sp->win32.open_arcs); g_free ((gpointer) sp->win32.filled_arcs); } } void win32_draw_arcs (GdkDrawable *drawable, GdkGC *gc, gint filled, arcd *arcs, gint narcs) { gint i; for (i=0; iwin32->segs.len < nplus+1); segp = (append) ? (GdkSegment *) g_malloc (sizeof (GdkSegment)) : (GdkSegment *) &sp->win32->segs.data[nplus]; segp->x1 = x - size; segp->x2 = x + size; segp->y1 = segp->y2 = (gshort) pos[nrow].y; if (append) g_array_append_val (sp->win32->segs, segp); nplus++; append = (sp->win32->segs.len < nplus+1); segp = (append) ? (GdkSegment *) g_malloc (sizeof (GdkSegment)) : (GdkSegment *) &sp->win32->segs.data[nplus]; segp->x1 = segp->x2 = x; segp->y1 = (gshort) pos[nrow].y - size; segp->y2 = (gshort) pos[nrow].y + size; if (append) g_array_append_val (sp->win32->segs, segp); */ segv[nplus].x1 = x - size; segv[nplus].x2 = x + size; segv[nplus].y1 = segv[nplus].y2 = (gshort) pos[nrow].y; nplus++; segv[nplus].x1 = segv[nplus].x2 = x; segv[nplus].y1 = (gshort) pos[nrow].y - size; segv[nplus].y2 = (gshort) pos[nrow].y + size; } void build_x (icoords *pos, gint nrow, GdkSegment *segv, gint nx, gshort size) { gshort x; x = (gshort) pos[nrow].x; segv[nx].x1 = x - size; segv[nx].x2 = x + size; segv[nx].y1 = (gshort) pos[nrow].y - size; segv[nx].y2 = (gshort) pos[nrow].y + size; nx++; segv[nx].x1 = x + size; segv[nx].x2 = x - size; segv[nx].y1 = pos[nrow].y - size; segv[nx].y2 = pos[nrow].y + size; } void build_circle (icoords *pos, gint nrow, arcd *circv, gint ncirc, gshort size) { circv[ncirc].x = (gushort) (pos[nrow].x - size); circv[ncirc].y = (gushort) (pos[nrow].y - size); circv[ncirc].width = circv[ncirc].height = 2*size; } void build_rect (icoords *pos, gint nrow, rectd * rectv, gint nrect, gshort size) { rectv[nrect].x = (gushort) (pos[nrow].x - size); rectv[nrect].y = (gushort) (pos[nrow].y - size); rectv[nrect].width = rectv[nrect].height = 2*(size+1); } void build_point (icoords *pos, gint nrow, GdkPoint * pointv, gint npt) { pointv[npt].x = (gushort) (pos[nrow].x); pointv[npt].y = (gushort) (pos[nrow].y); } void build_glyph (glyphd *gl, icoords *xypos, gint jpos, GdkPoint *pointv, gint *np, GdkSegment *segv, gint *ns, rectd *openrectv, gint *nr_open, rectd *filledrectv, gint *nr_filled, arcd *openarcv, gint *nc_open, arcd *filledarcv, gint *nc_filled) { gshort size, type; size = gl->size + 1; type = gl->type; switch (type) { case PLUS: build_plus (xypos, jpos, segv, *ns, size); *ns = *ns+2; break; case X: build_x (xypos, jpos, segv, *ns, size); *ns = *ns+2; break; case OR: build_rect (xypos, jpos, openrectv, *nr_open, size); (*nr_open)++; break; case FR: build_rect (xypos, jpos, filledrectv, *nr_filled, size); (*nr_filled)++; break; case OC: build_circle (xypos, jpos, openarcv, *nc_open, size); (*nc_open)++; break; case FC: build_circle (xypos, jpos, filledarcv, *nc_filled, size); (*nc_filled)++; break; case DOT_GLYPH: build_point (xypos, jpos, pointv, *np); (*np)++; break; case UNKNOWN_GLYPH: break; default: g_printerr ("build_glyph: impossible glyph type %d\n", type); } } void build_whisker_segs (gint j, gint *nwhisker_segs, splotd *sp) { displayd *display = (displayd *) sp->displayptr; gint n; if (GGOBI_IS_PAR_COORDS_DISPLAY(display)) { n = 2*j; sp->win32.whisker_segs[*nwhisker_segs].x1 = sp->whiskers[n].x1; sp->win32.whisker_segs[*nwhisker_segs].y1 = sp->whiskers[n].y1; sp->win32.whisker_segs[*nwhisker_segs].x2 = sp->whiskers[n].x2; sp->win32.whisker_segs[*nwhisker_segs].y2 = sp->whiskers[n].y2; n++; *nwhisker_segs += 1; sp->win32.whisker_segs[*nwhisker_segs].x1 = sp->whiskers[n].x1; sp->win32.whisker_segs[*nwhisker_segs].y1 = sp->whiskers[n].y1; sp->win32.whisker_segs[*nwhisker_segs].x2 = sp->whiskers[n].x2; sp->win32.whisker_segs[*nwhisker_segs].y2 = sp->whiskers[n].y2; *nwhisker_segs += 1; } else if (GGOBI_IS_TIME_SERIES_DISPLAY(display)) { sp->win32.whisker_segs[*nwhisker_segs].x1 = sp->whiskers[j].x1; sp->win32.whisker_segs[*nwhisker_segs].y1 = sp->whiskers[j].y1; sp->win32.whisker_segs[*nwhisker_segs].x2 = sp->whiskers[j].x2; sp->win32.whisker_segs[*nwhisker_segs].y2 = sp->whiskers[j].y2; *nwhisker_segs += 1; } } void build_ash_segs (gint i, gint *nsegs, splotd *sp) { displayd *display = (displayd *) sp->displayptr; if (display->p1d_orientation == HORIZONTAL) { sp->win32.ash_segs[*nsegs].x1 = sp->screen[i].x; sp->win32.ash_segs[*nsegs].y1 = sp->screen[i].y; sp->win32.ash_segs[*nsegs].x2 = sp->screen[i].x; sp->win32.ash_segs[*nsegs].y2 = sp->p1d.ash_baseline.y; } else { sp->win32.ash_segs[*nsegs].x1 = sp->screen[i].x; sp->win32.ash_segs[*nsegs].y1 = sp->screen[i].y; sp->win32.ash_segs[*nsegs].x2 = sp->p1d.ash_baseline.x; sp->win32.ash_segs[*nsegs].y2 = sp->screen[i].y; } *nsegs += 1; } static void draw_glyphs (splotd *sp, GdkDrawable *drawable, GdkPoint *points, gint np, GdkSegment *segs, gint ns, rectd *open_rects, gint nr_open, rectd *filled_rects, gint nr_filled, arcd *open_arcs, gint nc_open, arcd *filled_arcs, gint nc_filled, ggobid *gg) { if (gg->plot_GC == NULL) init_plot_GC (drawable, gg); if (np) gdk_draw_points (drawable, gg->plot_GC, points, np); if (ns) gdk_draw_segments (drawable, gg->plot_GC, segs, ns); if (nr_open) win32_draw_rectangles (drawable, gg->plot_GC, OPEN, open_rects, nr_open); if (nr_filled) win32_draw_rectangles (drawable, gg->plot_GC, FILL, filled_rects, nr_filled); if (nc_open) win32_draw_arcs (drawable, gg->plot_GC, OPEN, open_arcs, nc_open); if (nc_filled) win32_draw_arcs (drawable, gg->plot_GC, FILL, filled_arcs, nc_filled); } void win32_draw_to_pixmap_unbinned (gint current_color, splotd *sp, gboolean draw_hidden, ggobid *gg) { displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; gint i, m; gint npt, nseg, nr_open, nr_filled, nc_open, nc_filled; gint nwhisker_segs = 0; gint nash_segs = 0; #if OLD gint dtype = display->displaytype; #endif npt = nseg = nr_open = nr_filled = nc_open = nc_filled = 0; if (sp->win32.npoints < d->nrows) drawing_arrays_alloc (sp, d, gg); for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if (splot_plot_case (m, d, sp, display, gg)) { if ((draw_hidden && d->hidden_now.els[m]) || /*-- drawing hiddens --*/ (d->color_now.els[m] == current_color && /*-- drawing unhiddens --*/ !draw_hidden && !d->hidden_now.els[m])) { if (display->options.points_show_p) { build_glyph (&d->glyph_now.els[m], sp->screen, m, sp->win32.points, &npt, sp->win32.segs, &nseg, sp->win32.open_rects, &nr_open, sp->win32.filled_rects, &nr_filled, sp->win32.open_arcs, &nc_open, sp->win32.filled_arcs, &nc_filled); if ((GGOBI_IS_PAR_COORDS_DISPLAY(display) || GGOBI_IS_TIME_SERIES_DISPLAY(display)) && display->options.whiskers_show_p) { build_whisker_segs (m, &nwhisker_segs, sp); } else if (GGOBI_IS_SCATTERPLOT_DISPLAY(display) && ((pmode_get(display, gg) == TOUR1D && cpanel->t1d.ASH_add_lines_p) || (pmode_get(display, gg) == P1PLOT && cpanel->p1d.type == ASH && cpanel->p1d.ASH_add_lines_p))) { build_ash_segs (m, &nash_segs, sp); } } } } } if (nwhisker_segs) gdk_draw_segments (sp->pixmap0, gg->plot_GC, sp->win32.whisker_segs, nwhisker_segs); if (nash_segs) { gdk_draw_segments (sp->pixmap0, gg->plot_GC, sp->win32.ash_segs, nash_segs); } draw_glyphs (sp, sp->pixmap0, sp->win32.points, npt, sp->win32.segs, nseg, sp->win32.open_rects, nr_open, sp->win32.filled_rects, nr_filled, sp->win32.open_arcs, nc_open, sp->win32.filled_arcs, nc_filled, gg); } void win32_draw_to_pixmap_binned (icoords *bin0, icoords *bin1, gint current_color, splotd *sp, gboolean draw_hidden, ggobid *gg) { displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gint ih, iv; gint m, j; gint npt, nseg, nr_open, nr_filled, nc_open, nc_filled; gint nwhisker_segs = 0; npt = nseg = nr_open = nr_filled = nc_open = nc_filled = 0; for (ih=bin0->x; ih<=bin1->x; ih++) { for (iv=bin0->y; iv<=bin1->y; iv++) { for (m=0; mbrush.binarray[ih][iv].nels; m++) { j = d->rows_in_plot.els[d->brush.binarray[ih][iv].els[m]]; if (splot_plot_case (j, d, sp, display, gg)) { if ((draw_hidden && d->hidden_now.els[j]) || /*-- hiddens --*/ (d->color_now.els[j] == current_color && /*-- unhiddens --*/ !draw_hidden && !d->hidden_now.els[j])) { build_glyph (&d->glyph_now.els[j], sp->screen, j, sp->win32.points, &npt, sp->win32.segs, &nseg, sp->win32.open_rects, &nr_open, sp->win32.filled_rects, &nr_filled, sp->win32.open_arcs, &nc_open, sp->win32.filled_arcs, &nc_filled); if (GGOBI_IS_PAR_COORDS_DISPLAY(display) || GGOBI_IS_TIME_SERIES_DISPLAY(display)) { build_whisker_segs (j, &nwhisker_segs, sp); } } } } } } gdk_draw_segments (sp->pixmap0, gg->plot_GC, sp->win32.whisker_segs, nwhisker_segs); draw_glyphs (sp, sp->pixmap0, sp->win32.points, npt, sp->win32.segs, nseg, sp->win32.open_rects, nr_open, sp->win32.filled_rects, nr_filled, sp->win32.open_arcs, nc_open, sp->win32.filled_arcs, nc_filled, gg); } #endif ggobi-2.1.12/src/exclusion_ui.c0000644000175000017500000005612314651527764012036 /*-- exclusion_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * This is no longer appropriately named: think of it as cluster_ui.c */ #include #include "vars.h" #include "externs.h" static void exclusion_notebook_adddata_cb (ggobid *, GGobiData *, void *notebook); static void destroyit (gboolean kill, ggobid * gg) { gint n, nrows; GSList *l; GGobiData *d; GtkWidget *child; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (d->cluster_table) { nrows = GTK_TABLE (d->cluster_table)->nrows; for (n = 0; n < nrows - 1; n++) cluster_free (n, d, gg); } } if (kill) { gtk_widget_destroy (gg->cluster_ui.window); gg->cluster_ui.window = NULL; } else { /*-- kill all the children of the window --*/ GList *gl, *children = gtk_container_get_children (GTK_CONTAINER(GTK_DIALOG(gg->cluster_ui.window)->vbox)); for (gl = children; gl; gl = gl->next) { child = (GtkWidget *) gl->data; gtk_widget_destroy (child); } } } /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget * w, gint response, ggobid * gg) { destroyit (true, gg); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget * w, GdkEvent * event, ggobid * gg) { destroyit (true, gg); } static gint cluster_symbol_show (GtkWidget * w, GdkEventExpose * event, gpointer cbd) { gint k = GPOINTER_TO_INT (cbd); ggobid *gg = GGobiFromWidget (w, true); icoords pos; glyphd g; GGobiData *d = datad_get_from_notebook (gg->cluster_ui.notebook, gg); colorschemed *scheme = gg->activeColorScheme; /*-- fill in the background color --*/ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); /*-- draw the appropriate symbol in the appropriate color --*/ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[d->clusv[k].color]); g.type = d->clusv[k].glyphtype; g.size = d->clusv[k].glyphsize; pos.x = w->allocation.width / 2; pos.y = w->allocation.height / 2; draw_glyph (w->window, &g, &pos, 0, gg); return FALSE; } void cluster_table_labels_update (GGobiData * d, ggobid * gg) { gint k; gchar *str; if (gg->cluster_ui.window == NULL) return; for (k = 0; k < d->nclusters; k++) { str = g_strdup_printf ("%ld", d->clusv[k].nhidden); gtk_label_set_text (GTK_LABEL (d->clusvui[k].nh_lbl), str); g_free (str); str = g_strdup_printf ("%ld", d->clusv[k].nshown); gtk_label_set_text (GTK_LABEL (d->clusvui[k].ns_lbl), str); g_free (str); str = g_strdup_printf ("%ld", d->clusv[k].n); gtk_label_set_text (GTK_LABEL (d->clusvui[k].n_lbl), str); g_free (str); } } static gint hide_cluster_cb (GtkToggleButton * btn, gpointer cbd) { gint k = GPOINTER_TO_INT (cbd); gint i; ggobid *gg = GGobiFromWidget (GTK_WIDGET (btn), true); GGobiData *d = datad_get_from_notebook (gg->cluster_ui.notebook, gg); gboolean prev, changed = false; g_assert (d->sampled.nels == d->nrows); g_assert (d->clusterid.nels == d->nrows); g_assert (d->hidden.nels == d->nrows); /*-- operating on the current sample, whether hidden or shown --*/ for (i = 0; i < d->nrows; i++) { if (d->sampled.els[i]) { if (d->clusterid.els[i] == k) { prev = d->hidden.els[i]; d->hidden.els[i] = d->hidden_now.els[i] = btn->active; if ((prev != d->hidden.els[i]) && !gg->linkby_cv) { changed = symbol_link_by_id (true, i, d, gg) || changed; } } } } clusters_set (d, gg); cluster_table_labels_update (d, gg); displays_plot (NULL, FULL, gg); return false; } /*-- include or exclude hidden cases --*/ gint include_hiddens (gboolean include, GGobiData * d, ggobid * gg) { gint i; displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; gboolean prev, changed = false; g_assert (d->excluded.nels == d->nrows); for (i = 0; i < d->nrows; i++) { prev = d->excluded.els[i]; d->excluded.els[i] = (!include && d->hidden_now.els[i]); if ((prev != d->excluded.els[i]) && !gg->linkby_cv) { /*-- this doesn't link the value of excluded --*/ changed = changed || exclude_link_by_id (i, d, gg); } } /*-- make the other datad's update their rows_in_plot, too --*/ if (changed) { GGobiData *dd; GSList *l; for (l = gg->d; l; l = l->next) { dd = (GGobiData *) l->data; if (dd == d) continue; if (dd->rowIds && dd->idTable) { rows_in_plot_set (dd, gg); clusters_set (dd, gg); cluster_table_labels_update (dd, gg); limits_set (dd, true, true, gg->lims_use_visible); vartable_limits_set (dd); vartable_stats_set (dd); tform_to_world (dd, gg); } } } rows_in_plot_set (d, gg); clusters_set (d, gg); cluster_table_labels_update (d, gg); limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); if (cpanel->pmode == TOUR1D) dsp->t1d.get_new_target = true; else if (cpanel->pmode == TOUR2D3) dsp->t2d3.get_new_target = true; else if (cpanel->pmode == TOUR2D) dsp->t2d.get_new_target = true; else if (cpanel->pmode == COTOUR) { dsp->tcorr1.get_new_target = true; dsp->tcorr2.get_new_target = true; } displays_tailpipe (FULL, gg); displays_plot (NULL, FULL, gg); return false; } static void exclude_hiddens_cb (GtkWidget * w, ggobid * gg) { GGobiData *d = datad_get_from_notebook (gg->cluster_ui.notebook, gg); include_hiddens (false, d, gg); } static void include_hiddens_cb (GtkWidget * w, ggobid * gg) { GGobiData *d = datad_get_from_notebook (gg->cluster_ui.notebook, gg); include_hiddens (true, d, gg); } static gint cluster_symbol_cb (GtkWidget * w, GdkEventExpose * event, gpointer cbd) { /*-- reset the glyph and color of this glyph to the current values --*/ gint n = GPOINTER_TO_INT (cbd); ggobid *gg = GGobiFromWidget (w, true); GGobiData *d = datad_get_from_notebook (gg->cluster_ui.notebook, gg); gint k, m, i; cpaneld *cpanel = &gg->current_display->cpanel; gboolean rval = false; gint nclusters = symbol_table_populate (d); gboolean proceed = true; gint targets = cpanel->br.point_targets; gint nd = g_slist_length (gg->d); g_assert (d->clusterid.nels == d->nrows); /* * Almost surely the user is not trying to collapse groups, so * check whether there's another cluster with this color/glyph * combination. If there is, don't go ahead. (Though we may * want to add a dialog for this later.) */ for (k = 0; k < nclusters; k++) { if (k != n) { switch (targets) { case br_candg: if (d->clusv[k].glyphtype == gg->glyph_id.type && d->clusv[k].glyphsize == gg->glyph_id.size && d->clusv[k].color == gg->color_id) { proceed = false; break; } break; case br_color: /* * This would produce an identical cluster if the glyph * types and sizes of the clusters are already equal, and * the new glyph sizes would complete the match. */ if (d->clusv[k].glyphtype == d->clusv[n].glyphtype && d->clusv[k].glyphsize == d->clusv[n].glyphsize && d->clusv[k].color == gg->color_id) { proceed = false; break; } break; case br_glyph: if (d->clusv[k].color == d->clusv[n].color && d->clusv[k].glyphtype == gg->glyph_id.type && d->clusv[k].glyphsize == gg->glyph_id.size) { proceed = false; break; } break; } } } /* * This is a bit paternalistic, no? But it's probably ok for now. */ if (!proceed) { quick_message ("You're about to reset the color and/or glyph for this cluster\nin such a way as to merge it with another cluster. I bet\nthat's not what you intend, so I won't let you do it.\n", false); return true; } for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; if (d->clusterid.els[i] == n) { if (targets == br_candg || targets == br_color) { d->color.els[i] = d->color_now.els[i] = gg->color_id; /*-- this will be done multiple times, but who cares? --*/ d->clusv[n].color = gg->color_id; } if (targets == br_candg || targets == br_glyph) { d->glyph.els[i].type = d->glyph_now.els[i].type = gg->glyph_id.type; d->glyph.els[i].size = d->glyph_now.els[i].size = gg->glyph_id.size; /*-- this will be done multiple times, but who cares? --*/ d->clusv[n].glyphtype = gg->glyph_id.type; d->clusv[n].glyphsize = gg->glyph_id.size; } /*-- link so that displays of linked datad's will be brushed as well --*/ if (nd > 1 && !gg->linkby_cv) symbol_link_by_id (true, i, d, gg); } } g_signal_emit_by_name (G_OBJECT (w), "expose_event", (gpointer) gg, (gpointer) & rval); /* clusters_set reorders clusv, so it's bad news here */ /*clusters_set (d, gg); */ displays_plot (NULL, FULL, gg); return false; } void cluster_add (gint k, GGobiData * d, ggobid * gg) { gchar *str; gint dawidth = 2 * NGLYPHSIZES + 1 + 10; d->clusvui[k].da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (d->clusvui[k].da, false); gtk_widget_set_size_request (GTK_WIDGET (d->clusvui[k].da), dawidth, dawidth); gtk_widget_set_events (d->clusvui[k].da, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); g_signal_connect (G_OBJECT (d->clusvui[k].da), "expose_event", G_CALLBACK (cluster_symbol_show), GINT_TO_POINTER (k)); g_signal_connect (G_OBJECT (d->clusvui[k].da), "button_press_event", G_CALLBACK (cluster_symbol_cb), GINT_TO_POINTER (k)); GGobi_widget_set (d->clusvui[k].da, gg, true); gtk_table_attach (GTK_TABLE (d->cluster_table), d->clusvui[k].da, 0, 1, k + 1, k + 2, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 5, 2); // Set clusv[k].hidden_p in case the user has made changes. d->clusv[k].hidden_p = (d->clusv[k].nhidden == d->clusv[k].n); d->clusvui[k].h_btn = gtk_toggle_button_new_with_label ("Shadow"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (d->clusvui[k].h_btn), d->clusv[k].hidden_p); g_signal_connect (G_OBJECT (d->clusvui[k].h_btn), "toggled", G_CALLBACK (hide_cluster_cb), GINT_TO_POINTER (k)); GGobi_widget_set (d->clusvui[k].h_btn, gg, true); gtk_table_attach (GTK_TABLE (d->cluster_table), d->clusvui[k].h_btn, 1, 2, k + 1, k + 2, GTK_FILL, GTK_FILL, 5, 2); /* d->clusvui[k].e_btn = gtk_toggle_button_new_with_label("E"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(d->clusvui[k].e_btn), d->clusv[k].excluded_p); g_signal_connect(G_OBJECT(d->clusvui[k].e_btn), "toggled", G_CALLBACK(exclude_cluster_cb), GINT_TO_POINTER(k)); GGobi_widget_set(d->clusvui[k].e_btn, gg, true); gtk_table_attach(GTK_TABLE(d->cluster_table), d->clusvui[k].e_btn, 2, 3, k + 1, k + 2, GTK_FILL, GTK_FILL, 5, 2); */ str = g_strdup_printf ("%ld", d->clusv[k].nhidden); d->clusvui[k].nh_lbl = gtk_label_new (str); gtk_table_attach (GTK_TABLE (d->cluster_table), d->clusvui[k].nh_lbl, 2, 3, k + 1, k + 2, GTK_FILL, GTK_FILL, 5, 2); g_free (str); str = g_strdup_printf ("%ld", d->clusv[k].nshown); d->clusvui[k].ns_lbl = gtk_label_new (str); gtk_table_attach (GTK_TABLE (d->cluster_table), d->clusvui[k].ns_lbl, 3, 4, k + 1, k + 2, GTK_FILL, GTK_FILL, 5, 2); g_free (str); str = g_strdup_printf ("%ld", d->clusv[k].n); d->clusvui[k].n_lbl = gtk_label_new (str); gtk_table_attach (GTK_TABLE (d->cluster_table), d->clusvui[k].n_lbl, 4, 5, k + 1, k + 2, GTK_FILL, GTK_FILL, 5, 2); g_free (str); } void cluster_free (gint k, GGobiData * d, ggobid * gg) { if (d->clusvui[k].da) { gtk_widget_destroy (d->clusvui[k].da); gtk_widget_destroy (d->clusvui[k].h_btn); gtk_widget_destroy (d->clusvui[k].nh_lbl); gtk_widget_destroy (d->clusvui[k].ns_lbl); gtk_widget_destroy (d->clusvui[k].n_lbl); } } static void update_cb (GtkWidget * w, ggobid * gg) { GGobiData *d = datad_get_from_notebook (gg->cluster_ui.notebook, gg); splotd *sp = gg->current_splot; rows_in_plot_set (d, gg); if (GGOBI_IS_EXTENDED_SPLOT (sp)) { void (*f) (GGobiData *, splotd *, ggobid *); GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); f = klass->splot_assign_points_to_bins; if (f) { f (d, sp, gg); // need to exclude area plots } } //assign_points_to_bins(d, sp, gg); clusters_set (d, gg); cluster_table_labels_update (d, gg); displays_plot (NULL, FULL, gg); cluster_window_open (gg); } static gboolean nclusters_changed (ggobid * gg) { GGobiData *d; gint k, nrows = 0; GtkWidget *page; gboolean changed = false; gint nd = g_slist_length (gg->d); for (k = 0; k < nd; k++) { nrows = 0; page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (gg->cluster_ui.notebook), k); if (page) { d = (GGobiData *) g_object_get_data (G_OBJECT (page), "datad"); nrows = GTK_TABLE (d->cluster_table)->nrows; if (nrows != d->nclusters + 1) {/*-- add one for the titles --*/ changed = true; } } else { /*-- if page is NULL, a new datad has been added --*/ changed = true; } if (changed) break; } return changed; } void cluster_table_update (GGobiData * d, ggobid * gg) { if (gg->cluster_ui.window != NULL) { if (nclusters_changed (gg)) { /*-- for any of the datad's --*/ cluster_window_open (gg); } else { cluster_table_labels_update (d, gg); /*-- d, or all d's? --*//* do all */ } } } static void exclusion_notebook_adddata_cb (ggobid * gg, GGobiData * d, void *notebook) { cluster_window_open (gg); return; /* Should this return a boolean? */ } CHECK_EVENT_SIGNATURE (exclusion_notebook_adddata_cb, datad_added_f) void cluster_window_open (ggobid * gg) { GtkWidget *scrolled_window = NULL; GtkWidget *tebox, *btn, *hbox, *lbl; GtkWidget *ebox; GtkWidget *dialog; gint k; GSList *l; GGobiData *d; gboolean new = false; /*-- if used before we have data, bail out --*/ if (gg->d == NULL || g_slist_length (gg->d) == 0) /**/ return; /*-- if it isn't NULL, then destroy it and start afresh --*/ if (gg->cluster_ui.window != NULL) { destroyit (false, gg); /*-- don't kill the whole thing --*/ } if (gg->cluster_ui.window == NULL || !GTK_WIDGET_REALIZED (gg->cluster_ui.window)) { gg->cluster_ui.window = gtk_dialog_new_with_buttons ("Color & Glyph Groups", GTK_WINDOW(gg->main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); g_signal_connect (G_OBJECT (gg->cluster_ui.window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) gg); new = true; } dialog = gg->cluster_ui.window; tebox = gtk_event_box_new (); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), tebox, true, true, 2); /* Create a notebook, set the position of the tabs */ gg->cluster_ui.notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (gg->cluster_ui.notebook), GTK_POS_TOP); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gg->cluster_ui.notebook), g_slist_length (gg->d) > 1); gtk_container_add (GTK_CONTAINER (tebox), gg->cluster_ui.notebook); for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; /*-- skip datasets without variables --*/ if (!ggobi_data_has_variables (d)) continue; /* Create a scrolled window to hold the table */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); g_object_set_data (G_OBJECT (scrolled_window), "datad", d); /*setdata */ gtk_notebook_append_page (GTK_NOTEBOOK (gg->cluster_ui.notebook), scrolled_window, gtk_label_new (d->name)); gtk_widget_show (scrolled_window); d->cluster_table = gtk_table_new (d->nclusters + 1, 5, true); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), d->cluster_table); /*-- add the row of titles --*/ ebox = gtk_event_box_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "Click to change the color/glyph of all members of the selected cluster to the current brushing color/glyph", NULL); lbl = gtk_label_new ("Symbol"); gtk_container_add (GTK_CONTAINER (ebox), lbl); gtk_table_attach (GTK_TABLE (d->cluster_table), ebox, 0, 1, 0, 1, /*-- left, right, top, bottom --*/ GTK_FILL, GTK_FILL, 5, 2); ebox = gtk_event_box_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "Shadow brush all cases with the corresponding symbol.", NULL); lbl = gtk_label_new ("Shadow"); gtk_container_add (GTK_CONTAINER (ebox), lbl); gtk_table_attach (GTK_TABLE (d->cluster_table), ebox, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 5, 2); /* ebox = gtk_event_box_new(); gtk_tooltips_set_tip(GTK_TOOLTIPS(gg->tips), ebox, "Exclude all hidden cases with the corresponding symbol", NULL); lbl = gtk_label_new("Exclude"); gtk_container_add(GTK_CONTAINER(ebox), lbl); gtk_table_attach(GTK_TABLE(d->cluster_table), ebox, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 5, 2); */ /* ebox = gtk_event_box_new(); gtk_tooltips_set_tip(GTK_TOOLTIPS(gg->tips), ebox, "Show all cases with the corresponding symbol", NULL); lbl = gtk_label_new("Show"); gtk_container_add(GTK_CONTAINER(ebox), lbl); gtk_table_attach(GTK_TABLE(d->cluster_table), ebox, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 5, 2); ebox = gtk_event_box_new(); gtk_tooltips_set_tip(GTK_TOOLTIPS(gg->tips), ebox, "Complement: Show/hide all cases with the corresponding symbol that are hidden/shown", NULL); lbl = gtk_label_new("Comp"); gtk_container_add(GTK_CONTAINER(ebox), lbl); gtk_table_attach(GTK_TABLE(d->cluster_table), ebox, 3, 4, 0, 1, GTK_FILL, GTK_FILL, 5, 2); */ ebox = gtk_event_box_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "The number of cases in shadow out of N with the corresponding symbol.", NULL); lbl = gtk_label_new ("Shadowed"); gtk_container_add (GTK_CONTAINER (ebox), lbl); gtk_table_attach (GTK_TABLE (d->cluster_table), ebox, 2, 3, 0, 1, GTK_FILL, GTK_FILL, 5, 2); ebox = gtk_event_box_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "The number of visible cases (cases not in shadow) out of N with the corresponding symbol.", NULL); lbl = gtk_label_new ("Shown"); gtk_container_add (GTK_CONTAINER (ebox), lbl); gtk_table_attach (GTK_TABLE (d->cluster_table), ebox, 3, 4, 0, 1, GTK_FILL, GTK_FILL, 5, 2); ebox = gtk_event_box_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "The number of cases with the corresponding symbol. If sampling, the number of cases in the current subsample", NULL); lbl = gtk_label_new ("N"); gtk_container_add (GTK_CONTAINER (ebox), lbl); gtk_table_attach (GTK_TABLE (d->cluster_table), ebox, 4, 5, 0, 1, GTK_FILL, GTK_FILL, 5, 2); d->clusvui = (clusteruid *) g_realloc (d->clusvui, d->nclusters * sizeof (clusteruid)); /*-- add the cluster rows, one by one --*/ for (k = 0; k < d->nclusters; k++) cluster_add (k, d, gg); } /*-- listen for datad_added events on main_window --*/ /*-- Be careful to add this signal handler only once! --*/ if (new) { g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK (exclusion_notebook_adddata_cb), NULL); } /*-- give the window an initial height --*/ gtk_widget_set_size_request (GTK_WIDGET (scrolled_window), -1, 150); /*-- horizontal box to hold a few buttons --*/ hbox = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->vbox), hbox, false, false, 0); /*-- Exclude button --*/ btn = gtk_button_new_with_mnemonic ("E_xclude shadows"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Exclude all points in shadow, so that they're not drawn and they're ignored when scaling the view.", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (exclude_hiddens_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (hbox), btn, true, true, 0); /*-- Include button --*/ btn = gtk_button_new_with_mnemonic ("_Include shadows"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Include all previously hidden and excluded points.", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (include_hiddens_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (hbox), btn, true, true, 0); /*-- Update button --*/ btn = gtk_button_new_from_stock (GTK_STOCK_REFRESH); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset plots after brushing so that shadow and excluded status is consistent with this table; reset this table if necessary.", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (update_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (hbox), btn, true, true, 0); /*-- Close button --*/ g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (close_btn_cb), (gpointer) gg); gtk_widget_show_all (gg->cluster_ui.window); for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; /*-- this doesn't track cluster counts, just cluster identities --*/ g_signal_emit (G_OBJECT (gg), GGobiSignals[CLUSTERS_CHANGED_SIGNAL], 0, d); } gdk_window_raise (gg->cluster_ui.window->window); } ggobi-2.1.12/src/color_ui.c0000644000175000017500000010610514651527764011137 /*-- color_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #define PSIZE 20 static gint open_colorsel_dialog (GtkWidget * w, ggobid * gg); static void redraw_fg (GtkWidget * w, gint k, ggobid * gg); /*------------------------------------------------------------------------*/ /* symbol display routines */ /*------------------------------------------------------------------------*/ static void choose_glyph_cb (GtkWidget * w, GdkEventButton * event, ggobid * gg) { /*-- Reset glyph_id to the nearest glyph. --*/ glyphd g; gint i, dsq, nearest_dsq, type, size, rval = false; icoords pos, ev; splotd *sp = gg->current_splot; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gint spacing = gg->color_ui.spacing; gint margin = gg->color_ui.margin; vectorg_copy (&d->glyph, &d->glyph_prev); /*-- from, to --*/ ev.x = (gint) event->x; ev.y = (gint) event->y; pos.y = margin + 3 / 2; pos.x = spacing / 2; g.type = DOT_GLYPH; g.size = 1; nearest_dsq = dsq = sqdist (pos.x, pos.y, ev.x, ev.y); type = g.type; size = g.size; pos.y = 0; for (i = 0; i < NGLYPHSIZES; i++) { g.size = i; pos.y += (margin + ((i == 0) ? (3 * g.size) / 2 : 3 * g.size)); pos.x = spacing + spacing / 2; g.type = PLUS; if ((dsq = sqdist (pos.x, pos.y, ev.x, ev.y)) < nearest_dsq) { nearest_dsq = dsq; type = g.type; size = g.size; } pos.x += spacing; g.type = X; if ((dsq = sqdist (pos.x, pos.y, ev.x, ev.y)) < nearest_dsq) { nearest_dsq = dsq; type = g.type; size = g.size; } pos.x += spacing; g.type = OC; if ((dsq = sqdist (pos.x, pos.y, ev.x, ev.y)) < nearest_dsq) { nearest_dsq = dsq; type = g.type; size = g.size; } pos.x += spacing; g.type = OR; if ((dsq = sqdist (pos.x, pos.y, ev.x, ev.y)) < nearest_dsq) { nearest_dsq = dsq; type = g.type; size = g.size; } pos.x += spacing; g.type = FC; if ((dsq = sqdist (pos.x, pos.y, ev.x, ev.y)) < nearest_dsq) { nearest_dsq = dsq; type = g.type; size = g.size; } pos.x += spacing; g.type = FR; if ((dsq = sqdist (pos.x, pos.y, ev.x, ev.y)) < nearest_dsq) { nearest_dsq = dsq; type = g.type; size = g.size; } } gg->glyph_id.type = type; gg->glyph_id.size = size; g_signal_emit_by_name (G_OBJECT (gg->color_ui.symbol_display), "expose_event", (gpointer) sp, (gpointer) & rval); g_signal_emit_by_name (G_OBJECT (gg->color_ui.line_display), "expose_event", (gpointer) sp, (gpointer) & rval); } static void find_symbol_selection_circle_pos (icoords * pos, ggobid * gg) { gint i; glyphd g; gint spacing = gg->color_ui.spacing; gint margin = gg->color_ui.margin; if (gg->glyph_id.type == DOT_GLYPH) { pos->y = margin + 3 / 2; pos->x = spacing / 2; } else { pos->y = 0; for (i = 0; i < NGLYPHSIZES; i++) { g.size = i; pos->y += (margin + ((i == 0) ? (3 * g.size) / 2 : 3 * g.size)); pos->x = spacing + spacing / 2; if (gg->glyph_id.type == PLUS && gg->glyph_id.size == g.size) break; pos->x += spacing; if (gg->glyph_id.type == X && gg->glyph_id.size == g.size) break; pos->x += spacing; if (gg->glyph_id.type == OC && gg->glyph_id.size == g.size) break; pos->x += spacing; if (gg->glyph_id.type == OR && gg->glyph_id.size == g.size) break; pos->x += spacing; if (gg->glyph_id.type == FC && gg->glyph_id.size == g.size) break; pos->x += spacing; if (gg->glyph_id.type == FR && gg->glyph_id.size == g.size) break; } } } static void redraw_symbol_display (GtkWidget * w, ggobid * gg) { gint i; glyphd g; icoords pos; gint margin, spacing; colorschemed *scheme = gg->activeColorScheme; gg->color_ui.spacing = w->allocation.width / NGLYPHTYPES; margin = gg->color_ui.margin; spacing = gg->color_ui.spacing; if (gg->plot_GC == NULL) init_plot_GC (w->window, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[gg->color_id]); /* * The factor of three is dictated by the sizing of circles * ... this should no longer be true; it should be 2*width + 1 */ pos.y = margin + 3 / 2; pos.x = spacing / 2; gdk_draw_point (w->window, gg->plot_GC, pos.x, pos.y); pos.y = 0; for (i = 0; i < NGLYPHSIZES; i++) { g.size = i; pos.y += (margin + ((i == 0) ? (3 * g.size) / 2 : 3 * g.size)); pos.x = spacing + spacing / 2; g.type = PLUS; draw_glyph (w->window, &g, &pos, 0, gg); pos.x += spacing; g.type = X; draw_glyph (w->window, &g, &pos, 0, gg); pos.x += spacing; g.type = OC; draw_glyph (w->window, &g, &pos, 0, gg); pos.x += spacing; g.type = OR; draw_glyph (w->window, &g, &pos, 0, gg); pos.x += spacing; g.type = FC; draw_glyph (w->window, &g, &pos, 0, gg); pos.x += spacing; g.type = FR; draw_glyph (w->window, &g, &pos, 0, gg); } if (!gg->mono_p) { icoords p; /*-- 2*(NGLYPHSIZES+1) is the size of the largest glyph; draw_glyph() --*/ gint radius = (3 * NGLYPHSIZES) / 2 + gg->color_ui.margin / 2; find_symbol_selection_circle_pos (&p, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_gc_set_line_attributes (gg->plot_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_draw_arc (w->window, gg->plot_GC, false, p.x - radius, p.y - radius, 2 * radius, 2 * radius, 0, (gshort) 23040); gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } } static gint symbol_display_expose_cb (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { redraw_symbol_display (w, gg); return FALSE; } /*------------------------------------------------------------------------*/ /* line display routines */ /*------------------------------------------------------------------------*/ /*-- use the current glyph type and size to determine the line type --*/ /* * point, +, x -> lightest dashed line * open circle and rectangle -> middle dashed line * filled circle and rectangle -> solid line */ static void find_line_selection_pos (icoords * pos, ggobid * gg) { gint i; glyphd g; gint spacing = gg->color_ui.spacing; gint margin = gg->color_ui.margin; if (gg->glyph_id.type == DOT_GLYPH) { pos->x = spacing + spacing / 2; pos->y = margin; } else { pos->y = 0; for (i = 0; i < NGLYPHSIZES; i++) { g.size = i; pos->y += (margin + ((i == 0) ? (3 * g.size) / 2 : 3 * g.size)); pos->x = spacing + spacing / 2; if (gg->glyph_id.type == PLUS && gg->glyph_id.size == g.size) break; if (gg->glyph_id.type == X && gg->glyph_id.size == g.size) break; pos->x += (2 * spacing); if (gg->glyph_id.type == OC && gg->glyph_id.size == g.size) break; if (gg->glyph_id.type == OR && gg->glyph_id.size == g.size) break; pos->x += (2 * spacing); if (gg->glyph_id.type == FC && gg->glyph_id.size == g.size) break; if (gg->glyph_id.type == FR && gg->glyph_id.size == g.size) break; } } } static void redraw_line_display (GtkWidget * w, ggobid * gg) { gint i, linewidth; icoords pos; gint margin, spacing; gint8 dash_list[2]; colorschemed *scheme = gg->activeColorScheme; margin = gg->color_ui.margin; spacing = gg->color_ui.spacing; if (gg->plot_GC == NULL) init_plot_GC (w->window, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[gg->color_id]); pos.y = 0; for (i = 0; i < NGLYPHSIZES; i++) { linewidth = (i < 3) ? 0 : (i - 2) * 2; pos.y += (margin + ((i == 0) ? (3 * i) / 2 : 3 * i)); pos.x = spacing; dash_list[0] = 4; dash_list[1] = 2; gdk_gc_set_dashes (gg->plot_GC, 0, dash_list, 2); gdk_gc_set_line_attributes (gg->plot_GC, linewidth, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_ROUND); gdk_draw_line (w->window, gg->plot_GC, pos.x, pos.y, pos.x + spacing, pos.y); pos.x += (2 * spacing); gdk_gc_set_line_attributes (gg->plot_GC, linewidth, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_ROUND); dash_list[0] = 8; dash_list[1] = 2; gdk_gc_set_dashes (gg->plot_GC, 0, dash_list, 2); gdk_draw_line (w->window, gg->plot_GC, pos.x, pos.y, pos.x + spacing, pos.y); pos.x += (2 * spacing); gdk_gc_set_line_attributes (gg->plot_GC, linewidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_ROUND); gdk_draw_line (w->window, gg->plot_GC, pos.x, pos.y, pos.x + spacing, pos.y); } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); if (!gg->mono_p) { icoords p; find_line_selection_pos (&p, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_rectangle (w->window, gg->plot_GC, false, p.x - spacing / 2 - margin / 2, p.y - (NGLYPHSIZES + 1) / 2 - margin / 2, spacing + margin, (NGLYPHSIZES + 1) + margin); } } static gint line_display_expose_cb (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { redraw_line_display (w, gg); return FALSE; } /*------------------------------------------------------------------------*/ /* foreground, background, accent color widgets */ /*------------------------------------------------------------------------*/ static void set_one_color (GtkWidget * w, GdkEventButton * event, ggobid * gg) { if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) open_colorsel_dialog (w, gg); } static void set_color_fg (GtkWidget * w, GdkEventButton * event, ggobid * gg) { gint i; gint prev = gg->color_id; gint k = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "index")); splotd *sp = gg->current_splot; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; g_assert (d->color.nels == d->nrows); for (i = 0; i < d->nrows; i++) d->color_prev.els[i] = d->color.els[i]; gg->color_id = k; if (event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { open_colorsel_dialog (w, gg); } else { gint rval = false; g_signal_emit_by_name (G_OBJECT (gg->color_ui.symbol_display), "expose_event", (gpointer) gg, (gpointer) & rval); g_signal_emit_by_name (G_OBJECT (gg->color_ui.line_display), "expose_event", (gpointer) gg, (gpointer) & rval); } redraw_fg (gg->color_ui.fg_da[prev], prev, gg); redraw_fg (w, k, gg); } static gint set_color_id (GtkWidget * w, GdkEventButton * event, ggobid * gg) { /* * So that the same routines can be used to handle both the foreground * and background color swatches, keep track of which drawing area * was most recently pressed. */ gg->color_ui.current_da = w; if (w == gg->color_ui.bg_da || w == gg->color_ui.accent_da || w == gg->color_ui.hidden_da) set_one_color (w, event, gg); else set_color_fg (w, event, gg); splot_redraw (gg->current_splot, GGOBI_SPLOT_GET_CLASS (gg->current_splot)->redraw, gg); /*-- redraw brush --*/ return FALSE; } /*-- Redraw one of the foreground color swatches --*/ static void redraw_fg (GtkWidget * w, gint k, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; if (gg->plot_GC == NULL) init_plot_GC (w->window, gg); gdk_gc_set_foreground (gg->plot_GC, &gg->activeColorScheme->rgb[k]); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); /* * Draw a background border around the box containing the selected color */ if (k == gg->color_id) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (w->window, gg->plot_GC, false, 0, 0, w->allocation.width - 1, w->allocation.height - 1); gdk_draw_rectangle (w->window, gg->plot_GC, false, 1, 1, w->allocation.width - 2, w->allocation.height - 2); } } static gint color_expose_fg (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { gint k = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "index")); if (k <= gg->activeColorScheme->n) redraw_fg (w, k, gg); return FALSE; } static void redraw_bg (GtkWidget * w, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; if (gg->plot_GC == NULL) init_plot_GC (w->window, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); } static gint color_expose_bg (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { redraw_bg (w, gg); return FALSE; } static void redraw_accent (GtkWidget * w, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; if (gg->plot_GC == NULL) init_plot_GC (w->window, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); } static gint color_expose_accent (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { redraw_accent (w, gg); return FALSE; } static void redraw_hidden (GtkWidget * w, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; if (gg->plot_GC == NULL) init_plot_GC (w->window, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); gdk_draw_rectangle (w->window, gg->plot_GC, true, 0, 0, w->allocation.width, w->allocation.height); } static gint color_expose_hidden (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { redraw_hidden (w, gg); return FALSE; } static void reverse_video_cb (GtkWidget * ok_button, ggobid * gg) { gulong pixel; gushort r, g, b; gint rval = false; colorschemed *scheme = gg->activeColorScheme; gboolean writeable = false, best_match = true; r = scheme->rgb_accent.red; g = scheme->rgb_accent.green; b = scheme->rgb_accent.blue; pixel = scheme->rgb_accent.pixel; scheme->rgb_accent.red = scheme->rgb_bg.red; scheme->rgb_accent.green = scheme->rgb_bg.green; scheme->rgb_accent.blue = scheme->rgb_bg.blue; scheme->rgb_accent.pixel = scheme->rgb_bg.pixel; scheme->rgb_bg.red = r; scheme->rgb_bg.green = g; scheme->rgb_bg.blue = b; scheme->rgb_bg.pixel = pixel; scheme->rgb_hidden.red = 65535 - scheme->rgb_hidden.red; scheme->rgb_hidden.green = 65535 - scheme->rgb_hidden.green; scheme->rgb_hidden.blue = 65535 - scheme->rgb_hidden.blue; if (!gdk_colormap_alloc_color (gdk_colormap_get_system (), &scheme->rgb_hidden, writeable, best_match)) g_printerr ("failure allocating hidden color\n"); g_signal_emit_by_name (G_OBJECT (gg->color_ui.symbol_display), "expose_event", (gpointer) gg, (gpointer) & rval); g_signal_emit_by_name (G_OBJECT (gg->color_ui.line_display), "expose_event", (gpointer) gg, (gpointer) & rval); redraw_bg (gg->color_ui.bg_da, gg); redraw_accent (gg->color_ui.accent_da, gg); redraw_hidden (gg->color_ui.hidden_da, gg); displays_plot ((splotd *) NULL, FULL, gg); } /*------------------------------------------------------------------------*/ /* color selection dialog routines */ /*------------------------------------------------------------------------*/ void color_changed_cb (GtkWidget * colorsel, ggobid * gg) { GdkColor gdk_color; GdkColormap *cmap = gdk_colormap_get_system (); splotd *sp = gg->current_splot; colorschemed *scheme = gg->activeColorScheme; /* Get current color */ gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &gdk_color); /* Allocate color */ if (gdk_color_alloc (cmap, &gdk_color)) { if (gg->color_ui.current_da == gg->color_ui.bg_da) { scheme->rgb_bg.pixel = gdk_color.pixel; scheme->rgb_bg.red = gdk_color.red; scheme->rgb_bg.green = gdk_color.green; scheme->rgb_bg.blue = gdk_color.blue; redraw_bg (gg->color_ui.bg_da, gg); } else if (gg->color_ui.current_da == gg->color_ui.accent_da) { scheme->rgb_accent.pixel = gdk_color.pixel; scheme->rgb_accent.red = gdk_color.red; scheme->rgb_accent.green = gdk_color.green; scheme->rgb_accent.blue = gdk_color.blue; redraw_accent (gg->color_ui.accent_da, gg); } else if (gg->color_ui.current_da == gg->color_ui.hidden_da) { scheme->rgb_hidden.pixel = gdk_color.pixel; scheme->rgb_hidden.red = gdk_color.red; scheme->rgb_hidden.green = gdk_color.green; scheme->rgb_hidden.blue = gdk_color.blue; redraw_hidden (gg->color_ui.hidden_da, gg); } else { gg->activeColorScheme->rgb[gg->color_id].pixel = gdk_color.pixel; gg->activeColorScheme->rgb[gg->color_id].red = gdk_color.red; gg->activeColorScheme->rgb[gg->color_id].green = gdk_color.green; gg->activeColorScheme->rgb[gg->color_id].blue = gdk_color.blue; redraw_fg (gg->color_ui.fg_da[gg->color_id], gg->color_id, gg); } redraw_symbol_display (gg->color_ui.symbol_display, gg); redraw_line_display (gg->color_ui.line_display, gg); if (sp->da != NULL) { gboolean rval = false; g_signal_emit_by_name (G_OBJECT (sp->da), "expose_event", (gpointer) sp, (gpointer) & rval); } displays_plot ((splotd *) NULL, FULL, gg); } } static void dlg_response_cb (GtkWidget * dialog, gint id, ggobid * gg) { gg->color_ui.colorseldlg = NULL; gtk_widget_destroy(dialog); } static gint open_colorsel_dialog (GtkWidget * w, ggobid * gg) { gint handled = FALSE; GtkWidget *colorsel, *ok_button, *cancel_button, *help_button; gint i; GtkColorSelectionDialog *colordlg; colorschemed *scheme = gg->activeColorScheme; /* Check if we've received a button pressed event */ if (gg->color_ui.colorseldlg == NULL) { handled = true; /* Create color selection dialog */ gg->color_ui.colorseldlg = gtk_color_selection_dialog_new ("Select color"); /* Get the ColorSelection widget */ colordlg = GTK_COLOR_SELECTION_DIALOG (gg->color_ui.colorseldlg); colorsel = GTK_COLOR_SELECTION_DIALOG (gg->color_ui.colorseldlg)->colorsel; /* * Connect to the "color_changed" signal, set the client-data * to the colorsel widget */ g_signal_connect (G_OBJECT (colorsel), "color_changed", G_CALLBACK (color_changed_cb), gg); /* * Connect up the buttons */ g_signal_connect(G_OBJECT(gg->color_ui.colorseldlg), "response", G_CALLBACK(dlg_response_cb), gg); /*ok_button = colordlg->ok_button; cancel_button = colordlg->cancel_button; help_button = colordlg->help_button; g_signal_connect (G_OBJECT (ok_button), "clicked", G_CALLBACK (dlg_close_cb), gg); g_signal_connect (G_OBJECT (cancel_button), "clicked", G_CALLBACK (dlg_close_cb), gg); */ } else { colorsel = GTK_COLOR_SELECTION_DIALOG (gg->color_ui.colorseldlg)->colorsel; } if (w == gg->color_ui.bg_da) { gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &scheme->rgb_bg); } else if (w == gg->color_ui.accent_da) { gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &scheme->rgb_accent); } else if (w == gg->color_ui.hidden_da) { gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &scheme->rgb_hidden); } else { for (i = 0; i < MAXNCOLORS; i++) { if (w == gg->color_ui.fg_da[i]) { gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &gg->activeColorScheme-> rgb[i]); } } } /* Show the dialog */ gtk_widget_show (gg->color_ui.colorseldlg); return handled; } /*------------------------------------------------------------------------*/ /* show/hide/delete the window */ /*------------------------------------------------------------------------*/ static void hide_symbol_window (ggobid * gg) { gtk_widget_hide (gg->color_ui.symbol_window); if (gg->color_ui.colorseldlg != NULL && GTK_IS_WIDGET (gg->color_ui.colorseldlg) && GTK_WIDGET_VISIBLE (gg->color_ui.colorseldlg)) { gtk_widget_hide (gg->color_ui.colorseldlg); } } /*-- catch a click on the close button --*/ static void hide_symbol_window_cb (GtkWidget * w, ggobid * gg) { hide_symbol_window (gg); } /*-- catch the delete (close) event from the window manager --*/ static void delete_symbol_window_cb (GtkWidget * w, GdkEventButton * event, ggobid * gg) { hide_symbol_window (gg); } /*------------------------------------------------------------------------*/ /* redraw the window */ /*------------------------------------------------------------------------*/ void symbol_window_redraw (ggobid * gg) { /* * Send expose events where necessary; show the appropriate * number of fg_da widgets. */ gint k; splotd *sp = gg->current_splot; gint rval = false; if (gg->color_ui.symbol_display) { g_signal_emit_by_name (G_OBJECT (gg->color_ui.symbol_display), "expose_event", (gpointer) sp, (gpointer) & rval); g_signal_emit_by_name (G_OBJECT (gg->color_ui.line_display), "expose_event", (gpointer) sp, (gpointer) & rval); redraw_bg (gg->color_ui.bg_da, gg); redraw_accent (gg->color_ui.accent_da, gg); for (k = 0; k < gg->activeColorScheme->n; k++) { gtk_widget_show (gg->color_ui.fg_da[k]); redraw_fg (gg->color_ui.fg_da[k], k, gg); } for (k = gg->activeColorScheme->n; k < MAXNCOLORS; k++) { gtk_widget_hide (gg->color_ui.fg_da[k]); } } } void close_symbol_window_cb (GtkWidget * w, GdkEventButton * event, ggobid * gg) { fprintf (stderr, "Closing the color scheme window\n"); fflush (stderr); gtk_widget_destroy (gg->color_ui.symbol_window); gg->color_ui.symbol_window = NULL; } /*------------------------------------------------------------------------*/ /* build the window */ /*------------------------------------------------------------------------*/ void make_symbol_window (ggobid * gg) { GtkWidget *vbox, *fg_frame, *bg_frame, *accent_frame, *hidden_frame, *btn; GtkWidget *fg_table, *bg_table, *accent_table, *hidden_table, *ebox, *hbox; gint i, j, k; gint width, height; /* * This seems to handle the case where a the window was * closed using the window manager -- even though I'm capturing * a delete_event. */ if (!GTK_IS_WIDGET (gg->color_ui.symbol_window)) gg->color_ui.symbol_window = NULL; if (gg->color_ui.symbol_window == NULL) { gg->color_ui.symbol_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->color_ui.symbol_window), "Color & Glyph Chooser"); /* * I thought this would be enough to prevent the window from * being destroyed, but it doesn't seem to be. */ g_signal_connect (G_OBJECT (gg->color_ui.symbol_window), "delete_event", G_CALLBACK (delete_symbol_window_cb), (gpointer) gg); /* Track when the ggobid instance is closed and shut this one down too. */ g_signal_connect (G_OBJECT (gg->main_window), "delete_event", G_CALLBACK (close_symbol_window_cb), (gpointer) gg); vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (gg->color_ui.symbol_window), vbox); /*-- to contain the two display areas --*/ hbox = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hbox, true, true, 0); /* * display of glyph types and sizes */ gg->color_ui.symbol_display = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->color_ui.symbol_display, false); /*-- after this, margin is only used in determining y position --*/ /*-- 2*(NGLYPHSIZES+1) is the size of the largest glyph --*/ width = NGLYPHTYPES * 2 * (NGLYPHSIZES + 1) + gg->color_ui.margin * (NGLYPHTYPES + 1); /*-- initialize the spacing that will be used in drawing --*/ gg->color_ui.spacing = width / NGLYPHTYPES; height = gg->color_ui.margin; for (i = 0; i < NGLYPHSIZES; i++) height += (gg->color_ui.margin + 2 * (i + 2)); height += gg->color_ui.margin; gtk_widget_set_size_request (GTK_WIDGET (gg->color_ui.symbol_display), width, height); gtk_box_pack_start (GTK_BOX (hbox), gg->color_ui.symbol_display, true, true, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->color_ui.symbol_display, "Click to select glyph type and size -- which also selects the line type", NULL); g_signal_connect (G_OBJECT (gg->color_ui.symbol_display), "expose_event", G_CALLBACK (symbol_display_expose_cb), gg); g_signal_connect (G_OBJECT (gg->color_ui.symbol_display), "button_press_event", G_CALLBACK (choose_glyph_cb), gg); gtk_widget_set_events (gg->color_ui.symbol_display, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); /* * the display of line types and widths */ gg->color_ui.line_display = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->color_ui.line_display, false); width = NEDGETYPES * gg->color_ui.spacing + /*-- lines --*/ (NEDGETYPES + 1) * gg->color_ui.spacing; /*-- space between --*/ /*-- use the same height we used for the symbol display --*/ gtk_widget_set_size_request (GTK_WIDGET (gg->color_ui.line_display), width, height); gtk_box_pack_start (GTK_BOX (hbox), gg->color_ui.line_display, true, true, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->color_ui.line_display, "Shows the line type corresponding to the current glyph selection", NULL); g_signal_connect (G_OBJECT (gg->color_ui.line_display), "expose_event", G_CALLBACK (line_display_expose_cb), gg); /* g_signal_connect (G_OBJECT (gg->color_ui.line_display), "button_press_event", G_CALLBACK (choose_linetype_cb), gg); */ gtk_widget_set_events (gg->color_ui.line_display, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); /*-- --*/ fg_frame = gtk_frame_new ("Foreground colors"); gtk_box_pack_start (GTK_BOX (vbox), fg_frame, false, false, 0); ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (fg_frame), ebox); /*-- create MAXNCOLORS drawing areas, showing gg->activeColorScheme->n of them --*/ fg_table = gtk_table_new (1, MAXNCOLORS, true); gtk_container_add (GTK_CONTAINER (ebox), fg_table); k = 0; for (i = 0, j = 0; i < MAXNCOLORS; i++) { gg->color_ui.fg_da[k] = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->color_ui.fg_da[k], false); g_object_set_data (G_OBJECT (gg->color_ui.fg_da[k]), "index", GINT_TO_POINTER (k)); gtk_widget_set_size_request (GTK_WIDGET (gg->color_ui.fg_da[k]), PSIZE, PSIZE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->color_ui.fg_da[k], "Click to select brushing color, double click to reset", NULL); gtk_widget_set_events (gg->color_ui.fg_da[k], GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); g_signal_connect (G_OBJECT (gg->color_ui.fg_da[k]), "button_press_event", G_CALLBACK (set_color_id), gg); g_signal_connect (G_OBJECT (gg->color_ui.fg_da[k]), "expose_event", G_CALLBACK (color_expose_fg), gg); gtk_table_attach (GTK_TABLE (fg_table), gg->color_ui.fg_da[k], i, i + 1, j, j + 1, GTK_FILL, GTK_FILL, 10, 10); k++; } /*-- hbox to contain bg, accent and hidden color frames --*/ hbox = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hbox, true, true, 0); /*-- Background color --*/ bg_frame = gtk_frame_new ("Background color"); gtk_box_pack_start (GTK_BOX (hbox), bg_frame, true, true, 0); ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (bg_frame), ebox); bg_table = gtk_table_new (1, 5, true); gtk_container_add (GTK_CONTAINER (ebox), bg_table); gg->color_ui.bg_da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->color_ui.bg_da, false); gtk_widget_set_size_request (GTK_WIDGET (gg->color_ui.bg_da), PSIZE, PSIZE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->color_ui.bg_da, "Double click to reset background color (Note: your color selection will have no visible effect unless the 'Value' is >>0; look to the right of the color wheel.)", NULL); gtk_widget_set_events (gg->color_ui.bg_da, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); g_signal_connect (G_OBJECT (gg->color_ui.bg_da), "expose_event", G_CALLBACK (color_expose_bg), gg); g_signal_connect (G_OBJECT (gg->color_ui.bg_da), "button_press_event", G_CALLBACK (set_color_id), gg); gtk_table_attach (GTK_TABLE (bg_table), gg->color_ui.bg_da, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 10, 10); /*-- Accent color --*/ accent_frame = gtk_frame_new ("Accent color"); gtk_box_pack_start (GTK_BOX (hbox), accent_frame, true, true, 0); ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (accent_frame), ebox); accent_table = gtk_table_new (1, 5, true); gtk_container_add (GTK_CONTAINER (ebox), accent_table); gg->color_ui.accent_da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->color_ui.accent_da, false); gtk_widget_set_size_request (GTK_WIDGET (gg->color_ui.accent_da), PSIZE, PSIZE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->color_ui.accent_da, "Double click to reset color for labels and axes", NULL); gtk_widget_set_events (gg->color_ui.accent_da, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); g_signal_connect (G_OBJECT (gg->color_ui.accent_da), "expose_event", G_CALLBACK (color_expose_accent), gg); g_signal_connect (G_OBJECT (gg->color_ui.accent_da), "button_press_event", G_CALLBACK (set_color_id), gg); gtk_table_attach (GTK_TABLE (accent_table), gg->color_ui.accent_da, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 10, 10); /*-- Shadow (hidden) color --*/ hidden_frame = gtk_frame_new ("Shadow color"); gtk_box_pack_start (GTK_BOX (hbox), hidden_frame, true, true, 0); ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (hidden_frame), ebox); hidden_table = gtk_table_new (1, 5, true); gtk_container_add (GTK_CONTAINER (ebox), hidden_table); gg->color_ui.hidden_da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->color_ui.hidden_da, false); gtk_widget_set_size_request (GTK_WIDGET (gg->color_ui.hidden_da), PSIZE, PSIZE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->color_ui.hidden_da, "Double click to reset color for labels and axes", NULL); gtk_widget_set_events (gg->color_ui.hidden_da, GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); g_signal_connect (G_OBJECT (gg->color_ui.hidden_da), "expose_event", G_CALLBACK (color_expose_hidden), gg); g_signal_connect (G_OBJECT (gg->color_ui.hidden_da), "button_press_event", G_CALLBACK (set_color_id), gg); gtk_table_attach (GTK_TABLE (hidden_table), gg->color_ui.hidden_da, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 10, 10); /*-- Temporary, perhaps: reverse video button --*/ btn = gtk_button_new_with_mnemonic ("_Reverse video"); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 0); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (reverse_video_cb), (gpointer) gg); /*-- Close button --*/ btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 0); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (hide_symbol_window_cb), (gpointer) gg); } gtk_widget_show_all (gg->color_ui.symbol_window); /* * In case the default colorscheme has fewer colors than the * default, hide the extra fg_da's. */ for (k = gg->activeColorScheme->n; k < MAXNCOLORS; k++) gtk_widget_hide (gg->color_ui.fg_da[k]); } ggobi-2.1.12/src/sp_plot_edges.c0000644000175000017500000004050214651527764012151 /* sp_plot_edges.c: routines for drawing edges */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include "vars.h" #include "externs.h" #include "colorscheme.h" /*------------------------------------------------------------------------*/ /* line drawing routines */ /*------------------------------------------------------------------------*/ gboolean splot_plot_edge (gint m, GGobiData * d, GGobiData * e, splotd * sp, displayd * display, ggobid * gg) { gint a, b; gboolean draw_edge; endpointsd *endpoints; endpoints = resolveEdgePoints (e, d); if (!endpoints) return (false); draw_edge = edge_endpoints_get (m, &a, &b, d, endpoints, e); if (!draw_edge) return (false); /*-- determine whether edge m should be plotted --*/ /*-- usually checking sampled is redundant because we're looping over rows_in_plot, but maybe we're not always --*/ if (e->excluded.els[m] || !e->sampled.els[m]) draw_edge = false; else if (!splot_plot_case (a, d, sp, display, gg) || !splot_plot_case (b, d, sp, display, gg)) draw_edge = false; /*-- can prevent drawing of missings for parcoords or scatmat plots --*/ else if (ggobi_data_has_missings(e) && !e->missings_show_p) { if (GGOBI_IS_EXTENDED_SPLOT (sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (klass->draw_edge_p) { draw_edge = klass->draw_edge_p (sp, m, d, e, gg); } } } return draw_edge; } gboolean splot_hidden_edge (gint m, GGobiData * d, GGobiData * e, splotd * sp, displayd * display, ggobid * gg) { gint a, b; gboolean hiddenp = false; endpointsd *endpoints; endpoints = resolveEdgePoints (e, d); if (endpoints && edge_endpoints_get (m, &a, &b, d, endpoints, e)) if (e->hidden_now.els[m] || d->hidden_now.els[a] || d->hidden_now.els[b]) hiddenp = true; /*-- can prevent drawing of missings for parcoords or scatmat plots --*/ /* } else if (ggobi_data_has_missings(e) && !e->missings_show_p) { if (GGOBI_IS_EXTENDED_SPLOT(sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_CLASS(GTK_OBJECT(sp)->klass); if (klass->draw_edge_p) { draw_edge = klass->draw_edge_p(sp, m, d, e, gg); } } } */ return hiddenp; } /*-- the current color and line type need to be drawn last --*/ void splot_edges_draw (splotd * sp, gboolean draw_hidden, GdkDrawable * drawable, ggobid * gg) { gint i, j, m; gint k, n, p, pp; gint a, b; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; GGobiData *e = display->e; endpointsd *endpoints; gboolean edges_show_p, arrowheads_show_p; gint lwidth, ltype; GlyphType gtype; colorschemed *scheme = gg->activeColorScheme; if (e == (GGobiData *) NULL || e->edge.n == 0) { /**/ return; } if (d->idTable == NULL) { /*-- d has no record ids --*/ /**/ return; } edges_show_p = (display->options.edges_directed_show_p || display->options.edges_undirected_show_p); arrowheads_show_p = (display->options.edges_directed_show_p || display->options.edges_arrowheads_show_p); if (!gg->mono_p && (edges_show_p || arrowheads_show_p)) { gint symbols_used[NGLYPHSIZES][NEDGETYPES][MAXNCOLORS]; gint nl = 0; gint ncolors = MIN (MAXNCOLORS, scheme->n); gint k_prev = -1, n_prev = -1, p_prev = -1; g_assert (e->color.nels == e->nrows); endpoints = resolveEdgePoints (e, d); if (!endpoints) return; for (k = 0; k < NGLYPHSIZES; k++) for (n = 0; n < NEDGETYPES; n++) for (p = 0; p < ncolors; p++) symbols_used[k][n][p] = 0; /* * Use e->color_now[] and e->glyph_now[] to work out which * line symbols should be drawn */ for (i = 0; i < e->nrows_in_plot; i++) { m = e->rows_in_plot.els[i]; /* If we're drawing hiddens and this is hidden and plottable ... */ if (((draw_hidden && splot_hidden_edge (m, d, e, sp, display, gg)) || /* Or if we're not drawing hiddens and this isn't hidden ... */ (!draw_hidden && !e->hidden_now.els[m]))) { gtype = e->glyph_now.els[m].type; ltype = ltype_from_gtype (gtype); /* if (gtype == FC || gtype == FR) ltype = SOLID; else if (gtype == OC || gtype == OR) ltype = WIDE_DASH; else ltype = NARROW_DASH; */ symbols_used[e->glyph_now.els[m].size][ltype][e->color_now.els[m]]++; } } if (draw_hidden) gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); for (k = 0; k < NGLYPHSIZES; k++) { for (n = 0; n < NEDGETYPES; n++) { for (pp = 0; pp < ncolors + 1; pp++) { /* * This is a little trick to draw the edges using the * current color last. I skip over them the first time * through, and pick them up at the end. It shouldn't * cost me anything, I don't think. Should I do * the same for glyphs? -- dfs, 4/2004 */ if (pp < ncolors) { if (pp == gg->color_id) continue; else p = pp; } else p = gg->color_id; if (symbols_used[k][n][p]) { /* * Now work through through symbols_used[], plotting the edges * of each color and type in a group. */ nl = 0; for (j = 0; j < e->edge.n; j++) { if (draw_hidden && !splot_hidden_edge (j, d, e, sp, display, gg)) continue; if (!draw_hidden && splot_hidden_edge (j, d, e, sp, display, gg)) continue; if (!splot_plot_edge (j, d, e, sp, display, gg)) continue; edge_endpoints_get (j, &a, &b, d, endpoints, e); gtype = e->glyph_now.els[j].type; ltype = ltype_from_gtype (gtype); /* if (gtype == FC || gtype == FR) ltype = SOLID; else if (gtype == OC || gtype == OR) ltype = WIDE_DASH; else ltype = NARROW_DASH; */ if (e->color_now.els[j] == p && ltype == n && e->glyph_now.els[j].size == k) { if (edges_show_p) { if (endpoints[j].jpartner == -1) { sp->edges[nl].x1 = sp->screen[a].x; sp->edges[nl].y1 = sp->screen[a].y; sp->edges[nl].x2 = sp->screen[b].x; sp->edges[nl].y2 = sp->screen[b].y; } else { sp->edges[nl].x1 = sp->screen[a].x; sp->edges[nl].y1 = sp->screen[a].y; sp->edges[nl].x2 = sp->screen[a].x + (sp->screen[b].x - sp->screen[a].x) / 2; sp->edges[nl].y2 = sp->screen[a].y + (sp->screen[b].y - sp->screen[a].y) / 2; } } if (arrowheads_show_p) { /* * Add thick piece of the lines to suggest a * directional arrow. How thick should it be * compared to the current line thickness? */ if (endpoints[j].jpartner == -1) { /* not bidirectional */ sp->arrowheads[nl].x1 = (gint) (.2 * sp->screen[a].x + .8 * sp->screen[b].x); sp->arrowheads[nl].y1 = (gint) (.2 * sp->screen[a].y + .8 * sp->screen[b].y); sp->arrowheads[nl].x2 = sp->screen[b].x; sp->arrowheads[nl].y2 = sp->screen[b].y; } else { /*-- draw the partner's arrowhead --*/ gint ja, jb, jp = endpoints[j].jpartner; edge_endpoints_get (jp, &ja, &jb, d, endpoints, e); sp->arrowheads[nl].x1 = (gint) (.2 * sp->screen[ja].x + .8 * sp->screen[jb].x); sp->arrowheads[nl].y1 = (gint) (.2 * sp->screen[ja].y + .8 * sp->screen[jb].y); sp->arrowheads[nl].x2 = sp->screen[jb].x; sp->arrowheads[nl].y2 = sp->screen[jb].y; } } nl++; } } /*-- end of looping through edges --*/ if (!draw_hidden) { if (p_prev == -1 || p_prev != p) { /* color */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[p]); } } lwidth = lwidth_from_gsize (k); if (edges_show_p) { ltype = set_lattribute_from_ltype (n, gg); if (k_prev == -1 || k_prev != i || n_prev == -1 || n_prev != n) { gdk_gc_set_line_attributes (gg->plot_GC, lwidth, (gint) ltype, GDK_CAP_BUTT, GDK_JOIN_ROUND); } gdk_draw_segments (drawable, gg->plot_GC, sp->edges, nl); } if (arrowheads_show_p) { gdk_gc_set_line_attributes (gg->plot_GC, lwidth + 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_draw_segments (drawable, gg->plot_GC, sp->arrowheads, nl); gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } } /* * I thought this should be one bracket earlier, but I'm * having some kind of intermittent problem with brushing * edges after I have added them using the GUI. This may * fix the problem, which may have been a result of my * skipping over the current points --- though I don't see * why. dfs 5/2004 */ k_prev = k; n_prev = n; p_prev = p; } } } } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } void splot_add_edge_highlight_cue (splotd * sp, GdkDrawable * drawable, gint k, gboolean nearest, ggobid * gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; GGobiData *e = dsp->e; gint a, b; endpointsd *endpoints; colorschemed *scheme = gg->activeColorScheme; gboolean draw_edge = (dsp->options.edges_undirected_show_p || dsp->options.edges_directed_show_p); endpoints = resolveEdgePoints (e, d); if (!endpoints) return; draw_edge = draw_edge && edge_endpoints_get (k, &a, &b, d, endpoints, e); /* * How to distinguish between sticky and nearest edges? */ /*-- draw a thickened line only for nearest --*/ if (nearest && draw_edge) { gdk_gc_set_line_attributes (gg->plot_GC, 3, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[e->color_now.els[k]]); if (endpoints[k].jpartner == -1) { gdk_draw_line (drawable, gg->plot_GC, sp->screen[a].x, sp->screen[a].y, sp->screen[b].x, sp->screen[b].y); } else { /* thicken only half the line */ gdk_draw_line (drawable, gg->plot_GC, sp->screen[a].x, sp->screen[a].y, sp->screen[a].x + (sp->screen[b].x - sp->screen[a].x) / 2, sp->screen[a].y + (sp->screen[b].y - sp->screen[a].y) / 2); } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); } } void splot_add_edge_label (splotd * sp, GdkDrawable * drawable, gint k, gboolean nearest, ggobid * gg) { gchar *lbl; displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; GGobiData *e = dsp->e; gint xp, yp; gint a, b; endpointsd *endpoints; PangoLayout *layout = gtk_widget_create_pango_layout (sp->da, NULL); PangoRectangle rect; gboolean draw_edge = (dsp->options.edges_undirected_show_p || dsp->options.edges_directed_show_p); endpoints = resolveEdgePoints (e, d); if (!endpoints) return; draw_edge = draw_edge && edge_endpoints_get (k, &a, &b, d, endpoints, e); /*-- If the edge is bidirectional, use both labels --*/ if (draw_edge) { /*-- add the label last so it will be in front of other markings --*/ /* for edge labels, this is not the appropriate cpanel ... */ lbl = identify_label_fetch (k, &dsp->cpanel, e, gg); layout_text (layout, lbl, &rect); if (sp->screen[a].x > sp->screen[b].x) { gint itmp = b; b = a; a = itmp; } xp = (sp->screen[b].x - sp->screen[a].x) / 2 + sp->screen[a].x; if (sp->screen[a].y > sp->screen[b].y) { gint itmp = b; b = a; a = itmp; } yp = (sp->screen[b].y - sp->screen[a].y) / 2 + sp->screen[a].y - rect.height; if (nearest) { underline_text (layout); gdk_draw_layout (drawable, gg->plot_GC, (sp->max.x - rect.width) / 2, 5, layout); } gdk_draw_layout (drawable, gg->plot_GC, xp, yp, layout); } } void splot_add_identify_edge_cues (splotd * sp, GdkDrawable * drawable, gint k, gboolean nearest, ggobid * gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *e = dsp->e; gboolean useDefault = false; if (k >= e->edge.n) return; if (e->hidden_now.els[k]) return; if (GGOBI_IS_EXTENDED_SPLOT (sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (klass->add_identify_edge_cues) klass->add_identify_edge_cues (k, sp, drawable, nearest, gg); else useDefault = true; } if (useDefault) { splot_add_edge_highlight_cue (sp, drawable, k, nearest, gg); splot_add_edge_label (sp, drawable, k, nearest, gg); } } void splot_add_edgeedit_cues (splotd * sp, GdkDrawable * drawable, gint k, gboolean nearest, ggobid * gg) { displayd *display = sp->displayptr; cpaneld *cpanel = &display->cpanel; colorschemed *scheme = gg->activeColorScheme; gint lwidth; gint size = gg->glyph_id.size; /*-- just rely on the cursor for adding points; no other markup --*/ if (cpanel->ee_mode == ADDING_EDGES) { if (k != -1) splot_add_diamond_cue (k, sp, drawable, gg); if (gg->edgeedit.a != -1) splot_add_diamond_cue (gg->edgeedit.a, sp, drawable, gg); if (gg->buttondown && gg->edgeedit.a != -1 && k != -1 && k != gg->edgeedit.a) { lwidth = lwidth_from_gsize (size); // Not sure gsize is relevant. gdk_gc_set_line_attributes (gg->plot_GC, lwidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_ROUND); /* This isn't really the color I want to use, but I don't know how to get at the color of the endpoints here. */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[gg->color_id]); gdk_draw_line (drawable, gg->plot_GC, sp->screen[gg->edgeedit.a].x, sp->screen[gg->edgeedit.a].y, sp->screen[k].x, sp->screen[k].y); } /* not ready to support deleting else if (cpanel->ee_deleting_p) */ } } ggobi-2.1.12/src/renderer-factory.gob0000644000175000017500000000107314651527764013122 %h{ #include "ggobi-renderer.h" %} %{ #include #if GTK_CHECK_VERSION(2,8,0) #include "ggobi-renderer-cairo.h" #else #define GGOBI_TYPE_RENDERER_CAIRO GGOBI_TYPE_RENDERER #endif %} class GGobi:Renderer:Factory from G:Object { public GGobiRendererFactory * new(void) { GObject *obj = (GObject *)GET_NEW; return GGOBI_RENDERER_FACTORY(obj); } virtual GGobiRenderer * create(self, GdkDrawable *parent) { GObject *obj = g_object_new(GGOBI_TYPE_RENDERER, "parent", parent, NULL); return GGOBI_RENDERER(obj); } } ggobi-2.1.12/src/movepts_ui.c0000644000175000017500000001645014651527764011521 /* movepts_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" static void reset_all_cb (GtkButton * button, ggobid * gg) { GSList *l; GGobiData *d; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; while (g_slist_length (d->movepts_history) > 0) { /*-- yes, twice -- once for x motion, once for y motion --*/ movepts_history_delete_last (d, gg); movepts_history_delete_last (d, gg); } tform_to_world (d, gg); } displays_tailpipe (FULL, gg); } static void undo_last_cb (GtkButton * button, ggobid * gg) { GGobiData *d = gg->current_display->d; /*-- remove the last two cells --*/ movepts_history_delete_last (d, gg); movepts_history_delete_last (d, gg); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } static void move_cluster_cb (GtkWidget * w, ggobid * gg) { gg->movepts.cluster_p = GTK_TOGGLE_BUTTON (w)->active; } static gchar *mdir_lbl[] = { "Both", "Vertical", "Horizontal" }; static void mdir_cb (GtkWidget * w, ggobid * gg) { gg->movepts.direction = (enum directiond) gtk_combo_box_get_active (GTK_COMBO_BOX (w)); } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ return false; } static gint motion_notify_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); displayd *display = sp->displayptr; gg->current_splot = sp->displayptr->current_splot = sp;/*-- just in case --*/ /* * allow point motion only for * scatterplots * the splotd members of a scatmat that are xyplots. */ if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->move_points_motion_cb) klass->move_points_motion_cb (display, sp, w, event, gg); } return true; } static gint button_press_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { displayd *display = (displayd *) sp->displayptr; ggobid *gg = GGobiFromSPlot (sp); gg->current_display = display; gg->current_splot = sp->displayptr->current_splot = sp; /* * allow point motion only for * scatterplots * the splotd members of a scatmat that are xyplots. */ if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->move_points_button_cb) klass->move_points_button_cb (display, sp, w, event, gg); } else g_printerr ("Sorry, you can not points in this display or plot\n"); return true; } static gint button_release_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); gg->buttondown = 0; gdk_pointer_ungrab (event->time); /*-- grabbed in mousepos_get_pressed --*/ displays_plot (NULL, QUICK, gg); return retval; } void movepts_event_handlers_toggle (splotd * sp, gboolean state) { displayd *display = sp->displayptr; if (state == on) { if (GGOBI_IS_WINDOW_DISPLAY (display)) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window), "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK (button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK (button_release_cb), (gpointer) sp); sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (motion_notify_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); disconnect_motion_signal (sp); } } void cpanel_movepts_make (ggobid * gg) { modepaneld *panel; GtkWidget *btn, *opt, *box, *hb, *lbl; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup (GGOBI (getIModeName) (MOVEPTS)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /*-- option menu: direction of motion --*/ hb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Direction of _motion:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 1); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Move freely, or constrain the motion vertically or horizontally", NULL); populate_combo_box (opt, mdir_lbl, G_N_ELEMENTS (mdir_lbl), G_CALLBACK (mdir_cb), gg); gtk_box_pack_start (GTK_BOX (hb), opt, false, false, 0); /*-- Use group toggle --*/ btn = gtk_check_button_new_with_mnemonic ("Move brush _group"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Move all points with the same symbol", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (move_cluster_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); /*-- Box to hold reset buttons --*/ box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic ("_Reset all"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset all points to their original positions", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (reset_all_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, false, false, 1); btn = gtk_button_new_from_stock (GTK_STOCK_UNDO); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Undo the previous move", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (undo_last_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, false, false, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); gtk_widget_show_all (panel->w); } ggobi-2.1.12/src/fileio.c0000644000175000017500000001210214651527764010564 /* fileio.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "ggobi.h" #include #include #include #include #include #include #include "GGobiAPI.h" #include "plugin.h" static gboolean isUnknownInputMode (const gchar * modeName); /*---------------------------------------------------------------------- Initialize and populate in an InputDescription: work out the mode of the data, the fully expanded name of the file, the base name, the name of its directory, ... The algorithm is as follows: If we're given a plugin, ask it for the description, if it has one, return Loop through all available plugins If the input mode is unknown ask the plugin to probe the file, if it can If it can't probe or probe returns true, ask the plugin for a description. If the mode is known ask the plugin if it supports it, if it does, ask for a description. If we have a description, return, else continue Return NULL (failure) ----------------------------------------------------------------------*/ InputDescription * fileset_generate (const gchar * fileName, const gchar * modeName, GGobiPluginInfo * plugin, ggobid * gg) { GList *els; gboolean isUnknownMode; if (plugin) { InputDescription *desc; desc = callInputPluginGetDescription (fileName, modeName, plugin, gg); if (desc) return (desc); } isUnknownMode = isUnknownInputMode (modeName); els = sessionOptions->info->inputPlugins; if (els) { gint i, n; n = g_list_length (els); for (i = 0; i < n; i++) { gboolean handlesFile = false; GGobiPluginInfo *oplugin; GGobiInputPluginInfo *info; oplugin = g_list_nth_data (els, i); info = oplugin->info.i; /* Use the probe only if the user has not given us a specific format/plugin. */ if (isUnknownMode) { if (info->probe) handlesFile = info->probe (fileName, gg, oplugin); else handlesFile = true; } if ((isUnknownMode && handlesFile) || (modeName && oplugin && pluginSupportsInputMode (modeName, oplugin))) { InputDescription *desc; desc = callInputPluginGetDescription (fileName, modeName, oplugin, gg); if (desc) return (desc); } } } return (NULL); } void completeFileDesc (const gchar * fileName, InputDescription * desc) { if (!desc->baseName) { desc->baseName = g_path_get_basename(fileName); } /* Now compute the directory name. */ desc->dirName = g_path_get_dirname(fileName); } void showInputDescription (InputDescription * desc, ggobid * gg) { FILE *out = stderr; gint i; fprintf (out, "Input File Information:\n"); fprintf (out, "\tFile name: %s (extension: %s)\n", desc->fileName, desc->givenExtension); fprintf (out, "\tDirectory: %s\n", desc->dirName); /* FIXME: Convert DataMode to a GEnum, then we can get a string for this fprintf (out, "\tFormat: %s (%d), verified: %s\n", GGOBI (getDataModeDescription) (desc->mode), desc->mode, desc->canVerify ? "yes" : "no");*/ if (desc->extensions) { fprintf (out, "Auxillary files\n"); for (i = 0; i < g_slist_length (desc->extensions); i++) { fprintf (out, " %d) %s\n", i, (gchar *) g_slist_nth_data (desc->extensions, i)); } } fflush (out); } /*--------------------------------------------------------------------*/ /* Determining the mode of the data */ /*--------------------------------------------------------------------*/ /** FIXME: Need a more robust URL identification scheme */ gboolean isURL (const gchar * fileName) { return ((strncmp (fileName, "http:", 5) == 0 || strncmp (fileName, "ftp:", 4) == 0)); } static gboolean isUnknownInputMode (const gchar * modeName) { gboolean status; status = !modeName || !strlen(modeName) || strcmp (modeName, DefaultUnknownInputModeName) == 0; return (status); } /*--------------------------------------------------------------------*/ /* Utilities */ /*--------------------------------------------------------------------*/ /* Note the only way to reliably test readability on Windows is to actually try to open the file. Here we are basically checking for existence. */ gboolean file_is_readable (const gchar *fileName) { if (GLIB_CHECK_VERSION(2,8,0)) return(!g_access(fileName, R_OK)); return !access(fileName, R_OK); } ggobi-2.1.12/src/tsPlot.c0000644000175000017500000002026514651527764010613 /* tsPlot.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of time series code: Nicholas Lewin-Koh */ #include "ggobi.h" #include "tsdisplay.h" #include #include "externs.h" static void tsWorldToPlane(splotd *sp, GGobiData *d, ggobid *gg); static void tsWithinPlaneToScreen(splotd *sp, displayd *display, GGobiData *d, ggobid *gg); static gboolean tsDrawEdge_p(splotd *sp, gint m, GGobiData *d, GGobiData *e, ggobid *gg); static gboolean tsDrawCase_p(splotd *sp, gint m, GGobiData *d, ggobid *gg); static void tsAddPlotLabels(splotd *sp, GdkDrawable *drawable, ggobid *gg) ; static void tsWithinDrawBinned(splotd *sp, gint m, GdkDrawable *drawable, GdkGC *gc); static void tsShowWhiskers(splotd *sp, gint m, GdkDrawable *drawable, GdkGC *gc); static GdkSegment * tsAllocWhiskers(GdkSegment *, splotd *sp, gint nrows, GGobiData *d); static gchar *tsTreeLabel(splotd *sp, GGobiData *d, ggobid *gg); void tsWorldToPlane(splotd *sp, GGobiData *d, ggobid *gg) { xy_reproject (sp, d->world.vals, d, gg); } splotd * ggobi_time_series_splot_new(displayd *dpy, ggobid *gg) { timeSeriesSPlotd *bsp; splotd *sp; bsp = g_object_new(GGOBI_TYPE_TIME_SERIES_SPLOT, NULL); sp = GGOBI_SPLOT(bsp); splot_init(sp, dpy, gg); return(sp); } void tsDestroy(splotd *sp) { g_free ((gpointer) sp->whiskers); } void tsWithinPlaneToScreen(splotd *sp, displayd *display, GGobiData *d, ggobid *gg) { tsplot_whiskers_make (sp, display, gg); } gboolean tsDrawEdge_p(splotd *sp, gint m, GGobiData *d, GGobiData *e, ggobid *gg) { gboolean draw_edge = true; draw_edge = !(ggobi_data_is_missing(e, m, sp->xyvars.y) || ggobi_data_is_missing(e, m, sp->xyvars.x)); return(draw_edge); } gboolean tsDrawCase_p(splotd *sp, gint m, GGobiData *d, ggobid *gg) { return !(ggobi_data_is_missing(d, m, sp->xyvars.y) || ggobi_data_is_missing(d, m, sp->xyvars.x)); } void tsAddPlotLabels(splotd *sp, GdkDrawable *drawable, ggobid *gg) { displayd *display = sp->displayptr; GList *l = display->splots; PangoLayout *layout = gtk_widget_create_pango_layout(sp->da, NULL); PangoRectangle rect; if (l->data == sp) { layout_text(layout, ggobi_data_get_transformed_col_name(display->d, sp->xyvars.x), &rect); gdk_draw_layout(drawable, gg->plot_GC, sp->max.x - rect.width - 5, sp->max.y - rect.height - 5, layout ); } layout_text(layout, ggobi_data_get_transformed_col_name(display->d, sp->xyvars.y), &rect); gdk_draw_layout(drawable, gg->plot_GC, 5, 5, layout); g_object_unref(G_OBJECT(layout)); } void tsWithinDrawBinned(splotd *sp, gint m, GdkDrawable *drawable, GdkGC *gc) { gdk_draw_line (drawable, gc, sp->whiskers[m].x1, sp->whiskers[m].y1, sp->whiskers[m].x2, sp->whiskers[m].y2); } void tsShowWhiskers(splotd *sp, gint m, GdkDrawable *drawable, GdkGC *gc) { displayd *dpy = sp->displayptr; /*-- there are n-1 whiskers --*/ if (dpy->options.whiskers_show_p && m < dpy->d->nrows_in_plot-1) gdk_draw_line (drawable, gc, sp->whiskers[m].x1, sp->whiskers[m].y1, sp->whiskers[m].x2, sp->whiskers[m].y2); } GdkSegment * tsAllocWhiskers(GdkSegment *whiskers, splotd *sp, gint nrows, GGobiData *d) { return((GdkSegment *) g_realloc (whiskers, (nrows-1) * sizeof (GdkSegment))); } gchar * tsTreeLabel(splotd *sp, GGobiData *d, ggobid *gg) { return(ggobi_data_get_col_name(d, sp->xyvars.y)); } static gint splotVariablesGet(splotd *sp, gint *cols, GGobiData *d) { cols[0] = sp->xyvars.x; cols[1] = sp->xyvars.y; return(2); } /* XX Incomplete. Need to finish off the construction of splotd's directly from command line language rather than as part of the displayd. */ splotd * tsplotCreateWithVars(displayd *display, gint *vars, gint nvar, ggobid *gg) { splotd *sp; if(nvar < 1) { g_printerr("not enough variables specified to create time series plot\n"); return(NULL); } sp = ggobi_time_series_splot_new(display, gg); if(nvar > 1) { sp->xyvars.y = vars[1]; sp->xyvars.x = vars[0]; } else { sp->xyvars.y = vars[0]; sp->xyvars.x = 0; } return(sp); } static void splotAssignPointsToBins(GGobiData *d, splotd *sp, ggobid *gg) { assign_points_to_bins (d, sp, gg); } static void splotScreenToTform(cpaneld *cpanel, splotd *sp, icoords *scr, fcoords *tfd, ggobid *gg) { gcoords planar, world; greal precis = (greal) PRECISION1; greal ftmp, max, min, rdiff; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gfloat scale_x, scale_y; vartabled *vtx, *vty; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; /* * screen to plane */ planar.x = (scr->x - sp->max.x/2) * precis / sp->iscale.x ; planar.x += sp->pmid.x; planar.y = (scr->y - sp->max.y/2) * precis / sp->iscale.y ; planar.y += sp->pmid.y; /* * plane to tform */ /* x */ vtx = vartable_element_get (sp->xyvars.x, d); max = vtx->lim.max; min = vtx->lim.min; rdiff = max - min; world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; /* y */ vty = vartable_element_get (sp->xyvars.y, d); max = vty->lim.max; min = vty->lim.min; rdiff = max - min; world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } void timeSeriesSPlotClassInit(GGobiTimeSeriesSPlotClass *klass) { klass->extendedSPlotClass.splot.redraw = QUICK; klass->extendedSPlotClass.tree_label = tsTreeLabel; klass->extendedSPlotClass.within_draw_to_binned = tsWithinDrawBinned; klass->extendedSPlotClass.within_draw_to_unbinned = tsShowWhiskers; klass->extendedSPlotClass.draw_edge_p = tsDrawEdge_p; klass->extendedSPlotClass.draw_case_p = tsDrawCase_p; klass->extendedSPlotClass.add_plot_labels = tsAddPlotLabels; klass->extendedSPlotClass.sub_plane_to_screen = tsWithinPlaneToScreen; klass->extendedSPlotClass.alloc_whiskers = tsAllocWhiskers; /* reverse pipeline */ klass->extendedSPlotClass.screen_to_tform = splotScreenToTform; klass->extendedSPlotClass.world_to_plane = tsWorldToPlane; klass->extendedSPlotClass.plotted_vars_get = splotVariablesGet; klass->extendedSPlotClass.createWithVars = tsplotCreateWithVars; klass->extendedSPlotClass.splot_assign_points_to_bins = splotAssignPointsToBins; } void timeSeriesClassInit(GGobiTimeSeriesDisplayClass *klass) { klass->parent_class.binning_ok = false; klass->parent_class.treeLabel = klass->parent_class.titleLabel = "Time Series"; klass->parent_class.create = timeSeriesDisplayCreate; klass->parent_class.createWithVars = tsplot_new_with_vars; klass->parent_class.variable_select = tsplot_varsel; klass->parent_class.variable_plotted_p = tsplotIsVarPlotted; klass->parent_class.cpanel_set = tsplotCPanelSet; klass->parent_class.display_unset = NULL; klass->parent_class.display_set = tsplotDisplaySet; klass->parent_class.mode_ui_get = tsplot_mode_ui_get; klass->parent_class.varpanel_refresh = tsplotVarpanelRefresh; klass->parent_class.handles_interaction = tsplotHandlesInteraction; #ifdef STORE_SESSION_ENABLED klass->parent_class.xml_describe = add_xml_tsplot_variables; #endif klass->parent_class.varpanel_tooltips_set = tsplotVarpanelTooltipsSet; klass->parent_class.plotted_vars_get = tsplotPlottedColsGet; klass->parent_class.imode_control_box = tsplotCPanelWidget; //klass->parent_class.menus_make = tsplotMenusMake; klass->parent_class.event_handlers_toggle = tsplotEventHandlersToggle; klass->parent_class.splot_key_event_handled = tsplotKeyEventHandled; klass->parent_class.add_plot_labels = NULL; } ggobi-2.1.12/src/tour1d_pp.h0000755000175000017500000000214014651527764011243 /* tour1d_pp.h */ /* Copyright (C) 2001 Dianne Cook and Sigbert Klinke and Eun-Kyung Lee This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The authors can be contacted at the following email addresses: dicook@iastate.edu sigbert@wiwi.hu-berlin.de */ void center (array_f *); gint pca (array_f *, void *, gfloat *, gpointer userData); gfloat t1d_calc_indx(array_f, Tour_PPIndex_f fun, void *param); gboolean t1d_switch_index(gint, gint, displayd *, ggobid *); ggobi-2.1.12/src/splot.h0000644000175000017500000001525514651527764010477 /*-- splot.h: the variables required for each single plot --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef SPLOT_H #define SPLOT_H #include "defines.h" typedef struct _displayd displayd; #define GGOBI_TYPE_SPLOT (ggobi_splot_get_type ()) #define GGOBI_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_SPLOT, splotd)) #define GGOBI_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_SPLOT, GGobiSPlotClass)) #define GGOBI_IS_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_SPLOT)) #define GGOBI_IS_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_SPLOT)) #define GGOBI_SPLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_SPLOT, GGobiSPlotClass)) GType ggobi_splot_get_type(void); typedef struct { GtkDrawingAreaClass parent_class; RedrawStyle redraw; /* used by barchart to indicate it needs to do a full redraw from set_color_id. */ } GGobiSPlotClass; typedef struct { GtkDrawingArea canvas; displayd *displayptr; /* a pointer to the enclosing display */ GtkWidget *da; /* drawing_area */ GdkPixmap *pixmap0, *pixmap1; /* 2-stage drawing */ GdkCursor *cursor; GdkCursorType jcursor; RedrawStyle redraw_style; /* Drawing area dimensions */ icoords max; /* * line segments in scatterplot and scatmat */ GdkSegment *arrowheads; GdkSegment *edges; /* * line segments in parallel coordinates plot */ GdkSegment *whiskers; gcoords *planar; icoords *screen; /* * shift and scale */ fcoords scale, tour_scale; gcoords iscale; gcoords pmid; /*-- center of the screen in planar/world coords --*/ /* * button and key event information */ gint motion_id, press_id, release_id, key_press_id, scroll_id; icoords mousedownpos, mousepos, mousepos_o; brush_coords brush_pos, brush_pos_o; /* * plot1d (used in parcoords as well as scatterplot) */ gint p1dvar; struct _p1d { vector_f spread_data; /* the spreading data */ lims lim; /* limits of the spreading data */ gfloat mean; /*-- line segments in ASHes --*/ icoords ash_baseline; /*-- for drawing segments from point to baseline --*/ } p1d; /* * tour1d (variables used to record the state of the 1D tour for this plot) */ struct _tour1d { gfloat mincnt; gfloat maxcnt; gfloat minscreenx; gfloat maxscreenx; gboolean initmax; icoords ash_baseline; /*-- for drawing segments from point to baseline --*/ } tour1d; /* * tour2d: rescaling so that points don't go outside the planar space */ struct _tour2d { greal maxscreen; gboolean initmax; } tour2d; /* * tour2d: rescaling so that points don't go outside the planar space */ struct _tourcorr { greal maxscreen; gboolean initmax; } tourcorr; /* * xyplot */ icoords xyvars; /*-- rotation implemented as a limited tour2d --*/ struct _tour2d3 { greal maxscreen; gboolean initmax; } tour2d3; #ifdef WIN32 struct _win32 { gint npoints; GdkPoint *points; GdkSegment *segs; GdkSegment *whisker_segs; GdkSegment *ash_segs; rectd *open_rects; rectd *filled_rects; arcd *open_arcs; arcd *filled_arcs; } win32; #endif } splotd; #define GGOBI_TYPE_EXTENDED_SPLOT (ggobi_extended_splot_get_type()) #define GGOBI_EXTENDED_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_EXTENDED_SPLOT, extendedSPlotd)) #define GGOBI_EXTENDED_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_EXTENDED_SPLOT, GGobiExtendedSPlotClass)) #define GGOBI_IS_EXTENDED_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_EXTENDED_SPLOT)) #define GGOBI_IS_EXTENDED_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_EXTENDED_SPLOT)) #define GGOBI_EXTENDED_SPLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_EXTENDED_SPLOT, GGobiExtendedSPlotClass)) GType ggobi_extended_splot_get_type(void); #include "ggobi-data.h" typedef struct { GGobiSPlotClass splot; gchar *(*tree_label)(splotd *sp, GGobiData *d, ggobid *gg); gboolean (*identify_notify)(icoords, splotd *, GGobiData *, ggobid *); void (*add_plot_labels)(splotd *, GdkDrawable *, ggobid *gg); void (*add_markup_cues)(splotd *, GdkDrawable *, ggobid *); void (*add_scaling_cues)(splotd *, GdkDrawable *, ggobid *); void (*add_identify_cues)(gboolean, gint k, splotd *, GdkDrawable *, ggobid *); void (*add_identify_edge_cues)(gint k, splotd *, GdkDrawable *, gboolean, ggobid *); gboolean (*redraw)(splotd *, GGobiData *, ggobid *, gboolean binned); void (*screen_to_tform)(cpaneld *, splotd *, icoords *, fcoords *, ggobid *); void (*world_to_plane)(splotd *, GGobiData *, ggobid *); /** Convenience to be called within the standard loop */ void (*sub_plane_to_screen)(splotd *sp, displayd *dpy, GGobiData *d, ggobid *gg); /** Allows the class to take over the entire plane_to_screen. Handling each row can be done using a method for sub_plane_to_screen. */ void (*plane_to_screen)(splotd *, GGobiData *, ggobid *); gint (*active_paint_points)(splotd *, GGobiData *, ggobid *); GdkSegment *(*alloc_whiskers)(GdkSegment *, splotd *sp, gint nrows, GGobiData *d); /** called from splot_plot_edge */ gboolean (*draw_edge_p)(splotd *sp, gint m, GGobiData *d, GGobiData *e, ggobid *gg); /** called from splot_plot_case. Should probably be the same as draw_edge_p but doesn't take the edge argument! Could drop the first datad in splot_plot_edge and just hand it the one dataset. */ gboolean (*draw_case_p)(splotd *sp, gint m, GGobiData *d, ggobid *gg); void (*within_draw_to_binned)(splotd *sp, gint m, GdkDrawable *drawable, GdkGC *gc); void (*within_draw_to_unbinned)(splotd *sp, gint m, GdkDrawable *drawable, GdkGC *gc); void (*splot_assign_points_to_bins)(GGobiData *, splotd *, ggobid *); gint (*plotted_vars_get)(splotd *sp, gint *vars, GGobiData *d); splotd * (*createWithVars)(displayd *dpy, gint *vars, gint nvars, ggobid *gg); } GGobiExtendedSPlotClass; typedef struct { splotd splot; } extendedSPlotd; void splot_init(splotd *sp, displayd *display, struct _ggobid *gg); /* shared by barchart and parcoords. */ gint splot1DVariablesGet(splotd *sp, gint *cols, GGobiData *d); #endif ggobi-2.1.12/src/jitter.c0000644000175000017500000000634014651527764010625 /* jitter.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * Contains jittering routines for tform; see missing.c for the * jittering routines for missing data. */ #include #include #include #include "vars.h" #include "externs.h" gfloat jitter_randval (gint type) { /* * generate a random value. */ gdouble drand; static gdouble dsave; static gboolean isave = false; if (type == UNIFORM) { drand = randvalue (); /* * Center and scale to [-1, 1] */ drand = (drand - .5) * 2; } else if (type == NORMAL) { gboolean check = true; gdouble d, dfac; if (isave) { isave = false; /* prepare to return the previously saved value */ drand = dsave; } else { isave = true; while (check) { rnorm2 (&drand, &dsave); d = drand * drand + dsave * dsave; if (d < 1.0) { check = false; dfac = sqrt (-2. * log (d) / d); drand = drand * dfac; dsave = dsave * dfac; } } /* end while */ } /* end else */ /* * Already centered; scale to approximately [-1, 1] */ drand = (drand / 3.0); } return ((gfloat) drand); } void rejitter (gint * selected_cols, gint nselected_cols, GGobiData * d, ggobid * gg) { gint i, j, k, m; greal frand, fworld, fjit; greal precis = (gfloat) PRECISION1; vartabled *vt; g_assert (d->jitdata.nrows == d->nrows); g_assert (d->jitdata.ncols == d->ncols); for (j = 0; j < nselected_cols; j++) { k = selected_cols[j]; vt = vartable_element_get (k, d); for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; /*-- jitter_one_value (m, k); --*/ frand = (greal) jitter_randval (d->jitter.type) * precis; /* * The world.vals used here is already jittered: * subtract out the previous jittered value ... */ if (d->jitter.convex) { fworld = d->world.vals[m][k] - d->jitdata.vals[m][k]; fjit = (greal) vt->jitter_factor * (frand - fworld); } else fjit = vt->jitter_factor * frand; d->jitdata.vals[m][k] = fjit; } } tform_to_world (d, gg); displays_tailpipe (FULL, gg); } void jitter_value_set (gfloat value, GGobiData * d, ggobid * gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (gg->jitter_ui.window)); gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; gint j; vartabled *vt; vars = get_selections_from_tree_view (tree_view, &nvars); for (j = 0; j < nvars; j++) { vt = vartable_element_get (vars[j], d); vt->jitter_factor = value; } g_free ((gpointer) vars); } ggobi-2.1.12/src/exclusion.c0000644000175000017500000000664514651527764011345 /* exclusion.c -- for manipulating clusters */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" void symbol_table_zero (GGobiData * d) { gint j, k, m; for (j = 0; j < NGLYPHTYPES; j++) for (k = 0; k < NGLYPHSIZES; k++) for (m = 0; m < MAXNCOLORS; m++) d->symbol_table[j][k][m].n = d->symbol_table[j][k][m].nhidden = d->symbol_table[j][k][m].nshown = 0; } /* * loop over colors within glyph types and sizes, and * populate d->symbol_table */ gint symbol_table_populate (GGobiData * d) { register gint i, j, k, m; gint nclusters = 0; symbol_table_zero (d); /*-- loop over all data --*/ for (i = 0; i < d->nrows; i++) { j = d->glyph.els[i].type; k = d->glyph.els[i].size; m = d->color.els[i]; if (d->symbol_table[j][k][m].n == 0) nclusters++; d->symbol_table[j][k][m].n++; if (d->hidden.els[i]) { d->symbol_table[j][k][m].nhidden++; } else d->symbol_table[j][k][m].nshown++; } return nclusters; } void clusters_set (GGobiData * d, ggobid * gg) { gint i, j, k, m; gint n, nclusters; colorschemed *scheme = gg->activeColorScheme; nclusters = symbol_table_populate (d); /*-- reallocate the array of cluster structures --*/ d->clusv = (clusterd *) g_realloc (d->clusv, nclusters * sizeof (clusterd)); /* * make sure new clusters are not excluded, without changing the * status of pre-existing clusters. */ for (i = d->nclusters; i < nclusters; i++) d->clusv[i].hidden_p = false; /* * populate the clusv structures using the information in the * 3-d table of counts of each size/type/color combination. */ n = 0; for (j = 0; j < NGLYPHTYPES; j++) { for (k = 0; k < NGLYPHSIZES; k++) { for (m = 0; m < scheme->n; m++) { if (d->symbol_table[j][k][m].n > 0) { d->clusv[n].glyphtype = j; g_assert (j >= 0 && j < NGLYPHTYPES); d->clusv[n].glyphsize = k; g_assert (k >= 0 && k < NGLYPHSIZES); d->clusv[n].color = m; g_assert (m >= 0 && m < MAXNCOLORS); d->clusv[n].nhidden = d->symbol_table[j][k][m].nhidden; d->clusv[n].nshown = d->symbol_table[j][k][m].nshown; d->clusv[n].n = d->symbol_table[j][k][m].n; n++; } } } } /* * clusterid is the groups vector: an integer for each case, * indicating its cluster membership */ vectori_alloc_zero (&d->clusterid, d->nrows); if (nclusters > 0 && nclusters != 1) { for (i = 0; i < d->nrows; i++) { for (n = 0; n < nclusters; n++) { if (d->sampled.els[i]) { if (d->glyph.els[i].type == d->clusv[n].glyphtype && d->glyph.els[i].size == d->clusv[n].glyphsize && d->color.els[i] == d->clusv[n].color) { d->clusterid.els[i] = n; break; } } } } } d->nclusters = nclusters; } ggobi-2.1.12/src/read_color.c0000644000175000017500000002011414651527764011430 /* read_color.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "ggobi.h" #include #include #include #include "read_init.h" #include "read_xml.h" /* extern int xmlDoValidityCheckingDefaultValue; */ colorschemed *process_colorscheme (xmlNodePtr root, xmlDocPtr doc); colorscaletype getColorSchemeType (const xmlChar * type); colorsystem getColorSchemeSystem (const xmlChar * type); gint getForegroundColor (gint index, xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme); void getForegroundColors (xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme); gint getAnnotationColor (xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme); gint getBackgroundColor (xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme); gint getColor (xmlNodePtr node, xmlDocPtr doc, gfloat ** original, GdkColor * col); colorschemed * read_colorscheme (gchar * fileName, GList ** list) { xmlDocPtr doc; xmlNodePtr node; colorschemed *scheme = NULL; // compiler pacification if (!file_is_readable (fileName) && !(strncmp ("http", fileName, 4) == 0 || strncmp ("ftp", fileName, 3) == 0)) { fprintf (stderr, "Couldn't read colorscheme from %s\n", fileName); fflush (stderr); return (NULL); } /* xmlSubstituteEntitiesDefault(1); */ doc = xmlParseFile (fileName); if (doc == NULL) return (NULL); /* If this is a colorschemes archive, then process each one individually. */ node = xmlDocGetRootElement (doc); if (strcmp ((char *) node->name, "colormap") == 0) { scheme = process_colorscheme (node, doc); if (list) { *list = g_list_append (*list, scheme); } return (scheme); } node = XML_CHILDREN (node); while (node) { if (node->type != XML_TEXT_NODE && node->type != XML_COMMENT_NODE) { scheme = process_colorscheme (node, doc); if (list) *list = g_list_append (*list, scheme); } node = node->next; } xmlFreeDoc (doc); if (sessionOptions->verbose == GGOBI_VERBOSE) g_printerr ("Read colorscheme from %s\n", fileName); return (scheme); } colorschemed * alloc_colorscheme () { colorschemed *scheme; scheme = (colorschemed *) g_malloc0 (sizeof (colorschemed)); scheme->rgb = NULL; scheme->rgb_bg.pixel = -1; scheme->rgb_accent.pixel = -1; scheme->colorNames = g_array_new (false, false, sizeof (gchar *)); return (scheme); } colorschemed * process_colorscheme (xmlNodePtr root, xmlDocPtr doc) { colorschemed *scheme; xmlNodePtr node; const xmlChar *tmp; xmlChar *val; scheme = alloc_colorscheme (); scheme->name = g_strdup ((gchar *) xmlGetProp (root, (xmlChar *) "name")); scheme->type = getColorSchemeType (xmlGetProp (root, (xmlChar *) "type")); scheme->system = getColorSchemeSystem (xmlGetProp (root, (xmlChar *) "system")); /* scheme->system_min = 0.0; tmp = xmlGetProp(root, "system_min"); if(tmp) scheme->system_min = (gfloat) asNumber(tmp); scheme->system_max = 1.0; tmp = xmlGetProp(root, "system_max"); if(tmp) scheme->system_max = (gfloat) asNumber(tmp); */ tmp = xmlGetProp (root, (xmlChar *) "criticalvalue"); if (tmp) scheme->criticalvalue = (gint) asNumber ((char *) tmp); tmp = xmlGetProp (root, (xmlChar *) "ncolors"); if (tmp) scheme->n = (gint) asNumber ((char *) tmp); node = getXMLElement (root, "description"); val = xmlNodeListGetString (doc, XML_CHILDREN (node), 1); scheme->description = g_strdup (g_strstrip ((gchar *) val)); g_free (val); node = getXMLElement (root, "foreground"); getForegroundColors (node, doc, scheme); node = getXMLElement (root, "background"); if (node) node = getXMLElement (node, "color"); getBackgroundColor (node, doc, scheme); node = getXMLElement (root, "annotations"); if (node) node = getXMLElement (node, "color"); getAnnotationColor (node, doc, scheme); return (scheme); } colorscaletype getColorSchemeType (const xmlChar * type) { if (strcmp ((char *) type, "diverging") == 0) return (diverging); else if (strcmp ((char *) type, "sequential") == 0) return (sequential); else if (strcmp ((char *) type, "spectral") == 0) return (spectral); else if (strcmp ((char *) type, "qualitative") == 0) return (qualitative); else return (UNKNOWN_COLOR_TYPE); } colorsystem getColorSchemeSystem (const xmlChar * type) { if (strcmp ((char *) type, "rgb") == 0) return (rgb); else if (strcmp ((char *) type, "hsv") == 0) return (hsv); else if (strcmp ((char *) type, "cmy") == 0) return (cmy); else if (strcmp ((char *) type, "cmyk") == 0) return (cmyk); else return (UNKNOWN_COLOR_SYSTEM); } /** Read the foreground colors node, processing each of the colors using getForegroundColor(). */ void getForegroundColors (xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme) { gint n = 0; xmlNodePtr tmp; tmp = XML_CHILDREN (node); while (tmp) { if (tmp->type != XML_TEXT_NODE) n++; tmp = tmp->next; } scheme->n = n; scheme->data = (gfloat **) g_malloc (n * sizeof (gfloat *)); scheme->rgb = (GdkColor *) g_malloc (n * sizeof (GdkColor)); tmp = XML_CHILDREN (node); n = 0; while (tmp) { if (tmp->type != XML_TEXT_NODE) { getForegroundColor (n, tmp, doc, scheme); n++; } tmp = tmp->next; } } gint getForegroundColor (gint index, xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme) { gint value; gchar *name; xmlChar *ptr; value = getColor (node, doc, &(scheme->data[index]), &scheme->rgb[index]); ptr = xmlGetProp (node, (xmlChar *) "name"); { gchar *tmp; tmp = name = (gchar *) g_malloc (sizeof (gchar) * (xmlStrlen (ptr) + 1)); while (ptr[0]) { *tmp++ = *ptr++; } tmp[0] = '\0'; } g_array_append_val (scheme->colorNames, name); return (value); } gint getBackgroundColor (xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme) { return (getColor (node, doc, &scheme->bg, &scheme->rgb_bg)); } gint getAnnotationColor (xmlNodePtr node, xmlDocPtr doc, colorschemed * scheme) { return (getColor (node, doc, &scheme->accent, &scheme->rgb_accent)); } /** Read a color of the form .... Puts the actual values into original and fills in the RGB settings for `col'. */ gint getColor (xmlNodePtr node, xmlDocPtr doc, gfloat ** original, GdkColor * col) { xmlNodePtr tmp; gint i = 0, numElements = 3; /* RGB only at present. */ gfloat *vals; gfloat colorsystem_min = 0.0; gfloat colorsystem_max = 1.0; gfloat max = 65535; /*-- color values must be scaled onto [0,65535] --*/ gchar *tmpVal; tmpVal = (gchar *) xmlGetProp (node, (xmlChar *) "min"); if (tmpVal) { colorsystem_min /= asNumber (tmpVal); } tmpVal = (gchar *) xmlGetProp (node, (xmlChar *) "max"); if (tmpVal) { colorsystem_max /= asNumber (tmpVal); } tmp = XML_CHILDREN (node); vals = (gfloat *) g_malloc (3 * sizeof (gfloat)); while (tmp) { xmlChar *val; if (tmp->type != XML_TEXT_NODE) { val = xmlNodeListGetString (doc, XML_CHILDREN (tmp), 1); vals[i] = asNumber ((char *) val); g_free (val); i++; } tmp = tmp->next; } if (original) *original = vals; /*-- scale onto [0,1] --*/ for (i = 0; i < 3; i++) vals[i] = (vals[i] - colorsystem_min) / (colorsystem_max - colorsystem_min); /*-- scale onto [0,65535] --*/ col->red = (guint16) (max * vals[0]); col->green = (guint16) (max * vals[1]); col->blue = (guint16) (max * vals[2]); return (numElements); } ggobi-2.1.12/src/tour1d_pp.c0000644000175000017500000005507214651527764011247 /* tour1d_pp.c */ /* Copyright (C) 2001, 2002 Dianne Cook and Sigbert Klinke and Eun-Kyung Lee This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The authors can be contacted at the following email addresses: dicook@iastate.edu sigbert@wiwi.hu-berlin.de */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include #include #if !defined __APPLE__ && !defined __GNUC__ #endif #include "vars.h" #include "externs.h" #include "tour1d_pp.h" #include "tour_pp.h" /*static gchar msg[1024];*/ /*-- projection pursuit indices --*/ #define HOLES 0 #define CENTRAL_MASS 1 #define PCA 2 #define LDA 3 #define CGINI 4 #define CENTROPY 5 #define CART_VAR 6 #define SUBD 7 #define EXPMINUS1 0.3678794411714423 #define ONEMINUSEXPMINUS1 0.63212056 /* void print() { FILE *f = fopen ("dump", "a"); if (f) { fprintf (f, "%s\n", msg); fclose(f); } }*/ void t1d_pptemp_set(gfloat slidepos, displayd *dsp, ggobid *gg) { dsp->t1d_pp_op.temp_start = slidepos; } void t1d_ppcool_set(gfloat slidepos, displayd *dsp, ggobid *gg) { dsp->t1d_pp_op.cooling = slidepos; } /* void alloc_holes1d_p(holes_param *hp, gint nrows) { hp->h0 = (gfloat *) g_malloc( (guint) nrows*sizeof(gfloat *)); } void free_holes1d_p(holes_param *hp) { g_free(hp->h0); } */ /***************************************************/ /* 1D Holes index for raw data */ /***************************************************/ /* gint holes1d_raw1(array_f *pdata, void *param, gfloat *val) { gint i, n=pdata->nrows; gfloat m1, x1, temp; gfloat var, acoefs; m1=0; for(i=0; ivals[i][0]; m1 /= n; var = 0; for(i=0; ivals[i][0]-m1)*(pdata->vals[i][0]-m1)/(n-1); acoefs=0.; for(i=0; ivals[i][0]-m1; temp = x1*x1/var; acoefs +=exp(-temp/2); } *val = (1.-acoefs/n)/(gfloat) ONEMINUSEXPMINUS1; return(0); } */ /**********************************************************/ /* 1D Central Mass index for raw data */ /**********************************************************/ /* gint central_mass1d_raw1(array_f *pdata, void *param, gfloat *val) { gint i, n=pdata->nrows; gfloat m1, x1, temp; gfloat var, acoefs; m1=0; for(i=0; ivals[i][0]; m1 /= n; var = 0; for(i=0; ivals[i][0]-m1)*(pdata->vals[i][0]-m1)/(n-1); acoefs=0.; for(i=0; ivals[i][0]-m1; temp = x1*x1/var; acoefs +=exp(-temp/2); } *val = (acoefs/n-(gfloat)EXPMINUS1)/(gfloat) ONEMINUSEXPMINUS1; return(0); } */ /******************************************************************** Index : PCA-d Transformation : - Purpose : computes the trace of the cov matrix of pdata Note : Modifies pdata ! *********************************************************************/ void center (array_f *data) { gint i, j; gfloat mean; for (i=0; incols; i++) { mean = 0.0; for (j=0; jnrows; j++) mean += data->vals[j][i]; mean = mean/data->nrows; for (j=0; jnrows; j++) data->vals[j][i] -= mean; } } gint pca (array_f *pdata, void *param, gfloat *val, gpointer userData) { gint i, j; center (pdata); *val = 0.0; for (i=0; incols; i++) { for (j=0; jnrows; j++) *val += pdata->vals[j][i]*pdata->vals[j][i]; } *val /= (pdata->nrows-1); return (0); } /******************************************************************** Index : SUB-d Transformation : Data should be standardized Purpose : Looks for d-dimensional structure in the projected data For this purpose a local PCA with k neighbours (k = min_neighbour+1, min_neighbour+1+neighbour_step, min_neighbour+1+2*neighbour_step,.., max_neighbour) is computed. We average the maximal explained variance for the datapoints 1, 1+data_step, 1+2*data_step, ... Note : Requires eispack.c *********************************************************************/ /*gint alloc_subd_p (subd_param *sp, gint nrows, gint ncols) { * Some default values * sp->min_neighbour = 10; sp->max_neighbour = 30; sp->dim = 1; sp->data_step = 1; sp->neighbour_step = 1; * initialize temporary space * sp->dist = g_malloc (nrows*sizeof(gfloat)); sp->index = g_malloc (nrows*sizeof(gint)); sp->nmean = g_malloc (ncols*sizeof(gfloat)); sp->mean = g_malloc (ncols*sizeof(gfloat)); sp->ew = g_malloc (ncols*sizeof(gfloat)); sp->ev = g_malloc (ncols*ncols*sizeof(gfloat)); sp->fv1 = g_malloc (ncols*sizeof(gfloat)); sp->fv2 = g_malloc (ncols*sizeof(gfloat)); sp->cov = g_malloc ((ncols+ncols)*sizeof(gfloat)); return 0; } gint free_subd_p (subd_param *sp) { free(sp->dist); free(sp->index); free(sp->nmean); free(sp->mean); free(sp->ew); free(sp->ev); free(sp->fv1); free(sp->fv2); free(sp->cov); return 0; } gfloat *base; int smallest (const void *left, const void *right) { gfloat l = base[*((gint *) left)], r = base[*((gint *) right)]; if (lr) return (1); return (0); } void distance (array_f *pdata, gint i, gfloat *dist) { gint j, k; for (j=0; jnrows; j++) { dist[j] = 0; for (k=0; kncols; k++) dist[j] += (pdata->vals[i][k] - pdata->vals[j][k]) *(pdata->vals[i][k] - pdata->vals[j][k]); } } void mean_min_neighbour (array_f *pdata, gint *index, int min_neighbour, gfloat *nmean) { gint j, k; for (k = 0; kncols; k++) nmean[k] = 0; for (j = 0; jncols; k++) nmean[k] += pdata->vals[index[j]][k]; } } void covariance (array_f *pdata, gint *index, int j, gfloat *mean, gfloat *cov) { gint k, p, q; for (p=0; pncols; p++) { for (q=0; q<=p; q++) { *(cov+p*pdata->ncols+q) = 0.0; for (k=0; k<=j; k++) { *(cov+p*pdata->ncols+q) += (pdata->vals[index[k]][p]-mean[p]) *(pdata->vals[index[k]][q]-mean[q]); } *(cov+p*pdata->ncols+q) /= j; *(cov+q*pdata->ncols+p) = *(cov+p*pdata->ncols+q); } } } gfloat variance_explained (gfloat *ew, gint d, gint p) { gfloat ewsum = 0, dimsum = 0; gint k; for (k=0; k=p-d) dimsum += ew[k]; } return (dimsum/ewsum); } void eigenvalues (gfloat *cov, gint p, gfloat *ew, gint matz, gfloat *ev, gfloat *fv1, gfloat *fv2) { gfloat lp, lq; if (p==2) { lp = 0.5*(*(cov+0) + *(cov+3)); lq = *(cov+0)* *(cov+3) - *(cov+1)* *(cov+2); ew[0] = lp - sqrt(lp*lp-lq); ew[1] = lp + sqrt(lp*lp-lq); } else {} * rs_ (&p, &p, cov, ew, &matz, ev, fv1, fv2, &ierr);* } gint subd (array_f *pdata, void *param, gfloat *val) { subd_param *sp = (subd_param *) param; gfloat varexp, dimmax; gint i, j, k, matz = 0, nused; *val = 0; nused = 0; for (i=0; inrows; i+= sp->data_step, nused++) { distance (pdata, i, sp->dist); for (j=0; jnrows; j++) sp->index[j] = j; base = sp->dist; qsort (sp->index, pdata->nrows, sizeof(gint), smallest); mean_min_neighbour (pdata, sp->index, sp->min_neighbour, sp->nmean); dimmax = 0; for (j = sp->min_neighbour; jmax_neighbour; j++) { for (k = 0; kncols; k++) sp->nmean[k] += pdata->vals[sp->index[j]][k]; if (((j-sp->min_neighbour)%sp->neighbour_step)==0) { for (k = 0; kncols; k++) sp->mean[k] = sp->nmean[k]/(j+1); covariance (pdata, sp->index, j, sp->mean, sp->cov); eigenvalues (sp->cov, pdata->ncols, sp->ew, matz, sp->ev, sp->fv1, sp->fv2); varexp = variance_explained (sp->ew, sp->dim, pdata->ncols); dimmax = (varexp>dimmax ? varexp : dimmax); } } *val += dimmax; } *val /= nused; return (0); } */ /*gint cartgini (array_f *pdata, void *param, gfloat *val) { cartgini_param *dp = (cartgini_param *) param; gint i, k, n, p, g = dp->groups, left, right; gfloat dev, prob; n = pdata->nrows; p = pdata->ncols; if (p != 1) return(-1); * Sort pdata by group * right = pdata->nrows-1; left = 0; sort_group(pdata,dp->group,left,right); * data relocation and make index * zero(dp->x,n); zero_int(dp->index,n); for (i=0; ix[i] = pdata->vals[i][0]; dp->index[i] = dp->group[i]; } left=0; right=n-1; sort_data(dp->x, dp->index,left,right) ; * Calculate gini index * zero_int(dp->nright,g); *val = 1; for (i=0; inright[i] = 0; *val -= (((gdouble)dp->ngroup[i])/((gdouble)n))* (((gdouble)dp->ngroup[i])/((gdouble)n)); } for (i=0; inright[(dp->index[i])])++; dev=2; for (k=0; knright[k])/((double)(i+1)); dev -= prob*prob; prob = ((double) (dp->ngroup[k]-dp->nright[k]))/((double)(n-i-1)); dev -= prob*prob; } if (dev<*val) *val = dev; } *val = (1-*val); return(0); }*/ /*gint cartentropy (array_f *pdata, void *param, gfloat *val) { cartentropy_param *dp = (cartentropy_param *) param; gint i, k, n, p, g = dp->groups, left, right; gfloat dev, prob; n = pdata->nrows; p = pdata->ncols; if (p != 1) return(-1); * Sort pdata by group * right = pdata->nrows-1; left = 0; sort_group(pdata,dp->group,left,right); * data relocation and make index * zero(dp->x,n); zero_int(dp->index,n); for (i=0; ix[i] = pdata->vals[i][0]; dp->index[i] = dp->group[i]; } left=0; right=n-1; sort_data(dp->x, dp->index,left,right) ; * Calculate entropy index * zero_int(dp->nright,g); *val = 0; for (i=0; igroups; i++) { dp->nright[i] = 0; prob = dp->ngroup[i]/pdata->nrows; if (prob>0) *val += prob*log(prob); } for (i=0; inrows-1; i++) { (dp->nright[dp->index[i]])++; dev = 0; for (k=0; kgroups; k++) { prob = ((gdouble) dp->nright[k])/((gdouble) (i+1)); if (prob>0) dev += prob*log(prob); prob = ((gdouble) (dp->ngroup[k]-dp->nright[k]))/ ((gdouble) (pdata->nrows-i-1)); if (prob>0) dev += prob*log(prob); } if (dev<*val) *val = dev; } *val = (1-*val); return(0); } */ /*gint alloc_cartvariance_p (cartvariance_param *dp, gint nrows, gfloat *gdata) { gint i; * initialize data * dp->y = g_malloc (nrows*sizeof(gfloat)); for (i=0; iy[i] = gdata[i]; * initialize temporary space * dp->x = g_malloc (nrows*sizeof(gfloat)); dp->index = g_malloc (nrows*sizeof(gint)); return 0; } gint free_cartvariance_p (cartvariance_param *dp) { g_free (dp->y); g_free (dp->x); g_free (dp->index); return 0; } gint cartvariance (array_f *pdata, void *param, gfloat *val) { cartvariance_param *dp = (cartvariance_param *) param; gint i, j; gfloat mul, mur, dev; if (pdata->ncols!=1) return(-1); for (i=0; inrows; i++) { dp->x[i] = pdata->vals[i][0]; dp->index[i] = i; } base = dp->x; qsort (dp->index, pdata->nrows, sizeof(gint), smallest); mur = 0; for (i=0; inrows; i++) mur += dp->y[i]; mur /= pdata->nrows; *val = 0; for (i=0; inrows; i++) *val += (dp->y[i]-mur)*(dp->y[i]-mur); for (i=1; inrows; i++) { mur = mul = 0; for (j = 0; jy[dp->index[j]]; mul /= i; for (j = i; jnrows; j++) mur += dp->y[dp->index[j]]; mur /= (pdata->nrows-i); dev = 0; for (j = 0; jy[dp->index[j]]-mul)*(dp->y[dp->index[j]]-mul); for (j = i; jnrows; j++) dev += (dp->y[dp->index[j]]-mur)*(dp->y[dp->index[j]]-mur); if (dev<*val) *val = dev; } return(0); } */ /* This function interacts with control buttons in ggobi */ void t1d_optimz(gint optimz_on, gboolean *nt, gint *bm, displayd *dsp) { gboolean new_target = *nt; gint bas_meth = *bm; gint i, j; if (optimz_on) { for (i=0; i<1; i++) for (j=0; jt1d.nactive; j++) dsp->t1d_pp_op.proj_best.vals[i][j] = dsp->t1d.F.vals[i][dsp->t1d.active_vars.els[j]]; /* dsp->t1d.ppval = dsp->t1d_indx_min;*/ dsp->t1d_pp_op.index_best = 0.0; bas_meth = 1; } else { bas_meth = 0; } new_target = true; *nt = new_target; *bm = bas_meth; } void t1d_clear_pppixmap(displayd *dsp, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; gint margin=10; gint wid = dsp->t1d_ppda->allocation.width, hgt = dsp->t1d_ppda->allocation.height; /* clear the pixmap */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (dsp->t1d_pp_pixmap, gg->plot_GC, true, 0, 0, wid, hgt); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_line (dsp->t1d_pp_pixmap, gg->plot_GC, margin, hgt - margin, wid - margin, hgt - margin); gdk_draw_line (dsp->t1d_pp_pixmap, gg->plot_GC, margin, hgt - margin, margin, margin); gdk_draw_pixmap (dsp->t1d_ppda->window, gg->plot_GC, dsp->t1d_pp_pixmap, 0, 0, 0, 0, wid, hgt); } void t1d_clear_ppda(displayd *dsp, ggobid *gg) { gint i; /* clear the ppindx matrix */ dsp->t1d_ppindx_count = 0; dsp->t1d_indx_min=1000.; dsp->t1d_indx_max=-1000.; for (i=0; i<100; i++) { dsp->t1d_ppindx_mat[i] = 0.0; } t1d_clear_pppixmap(dsp, gg); } void t1d_ppdraw_all(gint wid, gint hgt, gint margin, displayd *dsp, ggobid *gg) { /*gint xpos, ypos, xstrt, ystrt;*/ GdkPoint pptrace[100]; gint i; t1d_clear_pppixmap(dsp, gg); for (i=0; it1d_ppindx_count; i++) { pptrace[i].x = margin+i*2; pptrace[i].y = hgt-margin-(gint)((gfloat)((dsp->t1d_ppindx_mat[i]- dsp->t1d_indx_min)/(gfloat) (dsp->t1d_indx_max-dsp->t1d_indx_min)) * (gfloat) (hgt - 2*margin)); } gdk_draw_lines (dsp->t1d_pp_pixmap, gg->plot_GC, pptrace, dsp->t1d_ppindx_count); gdk_draw_pixmap (dsp->t1d_ppda->window, gg->plot_GC, dsp->t1d_pp_pixmap, 0, 0, 0, 0, wid, hgt); } /* This is writes text to the pp window to in form the user that optimize is finding a new maximum */ void t1d_ppdraw_think(displayd *dsp, ggobid *gg) { splotd *sp = (splotd *) g_list_nth_data (dsp->splots, 0); colorschemed *scheme = gg->activeColorScheme; gint wid = dsp->t1d_ppda->allocation.width, hgt = dsp->t1d_ppda->allocation.height; PangoLayout *layout = gtk_widget_create_pango_layout(sp->da, "Thinking..."); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_layout(dsp->t1d_pp_pixmap, gg->plot_GC, 10, 10, layout); g_object_unref(G_OBJECT(layout)); /*gdk_text_extents ( gtk_style_get_font (style), varlab, strlen (varlab), &lbearing, &rbearing, &width, &ascent, &descent); gdk_draw_string (dsp->t1d_pp_pixmap, gtk_style_get_font (style), gg->plot_GC, 10, 10, varlab);*/ gdk_draw_pixmap (dsp->t1d_ppda->window, gg->plot_GC, dsp->t1d_pp_pixmap, 0, 0, 0, 0, wid, hgt); } /* This is the pp index plot drawing routine */ void t1d_ppdraw(gfloat pp_indx_val, displayd *dsp, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; gint margin=10; gint wid = dsp->t1d_ppda->allocation.width, hgt = dsp->t1d_ppda->allocation.height; gint j; static gboolean init = true; gchar *label = g_strdup("PP index: (0.0) 0.0000 (0.0)"); if (init) { t1d_clear_ppda(dsp, gg); init = false; } dsp->t1d_ppindx_mat[dsp->t1d_ppindx_count] = pp_indx_val; if (dsp->t1d_indx_min > pp_indx_val) dsp->t1d_indx_min = pp_indx_val; if (dsp->t1d_indx_max < pp_indx_val) dsp->t1d_indx_max = pp_indx_val; if (dsp->t1d_indx_min == dsp->t1d_indx_max) dsp->t1d_indx_min *= 0.9999; label = g_strdup_printf ("PP index: (%3.1f) %5.3f (%3.1f)", dsp->t1d_indx_min, dsp->t1d_ppindx_mat[dsp->t1d_ppindx_count], dsp->t1d_indx_max); gtk_label_set_text(GTK_LABEL(dsp->t1d_pplabel),label); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); if (dsp->t1d_ppindx_count == 0) { dsp->t1d_ppindx_count++; } else if (dsp->t1d_ppindx_count > 0 && dsp->t1d_ppindx_count < 80) { t1d_ppdraw_all(wid, hgt, margin, dsp, gg); dsp->t1d_ppindx_count++; } else if (dsp->t1d_ppindx_count >= 80) { /* cycle values back into array */ for (j=0; j<=dsp->t1d_ppindx_count; j++) dsp->t1d_ppindx_mat[j] = dsp->t1d_ppindx_mat[j+1]; t1d_ppdraw_all(wid, hgt, margin, dsp, gg); } g_free (label); } void t1d_pp_reinit(displayd *dsp, ggobid *gg) { gint i, j; gchar *label = g_strdup("PP index: (0.0) 0.0000 (0.0)"); for (i=0; it1d_pp_op.proj_best.nrows; i++) for (j=0; jt1d_pp_op.proj_best.ncols; j++) dsp->t1d_pp_op.proj_best.vals[i][j] = 0.; dsp->t1d.ppval = 0.0; dsp->t1d.oppval = -1.0; dsp->t1d_pp_op.index_best = 0.0; label = g_strdup_printf ("PP index: (%3.1f) %5.3f (%3.1f)", dsp->t1d_indx_min, dsp->t1d_ppindx_mat[dsp->t1d_ppindx_count], dsp->t1d_indx_max); gtk_label_set_text(GTK_LABEL(dsp->t1d_pplabel),label); t1d_clear_ppda(dsp, gg); g_free (label); } /******************************************************************** INDEX CALCULATION The index function has to be defined as gint index (array_f *pdata, void *param, gfloat *val) with Input: pdata projected data param additional parameters for the index (will not be touched by the optimization routine) Output: val the index-value This function should simply calculate the index value for a provided projection. *********************************************************************/ gfloat t1d_calc_indx (array_f pd, Tour_PPIndex_f index, void *param) { gfloat indexval; index (&pd, param, &indexval, NULL); return(indexval); } gboolean t1d_switch_index(gint indxtype, gint basismeth, displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint kout, nrows = d->nrows_in_plot; gfloat *gdata; gint i, j; if (d->nrows_in_plot == 1) /* can't do pp on no data! */ return(false); for (i=0; inrows_in_plot; i++) for (j=0; jt1d.nactive; j++) dsp->t1d_pp_op.data.vals[i][j] = d->tform.vals[d->rows_in_plot.els[i]][dsp->t1d.active_vars.els[j]]; for (j=0; jt1d.nactive; j++) dsp->t1d_pp_op.proj_best.vals[0][j] = dsp->t1d.F.vals[0][dsp->t1d.active_vars.els[j]]; for (i=0; inrows_in_plot; i++) { dsp->t1d_pp_op.pdata.vals[i][0] = (d->tform.vals[d->rows_in_plot.els[i]][dsp->t1d.active_vars.els[0]]* dsp->t1d.F.vals[0][dsp->t1d.active_vars.els[0]]); for (j=1; jt1d.nactive; j++) dsp->t1d_pp_op.pdata.vals[i][0] += (d->tform.vals[d->rows_in_plot.els[i]][dsp->t1d.active_vars.els[j]]* dsp->t1d.F.vals[0][dsp->t1d.active_vars.els[j]]); } gdata = g_malloc (nrows*sizeof(gfloat)); if (d->clusterid.els==NULL) printf ("No cluster information found\n"); for (i=0; iclusterid.els!=NULL) gdata[i] = d->clusterid.els[d->rows_in_plot.els[i]]; else gdata[i] = 0; } switch (indxtype) { case HOLES: dsp->t1d.ppval = t1d_calc_indx (dsp->t1d_pp_op.pdata, holes_raw, &dsp->t1d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, holes_raw, &dsp->t1d_pp_param); break; case CENTRAL_MASS: dsp->t1d.ppval = t1d_calc_indx (dsp->t1d_pp_op.pdata, central_mass_raw, &dsp->t1d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, central_mass_raw, &dsp->t1d_pp_param); break; case PCA: dsp->t1d.ppval = t1d_calc_indx (dsp->t1d_pp_op.pdata, (Tour_PPIndex_f) pca, NULL); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, (Tour_PPIndex_f) pca, NULL); break; case LDA: if (!compute_groups (dsp->t1d_pp_param.group, dsp->t1d_pp_param.ngroup, &dsp->t1d_pp_param.numgroups, nrows, gdata)) { dsp->t1d.ppval = t1d_calc_indx (dsp->t1d_pp_op.pdata, discriminant, &dsp->t1d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, discriminant, &dsp->t1d_pp_param); } break; case CGINI: if (!compute_groups (dsp->t1d_pp_param.group, dsp->t1d_pp_param.ngroup, &dsp->t1d_pp_param.numgroups, nrows, gdata)) { dsp->t1d.ppval = t1d_calc_indx (dsp->t1d_pp_op.pdata, cartgini, &dsp->t1d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, cartgini, &dsp->t1d_pp_param); } break; case CENTROPY: if (!compute_groups (dsp->t1d_pp_param.group, dsp->t1d_pp_param.ngroup, &dsp->t1d_pp_param.numgroups, nrows, gdata)) { dsp->t1d.ppval = t1d_calc_indx (dsp->t1d_pp_op.pdata, cartentropy, &dsp->t1d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, cartentropy, &dsp->t1d_pp_param); } break; /* case CART_VAR: alloc_cartvariance_p (&cvp, nrows, gdata); dsp->t1d.ppval = t1d_calc_indx (d->tform, dsp->t1d.F, d->rows_in_plot.els, d->nrows, d->ncols, cartvariance, &cvp); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, cartentropy, &cep); free_cartvariance_p (&cvp); break; case SUBD: alloc_subd_p (&sp, nrows, pdim); dsp->t1d.ppval = t1d_calc_indx (d->tform, dsp->t1d.F, d->rows_in_plot.els, d->nrows, d->ncols, subd, &sp); if (basismeth == 1) kout = optimize0 (&dsp->t1d_pp_op, subd, &sp); free_subd_p (&sp); break;*/ default: g_free (gdata); return(true); break; } g_free (gdata); return(false); } #undef SUBD #undef LDA #undef CGINI #undef CENTROPY #undef CART_VAR #undef PCA #undef HOLES #undef CENTRAL_MASS ggobi-2.1.12/src/sphere.c0000644000175000017500000004161014651527764010611 /*-- sphere.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include "vars.h" #include "externs.h" /*-------------------------------------------------------------------------*/ /* dynamic memory allocation routines */ /*-------------------------------------------------------------------------*/ void sphere_init (GGobiData * d) { vectori_init_null (&d->sphere.vars); vectori_init_null (&d->sphere.pcvars); vectorf_init_null (&d->sphere.eigenval); arrayd_init_null (&d->sphere.eigenvec); arrayf_init_null (&d->sphere.vc); vectorf_init_null (&d->sphere.tform_mean); vectorf_init_null (&d->sphere.tform_stddev); d->sphere.vars_stdized = TRUE; } void sphere_free (GGobiData * d) { /*-- don't free d->sphere.pcvars, because I need it to check history --*/ vectori_free (&d->sphere.vars); vectorf_free (&d->sphere.eigenval); arrayd_free (&d->sphere.eigenvec, 0, 0); arrayf_free (&d->sphere.vc, 0, 0); vectorf_free (&d->sphere.tform_mean); vectorf_free (&d->sphere.tform_stddev); } void sphere_malloc (gint nc, GGobiData * d, ggobid * gg) { if (d->sphere.vars.nels != 0) sphere_free (d); if (nc > 0) { vectori_alloc_zero (&d->sphere.vars, nc); vectorf_alloc_zero (&d->sphere.eigenval, nc); arrayd_alloc_zero (&d->sphere.eigenvec, nc, nc); arrayf_alloc_zero (&d->sphere.vc, nc, nc); vectorf_alloc_zero (&d->sphere.tform_mean, nc); vectorf_alloc_zero (&d->sphere.tform_stddev, nc); } } /*-------------------------------------------------------------------------*/ /* test the number of variables sphered last time */ /*-------------------------------------------------------------------------*/ /* * before sphering * if (npcvars > 0 && npcvars != npcs) { * delete the variables in sphere.pcvars (or just as many as needed?) * add npcs new variables (or ditto?); populate pcvars * } else if (sphere.npcvars == 0) { * add npcs new variables; populate pcvars * } */ gboolean spherize_set_pcvars (GGobiData * d, ggobid * gg) { gint ncols_prev = d->ncols; gint j, k; gchar *lbl; /*-- for newvar_add.. the variable notebooks --*/ gchar *vname; gdouble *dtmp; gboolean succeeded = true; /*-- for updating the tree view --*/ GtkWidget *tree_view = gg->sphere_ui.tree_view; GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); GtkTreeIter iter; /*-- --*/ if (d->sphere.npcs == 0) return false; /*-- the null case: sphering for the first time --*/ if (d->sphere.pcvars.els == NULL || d->sphere.pcvars.nels == 0) { vectori_realloc (&d->sphere.vars_sphered, d->sphere.vars.nels); vectori_copy (&d->sphere.vars, &d->sphere.vars_sphered); /* from, to */ vectori_realloc (&d->sphere.pcvars, d->sphere.npcs); dtmp = (gdouble *) g_malloc0 (d->nrows * sizeof (gdouble)); for (j = 0; j < d->sphere.npcs; j++) { vname = g_strdup_printf ("PC%d", j + 1); newvar_add_with_values (dtmp, d->nrows, vname, real, 0, (gchar **) NULL, (gint *) NULL, (gint *) NULL, d); g_free (vname); } g_free (dtmp); for (j = ncols_prev, k = 0; j < d->ncols; j++) { d->sphere.pcvars.els[k++] = j; } /* * sphering after the first time */ /*-- if the number hasn't changed --*/ } else if (d->sphere.pcvars.nels == d->sphere.npcs) { if (d->sphere.vars_sphered.nels != d->sphere.vars.nels) vectori_realloc (&d->sphere.vars_sphered, d->sphere.vars.nels); vectori_copy (&d->sphere.vars, &d->sphere.vars_sphered); /* from, to */ /*-- if the number has grown --*/ } else if (d->sphere.pcvars.nels < d->sphere.npcs) { /*-- add just the additional required variables? --*/ /*-- try deleting them all and starting fresh? --*/ if (delete_vars (d->sphere.pcvars.els, d->sphere.pcvars.nels, d)) { ncols_prev = d->ncols; vectori_realloc (&d->sphere.vars_sphered, d->sphere.vars.nels); vectori_copy (&d->sphere.vars, &d->sphere.vars_sphered); /* from, to */ vectori_realloc (&d->sphere.pcvars, d->sphere.npcs); /*-- variable labels updated at the end of this function; data updated when sphere_apply_cb calls spherize_data --*/ clone_vars (d->sphere.vars.els, d->sphere.npcs, d); for (j = ncols_prev, k = 0; j < d->ncols; j++) d->sphere.pcvars.els[k++] = j; } else { succeeded = false; } /*-- if the number has decreased --*/ } else if (d->sphere.pcvars.nels > d->sphere.npcs) { /*-- delete the last few variables --*/ gint ncols = d->sphere.pcvars.nels - d->sphere.npcs; gint *cols = (gint *) g_malloc (ncols * sizeof (gint)); for (j = d->sphere.pcvars.nels - 1, k = ncols - 1; j >= d->sphere.npcs; j--) cols[k--] = d->sphere.pcvars.els[j]; if (delete_vars (cols, ncols, d)) { /*-- then behave as above, when the lengths were the same --*/ if (d->sphere.vars_sphered.nels != d->sphere.vars.nels) vectori_realloc (&d->sphere.vars_sphered, d->sphere.vars.nels); /*-- should I also realloc pcvars? --*/ vectori_realloc (&d->sphere.pcvars, d->sphere.npcs); vectori_copy (&d->sphere.vars, &d->sphere.vars_sphered); /* from, to */ } else succeeded = false; g_free (cols); } if (succeeded) { /*-- update the variable labels --*/ for (k = 0; k < d->sphere.pcvars.nels; k++) { j = d->sphere.pcvars.els[k]; lbl = g_strdup_printf ("PC%d", (k + 1)); ggobi_data_set_col_name (d, j, lbl); varpanel_label_set (j, d); /*-- checkboxes --*/ varcircle_label_set (j, d); /*-- variable circles --*/ g_free (lbl); } /*-- clear the model --*/ gtk_list_store_clear (GTK_LIST_STORE (model)); /*-- add the new labels to the 'sphered variables' tree view --*/ for (j = 0; j < d->sphere.vars_sphered.nels; j++) { gtk_list_store_append (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, ggobi_data_get_col_name(d, d->sphere.vars_sphered.els[j]), -1); } } return succeeded; } /*-------------------------------------------------------------------------*/ /* get and set the number of principal components; */ /* changed when the spin button is reset */ /*-------------------------------------------------------------------------*/ void pca_diagnostics_set (GGobiData * d, ggobid * gg) { /* * Compute and set the total variance and the condition number * of the principal components analysis */ gint j; gfloat ftmp1 = 0.0, ftmp2 = 0.0; gfloat firstpc, lastpc; if (d == NULL || d->sphere.npcs <= 0 || d->sphere.eigenval.nels < d->sphere.npcs) return; firstpc = d->sphere.eigenval.els[0]; lastpc = d->sphere.eigenval.els[d->sphere.npcs - 1]; for (j = 0; j < d->sphere.npcs; j++) ftmp1 += d->sphere.eigenval.els[j]; for (j = 0; j < d->sphere.vars.nels; j++) ftmp2 += d->sphere.eigenval.els[j]; if (ftmp2 != 0) sphere_variance_set (ftmp1 / ftmp2, d, gg); else sphere_variance_set (-999.0, d, gg); if (lastpc != 0) sphere_condnum_set (firstpc / lastpc, gg); else sphere_condnum_set (-999.0, gg); } void sphere_npcs_set (gint n, GGobiData * d, ggobid * gg) { d->sphere.npcs = n; if (!scree_mapped_p (gg)) { return; } if (d->sphere.npcs < 1) { quick_message ("Need to choose at least 1 PC.", false); sphere_enable (false, gg); } else if (d->sphere.npcs > d->sphere.vars.nels) { gchar *msg = g_strdup_printf ("Need to choose at most %d PCs.\n", d->sphere.vars.nels); quick_message (msg, false); sphere_enable (false, gg); g_free (msg); } else { pca_diagnostics_set (d, gg); sphere_enable (true, gg); } } gint npcs_get (GGobiData * d, ggobid * gg) { return d->sphere.npcs; } /*-------------------------------------------------------------------------*/ /* get and set the sphered variables: */ /* the user chooses the first npcs of these as principal components */ /*-------------------------------------------------------------------------*/ void spherevars_set (ggobid * gg) { gint j, nvars, *vars; GGobiData *d; GtkWidget *tree_view; if (gg->sphere_ui.window == NULL) { d = gg->current_display->d; if (d == NULL) return; vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nvars = 0; /*-- initially, no variables are selected --*/ } else { tree_view = get_tree_view_from_object (G_OBJECT (gg->sphere_ui.window)); if (tree_view == NULL) return; d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); //vars = (gint *) g_malloc (d->ncols * sizeof(gint)); vars = get_selections_from_tree_view (tree_view, &nvars); } if (d->sphere.vars.els == NULL || d->sphere.vars.nels != nvars) { sphere_malloc (nvars, d, gg); } for (j = 0; j < nvars; j++) d->sphere.vars.els[j] = vars[j]; /*-- update the "vars stdized?" text entry --*/ /* vars_stdized_send_event (d, gg); */ /*-- reset the spinner so that its max is the number of sphered vars --*/ sphere_npcs_range_set (nvars, gg); g_free (vars); } /*-------------------------------------------------------------------------*/ /* eigenvector and eigenvalues routines */ /*-------------------------------------------------------------------------*/ void eigenvals_get (gfloat * els, GGobiData * d) { gint j; for (j = 0; j < d->sphere.vars.nels; j++) els[j] = d->sphere.eigenval.els[j]; } void eigenval_zero (GGobiData * d) { vectorf_zero (&d->sphere.eigenval); } void eigenvec_zero (GGobiData * d, ggobid * gg) { arrayd_zero (&d->sphere.eigenvec); } /* * this routine overwrites the var-cov matrix of the old active variables * with the new active variables. then this matrix is put through * singular value decomposition and overwritten with the matrix of * eigenvectors, and the eigenvalues are returned in a. */ void eigenvec_set (GGobiData * d, ggobid * gg) { gint i, j; gint nels = d->sphere.vars.nels; gdouble **eigenvec = d->sphere.eigenvec.vals; gfloat **vc = d->sphere.vc.vals; for (i = 0; i < nels; i++) for (j = 0; j < nels; j++) eigenvec[i][j] = (gdouble) vc[i][j]; } /*-------------------------------------------------------------------------*/ /* variance-covariance matrix routines */ /*-------------------------------------------------------------------------*/ void sphere_varcovar_set (GGobiData * d, ggobid * gg) { gint i, j, k, m, var; gfloat tmpf = 0.; gint n = d->nrows_in_plot; gfloat *tform_mean = d->sphere.tform_mean.els; gfloat *tform_stddev = d->sphere.tform_stddev.els; for (k = 0; k < d->sphere.vars.nels; k++) { var = d->sphere.vars.els[k]; g_assert (var < d->ncols); g_assert (k < d->sphere.tform_mean.nels); /* * This may not be necessary: isn't tform_mean already * stored in vartabled? dfs ... Yes, but Andreas thinks * maybe it shouldn't be. */ tmpf = 0.; for (i = 0; i < n; i++) tmpf += d->tform.vals[d->rows_in_plot.els[i]][var]; tform_mean[k] = tmpf / ((gfloat) n); } for (k = 0; k < d->sphere.vc.ncols; k++) { for (j = 0; j < d->sphere.vc.ncols; j++) { tmpf = 0.; for (m = 0; m < n; m++) { i = d->rows_in_plot.els[m]; tmpf = tmpf + (d->tform.vals[i][d->sphere.vars.els[k]] - tform_mean[k]) * (d->tform.vals[i][d->sphere.vars.els[j]] - tform_mean[j]); } tmpf /= ((gfloat) (n - 1)); d->sphere.vc.vals[j][k] = tmpf; if (j == k) tform_stddev[k] = (gfloat) sqrt ((gdouble) tmpf); } } if (d->sphere.vars_stdized) { for (k = 0; k < d->sphere.vc.ncols; k++) for (j = 0; j < d->sphere.vc.ncols; j++) d->sphere.vc.vals[j][k] = d->sphere.vc.vals[j][k] / (tform_stddev[j] * tform_stddev[k]); } } /* * returns true if the nxn variance-covariance matrix 'matrx' * is within tol of being equal to the identity matrix */ gboolean vc_identity_p (gdouble ** matrx, gint n) { gint i, j; gboolean retn_val = true; gfloat tol = 0.001; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if ((i == j) && (fabs ((1.000 - matrx[i][j])) > tol)) { retn_val = false; break; } else if ((i != j) && (fabs (matrx[i][j]) > tol)) { retn_val = false; break; } } } return (retn_val); } /*-------------------------------------------------------------------------*/ /* Here's the beef: sphering routines */ /*-------------------------------------------------------------------------*/ /* * As long as eigenvec is not equal to the identity matrix, * perform a singular value decomposition. */ gboolean sphere_svd (GGobiData * d, ggobid * gg) { gint i, j, k, rank; gint nels = d->sphere.vars.nels; gdouble **eigenvec = d->sphere.eigenvec.vals; /* gfloat **eigenvec = d->sphere.vc.vals; */ gfloat *eigenval = d->sphere.eigenval.els; gboolean vc_equals_I = vc_identity_p (eigenvec, nels); paird *pairs = (paird *) g_malloc (nels * sizeof (paird)); /*-- scratch vector and array --*/ gfloat *e = (gfloat *) g_malloc (nels * sizeof (gfloat)); gdouble **b = (gdouble **) g_malloc (nels * sizeof (gdouble *)); for (j = 0; j < nels; j++) b[j] = (gdouble *) g_malloc0 (nels * sizeof (gdouble)); if (!vc_equals_I) { eigenval_zero (d); /*-- zero out the vector of eigenvalues --*/ dsvd (eigenvec, nels, nels, d->sphere.eigenval.els, b); for (j = 0; j < nels; j++) { eigenval[j] = (gfloat) sqrt ((gdouble) eigenval[j]); } } /*-- obtain ranks to use in sorting eigenvals and eigenvec --*/ for (i = 0; i < d->sphere.vars.nels; i++) { pairs[i].f = (gfloat) eigenval[i]; pairs[i].indx = i; } qsort ((gchar *) pairs, nels, sizeof (paird), pcompare); /*-- sort the eigenvalues and eigenvectors into temporary arrays --*/ for (i = 0; i < nels; i++) { k = (nels - i) - 1; /*-- to reverse the order --*/ rank = pairs[i].indx; e[k] = eigenval[rank]; for (j = 0; j < nels; j++) b[j][k] = eigenvec[j][rank]; } /*-- copy the sorted eigenvalues and eigenvectors back --*/ for (i = 0; i < nels; i++) { eigenval[i] = e[i]; for (j = 0; j < nels; j++) { eigenvec[j][i] = b[j][i]; } } for (i = 0; i < nels; i++) if (eigenvec[0][i] < 0) for (j = 0; j < nels; j++) eigenvec[j][i] = -eigenvec[j][i]; /*-- free temporary variables --*/ g_free ((gpointer) pairs); for (j = 0; j < nels; j++) g_free (b[j]); g_free (b); g_free (e); return (!vc_equals_I); } /*-- sphere data from svars[] into pcvars[] --*/ void spherize_data (vector_i * svars, vector_i * pcvars, GGobiData * d, ggobid * gg) { gint i, j, k, m; gfloat tmpf; gfloat *b = (gfloat *) g_malloc (svars->nels * sizeof (gfloat)); gfloat *tform_mean = d->sphere.tform_mean.els; gfloat *tform_stddev = d->sphere.tform_stddev.els; gdouble **eigenvec = d->sphere.eigenvec.vals; gfloat *eigenval = d->sphere.eigenval.els; for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; for (j = 0; j < pcvars->nels; j++) { tmpf = 0.; for (k = 0; k < svars->nels; k++) { if (d->sphere.vars_stdized) { tmpf = tmpf + (gfloat) eigenvec[k][j] * (d->tform.vals[i][svars->els[k]] - tform_mean[k]) / tform_stddev[k]; } else { tmpf = tmpf + (gfloat) eigenvec[k][j] * (d->tform.vals[i][svars->els[k]] - tform_mean[k]); } } b[j] = tmpf / eigenval[j]; } for (j = 0; j < pcvars->nels; j++) d->raw.vals[i][pcvars->els[j]] = d->tform.vals[i][pcvars->els[j]] = b[j]; } g_free (b); } /*-------------------------------------------------------------------------*/ /* Principal components analysis routines: */ /* executed when the sphere button is pressed and the scree plot opened */ /*-------------------------------------------------------------------------*/ gboolean pca_calc (GGobiData * d, ggobid * gg) { gboolean svd_ok = false; eigenvec_zero (d, gg); sphere_varcovar_set (d, gg); /* If nspherevars > 1 use svd routine, otherwise just standardize */ if (d->sphere.vars.nels > 1) { eigenvec_set (d, gg); svd_ok = sphere_svd (d, gg); } return svd_ok; } ggobi-2.1.12/src/display.c0000644000175000017500000007100214651527764010766 /* display.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" #include "display_tree.h" #include "print.h" DisplayOptions DefaultDisplayOptions = { true, /* points_show_p */ false, /* axes_show_p */ true, /* axes_label_p */ false, /* axes_values_p */ false, /* edges_undirected_show_p */ false, /* edges_arrowheads_show_p */ false, /* edges_directed_show_p */ true, /* whiskers_show_p */ /* unused true, * missings_show_p * true, * axes_center_p * true, * double_buffer_p * true * link_p * */ }; /*-- debugging utility --*/ /* static void displays_print (ggobid *gg) { GList *l; displayd *dsp; g_printerr ("n displays = %d\n", g_list_length (gg->displays)); for (l=gg->displays; l; l=l->next) { dsp = (displayd *) l->data; if (dsp != NULL) g_printerr (" display %d (type=%d)\n", (gint) dsp, dsp->displaytype); else g_printerr (" dsp = NULL!\n"); } } */ /*----------------------------------------------------------------------*/ /* Drawing routines */ /*----------------------------------------------------------------------*/ /*-- replot all splots in display --*/ /*-- type = EXPOSE, QUICK, BINNED, FULL --*/ void display_plot (displayd * display, RedrawStyle type, ggobid * gg) { GList *slist; splotd *sp; for (slist = display->splots; slist; slist = slist->next) { sp = (splotd *) slist->data; if (sp != NULL) { splot_redraw (sp, type, gg); } } } static void display_plot_allbutone (displayd * display, splotd * splot, RedrawStyle type, ggobid * gg) { GList *slist; splotd *sp; for (slist = display->splots; slist; slist = slist->next) { sp = (splotd *) slist->data; if (sp == NULL); else if (splot == NULL || sp != splot) splot_redraw (sp, type, gg); } } /*----------------------------------------------------------------------*/ /* Callbacks common to multiple display types */ /*----------------------------------------------------------------------*/ /* We need to allow people to programmatically change a setting and force the update. The current framework is all based on GUI events and so we don't update the GUI components here as we assume they are set appropriately. A Model View Controller approach is needed. */ void set_display_option (gboolean active, guint action, displayd * display) { ggobid *gg = display->ggobi; gchar *title; gint ne = 0; GGobiData *onlye = NULL; g_return_if_fail (GGOBI_IS_DISPLAY (display)); /*-- count edge sets --*/ if (action == DOPT_EDGES_U || action == DOPT_EDGES_D || action == DOPT_EDGES_A || action == DOPT_EDGES_H) { gint k, nd = g_slist_length (gg->d); GGobiData *e; if (display->d->rowIds) { for (k = 0; k < nd; k++) { e = (GGobiData *) g_slist_nth_data (gg->d, k); if (e->edge.n > 0) { ne++; onlye = e; /* meaningful if there's only one */ } } } if (ne != 1) onlye = NULL; } /*-- --*/ switch (action) { case DOPT_POINTS: display->options.points_show_p = active; display_plot (display, FULL, gg); break; case DOPT_EDGES_U: /*-- undirected: edges only --*/ /* Problem: edgeset_add calls setDisplayEdge, which updates this very menu, so that the item we clicked on is destroyed before we finish handling the event we received on it. One upshot of this is that the checkbox isn't set correctly. However ... if I don't add the edgeset until after all the options have been correctly set, the problem vanishes! -- dfs */ display->options.edges_undirected_show_p = active; /*if (active) { display_edges_directed_show (display, false); display_edges_arrowheads_show (display, false); } */ display->options.edges_directed_show_p = false; display->options.edges_arrowheads_show_p = false; if (display->e == NULL && ne == 1) setDisplayEdge (display, onlye); /* don't rebuild the menu */ if (display->e != NULL) { title = computeTitle (false, gg->current_display, gg); if (title) { gtk_window_set_title (GTK_WINDOW (GGOBI_WINDOW_DISPLAY (display)->window), title); g_free (title); } } display_plot (display, FULL, gg); break; case DOPT_EDGES_D: /*-- directed: both edges and arrowheads --*/ display->options.edges_directed_show_p = active; /*if (active) { display_edges_undirected_show (display, false); display_edges_arrowheads_show (display, false); } */ display->options.edges_undirected_show_p = false; display->options.edges_arrowheads_show_p = false; if (display->e == NULL && ne == 1) setDisplayEdge (display, onlye); /* don't rebuild the menu */ if (display->e != NULL) { title = computeTitle (false, gg->current_display, gg); if (title) { gtk_window_set_title (GTK_WINDOW (GGOBI_WINDOW_DISPLAY (display)->window), title); g_free (title); } } display_plot (display, FULL, gg); break; case DOPT_EDGES_A: /*-- arrowheads only --*/ display->options.edges_arrowheads_show_p = active; /*if (active) { display_edges_directed_show (display, false); display_edges_undirected_show (display, false); } */ display->options.edges_directed_show_p = false; display->options.edges_undirected_show_p = false; if (display->e == NULL && ne == 1) setDisplayEdge (display, onlye); /* don't rebuild the menu */ if (display->e != NULL) { title = computeTitle (false, gg->current_display, gg); if (title) { gtk_window_set_title (GTK_WINDOW (GGOBI_WINDOW_DISPLAY (display)->window), title); g_free (title); } } display_plot (display, FULL, gg); break; case DOPT_EDGES_H:/*-- arrowheads only --*/ display->options.edges_arrowheads_show_p = false; display->options.edges_directed_show_p = false; display->options.edges_undirected_show_p = false; if (display->e == NULL && ne == 1) setDisplayEdge (display, onlye); /* don't rebuild the menu */ if (display->e != NULL) { title = computeTitle (false, gg->current_display, gg); if (title) { gtk_window_set_title (GTK_WINDOW (GGOBI_WINDOW_DISPLAY (display)->window), title); g_free (title); } } display_plot (display, FULL, gg); break; case DOPT_WHISKERS: display->options.whiskers_show_p = active; display_plot (display, FULL, gg); break; case DOPT_AXES: display->options.axes_show_p = active; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->set_show_axes_option) klass->set_show_axes_option (display, active); } break; case DOPT_AXESLAB: display->options.axes_label_p = active; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->set_show_axes_label_option) klass->set_show_axes_label_option (display, active); } break; case DOPT_AXESVALS: display->options.axes_values_p = active; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->set_show_axes_values_option) klass->set_show_axes_values_option (display, active); } break; /* unused case DOPT_AXES_C: display->options.axes_center_p = w->active; break; case DOPT_BUFFER: display->options.double_buffer_p = w->active; break; case DOPT_LINK: display->options.link_p = w->active; break; */ default: g_printerr ("no variable is associated with %d\n", action); } } /** This is a start at allowing programmatic specification of options. Here, we set them in place (i.e. in display->options) and then force them to be applied. This does not update the menus. */ void set_display_options (displayd * display, ggobid * gg) { int i; gboolean active = true; DisplayOptions *options = &display->options; for (i = DOPT_POINTS; i <= DOPT_WHISKERS; i++) { if (i == DOPT_EDGES_U || i == DOPT_EDGES_D || i == DOPT_EDGES_A || i == DOPT_EDGES_H) if (display->edge_merge == -1) continue; switch (i) { case DOPT_POINTS: active = options->points_show_p; break; case DOPT_AXES: active = options->axes_show_p; break; case DOPT_AXESLAB: active = options->axes_label_p; break; case DOPT_AXESVALS: active = options->axes_values_p; break; case DOPT_EDGES_U: active = options->edges_undirected_show_p; break; case DOPT_EDGES_A: active = options->edges_arrowheads_show_p; break; case DOPT_EDGES_D: active = options->edges_directed_show_p; break; case DOPT_WHISKERS: active = options->whiskers_show_p; break; } set_display_option (active, i, display); } } void display_print (displayd * display) { ggobid *gg; gg = display->ggobi; if (gg->printOptions == NULL) { gg->printOptions = getDefaultPrintOptions (NULL); } if (DefaultPrintHandler.callback) (*DefaultPrintHandler.callback) (gg->printOptions, display, display->ggobi, &DefaultPrintHandler); } /*-- Close a display --*/ void display_close (displayd * display) { ggobid *gg = GGobiFromDisplay (display); display_free (display, false, gg); } void show_display_control_panel (displayd * display) { ggobid *gg = GGobiFromDisplay (display); /* gtk_window_present(GTK_WINDOW(gg->main_window())); */ gdk_window_raise (gg->main_window->window); } /*-- Called when a window is deleted from the window manager --*/ void display_delete_cb (GtkWidget * w, GdkEvent * event, displayd * display) { ggobid *gg = GGobiFromWidget (w, true); display_free (display, false, gg); } /*----------------------------------------------------------------------*/ /* End callbacks */ /*----------------------------------------------------------------------*/ /*XXX consolidate this and display_alloc_init(), i.e. remove the latter! This display class is really a virtual class. */ displayd * ggobi_display_new (gboolean missing_p, GGobiData * d, ggobid * gg) { return (display_alloc_init (missing_p, d, gg)); } void display_set_values (displayd * display, GGobiData * d, ggobid * gg) { /* Should copy in the contents of DefaultOptions to create an indepedently modifiable configuration copied from the current template. */ display->options = DefaultDisplayOptions; display->ggobi = gg; display->d = d; } displayd * display_alloc_init (gboolean missing_p, GGobiData * d, ggobid * gg) { displayd *display; display = g_object_new (GGOBI_TYPE_WINDOW_DISPLAY, NULL); GGOBI_WINDOW_DISPLAY (display)->useWindow = true; display_set_values (display, d, gg); return (display); } static void display_destroy_cb(displayd *display, ggobid *gg) { display_free(display, true, gg); } gint display_add (displayd * display, ggobid * gg) { splotd *prev_splot = gg->current_splot; ProjectionMode pmode_prev = pmode_get (gg->current_display, gg); InteractionMode imode_prev = imode_get (gg); ///displayd *oldDisplay = gg->current_display; /* This is a safety test to avoid having a display be entered twice. Deactivate if we want to be slightly more efficient. */ if (g_list_find (gg->displays, display)) { g_printerr ("Display has already been added to the displays list of this ggobi\n"); return (-1); } /* moved this here so that the current splot is set when configuring cpanels - mfl */ if (g_list_length (display->splots)) { gg->current_splot = (splotd *) g_list_nth_data (display->splots, 0); display->current_splot = gg->current_splot; splot_set_current (gg->current_splot, on, gg); } if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) { GGobi_widget_set (GGOBI_WINDOW_DISPLAY (display)->window, gg, true); } g_signal_connect(G_OBJECT(display), "destroy", G_CALLBACK(display_destroy_cb), gg); if (g_list_length (display->splots)) display_set_current (display, gg); /*-- this initializes the mode --*/ gg->displays = g_list_append (gg->displays, (gpointer) display); /* If the tree of displays is active, add this to it. */ display_add_tree (display); // setting current splot was here /* * The current display types start without signal handlers, but * I may need to add handlers later for some unforeseen display. */ /*-- if starting from the API, or changing mode, update the mode menus --*/ if (pmode_prev != gg->current_display->cpanel.pmode || imode_prev != gg->current_display->cpanel.imode) { /*main_miscmenus_update (pmode_prev, imode_prev, oldDisplay, gg); */ display_mode_menus_update (pmode_prev, imode_prev, gg->current_display, gg); } /*-- Make sure the border for the previous plot is turned off --*/ if (prev_splot != NULL) { prev_splot->redraw_style = QUICK; gtk_widget_queue_draw (prev_splot->da); } g_signal_emit (G_OBJECT (gg), GGobiSignals[DISPLAY_NEW_SIGNAL], 0, display); return (g_list_length (gg->displays)); } /* * Remove display from the linked list of displays. Reset * current_display and current_splot if necessary. */ void display_free (displayd * display, gboolean force, ggobid * gg) { splotd *sp = NULL; extern gint num_ggobis; gint count; displayd *dsp; if (force == false && sessionOptions->info->allowCloseLastDisplay) force = true; if (num_ggobis > 1 || force || g_list_length (gg->displays) > 0) { /* These are probably mutually exclusive and so we could use an else-if sequence but the results are catastrophic if we get it wrong so we play on the safe side of the fence. */ if (display->t1d.idled) { tour1d_func (false, display, gg); } if (display->t1d_window) /* XXX more to free or destroy here? */ gtk_widget_destroy (display->t1d_window); if (display->t2d.idled) { tour2d_func (false, display, gg); } if (display->t2d_window) /* XXX more to free or destroy here? */ gtk_widget_destroy (display->t2d_window); if (display->tcorr1.idled) { tourcorr_func (false, display, gg); } if (display->t2d3.idled) { tour2d3_func (false, display, gg); } /* * If the current splot belongs to this display, turn off its * event handlers before freeing all the splots belonging to this * display. This was outside and before the conditional of being able to close this display. */ dsp = (displayd *) gg->current_splot->displayptr; if (dsp == display) { sp_event_handlers_toggle (gg->current_splot, off, display->cpanel.pmode, display->cpanel.imode); } /*-- If the display tree is active, remove the corresponding entry. --*/ tree_display_entry_remove (display, gg->display_tree.tree, gg); gg->displays = g_list_remove (gg->displays, display); /*-- if the current_display was just removed, assign a new one --*/ /*-- list length only has to be >=0 because a display was just removed --*/ if (display == gg->current_display) { if (g_list_length (gg->displays) > 0) { dsp = (displayd *) g_list_nth_data (gg->displays, 0); display_set_current (dsp, gg); gg->current_splot = (splotd *) g_list_nth_data (gg->current_display->splots, 0); dsp->current_splot = gg->current_splot; splot_set_current (gg->current_splot, on, gg); sp = gg->current_splot; if (sp != NULL) { sp->redraw_style = QUICK; gtk_widget_queue_draw (sp->da); } } else { gg->current_display = NULL; gg->current_splot = NULL; } } count = g_list_length (display->splots); g_signal_handlers_disconnect_by_func(G_OBJECT(display), display_destroy_cb, gg); /* don't recurse */ if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) { /*XX GList *l; for (l=display->splots; count > 0 && l; l=l->next, count--) { sp = (splotd *) l->data; splot_free (sp, display, gg); } */ gtk_widget_destroy (GGOBI_WINDOW_DISPLAY (display)->window); } else { gtk_widget_destroy(GTK_WIDGET(display)); } } /*-- If there are no longer any displays, set ggobi's mode to NULLMODE --*/ if (g_list_length (gg->displays) == 0) { GGOBI (full_viewmode_set) (NULL_PMODE, NULL_IMODE, gg); } } void display_free_all (ggobid * gg) { GList *dlist; displayd *display; gint count; if (gg->displays == NULL) return; count = g_list_length (gg->displays); /* Have to count down rather than rely on dlist being non-null. This is because when we remove the last entry, we get garbage, not a null value. */ for (dlist = gg->displays; count > 0 && dlist; count--) { gint nc; display = (displayd *) dlist->data; nc = display->d->ncols; if (display == NULL) break; if (nc >= MIN_NVARS_FOR_TOUR1D && display->t1d.idled) g_source_remove (display->t1d.idled); if (nc >= MIN_NVARS_FOR_TOUR2D && display->t2d.idled) g_source_remove (display->t2d.idled); if (nc >= MIN_NVARS_FOR_COTOUR && display->tcorr1.idled) g_source_remove (display->tcorr1.idled); /* This doesn't seem to be in use. if (nc >= MIN_NVARS_FOR_COTOUR && display->tcorr2.idled) g_source_remove (display->tcorr2.idled); */ /* If the second argument 'force' is true, it eliminates the final display. It will work now if there is more than one ggobi instance running. */ dlist = dlist->next; display_free (display, true, gg); } } void display_set_current (displayd * new_display, ggobid * gg) { gchar *title; if (new_display == NULL) return; gtk_accel_group_unlock (gg->main_accel_group); /* Clean up the old display first. Reset its title to show it is no longer active. Clean up the control panel of the elements provided by this old display, in order to get ready for the elements provided by the new display. */ if (gg->firsttime == false && gg->current_display && GGOBI_IS_WINDOW_DISPLAY (gg->current_display)) { title = computeTitle (false, gg->current_display, gg); if (title && GGOBI_WINDOW_DISPLAY (gg->current_display)->window) { gtk_window_set_title (GTK_WINDOW (GGOBI_WINDOW_DISPLAY (gg->current_display)-> window), title); g_free (title); } /* Now clean up the different control panel menus associated with this display. Specifically, this deletes the imode and pmode menus. */ if (GGOBI_IS_EXTENDED_DISPLAY (gg->current_display)) { gtk_ui_manager_remove_ui (gg->main_menu_manager, gg->mode_merge_id); /* Allow the extended display to override the submenu_destroy call. If it doesn't provide a method, then call submenu_destroy. */ void (*f) (displayd * dpy) = GGOBI_EXTENDED_DISPLAY_GET_CLASS (gg->current_display)->display_unset; if (f) { f (gg->current_display); f (gg->current_display); } } } /* Now do the setup for the new display. */ if (GGOBI_IS_WINDOW_DISPLAY (new_display)) { if (GGOBI_WINDOW_DISPLAY (new_display)->useWindow) { title = computeTitle (true, new_display, gg); if (title) { gtk_window_set_title (GTK_WINDOW (GGOBI_WINDOW_DISPLAY (new_display)->window), title); g_free (title); } } if (GGOBI_IS_EXTENDED_DISPLAY (new_display)) { const gchar *(*ui_get) (displayd * dpy) = GGOBI_EXTENDED_DISPLAY_GET_CLASS (new_display)->mode_ui_get; if (ui_get) { GError *error = NULL; const gchar *ui = ui_get (new_display); gg->mode_merge_id = gtk_ui_manager_add_ui_from_string (gg->main_menu_manager, ui, -1, &error); if (error) { g_message ("Could not merge main mode ui from display"); g_error_free (error); } } void (*f) (displayd * dpy, ggobid * gg) = GGOBI_EXTENDED_DISPLAY_GET_CLASS (new_display)->display_set; if (f) f (new_display, gg); } } gg->current_display = new_display; g_signal_emit (G_OBJECT (gg), GGobiSignals[DISPLAY_SELECTED_SIGNAL], 0, new_display); // replaced by listeners -- dfs // cpanel_set (gg->current_display, gg); // varpanel_show_page (gg->current_display, gg); // vartable_show_page (gg->current_display->d, gg); // varpanel_tooltips_set (gg->current_display, gg); gtk_accel_group_lock (gg->main_accel_group); gg->firsttime = false; } /** Creates a title string for a display window. Caller must free the return value. */ gchar * computeTitle (gboolean current_p, displayd * display, ggobid * gg) { gint n; gchar *title = NULL, *description; const char *tmp = NULL; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { tmp = ggobi_display_title_label (display); } if (display->d->name != NULL) { if (display->e != NULL && display->e->name != NULL) description = g_strdup_printf ("%s/%s", display->d->name, display->e->name); else description = g_strdup (display->d->name); } else { description = GGOBI (getDescription) (gg); } n = strlen (tmp) + strlen (description) + 5 + (current_p ? strlen ("(current)") : 0); title = (gchar *) g_malloc0 (sizeof (gchar) * n); sprintf (title, "%s: %s %s", description, tmp, (current_p ? "(current)" : "")); g_free (description); return (title); } /* * replot all splots in all displays -- except splot, if present */ void displays_plot (splotd * splot, RedrawStyle type, ggobid * gg) { GList *dlist; displayd *display; for (dlist = gg->displays; dlist; dlist = dlist->next) { display = (displayd *) dlist->data; if (splot == NULL) display_plot (display, type, gg); else display_plot_allbutone (display, splot, type, gg); } } /*-- reproject and replot all splots in display --*/ void display_tailpipe (displayd * display, RedrawStyle type, ggobid * gg) { GList *splist = display->splots; splotd *sp; cpaneld *cpanel; while (splist) { sp = (splotd *) splist->data; cpanel = &display->cpanel; splot_world_to_plane (cpanel, sp, gg); /*-- includes p1d_spread_var --*/ splot_plane_to_screen (display, cpanel, sp, gg); splist = splist->next; } splist = display->splots; while (splist) { sp = (splotd *) splist->data; /*-- update transient brushing; I will also need to un-brush some points --*/ if (display == gg->current_display && sp == gg->current_splot && imode_get (gg) == BRUSH) { GGobiData *d = display->d; if (GGOBI_IS_EXTENDED_SPLOT (sp)) { void (*f) (GGobiData *, splotd *, ggobid *); GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); f = klass->splot_assign_points_to_bins; if (f) { f (d, sp, gg); // need to exclude area plots } } //assign_points_to_bins (d, sp, gg); // damnit, not for area plots } if (GGOBI_IS_EXTENDED_DISPLAY (display)) { void (*f) (gboolean, displayd *, splotd *, ggobid *); f = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->ruler_ranges_set; if (f) { f (GTK_WIDGET_VISIBLE (display->hrule) || GTK_WIDGET_VISIBLE (display->vrule), display, sp, gg); } } splot_redraw (sp, type, gg); splist = splist->next; } } /*-- Reproject and plot all plots in all displays: modulo missingness --*/ void displays_tailpipe (RedrawStyle type, ggobid * gg) { GList *dlist; displayd *display; for (dlist = gg->displays; dlist; dlist = dlist->next) { display = (displayd *) dlist->data; display_tailpipe (display, type, gg); } } void display_window_init (windowDisplayd * display, gint width, gint height, gint bwidth, ggobid * gg) { display->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_object_set_data (G_OBJECT (display->window), "displayd", (gpointer) display); /* allowing shrink is considered a 'bad thing' - instead we no longer request a size for the drawing areas (splots), but instead we set a default window size and allow the splots to automatically fill the space - mfl */ //gtk_window_set_policy (GTK_WINDOW (display->window), true, true, false); gtk_window_set_default_size (GTK_WINDOW (display->window), width, height); //gtk_container_set_border_width (GTK_CONTAINER (display->window), bwidth); g_signal_connect (G_OBJECT (display->window), "delete_event", G_CALLBACK (display_delete_cb), (gpointer) display); GGobi_widget_set (GTK_WIDGET (display->window), gg, true); } gboolean isEmbeddedDisplay (displayd * dpy) { gboolean ans = false; ans = (GGOBI_IS_WINDOW_DISPLAY (dpy) == false || GGOBI_WINDOW_DISPLAY (dpy)->useWindow); return (ans); } /* * Since display types are unfortunately not subclasses of display, * we could use a method for figuring out which display types * support which view modes */ gboolean display_type_handles_projection (displayd * display, ProjectionMode pmode) { gboolean handles = false; ProjectionMode v = pmode; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { handles = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->handles_projection (display, v); } return handles; } gboolean display_type_handles_interaction (displayd * display, InteractionMode imode) { gboolean handles = false; InteractionMode v = imode; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { handles = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)-> handles_interaction (display, v); } return handles; } gboolean display_copy_edge_options (displayd * dsp, displayd * dspnew) { GtkAction *action; dspnew->options.edges_undirected_show_p = dsp->options.edges_undirected_show_p; action = gtk_ui_manager_get_action (dspnew->menu_manager, "/menubar/Edges/ShowUndirectedEdges"); if (action) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), dspnew->options.edges_undirected_show_p); } dspnew->options.edges_directed_show_p = dsp->options.edges_directed_show_p; action = gtk_ui_manager_get_action (dspnew->menu_manager, "/menubar/Edges/ShowDirectedEdges"); if (action) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), dspnew->options.edges_directed_show_p); } dspnew->options.edges_arrowheads_show_p = dsp->options.edges_arrowheads_show_p; action = gtk_ui_manager_get_action (dspnew->menu_manager, "/menubar/Edges/ShowArrowheadsOnly"); if (action) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), dspnew->options.edges_arrowheads_show_p); } return (dspnew->options.edges_directed_show_p || dspnew->options.edges_undirected_show_p || dspnew->options.edges_arrowheads_show_p); } ggobi-2.1.12/src/display_tree.c0000644000175000017500000002307614651527764012015 /*-- display_tree.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "ggobi.h" /* #include "display_tree.h" */ #include "externs.h" #include "vars.h" enum { DISPTREE_LABEL, DISPTREE_DATASET, DISPTREE_PMODE, DISPTREE_IMODE, DISPTREE_OBJECT, DISPTREE_NCOLS }; gboolean display_tree_get_iter_for_object (GtkTreeModel * model, gpointer obj, GtkTreeIter * iter) { gboolean found = false, exists; gpointer tmp_obj; exists = gtk_tree_model_get_iter_first (model, iter); while (!found && exists) { gtk_tree_model_get (model, iter, DISPTREE_OBJECT, &tmp_obj, -1); if (tmp_obj == obj) found = true; else exists = gtk_tree_model_iter_next (model, iter); } return (exists); } /* Manipulates a separate window for displaying a tree representing the open windows being managed by this ggobi session/application. The sub-elements within each display node are the plots within that node. */ static void update_display_tree_plots_by_variable (ggobid * gg, GGobiData * d, gint whichVar, splotd * sp, GtkTreeModel * model) { GtkTreeIter iter; gchar *label; g_return_if_fail (GTK_IS_TREE_STORE (model)); display_tree_get_iter_for_object (model, sp, &iter); label = splot_tree_label (sp, d, gg); gtk_tree_store_set (GTK_TREE_STORE (model), &iter, DISPTREE_LABEL, label, -1); /* dfs: don't free if (label) g_free (label); */ } CHECK_EVENT_SIGNATURE (update_display_tree_plots_by_variable, select_variable_f) static gchar *disptree_lbl[] = { "Label", "Dataset", "View", "Interaction" }; /* Create a window displaying a hierarchical view of the current displays managed by this Ggobi, along with their sub-plots. This can be used for selecting the current or active display, or plot. Also, one can add menus here to allow different operations on a group of selected items in the tree for things such as printing, deleting, editing, saving, etc. When this window is open, we need to add new windows as they are created, and also remove those that are deleted. This is arranged by adding appropriate calls to the routines here from display_new() and display_free(), respectively. */ GtkTreeView * plot_tree_display (ggobid * gg) { GList *dlist; displayd *display; GtkWidget *tree, *sw; GtkWidget *plot_tree_window; GtkTreeModel *model; /* If this is the first time we have called this, create it from scratch. Otherwise, we have to update the display. The easiest way is to remove the entire contents of the tree and start rebuilding with the current model. */ g_return_val_if_fail (gg->display_tree.tree == NULL, NULL); plot_tree_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (plot_tree_window), "GGobi Displays"); gtk_window_set_default_size (GTK_WINDOW (plot_tree_window), 450, 200); model = GTK_TREE_MODEL (gtk_tree_store_new (DISPTREE_NCOLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_OBJECT)); g_signal_connect (G_OBJECT (gg), "select_variable", G_CALLBACK (update_display_tree_plots_by_variable), (gpointer) model); gg->display_tree.model = model; for (dlist = gg->displays; dlist; dlist = dlist->next) { display = (displayd *) dlist->data; display_add_tree (display); } tree = gtk_tree_view_new_with_model (model); gg->display_tree.tree = tree; populate_tree_view (tree, disptree_lbl, G_N_ELEMENTS (disptree_lbl), true, GTK_SELECTION_SINGLE, G_CALLBACK (display_tree_child_select), NULL); sw = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER (sw), tree); gtk_container_add (GTK_CONTAINER (plot_tree_window), sw); gtk_widget_show_all (plot_tree_window); g_signal_connect (G_OBJECT (plot_tree_window), "delete_event", G_CALLBACK (display_tree_delete_cb), gg); gg->display_tree.window = plot_tree_window; return (GTK_TREE_VIEW (tree)); } void display_add_tree (displayd * display) { gchar *label; const gchar *dataset, *pmode, *imode; ggobid *gg = display->ggobi; GtkTreeIter disp_iter; GtkTreeModel *tree = gg->display_tree.model; if (tree == NULL) return; label = display_tree_label (display); dataset = display->d->name; imode = GGOBI (getIModeScreenName) (display->cpanel.imode, display); pmode = GGOBI (getPModeScreenName) (display->cpanel.pmode, display); gtk_tree_store_append (GTK_TREE_STORE (tree), &disp_iter, NULL); gtk_tree_store_set (GTK_TREE_STORE (tree), &disp_iter, DISPTREE_LABEL, label, DISPTREE_DATASET, dataset, DISPTREE_IMODE, imode, DISPTREE_PMODE, pmode, DISPTREE_OBJECT, display, -1); splot_add_tree (display, &disp_iter); } /* Called when the display tree window is closed. */ void display_tree_delete_cb (GtkWidget * w, GdkEvent * event, ggobid * gg) { gtk_widget_destroy (gg->display_tree.window); gg->display_tree.tree = NULL; } /* Create a sub-tree for the specified window/display which may be a parallel coords plot, scatterplot, or scatterplot matrix. */ void splot_add_tree (displayd * display, GtkTreeIter * parent) { ggobid *gg = display->ggobi; GList *slist; splotd *sp; GGobiData *d = display->d; gchar *buf; GtkTreeIter iter; GtkTreeModel *model = gg->display_tree.model; /* g_signal_connect (G_OBJECT(tree), "select_child", G_CALLBACK(display_tree_child_select), display); */ /* Here do the plots within the display. */ for (slist = display->splots; slist; slist = slist->next) { sp = (splotd *) slist->data; /*-- buf is allocated in splot_tree_label, but freed here --*/ buf = splot_tree_label (sp, d, gg); gtk_tree_store_append (GTK_TREE_STORE (model), &iter, parent); gtk_tree_store_set (GTK_TREE_STORE (model), &iter, DISPTREE_LABEL, buf, DISPTREE_OBJECT, sp, -1); /* dfs: don't free if (buf) g_free (buf); */ } } /* Use the windows title. Need to find out how to get the title from a GtkWindow. For now, use a string associated with the displaytype. */ gchar * display_tree_label (displayd * display) { gchar *val = NULL; if (GGOBI_IS_EXTENDED_DISPLAY (display)) val = (gchar *) ggobi_display_tree_label (display); return (val); } /* Computes the label for an element in the tree for the specified splot, in position `ctr' and an element in the container of type `type'. */ gchar * splot_tree_label (splotd * splot, GGobiData * d, ggobid * gg) { if (GGOBI_IS_EXTENDED_SPLOT (splot)) { return (GGOBI_EXTENDED_SPLOT_GET_CLASS (splot)-> tree_label (splot, d, gg)); } return (NULL); } /* Callback for a menu item, etc. to create and show the display and plot hierarchy. */ void /* used when DisplayTree is part of the ItemFactory in the main menubar */ show_display_tree (ggobid * gg, GtkWidget * widget) { plot_tree_display (gg); } void /* used when DisplayTree is part of the Display menu */ show_display_tree_cb (GtkWidget * w, ggobid * gg) { plot_tree_display (gg); } /* Identify the index of the given display and remove the corresponding node in the display_tree. */ gboolean tree_display_entry_remove (displayd * display, GtkWidget * tree, ggobid * gg) { GtkTreeIter iter; GtkTreeModel *model; if (!tree) return false; model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree)); display_tree_get_iter_for_object (model, display, &iter); return (gtk_tree_store_remove (GTK_TREE_STORE (model), &iter)); } /* Called when a node corresponding to a window/display is selected in the display tree. This sets that display to be the current or active one. */ void display_tree_child_select (GtkTreeSelection * sel, gpointer data) { displayd *display; splotd *splot = NULL; ggobid *gg; gpointer obj; GtkTreeModel *model; GtkTreeIter iter; if (!gtk_tree_selection_get_selected (sel, &model, &iter)) return; gtk_tree_model_get (model, &iter, DISPTREE_OBJECT, &obj, -1); if (GGOBI_IS_SPLOT (obj)) { splot = GGOBI_SPLOT (obj); display = splot->displayptr; } else if (GGOBI_IS_DISPLAY (obj)) { display = GGOBI_DISPLAY (obj); } else return; gg = GGobiFromDisplay (display); g_return_if_fail (gg->display_tree.tree != NULL); /* Top-level of tree, so set that to be the current display. */ if (!splot && gg->current_splot->displayptr != display) { splot = (splotd *) g_list_nth_data (display->splots, 0); } if (splot) GGOBI (splot_set_current_full) (display, splot, gg); gtk_widget_show (GGOBI_WINDOW_DISPLAY (display)->window); /* And now make certain the window comes to the top. */ gdk_window_raise (GGOBI_WINDOW_DISPLAY (display)->window->window); } ggobi-2.1.12/src/tour2d_pp.c0000644000175000017500000005014214651527764011241 /* tour2d_pp.c */ /* Copyright (C) 2001 Dianne Cook and Sigbert Klinke and Eun-Kuung Lee This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The authors can be contacted at the following email addresses: dicook@iastate.edu sigbert@wiwi.hu-berlin.de */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include #include #if !defined __APPLE__ && !defined __GNUC__ #endif #include "vars.h" #include "externs.h" #include "tour2d_pp.h" #include "tour_pp.h" typedef enum {HOLES, CENTRAL_MASS, LDA, CGINI, CENTROPY} StandardPPIndexTypes; #define EXPMINUS1 0.3678794411714423 #define ONEMINUSEXPMINUS1 0.63212056 void t2d_pptemp_set(gfloat slidepos, displayd *dsp, ggobid *gg) { dsp->t2d_pp_op.temp_start = slidepos; } void t2d_ppcool_set(gfloat slidepos, displayd *dsp, ggobid *gg) { dsp->t2d_pp_op.cooling = slidepos; } gfloat mean_fn2(gfloat *x1, gfloat *x2, gint n) { gint i; gfloat tmean, tmpf1; gfloat mean1, mean2; tmpf1 = 0.; for (i=0; ih0 = (gfloat *) g_malloc( (guint) nrows*sizeof(gfloat *)); hp->h1 = (gfloat *) g_malloc( (guint) nrows*sizeof(gfloat *)); } void free_holes_p(holes_param *hp) { g_free(hp->h0); g_free(hp->h1); } */ /******************************************************************** Index : Holes Transformation : needs sphered variables/principal components Purpose : computes a projection into a normal density fn Note : only works for 2d now, could be generalized *********************************************************************/ /* gint holes(array_f *pdata, void *param, gfloat *val) { holes_param *hp = (holes_param *) param; gint i, m; * Calculate coefficients * for (i=0; inrows; i++) { m = i; hp->h0[m] = exp(-pdata->vals[m][0]*pdata->vals[m][0]/2.) ; hp->h1[m] = exp(-pdata->vals[m][1]*pdata->vals[m][1]/2.) ; } * Calculate index * hp->acoefs = mean_fn2(hp->h0,hp->h1,pdata->nrows); *val = (1. - hp->acoefs)/(gfloat) ONEMINUSEXPMINUS1 ; return(0); } */ /******************************************************************** Index : Central Mass Transformation : needs sphered variables/principal components Purpose : computes a neg projection into a normal density fn Note : only works for 2d now, could be generalized *********************************************************************/ /* gint central_mass(array_f *pdata, void *param, gfloat *val) { holes_param *hp = (holes_param *) param; gint i, m; * Calculate coefficients * for (i=0; inrows; i++) { m = i; hp->h0[m] = exp(-pdata->vals[m][0]*pdata->vals[m][0]/2.) ; hp->h1[m] = exp(-pdata->vals[m][1]*pdata->vals[m][1]/2.) ; } * Calculate index * hp->acoefs = mean_fn2(hp->h0,hp->h1,pdata->nrows); *val = (hp->acoefs - (gfloat)EXPMINUS1)/(float)ONEMINUSEXPMINUS1 ; return(0); } */ /***************************************************/ /* 2D Holes index for raw data */ /* holes_raw1 */ /* holes_raw2 : use inverse function */ /***************************************************/ /* gint holes_raw1(array_f *pdata, void *param, gfloat *val) { * holes_param *hp = (holes_param *) param; * gint i, p=pdata->ncols, n=pdata->nrows; gfloat m1, m2, x1, x2, temp; gdouble *cov; gfloat det,acoefs; cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); for(i=0; i<(p*p); i++) cov[i] = 0; m1=0; m2=0; for (i=0; ivals[i][0]; m2 += pdata->vals[i][1]; } m1 /= n; m2 /= n; for (i=0; ivals[i][0]-m1)*(pdata->vals[i][0]-m1)/(n-1); cov[1] += (pdata->vals[i][0]-m1)*(pdata->vals[i][1]-m2)/(n-1); cov[3] += (pdata->vals[i][1]-m2)*(pdata->vals[i][1]-m2)/(n-1); } cov[2] = cov[1]; det = cov[0]*cov[3]-cov[1]*cov[1]; cov[0] /= det; cov[1] /= det; cov[2] /= det; cov[3] /= det; acoefs=0.; for(i=0; ivals[i][0]-m1; x2 = pdata->vals[i][1]-m2; temp = (cov[3]*x1*x1-2*cov[1]*x1*x2+cov[0]*x2*x2); acoefs += exp(-temp/2); } *val = (1.-acoefs/n)/(gfloat) ONEMINUSEXPMINUS1; g_free(cov); return(0); } gint holes_raw2( array_f *pdata, void *param, gfloat *val) { gint i, p=pdata->ncols, n=pdata->nrows; gfloat m1, m2,x1,x2,temp; gdouble *cov; * holes_param *hp = (holes_param *) param; gfloat det; * gfloat acoefs; cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); for(i=0; i<(p*p); i++) cov[i] = 0; m1=0; m2=0; for(i=0; ivals[i][0]/n; m2 += pdata->vals[i][1]/n; } for(i=0; ivals[i][0]-m1)*(pdata->vals[i][0]-m1)/(n-1); cov[1] += (pdata->vals[i][0]-m1)*(pdata->vals[i][1]-m2)/(n-1); cov[3] += (pdata->vals[i][1]-m2)*(pdata->vals[i][1]-m2)/(n-1); } cov[2]= cov[1]; inverse(cov,p); acoefs=0.; for(i=0; ivals[i][0]-m1; x2=pdata->vals[i][1]-m2; temp= cov[0]*x1*x1+(cov[1]+cov[2])*x1*x2+cov[3]*x2*x2; acoefs +=exp(-temp/2); } *val = (1.-acoefs/n)/(gfloat) ONEMINUSEXPMINUS1; free(cov); return(0); } */ /**********************************************************/ /* 2D Central Mass index for raw data */ /* central_mass_raw1 */ /* central_mass_raw2 : use inverse function */ /**********************************************************/ /* gint central_mass_raw1(array_f *pdata, void *param, gfloat *val) { * holes_param *hp = (holes_param *) param; * gint i, p=pdata->ncols, n=pdata->nrows; gfloat m1, m2,x1,x2,temp; gdouble *cov; gfloat det,acoefs; cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); for(i=0; i<(p*p); i++) cov[i] = 0; m1=0; m2=0; for(i=0; ivals[i][0]; m2 += pdata->vals[i][1]; } m1 /= n; m2 /= n; for(i=0; ivals[i][0]-m1)*(pdata->vals[i][0]-m1)/(n-1); cov[1] += (pdata->vals[i][0]-m1)*(pdata->vals[i][1]-m2)/(n-1); cov[3] += (pdata->vals[i][1]-m2)*(pdata->vals[i][1]-m2)/(n-1); } cov[2]= cov[1]; det = cov[0]*cov[3]-cov[1]*cov[1]; acoefs=0.; for(i=0; ivals[i][0]-m1; x2=pdata->vals[i][1]-m2; temp= (cov[3]*x1*x1-2*cov[1]*x1*x2+cov[0]*x2*x2)/det; acoefs +=exp(-temp/2); } *val = (acoefs/n-(gfloat)EXPMINUS1)/(gfloat) ONEMINUSEXPMINUS1; free(cov); return(0); } gint central_mass_raw2(array_f *pdata, void *param, gfloat *val) { *holes_param *hp = (holes_param *) param;* gint i, p=pdata->ncols, n=pdata->nrows; gfloat m1, m2,x1,x2,temp; gdouble *cov; gfloat acoefs; cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); for(i=0; i<(p*p); i++) cov[i] = 0; m1=0; m2=0; for(i=0; ivals[i][0]/n; m2 += pdata->vals[i][1]/n; } for(i=0; ivals[i][0]-m1)*(pdata->vals[i][0]-m1)/(n-1); cov[1] += (pdata->vals[i][0]-m1)*(pdata->vals[i][1]-m2)/(n-1); cov[3] += (pdata->vals[i][1]-m2)*(pdata->vals[i][1]-m2)/(n-1); } cov[2]= cov[1]; inverse(cov,p); acoefs=0.; for(i=0; ivals[i][0]-m1; x2=pdata->vals[i][1]-m2; temp= cov[0]*x1*x1-(cov[1]+cov[2])*x1*x2+cov[3]*x2*x2; acoefs +=exp(-temp/2); } *val = (acoefs/n-(gfloat)EXPMINUS1)/(gfloat) ONEMINUSEXPMINUS1; free(cov); return(0); } */ /*void holes_deriv(holes_param *hp, gfloat **data, gfloat **pdata) { gint i, k, m; gfloat tmpf; for (i=0; i<2; i++) for (k=0; kncols; k++) hp->derivs[i][k] = 0.; * alpha * for (k=0; kncols; k++) { tmpf = 0.; for (i=0; inrows; i++) { m = i; tmpf += (pdata[0][m]*hp->h0[m]*hp->h1[m]* (data[m][k] - hp->alpha[k]*pdata[0][m] - hp->beta[k]*pdata[1][m])); } tmpf /= ((float)hp->nrows); hp->derivs[0][k] = tmpf; } * beta * for (k=0; kncols; k++) { tmpf = 0.; for (i=0; inrows; i++) { m = i; tmpf += (pdata[1][m]*hp->h0[m]*hp->h1[m]* (data[m][k] - hp->alpha[k]*pdata[0][m] - hp->beta[k]*pdata[1][m])); } tmpf /= ((float)hp->nrows); hp->derivs[1][k] = tmpf; } } */ /*void central_mass_deriv(float **data, float **proj_data, float *alpha, float *beta, float **derivs, int n, int *rows_in_plot, int p, int nactive, int *active_vars) { int i, k, m; float tmpf; for (i=0; i<2; i++) for (k=0; kh0[m]*hp->h1[m]* (data[m][active_vars[k]] - alpha[active_vars[k]]*proj_data[0][m] - beta[active_vars[k]]*proj_data[1][m])); } tmpf /= ((float)n); derivs[0][active_vars[k]] = tmpf; } for (k=0; kh0[m]*hp->h1[m]* (data[m][active_vars[k]] - alpha[active_vars[k]]*proj_data[0][m] - beta[active_vars[k]]*proj_data[1][m])); } tmpf /= ((float)n); derivs[1][active_vars[k]] = tmpf; } }*/ /* This function interacts with control buttons in ggobi */ void t2d_optimz(gint optimz_on, gboolean *nt, gint *bm, displayd *dsp) { gboolean new_target = *nt; gint bas_meth = *bm; gint i, j; if (optimz_on) { for (i=0; i<2; i++) for (j=0; jt2d.nactive; j++) dsp->t2d_pp_op.proj_best.vals[i][j] = dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[j]]; /* dsp->t2d.ppval = dsp->t2d_indx_min;*/ dsp->t2d_pp_op.index_best = dsp->t2d.ppval; bas_meth = 1; } else bas_meth = 0; new_target = true; *nt = new_target; *bm = bas_meth; } void t2d_clear_pppixmap(displayd *dsp, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; gint margin=10; gint wid = dsp->t2d_ppda->allocation.width, hgt = dsp->t2d_ppda->allocation.height; /* clear the pixmap */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (dsp->t2d_pp_pixmap, gg->plot_GC, true, 0, 0, wid, hgt); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_line (dsp->t2d_pp_pixmap, gg->plot_GC, margin, hgt - margin, wid - margin, hgt - margin); gdk_draw_line (dsp->t2d_pp_pixmap, gg->plot_GC, margin, hgt - margin, margin, margin); gdk_draw_pixmap (dsp->t2d_ppda->window, gg->plot_GC, dsp->t2d_pp_pixmap, 0, 0, 0, 0, wid, hgt); } void t2d_clear_ppda(displayd *dsp, ggobid *gg) { gint i; /* clear the ppindx matrix */ dsp->t2d_ppindx_count = 0; dsp->t2d_indx_min=1000.; dsp->t2d_indx_max=-1000.; for (i=0; i<100; i++) { dsp->t2d_ppindx_mat[i] = 0.0; } t2d_clear_pppixmap(dsp, gg); } void t2d_ppdraw_all(gint wid, gint hgt, gint margin, displayd *dsp, ggobid *gg) { GdkPoint pptrace[100]; gint i; t2d_clear_pppixmap(dsp, gg); for (i=0; it2d_ppindx_count; i++) { pptrace[i].x = margin+i*2; pptrace[i].y = hgt-margin-(gint)((gfloat)((dsp->t2d_ppindx_mat[i]- dsp->t2d_indx_min)/(gfloat) (dsp->t2d_indx_max-dsp->t2d_indx_min)) * (gfloat) (hgt - 2*margin)); } gdk_draw_lines (dsp->t2d_pp_pixmap, gg->plot_GC, pptrace, dsp->t2d_ppindx_count); gdk_draw_pixmap (dsp->t2d_ppda->window, gg->plot_GC, dsp->t2d_pp_pixmap, 0, 0, 0, 0, wid, hgt); } /* This is writes text to the pp window to inform the user that optimize is finding a new maximum */ void t2d_ppdraw_think(displayd *dsp, ggobid *gg) { splotd *sp = (splotd *) g_list_nth_data (dsp->splots, 0); colorschemed *scheme = gg->activeColorScheme; gint wid = dsp->t2d_ppda->allocation.width, hgt = dsp->t2d_ppda->allocation.height; PangoLayout *layout = gtk_widget_create_pango_layout(sp->da, "Thinking..."); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_layout(dsp->t2d_pp_pixmap, gg->plot_GC, 10, 10, layout); g_object_unref(G_OBJECT(layout)); /*gdk_text_extents ( gtk_style_get_font (style), varlab, strlen (varlab), &lbearing, &rbearing, &width, &ascent, &descent); gdk_draw_string (dsp->t2d_pp_pixmap, gtk_style_get_font (style), gg->plot_GC, 10, 10, varlab);*/ gdk_draw_pixmap (dsp->t2d_ppda->window, gg->plot_GC, dsp->t2d_pp_pixmap, 0, 0, 0, 0, wid, hgt); } /* This is the pp index plot drawing routine */ void t2d_ppdraw(gfloat pp_indx_val, displayd *dsp, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; gint margin=10; gint wid = dsp->t2d_ppda->allocation.width, hgt = dsp->t2d_ppda->allocation.height; gint j; static gboolean init = true; gchar *label = g_strdup("PP index: (0.0) 0.0000 (0.0)"); if (init) { t2d_clear_ppda(dsp, gg); init = false; } dsp->t2d_ppindx_mat[dsp->t2d_ppindx_count] = pp_indx_val; if (dsp->t2d_indx_min > pp_indx_val) dsp->t2d_indx_min = pp_indx_val; if (dsp->t2d_indx_max < pp_indx_val) dsp->t2d_indx_max = pp_indx_val; if (dsp->t2d_indx_min == dsp->t2d_indx_max) dsp->t2d_indx_min *= 0.9999; label = g_strdup_printf ("PP index: (%3.1f) %5.3f (%3.1f)", dsp->t2d_indx_min, dsp->t2d_ppindx_mat[dsp->t2d_ppindx_count], dsp->t2d_indx_max); gtk_label_set_text(GTK_LABEL(dsp->t2d_pplabel),label); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); if (dsp->t2d_ppindx_count == 0) { dsp->t2d_ppindx_count++; } else if (dsp->t2d_ppindx_count > 0 && dsp->t2d_ppindx_count < 80) { t2d_ppdraw_all(wid, hgt, margin, dsp, gg); dsp->t2d_ppindx_count++; } else if (dsp->t2d_ppindx_count >= 80) { /* cycle values back into array */ for (j=0; j<=dsp->t2d_ppindx_count; j++) dsp->t2d_ppindx_mat[j] = dsp->t2d_ppindx_mat[j+1]; t2d_ppdraw_all(wid, hgt, margin, dsp, gg); } g_free (label); } void t2d_pp_reinit(displayd *dsp, ggobid *gg) { gint i, j; gchar *label = g_strdup("PP index: (0.0) 0.0000 (0.0)"); for (i=0; it2d_pp_op.proj_best.nrows; i++) for (j=0; jt2d_pp_op.proj_best.ncols; j++) dsp->t2d_pp_op.proj_best.vals[i][j] = dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[j]]; dsp->t2d.ppval = 0.0; dsp->t2d.oppval = -1.0; dsp->t2d_pp_op.index_best = 0.0; label = g_strdup_printf ("PP index: (%3.1f) %5.3f (%3.1f)", dsp->t2d_indx_min, dsp->t2d_ppindx_mat[dsp->t2d_ppindx_count], dsp->t2d_indx_max); gtk_label_set_text(GTK_LABEL(dsp->t2d_pplabel),label); t2d_clear_ppda(dsp, gg); g_free (label); } /******************************************************************** INDEX CALCULATION The index function has to be defined as gint index (array_f *pdata, void *param, gfloat *val) with Input: pdata projected data param additional parameters for the index (will not be touched by the optimization routine) Output: val the index-value This function should simply calculate the index value for a provided projection. *********************************************************************/ gfloat t2d_calc_indx (array_f pd, Tour_PPIndex_f index, void *param) { gfloat indexval; index (&pd, param, &indexval, NULL); return(indexval); } /* We could call this with the tour t2d object rather than the index type since we no longer need the indxtype */ gboolean t2d_switch_index(Tour2DCPanel controls, gint basismeth, displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint kout, nrows = d->nrows_in_plot; gfloat *gdata; gint i, j, k; if (d->nrows_in_plot == 1) /* can't do pp on no data! */ return(false); /* Copy data into pp opt'n data */ for (i=0; inrows_in_plot; i++) for (j=0; jt2d.nactive; j++) dsp->t2d_pp_op.data.vals[i][j] = d->tform.vals[d->rows_in_plot.els[i]][dsp->t2d.active_vars.els[j]]; /* Copy current projection into opt'n projection */ for (i=0; i<2; i++) for (j=0; jt2d.nactive; j++) dsp->t2d_pp_op.proj_best.vals[i][j] = dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[j]]; for (k=0; k<2; k++) for (i=0; inrows_in_plot; i++) { dsp->t2d_pp_op.pdata.vals[i][k] = (d->tform.vals[d->rows_in_plot.els[i]][dsp->t2d.active_vars.els[0]]* dsp->t2d_pp_op.proj_best.vals[k][0]); for (j=1; jt2d.nactive; j++) dsp->t2d_pp_op.pdata.vals[i][k] += (d->tform.vals[d->rows_in_plot.els[i]][dsp->t2d.active_vars.els[j]]* dsp->t2d_pp_op.proj_best.vals[k][j]); } gdata = g_malloc (nrows*sizeof(gfloat)); if (d->clusterid.els==NULL) printf ("No cluster information found\n"); for (i = 0 ; i < nrows; i++) { if (d->clusterid.els!=NULL) gdata[i] = d->clusterid.els[d->rows_in_plot.els[i]]; else gdata[i] = 0; } if(controls.ppindex.index_f) { if(controls.ppindex.checkGroups == false || !compute_groups (dsp->t2d_pp_param.group, dsp->t2d_pp_param.ngroup, &dsp->t2d_pp_param.numgroups, nrows, gdata)) { controls.ppindex.index_f(&dsp->t2d_pp_op.pdata, &dsp->t2d_pp_param, &dsp->t2d.ppval, controls.ppindex.userData); if(basismeth == 1) kout = optimize0 (&dsp->t2d_pp_op, controls.ppindex.index_f, &dsp->t2d_pp_param); } } #if 0 switch (indxtype) { case HOLES: dsp->t2d.ppval = t2d_calc_indx (dsp->t2d_pp_op.pdata, holes_raw, &dsp->t2d_pp_param); if (basismeth == 1) { kout = optimize0 (&dsp->t2d_pp_op, holes_raw, &dsp->t2d_pp_param); } break; case CENTRAL_MASS: dsp->t2d.ppval = t2d_calc_indx (dsp->t2d_pp_op.pdata, central_mass_raw, &dsp->t2d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t2d_pp_op, central_mass_raw, &dsp->t2d_pp_param); break; case LDA: if (!compute_groups (dsp->t2d_pp_param.group, dsp->t2d_pp_param.ngroup, &dsp->t2d_pp_param.numgroups, nrows, gdata)) { dsp->t2d.ppval = t2d_calc_indx (dsp->t2d_pp_op.pdata, discriminant, &dsp->t2d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t2d_pp_op, discriminant, &dsp->t2d_pp_param); } break; case CGINI: if (!compute_groups (dsp->t2d_pp_param.group, dsp->t2d_pp_param.ngroup, &dsp->t2d_pp_param.numgroups, nrows, gdata)) { dsp->t2d.ppval = t2d_calc_indx (dsp->t2d_pp_op.pdata, cartgini, &dsp->t2d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t2d_pp_op, cartgini, &dsp->t2d_pp_param); } break; case CENTROPY: if (!compute_groups (dsp->t2d_pp_param.group, dsp->t2d_pp_param.ngroup, &dsp->t2d_pp_param.numgroups, nrows, gdata)) { dsp->t2d.ppval = t2d_calc_indx (dsp->t2d_pp_op.pdata, cartentropy, &dsp->t2d_pp_param); if (basismeth == 1) kout = optimize0 (&dsp->t2d_pp_op, cartentropy, &dsp->t2d_pp_param); } break; break; default: /* Shouldn't we free gdata. */ return(true); break; } #endif g_free (gdata); return(false); } #undef ONEMINUSEXPMINUS1 #undef EXPMINUS1 ggobi-2.1.12/src/brush_init.c0000644000175000017500000001717014651527764011475 /* brush_init.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * Allocation and initialization routines for brushing. */ #include #include "vars.h" #include "externs.h" /* external variables */ /*-------------------------------------------------------------------------*/ /* glyphs */ /*-------------------------------------------------------------------------*/ void br_glyph_ids_free (GGobiData * d) { vectorg_free (&d->glyph); vectorg_free (&d->glyph_now); vectorg_free (&d->glyph_prev); } void br_glyph_ids_alloc (GGobiData * d) { vectorg_alloc (&d->glyph, d->nrows); vectorg_alloc (&d->glyph_now, d->nrows); vectorg_alloc (&d->glyph_prev, d->nrows); } void br_glyph_ids_init (GGobiData * d) { gint i; g_assert (d->glyph.nels == d->nrows); for (i = 0; i < d->nrows; i++) { d->glyph.els[i].type = d->glyph_now.els[i].type = d->glyph_prev.els[i].type = FC; d->glyph.els[i].size = d->glyph_now.els[i].size = d->glyph_prev.els[i].size = 1; } } /*-- reallocates and initializes to the current glyph type and size --*/ void br_glyph_ids_add (GGobiData * d, ggobid * gg) { gint i, nprev = d->glyph.nels; vectorg_realloc (&d->glyph, d->nrows); vectorg_realloc (&d->glyph_now, d->nrows); vectorg_realloc (&d->glyph_prev, d->nrows); for (i = nprev; i < d->nrows; i++) { d->glyph.els[i].type = d->glyph_now.els[i].type = d->glyph_prev.els[i].type = gg->glyph_id.type; d->glyph.els[i].size = d->glyph_now.els[i].size = d->glyph_prev.els[i].size = gg->glyph_id.size; } } /*-------------------------------------------------------------------------*/ /* color */ /*-------------------------------------------------------------------------*/ void br_color_ids_free (GGobiData * d) { vectors_free (&d->color); vectors_free (&d->color_now); vectors_free (&d->color_prev); } void br_color_ids_alloc (GGobiData * d) { vectors_realloc (&d->color, d->nrows); vectors_realloc (&d->color_now, d->nrows); vectors_realloc (&d->color_prev, d->nrows); } void br_color_ids_init (GGobiData * d) { gint i; g_assert (d->color.nels == d->nrows); for (i = 0; i < d->nrows; i++) d->color.els[i] = d->color_now.els[i] = d->color_prev.els[i] = 0; } /*-- reallocate and initialize colors --*/ void br_color_ids_add (GGobiData * d, ggobid * gg) { gint i, nprev = d->color.nels; vectors_realloc (&d->color, d->nrows); vectors_realloc (&d->color_now, d->nrows); vectors_realloc (&d->color_prev, d->nrows); /* initialize */ for (i = nprev; i < d->nrows; i++) d->color.els[i] = d->color_now.els[i] = d->color_prev.els[i] = gg->color_id; } /*-------------------------------------------------------------------------*/ /* erasing */ /*-------------------------------------------------------------------------*/ void br_hidden_alloc (GGobiData * d) { gint i, nprev = d->hidden.nels; vectorb_realloc (&d->hidden, d->nrows); vectorb_realloc (&d->hidden_now, d->nrows); vectorb_realloc (&d->hidden_prev, d->nrows); /* initialize to not hidden */ for (i = nprev; i < d->nrows; i++) d->hidden.els[i] = d->hidden_now.els[i] = d->hidden_prev.els[i] = 0; } void br_hidden_init (GGobiData * d) { gint i; g_assert (d->hidden.nels == d->nrows); for (i = 0; i < d->nrows; i++) d->hidden.els[i] = d->hidden_now.els[i] = d->hidden_prev.els[i] = false; } /*-------------------------------------------------------------------------*/ /* edge color */ /*-------------------------------------------------------------------------*/ void br_edge_vectors_free (GGobiData * d, ggobid * gg) { vectorb_free (&d->edge.xed_by_brush); } gboolean br_edge_vectors_check_size (gint ns, GGobiData * d, ggobid * gg) { gboolean same = (d->edge.xed_by_brush.nels != ns); if (!same) { vectorb_realloc (&d->edge.xed_by_brush, ns); } return same; } /*-------------------------------------------------------------------------*/ /* the brush itself */ /*-------------------------------------------------------------------------*/ void brush_pos_init (splotd * sp) { sp->brush_pos.x1 = sp->brush_pos.y1 = 20; sp->brush_pos.x2 = sp->brush_pos.y2 = 40; sp->brush_pos_o.x1 = sp->brush_pos_o.y1 = 20; sp->brush_pos_o.x2 = sp->brush_pos_o.y2 = 40; } /*----------------------------------------------------------------------*/ /* general */ /*----------------------------------------------------------------------*/ void brush_alloc (GGobiData * d, ggobid * gg) /* * Dynamically allocate arrays. */ { guint nr = (guint) d->nrows, i; gint iv, ih; gboolean initd = false; d->brush.nbins = BRUSH_NBINS; vectorb_realloc (&d->pts_under_brush, nr); if (d->edge.n) vectorb_realloc (&d->edge.xed_by_brush, d->edge.n); for (i = 0; i < nr; i++) { d->pts_under_brush.els[i] = false; } /* * color and glyph and their kin were allocated when * the data was read in. */ if (!initd) { /* binning the plot window; no need to realloc these */ d->brush.binarray = (bin_struct **) g_malloc (d->brush.nbins * sizeof (bin_struct *)); for (ih = 0; ih < d->brush.nbins; ih++) { d->brush.binarray[ih] = (bin_struct *) g_malloc (d->brush.nbins * sizeof (bin_struct)); for (iv = 0; iv < d->brush.nbins; iv++) { d->brush.binarray[ih][iv].nels = 0; d->brush.binarray[ih][iv].nblocks = 1; d->brush.binarray[ih][iv].els = (gulong *) g_malloc (BINBLOCKSIZE * sizeof (gulong)); } } initd = true; } } void brush_free (GGobiData * d, ggobid * gg) /* * Dynamically free arrays. */ { int j, k; br_glyph_ids_free (d); br_color_ids_free (d); vectorb_free (&d->pts_under_brush); for (k = 0; k < d->brush.nbins; k++) { for (j = 0; j < d->brush.nbins; j++) g_free ((gpointer) d->brush.binarray[k][j].els); g_free ((gpointer) d->brush.binarray[k]); } g_free ((gpointer) d->brush.binarray); } void brush_init (GGobiData * d, ggobid * gg) { /* * Used in binning the plot window */ d->brush.nbins = BRUSH_NBINS; /* * These are initialized so that the first merge_brushbins() * call will behave reasonably. */ d->brush.bin0.x = d->brush.bin1.x = BRUSH_NBINS; d->brush.bin0.y = d->brush.bin1.y = BRUSH_NBINS; vectorb_init_null (&d->pts_under_brush); brush_alloc (d, gg); } RedrawStyle brush_activate (gboolean state, displayd * display, splotd * sp, ggobid * gg) { GGobiData *d = display->d; RedrawStyle redraw_style = NONE; if (sp != gg->current_splot) return redraw_style; if (GGOBI_IS_EXTENDED_SPLOT (sp)) { void (*f) (GGobiData *, splotd *, ggobid *); GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (state) { f = klass->splot_assign_points_to_bins; if (f) { f (d, sp, gg); // need to exclude area plots } } } return redraw_style; } ggobi-2.1.12/src/read_xml.c0000644000175000017500000015263214651527764011125 /* read_xml.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include /* This is a SAX based parser for reading a single input file formatted in XML for the DTD specified in ggobi.dtd. SAX is an event based parser. As different elements of the document are encountered by the parser on its input stream, it invokes user-specified callbacks. For our purposes, we currently need only handle 3 event types: 1) the start of a tag 2) the end of a tag 3) regular text data within a tag As with all event driven approaches, we can specify a user-level data object that can is passed to each event handler/callback. This is used to parameterize the particular call. In our case, we pass an XMLParserData * object (defined in read_xml.h). This basically stores what state in the document we currently have and indicates how to interpret the future callbacks, and also the ggobid structure which we are attempting to fill in. Additionally, it maintains a list of default settings that are to be applied to each row, but which can be set generically in the top-level element (ggobidata). When we encounter the start of tag, we are given the tag name, the list of attributes for the tag instance and a reference to the parser instance XMLParserData object we specified at the start of the parsing. This handler is startXMLElement. Here, we dispatch a call to the appropriate method based on the tag name. Generally, this either allocates storage space in the ggobid structure being filled in, or stores partial information needed to do this. Additionally, for the tag ggobidata, the attributes are processed to store the default values for record attributes. These are attributes such as color, glyph (size and type). As each tag is encountered, we convert its type to an enumerated type and store this as the pending state. This is used to determine how to interpret ASCII text within an element. When we encounter the end of a tag/element, the routine endXMLElement is called. We use this to increment counters indicating which record, variable or edge is next in the stream. These are quasi-global variables that are parser-instance specific and a necessary consquence of the event-driven style of parsing. Finally, when ASCII text within an XML element is discovered by the parser, the routine characters() is called. We call different routines (setRecordsValues() and setVariableName()) based on the state of the parsing. This was set at the start of each tag/element in startXMLElement. */ #include #include #include #include #include #include "read_xml.h" #include "externs.h" #include "GGobiAPI.h" void setGGobiColorScheme (const xmlChar ** attrs, XMLParserData * data); void startXMLElement (void *user_data, const xmlChar * name, const xmlChar ** attrs); void endXMLElement (void *user_data, const xmlChar * name); void Characters (void *user_data, const xmlChar * ch, gint len); void cumulateRecordData (XMLParserData * data, const xmlChar * ch, gint len); gint getAutoLevelIndex (const char *const label, XMLParserData * data, vartabled * el); static gboolean setRecordValue (const char *tmp, GGobiData * d, XMLParserData * data); void resetRecordInfo (XMLParserData * data); static void releaseCurrentDataInfo (XMLParserData * parserData); /* The different XML element names we recognize in the input format. countervariable is an automatic convenience variable that generates a new variable in the dataset that does not have corresponding entries in the input file. For each record, we generate a value which is the index in the dataset of that record (starting at 1). Along the same lines, we now have randomuniformvariable. This is another automatic variable whose values are generated by the act of reading the dataset. I am not certain that this belongs here. It is not reproducible. It doesn't generalize to different distributions, or even transformations of the U(0, 1) distribution. Perhaps having this feature implemented via a plugin which uses the new_datad event signal to add variables to a dataset. There is a disconnect between what the author of the dataset wants and what the plugin knows. So, having this may well be necessary. One can of course use a scripting language (e.g. R, Python, ...) to create the dataset externall. One can have any number of randomuniformvariable elements in a dataset, which is different from the countervariable. This is implemented by introducing a new variable type (like categorical, real, ...) in the vartyped enumeration in vartable.h. This means that we have to update code to handle this element in the switch statements and this is error-prone. (We can easily overlook some of the switch statements and get odd behavior). We would rather have the vartabled data structure as a class and have methods for it. Switch statements are simply not extensible. For this case, we only have to update vartable_nbook.c. */ const gchar *const xmlDataTagNames[] = { "ggobidata", "data", /* DATASET */ "description", "record", "records", "variables", "variable", "colormap", "color", /* variables */ "realvariable", "categoricalvariable", "integervariable", "countervariable", "randomuniformvariable", "levels", "level", /* color scheme */ "activeColorScheme", /* brushing attributes: color first; later, glyph type and size */ "brush", /* data values */ "real", "int", "string", "na", "quickHelp", "edges", "edge", "" }; GSList * read_xml (InputDescription * desc, ggobid * gg, GGobiPluginInfo * plugin) { return (data_xml_read (desc, gg)); } InputDescription * read_xml_input_description (const char *const fileName, const char *const modeName, ggobid * gg, GGobiPluginInfo * info) { InputDescription *desc; desc = (InputDescription *) g_malloc0 (sizeof (InputDescription)); desc->fileName = g_strdup (fileName); /* * If fileName isn't the name of a readable file, append .xml and * try again -- but only if it doesn't already end in .xml. */ if (file_is_readable (desc->fileName) == false) { gint len = strlen(desc->fileName); if (len-4 > 0 && strcmp(&desc->fileName[len-4], ".xml")) { g_free (desc->fileName); desc->fileName = g_malloc ((strlen (fileName) + 5) * sizeof (gchar)); sprintf (desc->fileName, "%s.xml", fileName); } } desc->mode = isURL (fileName) ? url_data : xml_data; desc->desc_read_input = &read_xml; return (desc); } void ggobi_XML_warning_handler (void *data, const gchar * msg, ...) { va_list ap; xmlParserCtxtPtr p = (xmlParserCtxtPtr) ((XMLParserData *) data)->parser; va_start (ap, msg); fprintf (stderr, "Warning from XML parsing [%d, %d]: ", (int) p->input->line, (int) p->input->col); g_vfprintf (stderr, msg, ap); fflush (stderr); } void ggobi_XML_error_handler (void *data, const gchar * msg, ...) { va_list ap; xmlParserCtxtPtr p = (xmlParserCtxtPtr) ((XMLParserData *) data)->parser; fprintf (stderr, "Error in XML parsing [line %d, column %d]: ", (int) p->input->line, (int) p->input->col); va_start (ap, msg); g_vfprintf (stderr, msg, ap); fflush (stderr); } /* We also need a version that takes a FILE* and reads from it. This is so that we can handle reading from standard input. The DOM style parsing can be initiated very simply. xmlDocPtr doc; doc = xmlParseFile(name); */ GSList * data_xml_read (InputDescription * desc, ggobid * gg) { xmlSAXHandlerPtr xmlParserHandler; xmlParserCtxtPtr ctx = (xmlParserCtxtPtr) g_malloc (sizeof (xmlParserCtxtPtr)); XMLParserData data; gchar *name = g_strdup (desc->fileName); /* find_xml_file(desc->fileName, NULL, gg); */ GSList *dlist; if (name == NULL) return (false); xmlParserHandler = (xmlSAXHandlerPtr) g_malloc0 (sizeof (xmlSAXHandler)); /* Make certain this is initialized so that we don't have any references to unwanted routines! */ xmlParserHandler->startElement = startXMLElement; xmlParserHandler->endElement = endXMLElement; xmlParserHandler->characters = Characters; xmlParserHandler->error = ggobi_XML_error_handler; xmlParserHandler->warning = ggobi_XML_warning_handler; initParserData (&data, xmlParserHandler, gg); ctx = xmlCreateFileParserCtxt (name); if (ctx == NULL) { xml_warning ("File error:", name, "Can't open file ", &data); g_free (name); return (false); } ctx->validate = 1; ctx->userData = &data; data.parser = ctx; data.input = desc; ctx->sax = xmlParserHandler; data.dlist = NULL; xmlParseDocument (ctx); dlist = ((XMLParserData *) (ctx->userData))->dlist; ctx->sax = NULL; xmlFreeParserCtxt (ctx); g_free (xmlParserHandler); g_free (name); #ifdef XXX { GSList *l; GGobiData *d; ok = true; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; /* ok &= (d->ncols > 0 && d->nrows > 0); */ /*-- a simple edge set has no variables --*/ ok &= (d->nrows > 0); } } #endif return (dlist); } void initParserData (XMLParserData * data, xmlSAXHandlerPtr handler, ggobid * gg) { data->gg = gg; data->current_record = 0; data->current_variable = 0; data->current_element = 0; data->current_data = NULL; data->current_color = 0; data->reading_colormap_file_p = false; data->state = UNKNOWN; data->terminateStrings_p = true; data->NA_identifier = NULL; data->idTable = NULL; data->handlers = handler; data->defaults.color = -1; data->defaults.glyphType = sessionOptions->info->glyph.type; data->defaults.glyphSize = sessionOptions->info->glyph.size; data->defaults.edgeWidth = -1; /*-- this has no home in ggobi --*/ data->defaults.hidden = false; /* * I don't think we plan to support this feature, so I'm ifdef'ing * out some buggy code later on in the file. dfs */ data->recordLabelsVariable = -1; data->recordString = NULL; data->recordStringLength = 0; data->autoLevels = NULL; data->idNamesTable = NULL; } void startXMLElement (void *user_data, const xmlChar * name, const xmlChar ** attrs) { XMLParserData *data = (XMLParserData *) user_data; enum xmlDataState type = tagType (name, false); switch (type) { case COLORSCHEME: setGGobiColorScheme (attrs, data); break; case VARIABLES: allocVariables (attrs, data); break; case VARIABLE: case REAL_VARIABLE: case INTEGER_VARIABLE: case CATEGORICAL_VARIABLE: case UNIFORM_VARIABLE: newVariable (attrs, data, name); break; case COUNTER_VARIABLE: newVariable (attrs, data, name); data->counterVariableIndex = data->current_variable; break; case CATEGORICAL_LEVELS: categoricalLevels (attrs, data); break; case CATEGORICAL_LEVEL: setLevelIndex (attrs, data); break; case RECORDS: setDatasetInfo (attrs, data); break; case TOP: setGeneralInfo (attrs, data); break; case EDGE: case RECORD: newRecord (attrs, data); break; case COLORMAP: /*setColorMap(attrs, data); *//* requires some thought ... */ break; case BRUSHSTYLE: setBrushStyle (attrs, data); break; case COLOR: /*setColormapEntry(attrs, data); *//* ditto .... */ break; case DESCRIPTION: /* description text pending */ break; case EDGES: case DATASET: setDataset (attrs, data, type); break; case REAL: case INTEGER: case STRING: case NA: if (data->recordString) { setRecordValues (data, data->recordString, data->recordStringLength, -1); if (type != NA && type != STRING) data->current_element++; resetRecordInfo (data); } break; case QUICK_HELP: break; default: fprintf (stderr, "Unrecognized XML state %s\n", name); fflush (stderr); break; } data->state = type; } void setGGobiColorScheme (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp; tmp = getAttribute (attrs, "file"); if (tmp) { /* process this file to append its color schemes into the global list. */ read_colorscheme ((gchar *) tmp, &data->gg->colorSchemes); } tmp = getAttribute (attrs, "name"); if (tmp) { /* resolve the color scheme by name */ colorschemed *scheme; scheme = findColorSchemeByName (data->gg->colorSchemes, tmp); if (scheme) { data->gg->activeColorScheme = scheme; colorscheme_init (scheme); } else ggobi_XML_error_handler (data, "Invalid colorscheme name %s. No such scheme.\n", tmp); } else { ggobi_XML_error_handler (data, "No colorscheme name specified\n"); } } gint setLevelIndex (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp = getAttribute (attrs, "value"); gint itmp; GGobiData *d = getCurrentXMLData (data); vartabled *el = vartable_element_get(data->current_variable, d); data->current_level++; /*-- current_level here ranges from 0 to nlevels-1 --*/ /*-- dfs: placeholder for proper debugging --*/ if (data->current_level >= el->nlevels) { /*XXX Put in a more terminal error! */ ggobi_XML_error_handler (data, "trouble: adding too many levels to %s\n", ggobi_data_get_col_name(d, data->current_variable)); } /* */ itmp = data->current_level; if (tmp != NULL) { itmp = strToInteger (tmp); if (itmp < 0) g_printerr ("trouble: levels must be >= 0\n"); } el->level_values[data->current_level] = itmp; return (data->current_level); } /* * If the user hasn't supplied level names and values, fill in * default values: Level 0 .... Level (nlevels-1) */ void completeCategoricalLevels (XMLParserData * data) { GGobiData *d = getCurrentXMLData (data); vartabled *el = vartable_element_get (data->current_variable, d); gint min = 1; if (data->current_level == -1) { gint k; if (el->lim_specified_p) min = (gint) el->lim_specified.min; /*-- Alert the user what we're about to do --*/ g_print ("Supplying default level values for \"%s\" ranging from %d:%d\n", ggobi_data_get_col_name(d, data->current_variable), min, min + el->nlevels - 1); for (k = 0; k < el->nlevels; k++) { el->level_values[k] = min + k; if (el->level_names[k]) g_free(el->level_names[k]); el->level_names[k] = g_strdup_printf ("L%d", k + 1); } } } //FIXME: need new vartable function: load from xml void categoricalLevels (const xmlChar ** attrs, XMLParserData * data) { GGobiData *d = getCurrentXMLData (data); vartabled *el = vartable_element_get (data->current_variable, d); gint i; const gchar *tmp = getAttribute (attrs, "count"); if (tmp != NULL) { el->nlevels = strToInteger (tmp); if (el->nlevels > 0) { el->level_values = (gint *) g_malloc (el->nlevels * sizeof (gint)); el->level_counts = (gint *) g_malloc (el->nlevels * sizeof (gint)); el->level_names = (gchar **) g_malloc (el->nlevels * sizeof (gchar *)); for (i = 0; i < el->nlevels; i++) { el->level_counts[i] = 0; el->level_names[i] = NULL; } } else { el->level_values = NULL; el->level_counts = NULL; el->level_names = NULL; } } data->current_level = -1; /* We'll increment the first one. */ if (el->nlevels < 1) { fprintf (stderr, "Levels for %s mis-specified\n", el->collab); fflush (stderr); } } void addLevel (XMLParserData * data, const gchar * c, gint len) { GGobiData *d = getCurrentXMLData (data); vartabled *el = vartable_element_get (data->current_variable, d); gint lev = data->current_level; gchar *val = g_strdup (c); /*XXX check not off by one! If so, probably increment data->current_level. */ if (data->current_level >= el->nlevels) g_printerr ("trouble: adding too many levels to %s\n", el->collab); /* * This is a kludge, I admit, but if a level name includes special * characters (such as &), the string is somehow fed into this * routine in pieces. This section of code glues the separate * pieces back together again. -- dfs */ if (el->level_names[lev]) { gchar *tmp = g_strdup(el->level_names[lev]); g_free(el->level_names[lev]); el->level_names[lev] = g_strdup_printf ("%s%s", tmp, val); g_free(tmp); } else el->level_names[lev] = g_strdup(val); g_free (val); } void resetRecordInfo (XMLParserData * data) { if (data->recordString) g_free (data->recordString); data->recordString = NULL; data->recordStringLength = 0; } void resolveEdgeIds (XMLParserData * parserData) { } void resolveAllEdgeIds (XMLParserData * parserData) { } gint edgecompare (const void *val1, const void *val2) { const SortableEndpoints *e1 = (const SortableEndpoints *) val1; const SortableEndpoints *e2 = (const SortableEndpoints *) val2; gint acomp, bcomp; acomp = strcmp (e1->a, e2->a); bcomp = strcmp (e1->b, e2->b); if (acomp < 0 || (acomp == 0 && bcomp < 0)) return (-1); else if (acomp == 0 && bcomp == 0) return (0); else return (1); } void setEdgePartners (XMLParserData * parserData) { GGobiData *e = getCurrentXMLData (parserData); SortableEndpoints *ep; gint i, k, n; gboolean dups = false; if (e->edge.n <= 0) return; n = 2 * e->edge.n; ep = (SortableEndpoints *) g_malloc (n * sizeof (SortableEndpoints)); /*-- Assume that we have no edges from i to i --*/ /* * Before setting partners, check for duplicate edges. If we find * one, bail out -- we don't handle them correctly, and we don't * want them around. */ for (i = 0, k = 0; i < e->edge.n; i++) { if (e->edge.sym_endpoints[i].a == NULL || e->edge.sym_endpoints[i].b == NULL) { g_critical ("Not as many edges as expected in '%s': Edge %d is missing\n", e->name, i); exit(0); } ep[k].a = g_strdup ((gchar *) e->edge.sym_endpoints[i].a); ep[k].b = g_strdup ((gchar *) e->edge.sym_endpoints[i].b); ep[k].jcase = i; k++; } qsort ((gchar *) ep, e->edge.n, sizeof (SortableEndpoints), edgecompare); for (i = 1; i < e->edge.n; i++) { k = i - 1; if (strcmp (ep[i].a, ep[k].a) == 0 && strcmp (ep[i].b, ep[k].b) == 0) { g_critical ("Found duplicate edge from %s to %s", (gchar *) e->edge.sym_endpoints[ep[i].jcase].a, (gchar *) e->edge.sym_endpoints[ep[i].jcase].b); dups = true; } } if (dups) g_error ("Duplicate edges found"); /*-- If there are no dups, add the reverse of each edge and re-sort --*/ for (i = 0, k = e->edge.n; i < e->edge.n; i++) { ep[k].a = g_strdup ((gchar *) e->edge.sym_endpoints[i].b); ep[k].b = g_strdup ((gchar *) e->edge.sym_endpoints[i].a); ep[k].jcase = i; k++; } qsort ((gchar *) ep, n, sizeof (SortableEndpoints), edgecompare); for (i = 1; i < n; i++) { k = i - 1; if (strcmp (ep[i].a, ep[k].a) == 0 && strcmp (ep[i].b, ep[k].b) == 0) { e->edge.sym_endpoints[ep[i].jcase].jpartner = ep[k].jcase; e->edge.sym_endpoints[ep[k].jcase].jpartner = ep[i].jcase; } } for (i = 0; i < n; i++) { g_free (ep[i].a); g_free (ep[i].b); } g_free (ep); } void endXMLElement (void *user_data, const xmlChar * name) { XMLParserData *data = (XMLParserData *) user_data; enum xmlDataState type = tagType (name, true); switch (type) { case EDGES: resolveEdgeIds (data); case DATASET: { GGobiData *d = getCurrentXMLData (data); if (data->current_record < d->nrows) { g_error ("There are fewer records than declared for '%s': %d < %d.", d->name, data->current_record, d->nrows); } setEdgePartners (data); releaseCurrentDataInfo (data); data->dlist = g_slist_append (data->dlist, d); } break; case EDGE: if (data->current_element < data->current_data->ncols) { ggobi_XML_error_handler (data, "Not enough elements\n"); } data->current_record++; break; case RECORD: /* This processes every element in the record, and it will become confused and complain if we don't feed d->ncols elements to it. I believe it also handles the tag in the case where record elements have been individually tagged, and it does that without confusion. */ setRecordValues (data, data->recordString, data->recordStringLength, -1); data->current_record++; resetRecordInfo (data); break; case NA: ggobi_data_set_missing(getCurrentXMLData(data), data->current_record, data->current_element); data->current_element++; break; case REAL: case INTEGER: case STRING: /* This is the individual setRecordValue(), i.e. with no 's' at the end. */ setRecordValue ((const char *) data->recordString, data->current_data, data); data->current_element++; break; case VARIABLE: case REAL_VARIABLE: case CATEGORICAL_VARIABLE: case COUNTER_VARIABLE: case INTEGER_VARIABLE: case UNIFORM_VARIABLE: data->current_variable++; break; case COLOR: data->current_color++; break; case COLORMAP: break; case CATEGORICAL_LEVELS: completeCategoricalLevels (data); break; case CATEGORICAL_LEVEL: break; case TOP: /* resolve all the edges */ resolveAllEdgeIds (data); break; default: data = NULL; /* just any code so we can stop. */ break; } if (data) { resetRecordInfo (data); data->state = UNKNOWN; } } XmlTagType tagType (const xmlChar * name, gboolean endTag) { gint n = sizeof (xmlDataTagNames) / sizeof (xmlDataTagNames)[0] - 1; gint i; const gchar *tmp = (const gchar *) name; /* if(endTag) { tmp++; } */ for (i = 0; i < n; i++) { if (strcmp (tmp, xmlDataTagNames[i]) == 0) { return ((enum xmlDataState) i); } } return (UNKNOWN); } /* Called when data within an element is found by the parser. Note that the parser does not have to give us all the data in one go (although it usually does). Instead, it can make several calls to this routine for the same element instances. E.g a few words and another sentence may result in two calls - one for each sentence. This is important to handle as it means that we must be prepared to read values within a record across different calls and remember which variable/column we last completed for this record. This is the current_element field in XMLParserData. Additionally, if a variable name is split across multiple calls we must append subsequent calls to the initial value. Additionally, new lines and leading and trailing white space are not removed. Hence, we must do this ourselves. We use skipWhiteSpace to move to first non-whitespace character in the string. Also, the text is given to us as a a sequence of bytes rather than a non-terminated string. Thus, we are told the number of bytes rather than being able to use strlen to compute the length of the string. If the flag terminateStrings is set in the XMLParserData instance, this routine takes care of copying the data into a regularly NULL-terminated string so that the routines to which the data is passed can work with it more easily. */ void Characters (void *user_data, const xmlChar * ch, gint len) { gchar *tmp = NULL; gint dlen = len; const xmlChar *c; XMLParserData *data = (XMLParserData *) user_data; if(data->recordStringLength == 0) { c = (const xmlChar *) skipWhiteSpace (ch, &dlen); } else { c = ch; } if (dlen < 1 || c[0] == '\n') return; if (data->terminateStrings_p) { tmp = g_strndup((gchar *)c, dlen); c = (const xmlChar *) tmp; } switch (data->state) { case NA: case RECORD: case REAL: case STRING: case INTEGER: case UNKNOWN: /* Now we call setRecordValues (data, c, dlen); after gathering the entire string for the record so that we don't get bizarre splits such as "1.3 1.4 1" followed by ".4..." */ cumulateRecordData (data, c, dlen); break; case VARIABLE: case CATEGORICAL_VARIABLE: case REAL_VARIABLE: case UNIFORM_VARIABLE: setVariableName (data, c, dlen); break; case COLOR: break; case CATEGORICAL_LEVEL: addLevel (data, (const gchar *) c, dlen); break; default: break; } if (data->terminateStrings_p) { g_free (tmp); } } const xmlChar * skipWhiteSpace (const xmlChar * ch, gint * len) { const xmlChar *tmp = ch; while (*len >= 0) { if (*len == 0 || (tmp[0] != ' ' && tmp[0] != '\t' && tmp[0] != '\n')) break; tmp++; (*len)--; } return (tmp); } void cumulateRecordData (XMLParserData * data, const xmlChar * ch, gint len) { data->recordString = (xmlChar *) g_realloc (data->recordString, (len + data->recordStringLength + 1) * sizeof (xmlChar)); memcpy (data->recordString + data->recordStringLength, ch, len * sizeof (xmlChar)); data->recordStringLength += len; data->recordString[data->recordStringLength] = '\0'; return; } /** Called in response to a ggobidata tag which contains the different datasets. The count element here is the number of datasets to expect. */ gboolean setGeneralInfo (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp = getAttribute (attrs, "count"); if (tmp != NULL) { data->expectedDatasetCount = strToInteger (tmp); } tmp = getAttribute (attrs, "ids"); return (true); } gboolean setDatasetInfo (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp = getAttribute (attrs, "count"); GGobiData *d = getCurrentXMLData (data); if (tmp == NULL) { g_error ("No count attribute"); } d->nrows = strToInteger (tmp); d->nrows_in_plot = d->nrows; /*-- for now --*/ rowlabels_alloc (d); br_glyph_ids_alloc (d); br_glyph_ids_init (d); d->edge.n = 0; br_color_ids_alloc (d); br_color_ids_init (d); setDefaultDatasetValues (attrs, data); if (tmp) { arrayf_alloc (&d->raw, d->nrows, d->ncols); arrays_alloc (&d->missing, d->nrows, d->ncols); br_hidden_alloc (d); br_hidden_init (d); } data->current_variable = 0; data->current_record = 0; data->current_variable = 0; data->current_element = 0; data->idTable = NULL; return (true); } gboolean setDefaultDatasetValues (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp = getAttribute (attrs, "missingValue"); if (tmp != NULL) { data->NA_identifier = g_strdup (tmp); } setGlyph (attrs, data, -1); setColor (attrs, data, -1); setHidden (attrs, data, -1); return (true); } gint strToInteger (const gchar * tmp) { gint value; value = atoi (tmp); return (value); } const gchar * getAttribute (const xmlChar ** attrs, gchar * name) { const xmlChar **tmp = attrs; while (tmp && tmp[0]) { if (strcmp (name, (const gchar *) tmp[0]) == 0) return ((const gchar *) tmp[1]); tmp += 2; } return (NULL); } gboolean newRecord (const xmlChar ** attrs, XMLParserData * data) { readXMLRecord (attrs, data); return (true); } gboolean setHidden (const xmlChar ** attrs, XMLParserData * data, gint i) { const gchar *tmp; GGobiData *d = getCurrentXMLData (data); tmp = getAttribute (attrs, "hidden"); if (tmp) { gboolean hidden = asLogical (tmp); if (i < 0) { data->defaults.hidden = hidden; } else d->hidden.els[i] = d->hidden_now.els[i] = d->hidden_prev.els[i] = hidden; } return (tmp != NULL); } gboolean asLogical (const gchar * sval) { guint i; gboolean val = false; const gchar *const trues[] = { "T", "true", "True", "1" }; for (i = 0; i < sizeof (trues) / sizeof (trues[0]); i++) { if (strcmp (sval, trues[i]) == 0) return (true); } return (val); } gboolean setColor (const xmlChar ** attrs, XMLParserData * data, gint i) { const gchar *tmp; gint value = data->defaults.color; GGobiData *d = getCurrentXMLData (data); colorschemed *scheme = data->gg->activeColorScheme; tmp = getAttribute (attrs, "color"); if (tmp) { value = strToInteger (tmp); } /* * this is testing against MAXNCOLORS, but it should test against the * current scheme */ /*if(value < 0 || value > MAXNCOLORS) { */ if (value < 0 || value >= scheme->n) { if (tmp) xml_warning ("color", tmp, "Out of range", data); } else { if (i < 0) data->defaults.color = value; else d->color.els[i] = d->color_now.els[i] = d->color_prev.els[i] = value; } return (value != -1); } gboolean setGlyph (const xmlChar ** attrs, XMLParserData * data, gint i) { const gchar *tmp; gint value; GGobiData *d = getCurrentXMLData (data); /* * glyphSize 0:7 */ value = data->defaults.glyphSize; tmp = getAttribute (attrs, "glyphSize"); if (tmp) { value = strToInteger (tmp); } if (value < 0 || value >= NGLYPHSIZES) { if (tmp) xml_warning ("glyphSize", tmp, "Out of range", data); } else { if (i < 0) { data->defaults.glyphSize = value; } else { /* * note that even if defaults.glyphSize was set below, during * the 'glyph' section, the values for record i are assigned here. */ d->glyph.els[i].size = d->glyph_now.els[i].size = d->glyph_prev.els[i].size = value; } } /* * glyphType 0:6 */ value = data->defaults.glyphType; tmp = getAttribute (attrs, "glyphType"); if (tmp) { /* * make sure this attribute is an integer; if someone puts a * string here, like "plus" or "fc", value = 0 and the mistake * isn't caught later when value is tested. */ value = mapGlyphName (tmp); if (value == UNKNOWN_GLYPH) { if (tmp[0] < '0' || tmp[0] > '6') { g_error ("%s is an illegal value for glyphType; it must be on [0,6]", tmp); } value = strToInteger (tmp); } } if (value < 0 || value >= NGLYPHTYPES) { if (tmp) xml_warning ("glyphType", tmp, "Out of range", data); } else { if (i < 0) { data->defaults.glyphType = value; } else { /* * note that even if defaults.glyphType was set below, during * the 'glyph' section, the values for record i are assigned here. */ d->glyph.els[i].type = d->glyph_now.els[i].type = d->glyph_prev.els[i].type = value; } } /* * glyph: strings like "plus 3" or "." */ tmp = getAttribute (attrs, "glyph"); if (tmp != NULL) { const gchar *next; gint j; next = tmp; next = strtok ((gchar *) tmp, " "); j = 0; while (next) { if (j == 0) { /* type */ value = mapGlyphName (next); if (i < 0) { data->defaults.glyphType = value; } else { d->glyph.els[i].type = d->glyph_now.els[i].type = d->glyph_prev.els[i].type = value; } } else { /* size */ value = strToInteger (next); if (i < 0) { if (value >= 0 && value < NGLYPHTYPES) { data->defaults.glyphSize = value; } else { xml_warning ("File error:", next, "glyph improperly specified", data); } } else { d->glyph.els[i].size = d->glyph_now.els[i].size = d->glyph_prev.els[i].size = value; } } j++; next = strtok (NULL, " "); } } return (value != -1); } void xml_warning (const gchar * attribute, const gchar * value, const gchar * msg, XMLParserData * data) { g_printerr ("Incorrect data (record %d)\n", data->current_record); g_printerr ("\t%s %s: value = %s\n", attribute, msg, value); } static vartabled * applyRandomUniforms (GGobiData * d, XMLParserData * data) { vartabled *vt = NULL; while (data->current_element < d->raw.ncols && (vt = vartable_element_get (data->current_element, d)) && vt->vartype == uniform) { d->raw.vals[data->current_record][data->current_element] = randvalue (); vt = vartable_element_get (++(data->current_element), d); } return (vt); } static gboolean setRecordValue (const char *tmp, GGobiData * d, XMLParserData * data) { gdouble value; vartabled *vt; /* If we have a counter variable in this dataset, check whether the cursor is at that. */ if (data->counterVariableIndex > -1 && data->current_element == data->counterVariableIndex) { d->raw.vals[data->current_record][data->current_element] = data->current_record + 1; data->current_element++; } /* If reading past the last column or row, stop */ if (data->current_record >= d->raw.nrows || data->current_element >= d->raw.ncols) { g_printerr ("Row %d (counting from 1) has too many elements\n", data->current_record + 1); data->current_element = 0; return (false); } /* vt = vartable_element_get (data->current_element, d); */ vt = applyRandomUniforms (d, data); if (!vt) return (true); /* * this is a missing value if * 1. the file does not specify a string and this string is either * "na", "NA", or ".", or * 2. the file specifies a string for NA and this is that string */ if ((data->NA_identifier == NULL && (strcmp (tmp, "na") == 0 || strcmp (tmp, "NA") == 0 || strcmp (tmp, ".") == 0)) || (data->NA_identifier && strcmp (tmp, data->NA_identifier) == 0)) { ggobi_data_set_missing(d, data->current_record, data->current_element); } else { value = asNumber (tmp); if (vt->vartype == categorical) { if (data->autoLevels && data->autoLevels[data->current_element]) { value = getAutoLevelIndex (tmp, data, vt); vt->level_counts[(gint) value]++; } else { gint level = checkLevelValue (vt, value); if (level == -1) { ggobi_XML_error_handler (data, "incorrect level in record %d, variable `%s', dataset `%s' in the XML input file\n", (int) data->current_record + 1, vt->collab, data->current_data->name ? data-> current_data->name : ""); } else { vt->level_counts[level]++; } } } else if (data->state == STRING) { ggobi_XML_error_handler (data, " element for non categorical variable (%s) in record %d\n", vt->collab, (int) data->current_record + 1); value = 0; } d->raw.vals[data->current_record][data->current_element] = value; } /* If the dataset is using one of the variables as the row labels, then resolve the name. */ /* * I don't think we plan to support this, and it's buggy to boot -- dfs */ #if RECORD_LABELS_VARIABLE if (data->recordLabelsVariable == data->current_element) { gchar *tmp1; /* If this is a categorical, look up the level id. */ gchar buf[100]; if (ggobi_data_is_missing(d, data->current_record, data->current_element)) { /* sprintf(buf, "%s", "NA"); */ tmp1 = g_strdup ("NA"); } else { if (vt && vt->vartype == categorical) { /* To be correct, we need to match the level_values and find the corresponding entry. */ tmp1 = g_strchomp((gchar *) GGobi_getLevelName (vt, value)); if (tmp1) tmp1 = g_strdup (tmp1); } else { sprintf (buf, "%f", value); tmp1 = g_strdup (buf); } } g_array_insert_val (d->rowlab, data->current_record, tmp1); g_free (tmp1); } #endif return (true); } /* Read the values for this record from free-formatted text. The entries are white-space delimited. They should not have quotes or anything that needs to be escaped. */ gboolean setRecordValues (XMLParserData * data, const xmlChar * line, gint len, gint ncols) { const gchar *tmp; GGobiData *d = getCurrentXMLData (data); if (ncols == -1) { ncols = d->ncols; } if (!line) { applyRandomUniforms (d, data); return (false); } tmp = strtok ((gchar *) line, " \t\n"); while (tmp && (tmp < (gchar *) (line + len))) { /* g_printerr("current element %d token %s\n", data->current_element, tmp); */ if (setRecordValue (tmp, d, data) == false) return (false); data->current_element++; tmp = strtok (NULL, " \t\n"); /* printf("%d %d \n",data->current_record,ncols); */ } if (data->current_element < ncols) { ggobi_XML_error_handler (data, "Not enough elements\n"); /* printf("%d %d \n",data->current_record,data->current_element); */ /* g_printerr ("Record %d has insufficient elements: %d < %d\n", data->current_record, data->current_element, d->ncols); */ } applyRandomUniforms (d, data); return (true); } /* Convert the specified string to a numeric value. This is now done in a locale-insensitive way, so all input that uses this function needs to use the C locale (ie decimal points are '.') */ gdouble asNumber (const char *sval) { return (g_ascii_strtod (sval, NULL)); } /* Read the declaration of a variable, gathering its information from the specified attributes. This includes its name, transformation name, etc. Called in response to a , or tag. */ gboolean newVariable (const xmlChar ** attrs, XMLParserData * data, const xmlChar * tagName) { const gchar *tmp, *tmp1; GGobiData *d = getCurrentXMLData (data); vartabled *el; if (data->current_variable >= d->ncols) { g_printerr ("Too many variables (%d) given number given in the element for dataset %s\n", data->current_variable, d->raw.ncols, d->name); return (false); } el = vartable_element_get (data->current_variable, d); data->variable_transform_name_as_attribute = false; tmp = getAttribute (attrs, "name"); ggobi_data_set_col_name(d, data->current_variable, (gchar*) tmp); tmp = getAttribute (attrs, "nickname"); if (tmp != NULL) el->nickname = g_strdup (tmp); /* * I don't think we plan to support this, so I'm ifdef-ing out * some buggy code elsewhere in the file -- dfs */ #if RECORD_LABELS_VARIABLE tmp = getAttribute (attrs, "recordLabel"); if (tmp != NULL) { data->recordLabelsVariable = data->current_variable; } #endif tmp = getAttribute (attrs, "min"); tmp1 = getAttribute (attrs, "max"); if (tmp && tmp1) { gdouble mn, mx; mn = asNumber (tmp); mx = asNumber (tmp1); el->lim_specified.min = mn < mx ? mn : mx; el->lim_specified.max = mn > mx ? mn : mx; /* ? */ el->lim_specified_tform.min = el->lim_specified.min; el->lim_specified_tform.max = el->lim_specified.max; if (mn > mx) { g_printerr ("Minimum is greater than maximum for variable %s\n", el->collab); } el->lim_specified_p = true; } if (strcmp ((const char *) tagName, "categoricalvariable") == 0) { el->vartype = categorical; /* Mark this as being a variable for which we must compute the levels. */ if ((tmp = getAttribute (attrs, "levels")) && strcmp (tmp, "auto") == 0) { if (data->autoLevels == NULL) { data->autoLevels = (GHashTable **) g_malloc0 (sizeof (GHashTable *) * data->current_data->ncols); } /* glib-2.0 provides a g_hash_table_new_full with which we can specify the `free' routine for elements. This should simplify (slightly) releaseCurrentDataInfo(). */ data->autoLevels[data->current_variable] = g_hash_table_new (g_str_hash, g_str_equal); } } else if (strcmp ((const char *) tagName, "integervariable") == 0) { el->vartype = integer; } else if (strcmp ((const char *) tagName, "countervariable") == 0) { el->vartype = counter; } else if (strcmp ((const char *) tagName, "randomuniformvariable") == 0) { el->vartype = uniform; } /* real by default */ tmp = getAttribute (attrs, "time"); if (tmp && (strcmp (tmp, "yes") == 0 || strcmp (tmp, "true") == 0)) { el->isTime = true; } return (true); } /* Reads the number of variables in the dataset from the attributes and allocates space for them in the ggobid structure. At this point, we have the number of records and variables and can initialize the data areas of the ggobid structure. Called in response to a tag. (Note the plural.) */ gboolean allocVariables (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp = getAttribute (attrs, "count"); GGobiData *d = getCurrentXMLData (data); if (tmp == NULL) { g_error ("No count for variables attribute\n"); } d->ncols = strToInteger (tmp); /* The following is unlikely to happen as we have not got the count of the number of rows at this stage. But we leave it here just in case there are datasets for which the input gives the count in the top-level tag. */ if (d->nrows > 0 && d->ncols > 0) { arrayf_alloc (&d->raw, d->nrows, d->ncols); arrays_alloc (&d->missing, d->nrows, d->ncols); br_hidden_alloc (d); } vartable_alloc (d); vartable_init (d); return (true); } /* Reads the text in name and assigns it as the name of the variable currently being read within the tag. The index for the variable is stored in data->current_variable. Called when parsing free-formatted text within a tag. */ gboolean setVariableName (XMLParserData * data, const xmlChar * name, gint len) { gchar *tmp = (gchar *) g_malloc (sizeof (gchar) * (len + 1)); GGobiData *d = getCurrentXMLData (data); vartabled *el = vartable_element_get (data->current_variable, d); gchar *lbl = g_strdup_printf ("Var %d", data->current_variable); tmp[len] = '\0'; memcpy (tmp, name, len); /* Handle the case where we have multiple calls to the characters handler for the same variable because the data is split */ if (el->collab != NULL) { /* need to append tmp to the existing value. */ } el->collab = tmp; /* Note that if we do have multiple calls to this for the same variable then we cannot handle the case where the user does not specify the transformation variable unless we use a flag in XMLParserData. This is variable_transform_name_as_attribute. */ /* problem: this is never NULL, it's either 'Var n' or something specified */ /*if (el->collab_tform == NULL) { */ if (strcmp (el->collab_tform, lbl) == 0) { el->collab_tform = g_strdup (tmp); } g_free (lbl); g_free (tmp); return (true); } /*----------------------------------------------------------------------*/ /* Prints the attributes. For debugging. */ void showAttributes (const xmlChar ** attrs) { const xmlChar **tmp; tmp = attrs; while (tmp && tmp[0]) { g_printerr ("\t %s=%s\n", tmp[0], tmp[1]); tmp += 2; } } void freeLevelHashEntry (gpointer key, gpointer value, gpointer data) { g_free (value); if (data) g_free (key); } static void releaseCurrentDataInfo (XMLParserData * parserData) { if (!parserData->current_data) return; /* if(parserData->idTable && parserData->usesStringIds == false) { g_hash_table_foreach(parserData->idTable, (GHFunc) freeLevelHashEntry, parserData); g_hash_table_destroy(parserData->idTable); } */ if (parserData->autoLevels) { int i; for (i = 0; i < parserData->current_data->ncols; i++) { if (parserData->autoLevels[i]) { /* don't free the keys (so pass NULL as third argument) since these are used in the level_names array. */ g_hash_table_foreach (parserData->autoLevels[i], (GHFunc) freeLevelHashEntry, NULL); g_hash_table_destroy (parserData->autoLevels[i]); } } parserData->autoLevels = NULL; } } gboolean setDataset (const xmlChar ** attrs, XMLParserData * parserData, enum xmlDataState type) { GGobiData *data = ggobi_data_new (0, 0); const gchar *name, *nickname; name = getAttribute (attrs, "name"); nickname = getAttribute (attrs, "nickname"); ggobi_data_set_name(data, (gchar *) name, (gchar *) nickname); parserData->current_data = data; parserData->counterVariableIndex = -1; if (type == EDGES) { setDatasetInfo (attrs, parserData); } return (true); } GGobiData * getCurrentXMLData (XMLParserData * parserData) { GGobiData *data = parserData->current_data; if (data == NULL) { data = ggobi_data_new (0, 0); parserData->current_data = data; } if (data->input == NULL) data->input = parserData->input; return (data); } void setEdge (gint start, gint end, gint i, GGobiData * d) { /*-- if encountering the first edge, allocate endpoints array --*/ if (d->edge.n == 0) edges_alloc (d->nrows, d); } gboolean readXMLRecord (const xmlChar ** attrs, XMLParserData * data) { GGobiData *d = getCurrentXMLData (data); const gchar *tmp; gchar *stmp; gint i = data->current_record; if (i == d->nrows) { g_error ("There are more records than declared for '%s'; exiting.", d->name); } data->current_element = 0; tmp = getAttribute (attrs, "label"); if (!tmp) { if (data->recordLabelsVariable > -1) { /* Wait until we have read the specific values! */ } else { /* Length is to hold the current record number as a string. */ stmp = g_malloc (sizeof (gchar) * 10); g_snprintf (stmp, 9, "%d", i); } } else stmp = g_strdup (tmp); g_array_insert_val (d->rowlab, data->current_record, stmp); setColor (attrs, data, i); setGlyph (attrs, data, i); setHidden (attrs, data, i); /* * Probably something's missing here: if any record has an * id, then does every record need one? I think so. -- dfs */ tmp = getAttribute (attrs, "id"); if (tmp) { guint *ptr; /*int value; */ gchar *dupTmp; /* No need to check since this will either be the first and hence NULL or already created, so can use an else for this condition. */ if (data->idTable == NULL) { data->idTable = g_hash_table_new (g_str_hash, g_str_equal); d->idTable = data->idTable; d->rowIds = (gchar **) g_malloc0 (sizeof (gchar *) * d->nrows); } else { if (g_hash_table_lookup (data->idTable, tmp)) ggobi_XML_error_handler (data, "duplicated id in record %d of dataset %s\n", data->current_record + 1, data->current_data->name); } ptr = (guint *) g_malloc (sizeof (guint)); ptr[0] = i; g_hash_table_insert (data->idTable, dupTmp = intern (data, tmp), ptr); d->rowIds[i] = dupTmp; } /* * Probably something's missing here: if edges should be * present, then every record should have a source and an * endpoint, and there's no validation going on now. --dfs */ /* Read the edge source and destination pair if, present. */ tmp = getAttribute (attrs, "source"); if (tmp != (const gchar *) NULL) { const gchar *dest; dest = getAttribute (attrs, "destination"); if (!dest) { xml_warning ("edge specification error:", tmp, "source but no destination attribute for record.", data); return (true); } if (strcmp (tmp, dest) == 0) { xml_warning ("edge specification error:", tmp, "source is the same as destination for record.", data); return (true); } if (d->edge.sym_endpoints == NULL) { d->edge.n = d->nrows; d->edge.sym_endpoints = (SymbolicEndpoints *) g_malloc (sizeof (SymbolicEndpoints) * d->edge.n); } d->edge.sym_endpoints[data->current_record].a = intern (data, tmp); d->edge.sym_endpoints[data->current_record].b = intern (data, dest); d->edge.sym_endpoints[data->current_record].jpartner = -1; } return (true); } gchar * intern (XMLParserData * data, const char *el) { gchar *ans; if (data->idNamesTable == NULL) { data->idNamesTable = g_hash_table_new (g_str_hash, g_str_equal); } ans = g_hash_table_lookup (data->idNamesTable, el); if (!ans) { ans = g_strdup (el); g_hash_table_insert (data->idNamesTable, ans, ans); } return (ans); } gboolean setBrushStyle (const xmlChar ** attrs, XMLParserData * data) { const gchar *tmp; gint value; gboolean retval = true; tmp = getAttribute (attrs, "color"); if (tmp != NULL) { colorschemed *scheme = data->gg->activeColorScheme; value = strToInteger (tmp); if (value >= 0 && value < scheme->n) { data->gg->color_id = value; } else { xml_warning ("File error:", tmp, "brushing color improperly specified", data); return false; } } /* * glyphType 0:6 */ tmp = getAttribute (attrs, "glyphType"); if (tmp != NULL) { /* * make sure this attribute is an integer; if someone puts a * string here, like "plus" or "fc", value = 0 and the mistake * isn't caught later when value is tested. */ if (tmp[0] < '0' || tmp[0] > '6') { xml_warning ("brushing glyphType", tmp, "Must be on [0,6]\n", data); return false; } value = mapGlyphName (tmp); if (value == UNKNOWN_GLYPH) value = strToInteger (tmp); if (value < 0 || value >= NGLYPHTYPES) { xml_warning ("glyphType", tmp, "Out of range", data); return false; } else { data->gg->glyph_id.type = value; } } /* * glyphSize 0:7 */ tmp = getAttribute (attrs, "glyphSize"); if (tmp != NULL) { value = strToInteger (tmp); if (value < 0 || value >= NGLYPHSIZES) { xml_warning ("glyphSize", tmp, "Out of range", data); } else { data->gg->glyph_id.size = value; } } tmp = getAttribute (attrs, "glyph"); if (tmp != NULL) { const gchar *next; gint j; next = tmp; next = strtok ((gchar *) tmp, " "); j = 0; while (next) { if (j == 0) { /* type */ value = mapGlyphName (next); data->gg->glyph_id.type = value; } else { /* size */ value = strToInteger (next); if (value >= 0 && value < NGLYPHTYPES) { data->gg->glyph_id.size = value; } else { xml_warning ("File error:", next, "brushing glyph improperly specified", data); retval = false; } } j++; next = strtok (NULL, " "); } } return retval; } gint getAutoLevelIndex (const char *const label, XMLParserData * data, vartabled * el) { GHashTable *tbl = data->autoLevels[data->current_element]; gpointer val; gint index = -1; gint i; val = g_hash_table_lookup (tbl, (gconstpointer) label); if (!val) { gint *itmp; gint n = el->nlevels + 1; if (n == 1) { el->level_values = (gint *) g_malloc (sizeof (gint) * n); el->level_counts = (gint *) g_malloc (sizeof (gint) * n); el->level_names = (gchar **) g_malloc (sizeof (gchar *) * n); for (i = 0; i < el->nlevels; i++) el->level_counts[i] = 0; } else { el->level_values = (gint *) g_realloc (el->level_values, sizeof (gint) * n); el->level_counts = (gint *) g_realloc (el->level_counts, sizeof (gint) * n); el->level_names = (gchar **) g_realloc (el->level_names, sizeof (gchar *) * n); } el->level_counts[n - 1] = 0; el->level_values[n - 1] = n - 1; el->level_names[n - 1] = g_strdup (label); itmp = (gint *) g_malloc (sizeof (gint)); *itmp = index = n - 1; g_hash_table_insert (tbl, el->level_names[n - 1], itmp); el->nlevels++; } else index = *((gint *) val); return (index); } /* Routines for walking the hash table and getting all the row labels into an array. */ static void getLabel (gpointer key, gpointer val, gchar ** labels) { if (val) { labels[*(guint *) val] = (gchar *) key; } } gchar ** getRowLabsFromTable (GHashTable * tbl, gchar ** names) { if (!names) names = (gchar **) g_malloc (sizeof (gchar *) * g_hash_table_size (tbl)); g_hash_table_foreach (tbl, (GHFunc) getLabel, names); return (names); } gboolean isXMLFile (const gchar * fileName, ggobid * gg, GGobiPluginInfo * info) { FILE *f; gint c; gchar *tmp; if (isURL (fileName)) return (true); tmp = strrchr (fileName, '.'); if (!tmp) { gchar buf[256]; sprintf (buf, "%s.xml", fileName); if (isXMLFile (buf, gg, info)) return (true); } if (tmp && (strcmp (tmp, ".xmlz") == 0 || strcmp (tmp, ".gz") == 0)) { /* desc->canVerify = false; */ return (true); } f = fopen (fileName, "r"); if (f == NULL) return (false); /* desc->canVerify = true; */ while ((c = getc (f)) != EOF) { if (c == ' ' || c == '\t' || c == '\n') continue; if (c == '<') { gchar buf[10]; if (fgets (buf, 5, f) == NULL) return (false); fclose (f); if (strcmp (buf, "?xml") == 0) { return (true); } else return (false); } } return (false); } ggobi-2.1.12/src/config.h.in0000644000175000017500000000712514651530034011165 /* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Location of GGobi data installation */ #undef GGOBI_DATADIR /* Location of locale files */ #undef GGOBI_LOCALEDIR /* Date of GGobi's release */ #undef GGOBI_RELEASE_DATE /* Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if your system has a GNU libc compatible 'malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the 'memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the 'pow' function. */ #undef HAVE_POW /* Define to 1 if you have the 'sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the 'strchr' function. */ #undef HAVE_STRCHR /* 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 'strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the 'strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type '_Bool'. */ #undef HAVE__BOOL /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* The major x.*.* version */ #undef MAJOR_VERSION /* The micro *.*.x version */ #undef MICRO_VERSION /* The minor *.x.* version */ #undef MINOR_VERSION /* 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 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 empty if 'const' does not conform to ANSI C. */ #undef const /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc ggobi-2.1.12/src/brush_link.c0000644000175000017500000004665014651527764011474 /* brush_link.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" /*----------------------------------------------------------------------*/ /* Linking to other datad's by id */ /*----------------------------------------------------------------------*/ gboolean symbol_link_by_id (gboolean persistentp, gint k, GGobiData * sd, ggobid * gg) { /*-- sd = source_d --*/ GGobiData *d; GSList *l; gint i, id = -1; /*-- this is the cpanel for the display being brushed --*/ cpaneld *cpanel = &gg->current_display->cpanel; gboolean changed = false; /*-- k is the row number in source_d --*/ if (sd->rowIds) { gpointer ptr; if (sd->rowIds[k]) { ptr = g_hash_table_lookup (sd->idTable, sd->rowIds[k]); if (ptr) id = *((guint *) ptr); } else { /* * I've only seen one thing that causes this, and that was in * an xml file with two datad's, nodes and edges, but in which * the edge data mistakenly duplicated the record ids of the * node data. I removed those record ids, and the file was * fine. -- Debby */ g_printerr ("rowIds[%d] is null\n", k); } } if (id < 0) /*-- this would indicate a bug --*/ /**/ return false; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (d == sd) continue; /*-- skip the originating datad --*/ i = -1; if (sd->rowIds && d->idTable) { gpointer ptr = g_hash_table_lookup (d->idTable, sd->rowIds[id]); if (ptr) { i = *((guint *) ptr); } } if (i < 0) /*-- then no cases in d have this id --*/ continue; /*-- if we get here, d has one case with the indicated id --*/ changed = true; if (d->sampled.els[i] && !d->excluded.els[i]) { if (persistentp || cpanel->br.mode == BR_PERSISTENT) { /* * make it link for everything, no matter * what kind of brushing is turned on, because * otherwise, connections between points and edges * gets messed up. */ if (!d->hidden_now.els[i]) { d->color.els[i] = d->color_now.els[i] = sd->color.els[k]; d->glyph.els[i].size = d->glyph_now.els[i].size = sd->glyph.els[k].size; d->glyph.els[i].type = d->glyph_now.els[i].type = sd->glyph.els[k].type; } d->hidden.els[i] = d->hidden_now.els[i] = sd->hidden.els[k]; /*-- should we handle this here? --*/ d->excluded.els[i] = sd->excluded.els[k]; } else if (cpanel->br.mode == BR_TRANSIENT) { if (!d->hidden_now.els[i]) { d->color_now.els[i] = sd->color_now.els[k]; d->glyph_now.els[i].size = sd->glyph_now.els[k].size; d->glyph_now.els[i].type = sd->glyph_now.els[k].type; } d->hidden_now.els[i] = sd->hidden_now.els[k]; } } } return changed; } gboolean exclude_link_by_id (gint k, GGobiData * sd, ggobid * gg) { /*-- sd = source_d --*/ GGobiData *d; GSList *l; gint i, id = -1; gboolean changed = false; /*-- k is the row number in source_d --*/ if (sd->rowIds) { gpointer ptr = g_hash_table_lookup (sd->idTable, sd->rowIds[k]); if (ptr) id = *((guint *) ptr); } if (id < 0) /*-- this would indicate a bug --*/ /**/ return false; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (d == sd) continue; /*-- skip the originating datad --*/ i = -1; if (sd->rowIds && d->idTable) { gpointer ptr = g_hash_table_lookup (d->idTable, sd->rowIds[id]); if (ptr) { i = *((guint *) ptr); } } if (i < 0) /*-- then no cases in d have this id --*/ continue; /*-- if we get here, d has one case with the indicated id --*/ changed = true; if (d->sampled.els[i]) d->excluded.els[i] = sd->excluded.els[k]; } return changed; } /*----------------------------------------------------------------------*/ /* Linking within and between datad's using a categorical variable */ /*----------------------------------------------------------------------*/ void brush_link_by_var (gint jlinkby, vector_b * levelv, cpaneld * cpanel, GGobiData * d, ggobid * gg) { gint m, i, level_value; /* * for this datad, loop once over all rows in plot */ for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; level_value = (gint) d->raw.vals[i][jlinkby]; if (levelv->els[level_value]) { /*-- if it's to acquire the new symbol --*/ if (cpanel->br.mode == BR_PERSISTENT) { switch (cpanel->br.point_targets) { case br_candg: /*-- color and glyph, type and size --*/ d->color.els[i] = d->color_now.els[i] = gg->color_id; d->glyph.els[i].size = d->glyph_now.els[i].size = gg->glyph_id.size; d->glyph.els[i].type = d->glyph_now.els[i].type = gg->glyph_id.type; break; case br_color: /*-- color only --*/ d->color.els[i] = d->color_now.els[i] = gg->color_id; break; case br_glyph: /*-- glyph type and size --*/ d->glyph.els[i].size = d->glyph_now.els[i].size = gg->glyph_id.size; d->glyph.els[i].type = d->glyph_now.els[i].type = gg->glyph_id.type; break; case br_shadow: /*-- shadowed, hidden --*/ d->hidden.els[i] = d->hidden_now.els[i] = true; break; /* case br_unshadow: d->hidden.els[i] = d->hidden_now.els[i] = false; break; */ default: break; } } else if (cpanel->br.mode == BR_TRANSIENT) { switch (cpanel->br.point_targets) { case br_candg: d->color_now.els[i] = gg->color_id; d->glyph_now.els[i].size = gg->glyph_id.size; d->glyph_now.els[i].type = gg->glyph_id.type; break; case br_color: d->color_now.els[i] = gg->color_id; break; case br_glyph: /*-- glyph type and size --*/ d->glyph_now.els[i].size = gg->glyph_id.size; d->glyph_now.els[i].type = gg->glyph_id.type; break; case br_shadow: /*-- hidden --*/ d->hidden_now.els[i] = true; break; /* case br_unshadow: d->hidden_now.els[i] = false; break; */ default: break; } } } else { /*-- if it's to revert to the previous symbol --*/ /*-- should only matter if transient, right? --*/ switch (cpanel->br.point_targets) { case br_candg: d->color_now.els[i] = d->color.els[i]; d->glyph_now.els[i].size = d->glyph.els[i].size; d->glyph_now.els[i].type = d->glyph.els[i].type; break; case br_color: d->color_now.els[i] = d->color.els[i]; break; case br_glyph: /*-- glyph type and size --*/ d->glyph_now.els[i].size = d->glyph.els[i].size; d->glyph_now.els[i].type = d->glyph.els[i].type; break; case br_shadow: /*-- hidden --*/ d->hidden_now.els[i] = d->hidden.els[i]; break; /* disabled case br_unshadow: d->hidden_now.els[i] = d->hidden.els[i]; break; */ default: break; } } } } /* * We're working too hard here, looping whether there's any * change or not. Maybe there's an easy way to set the value * of changed by keeping track of pts_under_brush_prev? */ gboolean build_symbol_vectors_by_var (cpaneld * cpanel, GGobiData * d, ggobid * gg) { gint i, m, level_value, level_value_max; vector_b levelv; gint jlinkby; /*-- for other datad's --*/ GSList *l; GGobiData *dd; gboolean changed = false; gint k, jlinkdd; if (d->linkvar_vt == NULL) return false; jlinkby = g_slist_index (d->vartable, d->linkvar_vt); /* * I may not want to allocate and free this guy every time the * brush moves. */ level_value_max = d->linkvar_vt->nlevels; for (i = 0; i < d->linkvar_vt->nlevels; i++) { level_value = d->linkvar_vt->level_values[i]; if (level_value > level_value_max) level_value_max = level_value; } vectorb_init_null (&levelv); vectorb_alloc (&levelv, level_value_max + 1); vectorb_zero (&levelv); /*-- find the levels which are among the points under the brush --*/ for (m = 0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; if (d->pts_under_brush.els[i]) { level_value = (gint) d->raw.vals[i][jlinkby]; levelv.els[level_value] = true; } } /*-- first do this d --*/ brush_link_by_var (jlinkby, &levelv, cpanel, d, gg); /*-- now for the rest of them --*/ for (l = gg->d; l; l = l->next) { dd = l->data; if (dd != d) { /* If the linking variable exists in the other datad ... */ jlinkdd = vartable_index_get_by_name(d->linkvar_vt->collab, dd); if (jlinkdd != -1) { /* The level values in dd might not be the same as the level values in the d */ vartabled *vtdd = vartable_element_get (jlinkdd, dd); vector_b levelv_dd; level_value_max = vtdd->nlevels; for (i = 0; i < vtdd->nlevels; i++) { level_value = vtdd->level_values[i]; if (level_value > level_value_max) level_value_max = level_value; } vectorb_init_null (&levelv_dd); vectorb_alloc (&levelv_dd, level_value_max + 1); vectorb_zero (&levelv_dd); for (i=0; ilinkvar_vt->nlevels; i++) { if (levelv.els[ d->linkvar_vt->level_values[i] ] == true) { for (k=0; knlevels; k++) { if (strcmp(vtdd->level_names[k], d->linkvar_vt->level_names[i]) == 0) { levelv_dd.els[ vtdd->level_values[k] ] = true; break; } } } } brush_link_by_var (jlinkdd, &levelv_dd, cpanel, dd, gg); vectorb_free (&levelv_dd); } } } vectorb_free (&levelv); changed = true; return (changed); } /*********************************************************************/ /* Create a variable notebook for brush linking rule */ /*********************************************************************/ enum { LINKBYLIST_NAME, LINKBYLIST_VT, LINKBYLIST_NCOLS }; void linkby_notebook_subwindow_add (GGobiData * d, GtkWidget * notebook, ggobid *); //FIXME: replace vt with index (see callback), also need is_categorical_variable void varlist_append (GtkListStore * list, vartabled * vt) { gchar *row; GtkTreeIter iter; if (vt && vt->vartype == categorical) { gtk_list_store_append (list, &iter); row = g_strdup (vt->collab); gtk_list_store_set (list, &iter, LINKBYLIST_NAME, row, LINKBYLIST_VT, vt, -1); g_free (row); } } void varlist_populate (GtkListStore * list, GGobiData * d) { gint j; GtkTreeIter first; vartabled *vt; gtk_list_store_append (list, &first); gtk_list_store_set (list, &first, LINKBYLIST_NAME, "Case ID", -1); for (j = 0; j < d->ncols; j++) { vt = vartable_element_get (j, d); varlist_append (list, vt); } } /* In this routine, we could show two pages if appropriate, one * for points and one for edges. */ /* called from cpanel_brush_set */ void linkby_current_page_set (displayd * display, GtkWidget * notebook, ggobid * gg) { GtkWidget *swin, *treeview; GGobiData *d = display->d, *paged; gint page_num; cpaneld *cpanel = &display->cpanel; GList *children; if (notebook == NULL) { return; } /* * For each page of the notebook, get its child, the scrolled * window. Get the datad that the scrolled window knows about, * and compare it with display->d */ page_num = 0; swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page_num); while (swin) { paged = (GGobiData *) g_object_get_data (G_OBJECT (swin), "datad"); gtk_widget_set_sensitive (swin, (paged == d)); if (paged == d) { gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), page_num); children = gtk_container_get_children (GTK_CONTAINER (swin)); treeview = children->data; /* Set the selected row of the selected page */ select_tree_view_row (treeview, cpanel->br.linkby_row); gg->linkby_cv = (cpanel->br.linkby_row > 0); break; } page_num += 1; swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page_num); } } void linking_method_set_cb (GtkTreeSelection * treesel, ggobid * gg) { GGobiData *d = g_object_get_data (G_OBJECT (gtk_tree_selection_get_tree_view (treesel)), "datad"); GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; gint row = -1; /* g_printerr ("display %d d->d %d d %d\n", (gint)gg->current_display, (gint)gg->current_display->d, (gint)d); */ if (gtk_tree_selection_get_selected (treesel, &model, &iter)) { path = gtk_tree_model_get_path (model, &iter); row = gtk_tree_path_get_indices (path)[0]; gtk_tree_path_free (path); } /* Before touching the cpanel, make sure the display and cpanel * actually correspond to the current data. This looks more and * more like a kludge -- I do need to revisit this. -- dfs */ if (gg->current_display && gg->current_display->d == d) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->br.linkby_row = row; } if (row <= 0) { gg->linkby_cv = false; return; /* link by case id; done */ } else { vartabled *vt; gtk_tree_model_get (model, &iter, LINKBYLIST_VT, &vt, -1); gg->linkby_cv = true; d->linkvar_vt = vt; } } GtkListStore * list_from_data (ggobid * gg, GGobiData * data, GtkNotebook * notebook) { GtkWidget *swin; GtkListStore *list = NULL; gint kd = g_slist_index (gg->d, data); swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), kd); if (swin) list = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (GTK_BIN (swin)->child))); return (list); } void linkby_notebook_varchanged_cb (ggobid * gg, GGobiData * data, GtkNotebook * notebook) { GtkListStore *list = list_from_data (gg, data, notebook); gtk_list_store_clear (list); varlist_populate (list, data); } void linkby_notebook_varadded_cb (ggobid * gg, vartabled * vt, gint which, GGobiData * data, GtkNotebook * notebook) { GtkListStore *model = list_from_data (gg, data, notebook); if (model) varlist_append (model, vt); } void linkby_notebook_list_changed_cb (ggobid * gg, GGobiData * d, void *notebook) { linkby_notebook_varchanged_cb (gg, d, notebook); } CHECK_EVENT_SIGNATURE (linkby_notebook_adddata_cb, datad_added_f) CHECK_EVENT_SIGNATURE (linkby_notebook_varchange_cb, variable_added_f) CHECK_EVENT_SIGNATURE (linkby_notebook_list_changed_cb, variable_list_changed_f) static void linkby_notebook_adddata_cb (ggobid * gg, GGobiData * d, void *notebook, GtkSignalFunc func) { if (g_slist_length (d->vartable)) { linkby_notebook_subwindow_add (d, notebook, gg); } } void linkby_notebook_subwindow_add (GGobiData * d, GtkWidget * notebook, ggobid * gg) { GtkWidget *swin, *treeview; GtkListStore *list; GtkSelectionMode mode = GTK_SELECTION_SINGLE; if (d->ncols == 0) return; /* Create a scrolled window to pack the CList widget into */ swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), GTK_SHADOW_NONE); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* If this is not the first child of the notebook, initialize it * as insensitive. */ if (g_list_length (gtk_container_get_children (GTK_CONTAINER (notebook))) != 0) { gtk_widget_set_sensitive (swin, false); } g_object_set_data (G_OBJECT (swin), "datad", d); /*setdata */ /* * name or nickname? Which one we'd prefer to use depends on the * size of the space we're working in -- maybe this will become an * argument. */ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), swin, (d->nickname != NULL) ? gtk_label_new (d->nickname) : gtk_label_new (d-> name)); /* add the treeview (list) */ list = gtk_list_store_new (LINKBYLIST_NCOLS, G_TYPE_STRING, G_TYPE_POINTER); varlist_populate (list, d); treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list)); populate_tree_view (treeview, NULL, 1, false, mode, G_CALLBACK (linking_method_set_cb), gg); g_object_set_data (G_OBJECT (treeview), "datad", d); //g_object_set_data (G_OBJECT (clist), "notebook", notebook); gtk_container_add (GTK_CONTAINER (swin), treeview); gtk_widget_show_all (swin); select_tree_view_row (treeview, 0); } GtkWidget * create_linkby_notebook (GtkWidget * box, ggobid * gg) { GtkWidget *notebook; //gint nd = g_slist_length (gg->d); GSList *l; GGobiData *d; GtkSelectionMode mode = GTK_SELECTION_SINGLE; vartyped vtype = categorical; datatyped dtype = all_datatypes; /* Create a notebook, set the position of the tabs */ notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); //gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), nd > 1); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), false); gtk_box_pack_start (GTK_BOX (box), notebook, true, true, 2); g_object_set_data (G_OBJECT (notebook), "SELECTION", (gpointer) mode); g_object_set_data (G_OBJECT (notebook), "vartype", (gpointer) vtype); g_object_set_data (G_OBJECT (notebook), "datatype", (gpointer) dtype); for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (g_slist_length (d->vartable)) { linkby_notebook_subwindow_add (d, notebook, gg); } } /*-- listen for variable_added and _list_changed events on main_window --*/ /*-- ... list_changed would be enough but it's only called on delete --*/ g_signal_connect (G_OBJECT (gg), "variable_added", G_CALLBACK (linkby_notebook_varadded_cb), GTK_OBJECT (notebook)); g_signal_connect (G_OBJECT (gg), "variable_list_changed", G_CALLBACK (linkby_notebook_varchanged_cb), GTK_OBJECT (notebook)); /*-- listen for datad_added events on main_window --*/ g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK (linkby_notebook_adddata_cb), GTK_OBJECT (notebook)); return notebook; } ggobi-2.1.12/src/tourcorr.c0000644000175000017500000012742314651527764011211 /* tourcorr.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" #define CTON true #define CTOFF false static void tourcorr_active_horvar_set (gint jvar, GGobiData *, displayd *, ggobid *); static void tourcorr_active_vervar_set (gint jvar, GGobiData *, displayd *, ggobid *); static void tourcorr_active_var_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg); void tourcorr_write_video(ggobid *gg); void display_tourcorr_init_null (displayd *dsp, ggobid *gg) { arrayd_init_null(&dsp->tcorr1.Fa); arrayd_init_null(&dsp->tcorr1.Fz); arrayd_init_null(&dsp->tcorr1.F); arrayd_init_null(&dsp->tcorr1.Ga); arrayd_init_null(&dsp->tcorr1.Gz); arrayd_init_null(&dsp->tcorr1.G); arrayd_init_null(&dsp->tcorr1.Va); arrayd_init_null(&dsp->tcorr1.Vz); arrayd_init_null(&dsp->tcorr1.tv); vectori_init_null(&dsp->tcorr1.subset_vars); vectorb_init_null(&dsp->tcorr1.subset_vars_p); vectori_init_null(&dsp->tcorr1.active_vars); vectorb_init_null(&dsp->tcorr1.active_vars_p); vectorf_init_null(&dsp->tcorr1.lambda); vectorf_init_null(&dsp->tcorr1.tau); vectorf_init_null(&dsp->tcorr1.tinc); /* manipulation controls */ arrayd_init_null(&dsp->tc1_manbasis); arrayd_init_null(&dsp->tc2_manbasis); arrayd_init_null(&dsp->tcorr2.Fa); arrayd_init_null(&dsp->tcorr2.Fz); arrayd_init_null(&dsp->tcorr2.F); arrayd_init_null(&dsp->tcorr2.Ga); arrayd_init_null(&dsp->tcorr2.Gz); arrayd_init_null(&dsp->tcorr2.G); arrayd_init_null(&dsp->tcorr2.Va); arrayd_init_null(&dsp->tcorr2.Vz); arrayd_init_null(&dsp->tcorr2.tv); vectori_init_null(&dsp->tcorr2.subset_vars); vectorb_init_null(&dsp->tcorr2.subset_vars_p); vectori_init_null(&dsp->tcorr2.active_vars); vectorb_init_null(&dsp->tcorr2.active_vars_p); vectorf_init_null(&dsp->tcorr2.lambda); vectorf_init_null(&dsp->tcorr2.tau); vectorf_init_null(&dsp->tcorr2.tinc); } void alloc_tourcorr (displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint nc = d->ncols; /* first index is the projection dimensions, second dimension is ncols */ arrayd_alloc(&dsp->tcorr1.Fa, 1, nc); arrayd_alloc(&dsp->tcorr1.Fz, 1, nc); arrayd_alloc(&dsp->tcorr1.F, 1, nc); arrayd_alloc(&dsp->tcorr1.Ga, 1, nc); arrayd_alloc(&dsp->tcorr1.Gz, 1, nc); arrayd_alloc(&dsp->tcorr1.G, 1, nc); arrayd_alloc(&dsp->tcorr1.Va, 1, nc); arrayd_alloc(&dsp->tcorr1.Vz, 1, nc); arrayd_alloc(&dsp->tcorr1.tv, 1, nc); vectori_alloc(&dsp->tcorr1.subset_vars, nc); vectorb_alloc_zero(&dsp->tcorr1.subset_vars_p, nc); vectori_alloc(&dsp->tcorr1.active_vars, nc); vectorb_alloc_zero(&dsp->tcorr1.active_vars_p, nc); vectorf_alloc(&dsp->tcorr1.lambda, nc); vectorf_alloc_zero(&dsp->tcorr1.tau, nc); vectorf_alloc(&dsp->tcorr1.tinc, nc); /* manipulation controls */ arrayd_alloc(&dsp->tc1_manbasis, 2, nc); arrayd_alloc(&dsp->tc2_manbasis, 2, nc); /* first index is the projection dimensions, second dimension is ncols */ arrayd_alloc(&dsp->tcorr2.Fa, 1, nc); arrayd_alloc(&dsp->tcorr2.Fz, 1, nc); arrayd_alloc(&dsp->tcorr2.F, 1, nc); arrayd_alloc(&dsp->tcorr2.Ga, 1, nc); arrayd_alloc(&dsp->tcorr2.Gz, 1, nc); arrayd_alloc(&dsp->tcorr2.G, 1, nc); arrayd_alloc(&dsp->tcorr2.Va, 1, nc); arrayd_alloc(&dsp->tcorr2.Vz, 1, nc); arrayd_alloc(&dsp->tcorr2.tv, 1, nc); vectori_alloc(&dsp->tcorr2.subset_vars, nc); vectorb_alloc_zero(&dsp->tcorr2.subset_vars_p, nc); vectori_alloc(&dsp->tcorr2.active_vars, nc); vectorb_alloc_zero(&dsp->tcorr2.active_vars_p, nc); vectorf_alloc(&dsp->tcorr2.lambda, nc); vectorf_alloc_zero(&dsp->tcorr2.tau, nc); vectorf_alloc(&dsp->tcorr2.tinc, nc); } /*-- eliminate the nc columns contained in *cols --*/ void tourcorr_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg) { displayd *dsp; GList *l; for (l=gg->displays; l; l=l->next) { dsp = (displayd *) l->data; if (dsp->d == d) { arrayd_delete_cols (&dsp->tcorr1.Fa, nc, cols); arrayd_delete_cols (&dsp->tcorr1.Fz, nc, cols); arrayd_delete_cols (&dsp->tcorr1.F, nc, cols); arrayd_delete_cols (&dsp->tcorr1.Ga, nc, cols); arrayd_delete_cols (&dsp->tcorr1.Gz, nc, cols); arrayd_delete_cols (&dsp->tcorr1.G, nc, cols); arrayd_delete_cols (&dsp->tcorr1.Va, nc, cols); arrayd_delete_cols (&dsp->tcorr1.Vz, nc, cols); arrayd_delete_cols (&dsp->tcorr1.tv, nc, cols); vectori_delete_els (&dsp->tcorr1.subset_vars, nc, cols); vectorb_delete_els (&dsp->tcorr1.subset_vars_p, nc, cols); vectori_delete_els (&dsp->tcorr1.active_vars, nc, cols); vectorb_delete_els (&dsp->tcorr1.active_vars_p, nc, cols); vectorf_delete_els (&dsp->tcorr1.lambda, nc, cols); vectorf_delete_els (&dsp->tcorr1.tau, nc, cols); vectorf_delete_els (&dsp->tcorr1.tinc, nc, cols); arrayd_delete_cols (&dsp->tc1_manbasis, (gint) nc, cols); arrayd_delete_cols (&dsp->tc2_manbasis, (gint) nc, cols); arrayd_delete_cols (&dsp->tcorr2.Fa, nc, cols); arrayd_delete_cols (&dsp->tcorr2.Fz, nc, cols); arrayd_delete_cols (&dsp->tcorr2.F, nc, cols); arrayd_delete_cols (&dsp->tcorr2.Ga, nc, cols); arrayd_delete_cols (&dsp->tcorr2.Gz, nc, cols); arrayd_delete_cols (&dsp->tcorr2.G, nc, cols); arrayd_delete_cols (&dsp->tcorr2.Va, nc, cols); arrayd_delete_cols (&dsp->tcorr2.Vz, nc, cols); arrayd_delete_cols (&dsp->tcorr2.tv, nc, cols); vectori_delete_els (&dsp->tcorr2.subset_vars, nc, cols); vectorb_delete_els (&dsp->tcorr2.subset_vars_p, nc, cols); vectori_delete_els (&dsp->tcorr2.active_vars, nc, cols); vectorb_delete_els (&dsp->tcorr2.active_vars_p, nc, cols); vectorf_delete_els (&dsp->tcorr2.lambda, nc, cols); vectorf_delete_els (&dsp->tcorr2.tau, nc, cols); vectorf_delete_els (&dsp->tcorr2.tinc, nc, cols); } } } void free_tourcorr(displayd *dsp) { /* gint k;*/ /* GGobiData *d = dsp->d;*/ /* gint nc = d->ncols;*/ vectori_free(&dsp->tcorr1.subset_vars); vectorb_free(&dsp->tcorr1.subset_vars_p); vectori_free(&dsp->tcorr1.active_vars); vectorb_free(&dsp->tcorr1.active_vars_p); vectorf_free(&dsp->tcorr1.lambda); vectorf_free(&dsp->tcorr1.tau); vectorf_free(&dsp->tcorr1.tinc); arrayd_free(&dsp->tcorr1.Fa, 0, 0); arrayd_free(&dsp->tcorr1.Fz, 0, 0); arrayd_free(&dsp->tcorr1.F, 0, 0); arrayd_free(&dsp->tcorr1.Ga, 0, 0); arrayd_free(&dsp->tcorr1.Gz, 0, 0); arrayd_free(&dsp->tcorr1.G, 0, 0); arrayd_free(&dsp->tcorr1.Va, 0, 0); arrayd_free(&dsp->tcorr1.Vz, 0, 0); arrayd_free(&dsp->tcorr1.tv, 0, 0); arrayd_free(&dsp->tc1_manbasis, 0, 0); arrayd_free(&dsp->tc2_manbasis, 0, 0); vectori_free(&dsp->tcorr2.subset_vars); vectorb_free(&dsp->tcorr2.subset_vars_p); vectori_free(&dsp->tcorr2.active_vars); vectorb_free(&dsp->tcorr2.active_vars_p); vectorf_free(&dsp->tcorr2.lambda); vectorf_free(&dsp->tcorr2.tau); vectorf_free(&dsp->tcorr2.tinc); arrayd_free(&dsp->tcorr2.Fa, 0, 0); arrayd_free(&dsp->tcorr2.Fz, 0, 0); arrayd_free(&dsp->tcorr2.F, 0, 0); arrayd_free(&dsp->tcorr2.Ga, 0, 0); arrayd_free(&dsp->tcorr2.Gz, 0, 0); arrayd_free(&dsp->tcorr2.G, 0, 0); arrayd_free(&dsp->tcorr2.Va, 0, 0); arrayd_free(&dsp->tcorr2.Vz, 0, 0); arrayd_free(&dsp->tcorr2.tv, 0, 0); } void display_tourcorr_init (displayd *dsp, ggobid *gg) { gint i, j; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint nc = d->ncols; gint nvert, nhoriz; if (nc < MIN_NVARS_FOR_COTOUR) return; alloc_tourcorr(dsp, gg); if (nc == 3) { /*-- ... which is equal to MIN_NVARS_FOR_COTOUR --*/ nhoriz = 2; nvert = 1; } else if (nc < 8) { nhoriz = nc-2; nvert = 2; } else { nhoriz = 3; nvert = 2; } /*-------------------------------------------------------------------*/ /*-- vertical --*/ dsp->tcorr2.nsubset = dsp->tcorr2.nactive = nvert; for (j=0; jtcorr2.subset_vars.els[j] = dsp->tcorr2.active_vars.els[j] = j; dsp->tcorr2.subset_vars_p.els[j] = dsp->tcorr2.active_vars_p.els[j] = true; } /*-- horizontal --*/ dsp->tcorr1.nsubset = dsp->tcorr1.nactive = nhoriz; for (j=0; jtcorr1.subset_vars.els[j] = dsp->tcorr1.active_vars.els[j] = j+nvert; dsp->tcorr1.subset_vars_p.els[j+nvert] = dsp->tcorr1.active_vars_p.els[j+nvert] = true; } /* if (nc < 8) { dsp->tcorr2.nsubset = dsp->tcorr2.nactive = nc-2; for (j=0; j<2; j++) { dsp->tcorr2.subset_vars_p.els[j] = dsp->tcorr2.active_vars_p.els[j] = false; } for (j=0; jtcorr2.subset_vars.els[j] = dsp->tcorr2.active_vars.els[j] = j+2; dsp->tcorr2.subset_vars_p.els[j+2] = dsp->tcorr2.active_vars_p.els[j+2] = true; } } else { dsp->tcorr2.nsubset = dsp->tcorr2.nactive = 3; for (j=0; j<3; j++) { dsp->tcorr2.subset_vars.els[j] = dsp->tcorr2.active_vars.els[j] = j+2; dsp->tcorr2.subset_vars_p.els[j+2] = dsp->tcorr2.active_vars_p.els[j+2] = true; } for (j=3; jtcorr2.subset_vars.els[j] = dsp->tcorr2.active_vars.els[j] = 0; dsp->tcorr2.subset_vars_p.els[j+2] = dsp->tcorr2.active_vars_p.els[j+2] = false; } } */ /* declare starting horizontal base as first horizontal variable */ for (i=0; i<1; i++) for (j=0; jtcorr1.Fa.vals[i][j] = dsp->tcorr1.Fz.vals[i][j] = dsp->tcorr1.F.vals[i][j] = dsp->tcorr1.Ga.vals[i][j] = dsp->tcorr1.Gz.vals[i][j] = 0.0; dsp->tcorr1.F.vals[0][dsp->tcorr1.active_vars.els[0]] = 1.0; /* declare starting vertical base as first vertical variable */ for (i=0; i<1; i++) for (j=0; jtcorr2.Fa.vals[i][j] = dsp->tcorr2.Fz.vals[i][j] = dsp->tcorr2.F.vals[i][j] = dsp->tcorr2.Ga.vals[i][j] = dsp->tcorr2.Gz.vals[i][j] = 0.0; dsp->tcorr2.F.vals[0][dsp->tcorr2.active_vars.els[0]] = 1.0; /* horizontal */ dsp->tcorr1.dist_az = 0.0; dsp->tcorr1.delta = cpanel->tcorr1.step*M_PI_2/10.0; dsp->tcorr1.tang = 0.0; dsp->tcorr1.idled = 0; dsp->tcorr1.get_new_target = true; dsp->tourcorr_video = false; /* vertical */ dsp->tcorr2.dist_az = 0.0; dsp->tcorr2.delta = cpanel->tcorr2.step*M_PI_2/10.0; dsp->tcorr2.tang = 0.0; dsp->tcorr2.idled = 0; dsp->tcorr2.get_new_target = true; /* manip */ dsp->tc1_manip_var = dsp->tcorr1.active_vars.els[0]; dsp->tc2_manip_var = dsp->tcorr2.active_vars.els[0]; /* pp */ dsp->tcorr1.target_selection_method = 0; dsp->tcorr2.target_selection_method = 0; dsp->tcorr_axes = true; } void tourcorr_fade_vars (gboolean fade, ggobid *gg) { gg->tourcorr.fade_vars = fade; } void tourcorr_speed_set(gfloat slidepos, ggobid *gg) { displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; speed_set(slidepos, &cpanel->tcorr1.step, &dsp->tcorr1.delta); speed_set(slidepos, &cpanel->tcorr2.step, &dsp->tcorr2.delta); cpanel->tcorr.slidepos = slidepos; } void tourcorr_pause (cpaneld *cpanel, gboolean state, ggobid *gg) { cpanel->tcorr1.paused = state; cpanel->tcorr2.paused = state; tourcorr_func (!cpanel->tcorr1.paused, gg->current_display, gg); tourcorr_func (!cpanel->tcorr2.paused, gg->current_display, gg); if (cpanel->tcorr1.paused && cpanel->tcorr2.paused) { /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (gg->current_display, FULL, gg); } } gboolean tourcorr_subset_horvar_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subset = dsp->tcorr1.subset_vars_p.els[jvar]; gint j, k; gboolean changed = false; gboolean fade = gg->tourcorr.fade_vars; gg->tourcorr.fade_vars = false; /* * if it's in the vertical subset, and there are at least two * variables in that subset, then remove jvar from the vertical * subset before adding it to the horizontal one */ if (dsp->tcorr2.subset_vars_p.els[jvar] && dsp->tcorr2.nsubset > 1) { /*-- removing from tcorr2 --*/ dsp->tcorr2.subset_vars_p.els[jvar] = false; dsp->tcorr2.nsubset -= 1; /*-- reset the horizontal subset_vars based on subset_vars_p --*/ for (j=0, k=0; jncols; j++) if (dsp->tcorr2.subset_vars_p.els[j]) dsp->tcorr2.subset_vars.els[k++] = j; /*-- jump jvar out of the vertical active set --*/ tourcorr_active_vervar_set (jvar, d, dsp, gg); /*-- adding to tcorr1 --*/ /*-- add jvar to the horizontal subset --*/ dsp->tcorr1.subset_vars_p.els[jvar] = true; dsp->tcorr1.nsubset += 1; /*-- jump jvar into the horizontal active set --*/ tourcorr_active_horvar_set (jvar, d, dsp, gg); changed = true; /*-- reset subset_vars based on subset_vars_p --*/ for (j=0, k=0; jncols; j++) if (dsp->tcorr1.subset_vars_p.els[j]) dsp->tcorr1.subset_vars.els[k++] = j; varcircles_visibility_set (dsp, gg); } else { /*-- simple adding or removing, no swaps --*/ if (in_subset) { /*-- allow the change if there are more than 3 cotour variables, and if there's more than 1 horizontal variables --*/ if (dsp->tcorr1.nsubset + dsp->tcorr2.nsubset > MIN_NVARS_FOR_COTOUR && dsp->tcorr1.nsubset > 1) { dsp->tcorr1.subset_vars_p.els[jvar] = false; dsp->tcorr1.nsubset -= 1; changed = true; } } else { dsp->tcorr1.subset_vars_p.els[jvar] = true; dsp->tcorr1.nsubset += 1; changed = true; } if (changed) { dsp->tc1_manipvar_inc = false; /*-- reset subset_vars based on subset_vars_p --*/ for (j=0, k=0; jncols; j++) if (dsp->tcorr1.subset_vars_p.els[j]) { dsp->tcorr1.subset_vars.els[k++] = j; if (j == dsp->tc1_manip_var) dsp->tc1_manipvar_inc = true; } /*-- Manip var needs to be one of the active vars --*/ if (!dsp->tc1_manipvar_inc) { dsp->tc1_manip_var = dsp->tcorr1.subset_vars.els[0]; } zero_tau(dsp->tcorr1.tau, 1); dsp->tcorr1.get_new_target = true; varcircles_visibility_set (dsp, gg); /*-- add/remove jvar to/from the horizontal active set --*/ tourcorr_active_horvar_set (jvar, d, dsp, gg); } } gg->tourcorr.fade_vars = fade; return changed; } static void tourcorr_active_horvar_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gint j, k; gboolean in_subset = dsp->tcorr1.subset_vars_p.els[jvar]; gboolean active = dsp->tcorr1.active_vars_p.els[jvar]; /* * This covers the case where we've just removed a variable * from the subset and then called tour2d_active_var_set .. * but the variable is already inactive, so we don't need to * do anything. */ if (!active && !in_subset) /**/return; /* deselect var if tcorr1.nactive > 1 */ if (active) { if (dsp->tcorr1.nactive > 1) { for (j=0; jtcorr1.nactive; j++) { if (jvar == dsp->tcorr1.active_vars.els[j]) break; } if (jtcorr1.nactive-1) { for (k=j; ktcorr1.nactive-1; k++){ dsp->tcorr1.active_vars.els[k] = dsp->tcorr1.active_vars.els[k+1]; } } dsp->tcorr1.nactive--; if (!gg->tourcorr.fade_vars) /* set current position without sel var */ { gt_basis(dsp->tcorr1.Fa, dsp->tcorr1.nactive, dsp->tcorr1.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->tcorr1.Fa, &dsp->tcorr1.F); /* copy_mat(dsp->tcorr1.F.vals, dsp->tcorr1.Fa.vals, d->ncols, 1);*/ } dsp->tcorr1.active_vars_p.els[jvar] = false; } } else { /* not active, so add the variable */ if (jvar > dsp->tcorr1.active_vars.els[dsp->tcorr1.nactive-1]) { dsp->tcorr1.active_vars.els[dsp->tcorr1.nactive] = jvar; } else if (jvar < dsp->tcorr1.active_vars.els[0]) { for (j=dsp->tcorr1.nactive; j>0; j--) { dsp->tcorr1.active_vars.els[j] = dsp->tcorr1.active_vars.els[j-1]; } dsp->tcorr1.active_vars.els[0] = jvar; } else { gint jtmp = dsp->tcorr1.nactive; for (j=0; jtcorr1.nactive-1; j++) { if (jvar > dsp->tcorr1.active_vars.els[j] && jvar < dsp->tcorr1.active_vars.els[j+1]) { jtmp = j+1; break; } } for (j=dsp->tcorr1.nactive-1;j>=jtmp; j--) dsp->tcorr1.active_vars.els[j+1] = dsp->tcorr1.active_vars.els[j]; dsp->tcorr1.active_vars.els[jtmp] = jvar; } dsp->tcorr1.nactive++; dsp->tcorr1.active_vars_p.els[jvar] = true; } dsp->tcorr1.get_new_target = true; } gboolean tourcorr_subset_vervar_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subset = dsp->tcorr2.subset_vars_p.els[jvar]; gint j, k; gboolean changed = false; gboolean fade = gg->tourcorr.fade_vars; gg->tourcorr.fade_vars = false; /* * if it's in the horiz subset, and there are at least two * variables in that subset, then remove jvar from the horiz * subset before adding it to the vertical one */ if (dsp->tcorr1.subset_vars_p.els[jvar] && dsp->tcorr1.nsubset > 1) { /*-- removing from tcorr1 --*/ dsp->tcorr1.subset_vars_p.els[jvar] = false; dsp->tcorr1.nsubset -= 1; /*-- reset the vertical subset_vars based on subset_vars_p --*/ for (j=0, k=0; jncols; j++) if (dsp->tcorr1.subset_vars_p.els[j]) dsp->tcorr1.subset_vars.els[k++] = j; /*-- jump jvar out of the horizontal active set --*/ tourcorr_active_horvar_set (jvar, d, dsp, gg); /*-- adding to tcorr2 --*/ /*-- add jvar to the vertical subset --*/ dsp->tcorr2.subset_vars_p.els[jvar] = true; dsp->tcorr2.nsubset += 1; /*-- jump jvar into the vertical active set --*/ tourcorr_active_vervar_set (jvar, d, dsp, gg); changed = true; /*-- reset subset_vars based on subset_vars_p --*/ for (j=0, k=0; jncols; j++) if (dsp->tcorr2.subset_vars_p.els[j]) dsp->tcorr2.subset_vars.els[k++] = j; varcircles_visibility_set (dsp, gg); } else { /*-- simple adding or removing, no swaps --*/ if (in_subset) { /*-- allow the change if there are more than 3 cotour variables, and if there's more than 1 vertical variables --*/ if (dsp->tcorr2.nsubset + dsp->tcorr1.nsubset > MIN_NVARS_FOR_COTOUR && dsp->tcorr2.nsubset > 1) { dsp->tcorr2.subset_vars_p.els[jvar] = false; dsp->tcorr2.nsubset -= 1; changed = true; } } else { dsp->tcorr2.subset_vars_p.els[jvar] = true; dsp->tcorr2.nsubset += 1; changed = true; } if (changed) { dsp->tc2_manipvar_inc = false; /*-- reset subset_vars based on subset_vars_p --*/ for (j=0, k=0; jncols; j++) if (dsp->tcorr2.subset_vars_p.els[j]) { dsp->tcorr2.subset_vars.els[k++] = j; if (j == dsp->tc2_manip_var) dsp->tc2_manipvar_inc = true; } /*-- Manip var needs to be one of the active vars --*/ if (!dsp->tc2_manipvar_inc) { dsp->tc2_manip_var = dsp->tcorr2.subset_vars.els[0]; } zero_tau(dsp->tcorr2.tau, 1); dsp->tcorr2.get_new_target = true; varcircles_visibility_set (dsp, gg); /*-- add/remove jvar to/from the horizontal active set --*/ tourcorr_active_vervar_set (jvar, d, dsp, gg); } } gg->tourcorr.fade_vars = fade; return changed; } #ifdef OVER gboolean tourcorr_subset_vervar_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subset = dsp->tcorr2.subset_vars_p.els[jvar]; gint j, k; gboolean changed = false; gboolean fade = gg->tourcorr.fade_vars; gg->tourcorr.fade_vars = false; if (dsp->tcorr1.subset_vars_p.els[jvar]) return false; if (in_subset) { if (dsp->tcorr1.nsubset + dsp->tcorr2.nsubset > MIN_NVARS_FOR_COTOUR && dsp->tcorr2.nsubset > 1) { dsp->tcorr2.subset_vars_p.els[jvar] = false; dsp->tcorr2.nsubset -= 1; changed = true; } } else { dsp->tcorr2.subset_vars_p.els[jvar] = true; dsp->tcorr2.nsubset += 1; changed = true; } /*-- reset subset_vars based on subset_vars_p --*/ if (changed) { for (j=0, k=0; jncols; j++) if (dsp->tcorr2.subset_vars_p.els[j]) dsp->tcorr2.subset_vars.els[k++] = j; varcircles_visibility_set (dsp, gg); /*-- add/remove jvar to/from the vertical active set --*/ tourcorr_active_vervar_set (jvar, d, dsp, gg); } gg->tourcorr.fade_vars = fade; return changed; } #endif static void tourcorr_active_vervar_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gint j, k; gboolean in_subset = dsp->tcorr2.subset_vars_p.els[jvar]; gboolean active = dsp->tcorr2.active_vars_p.els[jvar]; /* * This covers the case where we've just removed a variable * from the subset and then called tour2d_active_var_set .. * but the variable is already inactive, so we don't need to * do anything. */ if (!active && !in_subset) /**/return; /* deselect var if tcorr2.nactive > 1 */ if (active) { if (dsp->tcorr2.nactive > 1) { for (j=0; jtcorr2.nactive; j++) { if (jvar == dsp->tcorr2.active_vars.els[j]) break; } if (jtcorr2.nactive-1) { for (k=j; ktcorr2.nactive-1; k++){ dsp->tcorr2.active_vars.els[k] = dsp->tcorr2.active_vars.els[k+1]; } } dsp->tcorr2.nactive--; if (!gg->tourcorr.fade_vars) /* set current position without sel var */ { gt_basis(dsp->tcorr2.Fa, dsp->tcorr2.nactive, dsp->tcorr2.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->tcorr2.Fa, &dsp->tcorr2.F); /* copy_mat(dsp->tcorr2.F.vals, dsp->tcorr2.Fa.vals, d->ncols, 1);*/ } dsp->tcorr2.active_vars_p.els[jvar] = false; } } else { /* not active, so add the variable */ if (jvar > dsp->tcorr2.active_vars.els[dsp->tcorr2.nactive-1]) { dsp->tcorr2.active_vars.els[dsp->tcorr2.nactive] = jvar; } else if (jvar < dsp->tcorr2.active_vars.els[0]) { for (j=dsp->tcorr2.nactive; j>0; j--) { dsp->tcorr2.active_vars.els[j] = dsp->tcorr2.active_vars.els[j-1]; } dsp->tcorr2.active_vars.els[0] = jvar; } else { gint jtmp = dsp->tcorr2.nactive; for (j=0; jtcorr2.nactive-1; j++) { if (jvar > dsp->tcorr2.active_vars.els[j] && jvar < dsp->tcorr2.active_vars.els[j+1]) { jtmp = j+1; break; } } for (j=dsp->tcorr2.nactive-1;j>=jtmp; j--) dsp->tcorr2.active_vars.els[j+1] = dsp->tcorr2.active_vars.els[j]; dsp->tcorr2.active_vars.els[jtmp] = jvar; } dsp->tcorr2.nactive++; dsp->tcorr2.active_vars_p.els[jvar] = true; } dsp->tcorr2.get_new_target = true; } static void tourcorr_active_var_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subsethor = dsp->tcorr1.subset_vars_p.els[jvar]; gboolean in_subsetver = dsp->tcorr2.subset_vars_p.els[jvar]; gboolean activehor = dsp->tcorr1.active_vars_p.els[jvar]; gboolean activever = dsp->tcorr2.active_vars_p.els[jvar]; gint j, k; /* Taking care of horizontal variables first */ if (in_subsethor && activehor && (dsp->tcorr1.nactive>1)) { /* remove variable */ for (j=0; jtcorr1.nactive; j++) { if (jvar == dsp->tcorr1.active_vars.els[j]) break; } if (jtcorr1.nactive-1) { for (k=j; ktcorr1.nactive-1; k++){ dsp->tcorr1.active_vars.els[k] = dsp->tcorr1.active_vars.els[k+1]; } } dsp->tcorr1.nactive--; if (!gg->tourcorr.fade_vars) /* set current position without sel var */ { gt_basis(dsp->tcorr1.Fa, dsp->tcorr1.nactive, dsp->tcorr1.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->tcorr1.Fa, &dsp->tcorr1.F); } dsp->tcorr1.active_vars_p.els[jvar] = false; } else if (in_subsethor && !activehor) { /* add variable */ if (jvar > dsp->tcorr1.active_vars.els[dsp->tcorr1.nactive-1]) { dsp->tcorr1.active_vars.els[dsp->tcorr1.nactive] = jvar; } else if (jvar < dsp->tcorr1.active_vars.els[0]) { for (j=dsp->tcorr1.nactive; j>0; j--) { dsp->tcorr1.active_vars.els[j] = dsp->tcorr1.active_vars.els[j-1]; } dsp->tcorr1.active_vars.els[0] = jvar; } else { gint jtmp = dsp->tcorr1.nactive; for (j=0; jtcorr1.nactive-1; j++) { if (jvar > dsp->tcorr1.active_vars.els[j] && jvar < dsp->tcorr1.active_vars.els[j+1]) { jtmp = j+1; break; } } for (j=dsp->tcorr1.nactive-1;j>=jtmp; j--) dsp->tcorr1.active_vars.els[j+1] = dsp->tcorr1.active_vars.els[j]; dsp->tcorr1.active_vars.els[jtmp] = jvar; } dsp->tcorr1.nactive++; dsp->tcorr1.active_vars_p.els[jvar] = true; } /* Now vertical variables */ if (in_subsetver && activever && (dsp->tcorr2.nactive>1)) { /* remove variable */ for (j=0; jtcorr2.nactive; j++) { if (jvar == dsp->tcorr2.active_vars.els[j]) break; } if (jtcorr2.nactive-1) { for (k=j; ktcorr2.nactive-1; k++) { dsp->tcorr2.active_vars.els[k] = dsp->tcorr2.active_vars.els[k+1]; } } dsp->tcorr2.nactive--; if (!gg->tourcorr.fade_vars) /* set current position without sel var */ { gt_basis(dsp->tcorr2.Fa, dsp->tcorr2.nactive, dsp->tcorr2.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->tcorr2.Fa, &dsp->tcorr2.F); } dsp->tcorr2.active_vars_p.els[jvar] = false; } else if (in_subsetver && !activever) { /* add variable */ if (jvar > dsp->tcorr2.active_vars.els[dsp->tcorr2.nactive-1]) { dsp->tcorr2.active_vars.els[dsp->tcorr2.nactive] = jvar; } else if (jvar < dsp->tcorr2.active_vars.els[0]) { for (j=dsp->tcorr2.nactive; j>0; j--) { dsp->tcorr2.active_vars.els[j] = dsp->tcorr2.active_vars.els[j-1]; } dsp->tcorr2.active_vars.els[0] = jvar; } else { gint jtmp = dsp->tcorr2.nactive; for (j=0; jtcorr2.nactive-1; j++) { if (jvar > dsp->tcorr2.active_vars.els[j] && jvar < dsp->tcorr2.active_vars.els[j+1]) { jtmp = j+1; break; } } for (j=dsp->tcorr2.nactive-1;j>=jtmp; j--) dsp->tcorr2.active_vars.els[j+1] = dsp->tcorr2.active_vars.els[j]; dsp->tcorr2.active_vars.els[jtmp] = jvar; } dsp->tcorr2.nactive++; dsp->tcorr2.active_vars_p.els[jvar] = true; } dsp->tcorr1.get_new_target = true; dsp->tcorr2.get_new_target = true; } void tourcorr_manip_var_set (gint j, gint btn, ggobid *gg) { displayd *dsp = gg->current_display; if (btn == 1) dsp->tc1_manip_var = j; if (btn == 2) dsp->tc2_manip_var = j; } gboolean tourcorr_varsel (GtkWidget *w, gint jvar, gint toggle, gint mouse, GGobiData *d, ggobid *gg) { displayd *dsp = gg->current_display; gboolean changed = true; if (GTK_IS_TOGGLE_BUTTON(w)) { /*-- w is either one of the x or y toggle buttons --*/ gboolean isx = (w == varpanel_widget_get_nth (VARSEL_X, jvar, d)); /* add/remove jvar to/from the subset of variables that be active */ if (isx) changed = tourcorr_subset_horvar_set (jvar, d, dsp, gg); else changed = tourcorr_subset_vervar_set (jvar, d, dsp, gg); } else if (GTK_IS_BUTTON(w)) { /*-- w is the label --*/ if (mouse == 1) changed = tourcorr_subset_horvar_set (jvar, d, dsp, gg); else changed = tourcorr_subset_vervar_set (jvar, d, dsp, gg); } else if (GTK_IS_DRAWING_AREA(w)) { if (d->vcirc_ui.jcursor == GDK_HAND2) { tourcorr_manip_var_set (jvar, mouse, gg); d->vcirc_ui.jcursor = (gint) NULL; } else { tourcorr_active_var_set (jvar, d, dsp, gg); } } return changed; } void tourcorr_projdata(splotd *sp, greal **world_data, GGobiData *d, ggobid *gg) { gint i, j, m; displayd *dsp = (displayd *) sp->displayptr; greal precis = (greal) PRECISION1; greal tmpf, maxx, maxy; if (sp->tourcorr.initmax) { sp->tourcorr.maxscreen = precis; sp->tourcorr.initmax = false; } tmpf = precis/sp->tourcorr.maxscreen; maxx = sp->tourcorr.maxscreen; maxy = sp->tourcorr.maxscreen; for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; sp->planar[i].x = 0; sp->planar[i].y = 0; for (j=0; jncols; j++) { sp->planar[i].x += (greal)(dsp->tcorr1.F.vals[0][j]*world_data[i][j]); sp->planar[i].y += (greal)(dsp->tcorr2.F.vals[0][j]*world_data[i][j]); } sp->planar[i].x *= tmpf; sp->planar[i].y *= tmpf; if (fabs(sp->planar[i].x) > maxx) maxx = fabs(sp->planar[i].x); if (fabs(sp->planar[i].y) > maxy) maxy = fabs(sp->planar[i].y); } if ((maxx > precis) || (maxy > precis)) { sp->tourcorr.maxscreen = (maxx > maxy) ? maxx : maxy; tmpf = precis/tmpf; } } void tourcorr_snap(ggobid *gg) { displayd *dsp = gg->current_display; splotd *sp = gg->current_splot; GGobiData *d = dsp->d; gint j; gdouble rnge; vartabled *vt; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); rnge = vt->lim.max - vt->lim.min; g_printerr("%f %f\n", dsp->tcorr1.F.vals[0][j]/rnge*sp->scale.x, dsp->tcorr2.F.vals[0][j]/rnge*sp->scale.y); } } void tourcorr_video(ggobid *gg) { displayd *dsp = gg->current_display; if (dsp == NULL) return; dsp->tourcorr_video = !dsp->tourcorr_video; } void tourcorr_write_video(ggobid *gg) { displayd *dsp = gg->current_display; splotd *sp = gg->current_splot; GGobiData *d = dsp->d; gint j; vartabled *vt; g_printerr("%f %f\n",sp->scale.x, sp->scale.y); for (j=0; jncols; j++) { vt = vartable_element_get (j, d); g_printerr("%f %f %f %f\n", dsp->tcorr1.F.vals[0][j], dsp->tcorr2.F.vals[0][j], vt->lim.min, vt->lim.max); } } /* Variable manipulation */ void tourcorr_manip_init(gint p1, gint p2, splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); gint j; gint n1vars = dsp->tcorr1.nactive, n2vars = dsp->tcorr2.nactive; gboolean dontdoit = false; /* need to turn off tour */ if (!cpanel->tcorr1.paused && !cpanel->tcorr2.paused) { tourcorr_func(CTOFF, gg->current_display, gg); } dsp->tc1_phi = 0.; dsp->tc2_phi = 0.; /* gets mouse position */ dsp->tc1_pos = dsp->tc1_pos_old = p1; dsp->tc2_pos = dsp->tc2_pos_old = p2; /* initializes indicator for manip var being one of existing vars */ dsp->tc1_manipvar_inc = false; dsp->tc2_manipvar_inc = false; /* check if manip var is one of existing vars */ /* n1vars, n2vars is the number of variables, excluding the manip var in hor and vert directions */ for (j=0; jtcorr1.nactive; j++) if (dsp->tcorr1.active_vars.els[j] == dsp->tc1_manip_var) { dsp->tc1_manipvar_inc = true; n1vars--; } for (j=0; jtcorr2.nactive; j++) if (dsp->tcorr2.active_vars.els[j] == dsp->tc2_manip_var) { dsp->tc2_manipvar_inc = true; n2vars--; } /* make manip basis, from existing projection */ /* 0 will be the remainder of the projection, and 1 will be the indicator vector for the manip var */ for (j=0; jncols; j++) { dsp->tc1_manbasis.vals[0][j] = dsp->tcorr1.F.vals[0][j]; dsp->tc1_manbasis.vals[1][j] = 0.; } for (j=0; jncols; j++) { dsp->tc2_manbasis.vals[0][j] = dsp->tcorr2.F.vals[0][j]; dsp->tc2_manbasis.vals[1][j] = 0.; } dsp->tc1_manbasis.vals[1][dsp->tc1_manip_var]=1.; dsp->tc2_manbasis.vals[1][dsp->tc2_manip_var]=1.; if (n1vars > 0) { while (!gram_schmidt(dsp->tc1_manbasis.vals[0], dsp->tc1_manbasis.vals[1], d->ncols)) { gt_basis(dsp->tcorr1.tv, dsp->tcorr1.nactive, dsp->tcorr1.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->tc1_manbasis.vals[1][j] = dsp->tcorr1.tv.vals[0][j]; } } if (n2vars > 0) { while (!gram_schmidt(dsp->tc2_manbasis.vals[0], dsp->tc2_manbasis.vals[1], d->ncols)) { gt_basis(dsp->tcorr2.tv, dsp->tcorr2.nactive, dsp->tcorr2.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->tc2_manbasis.vals[1][j] = dsp->tcorr2.tv.vals[0][j]; } } if (dontdoit) { disconnect_motion_signal (sp); } } void tourcorr_run(displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; /* cpaneld *cpanel = &dsp->cpanel;*/ gint i, nv; gint pathprob = 0; if (!dsp->tcorr1.get_new_target && !reached_target(dsp->tcorr1.tang, dsp->tcorr1.dist_az, 0, 0, 0)) { increment_tour(dsp->tcorr1.tinc, dsp->tcorr1.tau, dsp->tcorr1.dist_az, dsp->tcorr1.delta, &dsp->tcorr1.tang, (gint) 1); tour_reproject(dsp->tcorr1.tinc, dsp->tcorr1.G, dsp->tcorr1.Ga, dsp->tcorr1.Gz, dsp->tcorr1.F, dsp->tcorr1.Va, d->ncols, (gint) 1); } else { /* do final clean-up and get new target */ if (!dsp->tcorr1.get_new_target) { do_last_increment(dsp->tcorr1.tinc, dsp->tcorr1.tau, dsp->tcorr1.dist_az, (gint) 1); tour_reproject(dsp->tcorr1.tinc, dsp->tcorr1.G, dsp->tcorr1.Ga, dsp->tcorr1.Gz, dsp->tcorr1.F, dsp->tcorr1.Va, d->ncols, (gint) 1); } arrayd_copy(&dsp->tcorr1.F, &dsp->tcorr1.Fa); /* copy_mat(dsp->tcorr1.Fa.vals, dsp->tcorr1.F.vals, d->ncols, 1);*/ nv = 0; for (i=0; incols; i++) if (fabs(dsp->tcorr1.Fa.vals[0][i]) > 0.01) { nv++; } if (nv == 1 && dsp->tcorr1.nactive == 1) /* only generate new dir if num of active/used variables is > 1 */ dsp->tcorr1.get_new_target = true; else { gt_basis(dsp->tcorr1.Fz, dsp->tcorr1.nactive, dsp->tcorr1.active_vars, d->ncols, (gint) 1); pathprob = tour_path(dsp->tcorr1.Fa, dsp->tcorr1.Fz, dsp->tcorr1.F, d->ncols, (gint) 1, dsp->tcorr1.Ga, dsp->tcorr1.Gz, dsp->tcorr1.G, dsp->tcorr1.lambda, dsp->tcorr1.tv, dsp->tcorr1.Va, dsp->tcorr1.Vz, dsp->tcorr1.tau, dsp->tcorr1.tinc, &dsp->tcorr1.dist_az, &dsp->tcorr1.tang); if (pathprob == 0) dsp->tcorr1.get_new_target = false; else if (pathprob == 1) { /* problems with Fa so need to force a jump */ tourcorr_scramble(gg); pathprob = tour_path(dsp->tcorr1.Fa, dsp->tcorr1.Fz, dsp->tcorr1.F, d->ncols, (gint) 1, dsp->tcorr1.Ga, dsp->tcorr1.Gz, dsp->tcorr1.G, dsp->tcorr1.lambda, dsp->tcorr1.tv, dsp->tcorr1.Va, dsp->tcorr1.Vz, dsp->tcorr1.tau, dsp->tcorr1.tinc, &dsp->tcorr1.dist_az, &dsp->tcorr1.tang); } else if (pathprob == 2 || pathprob == 3) { /* problems with Fz, so will force a new choice of Fz */ dsp->tcorr1.get_new_target = true; } } } if (!dsp->tcorr2.get_new_target && !reached_target(dsp->tcorr2.tang, dsp->tcorr2.dist_az, 0, 0, 0)) { increment_tour(dsp->tcorr2.tinc, dsp->tcorr2.tau, dsp->tcorr2.dist_az, dsp->tcorr2.delta, &dsp->tcorr2.tang, (gint) 1); tour_reproject(dsp->tcorr2.tinc, dsp->tcorr2.G, dsp->tcorr2.Ga, dsp->tcorr2.Gz, dsp->tcorr2.F, dsp->tcorr2.Va, d->ncols, (gint) 1); } else { /* do final clean-up and get new target */ if (!dsp->tcorr2.get_new_target) { do_last_increment(dsp->tcorr2.tinc, dsp->tcorr2.tau, dsp->tcorr2.dist_az, (gint) 1); tour_reproject(dsp->tcorr2.tinc, dsp->tcorr2.G, dsp->tcorr2.Ga, dsp->tcorr2.Gz, dsp->tcorr2.F, dsp->tcorr2.Va, d->ncols, (gint) 1); } arrayd_copy(&dsp->tcorr2.F, &dsp->tcorr2.Fa); /* copy_mat(dsp->tcorr2.Fa.vals, dsp->tcorr2.F.vals, d->ncols, 1);*/ nv = 0; for (i=0; incols; i++) if (fabs(dsp->tcorr2.Fa.vals[0][i]) > 0.01) { nv++; } if (nv == 1 && dsp->tcorr2.nactive == 1) /* only generate new dir if num of active/used variables is > 1 */ dsp->tcorr2.get_new_target = true; else { gt_basis(dsp->tcorr2.Fz, dsp->tcorr2.nactive, dsp->tcorr2.active_vars, d->ncols, (gint) 1); pathprob = tour_path(dsp->tcorr2.Fa, dsp->tcorr2.Fz, dsp->tcorr2.F, d->ncols, (gint) 1, dsp->tcorr2.Ga, dsp->tcorr2.Gz, dsp->tcorr2.G, dsp->tcorr2.lambda, dsp->tcorr2.tv, dsp->tcorr2.Va, dsp->tcorr2.Vz, dsp->tcorr2.tau, dsp->tcorr2.tinc, &dsp->tcorr2.dist_az, &dsp->tcorr2.tang); if (pathprob == 0) dsp->tcorr2.get_new_target = false; else if (pathprob == 1) { /* problems with Fa so need to force a jump */ tourcorr_scramble(gg); pathprob = tour_path(dsp->tcorr2.Fa, dsp->tcorr2.Fz, dsp->tcorr2.F, d->ncols, (gint) 1, dsp->tcorr2.Ga, dsp->tcorr2.Gz, dsp->tcorr2.G, dsp->tcorr2.lambda, dsp->tcorr2.tv, dsp->tcorr2.Va, dsp->tcorr2.Vz, dsp->tcorr2.tau, dsp->tcorr2.tinc, &dsp->tcorr2.dist_az, &dsp->tcorr2.tang); } else if (pathprob == 2 || pathprob == 3) { /* problems with Fz, so will force a new choice of Fz */ dsp->tcorr2.get_new_target = true; } } } display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); if (dsp->tourcorr_video) tourcorr_write_video(gg); } void tourcorr_do_step(displayd *dsp, ggobid *gg) { tourcorr_run(dsp, gg); } gint tourcorr_idle_func (displayd *dsp) { ggobid *gg = GGobiFromDisplay (dsp); cpaneld *cpanel = &dsp->cpanel; gboolean doit = !cpanel->tcorr1.paused; if (doit) { tourcorr_run(dsp, gg); gdk_flush (); } return (doit); } void tourcorr_func (gboolean state, displayd *dsp, ggobid *gg) { splotd *sp = (splotd *) g_list_nth_data (dsp->splots, 0); if (state) { if (dsp->tcorr1.idled == 0) { dsp->tcorr1.idled = g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc) tourcorr_idle_func, dsp, NULL); } gg->tourcorr.idled = 1; } else { if (dsp->tcorr1.idled) { g_source_remove (dsp->tcorr1.idled); dsp->tcorr1.idled = 0; } gg->tourcorr.idled = 0; } splot_connect_expose_handler (dsp->tcorr1.idled, sp); } void tourcorr_reinit(ggobid *gg) { int j, m; displayd *dsp = gg->current_display; GGobiData *d = dsp->d; splotd *sp = gg->current_splot; for (j=0; jncols; j++) { dsp->tcorr1.F.vals[0][j] = 0.; dsp->tcorr1.Fa.vals[0][j] = 0.; } m = dsp->tcorr1.active_vars.els[0]; dsp->tcorr1.F.vals[0][m] = 1.; dsp->tcorr1.Fa.vals[0][m] = 1.; dsp->tcorr1.get_new_target = true; for (j=0; jncols; j++) { dsp->tcorr2.F.vals[0][j] = 0.; dsp->tcorr2.Fa.vals[0][j] = 0.; } m = dsp->tcorr2.active_vars.els[0]; dsp->tcorr2.F.vals[0][m] = 1.; dsp->tcorr2.Fa.vals[0][m] = 1.; dsp->tcorr2.get_new_target = true; sp->tourcorr.initmax = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } void tourcorr_scramble(ggobid *gg) { gint j; displayd *dsp = gg->current_display; GGobiData *d = dsp->d; /*gint i, nc = d->ncols;*/ for (j=0; jncols; j++) { dsp->tcorr1.F.vals[0][j] = 0.; dsp->tcorr1.Fa.vals[0][j] = 0.; } for (j=0; jncols; j++) { dsp->tcorr2.F.vals[0][j] = 0.; dsp->tcorr2.Fa.vals[0][j] = 0.; } gt_basis(dsp->tcorr1.Fa, dsp->tcorr1.nactive, dsp->tcorr1.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->tcorr1.Fa, &dsp->tcorr1.F); /* copy_mat(dsp->tcorr1.F.vals, dsp->tcorr1.Fa.vals, d->ncols, 1);*/ gt_basis(dsp->tcorr2.Fa, dsp->tcorr2.nactive, dsp->tcorr2.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->tcorr2.Fa, &dsp->tcorr2.F); /* copy_mat(dsp->tcorr2.F.vals, dsp->tcorr2.Fa.vals, d->ncols, 1);*/ dsp->tcorr1.get_new_target = true; dsp->tcorr2.get_new_target = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } void tourcorr_manip(gint p1, gint p2, splotd *sp, ggobid *gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gfloat xcosphi=1., xsinphi=0., ycosphi=1., ysinphi=0.; gfloat distx = 0., disty = 0.; gfloat denom = (float) MIN(sp->max.x, sp->max.y)/2.; gint actual_nxvars = dsp->tcorr1.nactive, actual_nyvars = dsp->tcorr2.nactive; gint j; gboolean offscreen = false; /* check if off the plot window */ if (p1 > sp->max.x || p1 < 0 || p2 > sp->max.y || p2 <0) offscreen = true; if (dsp->tc1_manipvar_inc) actual_nxvars = dsp->tcorr1.nactive-1; if (dsp->tc2_manipvar_inc) actual_nyvars = dsp->tcorr2.nactive-1; if (!offscreen) { dsp->tc1_pos_old = dsp->tc1_pos; dsp->tc2_pos_old = dsp->tc2_pos; dsp->tc1_pos = p1; dsp->tc2_pos = p2; if (actual_nxvars > 0 || actual_nyvars > 0) { if (cpanel->tcorr.manip_mode == CMANIP_VERT) { distx = 0.; if (actual_nyvars > 0) disty = dsp->tc2_pos_old - dsp->tc2_pos; } else if (cpanel->tcorr.manip_mode == CMANIP_HOR) { if (actual_nxvars > 0) distx = dsp->tc1_pos - dsp->tc1_pos_old; disty = 0.; } else if (cpanel->tcorr.manip_mode == CMANIP_COMB) { if (actual_nxvars > 0) distx = dsp->tc1_pos - dsp->tc1_pos_old; if (actual_nyvars > 0) disty = dsp->tc2_pos_old - dsp->tc2_pos; } else if (cpanel->tcorr.manip_mode == CMANIP_EQUAL) { if (actual_nxvars > 0) distx = dsp->tc1_pos - dsp->tc1_pos_old; if (actual_nyvars > 0) disty = dsp->tc2_pos_old - dsp->tc2_pos; if (fabs(distx) != fabs(disty)) { distx = (distx+disty)/1.414214; disty = distx; } } dsp->tc1_phi = dsp->tc1_phi + distx / denom; dsp->tc2_phi = dsp->tc2_phi + disty / denom; xcosphi = (gfloat) cos((gdouble) dsp->tc1_phi); xsinphi = (gfloat) sin((gdouble) dsp->tc1_phi); if (xcosphi > 1.0) { xcosphi = 1.0; xsinphi = 0.0; } else if (xcosphi < -1.0) { xcosphi = -1.0; xsinphi = 0.0; } ycosphi = (float) cos((double) dsp->tc2_phi); ysinphi = (float) sin((double) dsp->tc2_phi); if (ycosphi > 1.0) { ycosphi = 1.0; ysinphi = 0.0; } else if (ycosphi < -1.0) { ycosphi = -1.0; ysinphi = 0.0; } } /* generate the projection basis */ if (actual_nxvars > 0) { for (j=0; jncols; j++) dsp->tcorr1.F.vals[0][j] = xcosphi * dsp->tc1_manbasis.vals[0][j] + xsinphi * dsp->tc1_manbasis.vals[1][j]; } if (actual_nyvars > 0) { for (j=0; jncols; j++) dsp->tcorr2.F.vals[0][j] = ycosphi * dsp->tc2_manbasis.vals[0][j] + ysinphi * dsp->tc2_manbasis.vals[1][j]; } display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } else { disconnect_motion_signal (sp); arrayd_copy(&dsp->tcorr1.F, &dsp->tcorr1.Fa); /* copy_mat(dsp->tcorr1.Fa.vals, dsp->tcorr1.F.vals, d->ncols, 1);*/ arrayd_copy(&dsp->tcorr2.F, &dsp->tcorr2.Fa); /* copy_mat(dsp->tcorr2.Fa.vals, dsp->tcorr2.F.vals, d->ncols, 1);*/ dsp->tcorr1.get_new_target = true; dsp->tcorr2.get_new_target = true; if (!cpanel->tcorr1.paused && !cpanel->tcorr2.paused) tourcorr_func(CTON, gg->current_display, gg); } } void tourcorr_manip_end(splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); disconnect_motion_signal (sp); arrayd_copy(&dsp->tcorr1.F, &dsp->tcorr1.Fa); arrayd_copy(&dsp->tcorr2.F, &dsp->tcorr2.Fa); dsp->tcorr1.get_new_target = true; dsp->tcorr2.get_new_target = true; /* need to turn on tour? */ if (!cpanel->tcorr1.paused && !cpanel->tcorr2.paused) { tourcorr_func(CTON, gg->current_display, gg); /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (gg->current_display, FULL, gg); } } #undef CTON #undef CTOFF ggobi-2.1.12/src/ggobi-renderer-cairo.h0000644000175000017500000000525414651527764013322 /* Generated by GOB (v2.0.18) (do not edit directly) */ #include #include #ifndef __GGOBI_RENDERER_CAIRO_H__ #define __GGOBI_RENDERER_CAIRO_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* only use cairo when GTK+ 2.8.0 or higher installed */ #include #if GTK_CHECK_VERSION(2,8,0) #include "ggobi-renderer.h" #include /* * Type checking and casting macros */ #define GGOBI_TYPE_RENDERER_CAIRO (ggobi_renderer_cairo_get_type()) #define GGOBI_RENDERER_CAIRO(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_renderer_cairo_get_type(), GGobiRendererCairo) #define GGOBI_RENDERER_CAIRO_CONST(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_renderer_cairo_get_type(), GGobiRendererCairo const) #define GGOBI_RENDERER_CAIRO_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), ggobi_renderer_cairo_get_type(), GGobiRendererCairoClass) #define GGOBI_IS_RENDERER_CAIRO(obj) G_TYPE_CHECK_INSTANCE_TYPE((obj), ggobi_renderer_cairo_get_type ()) #define GGOBI_RENDERER_CAIRO_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), ggobi_renderer_cairo_get_type(), GGobiRendererCairoClass) /* Private structure type */ typedef struct _GGobiRendererCairoPrivate GGobiRendererCairoPrivate; /* * Main object structure */ #ifndef __TYPEDEF_GGOBI_RENDERER_CAIRO__ #define __TYPEDEF_GGOBI_RENDERER_CAIRO__ typedef struct _GGobiRendererCairo GGobiRendererCairo; #endif struct _GGobiRendererCairo { GGobiRenderer __parent__; /*< private >*/ GGobiRendererCairoPrivate *_priv; }; /* * Class definition */ typedef struct _GGobiRendererCairoClass GGobiRendererCairoClass; struct _GGobiRendererCairoClass { GGobiRendererClass __parent__; cairo_t * (* create_cairo) (GGobiRendererCairo * self, GdkDrawable * target); }; /* * Public methods */ GType ggobi_renderer_cairo_get_type (void) G_GNUC_CONST; #line 32 "renderer-cairo.gob" cairo_t * ggobi_renderer_cairo_get_cairo (GGobiRendererCairo * self); #line 67 "ggobi-renderer-cairo.h" #line 25 "renderer-cairo.gob" void ggobi_renderer_cairo_set_cairo (GGobiRendererCairo * self, cairo_t * val); #line 71 "ggobi-renderer-cairo.h" /* * Argument wrapping macros */ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define GGOBI_RENDERER_CAIRO_PROP_CAIRO(arg) "cairo", __extension__ ({cairo_t * z = (arg); z;}) #define GGOBI_RENDERER_CAIRO_GET_PROP_CAIRO(arg) "cairo", __extension__ ({cairo_t * *z = (arg); z;}) #else /* __GNUC__ && !__STRICT_ANSI__ */ #define GGOBI_RENDERER_CAIRO_PROP_CAIRO(arg) "cairo",(cairo_t * )(arg) #define GGOBI_RENDERER_CAIRO_GET_PROP_CAIRO(arg) "cairo",(cairo_t * *)(arg) #endif /* __GNUC__ && !__STRICT_ANSI__ */ #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif ggobi-2.1.12/src/tour2d_pp.h0000644000175000017500000000321214651527764011242 /* tour2d_pp.h */ /* Copyright (C) 2001 Dianne Cook and Sigbert Klinke and Eun-Kyung Lee This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The authors can be contacted at the following email addresses: dicook@iastate.edu sigbert@wiwi.hu-berlin.de */ gint skewness_raw2(array_f *pdata, void *param, gfloat *val); gint skewness_raw1( array_f *pdata, void *param, gfloat *val); gint skewness( array_f *pdata, void *param, gfloat *val); gint central_mass(array_f *pdata, void *param, gfloat *val); gint central_mass_raw1(array_f *pdata, void *param, gfloat *val); gint central_mass_raw2(array_f *pdata, void *param, gfloat *val); gfloat mean_fn2(gfloat *x1, gfloat *x2, gint n); /*void inverse(double *a, int n);*/ gint holes( array_f *pdata,void *param, gfloat *val); gint holes_raw1(array_f *pdata,void *param, gfloat *val); gint holes_raw2(array_f *pdata,void *param, gfloat *val); gfloat t2d_calc_indx(array_f, Tour_PPIndex_f fun, void *param); gboolean t2d_switch_index(Tour2DCPanel, gint, displayd *, ggobid *); ggobi-2.1.12/src/defines.h0000644000175000017500000001436114651527764010750 /*-- defines.h --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_DEFINES_H #define GGOBI_DEFINES_H #include /* Needed for ViewTypes. Can be moved. */ /* defines.h */ /* External/public routines in the API should use this to generate a suitable prefix for their name to avoid name-space pollution and symbol conflicts. (e.g. GGOBI(setData) */ #define GGOBI(a) GGobi_##a #define false 0 #define true 1 #define off 0 #define on 1 #define HORIZONTAL 0 #define VERTICAL 1 #define MSGBUFLEN 512 #define NDISPLAYTYPES 3 extern const gchar* const ViewTypes[NDISPLAYTYPES]; extern const gint ViewTypeIndices[NDISPLAYTYPES]; /*-- used in movepts --*/ enum directiond {both, vertical, horizontal}; enum idtargetd {identify_points, identify_edges}; /* display options */ /* When these change, update display.c and RSggobi/RSGGobi.c accordingly */ #define DOPT_POINTS 0 #define DOPT_AXES 1 #define DOPT_AXESLAB 2 #define DOPT_AXESVALS 3 #define DOPT_EDGES_U 4 #define DOPT_EDGES_A 5 #define DOPT_EDGES_D 6 #define DOPT_EDGES_H 7 #define DOPT_WHISKERS 8 /* unused #define DOPT_GRIDLINES 5 #define DOPT_MISSINGS 5 #define DOPT_AXES_C 9 #define DOPT_BUFFER 10 #define DOPT_LINK 11 */ /* modes */ /* Former viewmodes: typedef enum {NULLMODE = -1 P1PLOT, XYPLOT, TOUR1D, TOUR2D3, TOUR2D, COTOUR, SCALE, BRUSH, IDENT, EDGEED, MOVEPTS, SCATMAT, PCPLOT, EXTENDED_DISPLAY_MODE, NMODES} PipelineMode; */ typedef enum {NULL_PMODE = -1, DEFAULT_PMODE, P1PLOT, /* d, D */ XYPLOT, /* x, X */ TOUR1D, /* t, T */ TOUR2D3, /* r, R */ TOUR2D, /* g, G */ COTOUR, /* c, C */ EXTENDED_DISPLAY_PMODE, N_PMODES} ProjectionMode; typedef enum {NULL_IMODE = -1, DEFAULT_IMODE, SCALE, /* s, S */ BRUSH, /* b, B */ IDENT, /* i, I */ EDGEED, /* e, E */ MOVEPTS, /* m, M */ EXTENDED_DISPLAY_IMODE, N_IMODES} InteractionMode; /* */ #define TEXTURE 0 #define ASH 1 #define DOTPLOT 2 #define FORWARD 1 #define BACKWARD -1 /* * cycling */ #define NOFIXED 0 #define XFIXED 1 #define YFIXED 2 #define MAXNCOLS 500 #define COLLABLEN 25 #define ROWLABLEN 50 /* * EXP1: Raw data are scaled to -2^EXP1, +2^EXP1 * EXP2: Trigonometric coefficients are scaled up by 2^EXP2 to do * integer math. * PRECISION: 2^EXP2 */ #define EXP1 14 #define EXP2 13 #define PRECISION1 16384 #define PRECISION2 8192 /*-- spacing for the control panels --*/ #define VBOX_SPACING 5 /*-- touring --*/ #define VAR_CIRCLE_DIAM 36 #define MIN_NVARS_FOR_COTOUR 3 /* require: 3 in subset, 2 active */ /* at least 1 vert, at least 1 horiz */ #define MIN_NVARS_FOR_TOUR2D 3 /* require: 3 in subset, 2 active */ #define MIN_NVARS_FOR_TOUR1D 2 /* require: 2 in subset, 1 active */ #define MIN_NVARS_FOR_TOUR2D3 3 /* exactly 3 in subset, 3 active */ /*#define TOURSTEP0 0.003*/ #define TOURSTEP0 0.102 /* corresponds to slidepos=50 */ #define TOUR_LS_IN 0 #define TOUR_LS_OUT 1 #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 #endif #define MANIP_OFF 0 #define MANIP_OBLIQUE 1 #define MANIP_VERT 2 #define MANIP_HOR 3 #define MANIP_RADIAL 4 #define MANIP_ANGULAR 5 #define CMANIP_OFF 0 #define CMANIP_COMB 1 #define CMANIP_VERT 2 #define CMANIP_HOR 3 #define CMANIP_EQUAL 4 #define TOUR_RANDOM 0 #define TOUR_PP 1 /*-- projection pursuit indices --*/ /*#define NATURAL_HERMITE 0 #define HERMITE 1 #define CENTRAL_MASS 2 #define HOLES 3 #define SKEWNESS 4 #define LEGENDRE 5 #define FTS 6 #define ENTROPY 7 #define BIN_FTS 8 #define BIN_ENTROPY 9 #define SUBD 10 #define LDA 11 #define CART_GINI 12 #define CART_ENTROPY 13 #define CART_VAR 14 #define PCA 15*/ /* Used in parallel coordinates displays */ typedef enum {ARRANGE_ROW, ARRANGE_COL} ParCoordsArrangeMode; #define DEFINES_H /*-- transformation --*/ #define N0TFORMS 4 #define NO_TFORM0 0 #define RAISE_MIN_TO_0 1 #define RAISE_MIN_TO_1 2 #define NEGATE 3 #define N1TFORMS 5 #define NO_TFORM1 0 #define BOXCOX 1 #define LOG10 2 #define INVERSE 3 #define ABSVALUE 4 #define SCALE_AB 5 #define N2TFORMS 8 #define NO_TFORM2 0 #define STANDARDIZE 1 #define SORT 2 #define RANK 3 #define NORMSCORE 4 #define ZSCORE 5 #define DISCRETE2 6 /* * identification */ #define STICKY_TOGGLE 0 #define STICKY_ADD 1 #define STICKY_REMOVE 2 enum {ID_RECORD_ID = 1 << 3, ID_RECORD_LABEL = 1 << 2, ID_RECORD_NO = 1 << 1, ID_VAR_LABELS = 1 << 0}; /* * jittering */ #define JITFAC .2 #define UNIFORM 0 #define NORMAL 1 /* * scaling */ #define SCALE_DEFAULT 0.7 #define TOUR_SCALE_DEFAULT 0.6 #define SCALE_MIN 0.02 #define SCALE_SCROLL_INC 0.1 #define DRAG 0 #define CLICK 1 #define PAN 0 #define ZOOM 1 #define ZOOM_IN 0 #define ZOOM_OUT 1 #define P_HORIZ 0 #define P_VERT 1 #define P_OBLIQUE 2 #define Z_ASPECT 0 #define Z_HORIZ 1 #define Z_VERT 2 #define Z_OBLIQUE 3 /*-- color by variable --*/ #define WVIS_EQUAL_WIDTH_BINS 0 #define WVIS_EQUAL_COUNT_BINS 1 #define WVIS_UPDATE_ON_MOUSE_UP 0 #define WVIS_UPDATE_CONTINUOUSLY 1 /*-- --*/ /*-- variable notebook columns --*/ enum { VARLIST_NAME, VARLIST_INDEX, VARLIST_NCOLS }; /*-- macros --*/ #define EVENT_METHOD(i,x) GTK_OBJECT_GET_CLASS(GTK_OBJECT(i))->x #define BETWEEN(a,b,x) ( ((a)<=(x) && (x)<=(b)) || ((a)>=(x) && (x)>=(b)) ) typedef enum { C, R, SPLUS, PERL, PYTHON } ProgrammingLanguage; #if GTK_CHECK_VERSION(2,8,0) && defined CAIRO_HAS_GLITZ_SURFACE //#define ENABLE_CAIRO 1 #endif #endif /* End of conditional definition. */ ggobi-2.1.12/src/brush_api.c0000644000175000017500000000231314651527764011274 /*-- brush-api.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /*-- move brush and paint --*/ void GGOBI (moveBrush) (gint ulx, gint uly, ggobid * gg) { splotd *sp = gg->current_splot; displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; icoords pos; pos.x = ulx; pos.y = uly; brush_motion (&pos, true, false, cpanel, sp, gg); } /*-- resize brush without painting --*/ void GGOBI (sizeBrush) (gint width, gint height, splotd * sp, ggobid * gg) { brush_coords *brush_pos = &sp->brush_pos; brush_pos->x2 = brush_pos->x1 + width; brush_pos->y2 = brush_pos->y1 + height; splot_redraw (sp, QUICK, gg); } ggobi-2.1.12/src/GGobiEvents.h0000644000175000017500000000451214651527764011504 /* GGobiEvents.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_EVENTS_H #define GGOBI_EVENTS_H /* The CHECK_EVENT_SIGNATURE is for testing routines used with g_signal_connect. The CHECK_R_EVENT_SIGNATURE is for testing routines used with g_signal_connect_object. Similarly, the ggev_r_... are for the routines used with g_signal_connect_object. */ typedef void (*ggev_datad_added_f)(ggobid *, GGobiData *, void *); typedef void (*ggev_brush_motion_f)(ggobid *, splotd *, GdkEventMotion *ev, GGobiData *, void*); typedef void (*ggev_r_brush_motion_f)(void *, splotd *, GdkEventMotion *ev, GGobiData *, ggobid *); typedef void (*ggev_move_point_f)(ggobid *, splotd *, gint, GGobiData *, void*); typedef void (*ggev_r_move_point_f)(void*, splotd *, gint, GGobiData *, ggobid *); typedef void (*ggev_identify_point_f)(ggobid *, splotd *, gint, GGobiData *, void*); typedef void (*ggev_select_variable_f)(ggobid *, GGobiData *, gint, splotd *, void*); typedef void (*ggev_splot_new_f)(ggobid *, splotd *, void*); typedef void (*ggev_r_splot_new_f)(void *, splotd *, ggobid *); typedef void (*ggev_variable_added_f)(ggobid *, vartabled*, gint, GGobiData *, void*); typedef void (*ggev_variable_list_changed_f)(ggobid *, GGobiData *, void*); typedef void (*ggev_sticky_point_added_f)(ggobid *, gint, gint, GGobiData *, void*); typedef void (*ggev_sticky_point_removed_f)(ggobid *, gint, gint, GGobiData *, void*); typedef void (*ggev_clusters_changed_f)(ggobid *, GGobiData *, void *); #ifdef CHECK_EVENT_SIGNATURES #ifdef __GNUC__ #define UNUSED_ATTR __attribute__ ((unused)) #else #define UNUSED_ATTR #endif #define CHECK_EVENT_SIGNATURE(x,y) static ggev_##y __check ## x ## y UNUSED_ATTR = & x; #define CHECK_R_EVENT_SIGNATURE(x,y) static ggev_r_##y __check ## x ## y UNUSED_ATTR = & x; #else #define CHECK_EVENT_SIGNATURE(x,y) #endif #endif ggobi-2.1.12/src/testEvents.h0000644000175000017500000000174314651527764011477 #ifndef GGOBI_TEST_EVENTS_H #define GGOBI_TEST_EVENTS_H #include "ggobi.h" void test_variable_select(ggobid *gg, GGobiData *d, gint whichVar, splotd *sp, void *); /*void test_variable_select(GtkWidget *w, gint whichVar, GGobiData *d, splotd *sp, ggobid *gg, char *val); */ /* void test_point_move_cb(void *userData, splotd *sp, GdkEventMotion *ev, ggobid *gg); */ void test_point_move_cb(void *userData, splotd *sp, gint which, GGobiData *d, ggobid *gg); /* void test_new_plot_cb(void *userData, GtkWidget *mainWin, splotd *sp, ggobid *gg); */ void test_new_plot_cb(void *userData, splotd *sp, ggobid *gg); #if 1 void test_brush_motion_cb(void *userData, splotd *sp, GdkEventMotion *ev, GGobiData *d, ggobid *gg); #else void test_brush_motion_cb(char *userData, ggobid *gg, splotd *sp, GdkEventMotion *ev, GtkWidget *w); #endif void test_data_add_cb(ggobid *, GGobiData *d, gpointer data); void test_sticky_points(ggobid *gg, int index, int state, GGobiData *d, gpointer data); #endif ggobi-2.1.12/src/tour2d_ui.c0000644000175000017500000005647614651527764011257 /* tour2d_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" #include "tour.h" extern TourPPIndex StandardPPIndices[]; /* This function initializes the tour variables - it should only be called more than once, when a new tour is started since a new subset of variable might be used, or when there is new data. */ void cpanel_t2d_init (cpaneld *cpanel, ggobid *gg) { cpanel->t2d.paused = false; cpanel->t2d.local_scan = false; cpanel->t2d.stepping = false; cpanel->t2d.backtracking = false; cpanel->t2d.step = TOURSTEP0; cpanel->t2d.ls_dir = TOUR_LS_IN; cpanel->t2d.path_len = 1.; cpanel->t2d.slidepos = sessionOptions->defaultTourSpeed;/* If this is changed, it needs to be changed in th cpanel_tour2d_make routine also. */ cpanel->t2d.manip_mode = MANIP_OBLIQUE; cpanel->t2d.pp_indx = 0; /* Corresponds to the HOLES */ cpanel->t2d.ppindex = StandardPPIndices[0]; } void cpanel_tour2d_set (displayd *display, cpaneld *cpanel, ggobid* gg) /* * To handle the case where there are multiple scatterplots * which may have different tour options and parameters selected */ { GtkWidget *w, *btn; GtkWidget *pnl = mode_panel_get_by_name(GGOBI(getPModeName)(TOUR2D), gg); GtkAdjustment *adj; /*-- speed --*/ w = widget_find_by_name (pnl, "TOUR2D:speed_bar"); adj = gtk_range_get_adjustment (GTK_RANGE (w)); gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), cpanel->t2d.slidepos); /*-- paused --*/ btn = widget_find_by_name (pnl, "TOUR2D:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), cpanel->t2d.paused); /*-- manual manip --*/ w = widget_find_by_name (pnl, "TOUR2D:manip"); if (w) gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->t2d.manip_mode); /*-- PC axes --*/ /*-- backtracking --*/ /*-- local scan --*/ /*-- path len... --*/ } static void speed2d_set_cb (GtkAdjustment *adj, ggobid *gg) { tour2d_speed_set(adj->value, gg); } static void tour2d_pause_cb (GtkToggleButton *button, ggobid *gg) { displayd *dsp = gg->current_display; tour2d_pause (&dsp->cpanel, button->active, dsp, gg); } static void reinit_cb (GtkWidget *w, ggobid *gg) { tour2d_reinit(gg); } static void scramble_cb (GtkWidget *w, ggobid *gg) { tour2d_scramble(gg); } /*static void pcaxes_cb (GtkToggleButton *button) { g_printerr ("pcaxes: %d\n", button->active); }*/ static void t2d_snap_cb (GtkWidget *w, ggobid *gg) { tour2d_snap(gg); } static void t2d_video_cb (GtkToggleButton *button, ggobid *gg) { tour2d_video(gg); } /*static void pcaxes_cb (GtkToggleButton *button) { g_printerr ("pcaxes: %d\n", button->active); }*/ static void tour2dpp_cb (GtkWidget *w, ggobid *gg) { tour2dpp_window_open (gg); } #ifdef TOUR_ADV_IMPLEMENTED static void tour2dadv_cb (GtkWidget *w, ggobid *gg) { tour2dadv_window_open (gg); } #endif static gchar *manip_lbl[] = {"Off", "Oblique", "Vert", "Horiz", "Radial", "Angular"}; static void manip_cb (GtkWidget *w, ggobid *gg) { displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; splotd *sp = gg->current_splot; cpanel->t2d.manip_mode = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); if (cpanel->t2d.manip_mode == MANIP_OFF) splot_cursor_unset (sp); else splot_cursor_set (GDK_HAND2, sp); } void cpanel_tour2d_make (ggobid *gg) { modepaneld *panel; GtkWidget *box, *btn, *sbar, *lbl, *vb; GtkObject *adj; GtkWidget *manip_opt; /*GtkWidget *tgl;*/ panel = (modepaneld *) g_malloc(sizeof(modepaneld)); gg->control_panels = g_list_append(gg->control_panels, (gpointer) panel); panel->name = g_strdup(GGOBI(getPModeName)(TOUR2D)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /* * speed scrollbar */ /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ adj = gtk_adjustment_new (sessionOptions->defaultTourSpeed, 0.0, MAX_TOUR_SPEED, 1.0, 1.0, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (speed2d_set_cb), (gpointer) gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_widget_set_name (sbar, "TOUR2D:speed_bar"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust speed of tour motion", NULL); scale_set_default_values (GTK_SCALE (sbar)); gtk_box_pack_start (GTK_BOX (panel->w), sbar, false, false, 1); /* * Box to hold 'pause' toggle button */ box = gtk_hbox_new (true, 1); btn = gtk_check_button_new_with_mnemonic ("_Pause"); gtk_widget_set_name (btn, "TOUR2D:pause_button"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Stop tour motion temporarily (keyboard shortcut: w)", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (tour2d_pause_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * Box to hold 'Reinit' toggle and 'Scramble' button */ box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic("_Reinit"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection to first two active variables", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (reinit_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_button_new_with_mnemonic ("Scr_amble"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection to random value", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (scramble_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * snapshot and video stream controls box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic ("_Snap"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Take a snapshot of this frame to re-generate plot outside ggobi", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (t2d_snap_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_check_button_new_with_mnemonic ("Vid_eo"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Save sequence of projection frames out to file", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (t2d_video_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); */ /* * manipulation option menu and label inside vbox */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Manual manipulation:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); manip_opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), manip_opt); gtk_widget_set_name (manip_opt, "TOUR2D:manip"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), manip_opt, "Set the manual manipulation method", NULL); gtk_box_pack_end (GTK_BOX (vb), manip_opt, false, false, 0); populate_combo_box (manip_opt, manip_lbl, G_N_ELEMENTS(manip_lbl), G_CALLBACK(manip_cb), (gpointer) gg); /* * PC Axes toggle */ /* tgl = gtk_check_button_new_with_label ("PC axes"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Show principal component axes or plain variable axes", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (pcaxes_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (panel->w), tgl, false, false, 1); */ /* * projection pursuit button */ btn = gtk_button_new_with_mnemonic ("Pro_jection pursuit ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for grand tour projection pursuit. Requires selected variables to be sphered (see the tools menu).", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tour2dpp_cb), gg); /* * advanced features button */ #ifdef TOUR_ADV_IMPLEMENTED btn = gtk_button_new_with_mnemonic ("Advanced _features ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for additional grand tour features", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tour2dadv_cb), gg); #endif gtk_widget_show_all (panel->w); } /*----------------------------------------------------------------------*/ /* Advanced features panel and callbacks */ /*----------------------------------------------------------------------*/ /* The following are considered advanced features for now: local tour step/go tour interpolation methods (geodesic, HH, Givens) path length history section tour */ #ifdef TOUR_ADV_IMPLEMENTED static void tour2dadv_window_open (ggobid *gg); static GtkWidget *window = NULL; static gchar *pathlen_lbl[] = {"1/10", "1/5", "1/4", "1/3", "1/2", "1", "2", "10", "Infinite"}; static void pathlen_cb (GtkWidget *w, ggobid *gg) { gint indx = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); g_printerr ("cbd: %s\n", pathlen_lbl[indx]); } static gchar *interp_lbl[] = {"Geodesic", "Householder", "Givens"}; static void interp_cb (GtkWidget *w, ggobid *gg) { gint indx = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); g_printerr ("cbd: %s\n", interp_lbl[indx]); } static void localscan_cb (GtkToggleButton *button) { g_printerr ("local scan: %d\n", button->active); } static void step_cb (GtkToggleButton *tgl, GtkWidget *btn) { g_printerr ("step: %d\n", tgl->active); gtk_widget_set_sensitive (btn, tgl->active); } static void go_cb (GtkButton *button, ggobid *gg) { displayd *dsp = gg->current_display; tour2d_do_step (dsp, gg); } static void storebases_cb (GtkToggleButton *button) { g_printerr ("store bases: %d\n", button->active); } /* * Section callbacks */ static void section_cb (GtkToggleButton *button) { g_printerr ("local scan: %d\n", button->active); } static void epsilon_cb (GtkAdjustment *adj, gpointer cbd) { g_printerr ("epsilon %f\n", adj->value); } static void hide_cb (GtkWidget *w ) { gtk_widget_hide (w); } #endif #ifdef TOUR_ADV_IMPLEMENTED static void tour2dadv_window_open (ggobid *gg) { GtkWidget *vbox, *box, *btn, *opt, *tgl, *entry; GtkWidget *pathlen_opt, *vb, *hb, *lbl, *sbar, *notebook; GtkObject *adj; if (window == NULL) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Advanced Tour"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Create a new notebook, place the position of the tabs */ notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); gtk_container_add (GTK_CONTAINER (window), notebook); /*-- vbox to be placed in the notebook page --*/ vbox = gtk_vbox_new (false, 2); gtk_container_set_border_width (GTK_CONTAINER (vbox), 4); /*-- local scan toggle --*/ tgl = gtk_check_button_new_with_mnemonic ("_Local scan"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Perform the tour within a small local region", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (localscan_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (vbox), tgl, false, false, 1); /*-- Box to hold 'step' toggle and 'go' button --*/ box = gtk_hbox_new (true, 2); tgl = gtk_check_button_new_with_mnemonic ("_Step"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Prepare to run the grand tour one step at a time", NULL); gtk_box_pack_start (GTK_BOX (box), tgl, true, true, 1); btn = gtk_button_new_with_mnemonic ("_Go"); gtk_widget_set_sensitive (btn, false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Take one step of the grand tour", NULL); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (go_cb), (gpointer) gg); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (step_cb), GTK_WIDGET (btn)); gtk_box_pack_start (GTK_BOX (vbox), box, false, false, 1); lbl = gtk_label_new_with_mnemonic ("_General"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, lbl); /*-- path length option menu inside frame --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 0); lbl = gtk_label_with_mnemonic ("Path _length:"); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); pathlen_opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), pathlen_opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), pathlen_opt, "Set the path length", NULL); gtk_box_pack_end (GTK_BOX (hb), pathlen_opt, false, false, 0); populate_combo_box (pathlen_opt, pathlen_lbl, G_N_ELEMENTS(pathlen_lbl), G_CALLBACK(pathlen_cb), gg); /*-- interpolation option menu inside hbox --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Interpolation: "); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Set the interpolation method", NULL); gtk_box_pack_end (GTK_BOX (hb), opt, false, false, 0); populate_combo_box (opt, interp_lbl, G_N_ELEMENTS(interp_lbl), G_CALLBACK(interp_cb), gg); /*-- tour history functions: vbox to be placed in the notebook page --*/ vb = gtk_vbox_new (true, 0); gtk_container_set_border_width (GTK_CONTAINER (vb), 4); lbl = gtk_label_new_with_mnemonic ("_History"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vb, lbl); /*-- Store bases toggle --*/ tgl = gtk_check_button_new_with_mnemonic ("_Store bases"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Store basis vectors", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (storebases_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (vb), tgl, false, false, 0); /*-- Number of bases stored; a label and a text entry --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); llbl = gtk_label_new_with_mnemonic ("_Number of bases stored:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- Number of bases stored; a label and a text entry --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Current base pair: "); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_start (GTK_BOX (hb), entry, false, false, 0); entry = gtk_entry_new (); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- Return to basis x --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); tgl = gtk_check_button_new_with_mnemonic ("_Return to basis"); gtk_box_pack_start (GTK_BOX (hb), tgl, false, false, 0); entry = gtk_entry_new (); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- Display basis as bitmap --*/ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 0); tgl = gtk_check_button_new_with_mnemonic ("_Display basis"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Display basis as bitmap", NULL); gtk_box_pack_start (GTK_BOX (hb), tgl, false, false, 0); entry = gtk_entry_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "Enter bitmap number", NULL); gtk_widget_set_usize (entry, gdk_string_width (entry->style->font, "XXXX"), -1); gtk_box_pack_end (GTK_BOX (hb), entry, false, false, 0); /*-- section tour widgets: vbox to be placed in the notebook page --*/ box = gtk_vbox_new (false, 0); gtk_container_set_border_width (GTK_CONTAINER (box), 4); lbl = gtk_label_new ("Section"); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), box, lbl); lbl = gtk_label_new_with_mnemonic ("_Section"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Downlight points that are not within epsilon of the center plane", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (section_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (box), tgl, false, false, 1); /*-- vbox for label and rangewidget --*/ vb = gtk_vbox_new (true, 0); gtk_box_pack_start (GTK_BOX (box), vb, false, false, 1); lbl = gtk_label_new_with_mnemonic ("_Epsilon:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); adj = gtk_adjustment_new (1.0, 0.0, 1.0, 0.01, .01, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (epsilon_cb), NULL); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Set the width of the cross-section", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); /*-- Close button --*/ btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect_swapped (G_OBJECT (btn), "clicked", G_CALLBACK(G_CALLBACK) (hide_cb), (GtkObject*) window); gtk_box_pack_start (GTK_BOX (vbox), btn, false, true, 2); } gtk_widget_show_all (window); } #endif /*----------------------------------------------------------------------*/ /* I/O events */ /*----------------------------------------------------------------------*/ /*-- called from the Options menu --*/ void tour2d_io_cb (GtkWidget *w, gpointer *cbd) { /* gchar *lbl = (gchar *) cbd; g_printerr ("cbd: %s\n", lbl); */ } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget *w, GdkEventKey *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ if (event->keyval == GDK_w || event->keyval == GDK_W) { /*-- turn pause on and off --*/ GtkWidget *pnl = mode_panel_get_by_name(GGOBI(getPModeName)(TOUR2D), gg); GtkWidget *pause_button = NULL; pause_button = widget_find_by_name (pnl, "TOUR2D:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_button), !cpanel->t2d.paused); return true; } return false; } static gint motion_notify_cb (GtkWidget *w, GdkEventMotion *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); gboolean button1_p, button2_p; mousepos_get_motion (w, event, &button1_p, &button2_p, sp); /*-- if neither button is pressed, we shouldn't have gotten the event --*/ if (!button1_p && !button2_p) return false; tour2d_manip(sp->mousepos.x, sp->mousepos.y, sp, gg); return true; } static gint button_press_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { ggobid *gg = GGobiFromWidget(w, true); displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; gboolean button1_p, button2_p; mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); if (cpanel->t2d.manip_mode != MANIP_OFF) { sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK(motion_notify_cb), (gpointer) sp); tour2d_manip_init(sp->mousepos.x, sp->mousepos.y, sp); } return true; } static gint button_release_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { gboolean retval = true; GdkModifierType state; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); tour2d_manip_end(sp); gdk_pointer_ungrab (event->time); return retval; } void tour2d_event_handlers_toggle (splotd *sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), "key_press_event", G_CALLBACK(key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK(button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK(button_release_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); } } ggobi-2.1.12/src/ggobiClass.h0000644000175000017500000000030014651527764011374 #include "tsdisplay.h" #include "parcoordsClass.h" #include "barchartDisplay.h" #include "scatterplotClass.h" #include "scatmatClass.h" void registerDisplayTypes(GTypeLoad *loaders, int n); ggobi-2.1.12/src/xlines.c0000644000175000017500000001121114651527764010617 /*-- from the graphics gems code --*/ #include #define true 1 #define false 0 /* lines_intersect: AUTHOR: Mukesh Prasad * * This function computes whether two line segments, * respectively joining the input points (x1,y1) -- (x2,y2) * and the input points (x3,y3) -- (x4,y4) intersect. * If the lines intersect, the output variables x, y are * set to coordinates of the point of intersection. * * All values are in integers. The returned value is rounded * to the nearest integer point. * * If non-integral grid points are relevant, the function * can easily be transformed by substituting floating point * calculations instead of integer calculations. * * Entry * x1, y1, x2, y2 Coordinates of endpoints of one segment. * x3, y3, x4, y4 Coordinates of endpoints of other segment. * * Exit * x, y Coordinates of intersection point. * * The value returned by the function is one of: * * DONT_INTERSECT 0 * DO_INTERSECT 1 * COLLINEAR 2 * * Error conditions: * * Depending upon the possible ranges, and particularly on 16-bit * computers, care should be taken to protect from overflow. * * In the following code, 'long' values have been used for this * purpose, instead of 'int'. * */ #define DONT_INTERSECT 0 #define DO_INTERSECT 1 #define COLLINEAR 2 /************************************************************** * * * NOTE: The following macro to determine if two numbers * * have the same sign, is for 2's complement number * * representation. It will need to be modified for other * * number systems. * * * **************************************************************/ #define SAME_SIGNS( a, b ) \ (((glong) ((gulong) a ^ (gulong) b)) >= 0 ) /*-- not interested in the intersection point --*/ gint lines_intersect ( glong x1, glong y1, glong x2, glong y2, /* First line segment */ glong x3, glong y3, glong x4, glong y4) /* Second line segment */ /*glong *x, glong *y)*/ /* Output value: * point of intersection */ { glong a1, a2, b1, b2, c1, c2; /* Coefficients of line eqns. */ glong r1, r2, r3, r4; /* 'Sign' values */ glong denom; /* Intermediate values */ /* Compute a1, b1, c1, where line joining points 1 and 2 * is "a1 x + b1 y + c1 = 0". */ a1 = y2 - y1; b1 = x1 - x2; c1 = x2 * y1 - x1 * y2; /*-- Compute r3 and r4. --*/ r3 = a1 * x3 + b1 * y3 + c1; r4 = a1 * x4 + b1 * y4 + c1; /* Check signs of r3 and r4. If both point 3 and point 4 lie on * same side of line 1, the line segments do not intersect. */ if (r3 != 0 && r4 != 0 && SAME_SIGNS( r3, r4 )) return ( DONT_INTERSECT ); /* Compute a2, b2, c2 */ a2 = y4 - y3; b2 = x3 - x4; c2 = x4 * y3 - x3 * y4; /* Compute r1 and r2 */ r1 = a2 * x1 + b2 * y1 + c2; r2 = a2 * x2 + b2 * y2 + c2; /* Check signs of r1 and r2. If both point 1 and point 2 lie * on same side of second line segment, the line segments do * not intersect. */ if ( r1 != 0 && r2 != 0 && SAME_SIGNS( r1, r2 )) return ( DONT_INTERSECT ); /* Line segments intersect: compute intersection point. */ denom = a1 * b2 - a2 * b1; if ( denom == 0 ) return ( COLLINEAR ); /* The denom/2 is to get rounding instead of truncating. It * is added or subtracted to the numerator, depending upon the * sign of the numerator. */ /* glong num, offset; offset = denom < 0 ? - denom / 2 : denom / 2; num = b1 * c2 - b2 * c1; *x = ( num < 0 ? num - offset : num + offset ) / denom; num = a2 * c1 - a1 * c2; *y = ( num < 0 ? num - offset : num + offset ) / denom; */ return ( DO_INTERSECT ); } /* lines_intersect */ gboolean isCrossed(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy) { /* Check whether line segment [a,b] crosses segment [c,d]. Fast method due to Amie Wilkinson. */ double determinant, b1, b2; bx -= ax; by -= ay; cx -= ax; cy -= ay; dx -= ax; dy -= ay; determinant = dx*cy - dy*cx; if (determinant == 0.) return false; b1 = (cy*bx - cx*by)/determinant; if (b1 <= 0.) return false; b2 = (dx*by - dy*bx)/determinant; if (b2 <= 0.) return false; if (b1+b2 <= 1.) return false; return true; } ggobi-2.1.12/src/ash1d.c0000644000175000017500000001276614651527764010335 /* * Copyright 1986 David W. Scott */ #include /*#include #include */ #include #include #include #define true 1 #define false 0 #ifndef iabs #define iabs(x) ((x) >= 0 ? (x) : -(x)) #endif #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #endif /* functions */ #ifdef __cplusplus extern "C" { #endif gint bin1 (gfloat *, gint, gfloat *, gint, gint *); gint ash1 (gint, gint *, gint, gfloat *, gfloat *, gfloat *, gfloat *, gfloat *); gint do_ash1d (gfloat * vals, gint nvals, gint nbins, gint n_ashes, gfloat * ashed_vals, gfloat * lims_min, gfloat * lims_max, gfloat * mean); #ifdef __cplusplus } #endif /* */ gint do_ash1d (gfloat * vals, gint nvals, gint nbins, gint n_ashes, gfloat * ashed_vals, gfloat * lims_min, gfloat * lims_max, gfloat * mean) { gint i, k, icheck; gint *bins; gfloat min, max, ab[2]; gfloat sum; /* for computing nicerange -- extending the range */ gfloat del, beta = 0.2; /* for ash1 */ gint ash_return; gfloat *f, *t, *w; /* w = weights */ gfloat kopt[] = { 2.0, 2.0 }; /* S function default values for kernel options */ gfloat binwidth; /* for generating the interpolated values to plot */ gfloat ti; bins = (gint *) g_malloc (nbins * sizeof (gint)); min = max = vals[0]; for (i = 1; i < nvals; i++) { min = MIN (min, vals[i]); max = MAX (max, vals[i]); } del = ((max - min) * beta) / 2.0; ab[0] = min - del; ab[1] = max + del; icheck = bin1 (vals, nvals, ab, nbins, bins); w = (gfloat *) g_malloc (n_ashes * sizeof (gfloat)); /* weights */ t = (gfloat *) g_malloc (nbins * sizeof (gfloat)); f = (gfloat *) g_malloc (nbins * sizeof (gfloat)); ash_return = ash1 (n_ashes, bins, nbins, ab, kopt, t, f, w); binwidth = (ab[1] - ab[0]) / (gfloat) nbins; *lims_min = INT_MAX; *lims_max = -1 * INT_MAX; sum = 0; for (i = 0; i < nvals; i++) { ti = (vals[i] - ab[0]) / binwidth - .5; k = (gint) ti; ashed_vals[i] = f[k + 1] * (ti - (gfloat) k) + f[k] * ((gfloat) k + 1 - ti); /* without interpolation */ /* ashed_vals[i] = f[(int) ffloor((vals[i] - ab[0]) / binwidth)]; */ *lims_min = MIN (ashed_vals[i], *lims_min); *lims_max = MAX (ashed_vals[i], *lims_max); sum += ashed_vals[i]; } *mean = sum / (gfloat) nvals; /* Scale onto [0,100] *//*-- ggobi will handle the scaling --*/ /* for (i=0; i= 1 && k <= nbin) nc[k] += 1; else nskip += 1; } return nskip; } /* c April 8, 1986 c c Computer ASH density estimate; Quartic (biweight) kernel c Average of "m" shifted histograms c c Bin counts in array "nc(nbin)" - from routine "bin1" c "nbin" bins are formed over the interval [a,b) c c ASH estimates returned in array "f(nbin)" c c FP-ASH plotted at a+d/2 ... b-d/2 where d = (b-a)/nbin c c Note: If "nskip" was nonzero, ASH estimates incorrect near boundary c Note: Should leave "m" empty bins on each end of array "nc" so f OK c ##### Copyright 1986 David W. Scott */ gint ash1 (gint m, gint * nc, gint nbin, gfloat * ab, gfloat * kopt, gfloat * t, gfloat * f, gfloat * w) { /* nc(nbin), ab(2), t(nbin), f(nbin), w(m), kopt(2) */ gfloat a, b, delta, cons, c, h; gint i, k, n; gint ier = 0; a = ab[0]; b = ab[1]; n = 0; /* * compute weights cons * ( 1-abs((i/m))^kopt1)^kopt2 * -- should sum to "m" 5-8-91 * w-array shifted by 1 */ /* * cons = sum of weights from -(m-1) to (m-1) = 1 + 2 (sum from 1 to m-1) */ w[0] = 1.0; cons = 1.0; for (i = 1; i < m; i++) { gdouble dtmp = pow ((gdouble) i / (gdouble) m, (gdouble) kopt[0]); w[i] = (gfloat) pow (1.0 - dtmp, (gdouble) kopt[1]); cons += 2 * w[i]; } cons = (gfloat) m / cons; for (i = 0; i < m; i++) { w[i] *= cons; } /* * check if estimate extends beyond mesh */ for (i = 0; i < m; i++) { if (nc[i] + nc[nbin - 1 - i] > 0) { ier = 1; } } /* * compute ash(m) estimate */ delta = (b - a) / (gfloat) nbin; h = (gfloat) m *delta; for (i = 0; i < nbin; i++) { t[i] = a + ((gfloat) i + 0.5) * delta; f[i] = 0.0; n += nc[i]; } for (i = 0; i < nbin; i++) { if (nc[i] == 0) continue; c = (gfloat) nc[i] / ((gfloat) n * h); for (k = MAX (0, i - (m - 1)); k < MIN (nbin - 1, i + m); k++) { f[k] += (c * w[iabs (k - i)]); } } /* * This is indeed a density, it integrates to 1: that is, * summing the areas = 1 * * sum_i ( binwidth * f[i] ) = 1 */ return ier; } ggobi-2.1.12/src/ggobi.h0000644000175000017500000004025314651527764010421 /*-- ggobi.h --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_H #define GGOBI_H #ifdef WIN32 #define GGOBI_EXPORT __declspec(dllexport) #else #define GGOBI_EXPORT #endif #ifdef __cplusplus extern "C" { #endif struct _ggobid; #include #include "defines.h" #include "types.h" #include "brushing.h" #include "display.h" #include "display_tree.h" #include "read_init.h" #include "fileio.h" #include "colorscheme.h" /* These are hooks for other applications (e.g. R) to facilitate callbacks at a higher level that GTK events/signals. This one is used for responding to identifying points. */ typedef void (*IdentifyProc) (void *user_data, gint id, splotd * sp, GtkWidget * w, ggobid * gg); typedef struct { IdentifyProc handler; void *user_data; } IdentifyHandler; /* This is a typedef that is used for registering a routine for handling presses of the numbered keys 0, 1, ..., 9. It gets the events from the regular event handler and also the key identifier. See scatterplot_event_handled() in splot.c. The idea is that people can register routines in a programming language interface to ggobi such as Rggobi, or the Perl or Python interfaces, and provide customized callbacks/handlers for the numbered keys. Note that if you register a handler for any of these keys, you have to handle them all (i.e. 0, ..., 9). You can discard the ones you are not interested in. In the future, we may set it up so that one can refuse to handle an event and return false and have the scatterplot_event_handled() then process it in the default way. Also, one can register an intermediate handler which looks up a table for key-specific handlers for each the 0, .., 9 keys. Then one could register that function with the general ggobi mechanism and provide an interface */ typedef gboolean(*KeyEventHandlerFunc) (guint keyval, GtkWidget * w, GdkEventKey * event, cpaneld * cpanel, splotd * sp, ggobid * gg, void *userData); typedef void (*ReleaseData) (void *userData); /* This is the variable that stores the registered handler */ typedef struct { KeyEventHandlerFunc handlerRoutine; void *userData; char *description; ReleaseData *releaseData; ProgrammingLanguage language; } KeyEventHandler; typedef struct { /*-- ggobi --*/ struct _ggobid *thisGG; GtkAccelGroup *sp_accel_group; /*-- sp = scatterplot here --*/ } GGobiMenus; typedef struct _PrintOptions PrintOptions; GType ggobi_ggobi_get_type(void); #define GGOBI_TYPE_GGOBI ggobi_ggobi_get_type() #define GGOBI_GGOBI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_GGOBI, ggobid)) #define GGOBI_GGOBI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_GGOBI, GGobiGGobiClass)) #define GGOBI_IS_GGOBI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_GGOBI)) #define GGOBI_IS_GGOBI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_GGOBI)) #define GGOBI_GGOBI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_GGOBI, GGobiGGobiClass)) typedef struct _GGobiGGobiClass { GObjectClass parent_class; } GGobiGGobiClass; /** @defgroup ggobid the ggobid instance structure. @brief This is the top-level structure representing a ggobi instance. */ struct _ggobid { GObject object; /** A tree */ DisplayTree display_tree; GList *displays; displayd *current_display; splotd *current_splot; gint buttondown;/*-- can be 0, 1, 2, or 3; could be useful in drawing --*/ GGobiMenus app; GSList *d; /* Datasets (datad elements) */ /*-- first is default: cases, nodes; second might be edges --*/ /* main_ui */ GtkWidget *current_control_panel; GList *control_panels; GtkWidget *main_window, *main_menubar; GtkUIManager *main_menu_manager; GtkWidget *display_menu; /*-- menu labelled 'Window' --*/ GtkAccelGroup *main_accel_group, *pmode_accel_group, *imode_accel_group; GtkWidget *pmode_item, *imode_item; GtkWidget *imode_frame; /* this should be cpanel_frame, actually */ GtkTooltips *tips; gboolean firsttime; guint mode_merge_id; /* status bar in main console window */ void (*status_message_func) (gchar *, ggobid *); gboolean statusbar_p; gboolean close_pending; #ifdef EXPLICIT_IDENTIFY_HANDLER IdentifyHandler identify_handler; #endif /*--------------------------------------------------------------------*/ /* reading in the data */ /*--------------------------------------------------------------------*/ InputDescription *input; /* Information about input files for the default data source, such as the name of the file, directory, data mode, extension, etc. */ /*----------------------- pipeline ---------------------------------*/ ProjectionMode pmode, pmode_prev; InteractionMode imode, imode_prev; struct _VarTableUI { GtkWidget *window; GtkWidget *notebook; } vartable_ui; gboolean lims_use_visible; /*--------------- clusters: hiding, excluding ----------------------*/ struct _ClusterUI { GtkWidget *window; GtkWidget *notebook; } cluster_ui; /*---------------- brushing by categorical variable ----------------*/ gboolean linkby_cv; /*--------------------------------------------------------------------*/ /* color */ /*--------------------------------------------------------------------*/ GdkGC *rectangle_GC; GdkColor mediumgray, lightgray, darkgray; /* for 3d rectangles */ GdkColor vcirc_freeze_color, vcirc_manip_color; /* for variable circles */ gshort color_id, color_0; /* 0:ncolors-1 */ gboolean mono_p; struct _Color_UI { GtkWidget *symbol_window; GtkWidget *symbol_display, *line_display; GtkWidget *colorseldlg; GtkWidget *bg_da, *accent_da, *hidden_da, *fg_da[MAXNCOLORS], *current_da; gint spacing; gint margin; /* between glyphs in the symbol_display */ } color_ui; /*---------------------- graphics contexts -----------------------------*/ GdkGC *plot_GC; GdkGC *selvarfg_GC, *selvarbg_GC; /* white background, thick lines */ GdkGC *unselvarfg_GC, *unselvarbg_GC; /* grey background, thin lines */ GdkGC *manipvarfg_GC; /* white background, thin purple line */ /*--------------------------- jittering --------------------------------*/ struct _JitterUI { GtkWidget *window; } jitter_ui; /*------------------------- writing out data ---------------------------*/ struct _Save { GtkWidget *tree_view; gint format, stage, row_ind, column_ind, missing_ind; gboolean jitter_p, edges_p; } save; /*---------------------- 1d plotting -----------------------------------*/ struct _P1D { /*-- cycling --*/ gint cycle_id; GtkAdjustment *cycle_delay_adj; /*-- texture --*/ gfloat *gy; } p1d; /*-------------------- 2d plotting -----------------------------------*/ struct _XYPlot { /*-- cycling --*/ gint cycle_id; GtkAdjustment *cycle_delay_adj; } xyplot; /*---------------------- touring -------------------------------------*/ #ifndef NEW_TOUR_CLASSES struct _Tour2d3 { gint idled; } tour2d3; struct _Tour2d { gint idled; gboolean fade_vars; gboolean all_vars; } tour2d; struct _Tour1d { gint idled; gboolean fade_vars; gboolean all_vars; } tour1d; struct _TourCorr { gint idled; gboolean fade_vars; } tourcorr; #else #endif /*-------------------- parallel coordinates --------------------------*/ struct _Parcoords { GtkAccelGroup *accel_group; GtkWidget *arrangement_box; } parcoords; /*---------------------time series------------------------------------*/ /*XX */ struct _TSPLOT { GtkAccelGroup *accel_group; GtkWidget *arrangement_box; } tsplot; /*------------------------ brushing ----------------------------------*/ glyphd glyph_id, glyph_0; struct _Brush_UI { gboolean firsttime; } brush; struct _Plot { /* * Part of binning: the corners of the bin to be copied from * pixmap0 to pixmap1. * They're defined in splot_draw_to_pixmap0_binned and used in * splot_pixmap0_to_pixmap1 when binned == true. */ icoords bin0, bin1; icoords loc0, loc1; } plot; /*---------------------- identification ------------------------------*/ /*---------------------- edge editing --------------------------------*/ struct _EdgeEdit { gint a; } edgeedit; /*--------------------- submenu management ---------------------------*/ struct _Main_MiscMenu { GtkWidget *options_item, *options_menu; } menus; /*-------------------- transformation --------------------------------*/ struct _Transformation { GtkWidget *window; GtkAdjustment *boxcox_adj; } tform_ui; struct _Sphere { GtkWidget *window; GtkWidget *scree_da; GdkPixmap *scree_pixmap; GtkObject *npcs_adj; GtkWidget *stdized_entry, *variance_entry, *condnum_entry; GtkWidget *apply_btn, *restore_btn; GtkWidget *tree_view; /*-- a pointer to be compared with current_display->d --*/ GGobiData *d; } sphere_ui; /*-------------------- subsetting ------------------------------------*/ struct _SubsetUI { GtkWidget *window; GtkWidget *notebook; } subset_ui; /*---------------- color scheme selection -------------------------------*/ struct _SchemeChooser { GtkWidget *window, *entry_preview, *entry_applied, *da; GdkPixmap *pix; colorschemed *scheme; /*-- current color scheme --*/ GdkGC *GC; gfloat *pct; gint npct; } svis; /*---------------- brushing by weights -------------------------------*/ struct _WeightedVis { GtkWidget *window, *da; GdkPixmap *pix; GdkGC *GC; gfloat *pct; gint npct; gint *n; /*-- number of points that will take on each color --*/ gint nearest_color; gint motion_notify_id; icoords mousepos; gint binning_method; gint update_method; } wvis; /*-------------------- scaling ---------------------------------------*/ // Delete struct _Scale { rectd click_rect; } scale; /*-------------------- imputation ------------------------------------*/ struct _Impute { gboolean bgroup_p; gint whichvars; GtkWidget *window; ImputeType type; /* GtkWidget *notebook; GtkWidget *entry_above, *entry_below, *entry_val; */ } impute; /*-------------------- moving points ---------------------------------*/ struct _MovePts { gboolean cluster_p; enum directiond direction; gcoords eps; } movepts; /*----------------- variable selection panel -------------------------*/ struct _Varpanel_ui { GtkWidget *notebook; gboolean layoutByRow; } varpanel_ui; KeyEventHandler *NumberedKeyEventHandler; PrintOptions *printOptions; GList *pluginInstances; GList *colorSchemes; colorschemed *activeColorScheme; GSList *pmodeRadioGroup; GSList *imodeRadioGroup; void *userData;/** A place to hang data for a host application, plugin, etc. Since plugins, etc. may also use this, we might want a hashtable here similar to pthread's thread-specific data. */ }; /* ggobid; */ #include "read_init.h" typedef enum { GGOBI_SILENT, GGOBI_CHATTY, GGOBI_VERBOSE } GGobiOutputLevel; /** @defgroup SessionOptions Session Options @brief This is used to store store values from the command line arguments which can be used in subsequent code. */ typedef struct { /** @ingroup SessionOptions Controls whether messages explaining what is being done internally are displayed. */ GGobiOutputLevel verbose; /** @ingroup SessionOptions The default format for the data being read. */ DataMode data_mode; gchar *data_type; /** @ingroup SessionOptions The name of the data file containing the data. */ gchar *data_in; /** @ingroup SessionOptions The command line arguments used to start ggobi. */ gchar **cmdArgs; /** @ingroup SessionOptions The number of command line arguments used to start ggobi. */ gint numArgs; /** @ingroup SessionOptions A logical value controlling whether the control window of a ggobi instance is displayed. This can be used to hide the control window when ggobi is embedded in other applications. */ gboolean showControlPanel; /** @ingroup SessionOptions Data for the initialization settings. */ struct _GGobiInitInfo *info; /** @ingroup SessionOptions The name of the initialization file from which to read any session parameters not specified on the command line. */ gchar *initializationFile; /** @ingroup SessionOptions The collection of color schemes read available to ggobi, typically specified in the initialization file. */ GList *colorSchemes; /** @ingroup SessionOptions The name of the active color scheme, indexing the list of colorSchemes. */ gchar *activeColorScheme; gchar *restoreFile; GSList *pluginFiles; /** Directory in which the GGobi files are located. */ gchar *ggobiHome; gfloat defaultTourSpeed; gfloat defaultTour1dSpeed; gboolean useRadioMenuItems; } GGobiOptions; /** Information about move and identify events in ggobi reported to listeners. */ typedef struct { GGobiData *d; int id; } GGobiPointMoveEvent; GSList* read_input(InputDescription * desc, ggobid * gg); void start_ggobi(ggobid * gg, gboolean init_data, gboolean createPlot); void process_initialization_files(); extern GGobiOptions *sessionOptions; /** Identifiers for the different signal types generated by ggobi */ typedef enum { DATAD_ADDED_SIGNAL, VARIABLE_ADDED_SIGNAL, /*-- not using this one presently --*/ VARIABLE_LIST_CHANGED_SIGNAL, /*-- this works for variable lists --*/ SPLOT_NEW_SIGNAL, BRUSH_MOTION_SIGNAL, POINT_MOVE_SIGNAL, IDENTIFY_POINT_SIGNAL, VARIABLE_SELECTION_SIGNAL, STICKY_POINT_ADDED_SIGNAL, STICKY_POINT_REMOVED_SIGNAL, CLUSTERS_CHANGED_SIGNAL, /*-- ggvis wants this --*/ DISPLAY_NEW_SIGNAL, DISPLAY_SELECTED_SIGNAL, MAX_GGOBI_SIGNALS } GGobiSignalType; /** Registered signal identifiers for the ggobi signals. Indexed by the enum above. */ extern guint GGobiSignals[MAX_GGOBI_SIGNALS]; /** Should be in edges.h, if there were one. */ GGobiData *setDisplayEdge(displayd * dpy, GGobiData * e); gchar *getOptValue(const char *const name, const char *const value); const char *getCommandLineArgValue(const char *name); void showHelp(); #ifdef __cplusplus extern "C" { #endif void globals_init(ggobid * gg); guint getGGobiSignal(GGobiSignalType); GSList *GGOBI(getExtendedDisplayTypes)(); #ifdef __cplusplus } #endif void gtk_marshal_NONE__INT_POINTER_POINTER_POINTER(GtkObject * object, GtkSignalFunc func, gpointer func_data, GtkArg * args); extern GSList *ExtendedDisplayTypes; typedef GType(*GTypeLoad) (void); gchar* ggobi_find_data_file(const gchar *name); gchar* ggobi_find_config_file(const gchar *name); GList *getInputPluginSelections(ggobid *gg); extern const gchar *DefaultUnknownInputModeName; InputDescription * fileset_generate(const gchar * fileName, const gchar *modeName, GGobiPluginInfo *plugin, ggobid * gg); #include "GGobiEvents.h" #include "GGobiApp.h" GGobiApp *getGGobiApp(); #ifdef __cplusplus } /* end of extern "C" */ #endif #endif ggobi-2.1.12/src/externs.h0000644000175000017500000013062414651527764011024 /* externs.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_S_H #define GGOBI_S_H #include #ifndef DEFINES_H #include "defines.h" #endif #include "barchartDisplay.h" #ifdef __cplusplus extern "C" { #endif GtkWidget * mode_panel_get_by_name(const gchar *, ggobid *); InteractionMode imode_get(ggobid *); /* this should probably also change */ ProjectionMode pmode_get(displayd *, ggobid *); void pmode_set_cb (GtkWidget *widget, gint action); void imode_set_cb (GtkWidget *widget, gint action); void main_miscmenus_update (ProjectionMode, InteractionMode, displayd *, ggobid *gg); void viewmode_set(ProjectionMode, InteractionMode, ggobid *); gint GGOBI(full_viewmode_set)(ProjectionMode, InteractionMode, ggobid*); RedrawStyle brush_activate (gboolean, displayd *, splotd *, ggobid *); RedrawStyle edgeedit_activate (gboolean state, displayd *display, ggobid *gg); RedrawStyle identify_activate (gint, displayd *, ggobid *); RedrawStyle p1d_activate (gint, displayd *, ggobid *); RedrawStyle imode_activate (splotd *, ProjectionMode, InteractionMode, gboolean, ggobid *); RedrawStyle xyplot_activate (gint, displayd *, ggobid *); /* reverse pipeline */ void pt_screen_to_plane (icoords *screen, gint id, gboolean horiz, gboolean vert, gcoords *eps, gcoords *planar, splotd *sp); void pt_plane_to_world (splotd *sp, gcoords *planar, gcoords *eps, greal *world); void pt_world_to_raw_by_var (gint j, greal *world, greal *raw, GGobiData *d); /* sort -t":" -k1.12 */ gboolean array_contains (gint* arr, gint n, gint el); void edgeedit_init (ggobid * gg); GtkWidget* CreateMenuCheck (GtkWidget *, gchar *, GtkSignalFunc, gpointer, gboolean, ggobid *); GtkWidget* CreateMenuItem (GtkWidget *, gchar *, gchar *, gchar *, GtkWidget *, GtkAccelGroup *, GtkSignalFunc, gpointer, ggobid *) ; GtkWidget* CreateMenuItemWithCheck (GtkWidget *, gchar *, gchar *, gchar *, GtkWidget *, GtkAccelGroup *, GtkSignalFunc, gpointer, ggobid *, GSList *, gboolean check) ; ggobid* GGobiFromDisplay (displayd *display); ggobid* GGobiFromSPlot (splotd *sp); ggobid* GGobiFromWidget (GtkWidget *w, gboolean); ggobid* GGobiFromWindow (GdkWindow *w); void GGobi_addToolAction (GtkActionEntry *entry, gpointer *data, ggobid *gg); GtkWidget* GGobi_addToolsMenuItem (gchar *label, ggobid *gg); gboolean GGobi_addToolsMenuWidget(GtkWidget *entry, ggobid *gg); void GGobi_widget_set (GtkWidget *, ggobid *gg, gboolean isWindow); GGobiData* ValidateDatadRef (GGobiData *d, ggobid *gg, gboolean fatal); displayd* ValidateDisplayRef(displayd *d, ggobid *gg, gboolean fatal); ggobid* ValidateGGobiRef (ggobid *gg, gboolean fatal); #ifdef STORE_SESSION_ENABLED xmlNodePtr XML_addVariable(xmlNodePtr node, gint j, GGobiData *d); #endif void addvar_propagate (gint ncols_prev, gint ncols_added, GGobiData *); gint alloc_optimize0_p (optimize0_param *op, gint nrows, gint ncols, gint ndim); gint alloc_pp (pp_param *pp, gint nrows, gint ncols, gint ndim); gboolean array_contains (gint* arr, gint n, gint el); void arrayd_add_cols (array_d *, gint); void arrayd_add_rows (array_d *, gint); void arrayd_alloc (array_d *, gint, gint); void arrayd_alloc_zero (array_d *, gint, gint); void arrayd_copy (array_d *, array_d *); void arrayd_delete_cols (array_d *, gint, gint *); void arrayd_free (array_d *, gint, gint); void arrayd_init_null (array_d *); void arrayd_zero (array_d *); void arrayf_add_cols (array_f *, gint); void arrayf_add_rows (array_f *, gint); void arrayf_alloc (array_f *, gint, gint); void arrayf_alloc_zero (array_f *, gint, gint); void arrayf_copy (array_f *, array_f *); void arrayf_delete_cols (array_f *, gint, gint *); void arrayf_free (array_f *, gint, gint); void arrayf_init_null (array_f *); void arrayf_zero (array_f *); void arrayg_add_cols (array_g *, gint); void arrayg_add_rows (array_g *, gint); void arrayg_alloc (array_g *, gint, gint); void arrayg_alloc_zero (array_g *, gint, gint); void arrayg_delete_cols (array_g *, gint, gint *); void arrayg_free (array_g *, gint, gint); void arrayg_init_null (array_g *); void arrayg_zero (array_g *); void arrayl_add_cols (array_l *, gint); void arrayl_add_rows (array_l *, gint); void arrayl_alloc (array_l *, gint, gint); void arrayl_alloc_zero (array_l *, gint, gint); void arrayl_delete_cols (array_l *, gint, gint *); void arrayl_free (array_l *, gint, gint); void arrayl_init_null (array_l *); void arrayl_zero (array_l *); void arrays_add_cols (array_s *, gint); void arrays_add_rows (array_s *, gint); void arrays_alloc (array_s *, gint, gint); void arrays_alloc_zero (array_s *, gint, gint); void arrays_delete_cols (array_s *, gint, gint *); void arrays_free (array_s *, gint, gint); void arrays_init_null (array_s *); void arrays_zero (array_s *); void ash_baseline_set (icoords *, splotd *sp); void assign_points_to_bins (GGobiData *, splotd *, ggobid *); gboolean bizarro_update_hidden_vectors (gint i, gboolean changed, gboolean *hit_by_brush, GGobiData *d, ggobid *gg); void br_color_ids_add (GGobiData *d, ggobid *gg); void br_color_ids_alloc (GGobiData *); void br_color_ids_init (GGobiData *); gboolean br_edge_vectors_check_size (gint, GGobiData *, ggobid *); void br_glyph_ids_add (GGobiData *d, ggobid *gg); void br_glyph_ids_alloc (GGobiData *); void br_glyph_ids_init (GGobiData *); void br_hidden_alloc (GGobiData *); void br_hidden_init (GGobiData *); void brush_draw_brush (splotd *, GdkDrawable *, GGobiData *, ggobid *); void brush_draw_label (splotd *, GdkDrawable *, GGobiData *, ggobid *); void brush_event_handlers_toggle (splotd *, gboolean); void brush_init (GGobiData *, ggobid *); gboolean brush_motion (icoords *, gboolean, gboolean, cpaneld *, splotd *, ggobid *); void brush_on_set (gboolean, displayd *, ggobid *); gboolean brush_once (gboolean force, splotd *, ggobid *); gboolean brush_once_and_redraw (gboolean binningp, splotd *sp, displayd *display, ggobid *gg); void brush_pos_init (splotd *); void brush_prev_vectors_update (GGobiData *, ggobid *); void brush_reset(displayd *display, gint action); void brush_set_pos (gint, gint, splotd *); void brush_undo (splotd *, GGobiData *, ggobid *); void brush_update_set (gboolean, displayd *, ggobid *); gboolean build_symbol_vectors_by_var (cpaneld *, GGobiData *, ggobid *); gdouble calc_norm (gdouble *, gint); gint checkLevelValue(vartabled *vt, gdouble value); gboolean checkequiv(gdouble **u0, gdouble **u1, gint nc, gint nd); void clone_vars (gint *cols, gint ncols, GGobiData *); void cluster_free (gint, GGobiData *, ggobid *); void cluster_table_labels_update (GGobiData *d, ggobid *gg); void cluster_table_update (GGobiData *, ggobid *); void cluster_window_open (ggobid *); void clusters_set (GGobiData *, ggobid *); void collab_tform_update (gint j, GGobiData *d); gboolean colors_remap (colorschemed *scheme, gboolean force, ggobid *gg); void colorscheme_init (colorschemed *scheme); gchar* computeTitle (gboolean, displayd *, ggobid *); void copy_mat(gdouble **, gdouble **, gint, gint); void cpanel_brush_init (cpaneld *, ggobid *); void cpanel_brush_make (ggobid *); void cpanel_brush_set (displayd *, cpaneld *, ggobid *); void cpanel_ctour_make (ggobid *); void cpanel_edgeedit_init (cpaneld *, ggobid *); void cpanel_edgeedit_make (ggobid *); void cpanel_edgeedit_set (displayd *, cpaneld *, ggobid *); void cpanel_identify_init (cpaneld *, ggobid *); void cpanel_identify_make (ggobid *); void cpanel_identify_set (displayd *, cpaneld *, ggobid *); void cpanel_movepts_make (ggobid *); void cpanel_p1d_init (cpaneld *, ggobid *); void cpanel_p1d_set (displayd *, cpaneld *, ggobid *); void cpanel_p1dplot_make (ggobid *); GtkWidget *cpanel_parcoords_make (ggobid *); void cpanel_parcoords_set (displayd *, cpaneld *, GtkWidget *panel, ggobid *); void cpanel_scale_init (cpaneld *, ggobid *); void cpanel_scale_make (ggobid *); void cpanel_scale_set (displayd *, cpaneld *, ggobid *); GtkWidget *cpanel_scatmat_make (ggobid *); void cpanel_scatmat_set (displayd *, cpaneld *, ggobid *); void cpanel_set (displayd *, ggobid *); void cpanel_show (gboolean show, ggobid *gg); void cpanel_t1d_init (cpaneld *, ggobid *); void cpanel_t2d3_init (cpaneld *, ggobid *); void cpanel_t2d_init (cpaneld *, ggobid *); void cpanel_tcorr_init (cpaneld *, ggobid *); void cpanel_tour1d_make (ggobid *); void cpanel_tour1d_set (displayd *, cpaneld *, ggobid *); void cpanel_tour2d3_make (ggobid *); void cpanel_tour2d3_set (displayd *, cpaneld *, ggobid *); void cpanel_tour2d_make (ggobid *); void cpanel_tour2d_set (displayd *, cpaneld *, ggobid *); void cpanel_tourcorr_set (displayd *, cpaneld *, ggobid *); void cpanel_xyplot_init (cpaneld *, ggobid *); void cpanel_xyplot_make (ggobid *); void cpanel_xyplot_set (displayd *, cpaneld *, ggobid *); displayd * createDisplayFromDescription (ggobid *, GGobiDisplayDescription *desc); GtkWidget* create_variable_notebook (GtkWidget *box, GtkSelectionMode mode, vartyped vtype, datatyped dtype, GtkSignalFunc func, gpointer func_data, ggobid *); typedef const gchar ** (*GGobiVariableNotebookPrefixFunc) (GtkWidget *notebook, GGobiData *d, gint *sel_prefix, gint *n_prefices); GtkWidget* create_prefixed_variable_notebook (GtkWidget *box, GtkSelectionMode mode, vartyped vtype, datatyped dtype, GtkSignalFunc func, gpointer func_data, ggobid *, GGobiVariableNotebookPrefixFunc prefix_func); void ctour_event_handlers_toggle (splotd *, gboolean); void ctourpp_window_open (ggobid *); colorschemed* default_scheme_init (); gushort datad_colors_used_get (gint *ncolors_used, gushort *colors_used, GGobiData *, ggobid *); void datad_free (GGobiData *, ggobid *); GGobiData* datad_get_from_notebook (GtkWidget *notebook, ggobid *); displayd* datad_init (GGobiData *, ggobid *, gboolean); void datad_record_id_add (gchar *ids, GGobiData *d); void datad_record_id_add (gchar *ids, GGobiData *d); gint delete_vars (gint *, gint, GGobiData *); void disconnect_button_press_signal (splotd *sp); void disconnect_button_release_signal (splotd *sp); void disconnect_key_press_signal (splotd *sp); void disconnect_scroll_signal (splotd *sp); void disconnect_motion_signal (splotd *sp); gint display_add(displayd *display, ggobid *); displayd* display_alloc_init (gboolean, GGobiData *, ggobid *); void display_close (displayd *d); gboolean display_copy_edge_options (displayd *dsp, displayd *dspnew); void display_delete_cb (GtkWidget *, GdkEvent *, displayd *); void display_free (displayd *, gboolean force, ggobid *); void display_free_all (ggobid *); void display_mode_menus_update (ProjectionMode, InteractionMode, displayd *, ggobid *); void display_menu_build (ggobid *); void display_menu_init (ggobid *); void display_new (ggobid *, guint action, GtkWidget *widget); void display_plot (displayd *display, RedrawStyle type, ggobid *); void display_print (displayd *d); void display_set_current (displayd *, ggobid *); void display_set_position (windowDisplayd *d, ggobid *gg); GtkUIManager *display_menu_manager_create(displayd *d); void show_display_control_panel (displayd *display); void display_tailpipe (displayd *, RedrawStyle, ggobid *); void display_tour1d_init (displayd *dsp, ggobid *gg); void display_tour1d_init_null (displayd *dsp, ggobid *gg); void display_tour2d3_init (displayd *, ggobid *); void display_tour2d3_init_null (displayd *, ggobid *); void display_tour2d_init (displayd *dsp, ggobid *gg); void display_tour2d_init_null (displayd *dsp, ggobid *gg); void display_tourcorr_init (displayd *dsp, ggobid *gg); void display_tourcorr_init_null (displayd *dsp, ggobid *gg); gboolean display_type_handles_projection (displayd *, ProjectionMode); gboolean display_type_handles_interaction (displayd *, InteractionMode); void display_window_init (windowDisplayd *, gint, gint, gint, ggobid *); void displays_plot (splotd *, RedrawStyle, ggobid *); void displays_tailpipe (RedrawStyle, ggobid *); void set_display_options(displayd *display, ggobid *gg); void set_display_option(gboolean active, guint action, displayd *display); gint do_ash1d (gfloat *, gint, gint, gint, gfloat *, gfloat *, gfloat *, gfloat *); void do_last_increment (vector_f, vector_f, gfloat, gint); void draw_3drectangle (GtkWidget *w, GdkDrawable *drawable, gint x, gint y, gint width, gint height, ggobid *gg); void draw_glyph (GdkDrawable *, glyphd *, icoords *, gint, ggobid *); gint dsvd (gdouble **a, gint m, gint n, gfloat *w, gdouble **v); /* pango utils */ void layout_text(PangoLayout *layout, const gchar *text, PangoRectangle *rect); void underline_text(PangoLayout *layout); ProjectionMode pmode_get(displayd *, ggobid *); InteractionMode imode_get(ggobid *); gboolean edge_add (gint, gint, gchar *, gchar *, GGobiData *, GGobiData *, ggobid *); gboolean edge_endpoints_get (gint k, gint *a, gint *b, GGobiData *d, endpointsd *endpoints, GGobiData *e); void edgeedit_event_handlers_toggle (splotd *, gboolean); void edges_alloc (gint, GGobiData *); void edges_free (GGobiData *, ggobid *); gboolean edgeset_add (displayd *); void edgeset_add_cb (GtkAction *action, GGobiData *e); gint edgesets_count (ggobid *gg); void eigenvals_get (gfloat *, GGobiData *); gboolean exclude_link_by_id (gint k, GGobiData *source_d, ggobid *gg); gint fcompare (const void *x1, const void *x2); gint icompare (const void *x1, const void *x2); gint scompare (const void *x1, const void *x2); void filename_get_r (ggobid *); void filename_get_w (GtkWidget *, ggobid *); GSList* fileset_read (const gchar *, const gchar *modeName, GGobiPluginInfo *, ggobid *); gboolean fileset_read_init (const gchar *ldata_in, const gchar *, GGobiPluginInfo *, ggobid *); void find_glyph_type_and_size (gint, glyphd *); gint find_keepers (gint ncols_current, gint nc, gint *cols, gint *keepers); gint find_nearest_edge (splotd *sp, displayd *display, ggobid *gg); gint find_nearest_point (icoords *, splotd *, GGobiData *, ggobid *); gint free_optimize0_p (optimize0_param *op); gint free_pp (pp_param *pp); GList* g_list_remove_nth (GList *, gint); GList* g_list_replace_nth (GList *, gpointer, gint); gint getPreviousDisplays(xmlNodePtr node, GGobiDescription *desc); GtkWidget* get_tree_view_from_object (GObject *); void get_extended_brush_corners (icoords *, icoords *, GGobiData *, splotd *); gint get_one_selection_from_tree_view (GtkWidget *tree_view, GGobiData *d); gint* get_selections_from_tree_view (GtkWidget *, gint *); void select_tree_view_row(GtkWidget *tree_view, gint row); gint tree_selection_get_selected_row(GtkTreeSelection *tree_sel); void gg_write_to_statusbar (gchar *message, ggobid *gg); ggobid* ggobi_alloc (ggobid *tmp); /*gboolean ggobi_data_set_time_var(GGobiData *d, int which, gboolean value); vartyped ggobi_data_set_var_type(GGobiData *d, int which, vartyped value);*/ gboolean ggobi_file_set_create (gchar *rootname, GGobiData *, ggobid *); ggobid* ggobi_get (gint); gint ggobi_getIndex(ggobid *gg); void ggobi_sleep(guint); void globals_init (ggobid *); gboolean gram_schmidt (gdouble *, gdouble*, gint); void gt_basis (array_d, gint, vector_i, gint, gint); gboolean hasEdgePoints(GGobiData *e, GGobiData *d); void identify_event_handlers_toggle (splotd *, gboolean); gchar * identify_label_fetch (gint k, cpaneld *cpanel, GGobiData *d, ggobid *); void identify_link_by_id (gint k, GGobiData *source_d, ggobid *gg); gboolean impute_fixed (ImputeType, gfloat val, int nvars, gint *vars, GGobiData *, ggobid *); gboolean impute_mean_or_median (gint, gint, gint *, GGobiData *, ggobid *); void impute_random (GGobiData *, gint nvars, gint *vars, ggobid *); void impute_window_open (ggobid *); gboolean in_vector (gint k, gint *vec, gint nels); gint include_hiddens (gboolean include, GGobiData *d, ggobid *gg); void increment_tour(vector_f, vector_f, gfloat, gfloat, gfloat *, gint); void initSessionOptions(int argc, char **argv); void init_plot_GC (GdkWindow *, ggobid *); void init_var_GCs (GtkWidget *, ggobid *); gdouble inner_prod (gdouble *, gdouble *, gint); gboolean isCrossed (gdouble, gdouble, gdouble, gdouble, gdouble, gdouble, gdouble, gdouble); gfloat jitter_randval (gint); void jitter_value_set (gfloat, GGobiData *, ggobid *); void jitter_vars_init (GGobiData *); void jitter_window_open (ggobid *); void limits_adjust (gfloat *, gfloat *); void limits_display_set_by_var (GGobiData *d, gint j, gboolean); void limits_set (GGobiData *, gboolean do_raw, gboolean do_tform, gboolean); void limits_set_by_var (GGobiData *, gint, gboolean do_raw, gboolean do_tform, gboolean); gint lines_intersect (glong, glong, glong, glong, glong, glong, glong, glong); gint lwidth_from_gsize(gint size); gint ltype_from_gtype(gint type); gint set_lattribute_from_ltype(gint, ggobid *); void linkby_current_page_set (displayd *, GtkWidget *w, ggobid *); void linking_method_set (displayd *, GGobiData *, ggobid *); void make_ggobi (GGobiOptions *, gboolean, ggobid *); void make_symbol_window (ggobid *); void make_ui (ggobid *); GlyphType mapGlyphName (const gchar *gtype); void missing_arrays_add_cols (GGobiData *d); void missings_datad_cb (GtkWidget *w, ggobid *gg); gboolean mouseinwindow (splotd *); void mousepos_get_motion (GtkWidget *, GdkEventMotion *, gboolean *, gboolean *, splotd *); void mousepos_get_pressed (GtkWidget *, GdkEventButton *, gboolean *, gboolean *, splotd *); void move_pt (gint id, gint x, gint y, splotd *sp, GGobiData *d, ggobid *); void movepts_event_handlers_toggle (splotd *, gboolean); void movepts_history_add (gint id, splotd *sp, GGobiData *, ggobid *); void movepts_history_delete_last (GGobiData *, ggobid *); gint ndatad_with_vars_get (ggobid *gg); void newvar_add_with_values (gdouble *, gint, gchar *, vartyped type, gint nlevels, gchar **level_names, gint *level_values, gint *level_counts, GGobiData * d); void norm (gdouble *, gint); GtkWidget* create_menu_bar (GtkUIManager *, const gchar *, GtkWidget *); void p1d_event_handlers_toggle (splotd *, gboolean); void p1d_reproject (splotd *, greal **, GGobiData *, ggobid *); gboolean p1d_varsel (splotd *, gint, gint *, gint, gint); gint p1dcycle_func (ggobid *gg); void pan_by_drag (splotd *, ggobid *); void parcoords_cpanel_init (cpaneld*, ggobid *); const gchar *parcoords_mode_ui_get(displayd *dsp); displayd* parcoords_new_with_vars (gboolean, gboolean, gint, gint *, GGobiData *, ggobid *); displayd* parcoords_new (displayd *dpy, gboolean, gboolean, gint, gint *, GGobiData *, ggobid *); void parcoords_reset_arrangement (displayd *, gint, ggobid *); gboolean parcoords_varsel (cpaneld *, splotd *, gint, gint *, ggobid *); void parcoordsDragAndDropEnable(displayd *dsp, gboolean active); gint parse_command_line (gint *argc, gchar **av); gboolean pca_calc (GGobiData *, ggobid *); void pca_diagnostics_set (GGobiData *d, ggobid *); gint pcompare (const void *, const void *); void pipeline_arrays_alloc (GGobiData *, ggobid *); void pipeline_arrays_check_dimensions (GGobiData *d); void pipeline_arrays_free (GGobiData *d, ggobid *); void pipeline_init (GGobiData *, ggobid *); gint plotted_cols_get (gint *, GGobiData *, ggobid *); gboolean point_in_which_bin (gint, gint, gint *, gint *, GGobiData *, splotd *); void populate_combo_box (GtkWidget *, gchar **, gint, GCallback, gpointer); void populate_tree_view(GtkWidget *tree_view, gchar **lbl, gint nitems, gboolean headers, GtkSelectionMode mode, GCallback func, gpointer obj); gboolean processRestoreFile(const gchar * const fileName, ggobid *gg); void procs_activate(gboolean state, ProjectionMode pmode, displayd *display, ggobid *gg); gboolean projection_ok (ProjectionMode m, displayd *display); void quick_message (const gchar * const, gboolean); void quit_ggobi(ggobid *gg); gdouble randvalue (void); void range_unset (ggobid *gg); gboolean reached_target(gfloat, gfloat, gint, gfloat *, gfloat *); gint realloc_optimize0_p(optimize0_param *, gint, vector_i); void recenter_data (gint, GGobiData *, ggobid *); gboolean record_add (eeMode, gint a, gint b, gchar *lbl, gchar *id, gchar **vals, GGobiData * d, GGobiData * e, ggobid *gg); void reinit_transient_brushing (displayd *, ggobid *); void rejitter (gint *, gint, GGobiData *, ggobid *); void reset_pp(GGobiData *, gint, gint, ggobid *, void *); void rnorm2 (gdouble *, gdouble *); void rotation_event_handlers_toggle (splotd *, gboolean); void rowlabel_add (gchar *label, GGobiData *d); void rowlabels_alloc (GGobiData *d) ; void rowlabels_free (GGobiData *d); void rows_in_plot_set (GGobiData *d, ggobid *); void ruler_ranges_set (gboolean force, displayd *, splotd *, ggobid *); void ruler_ranges_set_on_realize (splotd *sp, gpointer user_data); void scale_event_handlers_toggle (splotd *, gboolean); void scale_set_default_values (GtkScale *scale); void scale_zoom_reset (displayd *dsp); void scale_pan_reset (displayd *display); void scale_update_set (gboolean, displayd *, ggobid *); void scaling_visual_cues_draw (splotd *, GdkDrawable *, ggobid *); void scatmat_cpanel_init (cpaneld *, ggobid *); displayd* scatmat_new (displayd *, gboolean, gboolean, gint, gint *, gint, gint *, GGobiData *, ggobid *); gboolean scatmat_varsel (GtkWidget *, cpaneld *, splotd *, gint, gint, gint *, gint, gboolean, ggobid *); gboolean scatmat_varsel_simple (cpaneld *, splotd *, gint, gint *, ggobid *); const gchar* scatmat_mode_ui_get(displayd *display); void scatterplot_cpanel_init (cpaneld *, ProjectionMode, InteractionMode, ggobid *); void scatterplot_display_edge_menu_update (displayd *, GtkAccelGroup *accel_group, ggobid *gg); const gchar * scatterplot_mode_ui_get(displayd *display); displayd* scatterplot_new (gboolean, gboolean, splotd *sp, GGobiData *d, ggobid *); void scatterplot_show_hrule (displayd *, gboolean show); void scatterplot_show_rulers (displayd *, gint); void scatterplot_show_vrule (displayd *, gboolean show); gboolean scree_mapped_p (ggobid *); void scree_plot_make (ggobid *); gint selected_cols_get (gint *, GGobiData *d, ggobid *); void showInputDescription(InputDescription *desc, ggobid *gg); void smooth_window_open (ggobid *); void sp_event_handlers_toggle (splotd *, gboolean, ProjectionMode, InteractionMode); void sp_whiskers_make (splotd *, displayd *, ggobid *); void special_colors_init (ggobid *); void speed_set (gfloat, gfloat *, gfloat *); void sphere_condnum_set (gfloat x, ggobid *); void sphere_enable (gboolean sens, ggobid *); void sphere_free (GGobiData *); void sphere_init (GGobiData *); void sphere_npcs_range_set (gint n, ggobid *gg); void sphere_npcs_set (gint, GGobiData *, ggobid *); void sphere_panel_open (ggobid *); void sphere_varcovar_set (GGobiData *, ggobid *); void sphere_variance_set (gfloat x, GGobiData *, ggobid*); void spherevars_set (ggobid *); void spherize_data (vector_i *svars, vector_i *pcvars, GGobiData *, ggobid *); gboolean spherize_set_pcvars (GGobiData *, ggobid *); void splash_show (ggobid *gg); void splot_add_diamond_cue (gint k, splotd *sp, GdkDrawable *drawable, ggobid *gg); void splot_add_edge_highlight_cue (splotd *, GdkDrawable *, gint k, gboolean nearest, ggobid *); void splot_add_edge_label (splotd *, GdkDrawable *, gint k, gboolean nearest, ggobid *); void splot_add_edgeedit_cues (splotd *, GdkDrawable *, gint k, gboolean nearest, ggobid *); void splot_add_identify_edge_cues (splotd *sp, GdkDrawable *drawable, gint k, gboolean nearest, ggobid *gg); void splot_add_point_label (gboolean, gint, gboolean, splotd *, GdkDrawable *, ggobid *); void splot_connect_expose_handler (gint, splotd *); void splot_cursor_set (gint jcursor, splotd *sp); void splot_cursor_unset (splotd *sp); void splot_dimension_set(splotd* sp, gint width, gint height); void splot_draw_tour_axes(splotd *sp, GdkDrawable *, ggobid *); void splot_edges_draw (splotd *sp, gboolean hiddens_p, GdkDrawable *drawable, ggobid *gg); void splot_edges_realloc (gint, splotd *, GGobiData *); gboolean splot_event_handled (GtkWidget *, GdkEventKey *, cpaneld *, splotd *, ggobid *); void splot_expose (splotd *); void splot_free (splotd *, displayd *, ggobid *); void splot_get_dimensions (splotd *, gint *, gint *); splotd* splot_new (displayd *, gint, gint, ggobid *); void splot_pixmap0_to_pixmap1 (splotd *, gboolean, ggobid *); void splot_plane_to_screen (displayd *, cpaneld *, splotd *, ggobid *); gboolean splot_plot_case (gint m, GGobiData *, splotd *, displayd *, ggobid *); void splot_points_realloc (gint, splotd *, GGobiData *); void splot_redraw (splotd *sp, RedrawStyle, ggobid *); void splot_set_current (splotd *, gboolean, ggobid *); void splot_world_to_plane (cpaneld *, splotd *, ggobid *); void splot_zoom (splotd *sp, gfloat xsc, gfloat ysc) ; gint sqdist (gint, gint, gint, gint); void statusbar_show (gboolean show, ggobid *gg); void sticky_id_link_by_id (gint, gint, GGobiData *, ggobid *); void sticky_id_toggle (GGobiData *, ggobid *); gint strToInteger (const gchar *tmp); void submenu_destroy (GtkWidget *); void submenu_insert (GtkWidget *, GtkWidget *, gint); GtkWidget* submenu_make (gchar *, guint, GtkAccelGroup *); void subset_apply (GGobiData *, ggobid *); gboolean subset_block (gint, gint, GGobiData *, ggobid *); gboolean subset_everyn (gint, gint, GGobiData *, ggobid *); void subset_include_all (GGobiData *, ggobid *); gboolean subset_random (gint, GGobiData *, ggobid *); gboolean subset_range (GGobiData *d, ggobid *gg); gboolean subset_rowlab (gchar *, gint pos, gboolean casep, GGobiData *, ggobid *); gboolean subset_sticky (GGobiData *, ggobid *); void subset_window_open (ggobid *); gboolean symbol_link_by_id (gboolean persistentp, gint k, GGobiData *source_d, ggobid *gg); gint symbol_table_populate (GGobiData *d); void symbol_window_redraw (ggobid *); void t1d_clear_ppda (displayd *, ggobid *); void t1d_optimz (gint, gboolean *, gint *, displayd *); void t1d_pp_reinit(displayd *, ggobid *); void t1d_ppcool_set(gfloat, displayd *, ggobid *); void t1d_ppdraw(gfloat, displayd *, ggobid *); void t1d_pptemp_set(gfloat, displayd *, ggobid *); void t2d_clear_ppda (displayd *, ggobid *); void t2d_optimz (gint, gboolean *, gint *, displayd *); void t2d_pp_reinit(displayd *, ggobid *); void t2d_ppcool_set(gfloat, displayd *, ggobid *); void t2d_ppdraw (gfloat, displayd *, ggobid *); void t2d_pptemp_set(gfloat, displayd *, ggobid *); void textur (gfloat *, gfloat *, gint, gint, gfloat, gint, ggobid *); void tform_label_update (gint, GGobiData *); void tform_to_world (GGobiData *, ggobid *); void tform_to_world_by_var (gint j, GGobiData *, ggobid *); void tooltips_show (gboolean show, ggobid *gg); void tour1d_all_vars (displayd *); void tour1d_do_step (displayd *,ggobid *); void tour1d_event_handlers_toggle (splotd *, gboolean); void tour1d_fade_vars (gboolean, ggobid *); void tour1d_func (gboolean, displayd *, ggobid *); void tour1d_io_cb (GtkWidget *w, gpointer *cbd); void tour1d_manip (gint, gint, splotd *, ggobid *); void tour1d_manip_end (splotd *); void tour1d_manip_init (gint, gint, splotd *); void tour1d_pause (cpaneld *, gboolean, displayd *, ggobid *); void tour1d_projdata (splotd *, greal **, GGobiData *, ggobid *); void tour1d_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg); void tour1d_reinit (ggobid *); void tour1d_scramble(ggobid *); void tour1d_snap(ggobid *); void tour1d_video(ggobid *); void tour1d_speed_set (gfloat, ggobid *); gboolean tour1d_varsel (GtkWidget *, gint jvar, gint toggle, gint btn, GGobiData *, ggobid *); void tour1d_vert (cpaneld *, gboolean); void tour1dpp_window_open (ggobid *); void tour2d3_event_handlers_toggle (splotd *, gboolean state); void tour2d3_func (gboolean state, displayd *, ggobid *); void tour2d3_manip (gint, gint, splotd *, ggobid *); void tour2d3_manip_end (splotd *); void tour2d3_manip_init (gint, gint, splotd *); void tour2d3_pause (cpaneld *, gint, ggobid *); void tour2d3_projdata (splotd *, greal **world_data, GGobiData *, ggobid *); void tour2d3_reinit (ggobid *); void tour2d3_scramble (ggobid *); void tour2d3_speed_set (gfloat, ggobid *); gboolean tour2d3_varsel (GtkWidget *, gint jvar, gint toggle, gint btn, GGobiData *, ggobid *); void tour2d_all_vars (displayd *); void tour2d_do_step (displayd *,ggobid *); void tour2d_event_handlers_toggle (splotd *, gboolean); void tour2d_fade_vars (gboolean, ggobid *); void tour2d_func (gboolean, displayd *, ggobid *); void tour2d_io_cb (GtkWidget *w, gpointer *cbd); void tour2d_manip (gint, gint, splotd *, ggobid *); void tour2d_manip_end (splotd *); void tour2d_manip_init (gint, gint, splotd *); void tour2d_pause (cpaneld *, gboolean, displayd *, ggobid *); void tour2d_projdata (splotd *, greal **, GGobiData *, ggobid *); void tour2d_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg); void tour2d_reinit (ggobid *); void tour2d_scramble (ggobid *); void tour2d_snap(ggobid *); void tour2d_video(ggobid *); void tour2d_speed_set (gfloat, ggobid *); gboolean tour2d_varsel (GtkWidget *, gint jvar, gint toggle, gint btn, GGobiData *, ggobid *); void tour2dpp_window_open (ggobid *); gint tour_path (array_d, array_d, array_d, gint, gint, array_d, array_d, array_d, vector_f, array_d, array_d, array_d, vector_f, vector_f, gfloat *, gfloat *); void tour_reproject (vector_f, array_d, array_d, array_d, array_d, array_d, gint, gint); void tourcorr_fade_vars (gboolean, ggobid *); void tourcorr_func (gboolean, displayd *, ggobid *); void tourcorr_io_cb (GtkWidget *w, gpointer *cbd); void tourcorr_manip (gint, gint, splotd *, ggobid *); void tourcorr_manip_end (splotd *); void tourcorr_manip_init (gint, gint, splotd *); void tourcorr_pause (cpaneld *, gboolean, ggobid *); void tourcorr_projdata (splotd *, greal **, GGobiData *, ggobid *); void tourcorr_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg); void tourcorr_reinit (ggobid *); void tourcorr_scramble (ggobid *); void tourcorr_snap(ggobid *); void tourcorr_video(ggobid *); void tourcorr_speed_set (gfloat, ggobid *); gboolean tourcorr_varsel (GtkWidget *, gint jvar, gint toggle, gint btn, GGobiData *, ggobid *); void transform (gint, gint, gfloat, gint *, gint, GGobiData *, ggobid *); void transform0_combo_box_set_value (gint, gboolean, GGobiData *, ggobid *); void transform0_values_set (gint, gint, GGobiData *, ggobid *); gboolean transform1_apply (gint, GGobiData *, ggobid *); void transform1_combo_box_set_value (gint, gboolean, GGobiData *, ggobid *); void transform1_values_set (gint, gfloat, gint, GGobiData *, ggobid *); gboolean transform2_apply (gint, GGobiData *, ggobid *); void transform2_combo_box_set_value (gint, gboolean, GGobiData *, ggobid *); void transform2_values_set (gint, gint, GGobiData *, ggobid *); gboolean transform_values_compare (gint, gint, GGobiData *); void transform_values_copy (gint jfrom, gint jto, GGobiData *d); void transform_values_init (vartabled *vt); gboolean transform_variable (gint, gint, gfloat, gint, GGobiData *, ggobid *); void transform_window_open (ggobid *); gboolean update_color_vectors (gint i, gboolean changed, gboolean *hit_by_brush, GGobiData *d, ggobid *gg); gboolean update_glyph_vectors (gint i, gboolean changed, gboolean *hit_by_brush, GGobiData *d, ggobid *gg); gboolean update_hidden_vectors (gint i, gboolean changed, gboolean *hit_by_brush, GGobiData *d, ggobid *gg); void varcircle_label_set (gint jvar, GGobiData *d); void varcircle_label_set (gint, GGobiData *); void varcircles_add (gint ncols, GGobiData *, ggobid *); void varcircles_cursor_set_default (GGobiData *d); void varcircles_delete_nth (gint j, GGobiData *); void varcircles_populate (GGobiData *, ggobid *); void varcircles_refresh (GGobiData *, ggobid *); void varcircles_show (gboolean, GGobiData *, displayd *, ggobid *); void varcircles_visibility_set (displayd *display, ggobid *gg); void variable_notebook_handlers_disconnect (GtkWidget *notebook, ggobid *gg); void variable_notebook_list_changed_cb(ggobid *gg, GGobiData *d, void *notebook); void variable_notebook_subwindow_add (GGobiData *d, GtkSignalFunc func, gpointer func_data, GtkWidget *notebook, vartyped, datatyped, ggobid *gg); void variable_notebook_varchange_cb (ggobid *gg, vartabled *vt, gint which, GGobiData *, void *notebook); void varpanel_clear (GGobiData *, ggobid *); void varpanel_delete_nth (gint jvar, GGobiData *d); void varpanel_label_set (gint, GGobiData *); void varpanel_make (GtkWidget *, ggobid *); void varpanel_populate (GGobiData *, ggobid *); void varpanel_refresh (displayd *, ggobid *); void varpanel_reinit (ggobid *gg); void varpanel_set_sensitive (GGobiData *d, gboolean sensitive_p, ggobid *); void varpanel_show_page (displayd*, ggobid*); void varpanel_tooltips_set (displayd *, ggobid *); GtkWidget* varpanel_widget_get_nth (gint jbutton, gint jvar, GGobiData *d); void varpanel_widgets_add (gint nc, GGobiData *d, ggobid *gg); void vars_stdized_send_event (GGobiData *d, ggobid *gg); void varsel (GtkWidget *w, cpaneld *, splotd *, gint jvar, gint toggle, gint btn, gint alt_mod, gint ctrl_mod, gint shift_mod, GGobiData *, ggobid *); void vartable_alloc (GGobiData *); gint vartable_index_get_by_name(gchar *name, GGobiData *d); gboolean vartable_iter_from_varno(gint var, GGobiData *d, GtkTreeModel **model, GtkTreeIter *iter); gint vartable_varno_from_path(GtkTreeModel *model, GtkTreePath *path); void vartable_cells_set_by_var (gint j, GGobiData *d); GtkWidget* vartable_tree_view_get (ggobid *gg); void vartable_collab_set_by_var (gint, GGobiData *); void vartable_collab_tform_set_by_var (gint j, GGobiData *d); void vartable_copy_var (gint jfrom, gint jto, GGobiData *d); void vartable_element_categorical_init (vartabled *, gint nlevels, gchar **level_names, gint *level_values, gint *level_counts); vartabled *vartable_element_get (gint j, GGobiData *d); vartabled *vartable_element_get_by_name (gchar *collab, GGobiData *d); vartabled* vartable_element_new (GGobiData *d); void vartable_element_remove (gint, GGobiData *); void vartable_init (GGobiData *d); void vartable_limits_set (GGobiData *); void vartable_limits_set_by_var (gint j, GGobiData *d); void vartable_open (ggobid *); void vartable_row_append (gint j, GGobiData *); void vartable_show_page (GGobiData*, ggobid*); void vartable_stats_set (GGobiData *); void vartable_stats_set_by_var (gint j, GGobiData *); void vectorb_alloc (vector_b *, gint); void vectorb_alloc_zero (vector_b *, gint); void vectorb_copy (vector_b *, vector_b *); void vectorb_delete_els (vector_b *vecp, gint nels, gint *els); void vectorb_free (vector_b *); void vectorb_init_null (vector_b *); void vectorb_realloc (vector_b *, gint); void vectorb_realloc_zero (vector_b *, gint); void vectorb_zero (vector_b *vecp); void vectord_alloc (vector_d *, gint); void vectord_alloc_zero (vector_d *, gint); void vectord_delete_els (vector_d *vecp, gint nels, gint *els); void vectord_free (vector_d *); void vectord_init_null (vector_d *); void vectord_realloc (vector_d *, gint); void vectord_zero (vector_d *vecp); void vectorf_alloc (vector_f *, gint); void vectorf_alloc_zero (vector_f *, gint); void vectorf_delete_els (vector_f *vecp, gint nels, gint *els); void vectorf_free (vector_f *); void vectorf_init_null (vector_f *); void vectorf_realloc (vector_f *, gint); void vectorf_zero (vector_f *vecp); void vectorg_alloc (vector_g *, gint); void vectorg_copy (vector_g *, vector_g *); void vectorg_free (vector_g *); void vectorg_init_null (vector_g *); void vectorg_realloc (vector_g *, gint); void vectorg_realloc_zero (vector_g *, gint); void vectori_alloc (vector_i *, gint); void vectori_alloc_zero (vector_i *, gint); void vectori_copy (vector_i *, vector_i *); void vectori_delete_els (vector_i *vecp, gint nels, gint *els); void vectori_free (vector_i *); void vectori_init_null (vector_i *); void vectori_realloc (vector_i *, gint); void vectori_zero (vector_i *vecp); void vectors_copy (vector_s *, vector_s *); void vectors_free (vector_s *); void vectors_init_null (vector_s *); void vectors_realloc (vector_s *, gint); void vectors_realloc_zero (vector_s *, gint); void vt_copy(vartabled *vtf, vartabled *vtt); void vt_init(vartabled *); GtkWidget* widget_find_by_name (GtkWidget *, gchar *); void widget_initialize (GtkWidget *w, gboolean initd); gboolean widget_initialized (GtkWidget *w); void writeall_window_open (ggobid *); void svis_init (ggobid *gg); void svis_window_open (ggobid *gg); gboolean write_csv(const gchar *, ggobid *); void wvis_init (ggobid *gg); void wvis_window_open (ggobid *gg); void xy_reproject (splotd *, greal **, GGobiData *, ggobid *); gint xycycle_func (ggobid *gg); void xyplot_cycle_activate (gboolean state, cpaneld *cpanel, ggobid *gg); void xyplot_event_handlers_toggle (splotd *, gboolean); gboolean xyplot_varsel (splotd *, gint, gint *, gint, gint); void zoom_by_drag (splotd *, ggobid *); /*tsplot functions*/ GtkWidget* cpanel_tsplot_make (ggobid *); void cpanel_tsplot_set (displayd *, cpaneld *, GtkWidget *, ggobid *); void tsplot_cpanel_init (cpaneld*, ggobid *); const gchar* tsplot_mode_ui_get(displayd *display); displayd* tsplot_new (displayd *, gboolean, gboolean, gint, gint *, GGobiData *, ggobid *); displayd *tsplot_new_with_vars (gboolean, gboolean missing_p, gint nvars, gint *vars, GGobiData *d, ggobid *gg) ; void tsplot_reset_arrangement (displayd *, gint, ggobid *); gboolean tsplot_varsel (GtkWidget *, displayd *display, splotd *sp, gint jvar, gint toggle, gint mouse, cpaneld *cpanel, ggobid *gg); void tsplot_whiskers_make (splotd *, displayd *, ggobid *); void zero_tau(vector_f, gint); /* The new way of handling window closures, so that we don't just exit. */ gboolean ggobi_close (ggobid *gg); gint ggobi_remove_by_index (ggobid *gg, gint which); gint ggobi_remove (ggobid *); void subset_init (GGobiData *d, ggobid *gg); displayd *createBarchart(displayd *display, gboolean use_window, gboolean missing_p, splotd * sp, gint var, GGobiData * d, ggobid * gg); void barchart_scaling_visual_cues_draw (splotd *sp, GdkDrawable *drawable, ggobid *gg); gboolean barchart_active_paint_points (splotd *sp, GGobiData *, ggobid *); void barchart_add_bar_cues (splotd *sp, GdkDrawable *drawable, ggobid *gg); void barchart_clean_init (barchartSPlotd *sp); void barchart_cpanel_init (cpaneld *, ggobid *); void barchart_event_handlers_toggle (displayd *, splotd *, gboolean state, ProjectionMode, InteractionMode); void barchart_free_structure (barchartSPlotd *sp); gboolean barchart_identify_bars (icoords mousepos, splotd *sp, GGobiData *d, ggobid *gg); void barchart_init_vectors(barchartSPlotd *sp); const gchar *barchart_mode_ui_get(displayd *display); displayd *barchart_new (gboolean use_window, gboolean missing_p, splotd *sp, GGobiData *d, ggobid *gg); void barchart_recalc_counts (barchartSPlotd *sp, GGobiData *d, ggobid *gg); void barchart_recalc_dimensions (splotd *sp, GGobiData *d, ggobid *gg); void barchart_recalc_group_dimensions (barchartSPlotd *sp, ggobid *gg); gboolean barchart_redraw (splotd *sp, GGobiData *d, ggobid *gg, gboolean binned); void barchart_splot_add_plot_labels (splotd *, GdkDrawable *, ggobid *); GtkWidget* cpanel_barchart_make (ggobid *gg); void cpanel_barchart_set (displayd *, cpaneld *, GtkWidget *panel, ggobid *gg); void barchart_scale_event_handlers_toggle(splotd *sp, gboolean state); displayd *barchart_new_with_vars(gboolean use_window, gboolean missing_p, gint nvars, gint *vars, GGobiData * d, ggobid * gg); #ifdef WIN32 void win32_draw_to_pixmap_binned (icoords *, icoords *, gint, splotd *, gboolean draw_hidden, ggobid *gg); void win32_draw_to_pixmap_unbinned (gint, splotd *, gboolean draw_hidden, ggobid *gg); void win32_drawing_arrays_free (splotd *sp); #endif #ifdef __cplusplus } #endif #include "GGobiAPI.h" #define CHECK_GG(a) ValidateGGobiRef(a, true) /* Made externs for access from display class methods. */ void varpanel_toggle_set_active (gint jbutton, gint jvar, gboolean active, GGobiData *d); GtkWidget *varpanel_widget_set_visible (gint jbutton, gint jvar, gboolean show, GGobiData *d); void display_plot (displayd *display, RedrawStyle type, ggobid *gg); void scatterXYAddPlotLabels(splotd *sp, GdkDrawable *drawable, GdkGC *gc); void scatter1DAddPlotLabels(splotd *sp, GdkDrawable *drawable, GdkGC *gc); gboolean processRestoreFile(const gchar * const fileName, ggobid *gg); void scatterplotMovePointsMotionCb(displayd *display, splotd *sp, GtkWidget *w, GdkEventMotion *event, ggobid *gg); void scatterplotMovePointsButtonCb(displayd *display, splotd *sp, GtkWidget *w, GdkEventButton *event, ggobid *gg); displayd * scatterplot_new_with_vars(gboolean use_window, gboolean missing_p, gint numVars, gint *vars, GGobiData *d, ggobid *gg); gboolean array_contains (gint* arr, gint n, gint el); void ggobiInit(int *argc, char **argv[]); GGobiPluginInfo *readPluginFile(const char * const fileName, GGobiInitInfo *info); gboolean registerPlugin(ggobid *gg, GGobiPluginInfo *plugin); GGobiOptions *GGOBI_getSessionOptions(); #ifdef WIN32 /* needed by transform.c */ extern double erf(double x); extern double erfc(double x); #endif GSList * read_xml(InputDescription *desc, ggobid *gg, GGobiPluginInfo *plugin); GSList * read_csv(InputDescription *desc, ggobid *gg, GGobiPluginInfo *plugin); InputDescription *read_xml_input_description(const char * const fileName, const char * const modeName, ggobid *gg, GGobiPluginInfo *info); InputDescription *read_csv_input_description(const char * const fileName, const char * const modeName, ggobid *gg, GGobiPluginInfo *info); void resetDataMode(); vartabled *vartable_element_get(gint i, GGobiData *d); gboolean parcoords_add_delete_splot(cpaneld *cpanel, splotd *sp, gint jvar, gint *jvar_prev, ggobid *gg, displayd *display); #ifdef ENABLE_CAIRO cairo_t* create_cairo_glitz(GdkDrawable *drawable); #endif #endif ggobi-2.1.12/src/cpanel.h0000644000175000017500000000617714651527764010603 /*-- cpanel.h --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef CPANEL_H #define CPANEL_H #include #include "defines.h" /*-- and defines includes cpanel.h? weird --*/ typedef struct _Tour2DCPanel { gboolean paused; gboolean local_scan; gboolean stepping; gboolean backtracking; gfloat step; gint ls_dir; gfloat path_len; gint pp_indx; gfloat slidepos; gint manip_mode; TourPPIndex ppindex; } Tour2DCPanel; /* * This is at the display, or window, level. Every display type * has one. It captures the state of the control panel -- but * not the variable circles. */ typedef struct { ProjectionMode pmode; InteractionMode imode; /*-- 1d plotting --*/ struct _P1DCpanel { gint type; gint nbins, nASHes; gboolean ASH_add_lines_p; /*-- cycling --*/ gboolean cycle_p; gint cycle_dir; guint32 cycle_delay; } p1d; /*-- xy plotting --*/ struct _XYPlotCpanel { /*-- cycling --*/ gboolean cycle_p; gint cycle_axis; gint cycle_dir; guint32 cycle_delay; } xyplot; /*-- brushing --*/ struct _BrushCpanel { gboolean updateAlways_p; gboolean brush_on_p; gint mode; gint linkby_row; BrushTargetType point_targets, edge_targets; } br; /*-- scaling --*/ struct _ScaleCpanel { gboolean updateAlways_p; gboolean fixAspect_p; /* fix aspect ratio or don't */ struct {gdouble x, y;} zoomval; struct {gdouble x, y;} panval; } scale; /*-- identification --*/ gint id_display_type; enum idtargetd id_target_type; /* points or edges */ /*-- edge editing -- including adding points --*/ eeMode ee_mode; /*-- parallel coordinates --*/ ParCoordsArrangeMode parcoords_arrangement; /* arrange plots in a row or a column */ /*-- time series --*/ /*XX*/ gint tsplot_selection_mode; gint tsplot_arrangement; /* arrange plots in a row or column*/ /*-- barchart --*/ /*XX*/ gint barchart_display_mode; /*-- 2d touring control pane --*/ Tour2DCPanel t2d; /*-- rotation control pane --*/ struct _Tour2D3CPanel { gboolean paused; gfloat step; gfloat slidepos; gint manip_mode; } t2d3; /*-- 1d tour control panel --*/ struct _Tour1DCpanel { gboolean paused; gfloat step; gint nbins, nASHes; gboolean vert; gint pp_indx; gfloat slidepos; gfloat ASH_smooth; gfloat ASH_add_lines_p; } t1d; /*-- corr tour control panel --*/ struct _TourCorrCpanel { gfloat slidepos; gint manip_mode; } tcorr; struct _TourCorr1Cpanel { gboolean paused; gfloat step; } tcorr1; struct _TourCorr2Cpanel { gboolean paused; gfloat step; } tcorr2; /* tour variables are in display.h */ } cpaneld; #endif ggobi-2.1.12/src/parcoordsClass.c0000644000175000017500000004436514651527764012317 /* parcoordsClass.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "parcoordsClass.h" #include #ifdef STORE_SESSION_ENABLED #include "write_state.h" #endif #include "externs.h" #include static gboolean parcoordsKeyEventHandled (GtkWidget *, displayd *, splotd *, GdkEventKey *, ggobid *); static gboolean binningPermitted (displayd * dpy) { /* cpaneld *cpanel = &dpy->cpanel; if (cpanel->br_point_targets == br_select) return(false); */ return (!dpy->options.whiskers_show_p); } static void splotAssignPointsToBins (GGobiData * d, splotd * sp, ggobid * gg) { if (sp == gg->current_splot) assign_points_to_bins (d, sp, gg); } gint splot1DVariablesGet (splotd * sp, gint * cols, GGobiData * d) { cols[0] = sp->p1dvar; return (1); } static gboolean cpanelSet (displayd * dpy, cpaneld * cpanel, ggobid * gg) { GtkWidget *w; w = GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget; if (!w) { GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget = w = cpanel_parcoords_make (gg); } cpanel_parcoords_set (dpy, cpanel, w, gg); cpanel_brush_set (dpy, cpanel, gg); cpanel_identify_set (dpy, cpanel, gg); return (true); /* XX */ } /** Instance initialization file. */ void parcoordsDisplayInit (parcoordsDisplayd * display) { GGOBI_DISPLAY (display)->p1d_orientation = VERTICAL; } static gboolean handlesInteraction (displayd * dpy, InteractionMode v) { return (v == BRUSH || v == IDENT || v == DEFAULT_IMODE); } void start_parcoords_drag (GtkWidget * src, GdkDragContext * ctxt, GtkSelectionData * data, guint info, guint time, gpointer udata) { gtk_selection_data_set (data, data->target, 8, (guchar *) src, sizeof (splotd *)); } void receive_parcoords_drag (GtkWidget * src, GdkDragContext * context, int x, int y, const GtkSelectionData * data, unsigned int info, unsigned int event_time, gpointer * udata) { splotd *to = GGOBI_SPLOT (src), *from, *sp; displayd *display; display = to->displayptr; GList *l; gint k; GList *ivars = NULL; from = GGOBI_SPLOT (gtk_drag_get_source_widget (context)); if (from->displayptr != display) { gg_write_to_statusbar ("the source and destination of the parallel coordinate plots are not from the same display.\n", display->ggobi); return; } /* Gather a list of indices */ l = display->splots; while (l) { sp = (splotd *) l->data; ivars = g_list_append (ivars, GINT_TO_POINTER (sp->p1dvar)); l = l->next; } /* Find the index of the to element */ k = g_list_index (ivars, GINT_TO_POINTER (to->p1dvar)); /* Remove the from element */ ivars = g_list_remove (ivars, GINT_TO_POINTER (from->p1dvar)); /* Insert the from element in the position of the to element */ ivars = g_list_insert (ivars, GINT_TO_POINTER (from->p1dvar), k); /* Assign them to the existing plots */ k = 0; l = display->splots; while (l) { sp = (splotd *) l->data; sp->p1dvar = GPOINTER_TO_INT (g_list_nth_data (ivars, k)); k++; l = l->next; } g_list_free (ivars); display_tailpipe (display, FULL, display->ggobi); varpanel_refresh (display, display->ggobi); } void parcoordsPlotDragAndDropEnable (splotd * sp, gboolean active) { static GtkTargetEntry target = { "text/plain", GTK_TARGET_SAME_APP, 1001 }; if (active) { gtk_drag_source_set (GTK_WIDGET (sp), GDK_BUTTON1_MASK, &target, 1, GDK_ACTION_COPY); g_signal_connect (G_OBJECT (sp), "drag_data_get", G_CALLBACK (start_parcoords_drag), NULL); gtk_drag_dest_set (GTK_WIDGET (sp), GTK_DEST_DEFAULT_ALL /* DROP */ , &target, 1, GDK_ACTION_COPY /*MOVE*/); g_signal_connect (G_OBJECT (sp), "drag_data_received", G_CALLBACK (receive_parcoords_drag), NULL); } else { g_signal_handlers_disconnect_by_func (G_OBJECT (sp), G_CALLBACK (start_parcoords_drag), NULL); g_signal_handlers_disconnect_by_func (G_OBJECT (sp), G_CALLBACK (receive_parcoords_drag), NULL); gtk_drag_source_unset (GTK_WIDGET (sp)); gtk_drag_dest_unset (GTK_WIDGET (sp)); } } void parcoordsDragAndDropEnable (displayd * dsp, gboolean active) { GList *l; for (l = dsp->splots; l; l = l->next) { splotd *sp = (splotd *) l->data; parcoordsPlotDragAndDropEnable (sp, active); } } gboolean parcoordsEventHandlersToggle (displayd * dpy, splotd * sp, gboolean state, ProjectionMode pmode, InteractionMode imode) { /* it's necessary to disable/enable so that duplicate handlers are not registered */ /* it's necessary to toggle all plots, because all plots need to be ready to receive */ /* would be better if there was some callback when the imode changed */ parcoordsDragAndDropEnable (dpy, false); switch (imode) { case DEFAULT_IMODE: p1d_event_handlers_toggle (sp, state); parcoordsDragAndDropEnable (dpy, true); break; case BRUSH: brush_event_handlers_toggle (sp, state); break; case IDENT: identify_event_handlers_toggle (sp, state); break; default: break; } return (false); } static gboolean parcoordsKeyEventHandled (GtkWidget * w, displayd * display, splotd * sp, GdkEventKey * event, ggobid * gg) { gboolean ok = true; ProjectionMode pmode = NULL_PMODE; InteractionMode imode = DEFAULT_IMODE; if (event->state == 0 || event->state == GDK_CONTROL_MASK) { switch (event->keyval) { case GDK_h: case GDK_H: pmode = EXTENDED_DISPLAY_PMODE; break; case GDK_b: case GDK_B: imode = BRUSH; break; case GDK_i: case GDK_I: imode = IDENT; break; default: ok = false; break; } if (ok) { GGOBI (full_viewmode_set) (pmode, imode, gg); } } else { ok = false; } return ok; } gchar * treeLabel (splotd * splot, GGobiData * d, ggobid * gg) { return(ggobi_data_get_col_name(d, splot->p1dvar)); } static GdkSegment * allocWhiskers (GdkSegment * whiskers, splotd * sp, gint nr, GGobiData * d) { return ((GdkSegment *) g_realloc (whiskers, 2 * nr * sizeof (GdkSegment))); } void worldToPlane (splotd * sp, GGobiData * d, ggobid * gg) { p1d_reproject (sp, d->world.vals, d, gg); } void withinPlaneToScreen (splotd * sp, displayd * display, GGobiData * d, ggobid * gg) { sp_whiskers_make (sp, display, gg); } gboolean drawEdge_p (splotd * sp, gint m, GGobiData * d, GGobiData * e, ggobid * gg) { return (!ggobi_data_is_missing(e, m, sp->p1dvar)); } gboolean drawCase_p (splotd * sp, gint m, GGobiData * d, ggobid * gg) { return (!ggobi_data_is_missing(d, m, sp->p1dvar)); } void withinDrawBinned (splotd * sp, gint m, GdkDrawable * drawable, GdkGC * gc) { displayd *display = sp->displayptr; GGobiData *d = display->d; ggobid *gg = GGobiFromSPlot (sp); gint n, lwidth, ltype, gtype; if (!gg || !display) return; if (display->options.whiskers_show_p) { n = 2 * m; lwidth = lwidth_from_gsize (d->glyph_now.els[m].size); gtype = d->glyph_now.els[m].type; ltype = set_lattribute_from_ltype (ltype_from_gtype (gtype), gg); gdk_gc_set_line_attributes (gg->plot_GC, lwidth, ltype, GDK_CAP_BUTT, GDK_JOIN_ROUND); gdk_draw_line (drawable, gc, sp->whiskers[n].x1, sp->whiskers[n].y1, sp->whiskers[n].x2, sp->whiskers[n].y2); n++; gdk_draw_line (drawable, gc, sp->whiskers[n].x1, sp->whiskers[n].y1, sp->whiskers[n].x2, sp->whiskers[n].y2); } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } /* I think these two routines are identical ... */ void withinDrawUnbinned (splotd * sp, gint m, GdkDrawable * drawable, GdkGC * gc) { displayd *display = sp->displayptr; GGobiData *d = display->d; ggobid *gg = GGobiFromSPlot (sp); gint n, lwidth, ltype, gtype; if (!gg || !display) return; if (display->options.whiskers_show_p) { n = 2 * m; lwidth = lwidth_from_gsize (d->glyph_now.els[m].size); gtype = d->glyph_now.els[m].type; ltype = set_lattribute_from_ltype (ltype_from_gtype (gtype), gg); gdk_gc_set_line_attributes (gg->plot_GC, lwidth, ltype, GDK_CAP_BUTT, GDK_JOIN_ROUND); gdk_draw_line (drawable, gc, sp->whiskers[n].x1, sp->whiskers[n].y1, sp->whiskers[n].x2, sp->whiskers[n].y2); n++; gdk_draw_line (drawable, gc, sp->whiskers[n].x1, sp->whiskers[n].y1, sp->whiskers[n].x2, sp->whiskers[n].y2); } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } static void addPlotLabels (displayd * display, splotd * sp, GdkDrawable * drawable, GGobiData * d, ggobid * gg) { PangoRectangle rect; PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (sp->da), NULL); cpaneld *cpanel = &display->cpanel; layout_text (layout, ggobi_data_get_transformed_col_name(d, sp->p1dvar), &rect); if (cpanel->parcoords_arrangement == ARRANGE_ROW) gdk_draw_layout (drawable, gg->plot_GC, (rect.width <= sp->max.x) ? sp->max.x / 2 - rect.width / 2 : 0, sp->max.y - rect.height - 5, layout); else gdk_draw_layout (drawable, gg->plot_GC, 5, 5, layout); g_object_unref (G_OBJECT (layout)); } static gint plotted (displayd * display, gint * cols, gint ncols, GGobiData * d) { GList *l; splotd *sp; gint j; for (l = display->splots; l; l = l->next) { sp = (splotd *) l->data; for (j = 0; j < ncols; j++) { if (sp->xyvars.x == cols[j]) { return (sp->xyvars.x); } } } return (-1); } static gboolean variableSelect (GtkWidget * w, displayd * dpy, splotd * sp, gint jvar, gint toggle, gint mouse, cpaneld * cpanel, ggobid * gg) { gint jvar_prev = -1; return (parcoords_varsel (cpanel, sp, jvar, &jvar_prev, gg)); } static void varpanelRefresh (displayd * display, splotd * sp, GGobiData * d) { gint j; GList *l; for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } l = display->splots; while (l) { j = ((splotd *) l->data)->p1dvar; varpanel_toggle_set_active (VARSEL_X, j, true, d); l = l->next; } } static void varpanelTooltipsSet (displayd * dpy, ggobid * gg, GtkWidget * wx, GtkWidget * wy, GtkWidget * xz, GtkWidget * label) { gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Toggle to append or delete; drag plots to reorder", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Toggle to append or delete; drag plots to reorder", NULL); } /* Are these ordered? Maybe so */ static gint plottedVarsGet (displayd * display, gint * cols, GGobiData * d, ggobid * gg) { GList *l; splotd *s; gint ncols = 0; for (l = display->splots; l; l = l->next) { s = (splotd *) l->data; if (!array_contains (cols, ncols, s->p1dvar)) cols[ncols++] = s->p1dvar; } return (ncols); } static void displaySet (displayd * display, ggobid * gg) { } #ifdef STORE_SESSION_ENABLED /* Write out the variables in a parallel coordinates plot to the current node in the XML tree. Should be able to make this generic. */ static void add_xml_parcoords_variables (xmlNodePtr node, GList * plots, displayd * dpy) { splotd *plot; while (plots) { plot = (splotd *) plots->data; XML_addVariable (node, plot->p1dvar, dpy->d); plots = plots->next; } } #endif /*------------------------------------------------------------------------*/ /* case highlighting for points (and edges?) */ /*------------------------------------------------------------------------*/ /*-- add highlighting for parallel coordinates plot --*/ static void splot_add_whisker_cues (gboolean nearest_p, gint k, splotd * sp, GdkDrawable * drawable, ggobid * gg) { gint n; displayd *display = sp->displayptr; GGobiData *d = display->d; colorschemed *scheme = gg->activeColorScheme; if (k < 0 || k >= d->nrows) return; if (display->options.whiskers_show_p) { gdk_gc_set_line_attributes (gg->plot_GC, 3, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[d->color_now.els[k]]); n = 2 * k; gdk_draw_line (drawable, gg->plot_GC, sp->whiskers[n].x1, sp->whiskers[n].y1, sp->whiskers[n].x2, sp->whiskers[n].y2); n++; gdk_draw_line (drawable, gg->plot_GC, sp->whiskers[n].x1, sp->whiskers[n].y1, sp->whiskers[n].x2, sp->whiskers[n].y2); gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } if (nearest_p) { /* Add the label for the nearest point at the top as well */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); splot_add_point_label (true, k, true, sp, drawable, gg); } } static GtkWidget * parcoordsCPanelWidget (displayd * dpy, gchar ** modeName, ggobid * gg) { GtkWidget *w = GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget; if (!w) { GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget = w = cpanel_parcoords_make (gg); } *modeName = "Parcoords"; return (w); } static void splotScreenToTform (cpaneld * cpanel, splotd * sp, icoords * scr, fcoords * tfd, ggobid * gg) { gcoords planar, world; greal precis = (greal) PRECISION1; greal ftmp, max, min, rdiff; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gfloat scale_x, scale_y; vartabled *vt; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; /* * screen to plane */ planar.x = (scr->x - sp->max.x / 2) * precis / sp->iscale.x; planar.x += sp->pmid.x; planar.y = (scr->y - sp->max.y / 2) * precis / sp->iscale.y; planar.y += sp->pmid.y; /* * plane to tform */ if (sp->p1dvar != -1) { vt = vartable_element_get (sp->p1dvar, d); max = vt->lim.max; min = vt->lim.min; rdiff = max - min; if (display->p1d_orientation == HORIZONTAL) { /* x */ world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; } else { /* y */ world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } } } void parcoordsDisplayClassInit (GGobiParCoordsDisplayClass * klass) { klass->parent_class.loop_over_points = true; klass->parent_class.binningPermitted = binningPermitted; klass->parent_class.allow_reorientation = true; klass->parent_class.options_menu_p = true; klass->parent_class.loop_over_points = true; klass->parent_class.titleLabel = "Parallel Coordinates Display"; klass->parent_class.treeLabel = "Parallel Coordinates"; /* No create method, just createWithVars. */ klass->parent_class.createWithVars = parcoords_new_with_vars; klass->parent_class.variable_select = variableSelect; klass->parent_class.variable_plotted_p = plotted; /* no unset */ klass->parent_class.display_set = displaySet; klass->parent_class.mode_ui_get = parcoords_mode_ui_get; /* no build_symbol_vectors */ /* ruler ranges set. */ klass->parent_class.varpanel_refresh = varpanelRefresh; klass->parent_class.handles_interaction = handlesInteraction; klass->parent_class.cpanel_set = cpanelSet; #ifdef STORE_SESSION_ENABLED klass->parent_class.xml_describe = add_xml_parcoords_variables; #endif klass->parent_class.varpanel_tooltips_set = varpanelTooltipsSet; klass->parent_class.plotted_vars_get = plottedVarsGet; klass->parent_class.imode_control_box = parcoordsCPanelWidget; /* menus_make */ klass->parent_class.event_handlers_toggle = parcoordsEventHandlersToggle; klass->parent_class.splot_key_event_handled = parcoordsKeyEventHandled; klass->parent_class.add_plot_labels = addPlotLabels; } void parcoordsSPlotClassInit (GGobiParCoordsSPlotClass * klass) { klass->parent_class.alloc_whiskers = allocWhiskers; klass->parent_class.add_identify_cues = splot_add_whisker_cues; klass->parent_class.tree_label = treeLabel; /* reverse pipeline */ klass->parent_class.screen_to_tform = splotScreenToTform; klass->parent_class.world_to_plane = worldToPlane; klass->parent_class.sub_plane_to_screen = withinPlaneToScreen; klass->parent_class.draw_edge_p = drawEdge_p; klass->parent_class.draw_case_p = drawCase_p; klass->parent_class.within_draw_to_binned = withinDrawBinned; klass->parent_class.within_draw_to_unbinned = withinDrawUnbinned; klass->parent_class.splot_assign_points_to_bins = splotAssignPointsToBins; klass->parent_class.plotted_vars_get = splot1DVariablesGet; } splotd * ggobi_parcoords_splot_new (displayd * dpy, ggobid * gg) { splotd *sp = g_object_new (GGOBI_TYPE_PAR_COORDS_SPLOT, NULL); splot_init (sp, dpy, gg); return (sp); } ggobi-2.1.12/src/transform.c0000644000175000017500000006022714651527764011343 /* transform.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * I'm trying to apply each transformation to the user-specified * limits along with the data, and for most transformations, that * isn't too hard to do. However, rank, normal score, and z-score * seem to raise a problem. Perhaps the user-specified limits * should be turned off in those cases. --dfs */ #include #include #include #include "vars.h" #include "externs.h" #define SIGNUM(x) (((x)<0.0)?(-1.0):(((x)>0.0)?(1.0):(0.0))) static const gchar * const domain_error_message = "Data outside the domain of function."; static const gchar * const ldomain_error_message = "Limits outside the domain of function."; #ifdef __cplusplus extern "C" { #endif gfloat no_change (gfloat x, gfloat incr) { return x; } gfloat negate (gfloat x, gfloat incr) { return -x; } gfloat raise_min_to_0 (gfloat x, gfloat incr) { return (x - incr); } gfloat raise_min_to_1 (gfloat x, gfloat incr) { return (x - incr + 1.0); } gfloat inv_raise_min_to_0 (gfloat x, gfloat incr) { return (x + incr); } gfloat inv_raise_min_to_1 (gfloat x, gfloat incr) { return (x + incr - 1.0); } #ifdef __cplusplus } #endif static void mean_stddev (gdouble *x, gfloat *mean, gfloat *stddev, gint j, GGobiData *d, ggobid *gg) /* * Find the minimum and maximum values of a column * scaling by mean and std_width standard deviations. * Use the function pointer to domain_adj. */ { gint i; gdouble sumxi = 0.0, sumxisq = 0.0; gdouble dmean, dvar, dstddev; gdouble dn = (gdouble) d->nrows_in_plot; for (i=0; inrows_in_plot; i++) { sumxi = sumxi + x[i]; sumxisq = sumxisq + (x[i] * x[i]); } dmean = sumxi / dn; dvar = (sumxisq / dn) - (dmean * dmean); dstddev = sqrt (dvar); *mean = (gfloat) dmean; *stddev = (gfloat) dstddev; } gfloat median (gfloat **data, gint jcol, GGobiData *d, ggobid *gg) { /* * Find the minimum and maximum values of each column, * scaling by median and largest distance */ gint i, m, np = d->nrows_in_plot; gfloat *x; gdouble dmedian = 0; x = (gfloat *) g_malloc (d->nrows_in_plot * sizeof (gfloat)); for (i=0; irows_in_plot.els[i]; x[m] = data[m][jcol]; } qsort ((void *) x, np, sizeof (gfloat), fcompare); dmedian = ((np % 2) != 0) ? x[(np-1)/2] : (x[np/2-1] + x[np/2])/2. ; g_free ((gpointer) x); return (gfloat) dmedian; } /* adapted from Ratfor code used in S */ gdouble qnorm (gdouble pr) { gdouble p, eta, term, f1 = .010328, f2 = .802853, f3 = 2.515517, f4 = .001308, f5 = .189269, f6 = 1.432788; if (pr <= 0. || pr >= 1.) g_printerr ("Probability out of range (0,1): %f", pr); p = pr; if (p > 0.5) p = 1.0 - pr; /* depending on the size of pr this may error in log or sqrt */ eta = sqrt (-2.0 * log (p)); term = ((f1*eta+f2) * eta + f3) / (((f4*eta+f5)*eta+f6) * eta + 1.0); if (pr <= .5) return (term - eta); else return (eta - term); } void vt_init(vartabled *vt) { vt->tform0 = NO_TFORM0; vt->tform1 = NO_TFORM1; vt->tform2 = NO_TFORM2; vt->domain_incr = 0.; vt->param = 0.; vt->domain_adj = no_change; vt->inv_domain_adj = no_change; } void transform_values_init (vartabled *vt) { vt_init(vt); } void vt_copy(vartabled *vtf, vartabled *vtt) { vtt->tform0 = vtf->tform0; vtt->tform1 = vtf->tform1; vtt->tform2 = vtf->tform2; vtt->domain_incr = vtf->domain_incr; vtt->param = vtf->param; vtt->domain_adj = vtf->domain_adj; vtt->inv_domain_adj = vtf->inv_domain_adj; } void transform_values_copy (gint jfrom, gint jto, GGobiData *d) { vartabled *vtf = vartable_element_get (jfrom, d); vartabled *vtt = vartable_element_get (jto, d); vt_copy (vtf, vtt); } gboolean transform_values_compare (gint jfrom, gint jto, GGobiData *d) { gboolean same = true; vartabled *vtf = vartable_element_get (jfrom, d); vartabled *vtt = vartable_element_get (jto, d); same = ( vtt->tform1 == vtf->tform1 && vtt->tform2 == vtf->tform2 && vtt->domain_incr == vtf->domain_incr && vtt->param == vtf->param && vtt->domain_adj == vtf->domain_adj && vtt->inv_domain_adj == vtf->inv_domain_adj); return same; } void transform0_values_set (gint tform0, gint j, GGobiData *d, ggobid *gg) { gfloat domain_incr; gfloat (*domain_adj) (gfloat x, gfloat incr) = no_change; gfloat (*inv_domain_adj) (gfloat x, gfloat incr) = no_change; vartabled *vt = vartable_element_get (j, d); switch (tform0) { case NO_TFORM0: /*-- no domain adjustment --*/ domain_incr = 0; domain_adj = no_change; inv_domain_adj = no_change; break; case RAISE_MIN_TO_0: domain_incr = vt->lim_raw.min; domain_adj = raise_min_to_0; inv_domain_adj = inv_raise_min_to_0; break; case RAISE_MIN_TO_1: domain_incr = vt->lim_raw.min; domain_adj = raise_min_to_1; inv_domain_adj = inv_raise_min_to_1; break; case NEGATE: domain_incr = 0.0; domain_adj = negate; inv_domain_adj = negate; break; default: domain_incr = 0; domain_adj = no_change; inv_domain_adj = no_change; } vt->tform0 = tform0; vt->domain_incr = domain_incr; vt->domain_adj = domain_adj; vt->inv_domain_adj = inv_domain_adj; /*-- set explicitly in case the routine is not called from the ui --*/ transform0_combo_box_set_value (j, false/*transform*/, d, gg); } void transform1_values_set (gint tform1, gfloat expt, gint j, GGobiData *d, ggobid *gg) { vartabled *vt = vartable_element_get (j, d); vt->tform1 = tform1; vt->param = expt; /*-- set explicitly in case the routine is not called from the ui --*/ transform1_combo_box_set_value (j, false, d, gg); } gboolean transform1_apply (gint j, GGobiData *d, ggobid *gg) { gint i, m, n; gfloat min, max, diff; gfloat ref, ftmp; gboolean tform_ok = true; gdouble dtmp; // gcc complains about uninitialized values here, but it's ok. lims slim, slim_tform; /*-- specified limits --*/ GtkWidget *stage1_cbox; gint tform1; gfloat boxcoxparam = gg->tform_ui.boxcox_adj->value; vartabled *vt = vartable_element_get (j, d); gfloat incr = vt->domain_incr; gfloat (*domain_adj) (gfloat x, gfloat incr) = vt->domain_adj; stage1_cbox = widget_find_by_name (gg->tform_ui.window, "TFORM:stage1_options"); if (!stage1_cbox) return false; tform1 = gtk_combo_box_get_active (GTK_COMBO_BOX (stage1_cbox)); /*-- adjust the transformed value of the user-supplied limits --*/ if (vt->lim_specified_p) { slim.min = vt->lim_specified.min; slim.max = vt->lim_specified.max; } switch (tform1) { case NO_TFORM1: /*-- Apply the stage0 transformation --*/ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][j] = (*domain_adj)(d->raw.vals[m][j], incr); } /*-- apply the same transformation to the specified limits --*/ if (vt->lim_specified_p) { slim_tform.min = (*domain_adj)(slim.min, incr); slim_tform.max = (*domain_adj)(slim.max, incr); } break; case BOXCOX: /* Box-Cox power transform family */ if (fabs (boxcoxparam-0) < .001) { /* Natural log */ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if ((*domain_adj)(d->raw.vals[m][j], incr) <= 0) { g_printerr ("%f %f\n", d->raw.vals[m][j], (*domain_adj)(d->raw.vals[m][j], incr)); quick_message (domain_error_message, false); tform_ok = false; break; } } /*-- apply the same domain test to the specified limits --*/ // gcc complains about uninitialized values here, but it's ok. if (tform_ok && vt->lim_specified_p) { if (((*domain_adj)(slim_tform.min, incr) <= 0) || ((*domain_adj)(slim_tform.max, incr) <= 0)) { quick_message (ldomain_error_message, false); tform_ok = false; } } if (tform_ok) { /*-- if all values are in the domain of log --*/ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][j] = (gfloat) log ((gdouble) ((*domain_adj)(d->raw.vals[m][j], incr))); } /*-- apply the same transformation to the specified limits --*/ if (vt->lim_specified_p) { slim_tform.min = (gfloat) log ((gdouble) ((*domain_adj)(slim.min, incr))); slim_tform.max = (gfloat) log ((gdouble) ((*domain_adj)(slim.max, incr))); } } } else { /*-- if the exponent is outisde (-.001, .001) --*/ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; dtmp = pow ((gdouble) (*domain_adj)(d->raw.vals[m][j], incr), boxcoxparam); dtmp = (dtmp - 1.0) / boxcoxparam; /* If dtmp no good, return */ if (!isfinite (dtmp)) { g_printerr ("%f %f %f (breaking, i=%d)\n", d->raw.vals[m][j], (*domain_adj)(d->raw.vals[m][j], incr), dtmp, i); quick_message (domain_error_message, false); tform_ok = false; break; } else { d->tform.vals[m][j] = (gfloat) dtmp; } } /*-- apply the same transformation to the specified limits --*/ if (tform_ok && vt->lim_specified_p) { dtmp = pow ((gdouble) (*domain_adj)(slim.min, incr), boxcoxparam); if (isfinite (dtmp)) { quick_message (ldomain_error_message, false); tform_ok = false; } slim_tform.min = (gfloat) (dtmp - 1.0) / boxcoxparam; dtmp = pow ((gdouble) (*domain_adj)(slim.max, incr), boxcoxparam); if (isfinite (dtmp)) { quick_message (ldomain_error_message, false); tform_ok = false; } slim_tform.max = (gfloat) (dtmp - 1.0) / boxcoxparam; } } break; case LOG10: /* Base 10 log */ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if ((*domain_adj)(d->raw.vals[m][j], incr) <= 0) { quick_message (domain_error_message, false); tform_ok = false; break; } } /*-- apply the same domain test to the specified limits --*/ if (tform_ok && vt->lim_specified_p) { if (((*domain_adj)(slim_tform.min, incr) <= 0) || ((*domain_adj)(slim_tform.max, incr) <= 0)) { quick_message (ldomain_error_message, false); tform_ok = false; } } if (tform_ok) { /*-- if all values are in the domain of log10 --*/ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][j] = (gfloat) log10 ((gdouble) (*domain_adj)(d->raw.vals[m][j], incr)); } /*-- apply the same transformation to the specified limits --*/ if (vt->lim_specified_p) { slim_tform.min = (gfloat) log10 ((gdouble) (*domain_adj)(slim.min, incr)); slim_tform.max = (gfloat) log10 ((gdouble) (*domain_adj)(slim.max, incr)); } } break; case INVERSE: /* 1/x: require all data to be of the same sign */ for (i=0; inrows_in_plot-1; i++) { m = d->rows_in_plot.els[i]; n = d->rows_in_plot.els[i+1]; if (SIGNUM((*domain_adj)(d->raw.vals[m][j], incr)) != SIGNUM((*domain_adj)(d->raw.vals[n][j], incr))) { quick_message (domain_error_message, false); tform_ok = false; break; } } /*-- apply the same domain test to the specified limits --*/ if (tform_ok && vt->lim_specified_p) { if (SIGNUM((*domain_adj)(slim_tform.min, incr)) != SIGNUM((*domain_adj)(slim_tform.max, incr))) { quick_message (ldomain_error_message, false); tform_ok = false; } } if (tform_ok) { for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][j] = (gfloat) pow ((gdouble) (*domain_adj)(d->raw.vals[m][j], incr), (gdouble) (-1.0)); } /*-- apply the same transformation to the specified limits --*/ if (vt->lim_specified_p) { slim_tform.min = (gfloat) pow ((gdouble) (*domain_adj)(slim.min, incr), (gdouble) (-1.0)); slim_tform.max = (gfloat) pow ((gdouble) (*domain_adj)(slim.max, incr), (gdouble) (-1.0)); } } break; case ABSVALUE: for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; ftmp = (*domain_adj)(d->raw.vals[m][j], incr); d->tform.vals[m][j] = (ftmp >= 0 ? ftmp : -1 * ftmp); } /*-- apply the same transformation to the specified limits --*/ if (vt->lim_specified_p) { ftmp = (*domain_adj)(slim.min, incr); slim_tform.min = (ftmp >= 0 ? ftmp : -1 * ftmp); ftmp = (*domain_adj)(slim.max, incr); slim_tform.max = (ftmp >= 0 ? ftmp : -1 * ftmp); if (slim_tform.min > slim_tform.max) { ftmp = slim_tform.min; slim_tform.min = slim_tform.max; slim_tform.max = ftmp; } } break; case SCALE_AB: /* Map onto [a,b] */ { gfloat scale_get_a (ggobid *); gfloat scale_get_b (ggobid *); gfloat a = scale_get_a (gg); gfloat b = scale_get_b (gg); gfloat bminusa = b - a; gfloat ftmp; /*-- Either use user-defined limits, or data min and max --*/ if (vt->lim_specified_p) { min = slim_tform.min; max = slim_tform.max; } else { min = max = (*domain_adj)(d->raw.vals[0][j], incr); for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; ref = (*domain_adj)(d->raw.vals[m][j], incr); if (ref < min) min = ref; if (ref > max) max = ref; } } limits_adjust (&min, &max); diff = max - min; for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; ftmp = ((*domain_adj)(d->raw.vals[m][j], incr) - min)/diff; d->tform.vals[m][j] = (ftmp * bminusa) + a; } } break; default: break; } if (tform_ok && vt->lim_specified_p) { vt->lim_specified_tform.min = slim_tform.min; vt->lim_specified_tform.max = slim_tform.max; } return (tform_ok); } void transform2_values_set (gint tform2, gint j, GGobiData *d, ggobid *gg) { vartabled *vt = vartable_element_get (j, d); vt->tform2 = tform2; /*-- set explicitly in case the routine is not called from the ui --*/ transform2_combo_box_set_value (j, true, d, gg); } gboolean transform2_apply (gint jcol, GGobiData *d, ggobid *gg) { gint i, m; gboolean tform_ok = true; GtkWidget *stage2_cbox; gint tform2; stage2_cbox = widget_find_by_name (gg->tform_ui.window, "TFORM:stage2_options"); if (!stage2_cbox) return false; tform2 = gtk_combo_box_get_active (GTK_COMBO_BOX (stage2_cbox)); switch (tform2) { case NO_TFORM2: /* Restore the values from transformation, stage 2 */ break; case STANDARDIZE: /* (x-mean)/sigma */ { gfloat mean, stddev; gdouble *x; x = (gdouble *) g_malloc (d->nrows_in_plot * sizeof (gdouble)); for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; x[i] = (gdouble) d->tform.vals[m][jcol]; } mean_stddev (x, &mean, &stddev, jcol, d, gg); if (stddev == 0) { quick_message (domain_error_message, false); } else { for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][jcol] = (x[i] - mean)/stddev; } } } break; case SORT: case RANK: case NORMSCORE: /*-- normscore = qnorm applied to rank --*/ { paird *pairs = (paird *) g_malloc (d->nrows_in_plot * sizeof (paird)); for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; pairs[i].f = d->tform.vals[m][jcol]; pairs[i].indx = m; } qsort ((gchar *) pairs, d->nrows_in_plot, sizeof (paird), pcompare); if (tform2 == SORT) { for (i=0; inrows_in_plot; i++) { m = pairs[i].indx; d->tform.vals[m][jcol] = pairs[i].f; } } else if (tform2 == RANK) { for (i=0; inrows_in_plot; i++) { m = pairs[i].indx; d->tform.vals[m][jcol] = i; } } else if (tform2 == NORMSCORE) { for (i=0; inrows_in_plot; i++) { m = pairs[i].indx; d->tform.vals[m][jcol] = qnorm ((gfloat) (i+1) / (gfloat) (d->nrows_in_plot+1)); } } g_free ((gpointer) pairs); } break; case ZSCORE: { gdouble *zscore_data; gdouble zmean=0, zvar=0; gdouble dtmp; /* Allocate array for z scores */ zscore_data = (gdouble *) g_malloc (d->nrows_in_plot * sizeof (gdouble)); for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; dtmp = (gdouble) d->tform.vals[m][jcol]; zscore_data[i] = dtmp; zmean += dtmp; zvar += (dtmp * dtmp); } zmean /= (gdouble) d->nrows_in_plot; zvar = sqrt (zvar / (gdouble) d->nrows_in_plot - zmean*zmean); for (i=0; inrows_in_plot; i++) { zscore_data[i] = (zscore_data[i] - zmean) / zvar; } for (i=0; inrows_in_plot; i++) { if (zscore_data[i] > 0) zscore_data[i] = erf (zscore_data[i]/sqrt (2.)) / 2.8284271+0.5; else if (zscore_data[i]<0) zscore_data[i] = 0.5 - erf (fabs (zscore_data[i])/sqrt (2.))/2.8284271; else zscore_data[i] = 0.5; } for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][jcol] = (gfloat) zscore_data[i]; } g_free ((gpointer) zscore_data); } break; case DISCRETE2: /* x>median */ { gfloat ref, fmedian, min, max; /* refuse to discretize if all values are the same */ gboolean allequal = true; ref = d->tform.vals[0][jcol]; for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if (d->tform.vals[m][jcol] != ref) { allequal = false; break; } } if (allequal) { quick_message (domain_error_message, false); tform_ok = false; break; } /* First find median */ fmedian = median (d->tform.vals, jcol, d, gg); /* Then find the true min and max */ min = max = d->tform.vals[0][jcol]; for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; ref = d->tform.vals[m][jcol]; if (ref < min) min = ref; if (ref > max) max = ref; } /* This prevents the collapse of the data in a special case */ if (max == fmedian) fmedian = (min + max)/2.0; for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; d->tform.vals[m][jcol] = (d->tform.vals[m][jcol] > fmedian) ? 1.0 : 0.0; } } break; default: fprintf (stderr, "Unhandled switch-case in transform2_apply\n"); } return tform_ok; } /* * update the labels transform has completed, so that * we're ready for any sort of success or failure */ void collab_tform_update (gint j, GGobiData *d) { gchar *lbl0, *lbl1, *lbl2; vartabled *vt = vartable_element_get (j, d); /*-- skip the stage0 changes except negation --*/ switch (vt->tform0) { case NEGATE: lbl0 = g_strdup_printf ("-%s", ggobi_data_get_col_name(d, j)); break; default: lbl0 = g_strdup (ggobi_data_get_col_name(d, j)); break; } switch (vt->tform1) { case NO_TFORM1: lbl1 = g_strdup (lbl0); break; case BOXCOX: lbl1 = g_strdup_printf ("B-C(%s,%.2f)", lbl0, vt->param); break; case LOG10: lbl1 = g_strdup_printf ("log10(%s)", lbl0); break; case INVERSE: lbl1 = g_strdup_printf ("1/%s", lbl0); break; case ABSVALUE: lbl1 = g_strdup_printf ("abs(%s)", lbl0); break; case SCALE_AB: lbl1 = g_strdup_printf ("%s [a,b]", lbl0); break; default: // compiler pacification lbl1 = ""; } switch (vt->tform2) { case STANDARDIZE: lbl2 = g_strdup_printf ("(%s-m)/s", lbl1); break; case SORT: lbl2 = g_strdup_printf ("sort(%s)", lbl1); break; case RANK: lbl2 = g_strdup_printf ("rank(%s)", lbl1); break; case NORMSCORE: lbl2 = g_strdup_printf ("normsc(%s)", lbl1); break; case ZSCORE: lbl2 = g_strdup_printf ("zsc(%s)", lbl1); break; case DISCRETE2: lbl2 = g_strdup_printf ("%s:0,1", lbl1); break; default: lbl2 = g_strdup (lbl1); } ggobi_data_set_transformed_col_name(d, j, lbl2); } void tform_label_update (gint j, GGobiData *d) { /*-- update the values of the variable labels --*/ collab_tform_update (j, d); /*-- update the displayed checkbox label --*/ /*varlabel_set (j, d);*/ varpanel_label_set (j, d); /*-- update the displayed variable circle labels --*/ varcircle_label_set (j, d); /*-- update the variable statistics table --*/ vartable_collab_tform_set_by_var (j, d); } /*---------------------------------------------------------------------*/ /* * stage = 0,1,2 * tform_type depends on the stage * param is the box-cox exponent, only used in stage 1 */ gboolean transform_variable (gint stage, gint tform_type, gfloat param, gint jcol, GGobiData *d, ggobid *gg) { gboolean success = true; switch (stage) { case 0: transform0_values_set (tform_type, jcol, d, gg); /*-- apply tform1 to the new domain, using pre-existing parameters --*/ /*-- if it fails, reset tform1 to NULL --*/ if (!transform1_apply (jcol, d, gg)) { transform1_values_set (NO_TFORM1, 0.0, jcol, d, gg); //transform1_apply (jcol, d, gg); // not needed? success = false; } /*-- try to apply tform2 to the new values of tform1 --*/ /*-- if it fails, reset tform2 to NULL --*/ if (!transform2_apply (jcol, d, gg)) { transform2_values_set (NO_TFORM2, jcol, d, gg); success = false; } break; case 1: case 2: /*-- run the stage1 transform --*/ if (stage == 1) transform1_values_set (tform_type, param, jcol, d, gg); if (!transform1_apply (jcol, d, gg)) { transform1_values_set (NO_TFORM1, 0., jcol, d, gg); transform1_apply (jcol, d, gg); success = false; } /*-- then run the stage2 transform --*/ if (stage == 2) transform2_values_set (tform_type, jcol, d, gg); if (!transform2_apply (jcol, d, gg)) { transform2_values_set (NO_TFORM2, jcol, d, gg); success = false; } break; } tform_label_update (jcol, d); return success; } void transform (gint stage, gint tform_type, gfloat param, gint *vars, gint nvars, GGobiData *d, ggobid *gg) { gint k; gboolean ok = true; gint completed = nvars; for (k=0; klims_use_visible); for (k=0; k #include #include #include #include #include #include "vars.h" #include "externs.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif gint sqdist (gint x1, gint y1, gint x2, gint y2) { return ((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); } /* returns a random number on [0.0,1.0] */ gdouble randvalue (void) { return g_random_double (); } /*-- returns two random numbers on [-1,1] --*/ void rnorm2 (gdouble * drand, gdouble * dsave) { *drand = g_random_double_range (-1, 1); *dsave = g_random_double_range (-1, 1); } gint fcompare (const void *x1, const void *x2) { gint val = 0; const gfloat *f1 = (const gfloat *) x1; const gfloat *f2 = (const gfloat *) x2; if (*f1 < *f2) val = -1; else if (*f1 > *f2) val = 1; return (val); } gint icompare (const void * x1, const void * x2) { gint val = 0; const gint *i1 = (const gint *) x1; const gint *i2 = (const gint *) x2; if (*i1 < *i2) val = -1; else if (*i1 > *i2) val = 1; return (val); } gint scompare (const void * x1, const void * x2) { gint val = 0; const gushort *i1 = (const gushort *) x1; const gushort *i2 = (const gushort *) x2; if (*i1 < *i2) val = -1; else if (*i1 > *i2) val = 1; return (val); } /*-- used to find ranks --*/ gint pcompare (const void *val1, const void *val2) { const paird *pair1 = (const paird *) val1; const paird *pair2 = (const paird *) val2; if (pair1->f < pair2->f) return (-1); else if (pair1->f == pair2->f) return (0); else return (1); } /* Not used anywhere yet ... */ void fshuffle (gfloat * x, gint n) { /* * Knuth, Seminumerical Algorithms, Vol2; Algorithm P. */ gint i, k; gfloat f; for (i = 0; i < n; i++) { k = (gint) (randvalue () * (gdouble) i); f = x[i]; x[i] = x[k]; x[k] = f; } } /* ---------------------------------------------------------------------*/ /* Missing data routines */ /* ---------------------------------------------------------------------*/ GtkTableChild * gtk_table_get_child (GtkWidget * w, gint left, gint top) { GtkTable *table = GTK_TABLE (w); GtkTableChild *ch, *child = NULL; GList *l; for (l = table->children; l; l = l->next) { ch = (GtkTableChild *) l->data; if (ch->left_attach == left && ch->top_attach == top) { child = ch; break; } } return child; } GList * g_list_remove_nth (GList * list, gint indx) { GList *tmp = list; gint k = 0; while (tmp) { if (k != indx) tmp = tmp->next; else { if (tmp->prev) tmp->prev->next = tmp->next; if (tmp->next) tmp->next->prev = tmp->prev; if (list == tmp) list = list->next; g_list_free_1 (tmp); break; } k++; } return list; } GList * g_list_replace_nth (GList * list, gpointer item, gint indx) { /* * remove the item that's there now */ list = g_list_remove_nth (list, indx); /* * insert the replacement */ list = g_list_insert (list, item, indx); return list; } /*-----------------------------------------------------------------------*/ /* figuring out if a widget has been initialized: */ /*-----------------------------------------------------------------------*/ /* * This pair of routines is useful if a widget needs some kind of * configuration when it is mapped for the very first time. */ gboolean widget_initialized (GtkWidget * w) { gboolean initd = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "initialized")); return (initd != (gboolean) NULL && initd == true) ? true : false; } void widget_initialize (GtkWidget * w, gboolean initd) { g_object_set_data (G_OBJECT (w), "initialized", GINT_TO_POINTER (initd)); } /*--------------------------------------------------------------------*/ /*--- Find a widget by name, starting from an enclosing container ----*/ /*--------------------------------------------------------------------*/ static gboolean widget_name_p (GtkWidget * w, gchar * name) { if (strcmp (gtk_widget_get_name (w), name) == 0) { return true; } else return false; } /* * parent must be a container: loop through its children, finding * a widget with the name 'name' */ GtkWidget * widget_find_by_name (GtkWidget * parent, gchar * name) { GtkWidget *w, *namedw = NULL; GList *children, *l; if (widget_name_p (parent, name)) namedw = parent; else { if (GTK_CONTAINER (parent)) { children = gtk_container_get_children (GTK_CONTAINER (parent)); for (l = children; l; l = l->next) { if (GTK_IS_WIDGET (l->data)) { w = GTK_WIDGET (l->data); if (widget_name_p (w, name)) { namedw = w; break; } if (GTK_IS_CONTAINER (w)) { namedw = widget_find_by_name (w, name); if (namedw != NULL) break; } } } } } return namedw; } /*--------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/ /* Debugging */ /*-----------------------------------------------------------------------*/ void print_attachments (ggobid * gg) { GList *l; GtkTableChild *child; g_printerr ("attachments:\n"); for (l = (GTK_TABLE (gg->current_display->table))->children; l; l = l->next) { child = (GtkTableChild *) l->data; g_printerr (" %d %d, %d %d\n", child->left_attach, child->right_attach, child->top_attach, child->bottom_attach); } } gint address_check (GGobiData * d, ggobid * gg) { g_printerr ("::: vars.h :::\n"); g_printerr ("data_mode %d world %g nedges %d rowlab %s jitfac %f\n", gg->input->mode, (gfloat) d->world.vals[0][0], d->edge.n, g_array_index (d->rowlab, gchar *, 0), d->jitter.factor); return 1; } /* ---------------------------------------------------------------------*/ /* Used in deleting: figure out which elements to keep */ /* ---------------------------------------------------------------------*/ gint find_keepers (gint ncols_current, gint nc, gint * cols, gint * keepers) { gint nkeepers; gint j, k; j = nkeepers = k = 0; for (j = 0; j < ncols_current; j++) { if (k < nc) { if (cols[k] != j) { keepers[nkeepers++] = j; } else { k++; } } else { keepers[nkeepers++] = j; } } if (nkeepers != ncols_current - nc) { g_printerr ("your logic is wrong! nc = %d, nc_to_delete = %d, but ncols_to_keep = %d\n", ncols_current, nc, nkeepers); nkeepers = -1; } return nkeepers; } static gint GGobiSleepTimer (gpointer data) { gtk_main_quit (); // Makes the innermost invocation of the main loop return when it regains control. return (0); } void ggobi_sleep (guint interval) { g_timeout_add (interval * 1000, GGobiSleepTimer, NULL); gtk_main (); } gboolean in_vector (gint k, gint * vec, gint nels) { gint j; gboolean in = false; for (j = 0; j < nels; j++) { if (k == vec[j]) { in = true; break; } } return in; } ggobi-2.1.12/src/tsPlot.h0000644000175000017500000000044714651527764010620 #ifndef TS_PLOT_METHODS_H #define TS_PLOT_METHODS_H #include "ggobi.h" #include "tsdisplay.h" void timeSeriesClassInit(GGobiTimeSeriesDisplayClass *klass); void timeSeriesSPlotClassInit(GGobiTimeSeriesSPlotClass *klass); splotd *ggobi_time_series_splot_new(displayd *dpy, ggobid *gg); #endif ggobi-2.1.12/src/tour2d.c0000644000175000017500000012443014651527764010544 /* tour2d.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include #include "vars.h" #include "externs.h" #include "tour_pp.h" #include "tour2d_pp.h" #define T2DON true #define T2DOFF false static void tour2d_speed_set_display(gfloat slidepos, displayd *dsp); void tour2d_write_video(ggobid *gg); void display_tour2d_init_null (displayd *dsp, ggobid *gg) { arrayd_init_null(&dsp->t2d.Fa); arrayd_init_null(&dsp->t2d.Fz); arrayd_init_null(&dsp->t2d.F); arrayd_init_null(&dsp->t2d.Ga); arrayd_init_null(&dsp->t2d.Gz); arrayd_init_null(&dsp->t2d.G); arrayd_init_null(&dsp->t2d.Va); arrayd_init_null(&dsp->t2d.Vz); arrayd_init_null(&dsp->t2d.tv); vectori_init_null(&dsp->t2d.subset_vars); vectorb_init_null(&dsp->t2d.subset_vars_p); vectori_init_null(&dsp->t2d.active_vars); vectorb_init_null(&dsp->t2d.active_vars_p); vectorf_init_null(&dsp->t2d.lambda); vectorf_init_null(&dsp->t2d.tau); vectorf_init_null(&dsp->t2d.tinc); /* manipulation variables */ arrayd_init_null(&dsp->t2d_Rmat1); arrayd_init_null(&dsp->t2d_Rmat2); arrayd_init_null(&dsp->t2d_mvar_3dbasis); arrayd_init_null(&dsp->t2d_manbasis); } void alloc_tour2d (displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint nc = d->ncols; /* first index is the projection dimensions, second dimension is ncols */ arrayd_alloc(&dsp->t2d.Fa, 2, nc); arrayd_alloc(&dsp->t2d.Fz, 2, nc); arrayd_alloc(&dsp->t2d.F, 2, nc); arrayd_alloc(&dsp->t2d.Ga, 2, nc); arrayd_alloc(&dsp->t2d.Gz, 2, nc); arrayd_alloc(&dsp->t2d.G, 2, nc); arrayd_alloc(&dsp->t2d.Va, 2, nc); arrayd_alloc(&dsp->t2d.Vz, 2, nc); arrayd_alloc(&dsp->t2d.tv, 2, nc); vectori_alloc(&dsp->t2d.subset_vars, nc); vectorb_alloc_zero(&dsp->t2d.subset_vars_p, nc); vectori_alloc(&dsp->t2d.active_vars, nc); vectorb_alloc_zero(&dsp->t2d.active_vars_p, nc); vectorf_alloc(&dsp->t2d.lambda, nc); vectorf_alloc_zero(&dsp->t2d.tau, nc); vectorf_alloc(&dsp->t2d.tinc, nc); /* manipulation variables */ arrayd_alloc(&dsp->t2d_Rmat1, 3, 3); arrayd_alloc(&dsp->t2d_Rmat2, 3, 3); arrayd_alloc(&dsp->t2d_mvar_3dbasis, 3, 3); arrayd_alloc(&dsp->t2d_manbasis, 3, nc); } /*-- eliminate the nc columns contained in *cols --*/ void tour2d_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg) { displayd *dsp; GList *l; for (l=gg->displays; l; l=l->next) { dsp = (displayd *) l->data; if (dsp->d == d) { arrayd_delete_cols (&dsp->t2d.Fa, nc, cols); arrayd_delete_cols (&dsp->t2d.Fz, nc, cols); arrayd_delete_cols (&dsp->t2d.F, nc, cols); arrayd_delete_cols (&dsp->t2d.Ga, nc, cols); arrayd_delete_cols (&dsp->t2d.Gz, nc, cols); arrayd_delete_cols (&dsp->t2d.G, nc, cols); arrayd_delete_cols (&dsp->t2d.Va, nc, cols); arrayd_delete_cols (&dsp->t2d.Vz, nc, cols); arrayd_delete_cols (&dsp->t2d.tv, nc, cols); vectori_delete_els (&dsp->t2d.subset_vars, nc, cols); vectorb_delete_els (&dsp->t2d.subset_vars_p, nc, cols); vectori_delete_els (&dsp->t2d.active_vars, nc, cols); vectorb_delete_els (&dsp->t2d.active_vars_p, nc, cols); vectorf_delete_els (&dsp->t2d.lambda, nc, cols); vectorf_delete_els (&dsp->t2d.tau, nc, cols); vectorf_delete_els (&dsp->t2d.tinc, nc, cols); arrayd_delete_cols (&dsp->t2d_manbasis, (gint) nc, cols); } } } void free_tour2d(displayd *dsp) { vectori_free(&dsp->t2d.subset_vars); vectorb_free(&dsp->t2d.subset_vars_p); vectori_free(&dsp->t2d.active_vars); vectorb_free(&dsp->t2d.active_vars_p); vectorf_free(&dsp->t2d.lambda); vectorf_free(&dsp->t2d.tau); vectorf_free(&dsp->t2d.tinc); arrayd_free(&dsp->t2d.Fa, 0, 0); arrayd_free(&dsp->t2d.Fz, 0, 0); arrayd_free(&dsp->t2d.F, 0, 0); arrayd_free(&dsp->t2d.Ga, 0, 0); arrayd_free(&dsp->t2d.Gz, 0, 0); arrayd_free(&dsp->t2d.G, 0, 0); arrayd_free(&dsp->t2d.Va, 0, 0); arrayd_free(&dsp->t2d.Vz, 0, 0); arrayd_free(&dsp->t2d.tv, 0, 0); arrayd_free(&dsp->t2d_Rmat1, 0, 0); arrayd_free(&dsp->t2d_Rmat2, 0, 0); arrayd_free(&dsp->t2d_mvar_3dbasis, 0, 0); arrayd_free(&dsp->t2d_manbasis, 0, 0); } void display_tour2d_init (displayd *dsp, ggobid *gg) { gint i, j; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint nc = d->ncols; if (nc < MIN_NVARS_FOR_TOUR2D) return; alloc_tour2d(dsp, gg); /* Initialize starting subset of active variables */ if (nc < 8) { dsp->t2d.nsubset = dsp->t2d.nactive = nc; for (j=0; jt2d.subset_vars.els[j] = dsp->t2d.active_vars.els[j] = j; dsp->t2d.subset_vars_p.els[j] = dsp->t2d.active_vars_p.els[j] = true; } } else { dsp->t2d.nsubset = dsp->t2d.nactive = 3; for (j=0; j<3; j++) { dsp->t2d.subset_vars.els[j] = dsp->t2d.active_vars.els[j] = j; dsp->t2d.subset_vars_p.els[j] = dsp->t2d.active_vars_p.els[j] = true; } for (j=3; jt2d.subset_vars.els[j] = dsp->t2d.active_vars.els[j] = 0; dsp->t2d.subset_vars_p.els[j] = dsp->t2d.active_vars_p.els[j] = false; } } /* declare starting base as first p chosen variables */ arrayd_zero (&dsp->t2d.Fa); arrayd_zero (&dsp->t2d.Fz); arrayd_zero (&dsp->t2d.F); arrayd_zero (&dsp->t2d.Ga); arrayd_zero (&dsp->t2d.Gz); /* for (i=0; i<2; i++) for (j=0; jt2d.Fa.vals[i][j] = dsp->t2d.Fz.vals[i][j] = dsp->t2d.F.vals[i][j] = dsp->t2d.Ga.vals[i][j] = dsp->t2d.Gz.vals[i][j] = 0.0; */ for (i=0; i<2; i++) { dsp->t2d.Fz.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.Fa.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.Ga.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.Gz.vals[i][dsp->t2d.active_vars.els[i]] = 1.0; } dsp->t2d.dist_az = 0.0; dsp->t2d.delta = cpanel->t2d.step*M_PI_2/10.0; dsp->t2d.tang = 0.0; dsp->t2d.idled = 0; dsp->t2d.get_new_target = true; dsp->t2d_video = false; /* manip */ dsp->t2d_manip_var = 0; /* pp */ dsp->t2d.target_selection_method = TOUR_RANDOM; dsp->t2d_ppda = NULL; dsp->t2d_axes = true; dsp->t2d_pp_op.temp_start = 1.0; dsp->t2d_pp_op.cooling = 0.99; tour2d_speed_set_display(sessionOptions->defaultTourSpeed, dsp); } void tour2d_fade_vars (gboolean fade, ggobid *gg) { gg->tour2d.fade_vars = fade; } void tour2d_all_vars (displayd *dsp) { ggobid *gg = dsp->ggobi; GGobiData *d = dsp->d; gint j; //gg->tour2d.all_vars = !gg->tour2d.all_vars; //if (gg->tour2d.all_vars) //{ for (j=0; jncols; j++) { dsp->t2d.subset_vars.els[j] = j; dsp->t2d.active_vars.els[j] = j; dsp->t2d.subset_vars_p.els[j] = true; dsp->t2d.active_vars_p.els[j] = true; } dsp->t2d.nsubset = d->ncols; dsp->t2d.nactive = d->ncols; dsp->t2d.get_new_target = true; zero_tau(dsp->t2d.tau, 2); varcircles_visibility_set (dsp, gg); varpanel_refresh (dsp, gg); if (dsp->t2d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t2d_window)) { free_optimize0_p(&dsp->t2d_pp_op); alloc_optimize0_p(&dsp->t2d_pp_op, d->nrows_in_plot, dsp->t2d.nactive, 2); free_pp(&dsp->t2d_pp_param); alloc_pp(&dsp->t2d_pp_param, d->nrows_in_plot, dsp->t2d.nactive, 2); t2d_pp_reinit(dsp, gg); } //} } void tour2d_speed_set(gfloat slidepos, ggobid *gg) { displayd *dsp = gg->current_display; tour2d_speed_set_display(slidepos, dsp); } static void tour2d_speed_set_display(gfloat slidepos, displayd *dsp) { cpaneld *cpanel; if (dsp) { cpanel = &dsp->cpanel; if (cpanel) { cpanel->t2d.slidepos = slidepos; speed_set(slidepos, &cpanel->t2d.step, &dsp->t2d.delta); } } } void tour2d_pause (cpaneld *cpanel, gboolean state, displayd *dsp, ggobid *gg) { gboolean pausedp = cpanel->t2d.paused; if (dsp == NULL) return; cpanel->t2d.paused = state; /* This condition is experimental and is used to avoid the case where we have an XY plot in paused tour mode and we create a new plot. When that happens, the initialization of that new plot in cpanel_tour2d_set sets the pause button which triggers this routine to be invoked as part of the callback. Since the paused state is 0, we end up calling tour2d_func with state = 1 which means turn it on. And so the tour is active for that new display! And we consume CPU cycles galore. DTL. */ /* if(state == 0 && dsp->t2d.idled == 0) */ if(pausedp == 0 && state == 0 && dsp->t2d.idled == 0) return; tour2d_func (!cpanel->t2d.paused, dsp, gg); if (cpanel->t2d.paused) { /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (dsp, FULL, gg); } } /*-- add/remove jvar to/from the subset of variables that be active --*/ gboolean tour2d_subset_var_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subset = dsp->t2d.subset_vars_p.els[jvar]; gint j, k; gboolean changed = false; /* * require 3 variables in the subset, though only 2 are * required in active_vars */ if (in_subset) { if (dsp->t2d.nsubset > MIN_NVARS_FOR_TOUR2D) { dsp->t2d.subset_vars_p.els[jvar] = false; dsp->t2d.nsubset -= 1; changed = true; } } else { dsp->t2d.subset_vars_p.els[jvar] = true; dsp->t2d.nsubset += 1; changed = true; } /*-- reset subset_vars based on subset_vars_p --*/ if (changed) { dsp->t2d_manipvar_inc = false; for (j=0, k=0; jncols; j++) if (dsp->t2d.subset_vars_p.els[j]) { dsp->t2d.subset_vars.els[k++] = j; if (j == dsp->t2d_manip_var) dsp->t2d_manipvar_inc = true; } /*-- Manip var needs to be one of the active vars --*/ if (!dsp->t2d_manipvar_inc) { dsp->t2d_manip_var = dsp->t2d.subset_vars.els[0]; } zero_tau(dsp->t2d.tau, 2); dsp->t2d.get_new_target = true; } return changed; } /*-- add or remove jvar from the set of active variables --*/ void tour2d_active_var_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gint j, jtmp, k; gboolean in_subset = dsp->t2d.subset_vars_p.els[jvar]; gboolean active = dsp->t2d.active_vars_p.els[jvar]; /* * This covers the case where we've just removed a variable * from the subset and then called tour2d_active_var_set .. * but the variable is already inactive, so we don't need to * do anything. */ if (!active && !in_subset) /**/return; /* deselect var if t2d.nactive > 2 */ if (active) { if (dsp->t2d.nactive > 2) { for (j=0; jt2d.nactive; j++) { if (jvar == dsp->t2d.active_vars.els[j]) break; } if (jt2d.nactive-1) { for (k=j; kt2d.nactive-1; k++) { dsp->t2d.active_vars.els[k] = dsp->t2d.active_vars.els[k+1]; } } dsp->t2d.nactive--; if (!gg->tour2d.fade_vars) /* set current position without sel var */ { gt_basis(dsp->t2d.Fa, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 2); arrayd_copy(&dsp->t2d.Fa, &dsp->t2d.F); zero_tau(dsp->t2d.tau, 2); } dsp->t2d.active_vars_p.els[jvar] = false; } } else { /* not active, so add the variable */ if (jvar > dsp->t2d.active_vars.els[dsp->t2d.nactive-1]) { dsp->t2d.active_vars.els[dsp->t2d.nactive] = jvar; } else if (jvar < dsp->t2d.active_vars.els[0]) { for (j=dsp->t2d.nactive; j>0; j--) { dsp->t2d.active_vars.els[j] = dsp->t2d.active_vars.els[j-1]; } dsp->t2d.active_vars.els[0] = jvar; } else { jtmp = dsp->t2d.nactive; for (j=0; jt2d.nactive-1; j++) { if (jvar > dsp->t2d.active_vars.els[j] && jvar < dsp->t2d.active_vars.els[j+1]) { jtmp = j+1; break; } } for (j=dsp->t2d.nactive-1;j>=jtmp; j--) dsp->t2d.active_vars.els[j+1] = dsp->t2d.active_vars.els[j]; dsp->t2d.active_vars.els[jtmp] = jvar; } dsp->t2d.nactive++; dsp->t2d.active_vars_p.els[jvar] = true; } dsp->t2d.get_new_target = true; /* Check if pp indices are being calculated, if so re-allocate and re-initialize as necessary */ if (dsp->t2d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t2d_window)) { free_optimize0_p(&dsp->t2d_pp_op); alloc_optimize0_p(&dsp->t2d_pp_op, d->nrows_in_plot, dsp->t2d.nactive, 2); free_pp(&dsp->t2d_pp_param); alloc_pp(&dsp->t2d_pp_param, d->nrows_in_plot, dsp->t2d.nactive, 2); t2d_pp_reinit(dsp, gg); } } static void tour2d_manip_var_set (gint j, ggobid *gg) { displayd *dsp = gg->current_display; dsp->t2d_manip_var = j; } gboolean tour2d_varsel (GtkWidget *w, gint jvar, gint toggle, gint mouse, GGobiData *d, ggobid *gg) { displayd *dsp = gg->current_display; gboolean changed = true; if (GTK_IS_TOGGLE_BUTTON(w) || GTK_IS_BUTTON(w)) { /* * add/remove jvar to/from the subset of variables that be active */ gboolean fade = gg->tour2d.fade_vars; changed = tour2d_subset_var_set(jvar, d, dsp, gg); if (changed) { varcircles_visibility_set (dsp, gg); /*-- Add/remove the variable to/from the active set, too. --*/ gg->tour2d.fade_vars = false; tour2d_active_var_set (jvar, d, dsp, gg); gg->tour2d.fade_vars = fade; } } else if (GTK_IS_DRAWING_AREA(w)) { /*-- we don't care which button it is --*/ if (d->vcirc_ui.jcursor == GDK_HAND2) { tour2d_manip_var_set (jvar, gg); varcircles_cursor_set_default (d); } else { /*-- add or remove from set of active variables --*/ tour2d_active_var_set (jvar, d, dsp, gg); /* if (dsp->t2d.target_selection_method == TOUR_PP)*/ } } return changed; } void tour2d_projdata(splotd *sp, greal **world_data, GGobiData *d, ggobid *gg) { gint i, j, m; displayd *dsp = (displayd *) sp->displayptr; greal precis = (greal) PRECISION1; greal tmpf, maxx, maxy; if (sp->tour2d.initmax) { sp->tour2d.maxscreen = precis; sp->tour2d.initmax = false; } tmpf = precis/sp->tour2d.maxscreen; maxx = sp->tour2d.maxscreen; maxy = sp->tour2d.maxscreen; for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; sp->planar[i].x = 0; sp->planar[i].y = 0; for (j=0; jncols; j++) { sp->planar[i].x += (greal)(dsp->t2d.F.vals[0][j]*world_data[i][j]); sp->planar[i].y += (greal)(dsp->t2d.F.vals[1][j]*world_data[i][j]); } sp->planar[i].x *= tmpf; sp->planar[i].y *= tmpf; if (fabs(sp->planar[i].x) > maxx) maxx = fabs(sp->planar[i].x); if (fabs(sp->planar[i].y) > maxy) maxy = fabs(sp->planar[i].y); } if ((maxx > precis) || (maxy > precis)) { sp->tour2d.maxscreen = (maxx > maxy) ? maxx : maxy; tmpf = precis/tmpf; } } void tour2d_scramble(ggobid *gg) { displayd *dsp = gg->current_display; GGobiData *d = dsp->d; arrayd_zero (&dsp->t2d.Fa); arrayd_zero (&dsp->t2d.Fz); arrayd_zero (&dsp->t2d.F); arrayd_zero (&dsp->t2d.Ga); arrayd_zero (&dsp->t2d.Gz); gt_basis(dsp->t2d.Fa, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 2); arrayd_copy(&dsp->t2d.Fa, &dsp->t2d.F); dsp->t2d.tau.els[0] = 0.0; dsp->t2d.tau.els[1] = 0.0; dsp->t2d.get_new_target = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } void tour2d_snap(ggobid *gg) { displayd *dsp = gg->current_display; splotd *sp = gg->current_splot; GGobiData *d = dsp->d; gint j; gdouble rnge; vartabled *vt; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); rnge = vt->lim.max - vt->lim.min; fprintf(stdout,"%f %f %f %f \n", dsp->t2d.F.vals[0][j], dsp->t2d.F.vals[1][j],dsp->t2d.F.vals[0][j]/rnge*sp->scale.x, dsp->t2d.F.vals[1][j]/rnge*sp->scale.y); } } void tour2d_video(ggobid *gg) { displayd *dsp = gg->current_display; if (dsp == NULL) return; dsp->t2d_video = !dsp->t2d_video; } void tour2d_write_video(ggobid *gg) { displayd *dsp = gg->current_display; splotd *sp = gg->current_splot; GGobiData *d = dsp->d; gint j; vartabled *vt; gdouble rnge; /* g_printerr("%f %f\n",sp->scale.x, sp->scale.y);*/ for (j=0; jncols; j++) { vt = vartable_element_get (j, d); rnge = vt->lim.max - vt->lim.min; fprintf(stdout,"%f %f %f %f\n", dsp->t2d.F.vals[0][j], dsp->t2d.F.vals[1][j], dsp->t2d.F.vals[0][j]/rnge*sp->scale.x, dsp->t2d.F.vals[1][j]/rnge*sp->scale.y); /* g_printerr("%f %f %f %f\n", dsp->t2d.F.vals[0][j], dsp->t2d.F.vals[1][j], vt->lim.min, vt->lim.max);*/ } } void tour2d_run(displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint i, j, nv; /* static gint count = 0;*/ gboolean revert_random = false; gint k; gboolean chosen; gfloat eps = .01; gint pathprob = 0; extern void t2d_ppdraw_think(displayd *,ggobid *); /* Need to see why ppval goes down even though optimize is on. */ /* Controls interpolation steps */ if (!dsp->t2d.get_new_target && !reached_target(dsp->t2d.tang, dsp->t2d.dist_az, dsp->t2d.target_selection_method, &dsp->t2d.ppval, &dsp->t2d.oppval)) { increment_tour(dsp->t2d.tinc, dsp->t2d.tau, dsp->t2d.dist_az, dsp->t2d.delta, &dsp->t2d.tang, (gint) 2); tour_reproject(dsp->t2d.tinc, dsp->t2d.G, dsp->t2d.Ga, dsp->t2d.Gz, dsp->t2d.F, dsp->t2d.Va, d->ncols, (gint) 2); /* plot pp indx */ if (dsp->t2d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t2d_window)) { /* if (dsp->t2d_ppda != NULL) {*/ dsp->t2d.oppval = dsp->t2d.ppval; revert_random = t2d_switch_index(cpanel->t2d, 0, dsp, gg); t2d_ppdraw(dsp->t2d.ppval, dsp, gg); } } else { /* we're at the target plane */ if (dsp->t2d.get_new_target) { /* store the pp parameters */ if (dsp->t2d.target_selection_method == TOUR_PP) { /* dsp->t2d_pp_op.index_best = dsp->t2d.ppval; for (i=0; i<2; i++) for (j=0; jt2d.nactive; j++) dsp->t2d_pp_op.proj_best.vals[i][j] = dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[j]];*/ } } else {/* make sure the ending projection is the same as the target */ if (dsp->t2d.target_selection_method == TOUR_RANDOM) { if (dsp->t2d.tau.els[0] > 0.0 || dsp->t2d.tau.els[1] > 0.0) { do_last_increment(dsp->t2d.tinc, dsp->t2d.tau, dsp->t2d.dist_az, (gint) 2); tour_reproject(dsp->t2d.tinc, dsp->t2d.G, dsp->t2d.Ga, dsp->t2d.Gz, dsp->t2d.F, dsp->t2d.Va, d->ncols, (gint) 2); } } } nv = 0; for (i=0; incols; i++) { chosen = false; for (k=0; kt2d.nactive; k++) { if (dsp->t2d.active_vars.els[k] == i) { chosen = true; break; } } if (!chosen) { if (fabs(dsp->t2d.F.vals[0][i]) < eps && fabs(dsp->t2d.F.vals[1][i]) < eps) dsp->t2d.F.vals[0][i] = dsp->t2d.F.vals[1][i] = 0.0; if (fabs(dsp->t2d.F.vals[0][i]) > eps || fabs(dsp->t2d.F.vals[1][i]) > eps) { nv++; } } } /* now cleanup: store the current basis into the starting basis */ arrayd_copy(&dsp->t2d.F, &dsp->t2d.Fa); if (nv == 0 && dsp->t2d.nactive <= 2) /* only generate new dir if num of active/used variables is > 2 - this code allows for motion to continue while a variable is fading out. */ dsp->t2d.get_new_target = true; else { if (dsp->t2d.target_selection_method == TOUR_RANDOM) { gt_basis(dsp->t2d.Fz, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 2); } else if (dsp->t2d.target_selection_method == TOUR_PP) { /* pp guided tour */ for (j=0; j<2; j++) for (i=0; incols; i++) dsp->t2d.Fz.vals[j][i] = 0.0; dsp->t2d.Fz.vals[0][dsp->t2d.active_vars.els[0]]=1.0; dsp->t2d.Fz.vals[1][dsp->t2d.active_vars.els[1]]=1.0; dsp->t2d.oppval = -1.0; t2d_ppdraw_think(dsp, gg); /*XX*/ gdk_flush (); revert_random = t2d_switch_index(cpanel->t2d, dsp->t2d.target_selection_method, dsp, gg); if (!revert_random) { for (i=0; i<2; i++) for (j=0; jt2d.nactive; j++) { if (isfinite((gdouble)dsp->t2d_pp_op.proj_best.vals[i][j]) != 0) dsp->t2d.Fz.vals[i][dsp->t2d.active_vars.els[j]] = dsp->t2d_pp_op.proj_best.vals[i][j]; } /* dsp->t2d_pp_op.index_best = 0.0;*/ /*g_printerr ("tour_run:index_best %f temp %f \n", dsp->t2d_pp_op.index_best, dsp->t2d_pp_op.temp); g_printerr ("proj: "); for (i=0; it2d_pp_op.proj_best.ncols; i++) g_printerr ("%f ", dsp->t2d_pp_op.proj_best.vals[0][i]); g_printerr ("\n"); */ /* if the best projection is the same as the previous one, switch to a random projection */ /* if (!checkequiv(dsp->t2d.Fa.vals, dsp->t2d.Fz.vals, d->ncols, 2)) { gt_basis(dsp->t2d.Fz, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 2); for (i=0; i<2; i++) for (j=0; jt2d.nactive; j++) dsp->t2d_pp_op.proj_best.vals[i][j] = dsp->t2d.Fz.vals[i][dsp->t2d.active_vars.els[j]]; revert_random = t2d_switch_index(cpanel->t2d, dsp->t2d.target_selection_method, dsp, gg); }*/ /* t2d_ppdraw(dsp->t2d.ppval, dsp, gg);*/ /* count = 0;*/ ggobi_sleep(0); } else { /* gt_basis(dsp->t2d.Fz, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 2);*/ } } pathprob = tour_path(dsp->t2d.Fa, dsp->t2d.Fz, dsp->t2d.F, d->ncols, (gint) 2, dsp->t2d.Ga, dsp->t2d.Gz, dsp->t2d.G, dsp->t2d.lambda, dsp->t2d.tv, dsp->t2d.Va, dsp->t2d.Vz, dsp->t2d.tau, dsp->t2d.tinc, &dsp->t2d.dist_az, &dsp->t2d.tang); if (pathprob == 0) dsp->t2d.get_new_target = false; else if (pathprob == 1) { /* problems with Fa so need to force a jump */ tour2d_scramble(gg); pathprob = tour_path(dsp->t2d.Fa, dsp->t2d.Fz, dsp->t2d.F, d->ncols, (gint) 2, dsp->t2d.Ga, dsp->t2d.Gz, dsp->t2d.G, dsp->t2d.lambda, dsp->t2d.tv, dsp->t2d.Va, dsp->t2d.Vz, dsp->t2d.tau, dsp->t2d.tinc, &dsp->t2d.dist_az, &dsp->t2d.tang); } else if (pathprob == 2 || pathprob == 3) { /* problems with Fz, so will force a new choice of Fz */ dsp->t2d.get_new_target = true; } } } display_tailpipe (dsp, FULL_1PIXMAP, gg); varcircles_refresh (d, gg); if (dsp->t2d_video) tour2d_write_video(gg); } void tour2d_do_step(displayd *dsp, ggobid *gg) { tour2d_run(dsp, gg); } gint tour2d_idle_func (displayd *dsp) { ggobid *gg = GGobiFromDisplay (dsp); cpaneld *cpanel = &dsp->cpanel; gboolean doit = !cpanel->t2d.paused; if (doit) { tour2d_run (dsp, gg); gdk_flush (); } return (doit); } void tour2d_func (gboolean state, displayd *dsp, ggobid *gg) { /* * Since the tour variables are stored at the display level, * assume for the time being that a display with a tour must * be running in the first and only splot. */ splotd *sp = (splotd *) g_list_nth_data (dsp->splots, 0); if (state) { if (dsp->t2d.idled == 0) { dsp->t2d.idled = g_idle_add_full (G_PRIORITY_LOW, (GtkFunction) tour2d_idle_func, dsp, NULL); gg->tour2d.idled = 1; } } else { if (dsp->t2d.idled != 0) { g_source_remove (dsp->t2d.idled); dsp->t2d.idled = 0; } gg->tour2d.idled = 0; } splot_connect_expose_handler (dsp->t2d.idled, sp); } void tour2d_reinit(ggobid *gg) { gint i; displayd *dsp = gg->current_display; GGobiData *d = dsp->d; splotd *sp = gg->current_splot; arrayd_zero (&dsp->t2d.Fa); arrayd_zero (&dsp->t2d.Fz); arrayd_zero (&dsp->t2d.F); arrayd_zero (&dsp->t2d.Ga); arrayd_zero (&dsp->t2d.Gz); for (i=0; i<2; i++) { dsp->t2d.Fz.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.Fa.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.Ga.vals[i][dsp->t2d.active_vars.els[i]] = dsp->t2d.Gz.vals[i][dsp->t2d.active_vars.els[i]] = 1.0; } /* for (i=0; i<2; i++) { for (j=0; jncols; j++) { dsp->t2d.Fa.vals[i][j] = 0.; dsp->t2d.F.vals[i][j] = 0.; } dsp->t2d.Fa.vals[i][dsp->t2d.active_vars.els[i]] = 1.; dsp->t2d.F.vals[i][dsp->t2d.active_vars.els[i]] = 1.; }*/ dsp->t2d.tau.els[0] = 0.0; dsp->t2d.tau.els[1] = 0.0; dsp->t2d.get_new_target = true; sp->tour2d.initmax = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); if (dsp->t2d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t2d_window)) t2d_pp_reinit(dsp, gg); } /* Variable manipulation */ void tour2d_manip_init(gint p1, gint p2, splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); gint j, k; gint n1vars = dsp->t2d.nactive; /*gfloat ftmp;*/ gfloat tol = 0.05; gdouble dtmp1; /* need to turn off tour */ if (!cpanel->t2d.paused) tour2d_func(T2DOFF, gg->current_display, gg); /* If de-selected variables are still fading out of the tour we will need to take them out before starting manipulation - no we don't 8/5/02 */ /* for (j=0; jncols; j++) if (dsp->t2d.active_vars_p.els[j] == false) { if (dsp->t2d.F.vals[0][j] > 0.0) dsp->t2d.F.vals[0][j] = 0.0; if (dsp->t2d.F.vals[1][j] > 0.0) dsp->t2d.F.vals[1][j] = 0.0; } norm(dsp->t2d.F.vals[0],d->ncols); norm(dsp->t2d.F.vals[1],d->ncols); if (!gram_schmidt(dsp->t2d.F.vals[0], dsp->t2d.F.vals[1], d->ncols))*/ #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d.F[0] equivalent to t2d.F[1]\n");*/ #else ; #endif dsp->t2d_manipvar_inc = false; dsp->t2d_pos1 = dsp->t2d_pos1_old = p1; dsp->t2d_pos2 = dsp->t2d_pos2_old = p2; /* check if manip var is one of existing vars */ /* n1vars, n2vars is the number of variables, excluding the manip var in hor and vert directions */ for (j=0; jt2d.nactive; j++) if (dsp->t2d.active_vars.els[j] == dsp->t2d_manip_var) { dsp->t2d_manipvar_inc = true; n1vars--; } /* here need to check if the manip var is wholly contained in u, and if so do some check */ if (n1vars > 1) { /* make manip basis, from existing projection */ /* 0,1 will be the remainder of the projection, and 2 will be the indicator vector for the manip var */ for (j=0; jncols; j++) { dsp->t2d_manbasis.vals[0][j] = dsp->t2d.F.vals[0][j]; dsp->t2d_manbasis.vals[1][j] = dsp->t2d.F.vals[1][j]; dsp->t2d_manbasis.vals[2][j] = 0.; } dsp->t2d_manbasis.vals[2][dsp->t2d_manip_var] = 1.; for (j=0; j<3; j++) { for (k=0; k<3; k++) dsp->t2d_mvar_3dbasis.vals[j][k] = 0.; dsp->t2d_mvar_3dbasis.vals[j][j] = 1.; } norm(dsp->t2d_manbasis.vals[0],d->ncols); /* this is just in case */ norm(dsp->t2d_manbasis.vals[1],d->ncols); /* it seems to work ok */ norm(dsp->t2d_manbasis.vals[2],d->ncols); /* without normalizing here */ /* Check if column 3 (2) of manbasis is effectively equal to column 1 (0) or 2(1). If they are then we'll have to randomly generate a new column 3. If not then we orthonormalize column 3 on the other two. */ while (!gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[2], d->ncols)) { gt_basis(dsp->t2d.tv, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d_manbasis.vals[2][j] = dsp->t2d.tv.vals[0][j]; } while (!gram_schmidt(dsp->t2d_manbasis.vals[1], dsp->t2d_manbasis.vals[2], d->ncols)) { gt_basis(dsp->t2d.tv, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d_manbasis.vals[2][j] = dsp->t2d.tv.vals[0][j]; } while (!gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[1], d->ncols)) { gt_basis(dsp->t2d.tv, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d_manbasis.vals[1][j] = dsp->t2d.tv.vals[0][j]; } /* This is innocuous, if the vectors are orthnormal nothing gets changed. But it protects against the case when vectors 0,1 were not orthonormal and a new vector 1 was generated, it checks the o.n. of all 3 vectors again. */ gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[1], d->ncols); gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[2], d->ncols); gram_schmidt(dsp->t2d_manbasis.vals[1], dsp->t2d_manbasis.vals[2], d->ncols); /* ftmp = 0.0; while (ftmp < tol) { if ((fabs(inner_prod(dsp->t2d_manbasis.vals[0],dsp->t2d_manbasis.vals[2], d->ncols))>1.0-tol) || (fabs(inner_prod(dsp->t2d_manbasis.vals[1], dsp->t2d_manbasis.vals[2],d->ncols))>1.0-tol)) { gt_basis(dsp->t2d.tv, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d_manbasis.vals[2][j] = dsp->t2d.tv.vals[0][j]; g_printerr("0 manbasis2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[2][i]); g_printerr("\n"); if (!gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[2], d->ncols)) g_printerr("t2d_manbasis[0] equivalent to t2d_manbasis[2]\n"); if (!gram_schmidt(dsp->t2d_manbasis.vals[1], dsp->t2d_manbasis.vals[2], d->ncols)) g_printerr("t2d_manbasis[1] equivalent to t2d_manbasis[2]\n"); g_printerr("1 manbasis0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[0][i]); g_printerr("\n"); g_printerr("1 manbasis1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[1][i]); g_printerr("\n"); g_printerr("1 manbasis2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[2][i]); g_printerr("\n"); ftmp = calc_norm (dsp->t2d_manbasis.vals[2], d->ncols); } else if (fabs(inner_prod(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[1],d->ncols))>1.0-tol) { printf("1 = 0\n"); gt_basis(dsp->t2d.tv, dsp->t2d.nactive, dsp->t2d.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d_manbasis.vals[1][j] = dsp->t2d.tv.vals[0][j]; if (!gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[1], d->ncols)) g_printerr("t2d_manbasis[0] equivalent to t2d_manbasis[1]\n"); * this might not be necessary * if (!gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[2], d->ncols)) g_printerr("t2d_manbasis[0] equivalent to t2d_manbasis[2]\n"); if (!gram_schmidt(dsp->t2d_manbasis.vals[1], dsp->t2d_manbasis.vals[2], d->ncols)) g_printerr("t2d_manbasis[1] equivalent to t2d_manbasis[2]\n"); ftmp = calc_norm (dsp->t2d_manbasis.vals[1], d->ncols); } else { printf("ok\n"); if (!gram_schmidt(dsp->t2d_manbasis.vals[0], dsp->t2d_manbasis.vals[2], d->ncols)) g_printerr("t2d_manbasis[0] equivalent to t2d_manbasis[2]\n"); if (!gram_schmidt(dsp->t2d_manbasis.vals[1], dsp->t2d_manbasis.vals[2], d->ncols)) g_printerr("t2d_manbasis[1] equivalent to t2d_manbasis[2]\n"); ftmp = calc_norm (dsp->t2d_manbasis.vals[2], d->ncols); } }*/ /* while (ftmp < tol) { }*/ dsp->t2d_no_dir_flag = false; if (cpanel->t2d.manip_mode == MANIP_RADIAL) { /* check if variable is currently visible in plot */ if ((dsp->t2d.F.vals[0][dsp->t2d_manip_var]* dsp->t2d.F.vals[0][dsp->t2d_manip_var] + dsp->t2d.F.vals[1][dsp->t2d_manip_var]* dsp->t2d.F.vals[1][dsp->t2d_manip_var]) < tol) dsp->t2d_no_dir_flag = true; /* no */ else { /* yes: set radial manip direction to be current direction of contribution */ dsp->t2d_rx = (gfloat) dsp->t2d.F.vals[0][dsp->t2d_manip_var]; dsp->t2d_ry = (gfloat) dsp->t2d.F.vals[1][dsp->t2d_manip_var]; dtmp1 = sqrt(dsp->t2d_rx*dsp->t2d_rx+dsp->t2d_ry*dsp->t2d_ry); dsp->t2d_rx /= dtmp1; dsp->t2d_ry /= dtmp1; } } } } void tour2d_manip(gint p1, gint p2, splotd *sp, ggobid *gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint actual_nvars = dsp->t2d.nactive; gboolean offscreen = false; gfloat phi, cosphi, sinphi, ca, sa, cosm, cospsi, sinpsi; gfloat distx, disty, x1, x2, y1, y2; gfloat denom = (gfloat) MIN(sp->max.x, sp->max.y)/2.; gfloat tol = 0.01; gdouble dtmp1, dtmp2; gfloat len_motion; gint i,j,k; gboolean pp_problem = false; /* check if off the plot window */ if (p1 > sp->max.x || p1 < 0 || p2 > sp->max.y || p2 < 0) offscreen = true; if (dsp->t2d_manipvar_inc) actual_nvars = dsp->t2d.nactive-1; if (!offscreen) { dsp->t2d_pos1_old = dsp->t2d_pos1; dsp->t2d_pos2_old = dsp->t2d_pos2; dsp->t2d_pos1 = p1; dsp->t2d_pos2 = p2; if (actual_nvars > 1) { distx = disty = 0; if (cpanel->t2d.manip_mode != MANIP_ANGULAR) { if (cpanel->t2d.manip_mode == MANIP_OBLIQUE) { distx = dsp->t2d_pos1 - dsp->t2d_pos1_old; disty = dsp->t2d_pos2_old - dsp->t2d_pos2; } else if (cpanel->t2d.manip_mode == MANIP_VERT) { disty = dsp->t2d_pos2_old - dsp->t2d_pos2; } else if (cpanel->t2d.manip_mode == MANIP_HOR) { distx = dsp->t2d_pos1 - dsp->t2d_pos1_old; } else if (cpanel->t2d.manip_mode == MANIP_RADIAL) { if (dsp->t2d_no_dir_flag) { distx = dsp->t2d_pos1 - dsp->t2d_pos1_old; disty = dsp->t2d_pos2_old - dsp->t2d_pos2; dsp->t2d_rx = distx; dsp->t2d_ry = disty; dtmp1 = sqrt(dsp->t2d_rx*dsp->t2d_rx+dsp->t2d_ry*dsp->t2d_ry); dsp->t2d_rx /= dtmp1; dsp->t2d_ry /= dtmp1; dsp->t2d_no_dir_flag = false; } distx = (dsp->t2d_rx*(dsp->t2d_pos1 - dsp->t2d_pos1_old) + dsp->t2d_ry*(dsp->t2d_pos2_old - dsp->t2d_pos2))*dsp->t2d_rx; disty = (dsp->t2d_rx*(dsp->t2d_pos1 - dsp->t2d_pos1_old) + dsp->t2d_ry*(dsp->t2d_pos2_old - dsp->t2d_pos2))*dsp->t2d_ry; } dtmp1 = (gdouble) (distx*distx+disty*disty); len_motion = (gfloat) sqrt(dtmp1); if (len_motion < tol) /* just in case, maybe not necessary */ { dsp->t2d_Rmat2.vals[0][0] = 1.0; dsp->t2d_Rmat2.vals[0][1] = 0.0; dsp->t2d_Rmat2.vals[0][2] = 0.0; dsp->t2d_Rmat2.vals[1][0] = 0.0; dsp->t2d_Rmat2.vals[1][1] = 1.0; dsp->t2d_Rmat2.vals[1][2] = 0.0; dsp->t2d_Rmat2.vals[2][0] = 0.0; dsp->t2d_Rmat2.vals[2][1] = 0.0; dsp->t2d_Rmat2.vals[2][2] = 1.0; } else { phi = len_motion / denom; ca = distx/len_motion; sa = disty/len_motion; cosphi = (gfloat) cos((gdouble) phi); sinphi = (gfloat) sin((gdouble) phi); cosm = 1.0 - cosphi; dsp->t2d_Rmat2.vals[0][0] = ca*ca*cosphi + sa*sa; dsp->t2d_Rmat2.vals[0][1] = -cosm*ca*sa; dsp->t2d_Rmat2.vals[0][2] = sinphi*ca; dsp->t2d_Rmat2.vals[1][0] = -cosm*ca*sa; dsp->t2d_Rmat2.vals[1][1] = sa*sa*cosphi + ca*ca; dsp->t2d_Rmat2.vals[1][2] = sinphi*sa; dsp->t2d_Rmat2.vals[2][0] = -sinphi*ca; dsp->t2d_Rmat2.vals[2][1] = -sinphi*sa; dsp->t2d_Rmat2.vals[2][2] = cosphi; } } else { /* angular constrained manipulation */ if (dsp->t2d_pos1_old != sp->max.x/2 && dsp->t2d_pos2_old != sp->max.y/2 && dsp->t2d_pos1 != sp->max.x/2 && dsp->t2d_pos2 != sp->max.y/2) { x1 = dsp->t2d_pos1_old - sp->max.x/2; y1 = dsp->t2d_pos2_old - sp->max.y/2; dtmp1 = sqrt(x1*x1+y1*y1); x1 /= dtmp1; y1 /= dtmp1; x2 = dsp->t2d_pos1 - sp->max.x/2; y2 = dsp->t2d_pos2 - sp->max.y/2; dtmp2 = sqrt(x2*x2+y2*y2); x2 /= dtmp2; y2 /= dtmp2; if (dtmp1 > tol && dtmp2 > tol) { cospsi = x1*x2+y1*y2; sinpsi = x1*y2-y1*x2; } else { cospsi = 1.; sinpsi = 0.; } } else { cospsi = 1.; sinpsi = 0.; } dsp->t2d_Rmat2.vals[0][0] = cospsi; dsp->t2d_Rmat2.vals[0][1] = sinpsi; dsp->t2d_Rmat2.vals[0][2] = 0.; dsp->t2d_Rmat2.vals[1][0] = -sinpsi; dsp->t2d_Rmat2.vals[1][1] = cospsi; dsp->t2d_Rmat2.vals[1][2] = 0.; dsp->t2d_Rmat2.vals[2][0] = 0.; dsp->t2d_Rmat2.vals[2][1] = 0.; dsp->t2d_Rmat2.vals[2][2] = 1.; } /* Set up the rotation matrix in the 3D manip space */ for (i=0; i<3; i++) for (j=0; j<3; j++) { dtmp1 = 0.; for (k=0; k<3; k++) dtmp1 += (dsp->t2d_mvar_3dbasis.vals[i][k]* dsp->t2d_Rmat2.vals[k][j]); dsp->t2d_Rmat1.vals[i][j] = dtmp1; } arrayd_copy(&dsp->t2d_Rmat1, &dsp->t2d_mvar_3dbasis); norm(dsp->t2d_mvar_3dbasis.vals[0],3); /* just in case */ norm(dsp->t2d_mvar_3dbasis.vals[1],3); /* seems to work ok without */ norm(dsp->t2d_mvar_3dbasis.vals[2],3); /* this */ if (!gram_schmidt(dsp->t2d_mvar_3dbasis.vals[0], dsp->t2d_mvar_3dbasis.vals[1], 3)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d_mvar[0] equivalent to t2d_mvar[1]\n");*/ #else ; #endif if (!gram_schmidt(dsp->t2d_mvar_3dbasis.vals[0], dsp->t2d_mvar_3dbasis.vals[2], 3)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d_mvar[0] equivalent to t2d_mvar[2]\n");*/ #else ; #endif if (!gram_schmidt(dsp->t2d_mvar_3dbasis.vals[1], dsp->t2d_mvar_3dbasis.vals[2], 3)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d_mvar[1] equivalent to t2d_mvar[2]\n");*/ #else ; #endif /* Generate the projection of the data corresponding to the 3D rotation in the manip space. */ for (j=0; jncols; j++) { dsp->t2d.F.vals[0][j] = dsp->t2d_manbasis.vals[0][j]*dsp->t2d_mvar_3dbasis.vals[0][0] + dsp->t2d_manbasis.vals[1][j]*dsp->t2d_mvar_3dbasis.vals[0][1] + dsp->t2d_manbasis.vals[2][j]*dsp->t2d_mvar_3dbasis.vals[0][2]; dsp->t2d.F.vals[1][j] = dsp->t2d_manbasis.vals[0][j]*dsp->t2d_mvar_3dbasis.vals[1][0] + dsp->t2d_manbasis.vals[1][j]*dsp->t2d_mvar_3dbasis.vals[1][1] + dsp->t2d_manbasis.vals[2][j]*dsp->t2d_mvar_3dbasis.vals[1][2]; } norm(dsp->t2d.F.vals[0], d->ncols); norm(dsp->t2d.F.vals[1], d->ncols); /* if (calc_norm(dsp->t2d.F.vals[0], d->ncols)>1.01) { g_printerr("1 F0 out of bounds\n"); g_printerr("F0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d.F.vals[0][i]); g_printerr("\n"); g_printerr("F1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d.F.vals[1][i]); g_printerr("\n"); g_printerr("manbasis0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[0][i]); g_printerr("\n"); g_printerr("manbasis1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[1][i]); g_printerr("\n"); g_printerr("manbasis2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_manbasis.vals[2][i]); g_printerr("\n"); g_printerr("m3dvar0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_mvar_3dbasis.vals[0][i]); g_printerr("\n"); g_printerr("m3dvar1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_mvar_3dbasis.vals[1][i]); g_printerr("\n"); g_printerr("m3dvar2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d_mvar_3dbasis.vals[2][i]); g_printerr("\n"); g_printerr("distx %f disty %f\n",distx,disty); } if (calc_norm(dsp->t2d.F.vals[1], d->ncols)>1.01) g_printerr("1 F1 out of bounds\n");*/ if (!gram_schmidt(dsp->t2d.F.vals[0], dsp->t2d.F.vals[1], d->ncols)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d.F[0] equivalent to t2d.F[2]\n");*/ #else ; #endif /* if (calc_norm(dsp->t2d.F.vals[0], d->ncols)>1.0) g_printerr("F0 out of bounds\n"); if (calc_norm(dsp->t2d.F.vals[1], d->ncols)>1.0) g_printerr("F1 out of bounds\n"); */ } /* plot pp indx */ if (dsp->t2d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t2d_window)) { /* if (dsp->t2d_ppda != NULL) {*/ dsp->t2d.oppval = dsp->t2d.ppval; pp_problem = t2d_switch_index(cpanel->t2d, 0, dsp, gg); t2d_ppdraw(dsp->t2d.ppval, dsp, gg); } display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } } void tour2d_manip_end(splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); disconnect_motion_signal (sp); arrayd_copy(&dsp->t2d.F, &dsp->t2d.Fa); zero_tau(dsp->t2d.tau, 2); dsp->t2d.get_new_target = true; /* need to turn on tour? */ if (!cpanel->t2d.paused) { tour2d_func(T2DON, dsp, gg); /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (dsp, FULL, gg); } } #undef T2DON #undef T2DOFF ggobi-2.1.12/src/tour_pp.h0000644000175000017500000000416214651527764011021 #ifndef TOUR_PP_H #define TOUR_PP_H /* tour_pp.h */ /* Copyright (C) 2001 Dianne Cook and Sigbert Klinke This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The authors can be contacted at the following email addresses: dicook@iastate.edu sigbert@wiwi.hu-berlin.de */ gint alloc_optimize0_p (optimize0_param *op, gint nrows, gint ncols, gint ndim); gint free_optimize0_p (optimize0_param *op); gboolean iszero (array_f *data); void initrandom(gfloat start); gfloat uniformrandom(void); gfloat normalrandom(void); void normal_fill (array_f *data, gfloat delta, array_f *base); void orthonormal (array_f *proj); gint optimize0 (optimize0_param *op, Tour_PPIndex_f fun, void *param); /* Utility routines */ gdouble ludcmp(gdouble *a, gint n, gint *Pivot); gdouble tour_pp_solve(gdouble *a, gdouble *b, gint n, gint *Pivot); void inverse(gdouble *a, gint n); /* Arbitrary dimensional indices */ gint holes_raw(array_f *pdata, void *param, gfloat *val, gpointer unused); gint central_mass_raw(array_f *pdata, void *param, gfloat *val, gpointer unused); void zero (gdouble *ptr, gint length); void zero_int (gint *mem, gint size); gint compute_groups (vector_i group, vector_i ngroup, gint *groups, gint nrows, gfloat *gdata); gint discriminant (array_f *pdata, void *param, gfloat *val, gpointer unused); gint cartgini (array_f *pdata, void *param, gfloat *val, gpointer unused); gint cartentropy (array_f *pdata, void *param, gfloat *val, gpointer unused); #endif ggobi-2.1.12/src/print.c0000644000175000017500000001034314651527764010456 /* print.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "print.h" #include #include #include #include //static void addDialogButtons(GtkWidget *dialog, PrintInfo *data); static void handlePrintOptions (PrintInfo * info); GGobiPrintHandler DefaultPrintHandler; PrintInfo * createPrintInfo (GtkWidget * dialog, PrintOptions * options, displayd * dpy, ggobid * gg, PrintDialogHandler print, void *userData) { PrintInfo *data; data = (PrintInfo *) g_malloc (1 * sizeof (PrintInfo)); data->options = options; data->dpy = dpy; data->ggobi = gg; data->dialog = dialog; data->handler = print; data->userData = userData; return (data); } PrintOptions * showPrintDialog (PrintOptions * options, displayd * dpy, ggobid * gg, GGobiPrintHandler * printHandler) { GtkWidget *dlg; PrintInfo *info; dlg = createPrintDialog (dpy); info = createPrintInfo (dlg, options, dpy, gg, printHandler->dialog, printHandler->userData); if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_ACCEPT) handlePrintOptions (info); gtk_widget_destroy (dlg); g_free (info); //gdk_window_show(dlg->window); //gdk_window_raise(dlg->window); return (options); } GtkWidget * createPrintDialog (displayd * dpy) { gchar *title; GtkWidget *dialog; title = g_malloc ((strlen ("Print Options") + strlen ((dpy ? " for display" : "")) + 1) * sizeof (gchar)); sprintf (title, "%s%s", "Print Options", (dpy ? " for display" : "")); dialog = gtk_dialog_new_with_buttons (title, NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); //gtk_window_set_title(GTK_WINDOW(dialog), title); //addDialogButtons(dialog, data); //gtk_widget_show_all(dialog); return (dialog); } /* Local handlers for the printing dialog action buttons (Okay, Cancel). */ static void handlePrintOptions (PrintInfo * info) { gboolean ok = true; PrintOptions localOptions; PrintOptions *opts; opts = (info->handler == NULL) ? &localOptions : info->ggobi->printOptions; /* Get the settings from the dialog elements. For the moment, just grab them from the defaults. */ getDefaultPrintOptions (opts); if (info->handler) { ok = info->handler (opts, info, info->userData); } else { /* We already have set the options globally when we got them. */ } } /* This is the unfinished version of the default print handler for the stand-alone ggobi. It is the value to which DefaultHandler is set. It simply takes the display object from the PrintInfo that was established when the print button was selected. We return true to indicate that the print was successful. */ void setStandardPrintHandlers () { if (DefaultPrintHandler.callback == NULL && DefaultPrintHandler.dialog == NULL) { DefaultPrintHandler.userData = NULL; } if (DefaultPrintHandler.callback == NULL) DefaultPrintHandler.callback = &showPrintDialog; //if(DefaultPrintHandler.dialog == NULL) // DefaultPrintHandler.dialog = PrintAsSVG; } PrintOptions * getDefaultPrintOptions (PrintOptions * opts) { GdkColor black, white; if (opts == NULL) opts = (PrintOptions *) g_malloc (sizeof (PrintOptions)); opts->width = 480; opts->height = 400; opts->file = (OutputDescription *) g_malloc (sizeof (OutputDescription)); //opts->file->fileName = g_strdup("foo.svg"); gdk_color_white (gdk_colormap_get_system (), &white); gdk_color_black (gdk_colormap_get_system (), &black); opts->background = white; opts->foreground = black; return (opts); } ggobi-2.1.12/src/fileio.h0000644000175000017500000000421014651527764010572 /* fileio.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef FILE_IO_H #define FILE_IO_H #ifdef __cplusplus extern "C" { #endif typedef struct _GGobiInputPluginInfo GGobiInputPluginInfo; typedef struct _GGobiPluginInfo GGobiPluginInfo; typedef struct _ggobid ggobid; typedef struct _InputDescription InputDescription; typedef GSList* (*InputReader)(InputDescription *desc, ggobid *gg, GGobiPluginInfo *); typedef gboolean (*InputProbe)(const char * const input, ggobid *gg, GGobiPluginInfo *); typedef InputDescription* (*InputGetDescription)(const char * const fileName, const char * const input, ggobid *gg, GGobiPluginInfo*); struct _InputDescription { gchar *fileName; /* the name of the file to read, fully expanded */ gchar *baseName; /* With the extension removed. */ gchar *givenExtension; /* the extension of the file to be read, computed when processing the file name. */ gchar *dirName; /* The name of the directory in which the file is located, useful for relative URIs. */ DataMode mode; /* The mode of the file. */ gboolean canVerify; /* A boolean indicating whether the format was verified, which is not possible e.g. when reading a zipped xml file, */ GSList *extensions; /* a collection of file extension names and modes. */ void *userData; InputReader desc_read_input; }; gboolean isURL(const gchar *fileName); void completeFileDesc(const gchar *fileName, InputDescription *desc); gboolean file_is_readable(const gchar *fileName); #ifdef __cplusplus } #endif #endif ggobi-2.1.12/src/tour2d3.c0000644000175000017500000010462514651527764010633 /* tour2d3.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include "vars.h" #include "externs.h" #define T2D3ON true #define T2D3OFF false void display_tour2d3_init_null (displayd *dsp, ggobid *gg) { arrayd_init_null(&dsp->t2d3.Fa); arrayd_init_null(&dsp->t2d3.Fz); arrayd_init_null(&dsp->t2d3.F); arrayd_init_null(&dsp->t2d3.Ga); arrayd_init_null(&dsp->t2d3.Gz); arrayd_init_null(&dsp->t2d3.G); arrayd_init_null(&dsp->t2d3.Va); arrayd_init_null(&dsp->t2d3.Vz); arrayd_init_null(&dsp->t2d3.tv); vectori_init_null(&dsp->t2d3.subset_vars); vectorb_init_null(&dsp->t2d3.subset_vars_p); vectori_init_null(&dsp->t2d3.active_vars); vectorb_init_null(&dsp->t2d3.active_vars_p); vectorf_init_null(&dsp->t2d3.lambda); vectorf_init_null(&dsp->t2d3.tau); vectorf_init_null(&dsp->t2d3.tinc); /* manipulation variables */ arrayd_init_null(&dsp->t2d3_Rmat1); arrayd_init_null(&dsp->t2d3_Rmat2); arrayd_init_null(&dsp->t2d3_mvar_3dbasis); arrayd_init_null(&dsp->t2d3_manbasis); } void alloc_tour2d3 (displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint nc = d->ncols; /* first index is the projection dimensions, second dimension is ncols */ arrayd_alloc(&dsp->t2d3.Fa, 2, nc); arrayd_alloc(&dsp->t2d3.Fz, 2, nc); arrayd_alloc(&dsp->t2d3.F, 2, nc); arrayd_alloc(&dsp->t2d3.Ga, 2, nc); arrayd_alloc(&dsp->t2d3.Gz, 2, nc); arrayd_alloc(&dsp->t2d3.G, 2, nc); arrayd_alloc(&dsp->t2d3.Va, 2, nc); arrayd_alloc(&dsp->t2d3.Vz, 2, nc); arrayd_alloc(&dsp->t2d3.tv, 2, nc); vectori_alloc(&dsp->t2d3.subset_vars, nc); vectorb_alloc_zero(&dsp->t2d3.subset_vars_p, nc); vectori_alloc(&dsp->t2d3.active_vars, nc); vectorb_alloc_zero(&dsp->t2d3.active_vars_p, nc); vectorf_alloc(&dsp->t2d3.lambda, nc); vectorf_alloc_zero(&dsp->t2d3.tau, nc); vectorf_alloc(&dsp->t2d3.tinc, nc); /* manipulation variables */ arrayd_alloc(&dsp->t2d3_Rmat1, 3, 3); arrayd_alloc(&dsp->t2d3_Rmat2, 3, 3); arrayd_alloc(&dsp->t2d3_mvar_3dbasis, 3, 3); arrayd_alloc(&dsp->t2d3_manbasis, 3, nc); } /*-- eliminate the nc columns contained in *cols --*/ void tour2d3_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg) { displayd *dsp; GList *l; for (l=gg->displays; l; l=l->next) { dsp = (displayd *) l->data; if (dsp->d == d) { arrayd_delete_cols (&dsp->t2d3.Fa, nc, cols); arrayd_delete_cols (&dsp->t2d3.Fz, nc, cols); arrayd_delete_cols (&dsp->t2d3.F, nc, cols); arrayd_delete_cols (&dsp->t2d3.Ga, nc, cols); arrayd_delete_cols (&dsp->t2d3.Gz, nc, cols); arrayd_delete_cols (&dsp->t2d3.G, nc, cols); arrayd_delete_cols (&dsp->t2d3.Va, nc, cols); arrayd_delete_cols (&dsp->t2d3.Vz, nc, cols); arrayd_delete_cols (&dsp->t2d3.tv, nc, cols); vectori_delete_els (&dsp->t2d3.subset_vars, nc, cols); vectorb_delete_els (&dsp->t2d3.subset_vars_p, nc, cols); vectori_delete_els (&dsp->t2d3.active_vars, nc, cols); vectorb_delete_els (&dsp->t2d3.active_vars_p, nc, cols); vectorf_delete_els (&dsp->t2d3.lambda, nc, cols); vectorf_delete_els (&dsp->t2d3.tau, nc, cols); vectorf_delete_els (&dsp->t2d3.tinc, nc, cols); arrayd_delete_cols (&dsp->t2d3_manbasis, (gint) nc, cols); } } } void free_tour2d3(displayd *dsp) { vectori_free(&dsp->t2d3.subset_vars); vectorb_free(&dsp->t2d3.subset_vars_p); vectori_free(&dsp->t2d3.active_vars); vectorb_free(&dsp->t2d3.active_vars_p); vectorf_free(&dsp->t2d3.lambda); vectorf_free(&dsp->t2d3.tau); vectorf_free(&dsp->t2d3.tinc); arrayd_free(&dsp->t2d3.Fa, 0, 0); arrayd_free(&dsp->t2d3.Fz, 0, 0); arrayd_free(&dsp->t2d3.F, 0, 0); arrayd_free(&dsp->t2d3.Ga, 0, 0); arrayd_free(&dsp->t2d3.Gz, 0, 0); arrayd_free(&dsp->t2d3.G, 0, 0); arrayd_free(&dsp->t2d3.Va, 0, 0); arrayd_free(&dsp->t2d3.Vz, 0, 0); arrayd_free(&dsp->t2d3.tv, 0, 0); arrayd_free(&dsp->t2d3_Rmat1, 0, 0); arrayd_free(&dsp->t2d3_Rmat2, 0, 0); arrayd_free(&dsp->t2d3_mvar_3dbasis, 0, 0); arrayd_free(&dsp->t2d3_manbasis, 0, 0); } void display_tour2d3_init (displayd *dsp, ggobid *gg) { gint i, j; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint nc = d->ncols; if (nc < MIN_NVARS_FOR_TOUR2D3) return; alloc_tour2d3(dsp, gg); /* * subset_vars.els[0] = VARSEL_X * subset_vars.els[1] = VARSEL_Y * subset_vars.els[2] = VARSEL_Z */ dsp->t2d3.nsubset = dsp->t2d3.nactive = 3; for (j=0; jt2d3.subset_vars.els[j] = dsp->t2d3.active_vars.els[j] = 0; dsp->t2d3.subset_vars_p.els[j] = dsp->t2d3.active_vars_p.els[j] = false; } for (j=0; j<3; j++) { dsp->t2d3.subset_vars.els[j] = dsp->t2d3.active_vars.els[j] = j; dsp->t2d3.subset_vars_p.els[j] = dsp->t2d3.active_vars_p.els[j] = true; } /* declare starting base as first 2 chosen variables */ arrayd_zero (&dsp->t2d3.Fa); arrayd_zero (&dsp->t2d3.Fz); arrayd_zero (&dsp->t2d3.F); arrayd_zero (&dsp->t2d3.Ga); arrayd_zero (&dsp->t2d3.Gz); for (i=0; i<2; i++) { dsp->t2d3.Fz.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.Fa.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.F.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.Ga.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.Gz.vals[i][dsp->t2d3.active_vars.els[i]] = 1.0; } dsp->t2d3.dist_az = 0.0; dsp->t2d3.delta = cpanel->t2d3.step*M_PI_2/10.0; dsp->t2d3.tang = 0.0; dsp->t2d3.idled = 0; dsp->t2d3.get_new_target = true; /* manip */ dsp->t2d3_manip_var = 0; dsp->t2d.target_selection_method = 0; } void tour2d3_speed_set(gfloat slidepos, ggobid *gg) { displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; cpanel->t2d3.slidepos = slidepos; speed_set(slidepos, &cpanel->t2d3.step, &dsp->t2d3.delta); } void tour2d3_pause (cpaneld *cpanel, gboolean state, ggobid *gg) { displayd *dsp = gg->current_display; GGobiData *d = dsp->d; cpanel->t2d3.paused = state; tour2d3_func (!cpanel->t2d3.paused, gg->current_display, gg); if (cpanel->t2d3.paused) { /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (gg->current_display, FULL, gg); varcircles_refresh (d, gg); } } /*-- add/remove jvar to/from the subset of variables that be active --*/ gboolean tour2d3_subset_var_set (gint jvar, gint *jprev, gint toggle, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subset = dsp->t2d3.subset_vars_p.els[jvar]; gint j, k; gboolean changed = false; gint xyz; *jprev = dsp->t2d3.subset_vars.els[toggle]; /*-- require exactly 3 variables in the subset --*/ if (in_subset) { /*-- handle a swap --*/ if (dsp->t2d3.subset_vars.els[toggle] == jvar) /**/ return false; switch (toggle) { case VARSEL_X: xyz = (jvar == dsp->t2d3.subset_vars.els[VARSEL_Y]) ? VARSEL_Y : VARSEL_Z; break; case VARSEL_Y: xyz = (jvar == dsp->t2d3.subset_vars.els[VARSEL_X]) ? VARSEL_X : VARSEL_Z; break; case VARSEL_Z: xyz = (jvar == dsp->t2d3.subset_vars.els[VARSEL_X]) ? VARSEL_X : VARSEL_Y; break; default: /**/ return false; break; } dsp->t2d3.subset_vars.els[xyz] = dsp->t2d3.subset_vars.els[toggle]; dsp->t2d3.subset_vars.els[toggle] = jvar; changed = true; } else { dsp->t2d3.subset_vars.els[toggle] = jvar; changed = true; } /*-- reset subset_vars_p and active_vars based on subset_vars: unlike other tour modes --*/ if (changed) { dsp->t2d3_manipvar_inc = false; for (j=0; jncols; j++) { dsp->t2d3.subset_vars_p.els[j] = false; } for (j=0; j<3; j++) { k = dsp->t2d3.subset_vars.els[j]; dsp->t2d3.subset_vars_p.els[k] = true; if (k == dsp->t2d3_manip_var) dsp->t2d3_manipvar_inc = true; } /*-- Manip var needs to be one of the active vars --*/ if (!dsp->t2d3_manipvar_inc) dsp->t2d3_manip_var = dsp->t2d3.subset_vars.els[0]; zero_tau(dsp->t2d3.tau, 2); dsp->t2d3.get_new_target = true; } return changed; } /*-- add or remove jvar from the set of active variables --*/ void tour2d3_active_vars_swap (gint jvar_out, gint jvar_in, GGobiData *d, displayd *dsp, ggobid *gg) { gint k; gint a, b; gboolean both_in_subset = dsp->t2d3.subset_vars_p.els[jvar_out] && dsp->t2d3.subset_vars_p.els[jvar_in]; if (both_in_subset) { /* swap their positions in active_vars */ a = b = -1; for (k=0; kt2d3.nactive; k++) { if (dsp->t2d3.active_vars.els[k] == jvar_in) a = k; else if (dsp->t2d3.active_vars.els[k] == jvar_out) b = k; } if (a != -1 && b != -1) { dsp->t2d3.active_vars.els[a] = jvar_out; dsp->t2d3.active_vars.els[b] = jvar_in; } } else { dsp->t2d3.active_vars_p.els[jvar_out] = false; dsp->t2d3.active_vars_p.els[jvar_in] = true; for (k=0; kt2d3.nactive; k++) if (dsp->t2d3.active_vars.els[k] == jvar_out) dsp->t2d3.active_vars.els[k] = jvar_in; } gt_basis(dsp->t2d3.Fa, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 2); arrayd_copy(&dsp->t2d3.Fa, &dsp->t2d3.F); zero_tau(dsp->t2d3.tau, 2); dsp->t2d3.get_new_target = true; } static void tour2d3_manip_var_set (gint j, ggobid *gg) { displayd *dsp = gg->current_display; dsp->t2d3_manip_var = j; } gboolean tour2d3_varsel (GtkWidget *w, gint jvar, gint toggle, gint mouse, GGobiData *d, ggobid *gg) { displayd *dsp = gg->current_display; gboolean changed = true; gint jprev; if (GTK_IS_TOGGLE_BUTTON(w)) { /* add/remove jvar to/from the subset of variables that be active */ changed = tour2d3_subset_var_set(jvar, &jprev, toggle, d, dsp, gg); if (changed) { varcircles_visibility_set (dsp, gg); tour2d3_active_vars_swap (jprev, jvar, d, dsp, gg); display_tailpipe (gg->current_display, FULL, gg); varcircles_refresh (d, gg); } } else if (GTK_IS_BUTTON(w)) { /*-- it's the label --*/ /*-- 'mouse' is the mouse button; translate it to one of the toggles --*/ changed = tour2d3_subset_var_set(jvar, &jprev, mouse-1, d, dsp, gg); if (changed) { varcircles_visibility_set (dsp, gg); tour2d3_active_vars_swap (jprev, jvar, d, dsp, gg); display_tailpipe (gg->current_display, FULL, gg); varcircles_refresh (d, gg); } } else if (GTK_IS_DRAWING_AREA(w)) { if (d->vcirc_ui.jcursor == GDK_HAND2) { tour2d3_manip_var_set (jvar, gg); varcircles_cursor_set_default (d); } } return changed; } void tour2d3_projdata(splotd *sp, greal **world_data, GGobiData *d, ggobid *gg) { gint i, j, m; displayd *dsp = (displayd *) sp->displayptr; greal precis = (greal) PRECISION1; greal tmpf, maxx, maxy; if (sp->tour2d3.initmax) { sp->tour2d3.maxscreen = precis; sp->tour2d3.initmax = false; } tmpf = precis/sp->tour2d3.maxscreen; maxx = sp->tour2d3.maxscreen; maxy = sp->tour2d3.maxscreen; for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; sp->planar[i].x = 0; sp->planar[i].y = 0; for (j=0; jncols; j++) { sp->planar[i].x += (greal)(dsp->t2d3.F.vals[0][j]*world_data[i][j]); sp->planar[i].y += (greal)(dsp->t2d3.F.vals[1][j]*world_data[i][j]); } sp->planar[i].x *= tmpf; sp->planar[i].y *= tmpf; if (fabs(sp->planar[i].x) > maxx) maxx = fabs(sp->planar[i].x); if (fabs(sp->planar[i].y) > maxy) maxy = fabs(sp->planar[i].y); } if ((maxx > precis) || (maxy > precis)) { sp->tour2d3.maxscreen = (maxx > maxy) ? maxx : maxy; tmpf = precis/tmpf; } } void tour2d3_scramble(ggobid *gg) { displayd *dsp = gg->current_display; GGobiData *d = dsp->d; arrayd_zero (&dsp->t2d3.Fa); arrayd_zero (&dsp->t2d3.Fz); arrayd_zero (&dsp->t2d3.F); arrayd_zero (&dsp->t2d3.Ga); arrayd_zero (&dsp->t2d3.Gz); gt_basis(dsp->t2d3.Fa, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 2); arrayd_copy(&dsp->t2d3.Fa, &dsp->t2d3.F); dsp->t2d3.tau.els[0] = 0.0; dsp->t2d3.tau.els[1] = 0.0; dsp->t2d3.get_new_target = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } void tour2d3_run(displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint i, nv; gint k; gboolean chosen; gfloat eps = .01; gint pathprob = 0; if (!dsp->t2d3.get_new_target && !reached_target(dsp->t2d3.tang, dsp->t2d3.dist_az, dsp->t2d3.target_selection_method, &dsp->t2d3.ppval, &dsp->t2d3.oppval)) { increment_tour(dsp->t2d3.tinc, dsp->t2d3.tau, dsp->t2d3.dist_az, dsp->t2d3.delta, &dsp->t2d3.tang, (gint) 2); tour_reproject(dsp->t2d3.tinc, dsp->t2d3.G, dsp->t2d3.Ga, dsp->t2d3.Gz, dsp->t2d3.F, dsp->t2d3.Va, d->ncols, (gint) 2); } else { /* do final clean-up and get new target */ if (dsp->t2d3.tau.els[0] > 0.0 || dsp->t2d3.tau.els[1] > 0.0) { do_last_increment(dsp->t2d3.tinc, dsp->t2d3.tau, dsp->t2d3.dist_az, (gint) 2); tour_reproject(dsp->t2d3.tinc, dsp->t2d3.G, dsp->t2d3.Ga, dsp->t2d3.Gz, dsp->t2d3.F, dsp->t2d3.Va, d->ncols, (gint) 2); } nv = 0; for (i=0; incols; i++) { chosen = false; for (k=0; kt2d3.nactive; k++) { if (dsp->t2d3.active_vars.els[k] == i) { chosen = true; break; } } if (!chosen) { if (fabs(dsp->t2d3.F.vals[0][i]) < eps && fabs(dsp->t2d3.F.vals[1][i]) < eps) dsp->t2d3.F.vals[0][i] = dsp->t2d3.F.vals[1][i] = 0.0; if (fabs(dsp->t2d3.F.vals[0][i]) > eps || fabs(dsp->t2d3.F.vals[1][i]) > eps) { nv++; } } } arrayd_copy(&dsp->t2d3.F, &dsp->t2d3.Fa); if (nv == 0 && dsp->t2d3.nactive <= 2) /* only generate new dir if num of active/used variables is > 2 - this code allows for motion to continue while a variable is fading out. */ dsp->t2d3.get_new_target = true; else { gt_basis(dsp->t2d3.Fz, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 2); pathprob = tour_path(dsp->t2d3.Fa, dsp->t2d3.Fz, dsp->t2d3.F, d->ncols, (gint) 2, dsp->t2d3.Ga, dsp->t2d3.Gz, dsp->t2d3.G, dsp->t2d3.lambda, dsp->t2d3.tv, dsp->t2d3.Va, dsp->t2d3.Vz, dsp->t2d3.tau, dsp->t2d3.tinc, &dsp->t2d3.dist_az, &dsp->t2d3.tang); if (pathprob == 0) dsp->t2d3.get_new_target = false; else if (pathprob == 1) { /* problems with Fa so need to force a jump */ tour2d3_scramble(gg); pathprob = tour_path(dsp->t2d3.Fa, dsp->t2d3.Fz, dsp->t2d3.F, d->ncols, (gint) 2, dsp->t2d3.Ga, dsp->t2d3.Gz, dsp->t2d3.G, dsp->t2d3.lambda, dsp->t2d3.tv, dsp->t2d3.Va, dsp->t2d3.Vz, dsp->t2d3.tau, dsp->t2d3.tinc, &dsp->t2d3.dist_az, &dsp->t2d3.tang); } else if (pathprob == 2 || pathprob == 3) { /* problems with Fz, so will force a new choice of Fz */ dsp->t2d3.get_new_target = true; } } } display_tailpipe (dsp, FULL_1PIXMAP, gg); varcircles_refresh (d, gg); } void tour2d3_do_step(displayd *dsp, ggobid *gg) { tour2d3_run(dsp, gg); } gint tour2d3_idle_func (displayd *dsp) { ggobid *gg = GGobiFromDisplay (dsp); cpaneld *cpanel = &dsp->cpanel; gboolean doit = !cpanel->t2d3.paused; if (doit) { tour2d3_run (dsp, gg); gdk_flush (); } return (doit); } void tour2d3_func (gboolean state, displayd *dsp, ggobid *gg) { splotd *sp = (splotd *) g_list_nth_data (dsp->splots, 0); if (state) { if (dsp->t2d3.idled == 0) { dsp->t2d3.idled = g_idle_add_full (G_PRIORITY_LOW, (GtkFunction) tour2d3_idle_func, dsp, NULL); } gg->tour2d3.idled = 1; } else { if (dsp->t2d3.idled != 0) { g_source_remove (dsp->t2d3.idled); dsp->t2d3.idled = 0; } gg->tour2d3.idled = 0; } splot_connect_expose_handler (dsp->t2d3.idled, sp); } void tour2d3_reinit(ggobid *gg) { gint i; displayd *dsp = gg->current_display; GGobiData *d = dsp->d; splotd *sp = gg->current_splot; arrayd_zero (&dsp->t2d3.Fa); arrayd_zero (&dsp->t2d3.Fz); arrayd_zero (&dsp->t2d3.F); arrayd_zero (&dsp->t2d3.Ga); arrayd_zero (&dsp->t2d3.Gz); for (i=0; i<2; i++) { dsp->t2d3.Fz.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.Fa.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.F.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.Ga.vals[i][dsp->t2d3.active_vars.els[i]] = dsp->t2d3.Gz.vals[i][dsp->t2d3.active_vars.els[i]] = 1.0; } dsp->t2d3.get_new_target = true; sp->tour2d3.initmax = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } /* Variable manipulation */ void tour2d3_manip_init(gint p1, gint p2, splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); gint j, k; gint n1vars = dsp->t2d3.nactive; gfloat tol = 0.05; gdouble dtmp1; /* need to turn off tour */ if (!cpanel->t2d3.paused) tour2d3_func(T2D3OFF, gg->current_display, gg); /* If de-selected variables are still fading out of the tour we will need to take them out before starting manipulation */ for (j=0; jncols; j++) if (dsp->t2d3.active_vars_p.els[j] == false) { if (dsp->t2d3.F.vals[0][j] > 0.0) dsp->t2d3.F.vals[0][j] = 0.0; if (dsp->t2d3.F.vals[1][j] > 0.0) dsp->t2d3.F.vals[1][j] = 0.0; } norm(dsp->t2d3.F.vals[0],d->ncols); norm(dsp->t2d3.F.vals[1],d->ncols); if (!gram_schmidt(dsp->t2d3.F.vals[0], dsp->t2d3.F.vals[1], d->ncols)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d3.F[0] equivalent to t2d3.F[1]\n");*/ #else ; #endif dsp->t2d3_manipvar_inc = false; dsp->t2d3_pos1 = dsp->t2d3_pos1_old = p1; dsp->t2d3_pos2 = dsp->t2d3_pos2_old = p2; /* check if manip var is one of existing vars */ /* n1vars, n2vars is the number of variables, excluding the manip var in hor and vert directions */ for (j=0; jt2d3.nactive; j++) if (dsp->t2d3.active_vars.els[j] == dsp->t2d3_manip_var) { dsp->t2d3_manipvar_inc = true; n1vars--; } /* the manip var has to be one of the active variables in this mode, so if it is not, then set it to be the first active variable */ if (!dsp->t2d3_manipvar_inc) { dsp->t2d3_manip_var = dsp->t2d3.active_vars.els[0]; dsp->t2d3_manipvar_inc = true; n1vars--; } /* here need to check if the manip var is wholly contained in u, and if so do some check */ if (n1vars > 1) { /* make manip basis, from existing projection */ /* 0,1 will be the remainder of the projection, and 2 will be the indicator vector for the manip var */ for (j=0; jncols; j++) { dsp->t2d3_manbasis.vals[0][j] = dsp->t2d3.F.vals[0][j]; dsp->t2d3_manbasis.vals[1][j] = dsp->t2d3.F.vals[1][j]; dsp->t2d3_manbasis.vals[2][j] = 0.; } dsp->t2d3_manbasis.vals[2][dsp->t2d3_manip_var] = 1.; for (j=0; j<3; j++) { for (k=0; k<3; k++) dsp->t2d3_mvar_3dbasis.vals[j][k] = 0.; dsp->t2d3_mvar_3dbasis.vals[j][j] = 1.; } norm(dsp->t2d3_manbasis.vals[0], d->ncols); /* this is just in case */ norm(dsp->t2d3_manbasis.vals[1], d->ncols); /* it seems to work ok */ norm(dsp->t2d3_manbasis.vals[2], d->ncols); /* without normalizing here */ /* Check if column 3 (2) of manbasis is effectively equal to column 1 (0) or 2(1). If they are then we'll have to randomly generate a new column 3. If not then we orthonormalize column 3 on the other two. */ while (!gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[2], d->ncols)) { gt_basis(dsp->t2d3.tv, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d3_manbasis.vals[2][j] = dsp->t2d3.tv.vals[0][j]; } while (!gram_schmidt(dsp->t2d3_manbasis.vals[1], dsp->t2d3_manbasis.vals[2], d->ncols)) { gt_basis(dsp->t2d3.tv, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d3_manbasis.vals[2][j] = dsp->t2d3.tv.vals[0][j]; } while (!gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[1], d->ncols)) { gt_basis(dsp->t2d3.tv, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d3_manbasis.vals[1][j] = dsp->t2d3.tv.vals[0][j]; } /* This is innocuous, if the vectors are orthnormal nothing gets changed. But it protects against the case when vectors 0,1 were not orthonormal and a new vector 1 was generated, it checks the o.n. of all 3 vectors again. */ gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[1], d->ncols); gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[2], d->ncols); gram_schmidt(dsp->t2d3_manbasis.vals[1], dsp->t2d3_manbasis.vals[2], d->ncols); /* ftmp = 0.0; while (ftmp < tol) { if ((fabs(inner_prod(dsp->t2d3_manbasis.vals[0],dsp->t2d3_manbasis.vals[2], d->ncols))>1.0-tol) || (fabs(inner_prod(dsp->t2d3_manbasis.vals[1], dsp->t2d3_manbasis.vals[2],d->ncols))>1.0-tol)) { gt_basis(dsp->t2d3.tv, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d3_manbasis.vals[2][j] = dsp->t2d3.tv.vals[0][j]; g_printerr("0 manbasis2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[2][i]); g_printerr("\n"); if (!gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[2], d->ncols)) g_printerr("t2d3_manbasis[0] equivalent to t2d3_manbasis[2]\n"); if (!gram_schmidt(dsp->t2d3_manbasis.vals[1], dsp->t2d3_manbasis.vals[2], d->ncols)) g_printerr("t2d3_manbasis[1] equivalent to t2d3_manbasis[2]\n"); g_printerr("1 manbasis0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[0][i]); g_printerr("\n"); g_printerr("1 manbasis1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[1][i]); g_printerr("\n"); g_printerr("1 manbasis2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[2][i]); g_printerr("\n"); ftmp = calc_norm (dsp->t2d3_manbasis.vals[2], d->ncols); } else if (fabs(inner_prod(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[1],d->ncols))>1.0-tol) { printf("1 = 0\n"); gt_basis(dsp->t2d3.tv, dsp->t2d3.nactive, dsp->t2d3.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t2d3_manbasis.vals[1][j] = dsp->t2d3.tv.vals[0][j]; if (!gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[1], d->ncols)) g_printerr("t2d3_manbasis[0] equivalent to t2d3_manbasis[1]\n"); * this might not be necessary * if (!gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[2], d->ncols)) g_printerr("t2d3_manbasis[0] equivalent to t2d3_manbasis[2]\n"); if (!gram_schmidt(dsp->t2d3_manbasis.vals[1], dsp->t2d3_manbasis.vals[2], d->ncols)) g_printerr("t2d3_manbasis[1] equivalent to t2d3_manbasis[2]\n"); ftmp = calc_norm (dsp->t2d3_manbasis.vals[1], d->ncols); } else { printf("ok\n"); if (!gram_schmidt(dsp->t2d3_manbasis.vals[0], dsp->t2d3_manbasis.vals[2], d->ncols)) g_printerr("t2d3_manbasis[0] equivalent to t2d3_manbasis[2]\n"); if (!gram_schmidt(dsp->t2d3_manbasis.vals[1], dsp->t2d3_manbasis.vals[2], d->ncols)) g_printerr("t2d3_manbasis[1] equivalent to t2d3_manbasis[2]\n"); ftmp = calc_norm (dsp->t2d3_manbasis.vals[2], d->ncols); } }*/ /* while (ftmp < tol) { }*/ dsp->t2d3_no_dir_flag = false; if (cpanel->t2d3.manip_mode == MANIP_RADIAL) { /* check if variable is currently visible in plot */ if ((dsp->t2d3.F.vals[0][dsp->t2d3_manip_var]* dsp->t2d3.F.vals[0][dsp->t2d3_manip_var] + dsp->t2d3.F.vals[1][dsp->t2d3_manip_var]* dsp->t2d3.F.vals[1][dsp->t2d3_manip_var]) < tol) dsp->t2d3_no_dir_flag = true; /* no */ else { /* yes: set radial manip direction to be current direction of contribution */ dsp->t2d3_rx = (gfloat) dsp->t2d3.F.vals[0][dsp->t2d3_manip_var]; dsp->t2d3_ry = (gfloat) dsp->t2d3.F.vals[1][dsp->t2d3_manip_var]; dtmp1 = sqrt(dsp->t2d3_rx*dsp->t2d3_rx+dsp->t2d3_ry*dsp->t2d3_ry); dsp->t2d3_rx /= dtmp1; dsp->t2d3_ry /= dtmp1; } } } } void tour2d3_manip(gint p1, gint p2, splotd *sp, ggobid *gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint actual_nvars = dsp->t2d3.nactive; gboolean offscreen = false; gfloat phi, cosphi, sinphi, ca, sa, cosm, cospsi, sinpsi; gfloat distx, disty, x1, x2, y1, y2; gfloat denom = (gfloat) MIN(sp->max.x, sp->max.y)/2.; gfloat tol = 0.01; gdouble dtmp1, dtmp2; gfloat len_motion; gint i,j,k; /* check if off the plot window */ if (p1 > sp->max.x || p1 < 0 || p2 > sp->max.y || p2 < 0) offscreen = true; if (dsp->t2d3_manipvar_inc) actual_nvars = dsp->t2d3.nactive-1; if (!offscreen) { dsp->t2d3_pos1_old = dsp->t2d3_pos1; dsp->t2d3_pos2_old = dsp->t2d3_pos2; dsp->t2d3_pos1 = p1; dsp->t2d3_pos2 = p2; if (actual_nvars > 1) { distx = disty = 0; if (cpanel->t2d3.manip_mode != MANIP_ANGULAR) { if (cpanel->t2d3.manip_mode == MANIP_OBLIQUE) { distx = dsp->t2d3_pos1 - dsp->t2d3_pos1_old; disty = dsp->t2d3_pos2_old - dsp->t2d3_pos2; } else if (cpanel->t2d3.manip_mode == MANIP_VERT) { disty = dsp->t2d3_pos2_old - dsp->t2d3_pos2; } else if (cpanel->t2d3.manip_mode == MANIP_HOR) { distx = dsp->t2d3_pos1 - dsp->t2d3_pos1_old; } else if (cpanel->t2d3.manip_mode == MANIP_RADIAL) { if (dsp->t2d3_no_dir_flag) { distx = dsp->t2d3_pos1 - dsp->t2d3_pos1_old; disty = dsp->t2d3_pos2_old - dsp->t2d3_pos2; dsp->t2d3_rx = distx; dsp->t2d3_ry = disty; dtmp1 = sqrt(dsp->t2d3_rx*dsp->t2d3_rx+dsp->t2d3_ry*dsp->t2d3_ry); dsp->t2d3_rx /= dtmp1; dsp->t2d3_ry /= dtmp1; dsp->t2d3_no_dir_flag = false; } distx = (dsp->t2d3_rx*(dsp->t2d3_pos1 - dsp->t2d3_pos1_old) + dsp->t2d3_ry*(dsp->t2d3_pos2_old - dsp->t2d3_pos2))*dsp->t2d3_rx; disty = (dsp->t2d3_rx*(dsp->t2d3_pos1 - dsp->t2d3_pos1_old) + dsp->t2d3_ry*(dsp->t2d3_pos2_old - dsp->t2d3_pos2))*dsp->t2d3_ry; } dtmp1 = (gdouble) (distx*distx+disty*disty); len_motion = (gfloat) sqrt(dtmp1); if (len_motion < tol) /* just in case, maybe not necessary */ { dsp->t2d3_Rmat2.vals[0][0] = 1.0; dsp->t2d3_Rmat2.vals[0][1] = 0.0; dsp->t2d3_Rmat2.vals[0][2] = 0.0; dsp->t2d3_Rmat2.vals[1][0] = 0.0; dsp->t2d3_Rmat2.vals[1][1] = 1.0; dsp->t2d3_Rmat2.vals[1][2] = 0.0; dsp->t2d3_Rmat2.vals[2][0] = 0.0; dsp->t2d3_Rmat2.vals[2][1] = 0.0; dsp->t2d3_Rmat2.vals[2][2] = 1.0; } else { phi = len_motion / denom; ca = distx/len_motion; sa = disty/len_motion; cosphi = (gfloat) cos((gdouble) phi); sinphi = (gfloat) sin((gdouble) phi); cosm = 1.0 - cosphi; dsp->t2d3_Rmat2.vals[0][0] = ca*ca*cosphi + sa*sa; dsp->t2d3_Rmat2.vals[0][1] = -cosm*ca*sa; dsp->t2d3_Rmat2.vals[0][2] = sinphi*ca; dsp->t2d3_Rmat2.vals[1][0] = -cosm*ca*sa; dsp->t2d3_Rmat2.vals[1][1] = sa*sa*cosphi + ca*ca; dsp->t2d3_Rmat2.vals[1][2] = sinphi*sa; dsp->t2d3_Rmat2.vals[2][0] = -sinphi*ca; dsp->t2d3_Rmat2.vals[2][1] = -sinphi*sa; dsp->t2d3_Rmat2.vals[2][2] = cosphi; } } else { /* angular constrained manipulation */ if (dsp->t2d3_pos1_old != sp->max.x/2 && dsp->t2d3_pos2_old != sp->max.y/2 && dsp->t2d3_pos1 != sp->max.x/2 && dsp->t2d3_pos2 != sp->max.y/2) { x1 = dsp->t2d3_pos1_old - sp->max.x/2; y1 = dsp->t2d3_pos2_old - sp->max.y/2; dtmp1 = sqrt(x1*x1+y1*y1); x1 /= dtmp1; y1 /= dtmp1; x2 = dsp->t2d3_pos1 - sp->max.x/2; y2 = dsp->t2d3_pos2 - sp->max.y/2; dtmp2 = sqrt(x2*x2+y2*y2); x2 /= dtmp2; y2 /= dtmp2; if (dtmp1 > tol && dtmp2 > tol) { cospsi = x1*x2+y1*y2; sinpsi = x1*y2-y1*x2; } else { cospsi = 1.; sinpsi = 0.; } } else { cospsi = 1.; sinpsi = 0.; } dsp->t2d3_Rmat2.vals[0][0] = cospsi; dsp->t2d3_Rmat2.vals[0][1] = sinpsi; dsp->t2d3_Rmat2.vals[0][2] = 0.; dsp->t2d3_Rmat2.vals[1][0] = -sinpsi; dsp->t2d3_Rmat2.vals[1][1] = cospsi; dsp->t2d3_Rmat2.vals[1][2] = 0.; dsp->t2d3_Rmat2.vals[2][0] = 0.; dsp->t2d3_Rmat2.vals[2][1] = 0.; dsp->t2d3_Rmat2.vals[2][2] = 1.; } /* Set up the rotation matrix in the 3D manip space */ for (i=0; i<3; i++) for (j=0; j<3; j++) { dtmp1 = 0.; for (k=0; k<3; k++) dtmp1 += (dsp->t2d3_mvar_3dbasis.vals[i][k]* dsp->t2d3_Rmat2.vals[k][j]); dsp->t2d3_Rmat1.vals[i][j] = dtmp1; } arrayd_copy(&dsp->t2d3_Rmat1, &dsp->t2d3_mvar_3dbasis); norm(dsp->t2d3_mvar_3dbasis.vals[0],3); /* just in case */ norm(dsp->t2d3_mvar_3dbasis.vals[1],3); /* seems to work ok without */ norm(dsp->t2d3_mvar_3dbasis.vals[2],3); /* this */ if (!gram_schmidt(dsp->t2d3_mvar_3dbasis.vals[0], dsp->t2d3_mvar_3dbasis.vals[1], 3)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d3_mvar[0] equivalent to t2d3_mvar[1]\n");*/ #else ; #endif if (!gram_schmidt(dsp->t2d3_mvar_3dbasis.vals[0], dsp->t2d3_mvar_3dbasis.vals[2], 3)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d3_mvar[0] equivalent to t2d3_mvar[2]\n");*/ #else ; #endif if (!gram_schmidt(dsp->t2d3_mvar_3dbasis.vals[1], dsp->t2d3_mvar_3dbasis.vals[2], 3)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d3_mvar[1] equivalent to t2d3_mvar[2]\n");*/ #else ; #endif /* Generate the projection of the data corresponding to the 3D rotation in the manip space. */ for (j=0; jncols; j++) { dsp->t2d3.F.vals[0][j] = dsp->t2d3_manbasis.vals[0][j]*dsp->t2d3_mvar_3dbasis.vals[0][0] + dsp->t2d3_manbasis.vals[1][j]*dsp->t2d3_mvar_3dbasis.vals[0][1] + dsp->t2d3_manbasis.vals[2][j]*dsp->t2d3_mvar_3dbasis.vals[0][2]; dsp->t2d3.F.vals[1][j] = dsp->t2d3_manbasis.vals[0][j]*dsp->t2d3_mvar_3dbasis.vals[1][0] + dsp->t2d3_manbasis.vals[1][j]*dsp->t2d3_mvar_3dbasis.vals[1][1] + dsp->t2d3_manbasis.vals[2][j]*dsp->t2d3_mvar_3dbasis.vals[1][2]; } norm(dsp->t2d3.F.vals[0], d->ncols); norm(dsp->t2d3.F.vals[1], d->ncols); /* if (calc_norm(dsp->t2d3.F.vals[0], d->ncols)>1.01) { g_printerr("1 F0 out of bounds\n"); g_printerr("F0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3.F.vals[0][i]); g_printerr("\n"); g_printerr("F1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3.F.vals[1][i]); g_printerr("\n"); g_printerr("manbasis0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[0][i]); g_printerr("\n"); g_printerr("manbasis1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[1][i]); g_printerr("\n"); g_printerr("manbasis2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_manbasis.vals[2][i]); g_printerr("\n"); g_printerr("m3dvar0: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_mvar_3dbasis.vals[0][i]); g_printerr("\n"); g_printerr("m3dvar1: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_mvar_3dbasis.vals[1][i]); g_printerr("\n"); g_printerr("m3dvar2: "); for (i=0; i<3; i++) g_printerr("%f ",dsp->t2d3_mvar_3dbasis.vals[2][i]); g_printerr("\n"); g_printerr("distx %f disty %f\n",distx,disty); } if (calc_norm(dsp->t2d3.F.vals[1], d->ncols)>1.01) g_printerr("1 F1 out of bounds\n");*/ if (!gram_schmidt(dsp->t2d3.F.vals[0], dsp->t2d3.F.vals[1], d->ncols)) #ifdef EXCEPTION_HANDLING g_printerr("");/*t2d3.F[0] equivalent to t2d3.F[2]\n");*/ #else ; #endif /* if (calc_norm(dsp->t2d3.F.vals[0], d->ncols)>1.0) g_printerr("F0 out of bounds\n"); if (calc_norm(dsp->t2d3.F.vals[1], d->ncols)>1.0) g_printerr("F1 out of bounds\n"); */ } display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } } void tour2d3_manip_end(splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); disconnect_motion_signal (sp); arrayd_copy(&dsp->t2d3.F, &dsp->t2d3.Fa); zero_tau(dsp->t2d3.tau, 2); dsp->t2d3.get_new_target = true; /* need to turn on tour? */ if (!cpanel->t2d3.paused) { tour2d3_func (T2D3ON, gg->current_display, gg); /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (gg->current_display, FULL, gg); } } #undef T2D3ON #undef T2D3OFF ggobi-2.1.12/src/wvis.c0000644000175000017500000000103214651527764010305 /* wvis.c */ #include #include #include #include "vars.h" #include "externs.h" /** Initialize basic colors for this ggobid. */ void wvis_init (ggobid *gg) { gg->wvis.window = NULL; gg->wvis.npct = 0; gg->wvis.n = NULL; gg->wvis.nearest_color = -1; gg->wvis.motion_notify_id = 0; gg->wvis.mousepos.x = -1; gg->wvis.mousepos.y = -1; gg->wvis.pix = NULL; gg->wvis.binning_method = WVIS_EQUAL_WIDTH_BINS; gg->wvis.update_method = WVIS_UPDATE_ON_MOUSE_UP; gg->wvis.GC = NULL; } ggobi-2.1.12/src/sp_plot.c0000644000175000017500000006727514651527764011022 /* sp_plot.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include "vars.h" #include "externs.h" #include "colorscheme.h" #undef WIN32 static void splot_draw_border (splotd *, GdkDrawable *, ggobid *); static void splot_check_colors (gushort maxcolorid, gint *ncolors_used, gushort *colors_used, GGobiData *d, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; gchar *message; if (maxcolorid >= scheme->n) { /* force a remapping even if the number of colors is too large */ if (*ncolors_used > scheme->n) { message = g_strdup_printf ("The number of colors in use (%d) is greater than than\nthe number of colors in the current scheme (%d).\nColors are being reassigned.", *ncolors_used, scheme->n); quick_message (message, false); g_free (message); } else { message = g_strdup_printf ("The largest color id in use (%d) is too large for\nthe number of colors in the current scheme (%d).\nColors are being reassigned.", maxcolorid, scheme->n); quick_message (message, false); g_free (message); } colors_remap (scheme, true, gg); /* repeat to get the remapped values */ datad_colors_used_get (ncolors_used, colors_used, d, gg); } } gboolean splot_plot_case (gint m, GGobiData *d, splotd *sp, displayd *display, ggobid *gg) { gboolean draw_case = true; /*-- determine whether case m should be plotted --*/ /*-- usually checking sampled is redundant because we're looping over rows_in_plot, but maybe we're not always --*/ if (d->excluded.els[m] || !d->sampled.els[m]) draw_case = false; /*-- can prevent drawing of missings for parcoords or scatmat plots --*/ else if (ggobi_data_has_missings(d) && !d->missings_show_p) { if(GGOBI_IS_EXTENDED_SPLOT(sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); if(klass->draw_case_p) { draw_case = klass->draw_case_p(sp, m, d, gg); } } } return draw_case; } /*------------------------------------------------------------------------*/ /* drawing to pixmap0 when binning can't be used */ /*------------------------------------------------------------------------*/ void splot_clear_pixmap0 (splotd *sp, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; if (gg->plot_GC == NULL) { init_plot_GC (sp->pixmap0, gg); } /* clear the pixmap */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (sp->pixmap0, gg->plot_GC, true, 0, 0, sp->da->allocation.width, sp->da->allocation.height); } void splot_draw_to_pixmap0_unbinned (splotd *sp, gboolean draw_hidden, ggobid *gg) { gint k; gushort current_color; gint ncolors_used; gushort colors_used[MAXNCOLORS+2]; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; colorschemed *scheme = gg->activeColorScheme; gushort maxcolorid; gboolean loop_over_points; gint i, m; gboolean (*f)(splotd *, GGobiData*, ggobid*, gboolean) = NULL; /* redraw */ GGobiExtendedSPlotClass *klass = NULL; GGobiExtendedDisplayClass *displayKlass = NULL; g_assert (d->hidden.nels == d->nrows); /* * There's a problem with parallel coordinates -- once 'draw points' * is turned off, we don't get whiskers, either. Somehow we need to * have the whiskers treated with the edges rather than with the * points, but I don't know how to do that at the moment. * * The time series display has the same problem -- I thought it * had switched to using edges, but it hasn't. (I should take care * of that one of these days, since Nicholas probably won't want to.) * * loop_over_points has to be always true for both those displays, * and then the decision about whether to draw the points needs to * be deferred. -- dfs */ if (GGOBI_IS_EXTENDED_DISPLAY(display)) { displayKlass = GGOBI_EXTENDED_DISPLAY_GET_CLASS(display); /* * This has to be true for the whiskered displays if either points * or whiskers are to be drawn. */ loop_over_points = (display->options.points_show_p || display->options.whiskers_show_p) && displayKlass->loop_over_points; } else { loop_over_points = display->options.points_show_p; } if (GGOBI_IS_EXTENDED_SPLOT(sp)) { klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); f = klass->redraw; } /* Draw edges -- this doesn't include whiskers, alas */ if (displayKlass && displayKlass->show_edges_p) { if (display->options.edges_undirected_show_p || display->options.edges_arrowheads_show_p || display->options.edges_directed_show_p) { splot_edges_draw (sp, draw_hidden, sp->pixmap0, gg); } } /* Now deal with points -- and whiskers */ if (displayKlass && displayKlass->loop_over_points && f && display->options.points_show_p) { /* * Only the barchart has a redraw routine, as far as I can tell, * and it does its own handling of hiddens and colors. I could * certainly add redraw routines for the other displays ... dfs */ f(sp, d, gg, false); } else { if (draw_hidden) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); #ifdef WIN32 win32_draw_to_pixmap_unbinned (-1, sp, draw_hidden, gg); #else for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if (d->hidden_now.els[m] && splot_plot_case (m, d, sp, display, gg)) { /* * This double-check accommodates the parallel coordinates and * time series displays, because we have to ignore points_show_p * in order to draw the whiskers but not the points. */ if (display->options.points_show_p) draw_glyph (sp->pixmap0, &d->glyph_now.els[m], sp->screen, m, gg); /* draw the whiskers ... or, potentially, other decorations */ if (klass && klass->within_draw_to_unbinned) { klass->within_draw_to_unbinned(sp, m, sp->pixmap0, gg->plot_GC); } } } #endif } else { /*-- un-hidden points --*/ maxcolorid = datad_colors_used_get (&ncolors_used, colors_used, d, gg); splot_check_colors (maxcolorid, &ncolors_used, colors_used, d, gg); /* * Now loop through colors_used[], plotting the points of each * color. This avoids the need to reset the foreground so often. */ for (k=0; kplot_GC, &scheme->rgb[current_color]); #ifdef WIN32 win32_draw_to_pixmap_unbinned (current_color, sp, draw_hidden, gg); #else for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if (d->color_now.els[m] == current_color && !d->hidden_now.els[m] && splot_plot_case (m, d, sp, display, gg)) { /* * As above, this test accommodates the parallel * coordinates and time series displays, because we have * to ignore points_show_p in order to draw the whiskers * but not the points. */ if (display->options.points_show_p) draw_glyph (sp->pixmap0, &d->glyph_now.els[m], sp->screen, m, gg); if (klass && klass->within_draw_to_unbinned) { klass->within_draw_to_unbinned(sp, m, sp->pixmap0, gg->plot_GC); } } } #endif } } } return; } void splot_clear_pixmap0_binned (splotd *sp, ggobid *gg) { icoords loc_clear0, loc_clear1; icoords *bin0 = &gg->plot.bin0; icoords *bin1 = &gg->plot.bin1; icoords *loc0 = &gg->plot.loc0; icoords *loc1 = &gg->plot.loc1; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; colorschemed *scheme = gg->activeColorScheme; /* * Instead of clearing and redrawing the entire pixmap0, only * clear what's necessary. */ get_extended_brush_corners (bin0, bin1, d, sp); /* * Determine locations of bin corners: upper left edge of loc0; * lower right edge of loc1. */ loc0->x = (gint) ((gfloat) bin0->x / (gfloat) d->brush.nbins * (sp->max.x+1.0)); loc0->y = (gint) ((gfloat) bin0->y / (gfloat) d->brush.nbins * (sp->max.y+1.0)); loc1->x = (gint) ((gfloat) (bin1->x+1) / (gfloat) d->brush.nbins * (sp->max.x+1.0)); loc1->y = (gint) ((gfloat) (bin1->y+1) / (gfloat) d->brush.nbins * (sp->max.y+1.0)); /* * Clear an area a few pixels inside that region. Watch out * for border effects. */ loc_clear0.x = (bin0->x == 0) ? 0 : loc0->x + BRUSH_MARGIN; loc_clear0.y = (bin0->y == 0) ? 0 : loc0->y + BRUSH_MARGIN; loc_clear1.x = (bin1->x == d->brush.nbins-1) ? sp->max.x : loc1->x - BRUSH_MARGIN; loc_clear1.y = (bin1->y == d->brush.nbins-1) ? sp->max.y : loc1->y - BRUSH_MARGIN; if (gg->plot_GC == NULL) { init_plot_GC (sp->pixmap0, gg); } gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_rectangle (sp->pixmap0, gg->plot_GC, true, /* fill */ loc_clear0.x, loc_clear0.y, 1 + loc_clear1.x - loc_clear0.x , 1 + loc_clear1.y - loc_clear0.y); } void splot_draw_to_pixmap0_binned (splotd *sp, gboolean draw_hidden, ggobid *gg) { #ifndef WIN32 gint ih, iv; gint i, m; #endif gint k; displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; ProjectionMode proj = cpanel->pmode; GGobiData *d = display->d; colorschemed *scheme = gg->activeColorScheme; icoords *bin0 = &gg->plot.bin0; icoords *bin1 = &gg->plot.bin1; gushort maxcolorid; gushort current_color; gint ncolors_used; gushort colors_used[MAXNCOLORS+2]; GGobiExtendedSPlotClass *klass = NULL; if (gg->plot_GC == NULL) init_plot_GC (sp->pixmap0, gg); /* Allow the extended plot to take over the entire thing. If it wants to take over just a small part, see below.*/ if(GGOBI_IS_EXTENDED_SPLOT(sp)) { klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); if(klass->redraw) { displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; /* XXX barcharts, for instance, don't know about this new approach yet */ if(klass->redraw(sp, d, gg, true)) { return; } } } if (!gg->mono_p && display->options.points_show_p) { if (draw_hidden) { /* draw only the hidden cases */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); #ifdef WIN32 win32_draw_to_pixmap_binned (bin0, bin1, -1, sp, draw_hidden, gg); #else for (ih=bin0->x; ih<=bin1->x; ih++) { for (iv=bin0->y; iv<=bin1->y; iv++) { for (m=0; mbrush.binarray[ih][iv].nels ; m++) { i = d->rows_in_plot.els[d->brush.binarray[ih][iv].els[m]]; /* if hidden && plottable */ if (d->hidden_now.els[i] && splot_plot_case (i, d, sp, display, gg)) { draw_glyph (sp->pixmap0, &d->glyph_now.els[i], sp->screen, i, gg); /* parallel coordinate plot and time series plot whiskers */ if(klass && klass->within_draw_to_binned) { klass->within_draw_to_binned(sp, i, sp->pixmap0, gg->plot_GC); } } } } } #endif } else { /* if !draw_hidden */ maxcolorid = datad_colors_used_get (&ncolors_used, colors_used, d, gg); splot_check_colors (maxcolorid, &ncolors_used, colors_used, d, gg); /* * Now loop through colors_used[], plotting the points of each * color in a group. */ for (k=0; kplot_GC, &scheme->rgb[current_color]); #ifdef WIN32 win32_draw_to_pixmap_binned (bin0, bin1, current_color, sp, draw_hidden, gg); #else for (ih=bin0->x; ih<=bin1->x; ih++) { for (iv=bin0->y; iv<=bin1->y; iv++) { for (m=0; mbrush.binarray[ih][iv].nels ; m++) { i = d->rows_in_plot.els[d->brush.binarray[ih][iv].els[m]]; if (!d->hidden_now.els[i] && d->color_now.els[i] == current_color && splot_plot_case (i, d, sp, display, gg)) { draw_glyph (sp->pixmap0, &d->glyph_now.els[i], sp->screen, i, gg); /* parallel coordinate plot whiskers */ if(klass && klass->within_draw_to_binned) { klass->within_draw_to_binned(sp, i, sp->pixmap0, gg->plot_GC); } } } } } #endif } } } if (proj == TOUR1D || proj == TOUR2D3 || proj == TOUR2D || proj == COTOUR) { splot_draw_tour_axes(sp, sp->pixmap0, gg); } return; } /*------------------------------------------------------------------------*/ /* plot labels: variables */ /*------------------------------------------------------------------------*/ static void splot_add_plot_labels (splotd *sp, GdkDrawable *drawable, ggobid *gg) { displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; colorschemed *scheme = gg->activeColorScheme; gboolean proceed = (cpanel->pmode == XYPLOT || cpanel->pmode == P1PLOT || cpanel->pmode == EXTENDED_DISPLAY_PMODE); if (!proceed) return; gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); if(GGOBI_IS_EXTENDED_SPLOT(sp)) { void (*f)(splotd *, GdkDrawable*, ggobid*); f = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp)->add_plot_labels; if(f) { f(sp, drawable, gg); return; } } /* And allow the display to take up the slack if we don't want to have a special splot class for the display type but still need to do something special. */ if(GGOBI_IS_EXTENDED_DISPLAY(display)) { void (*f)(displayd *, splotd *, GdkDrawable*, GGobiData *, ggobid*); f = GGOBI_EXTENDED_DISPLAY_GET_CLASS(display)->add_plot_labels; if(f) f(display, sp, drawable, d, gg); } } #define DIAMOND_DIM 5 /*-- draw a diamond around the current case --*/ void splot_add_diamond_cue (gint k, splotd *sp, GdkDrawable *drawable, ggobid *gg) { GGobiData *d = sp->displayptr->d; gint diamond_dim = DIAMOND_DIM; GdkPoint diamond[5]; colorschemed *scheme = gg->activeColorScheme; if (k < 0 || k >= d->nrows) return; diamond[0].x = diamond[4].x = sp->screen[k].x - diamond_dim; diamond[0].y = diamond[4].y = sp->screen[k].y; diamond[1].x = sp->screen[k].x; diamond[1].y = sp->screen[k].y - diamond_dim; diamond[2].x = sp->screen[k].x + diamond_dim; diamond[2].y = sp->screen[k].y; diamond[3].x = sp->screen[k].x; diamond[3].y = sp->screen[k].y + diamond_dim; gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_lines (drawable, gg->plot_GC, diamond, 5); } /*-- add the label to a case (with or without underlining). if this is the nearest point, the label may also be added at the top of the window. --*/ void splot_add_point_label (gboolean nearest_p, gint k, gboolean top_p, splotd *sp, GdkDrawable *drawable, ggobid *gg) { displayd *dsp = sp->displayptr; GGobiData *d = dsp->d; PangoLayout *layout; PangoRectangle rect; gint diamond_dim = DIAMOND_DIM; gchar *lbl = NULL; if (k < 0 || k >= d->nrows) return; lbl = identify_label_fetch (k, &dsp->cpanel, d, gg); /* * if displaying 'variable labels' and no variable is selected, * lbl can still be NULL here. */ if (lbl) { layout = gtk_widget_create_pango_layout(sp->da, NULL); layout_text(layout, lbl, &rect); /* display the label in the top center of the window */ if (nearest_p && top_p) { underline_text(layout); gdk_draw_layout (drawable, gg->plot_GC, (sp->max.x - rect.width)/2, 5, layout); } /* display the label next to the point */ if (sp->screen[k].x <= sp->max.x/2) { gdk_draw_layout (drawable, gg->plot_GC, sp->screen[k].x+diamond_dim, sp->screen[k].y-rect.height-diamond_dim, layout); } else { gdk_draw_layout(drawable, gg->plot_GC, sp->screen[k].x - rect.width - diamond_dim, sp->screen[k].y - rect.height - diamond_dim, layout); } g_free(lbl); g_object_unref(layout); } } // Generic, for scatterplots and cousins void splot_add_identify_point_cues(splotd *sp, GdkDrawable *drawable, gint k, gboolean nearest_p, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; if (k != -1) { if (nearest_p) splot_add_diamond_cue (k, sp, drawable, gg); /* I've turned off this label for the barchart. parallel coords and scatterplot matrix displays need some thought too. dfs */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); splot_add_point_label (nearest_p, k, true, sp, drawable, gg); } } // Messy -- points, edges, bars, ... there's probably a better way // to sort this out. void splot_add_identify_nearest_cues (splotd *sp, GdkDrawable *drawable, ggobid *gg) { displayd *display = sp->displayptr; gint pt; if (GGOBI_IS_EXTENDED_SPLOT(sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); if (klass->add_identify_cues) { pt = display->d->nearest_point; klass->add_identify_cues(true, pt, sp, drawable, gg); } else { cpaneld *cpanel = &display->cpanel; if (cpanel->id_target_type == identify_points) { GGobiData *d = display->d; pt = d->nearest_point; splot_add_identify_point_cues (sp, drawable, pt, true, gg); } else { if (display->e) { GGobiData *e = display->e; pt = e->nearest_point; splot_add_identify_edge_cues (sp, drawable, pt, true, gg); } } } } } /* Points only, so not so messy */ void splot_add_identify_sticky_cues (splotd *sp, GdkDrawable *drawable, gint k, ggobid *gg) { if (GGOBI_IS_EXTENDED_SPLOT(sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); if (klass->add_identify_cues) { // No sticky-drawing behavior in the barchart? klass->add_identify_cues(false, k, sp, drawable, gg); } else { splot_add_identify_point_cues (sp, drawable, k, false, gg); } } } void splot_add_movepts_cues (splotd *sp, GdkDrawable *drawable, gint k, gboolean nearest, ggobid *gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; if (k < 0 || k >= d->nrows) return; splot_add_diamond_cue (k, sp, drawable, gg); /*-- only add the label if the mouse is up --*/ if (!gg->buttondown) { splot_add_point_label (nearest, k, true, sp, drawable, gg); } } static void splot_add_record_cues (splotd *sp, GdkDrawable *drawable, ggobid *gg) { gint id; GSList *l; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; GGobiData *e = display->e; InteractionMode imode = imode_get (gg); /* these are the cues added to nearest point and sticky guys in identification nearest edge and sticky guys in identification nearest point in moving points source, maybe dest and edge in edge editing */ if (imode == IDENT) splot_add_identify_nearest_cues(sp, drawable, gg); // pt or edge else if (imode == MOVEPTS) splot_add_movepts_cues (sp, drawable, d->nearest_point, true, gg); else if (imode == EDGEED) /* If I want to draw in the color of nearest_point, I should pass it in here -- dfs*/ splot_add_edgeedit_cues (sp, drawable, d->nearest_point, true, gg); /*-- and these are the sticky points, added in all modes --*/ if (d->sticky_ids != NULL && g_slist_length (d->sticky_ids) > 0) { for (l = d->sticky_ids; l; l = l->next) { id = GPOINTER_TO_INT (l->data); if (!d->hidden_now.els[id]) /*-- false = !nearest --*/ splot_add_identify_sticky_cues (sp, drawable, id, gg); } } /*-- sticky edges, added in all modes --*/ if (e && e->sticky_ids != NULL && g_slist_length (e->sticky_ids) > 0) { for (l = e->sticky_ids; l; l = l->next) { id = GPOINTER_TO_INT (l->data); if (!e->hidden_now.els[id]) /*-- false = !nearest --*/ splot_add_identify_edge_cues (sp, drawable, id, false, gg); } } } /*------------------------------------------------------------------------*/ /* draw the border indicating current splot */ /*------------------------------------------------------------------------*/ static void splot_draw_border (splotd *sp, GdkDrawable *drawable, ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; if (sp != NULL && sp->da != NULL && sp->da->window != NULL) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_gc_set_line_attributes (gg->plot_GC, 3, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_draw_rectangle (drawable, gg->plot_GC, false, 1, 1, sp->da->allocation.width-3, sp->da->allocation.height-3); gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } } /*------------------------------------------------------------------------*/ /* getting from pixmap0 to pixmap1, then pixmap1 to the window */ /*------------------------------------------------------------------------*/ void splot_pixmap0_to_pixmap1 (splotd *sp, gboolean binned, ggobid *gg) { GtkWidget *w = sp->da; icoords *loc0 = &gg->plot.loc0; icoords *loc1 = &gg->plot.loc1; if (!binned) { gdk_draw_pixmap (sp->pixmap1, gg->plot_GC, sp->pixmap0, 0, 0, 0, 0, w->allocation.width, w->allocation.height); } else { gdk_draw_pixmap (sp->pixmap1, gg->plot_GC, sp->pixmap0, loc0->x, loc0->y, loc0->x, loc0->y, 1 + loc1->x - loc0->x, 1 + loc1->y - loc0->y); } } static void splot_add_markup_to_pixmap (splotd *sp, GdkDrawable *drawable, ggobid *gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *e = dsp->e; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint proj = cpanel->pmode; GGobiExtendedSPlotClass *splotKlass; /* * if identification is going on in a plot of points that * correspond to edges in this plot, add markup for the edge * corresponding to the nearest point in the other plot. * ( What about stickies? ) */ /*-- moving this section breaks splot_redraw (QUICK) for adding edges --*/ if (sp != gg->current_splot && e && e->edge.n) { gboolean draw_edge; GGobiExtendedDisplayClass *displayKlass = NULL; if (GGOBI_IS_EXTENDED_DISPLAY(dsp)) { displayKlass = GGOBI_EXTENDED_DISPLAY_GET_CLASS(dsp); draw_edge = displayKlass->supports_edges_p && displayKlass->show_edges_p; } else { draw_edge = dsp->options.edges_undirected_show_p || dsp->options.edges_arrowheads_show_p || dsp->options.edges_directed_show_p; } if (draw_edge && e->nearest_point != -1) { splot_add_edge_highlight_cue (sp, drawable, e->nearest_point, true, gg); splot_add_edge_label (sp, drawable, e->nearest_point, true, gg); } } if (GGOBI_IS_EXTENDED_SPLOT(sp)) { void (*f)(splotd *, GdkDrawable*, ggobid*); splotKlass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); f = splotKlass->add_markup_cues; if(f) { f(sp, drawable, gg); } } splot_add_plot_labels (sp, drawable, gg); /*-- axis labels --*/ /*-- identify points or edges, move points, edge editing --*/ splot_add_record_cues (sp, drawable, gg); if (sp == gg->current_splot) splot_draw_border (sp, drawable, gg); /*-- draw these cues whether this is the current display or not --*/ if (g_list_length (dsp->splots) == 1 /*-- scatterplot --*/ || sp == dsp->current_splot) /*-- ... in a multi-plot display --*/ { if (cpanel->imode == BRUSH) { brush_draw_brush (sp, drawable, d, gg); brush_draw_label (sp, drawable, d, gg); } else if (cpanel->imode == SCALE) { if (GGOBI_IS_EXTENDED_SPLOT(sp)) { void (*f)(splotd *, GdkDrawable*, ggobid*); splotKlass = GGOBI_EXTENDED_SPLOT_GET_CLASS(sp); f = splotKlass->add_scaling_cues; if(f) f(sp, drawable, gg); } } } if (proj == TOUR1D || proj == TOUR2D3 || proj == TOUR2D || proj == COTOUR) { splot_draw_tour_axes(sp, drawable, gg); } } void splot_pixmap_to_window (splotd *sp, GdkPixmap *pixmap, ggobid *gg) { GtkWidget *w = sp->da; gdk_draw_pixmap (sp->da->window, gg->plot_GC, pixmap, 0, 0, 0, 0, w->allocation.width, w->allocation.height); } /*------------------------------------------------------------------------*/ /* convenience routine */ /*------------------------------------------------------------------------*/ void splot_redraw (splotd *sp, RedrawStyle style, ggobid *gg) { /*-- sometimes the first draw happens before configure is called --*/ if (sp == NULL || sp->da == NULL || sp->pixmap0 == NULL) { return; } /* * Event compression is, I think, causing only the last redraw event * to get through, so that a full redraw can be blocked by a * subsequent expose. * * Fixed by turning off expose event handlers during tour idle procs. */ switch (style) { case FULL: /*-- FULL_2PIXMAP --*/ splot_clear_pixmap0 (sp, gg); splot_draw_to_pixmap0_unbinned (sp, true, gg); /* true = hiddens */ splot_draw_to_pixmap0_unbinned (sp, false, gg); splot_pixmap0_to_pixmap1 (sp, false, gg); /* false = not binned */ splot_add_markup_to_pixmap (sp, sp->pixmap1, gg); splot_pixmap_to_window (sp, sp->pixmap1, gg); break; case QUICK: splot_pixmap0_to_pixmap1 (sp, false, gg); /* false = not binned */ splot_add_markup_to_pixmap (sp, sp->pixmap1, gg); splot_pixmap_to_window (sp, sp->pixmap1, gg); break; case BINNED: splot_clear_pixmap0_binned (sp, gg); splot_draw_to_pixmap0_binned (sp, true, gg); /* true = hiddens */ splot_draw_to_pixmap0_binned (sp, false, gg); splot_pixmap0_to_pixmap1 (sp, true, gg); /* true = binned */ splot_add_markup_to_pixmap (sp, sp->pixmap1, gg); splot_pixmap_to_window (sp, sp->pixmap1, gg); break; case FULL_1PIXMAP: /*-- to optimize motion --*/ splot_clear_pixmap0 (sp, gg); splot_draw_to_pixmap0_unbinned (sp, true, gg); /* true = hiddens */ splot_draw_to_pixmap0_unbinned (sp, false, gg); splot_add_markup_to_pixmap (sp, sp->pixmap0, gg); splot_pixmap_to_window (sp, sp->pixmap0, gg); break; case EXPOSE: splot_pixmap_to_window (sp, sp->pixmap1, gg); break; case NONE: break; } /* * Somehow the very first window is initially drawn without a border. * I ought to be able to fix that more nicely some day, but in the * meantime, what's an extra rectangle? */ if (sp == gg->current_splot && style != NONE) splot_draw_border (sp, sp->da->window, gg); sp->redraw_style = EXPOSE; } ggobi-2.1.12/src/ggobi.c0000644000175000017500000005465614651527764010430 /*-- ggobi.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #define GGOBIINTERN #define GGOBI_C #include #include #include #include #include #include "config.h" #include "GGobiApp.h" #include "ggobi.h" #include "vars.h" #include "externs.h" #include "print.h" #include "read_init.h" #include "colorscheme.h" #include "plugin.h" /* For registerDefaultPlugin. */ #include "ggobi-intl.h" #ifdef WIN32 #undef GGOBI_LOCALEDIR static gchar* ggobi_win32_get_localedir(); #define GGOBI_LOCALEDIR ggobi_win32_get_localedir() #undef GGOBI_DATADIR #define GGOBI_DATADIR NULL #include #endif GGobiApp *ggobiApp; static GGobiOptions sessionoptions; GGobiOptions *sessionOptions; ggobid **all_ggobis; gint num_ggobis; gint totalNumGGobis; /* Needs to be connected to MAXNVARS in scatmat.c and MAXNPCPLOTS in parcoords.c */ #define MAXNVARS 4 #define MAXNPCPLOTS 5 #define MAXNTSPLOTS 6 #include "ggobiClass.h" const GTypeLoad typeLoaders[] = { ggobi_scatterplot_display_get_type, ggobi_scatmat_display_get_type, ggobi_par_coords_display_get_type, ggobi_time_series_display_get_type, ggobi_barchart_display_get_type }; const gchar *const ViewTypes[] = { "Scatterplot", "Scatterplot Matrix", }; const gint ViewTypeIndices[]; static gchar *computeGGobiHome (char *str); GGobiApp * getGGobiApp () { return (ggobiApp); } gint parse_command_line (gint * argc, gchar ** av) { static gboolean print_version = false; static gchar *active_color_scheme = NULL; static gchar *color_scheme_file = NULL; static gchar *data_mode = NULL; static gchar *initialization_file = NULL; static gboolean quit_with_no_ggobi = true; static gint verbosity = GGOBI_CHATTY; static GOptionEntry entries[] = { { "activeColorScheme", 'c', 0, G_OPTION_ARG_STRING, &active_color_scheme, "name of the default color scheme to use", "scheme" }, { "colorSchemes", 's', 0, G_OPTION_ARG_FILENAME, &color_scheme_file, "name of XML file containing color schemes", "file" }, { "dataMode", 'd', 0, G_OPTION_ARG_STRING, &data_mode, "mode of data supplied on command line", "mode" }, { "init", 'i', 0, G_OPTION_ARG_FILENAME, &initialization_file, "name of initialization file", "file" }, { "keepalive", 'k', G_OPTION_FLAG_HIDDEN | G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &quit_with_no_ggobi, "do not quit GGobi if all windows are closed", NULL, }, { "verbosity", 'l', 0, G_OPTION_ARG_INT, &verbosity, "verbosity of GGobi, 0 = silent, 1 = chatty (default), 2 = verbose", "level" }, { "version", 'v', 0, G_OPTION_ARG_NONE, &print_version, "print the GGobi version and exit", NULL }, { NULL } }; GError *error = NULL; GOptionContext *ctx = g_option_context_new("- platform for interactive graphics"); g_option_context_add_main_entries (ctx, entries, PACKAGE); g_option_context_add_group (ctx, gtk_get_option_group (TRUE)); g_option_group_set_translation_domain (g_option_context_get_main_group (ctx), PACKAGE); g_option_context_parse (ctx, argc, &av, &error); if (error) { g_printerr ("Error parsing command line: %s\n", error->message); exit(0); } if (print_version) { g_printerr ("%s\n", GGOBI (getVersionString ())); exit(0); } sessionOptions->activeColorScheme = active_color_scheme; if (color_scheme_file) sessionOptions->info->colorSchemeFile = color_scheme_file; sessionOptions->data_type = data_mode; sessionOptions->initializationFile = initialization_file; sessionOptions->info->quitWithNoGGobi = quit_with_no_ggobi; sessionOptions->verbose = verbosity; (*argc)--; av++; /* * Test the values */ if (*argc == 0) sessionOptions->data_in = NULL; else sessionOptions->data_in = g_strdup (av[0]); g_option_context_free(ctx); return 1; } gint ggobi_remove (ggobid * gg) { gint i; for (i = 0; i < num_ggobis; i++) { if (all_ggobis[i] == gg) { return (ggobi_remove_by_index (gg, i)); } } return (-1); } /* Also, need to close and free the displays associated with the ggobi. */ gint ggobi_remove_by_index (ggobid * gg, gint which) { GSList *l; GGobiData *d; gint numDatasets, i; /* Move all the entries after the one being removed down by one in the array to compact it. */ if (which < num_ggobis - 1) { memcpy (all_ggobis + which, all_ggobis + which + 1, sizeof (ggobid *) * (num_ggobis - which - 1)); } /* Now patch up the array so that it has the correct number of elements. */ num_ggobis--; if (num_ggobis > 0) all_ggobis = (ggobid **) g_realloc (all_ggobis, sizeof (ggobid *) * num_ggobis); else all_ggobis = NULL; /* This was crashing in R. Probably because when we exhaust the list and remove the final element, we get back garbage. This isn't a problem in stand-alone as it never gets called. */ numDatasets = g_slist_length (gg->d); for (i = 0, l = gg->d; l != NULL && i < numDatasets; i++, l = gg->d) { d = (GGobiData *) l->data; datad_free (d, gg); gg->d = g_slist_remove (gg->d, d); } g_object_unref (G_OBJECT (gg)); /* gtk_object_destroy(GTK_OBJECT(gg)); */ /* g_free (gg); */ return (which); } /* The code within the TEST_KEYS sections performs a test of handling key presses on the numbered keys. It registers a function */ #ifdef TEST_KEYS gboolean DummyKeyTest (guint keyval, GtkWidget * w, GdkEventKey * event, cpaneld * cpanel, splotd * sp, ggobid * gg, void *userData) { static gint count = 0; fprintf (stderr, "Key press event (count = %d): key = %d, data = %s\n", count, (gint) keyval, (gchar *) userData); fflush (stderr); if (++count == 4) { count = 0; GGOBI (removeNumberedKeyEventHandler) (gg); } return (true); } #endif /** Find the color scheme element in the list with the specified name. */ colorschemed * findColorSchemeByName (GList * schemes, const gchar * name) { colorschemed *s; gint i, n; n = g_list_length (schemes); for (i = 0; i < n; i++) { s = (colorschemed *) g_list_nth_data (schemes, i); if (strcmp (name, s->name) == 0) return (s); } return (NULL); } ggobid * /*XXX should be void. Change when gtk-object setup settles. */ ggobi_alloc (ggobid * tmp) { if (tmp == NULL) { /* Should never happen in new GObject-based version. tmp = (ggobid*) g_malloc (sizeof (ggobid)); memset (tmp, '\0', sizeof (ggobid)); */ tmp = g_object_new (GGOBI_TYPE_GGOBI, NULL); } tmp->firsttime = true; tmp->brush.firsttime = true; tmp->d = NULL; tmp->displays = NULL; tmp->current_display = NULL; /*-- initialize to NULLMODE and check for ncols later --*/ tmp->pmode = NULL_PMODE; tmp->pmode_prev = NULL_PMODE; tmp->imode = NULL_IMODE; tmp->imode_prev = NULL_IMODE; /*-- --*/ /*-- initialize main window, tool windows to NULL --*/ tmp->main_window = NULL; tmp->display_tree.window = NULL; tmp->vartable_ui.window = NULL; tmp->sphere_ui.window = NULL; tmp->cluster_ui.window = NULL; tmp->color_ui.symbol_window = NULL; /*-- --*/ tmp->color_ui.margin = 10; tmp->tour2d.idled = 0; tmp->tour1d.idled = 0; tmp->tourcorr.idled = 0; tmp->tour1d.fade_vars = true; tmp->tour2d.fade_vars = true; tmp->tourcorr.fade_vars = true; tmp->tour1d.all_vars = false; tmp->tour2d.all_vars = false; // tmp->brush.updateAlways_p = true; tmp->tour2d3.idled = 0; tmp->printOptions = NULL; tmp->pluginInstances = NULL; tmp->plot_GC = NULL; tmp->colorSchemes = sessionOptions->colorSchemes; if (sessionOptions->activeColorScheme) tmp->activeColorScheme = findColorSchemeByName (tmp->colorSchemes, sessionOptions-> activeColorScheme); else { /*-- use "Set1 9" by default, if it's present --*/ sessionOptions->activeColorScheme = "Set1 9"; tmp->activeColorScheme = findColorSchemeByName (tmp->colorSchemes, sessionOptions-> activeColorScheme); if (!tmp->activeColorScheme) tmp->activeColorScheme = (colorschemed *) g_list_nth_data (tmp->colorSchemes, 0); } if (!tmp->activeColorScheme) { g_error ("failed to find color scheme"); } else colorscheme_init (tmp->activeColorScheme); /* * the number of colors in use will be tested against the * scheme->n the first time we plot, and the color ids will * be adjusted if necessary. */ totalNumGGobis++; all_ggobis = (ggobid **) g_realloc (all_ggobis, sizeof (ggobid *) * (num_ggobis + 1)); all_ggobis[num_ggobis] = tmp; num_ggobis++; #ifdef TEST_KEYS GGOBI (registerNumberedKeyEventHandler) (DummyKeyTest, g_strdup ("A string for the key handler"), "Test handler", NULL, tmp, C); #endif g_signal_emit_by_name (G_OBJECT (ggobiApp), "new_ggobi", tmp); return (tmp); } void ggobiInit (int *argc, char **argv[]) { if (ExtendedDisplayTypes) return; gtk_init (argc, argv); ggobiApp = g_object_new (GGOBI_TYPE_APP, NULL); #ifdef TEST_GGOBI_APPP /*XXX FIX */ GGOBI (registerNumberedKeyEventHandler) (DummyKeyTest, g_strdup ("A string for the key handler"), "Test handler", NULL, tmp, C); #endif initSessionOptions (*argc, *argv); plugin_init (); GGOBI_TYPE_GGOBI; registerDisplayTypes ((GTypeLoad *) typeLoaders, sizeof (typeLoaders) / sizeof (typeLoaders)[0]); registerDefaultPlugins (sessionOptions->info); } /* Available so that we can call this from R without any confusion between which main(). */ gint GGOBI (main) (gint argc, gchar * argv[], gboolean processEvents) { GdkVisual *vis; ggobid *gg; bindtextdomain (PACKAGE, GGOBI_LOCALEDIR); bind_textdomain_codeset (PACKAGE, "UTF-8"); textdomain (PACKAGE); ggobiInit (&argc, &argv); vis = gdk_visual_get_system (); parse_command_line (&argc, argv); process_initialization_files (); if (sessionOptions->verbose == GGOBI_VERBOSE) g_printerr ("progname = %s\n", g_get_prgname ()); if (sessionOptions->verbose == GGOBI_VERBOSE) g_printerr ("data_in = %s\n", sessionOptions->data_in); if (DefaultPrintHandler.callback == NULL) setStandardPrintHandlers (); if (sessionOptions->info->colorSchemeFile && sessionOptions->colorSchemes == NULL) { read_colorscheme (sessionOptions->info->colorSchemeFile, &sessionOptions->colorSchemes); } if (sessionOptions->colorSchemes == NULL) { colorschemed *scheme = default_scheme_init (); sessionOptions->colorSchemes = g_list_append (sessionOptions->colorSchemes, scheme); sessionOptions->activeColorScheme = scheme->name; } gg = g_object_new (GGOBI_TYPE_GGOBI, NULL); gg->mono_p = (vis->depth == 1 || vis->type == GDK_VISUAL_STATIC_GRAY || vis->type == GDK_VISUAL_GRAYSCALE); make_ggobi (sessionOptions, processEvents, gg); /* g_free (sessionOptions->data_in); */ return (num_ggobis); } /*XX This might usefully be changed to workd directly from the XML tree and avoid having the GGobiDisplayDescription. As we include more information (e.g. brushing information) we end up copying it for little reason. However, this works for the restore file, but not necessarily the initialization file as we won't have created the ggobid when we read that. We could just re-parse the file and find the appropriate node. Probably the wisest. */ gboolean processRestoreFile (const gchar * const fileName, ggobid * gg) { xmlDocPtr doc; xmlNodePtr node; GGobiDescription desc; GList *el; doc = xmlParseFile (fileName); if (!doc) return (false); node = xmlDocGetRootElement (doc); if (!node) return (false); getPreviousDisplays (node, &desc); el = desc.displays; while (el) { displayd *dpy; GGobiDisplayDescription *dpyDesc; dpyDesc = (GGobiDisplayDescription *) el->data; dpy = createDisplayFromDescription (gg, dpyDesc); /*XX free dpyDesc here and remove from list. */ el = el->next; } xmlFreeDoc (doc); return (true); } /* Computes where GGobi directory is located. Search order: $GGOBI_HOME or 'str' stripped of file */ static gchar * computeGGobiHome (char *str) { gchar *dir; const gchar *env; env = g_getenv ("GGOBI_HOME"); if (env) dir = g_strdup (env); else dir = g_path_get_dirname (str); return (dir); } void initSessionOptions (int argc, char **argv) { gchar *tmp; sessionOptions = &sessionoptions; sessionOptions->data_mode = unknown_data; sessionOptions->showControlPanel = true; sessionOptions->verbose = GGOBI_CHATTY; sessionOptions->cmdArgs = argv; sessionOptions->numArgs = argc; sessionOptions->ggobiHome = computeGGobiHome (argv[0]); sessionOptions->info = (GGobiInitInfo *) g_malloc0 (sizeof (GGobiInitInfo)); sessionOptions->info->glyph.size = sessionOptions->info->glyph.type = -1; sessionOptions->info->createInitialScatterPlot = true; sessionOptions->info->allowCloseLastDisplay = false; sessionOptions->info->quitWithNoGGobi = true; sessionOptions->info->numScatMatrixVars = MAXNVARS; sessionOptions->info->numParCoordsVars = MAXNPCPLOTS; sessionOptions->info->numTimePlotVars = MAXNTSPLOTS; sessionOptions->useRadioMenuItems = false; tmp = g_build_filename("share", "colorschemes.xml", NULL); sessionOptions->info->colorSchemeFile = ggobi_find_data_file(tmp); g_free(tmp); sessionOptions->defaultTourSpeed = 50.0; sessionOptions->defaultTour1dSpeed = 40.0; } gboolean ggobi_close (ggobid * gg) { GGOBI (close) (gg, true); return (true); } /* Key for storing a reference to a ggobid instance in a widget so that we can retrieve it within a callback. */ static const gchar *GGobiGTKey = "GGobi"; const gchar * key_get (void) { return GGobiGTKey; } /* Computes the ggobid pointer associated with the specified widget. It does so by looking in the window associated with the widget and then looking for an entry in the window's association table. This assumes that the ggobid reference was stored in the window when it was created. */ ggobid * GGobiFromWidget (GtkWidget * w, gboolean useWindow) { ggobid *gg = NULL; GObject *obj; obj = g_object_get_data (G_OBJECT (w), GGobiGTKey); if (obj) { gg = (ggobid *) obj; ValidateGGobiRef (gg, true); } return (gg); } ggobid * GGobiFromWindow (GdkWindow * win) { ggobid *gg = NULL; GObject *obj; obj = g_object_get_data (G_OBJECT (win), GGobiGTKey); if (obj) { gg = (ggobid *) obj; ValidateGGobiRef (gg, true); } return (gg); } ggobid * GGobiFromSPlot (splotd * sp) { ggobid *gg = NULL; displayd *display = NULL; if ((sp) && sp->displayptr) { display = (displayd *) sp->displayptr; if (display) { gg = ValidateGGobiRef (display->ggobi, false); } } return gg; } ggobid * GGobiFromDisplay (displayd * display) { return (display->ggobi); } void GGobi_widget_set (GtkWidget * w, ggobid * gg, gboolean asIs) { GtkWidget *wid = w; if (!asIs) wid = GTK_WIDGET (gtk_widget_get_parent_window (wid)); g_object_set_data (G_OBJECT (wid), GGobiGTKey, gg); } ggobid * ggobi_get (gint which) { extern ggobid **all_ggobis; if (which > -1 && which < num_ggobis) return (all_ggobis[which]); else return (NULL); } gint ggobi_getIndex (ggobid * gg) { gint i; for (i = 0; i < num_ggobis; i++) { if (all_ggobis[i] == gg) return (i); } return (-1); } GGobiData * GGobi_get_data (gint which, const ggobid * const gg) { GGobiData *d; d = g_slist_nth_data (gg->d, which); return (d); } GGobiData * GGobi_get_data_by_name (const gchar * const name, const ggobid * const gg) { GGobiData *d; GSList *l; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (strcmp (d->name, name) == 0) return (d); } return (NULL); } ggobid * ValidateGGobiRef (ggobid * gg, gboolean fatal) { static gchar *error_msg = "Incorrect reference to ggobid."; extern ggobid **all_ggobis; extern gint num_ggobis; gint i; for (i = 0; i < num_ggobis; i++) { if (all_ggobis[i] == gg) return (gg); } if (fatal) { g_error ("%s", error_msg); } else g_critical ("%s", error_msg); return (NULL); } GGobiData * ValidateDatadRef (GGobiData * d, ggobid * gg, gboolean fatal) { static gchar *error_msg = "Incorrect reference to datad."; gint i, n; n = g_slist_length (gg->d); for (i = 0; i < n; i++) { if (g_slist_nth_data (gg->d, i) == d) return (d); } if (fatal) g_error ("%s", error_msg); else g_critical ("%s", error_msg); return (NULL); } displayd * ValidateDisplayRef (displayd * d, ggobid * gg, gboolean fatal) { static gchar *error_msg = "Incorrect reference to display."; gint i, n; n = g_list_length (gg->displays); for (i = 0; i < n; i++) { if (g_list_nth_data (gg->displays, i) == d) return (d); } if (fatal) g_error ("%s", error_msg); else g_critical ("%s", error_msg); return (NULL); } static gchar * ggobi_find_file_in_dir(const gchar *name, const gchar *dir, gboolean ggobi) { gchar *tmp_name = g_build_filename(dir, ggobi ? "ggobi" : "", name, NULL); if (file_is_readable(tmp_name)) return(tmp_name); g_free(tmp_name); return(NULL); } #ifdef WIN32 static gchar* ggobi_win32_get_localedir() { static char *ggobi_localedir = NULL; if (ggobi_localedir == NULL) { gchar *temp, *path; temp = g_win32_get_package_installation_directory_of_module (NULL); path = g_build_path (temp, "locale"); g_free (temp); /* ggobi_localedir is passed to bindtextdomain() which isn't * UTF-8-aware. */ ggobi_localedir = g_win32_locale_filename_from_utf8 (path); g_free (path); } return ggobi_localedir; } static gchar* ggobi_win32_get_packagedir() { static char *ggobi_datadir = NULL; if (ggobi_datadir == NULL) ggobi_datadir = g_win32_get_package_installation_directory_of_module (NULL); return(ggobi_datadir); } #endif static gchar * ggobi_find_file(const gchar *name, const gchar* user, const gchar* const *dirs) { gchar *tmp_name, *cur_dir = g_get_current_dir(); gint i; //g_debug("Looking for %s", name); if (sessionOptions && sessionOptions->ggobiHome) { tmp_name = ggobi_find_file_in_dir(name, sessionOptions->ggobiHome, false); if (tmp_name) return(tmp_name); } tmp_name = ggobi_find_file_in_dir(name, cur_dir, false); g_free(cur_dir); if (tmp_name) return(tmp_name); tmp_name = ggobi_find_file_in_dir(name, user, true); if (tmp_name) return(tmp_name); for (i = 0; dirs[i]; i++) { tmp_name = ggobi_find_file_in_dir(name, dirs[i], true); if (tmp_name) return(tmp_name); } #ifdef WIN32 tmp_name = ggobi_find_file_in_dir(name, ggobi_win32_get_packagedir(), false); if (tmp_name) return(tmp_name); #endif return(NULL); } /* Looks in (by default, XDG environment can override some of these): $GGOBI_HOME Current directory $HOME/.local/share/ggobi (Windows: Documents, Application Data for user) $prefix/share/ggobi (Windows: GGobi installation directory) */ gchar* ggobi_find_data_file(const gchar *name) { const gchar* data_dirs[] = { GGOBI_DATADIR, NULL }; gchar *path = ggobi_find_file(name, g_get_user_data_dir(), data_dirs); //g_debug("Found data file: %s", path); return(path); } /* Looks in (by default, XDG environment can override some of these): $GGOBI_HOME Current directory $HOME/.config/ggobi (Windows: Documents, Application Data for user) /etc/xdg/ggobi (Windows: Documents, Application Data for All Users) (Windows: GGobi installation directory) */ gchar* ggobi_find_config_file(const gchar *name) { gchar *path = ggobi_find_file(name, g_get_user_config_dir(), g_get_system_config_dirs()); //g_debug("Found config file: %s", path); return(path); } /* Determines which initialization file to use Checks for the one specified by 1) the -init command line option 2) the GGOBIRC environment variable 3) the $HOME/.ggobirc file. 4) user and system GGobi config dirs */ void process_initialization_files () { GGobiInitInfo *info; gchar *fileName = NULL; if (sessionOptions->initializationFile) fileName = g_strdup (sessionOptions->initializationFile); else { fileName = g_strdup (g_getenv ("GGOBIRC")); if (!fileName || !fileName[0]) { const gchar *tmp; tmp = g_get_home_dir (); if (tmp) { fileName = g_build_filename (tmp, ".ggobirc", NULL); if (!file_is_readable (fileName)) { g_free (fileName); fileName = NULL; } } if (!fileName) fileName = ggobi_find_config_file("ggobirc"); } if (fileName) sessionOptions->initializationFile = g_strdup (fileName); } if (fileName && fileName[0] && file_is_readable (fileName)) { info = read_init_file (fileName, sessionOptions->info); g_free (fileName); /* sessionOptions->info = info; */ } if (sessionOptions->pluginFiles) { GSList *el = sessionOptions->pluginFiles; while (el) { readPluginFile ((char *) el->data, sessionOptions->info); el = el->next; } } } GGobiOptions * GGOBI_getSessionOptions () { return (sessionOptions); } /* This includes code that provides information about the sizes of the data structures in GGobi when it was compiled. */ #define GGOBI_MAIN 1 #include "GGStructSizes.c" gint ndatad_with_vars_get (ggobid *gg) { gint nd; GSList *l; GGobiData *d; /*-- silly to do this every time, perhaps, but harmless, I think --*/ if (g_slist_length (gg->d) > 1) { nd = 0; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (g_slist_length (d->vartable) > 0) nd++; } } else nd = 1; return nd; } ggobi-2.1.12/src/ggobiMain.c0000644000175000017500000000026714651527764011222 #include "ggobi.h" gint GGOBI (main) (gint argc, gchar * argv[], gboolean processEvents); gint main (gint argc, gchar * argv[]) { GGOBI (main) (argc, argv, true); return (0); } ggobi-2.1.12/src/jitter_ui.c0000644000175000017500000001553614651527764011331 /* jitter_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" void jitter_vars_init (GGobiData * d) { d->jitter.type = UNIFORM; d->jitter.convex = true; } static void jitter_cb (GtkButton * w, ggobid * gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (gg->jitter_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; vars = get_selections_from_tree_view (tree_view, &nvars); if (nvars) { rejitter (vars, nvars, d, gg); g_free (vars); } } /* * Set the degree of jittering */ static void degree_cb (GtkAdjustment * adj, ggobid * gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (gg->jitter_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; vars = get_selections_from_tree_view (tree_view, &nvars); jitter_value_set (adj->value, d, gg); if (nvars) { rejitter (vars, nvars, d, gg); g_free (vars); } } /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget * w, ggobid * gg) { gtk_widget_destroy (gg->jitter_ui.window); gg->jitter_ui.window = NULL; } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget * w, GdkEvent * event, ggobid * gg) { gtk_widget_destroy (gg->jitter_ui.window); gg->jitter_ui.window = NULL; } static gchar *type_lbl[] = { "Uniform", "Normal" }; static void type_cb (GtkWidget * w, ggobid * gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (gg->jitter_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; vars = get_selections_from_tree_view (tree_view, &nvars); d->jitter.type = indx; if (nvars) { rejitter (vars, nvars, d, gg); g_free (vars); } } void jitter_window_open (ggobid * gg) { GtkWidget *btn, *lbl; GtkWidget *vbox, *vb, *hb; GtkWidget *sbar, *opt; GtkObject *adj; GtkWidget *notebook; /*-- if used before we have data, bail out --*/ if (gg->d == NULL || g_slist_length (gg->d) == 0) return; else { if (gg->jitter_ui.window == NULL) { gg->jitter_ui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_transient_for(GTK_WINDOW(gg->jitter_ui.window), GTK_WINDOW(gg->main_window)); gtk_window_set_destroy_with_parent(GTK_WINDOW(gg->jitter_ui.window), true); /*-- suggested by Gordon Deane --*/ gtk_window_set_default_size (GTK_WINDOW (gg->jitter_ui.window), 200, 400); /*-- 400 looks too big on the laptop, trying other numbers --*/ gtk_window_set_default_size (GTK_WINDOW (gg->jitter_ui.window), 200, 250); /*-- --*/ g_signal_connect (G_OBJECT (gg->jitter_ui.window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) gg); gtk_window_set_title (GTK_WINDOW (gg->jitter_ui.window), "Jitter Data"); gtk_container_set_border_width (GTK_CONTAINER (gg->jitter_ui.window), 10); vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (gg->jitter_ui.window), vbox); /* Create a notebook, set the position of the tabs */ notebook = create_variable_notebook (vbox, GTK_SELECTION_MULTIPLE, all_vartypes, all_datatypes, G_CALLBACK (NULL), NULL, gg); /*-- option menu --*/ opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "The jittering is either distributed uniform or normal", NULL); gtk_box_pack_start (GTK_BOX (vbox), opt, false, false, 0); populate_combo_box (opt, type_lbl, G_N_ELEMENTS (type_lbl), G_CALLBACK (type_cb), gg); /*-- vbox for label and rangewidget --*/ vb = gtk_vbox_new (true, 2); gtk_box_pack_start (GTK_BOX (vbox), vb, false, false, 1); lbl = gtk_label_new_with_mnemonic ("_Degree of jitter:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); adj = gtk_adjustment_new (0.0, 0.0, 0.7, 0.01, .01, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (degree_cb), (gpointer) gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Set the degree of jitter", NULL); gtk_scale_set_draw_value (GTK_SCALE (sbar), false); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), sbar); /*-- Rejitter button --*/ btn = gtk_button_new_with_mnemonic ("_Jitter"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Rejitter the data", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (jitter_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 3); /*-- Close button --*/ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), false, true, 2); hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 1); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); gtk_box_pack_start (GTK_BOX (hb), btn, true, false, 0); g_object_set_data (G_OBJECT (gg->jitter_ui.window), "notebook", notebook); gtk_widget_show_all (gg->jitter_ui.window); } } gdk_window_raise (gg->jitter_ui.window->window); } ggobi-2.1.12/src/splash.c0000644000175000017500000000515714651527764010623 /* splash.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" #include "splash.h" #include "config.h" void splash_destroy (GtkWidget * w, GdkEventButton * event, GdkPixmap * pix) { GtkWidget *win = (GtkWidget *) g_object_get_data (G_OBJECT (w), "window"); gdk_pixmap_unref (pix); gtk_widget_destroy (win); } void splash_show (ggobid * gg) { char *versionInfo; GdkPixmap *splash_pix; GtkWidget *splashw, *label; GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); GtkWidget *ebox = gtk_event_box_new (); GtkWidget *hbox = gtk_vbox_new (false, 0); splash_pix = gdk_pixmap_colormap_create_from_xpm_d (NULL, gtk_widget_get_colormap (gg->main_window), NULL, NULL, (gchar **) splash); splashw = gtk_image_new_from_pixmap (splash_pix, NULL); gtk_container_add (GTK_CONTAINER (window), ebox); gtk_container_add (GTK_CONTAINER (ebox), hbox); gtk_box_pack_start (GTK_BOX (hbox), splashw, FALSE, FALSE, 0); versionInfo = (char *) g_malloc (sizeof (gchar) * (strlen ("Version ") + strlen (PACKAGE_VERSION) + 2 + strlen (GGOBI_RELEASE_DATE) + 1)); sprintf (versionInfo, "Version %s, %s", PACKAGE_VERSION, GGOBI_RELEASE_DATE); label = gtk_label_new (versionInfo); gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0); g_free (versionInfo); g_object_set_data (G_OBJECT (ebox), "window", (gpointer) window); g_signal_connect (G_OBJECT (ebox), "button_press_event", G_CALLBACK (splash_destroy), (gpointer) splash_pix); gtk_widget_set_events (ebox, GDK_BUTTON_PRESS_MASK); gtk_widget_show_all (window); } ggobi-2.1.12/src/barchartDisplay.h0000644000175000017500000000645614651527764012455 /* barchartDisplay.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of barchart and histogram code: Heike Hofmann */ #ifndef GGOBI_BARCHART_DISPLAY_H #define GGOBI_BARCHART_DISPLAY_H /** This defines a new class of display (GGobiBarchartDisplay) which is the top-level container for barchart plots. This extends the windowed display class (GGobiWindowDisplay). */ /* Is it necessary/useful to sub-class these */ #define GGOBI_TYPE_BARCHART_DISPLAY (ggobi_barchart_display_get_type ()) #define GGOBI_BARCHART_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_BARCHART_DISPLAY, barchartDisplayd)) #define GGOBI_BARCHART_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_BARCHART_DISPLAY, GGobiBarChartClass)) #define GGOBI_IS_BARCHART_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_BARCHART_DISPLAY)) #define GGOBI_IS_BARCHART_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_BARCHART_DISPLAY)) #define GGOBI_BARCHART_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_BARCHART_DISPLAY, GGobiBarChartClass)) GType ggobi_barchart_display_get_type(); displayd *ggobi_barchart_display_new(gint type, gboolean missing_p, GGobiData * d, ggobid * gg); typedef struct { GGobiExtendedDisplayClass parent_class; } GGobiBarChartDisplayClass; typedef struct { extendedDisplayd extendedDpy; } barchartDisplayd; #define GGOBI_TYPE_BARCHART_SPLOT (ggobi_barchart_splot_get_type()) #define GGOBI_BARCHART_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_BARCHART_SPLOT, barchartSPlotd)) #define GGOBI_BARCHART_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_BARCHART_SPLOT, GGobiBarChartSPlotClass)) #define GGOBI_IS_BARCHART_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_BARCHART_SPLOT)) #define GGOBI_IS_BARCHART_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_BARCHART_SPLOT)) #define GGOBI_BARCHART_SPLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_BARCHART_SPLOT, GGobiBarChartSPlotClass)) GType ggobi_barchart_splot_get_type(void); typedef struct { GGobiExtendedSPlotClass extendedSPlotClass; } GGobiBarChartSPlotClass; typedef struct { extendedSPlotd extendedSPlot; barchartd *bar; } barchartSPlotd; extern void barchart_display_menus_make(displayd * display, GtkAccelGroup *, GtkSignalFunc, ggobid *); extern splotd *ggobi_barchart_splot_new(displayd * dpy, ggobid * gg); /* Make these available to ggobiClass.c. (Could put the _get_type routines in the barchartClass.h file.) */ void barchartSPlotClassInit(GGobiBarChartSPlotClass * klass); void barchartDisplayClassInit(GGobiBarChartDisplayClass * klass); #endif ggobi-2.1.12/src/ggobi-renderer-factory.h0000644000175000017500000000365414651527764013676 /* Generated by GOB (v2.0.18) (do not edit directly) */ #include #include #ifndef __GGOBI_RENDERER_FACTORY_H__ #define __GGOBI_RENDERER_FACTORY_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "ggobi-renderer.h" /* * Type checking and casting macros */ #define GGOBI_TYPE_RENDERER_FACTORY (ggobi_renderer_factory_get_type()) #define GGOBI_RENDERER_FACTORY(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_renderer_factory_get_type(), GGobiRendererFactory) #define GGOBI_RENDERER_FACTORY_CONST(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_renderer_factory_get_type(), GGobiRendererFactory const) #define GGOBI_RENDERER_FACTORY_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), ggobi_renderer_factory_get_type(), GGobiRendererFactoryClass) #define GGOBI_IS_RENDERER_FACTORY(obj) G_TYPE_CHECK_INSTANCE_TYPE((obj), ggobi_renderer_factory_get_type ()) #define GGOBI_RENDERER_FACTORY_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), ggobi_renderer_factory_get_type(), GGobiRendererFactoryClass) /* * Main object structure */ #ifndef __TYPEDEF_GGOBI_RENDERER_FACTORY__ #define __TYPEDEF_GGOBI_RENDERER_FACTORY__ typedef struct _GGobiRendererFactory GGobiRendererFactory; #endif struct _GGobiRendererFactory { GObject __parent__; }; /* * Class definition */ typedef struct _GGobiRendererFactoryClass GGobiRendererFactoryClass; struct _GGobiRendererFactoryClass { GObjectClass __parent__; GGobiRenderer * (* create) (GGobiRendererFactory * self, GdkDrawable * parent); }; /* * Public methods */ GType ggobi_renderer_factory_get_type (void) G_GNUC_CONST; #line 13 "renderer-factory.gob" GGobiRendererFactory * ggobi_renderer_factory_new (void); #line 56 "ggobi-renderer-factory.h" #line 20 "renderer-factory.gob" GGobiRenderer * ggobi_renderer_factory_create (GGobiRendererFactory * self, GdkDrawable * parent); #line 60 "ggobi-renderer-factory.h" #ifdef __cplusplus } #endif /* __cplusplus */ #endif ggobi-2.1.12/src/ggobi-data.c0000644000175000017500000007302014651527764011321 /* Generated by GOB (v2.0.20) (do not edit directly) */ /* End world hunger, donate to the World Food Programme, http://www.wfp.org */ #define GOB_VERSION_MAJOR 2 #define GOB_VERSION_MINOR 0 #define GOB_VERSION_PATCHLEVEL 20 #define selfp (self->_priv) #include /* memset() */ #include "ggobi-data.h" #ifdef G_LIKELY #define ___GOB_LIKELY(expr) G_LIKELY(expr) #define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr) #else /* ! G_LIKELY */ #define ___GOB_LIKELY(expr) (expr) #define ___GOB_UNLIKELY(expr) (expr) #endif /* G_LIKELY */ #line 93 "data.gob" #include "vars.h" #include "externs.h" #line 29 "ggobi-data.c" /* self casting macros */ #define SELF(x) GGOBI_DATA(x) #define SELF_CONST(x) GGOBI_DATA_CONST(x) #define IS_SELF(x) GGOBI_IS_DATA(x) #define TYPE_SELF GGOBI_TYPE_DATA #define SELF_CLASS(x) GGOBI_DATA_CLASS(x) #define SELF_GET_CLASS(x) GGOBI_DATA_GET_CLASS(x) /* self typedefs */ typedef GGobiData Self; typedef GGobiDataClass SelfClass; /* here are local prototypes */ static void ___object_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); static void ___object_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); static void ggobi_data_class_init (GGobiDataClass * c) G_GNUC_UNUSED; #line 191 "data.gob" static void ggobi_data_rows_in_plot_changed (GGobiData * self, int arg1, int arg2, ggobid * arg3) G_GNUC_UNUSED; #line 49 "ggobi-data.c" #line 195 "data.gob" static void ggobi_data_init (GGobiData * self) G_GNUC_UNUSED; #line 52 "ggobi-data.c" #line 204 "data.gob" static GObject * ___8_ggobi_data_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) G_GNUC_UNUSED; #line 55 "ggobi-data.c" /* * Signal connection wrapper macro shortcuts */ #define self_connect__rows_in_plot_changed(object,func,data) ggobi_data_connect__rows_in_plot_changed((object),(func),(data)) #define self_connect_after__rows_in_plot_changed(object,func,data) ggobi_data_connect_after__rows_in_plot_changed((object),(func),(data)) #define self_connect_data__rows_in_plot_changed(object,func,data,destroy_data,flags) ggobi_data_connect_data__rows_in_plot_changed((object),(func),(data),(destroy_data),(flags)) #define self_connect__col_name_changed(object,func,data) ggobi_data_connect__col_name_changed((object),(func),(data)) #define self_connect_after__col_name_changed(object,func,data) ggobi_data_connect_after__col_name_changed((object),(func),(data)) #define self_connect_data__col_name_changed(object,func,data,destroy_data,flags) ggobi_data_connect_data__col_name_changed((object),(func),(data),(destroy_data),(flags)) typedef void (*___Sig1) (GGobiData *, gint , gint , gpointer , gpointer); static void ___marshal_Sig1 (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { register ___Sig1 callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 4); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (___Sig1) (marshal_data != NULL ? marshal_data : cc->callback); callback ((GGobiData *)data1, (gint ) g_value_get_int (param_values + 1), (gint ) g_value_get_int (param_values + 2), (gpointer ) g_value_get_pointer (param_values + 3), data2); } typedef void (*___Sig2) (GGobiData *, gint , gpointer); static void ___marshal_Sig2 (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { register ___Sig2 callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (___Sig2) (marshal_data != NULL ? marshal_data : cc->callback); callback ((GGobiData *)data1, (gint ) g_value_get_int (param_values + 1), data2); } enum { ROWS_IN_PLOT_CHANGED_SIGNAL, COL_NAME_CHANGED_SIGNAL, LAST_SIGNAL }; enum { PROP_0, PROP_NROWS, PROP_NCOLS }; static guint object_signals[LAST_SIGNAL] = {0}; /* pointer to the class of our parent */ static GObjectClass *parent_class = NULL; /* Short form macros */ #define self_get_nrows ggobi_data_get_nrows #define self_set_nrows ggobi_data_set_nrows #define self_get_ncols ggobi_data_get_ncols #define self_set_ncols ggobi_data_set_ncols #define self_rows_in_plot_changed ggobi_data_rows_in_plot_changed #define self_col_name_changed ggobi_data_col_name_changed #define self_new ggobi_data_new #define self_get_name ggobi_data_get_name #define self_set_name ggobi_data_set_name #define self_get_n_cols ggobi_data_get_n_cols #define self_get_n_rows ggobi_data_get_n_rows #define self_get_col_name ggobi_data_get_col_name #define self_set_col_name ggobi_data_set_col_name #define self_get_transformed_col_name ggobi_data_get_transformed_col_name #define self_set_transformed_col_name ggobi_data_set_transformed_col_name #define self_set_missing ggobi_data_set_missing #define self_is_missing ggobi_data_is_missing #define self_has_missings ggobi_data_has_missings #define self_get_col_n_missing ggobi_data_get_col_n_missing #define self_set_raw_values ggobi_data_set_raw_values #define self_set_raw_value ggobi_data_set_raw_value #define self_get_string_value ggobi_data_get_string_value #define self_has_edges ggobi_data_has_edges #define self_has_variables ggobi_data_has_variables GType ggobi_data_get_type (void) { static GType type = 0; if ___GOB_UNLIKELY(type == 0) { static const GTypeInfo info = { sizeof (GGobiDataClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) ggobi_data_class_init, (GClassFinalizeFunc) NULL, NULL /* class_data */, sizeof (GGobiData), 0 /* n_preallocs */, (GInstanceInitFunc) ggobi_data_init, NULL }; type = g_type_register_static (G_TYPE_OBJECT, "GGobiData", &info, (GTypeFlags)0); } return type; } /* a macro for creating a new object of our type */ #define GET_NEW ((GGobiData *)g_object_new(ggobi_data_get_type(), NULL)) /* a function for creating a new object of our type */ #include static GGobiData * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED; static GGobiData * GET_NEW_VARG (const char *first, ...) { GGobiData *ret; va_list ap; va_start (ap, first); ret = (GGobiData *)g_object_new_valist (ggobi_data_get_type (), first, ap); va_end (ap); return ret; } static void ggobi_data_class_init (GGobiDataClass * c G_GNUC_UNUSED) { #define __GOB_FUNCTION__ "GGobi:Data::class_init" GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass*) c; parent_class = g_type_class_ref (G_TYPE_OBJECT); object_signals[ROWS_IN_PLOT_CHANGED_SIGNAL] = g_signal_new ("rows_in_plot_changed", G_TYPE_FROM_CLASS (g_object_class), (GSignalFlags)(G_SIGNAL_RUN_LAST), G_STRUCT_OFFSET (GGobiDataClass, rows_in_plot_changed), NULL, NULL, ___marshal_Sig1, G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER); if ___GOB_UNLIKELY(sizeof(int ) != sizeof(gint ) || sizeof(int ) != sizeof(gint ) || sizeof(ggobid * ) != sizeof(gpointer ) || parent_class == NULL /* avoid warning */) { g_error("data.gob line 191: Type mismatch of \"rows_in_plot_changed\" signal signature"); } object_signals[COL_NAME_CHANGED_SIGNAL] = g_signal_new ("col_name_changed", G_TYPE_FROM_CLASS (g_object_class), (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), G_STRUCT_OFFSET (GGobiDataClass, col_name_changed), NULL, NULL, ___marshal_Sig2, G_TYPE_NONE, 1, G_TYPE_INT); if ___GOB_UNLIKELY(sizeof(int ) != sizeof(gint ) || parent_class == NULL /* avoid warning */) { g_error("data.gob line 193: Type mismatch of \"col_name_changed\" signal signature"); } c->rows_in_plot_changed = NULL; c->col_name_changed = NULL; #line 204 "data.gob" g_object_class->constructor = ___8_ggobi_data_constructor; #line 256 "ggobi-data.c" g_object_class->get_property = ___object_get_property; g_object_class->set_property = ___object_set_property; { GParamSpec *param_spec; param_spec = g_param_spec_uint ("nrows" /* name */, "nrows" /* nick */, "Number of rows in the dataset" /* blurb */, 0 /* minimum */, INT_MAX /* maximum */, 0 /* default_value */, (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (g_object_class, PROP_NROWS, param_spec); param_spec = g_param_spec_uint ("ncols" /* name */, "ncols" /* nick */, "Number of cols in the dataset" /* blurb */, 0 /* minimum */, INT_MAX /* maximum */, 0 /* default_value */, (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (g_object_class, PROP_NCOLS, param_spec); } } #undef __GOB_FUNCTION__ #line 195 "data.gob" static void ggobi_data_init (GGobiData * self G_GNUC_UNUSED) { #line 291 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::init" { #line 195 "data.gob" sphere_init(self); self_set_name(self, "unknown", NULL); self->nearest_point = -1; self->missings_show_p = true; #line 303 "ggobi-data.c" } } #undef __GOB_FUNCTION__ static void ___object_set_property (GObject *object, guint property_id, const GValue *VAL G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED) #define __GOB_FUNCTION__ "GGobi:Data::set_property" { GGobiData *self G_GNUC_UNUSED; self = GGOBI_DATA (object); switch (property_id) { case PROP_NROWS: { #line 182 "data.gob" self->nrows = g_value_get_uint (VAL); #line 324 "ggobi-data.c" } break; case PROP_NCOLS: { #line 186 "data.gob" self->ncols = g_value_get_uint (VAL); #line 331 "ggobi-data.c" } break; default: /* Apparently in g++ this is needed, glib is b0rk */ #ifndef __PRETTY_FUNCTION__ # undef G_STRLOC # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } #undef __GOB_FUNCTION__ static void ___object_get_property (GObject *object, guint property_id, GValue *VAL G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED) #define __GOB_FUNCTION__ "GGobi:Data::get_property" { GGobiData *self G_GNUC_UNUSED; self = GGOBI_DATA (object); switch (property_id) { case PROP_NROWS: { #line 182 "data.gob" g_value_set_uint (VAL, self->nrows); #line 362 "ggobi-data.c" } break; case PROP_NCOLS: { #line 186 "data.gob" g_value_set_uint (VAL, self->ncols); #line 369 "ggobi-data.c" } break; default: /* Apparently in g++ this is needed, glib is b0rk */ #ifndef __PRETTY_FUNCTION__ # undef G_STRLOC # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } #undef __GOB_FUNCTION__ #line 182 "data.gob" guint ggobi_data_get_nrows (GGobiData * self) { #line 389 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_nrows" { #line 182 "data.gob" guint val; g_object_get (G_OBJECT (self), "nrows", &val, NULL); return val; }} #line 395 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 182 "data.gob" void ggobi_data_set_nrows (GGobiData * self, guint val) { #line 402 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_nrows" { #line 182 "data.gob" g_object_set (G_OBJECT (self), "nrows", val, NULL); }} #line 408 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 186 "data.gob" guint ggobi_data_get_ncols (GGobiData * self) { #line 415 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_ncols" { #line 186 "data.gob" guint val; g_object_get (G_OBJECT (self), "ncols", &val, NULL); return val; }} #line 421 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 186 "data.gob" void ggobi_data_set_ncols (GGobiData * self, guint val) { #line 428 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_ncols" { #line 186 "data.gob" g_object_set (G_OBJECT (self), "ncols", val, NULL); }} #line 434 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 191 "data.gob" static void ggobi_data_rows_in_plot_changed (GGobiData * self, int arg1, int arg2, ggobid * arg3) { #line 441 "ggobi-data.c" GValue ___param_values[4]; GValue ___return_val; memset (&___return_val, 0, sizeof (___return_val)); memset (&___param_values, 0, sizeof (___param_values)); #line 191 "data.gob" g_return_if_fail (self != NULL); #line 191 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 452 "ggobi-data.c" ___param_values[0].g_type = 0; g_value_init (&___param_values[0], G_TYPE_FROM_INSTANCE (self)); g_value_set_instance (&___param_values[0], (gpointer) self); ___param_values[1].g_type = 0; g_value_init (&___param_values[1], G_TYPE_INT); g_value_set_int (&___param_values[1], (gint ) arg1); ___param_values[2].g_type = 0; g_value_init (&___param_values[2], G_TYPE_INT); g_value_set_int (&___param_values[2], (gint ) arg2); ___param_values[3].g_type = 0; g_value_init (&___param_values[3], G_TYPE_POINTER); g_value_set_pointer (&___param_values[3], (gpointer ) arg3); g_signal_emitv (___param_values, object_signals[ROWS_IN_PLOT_CHANGED_SIGNAL], 0 /* detail */, &___return_val); g_value_unset (&___param_values[0]); g_value_unset (&___param_values[1]); g_value_unset (&___param_values[2]); g_value_unset (&___param_values[3]); } #line 193 "data.gob" void ggobi_data_col_name_changed (GGobiData * self, int j) { #line 485 "ggobi-data.c" GValue ___param_values[2]; GValue ___return_val; memset (&___return_val, 0, sizeof (___return_val)); memset (&___param_values, 0, sizeof (___param_values)); #line 193 "data.gob" g_return_if_fail (self != NULL); #line 193 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 496 "ggobi-data.c" ___param_values[0].g_type = 0; g_value_init (&___param_values[0], G_TYPE_FROM_INSTANCE (self)); g_value_set_instance (&___param_values[0], (gpointer) self); ___param_values[1].g_type = 0; g_value_init (&___param_values[1], G_TYPE_INT); g_value_set_int (&___param_values[1], (gint ) j); g_signal_emitv (___param_values, object_signals[COL_NAME_CHANGED_SIGNAL], 0 /* detail */, &___return_val); g_value_unset (&___param_values[0]); g_value_unset (&___param_values[1]); } #line 204 "data.gob" static GObject * ___8_ggobi_data_constructor (GType type G_GNUC_UNUSED, guint n_construct_properties, GObjectConstructParam * construct_properties) #line 519 "ggobi-data.c" #define PARENT_HANDLER(___type,___n_construct_properties,___construct_properties) \ ((G_OBJECT_CLASS(parent_class)->constructor)? \ (* G_OBJECT_CLASS(parent_class)->constructor)(___type,___n_construct_properties,___construct_properties): \ ((GObject * )0)) { #define __GOB_FUNCTION__ "GGobi:Data::constructor" { #line 206 "data.gob" GGobiData* d = (GGobiData*) PARENT_HANDLER(type, n_construct_properties, construct_properties); /* we can put these here OR we can put them in the setter for the 'ncols' property, since we know that comes last (after 'nrows' has been set) */ d->nrows_in_plot = d->nrows; /*-- for now --*/ arrayf_alloc (&d->raw, d->nrows, d->ncols); //FIXME: probably leaks memory //arrays_alloc (&d->missing, d->nrows, d->ncols); arrays_alloc_zero (&d->missing, d->nrows, d->ncols); rowlabels_alloc (d); vartable_alloc (d); vartable_init (d); br_glyph_ids_alloc (d); br_glyph_ids_init (d); br_color_ids_alloc (d); br_color_ids_init (d); br_hidden_alloc (d); br_hidden_init (d); return((GObject *)d); }} #line 556 "ggobi-data.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 235 "data.gob" GGobiData * ggobi_data_new (guint nrows, guint ncols) { #line 564 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::new" { #line 237 "data.gob" GGobiData* d = (GGobiData*) g_object_new(GGOBI_TYPE_DATA, "ncols", ncols, "nrows", nrows, NULL); return(d); }} #line 572 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 248 "data.gob" gchar * ggobi_data_get_name (GGobiData * self) { #line 579 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_name" #line 248 "data.gob" g_return_val_if_fail (self != NULL, (gchar * )0); #line 248 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gchar * )0); #line 585 "ggobi-data.c" { #line 250 "data.gob" return (g_strdup(self->name)); }} #line 591 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 254 "data.gob" void ggobi_data_set_name (GGobiData * self, gchar * name, gchar * nickname) { #line 598 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_name" #line 254 "data.gob" g_return_if_fail (self != NULL); #line 254 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 604 "ggobi-data.c" { #line 256 "data.gob" if (name == NULL) name = g_strdup("unknown"); if (nickname == NULL) nickname = g_strndup(name, 5); self->name = g_strdup(name); self->nickname = g_strndup(name, 5); }} #line 614 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 264 "data.gob" guint ggobi_data_get_n_cols (GGobiData * self) { #line 621 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_n_cols" #line 264 "data.gob" g_return_val_if_fail (self != NULL, (guint )0); #line 264 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (guint )0); #line 627 "ggobi-data.c" { #line 265 "data.gob" return self->ncols; }} #line 633 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 269 "data.gob" guint ggobi_data_get_n_rows (GGobiData * self) { #line 640 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_n_rows" #line 269 "data.gob" g_return_val_if_fail (self != NULL, (guint )0); #line 269 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (guint )0); #line 646 "ggobi-data.c" { #line 270 "data.gob" return self->nrows; }} #line 652 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 275 "data.gob" gchar * ggobi_data_get_col_name (GGobiData * self, guint j) { #line 659 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_col_name" #line 275 "data.gob" g_return_val_if_fail (self != NULL, (gchar * )0); #line 275 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gchar * )0); #line 665 "ggobi-data.c" { #line 277 "data.gob" vartabled* vt = vartable_element_get (j, self); return(vt->collab); }} #line 672 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 282 "data.gob" void ggobi_data_set_col_name (GGobiData * self, guint j, gchar * value) { #line 679 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_col_name" #line 282 "data.gob" g_return_if_fail (self != NULL); #line 282 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 685 "ggobi-data.c" { #line 284 "data.gob" vartabled* vt = vartable_element_get (j, self); //if (vt->collab) g_object_unref(vt->collab); //if (vt->nickname) g_object_unref(vt->nickname); //if (vt->collab_tform) g_object_unref(vt->collab_tform); if (value == NULL) value = g_strdup_printf("V%d", j + 1); vt->collab = g_strdup(value); vt->collab_tform = g_strdup(value); vt->nickname = g_strndup (vt->collab, 2); g_signal_emit_by_name (self, "col_name_changed", (gpointer) self, j); // SEND COLUMN NAME CHANGED SIGNAL // Listeners: // * vartable_collab_set_by_var (j, d); // * varpanel_label_set (j, d); /*-- checkboxes --*/ // * varcircle_label_set (j, d); /*-- variable circles --*/ // * tform_label_update (jvar, d); }} #line 711 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 309 "data.gob" gchar * ggobi_data_get_transformed_col_name (GGobiData * self, guint j) { #line 718 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_transformed_col_name" #line 309 "data.gob" g_return_val_if_fail (self != NULL, (gchar * )0); #line 309 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gchar * )0); #line 724 "ggobi-data.c" { #line 311 "data.gob" vartabled* vt = vartable_element_get (j, self); return(vt->collab_tform); }} #line 731 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 316 "data.gob" void ggobi_data_set_transformed_col_name (GGobiData * self, guint j, gchar * value) { #line 738 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_transformed_col_name" #line 316 "data.gob" g_return_if_fail (self != NULL); #line 316 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 744 "ggobi-data.c" { #line 318 "data.gob" vartabled* vt = vartable_element_get (j, self); //if (vt->collab_tform) g_object_unref(vt->collab_tform); //is this necessary? vt->collab_tform = g_strdup(value); }} #line 752 "ggobi-data.c" #undef __GOB_FUNCTION__ /** * ggobi_data_set_missing: * * Set specified cell to be a missing value **/ #line 330 "data.gob" void ggobi_data_set_missing (GGobiData * self, guint i, guint j) { #line 764 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_missing" #line 330 "data.gob" g_return_if_fail (self != NULL); #line 330 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 770 "ggobi-data.c" { #line 332 "data.gob" self->missing.vals[i][j] = 1; self->raw.vals[i][j] = 0; self->missings = TRUE; }} #line 778 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 338 "data.gob" gboolean ggobi_data_is_missing (GGobiData * self, guint i, guint j) { #line 785 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::is_missing" #line 338 "data.gob" g_return_val_if_fail (self != NULL, (gboolean )0); #line 338 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gboolean )0); #line 791 "ggobi-data.c" { #line 340 "data.gob" return self->missings && (self->missing.vals[i][j] == 1); }} #line 797 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 344 "data.gob" gboolean ggobi_data_has_missings (GGobiData * self) { #line 804 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::has_missings" #line 344 "data.gob" g_return_val_if_fail (self != NULL, (gboolean )0); #line 344 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gboolean )0); #line 810 "ggobi-data.c" { #line 346 "data.gob" return self->missings; }} #line 816 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 351 "data.gob" guint ggobi_data_get_col_n_missing (GGobiData * self, guint j) { #line 823 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_col_n_missing" #line 351 "data.gob" g_return_val_if_fail (self != NULL, (guint )0); #line 351 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (guint )0); #line 829 "ggobi-data.c" { #line 352 "data.gob" guint i, n = 0; for(i = 0; i < self->nrows; i++) { if (self_is_missing(self, i, j)) n++; } return(n); }} #line 841 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 362 "data.gob" void ggobi_data_set_raw_values (GGobiData * self, guint j, gdouble * values) { #line 848 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_raw_values" #line 362 "data.gob" g_return_if_fail (self != NULL); #line 362 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 854 "ggobi-data.c" { #line 364 "data.gob" gint i; for (i = 0; i < self->nrows; i++) { self_set_raw_value(self, i, j, values[i]); } }} #line 863 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 371 "data.gob" void ggobi_data_set_raw_value (GGobiData * self, guint i, guint j, gdouble value) { #line 870 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::set_raw_value" #line 371 "data.gob" g_return_if_fail (self != NULL); #line 371 "data.gob" g_return_if_fail (GGOBI_IS_DATA (self)); #line 876 "ggobi-data.c" { #line 373 "data.gob" if(GGobiMissingValue && GGobiMissingValue(value)) self_set_missing(self, i, j); else self->raw.vals[i][j] = value; }} #line 884 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 419 "data.gob" gchar * ggobi_data_get_string_value (GGobiData * self, guint i, guint j, gboolean transformed) { #line 891 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::get_string_value" #line 419 "data.gob" g_return_val_if_fail (self != NULL, (gchar * )0); #line 419 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gchar * )0); #line 897 "ggobi-data.c" { #line 421 "data.gob" gint n = 0, lval = -1; vartabled *vt = vartable_element_get(j, self); gdouble raw = transformed ? self->tform.vals[i][j] : self->raw.vals[i][j]; if (self_is_missing(self, i, j)) return g_strdup("NA"); if (vt->vartype != categorical) return g_strdup_printf("%g", raw); for (n = 0; n < vt->nlevels; n++) { if (vt->level_values[n] == raw) { lval = n; break; } } if (lval == -1) { g_printerr ("The levels for %s aren't specified correctly\n", vt->collab); return(NULL); } return vt->level_names[lval]; }} #line 923 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 445 "data.gob" gboolean ggobi_data_has_edges (GGobiData * self) { #line 930 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::has_edges" #line 445 "data.gob" g_return_val_if_fail (self != NULL, (gboolean )0); #line 445 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gboolean )0); #line 936 "ggobi-data.c" { #line 447 "data.gob" return (self->edge.n > 0); }} #line 942 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 451 "data.gob" gboolean ggobi_data_has_variables (GGobiData * self) { #line 949 "ggobi-data.c" #define __GOB_FUNCTION__ "GGobi:Data::has_variables" #line 451 "data.gob" g_return_val_if_fail (self != NULL, (gboolean )0); #line 451 "data.gob" g_return_val_if_fail (GGOBI_IS_DATA (self), (gboolean )0); #line 955 "ggobi-data.c" { #line 453 "data.gob" return (self->ncols > 0); }} #line 961 "ggobi-data.c" #undef __GOB_FUNCTION__ #line 475 "data.gob" void datad_free (GGobiData *d, ggobid *gg) { arrayf_free (&d->raw, 0, 0); pipeline_arrays_free (d, gg); arrays_free (&d->missing, 0, 0); /* rowIds and idTable are intrinsically linked !*/ if(d->idTable) { g_hash_table_foreach(d->idTable, freeLevelHashEntry, d->idTable); g_hash_table_destroy(d->idTable); } if(d->rowIds) g_free(d->rowIds); g_free (d); } displayd * datad_init (GGobiData *d, ggobid *gg, gboolean cleanup) { /* GGobi assumes datasets have at least one row */ g_return_val_if_fail(d->nrows > 0, NULL); d->gg = gg; gg->d = g_slist_append (gg->d, d); displayd *display = NULL; if (cleanup) { varpanel_clear (d, gg); } varpanel_populate (d, gg); /*-- toggles */ /*-- circles: build but don't show --*/ varcircles_populate (d, gg); pipeline_init (d, gg); clusters_set (d, gg); /*-- find the clusters for data just read in --*/ if (cleanup || g_list_length(gg->displays) == 0) { display_free_all (gg); /*-- destroy any existing displays --*/ gg->pmode = NULL_PMODE; /*-- initialize the first display --*/ if(sessionOptions->info->createInitialScatterPlot && d->ncols > 0) { /*XXX allow this to be specified as a gtk type name on the command line, initialization file, etc. and invoke the corresponding create() method. */ display = scatterplot_new (true, false, NULL, d, gg); /* Need to make certain this is the only one there. */ if (display != NULL) { gg->displays = g_list_append (gg->displays, (gpointer) display); gg->current_splot = (splotd *) g_list_nth_data (display->splots, 0); display->current_splot = gg->current_splot; display_set_current (display, gg); /*-- turn on event handling in the very first plot --*/ /*-- ... but will it cause trouble for later plots? ok so far --*/ /* Is imode set yet? I hope so. */ sp_event_handlers_toggle (gg->current_splot, on, gg->pmode, gg->imode); } } } if (gg->current_display != NULL) varpanel_refresh (gg->current_display, gg); if (g_slist_index(gg->d, (gpointer)d) == 0) varpanel_set_sensitive (d, true, gg); g_signal_emit (G_OBJECT (gg), GGobiSignals[DATAD_ADDED_SIGNAL], 0, d); display_menu_build (gg); return (display); } /*------------------------------------------------------------------------*/ /* row labels */ /*------------------------------------------------------------------------*/ /* This initializes rowIds to row numbers if ids are not provided */ void datad_record_ids_set(GGobiData *d, gchar **ids, gboolean duplicate) { gint i; guint *index; gchar *tmp; d->idTable = g_hash_table_new(g_str_hash, g_str_equal); d->rowIds = (gchar **) g_malloc(sizeof(gchar *) * d->nrows); for(i = 0; i < d->nrows; i++) { if(ids) tmp = duplicate ? g_strdup(ids[i]) : ids[i]; else { char buf[10]; sprintf(buf, "%d", i+1); tmp = g_strdup(buf); } index = (guint *) g_malloc(sizeof(guint)); *index = i; g_hash_table_insert(d->idTable, tmp, index); d->rowIds[i] = tmp; /* do not free anything here */ } } /* Add a record id */ void datad_record_id_add (gchar *id, GGobiData *d) { gint i; guint *index; d->rowIds = (gchar **) g_realloc (d->rowIds, sizeof(gchar *) * d->nrows); i = d->nrows - 1; index = (guint *) g_malloc(sizeof(guint)); *index = i; g_hash_table_insert (d->idTable, id, index); d->rowIds[i] = id; /* * I don't really understand why I can't free this * when it's freed in datad_record_ids_set, but purify is * quite clear on this point. -- dfs */ /*g_free (index);*/ } /* FIXME: this only works the first time */ void ggobi_data_set_row_labels(GGobiData *d, gchar **labels) { gint i; for (i = 0; i < d->nrows; i++) { gchar *label; if (labels && labels[i]) label = g_strdup(labels[i]); else label = g_strdup_printf("%d", i); g_array_append_val(d->rowlab, label); } } void rowlabels_free (GGobiData *d) { g_array_free (d->rowlab, true); } void rowlabels_alloc (GGobiData *d) { if (d->rowlab != NULL) rowlabels_free (d); d->rowlab = g_array_sized_new (false, false, sizeof (gchar *), d->nrows); } void rowlabel_add (gchar *label, GGobiData *d) { g_array_append_val (d->rowlab, label); g_assert (d->rowlab->len == d->nrows); } #line 1140 "ggobi-data.c" ggobi-2.1.12/src/GGobiApp.h0000644000175000017500000000173114651527764010760 #ifndef GGOBI_APP_H #define GGOBI_APP_H #include extern GType ggobi_app_get_type(void); #define GGOBI_TYPE_APP (ggobi_app_get_type ()) #define GGOBI_APP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_APP, GGobiApp)) #define GGOBI_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_APP, GGobiAppClass)) #define GGOBI_IS_APP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_APP)) #define GGOBI_IS_APP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_APP)) #define GGOBI_APP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_APP, GGobiAppClass)) /* Create the GGobiApp class that is derived from GObject. */ typedef struct { GObjectClass parent_class; } GGobiAppClass; typedef struct { GObject object; /* Session info options would be appropriate here. Also, all the global variables such as all_ggobis, num_ggobis, totalNumGGobis. */ } GGobiApp; #endif /* GGOBI_APP_H */ ggobi-2.1.12/src/xyplot.c0000644000175000017500000001521714651527764010666 /*-- xyplot.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" RedrawStyle xyplot_activate (gint state, displayd *display, ggobid *gg) { GList *slist; splotd *sp; GGobiData *d = display->d; gboolean reset = false; if (state) { for (slist = display->splots; slist; slist = slist->next) { sp = (splotd *) slist->data; if (sp->xyvars.x >= d->ncols) { reset = true; sp->xyvars.x = (sp->xyvars.y == 0) ? 1 : 0; } if (sp->xyvars.y >= d->ncols) { reset = true; sp->xyvars.y = (sp->xyvars.x == 0) ? 1 : 0; } } if (reset) varpanel_refresh (display, gg); } else { /* * Turn cycling off when leaving the mode, but don't worry * for now about turning it on when re-entering. */ GtkWidget *pnl, *w; pnl = mode_panel_get_by_name(GGOBI(getPModeName)(XYPLOT), gg); if (pnl != (GtkWidget *) NULL) { w = widget_find_by_name (pnl, "XYPLOT:cycle_toggle"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), off); } } return NONE; } gboolean xyplot_varsel (splotd *sp, gint jvar, gint *jvar_prev, gint toggle, gint mouse) { gboolean redraw = true; if (toggle == VARSEL_X || mouse == 1) { if (jvar == sp->xyvars.x) redraw = false; else if (jvar == sp->xyvars.y) { sp->xyvars.y = sp->xyvars.x; *jvar_prev = sp->xyvars.x; } else { *jvar_prev = sp->xyvars.x; } sp->xyvars.x = jvar; } else if (toggle == VARSEL_Y || mouse == 2 || mouse == 3) { if (jvar == sp->xyvars.y) redraw = false; else if (jvar == sp->xyvars.x) { sp->xyvars.x = sp->xyvars.y; *jvar_prev = sp->xyvars.y; } else { *jvar_prev = sp->xyvars.y; } sp->xyvars.y = jvar; } return redraw; } void xy_reproject (splotd *sp, greal **world_data, GGobiData *d, ggobid *gg) { /* * Project the data down from the ncols_used-dimensional world_data[] * to the 2-dimensional array planar[]. */ gint i, m; gint jx = sp->xyvars.x; gint jy = sp->xyvars.y; for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; sp->planar[m].x = world_data[m][jx]; /*-- regular or missings --*/ sp->planar[m].y = world_data[m][jy]; } } /*--------------------------------------------------------------------*/ /* Cycling */ /*--------------------------------------------------------------------*/ void cycle_fixedx (splotd *sp, displayd *display, GGobiData *d, ggobid *gg) { cpaneld *cpanel = &display->cpanel; gint varno, jvar_prev; if (cpanel->xyplot.cycle_dir == 1) { varno = sp->xyvars.y + 1; if (varno == sp->xyvars.x) varno++; if (varno == d->ncols) { varno = 0; if (varno == sp->xyvars.x) varno++; } } else { varno = sp->xyvars.y - 1; if (varno == sp->xyvars.x) varno--; if (varno < 0) { varno = d->ncols-1; if (varno == sp->xyvars.x) varno--; } } if (varno != sp->xyvars.y) { jvar_prev = sp->xyvars.y; if (xyplot_varsel (sp, varno, &jvar_prev, -1, 2)) { varpanel_refresh (display, gg); display_tailpipe (display, FULL, gg); } } } void cycle_fixedy (splotd *sp, displayd *display, GGobiData *d, ggobid *gg) { cpaneld *cpanel = &display->cpanel; gint varno, jvar_prev; if (cpanel->xyplot.cycle_dir == 1) { varno = sp->xyvars.x + 1; if (varno == sp->xyvars.y) varno++; if (varno == d->ncols) { varno = 0; if (varno == sp->xyvars.y) varno++; } } else { varno = sp->xyvars.x - 1; if (varno == sp->xyvars.y) varno--; if (varno < 0) { varno = d->ncols-1; if (varno == sp->xyvars.y) varno--; } } if (varno != sp->xyvars.x) { jvar_prev = sp->xyvars.x; if (xyplot_varsel (sp, varno, &jvar_prev, -1, 1)) varpanel_refresh (display, gg); display_tailpipe (display, FULL, gg); } } /* * The question is: cycle over all y vs x, ie, the entire * off-diagonal scatterplot matrix, or cycle over only one * triangle of the matrix. It's more efficient just to use * the upper triangle, so let's try to make that work properly. * * y is always > x, unless we're starting from a projection that * was determined by variable selection, not by cycling. (And * users can select plots during cycling, too.) */ void cycle_xy (splotd *sp, displayd *display, GGobiData *d, ggobid *gg) { cpaneld *cpanel = &display->cpanel; gint jx, jy; gint jvar_prev; gboolean redraw = false; jx = sp->xyvars.x; jy = sp->xyvars.y; if (cpanel->xyplot.cycle_dir == 1) { /* case 1: x is maxed out. */ if ((jx == d->ncols-1) || (jx == d->ncols-2 && jy == d->ncols-1) ) { jx = 0; jy = jx+1; /* 2: this can occur due to variable selection, but not due to cycling */ } else if (jy < jx) { jy = jx+1; /* y is maxed out, but not x */ } else if (jy == d->ncols-1) { jx++; jy = 0; } else jy++; } else { /* case 1: y is at a minimum, or x and y together are at a minimum */ if ( jy == jx+1 ) { if (jx == 0) { jx = d->ncols - 2; } else { jx--; } jy = d->ncols - 1; /* 2: this can occur due to variable selection, but not due to cycling */ } else if (jy < jx) { jy = d->ncols-1; /* 3: just decrement y */ } else jy--; } if (jx != sp->xyvars.x) { jvar_prev = sp->xyvars.x; redraw = xyplot_varsel (sp, jx, &jvar_prev, -1, 1); } if (jy != sp->xyvars.y) { jvar_prev = sp->xyvars.y; redraw = redraw | xyplot_varsel (sp, jy, &jvar_prev, -1, 2); } if (redraw) { varpanel_refresh (display, gg); display_tailpipe (display, FULL, gg); } } gint xycycle_func (ggobid *gg) { displayd *display = gg->current_display; GGobiData *d = gg->current_display->d; splotd *sp = gg->current_splot; cpaneld *cpanel = &display->cpanel; switch (cpanel->xyplot.cycle_axis) { case XFIXED: cycle_fixedx (sp, display, d, gg); break; case YFIXED: cycle_fixedy (sp, display, d, gg); break; default: cycle_xy (sp, display, d, gg); } return true; } ggobi-2.1.12/src/.data.gob.stamp0000644000175000017500000000000014651527764011746 ggobi-2.1.12/src/tour1d.c0000644000175000017500000007350014651527764010544 /* tour1d.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include #include "vars.h" #include "externs.h" #include "tour_pp.h" #include "tour1d_pp.h" /* */ #define T1DON true #define T1DOFF false static void tour1d_speed_set_display(gfloat slidepos, displayd *dsp); void tour1d_write_video(ggobid *gg); #ifdef TESTING_TOUR_STEP void tour1d_step_cb(displayd *dsp, tour td, gint projdim, ggobid *gg, void *display) { g_printerr ("tour_step\n"); } #endif void display_tour1d_init_null (displayd *dsp, ggobid *gg) { arrayd_init_null(&dsp->t1d.Fa); arrayd_init_null(&dsp->t1d.Fz); arrayd_init_null(&dsp->t1d.F); arrayd_init_null(&dsp->t1d.Ga); arrayd_init_null(&dsp->t1d.Gz); arrayd_init_null(&dsp->t1d.G); arrayd_init_null(&dsp->t1d.Va); arrayd_init_null(&dsp->t1d.Vz); arrayd_init_null(&dsp->t1d.tv); vectori_init_null(&dsp->t1d.subset_vars); vectorb_init_null(&dsp->t1d.subset_vars_p); vectori_init_null(&dsp->t1d.active_vars); vectorb_init_null(&dsp->t1d.active_vars_p); vectorf_init_null(&dsp->t1d.lambda); vectorf_init_null(&dsp->t1d.tau); vectorf_init_null(&dsp->t1d.tinc); /* manipulation controls */ arrayd_init_null(&dsp->t1d_manbasis); } void alloc_tour1d (displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; gint nc = d->ncols; arrayd_alloc(&dsp->t1d.Fa, 1, nc); arrayd_alloc(&dsp->t1d.Fz, 1, nc); arrayd_alloc(&dsp->t1d.F, 1, nc); arrayd_alloc(&dsp->t1d.Ga, 1, nc); arrayd_alloc(&dsp->t1d.Gz, 1, nc); arrayd_alloc(&dsp->t1d.G, 1, nc); arrayd_alloc(&dsp->t1d.Va, 1, nc); arrayd_alloc(&dsp->t1d.Vz, 1, nc); arrayd_alloc(&dsp->t1d.tv, 1, nc); vectori_alloc(&dsp->t1d.subset_vars, nc); vectorb_alloc_zero(&dsp->t1d.subset_vars_p, nc); vectori_alloc(&dsp->t1d.active_vars, nc); vectorb_alloc_zero(&dsp->t1d.active_vars_p, nc); vectorf_alloc(&dsp->t1d.lambda, nc); vectorf_alloc(&dsp->t1d.tau, nc); vectorf_alloc(&dsp->t1d.tinc, nc); /* manipulation controls */ arrayd_alloc(&dsp->t1d_manbasis, 2, nc); } /*-- eliminate the nc columns contained in *cols --*/ void tour1d_realloc_down (gint nc, gint *cols, GGobiData *d, ggobid *gg) { displayd *dsp; GList *l; for (l=gg->displays; l; l=l->next) { dsp = (displayd *) l->data; if (dsp->d == d) { arrayd_delete_cols (&dsp->t1d.Fa, nc, cols); arrayd_delete_cols (&dsp->t1d.Fz, nc, cols); arrayd_delete_cols (&dsp->t1d.F, nc, cols); arrayd_delete_cols (&dsp->t1d.Ga, nc, cols); arrayd_delete_cols (&dsp->t1d.Gz, nc, cols); arrayd_delete_cols (&dsp->t1d.G, nc, cols); arrayd_delete_cols (&dsp->t1d.Va, nc, cols); arrayd_delete_cols (&dsp->t1d.Vz, nc, cols); arrayd_delete_cols (&dsp->t1d.tv, nc, cols); vectori_delete_els (&dsp->t1d.subset_vars, nc, cols); vectorb_delete_els (&dsp->t1d.subset_vars_p, nc, cols); vectori_delete_els (&dsp->t1d.active_vars, nc, cols); vectorb_delete_els (&dsp->t1d.active_vars_p, nc, cols); vectorf_delete_els (&dsp->t1d.lambda, nc, cols); vectorf_delete_els (&dsp->t1d.tau, nc, cols); vectorf_delete_els (&dsp->t1d.tinc, nc, cols); arrayd_delete_cols (&dsp->t1d_manbasis, (gint) nc, cols); } } } void free_tour1d(displayd *dsp) { vectori_free(&dsp->t1d.subset_vars); vectorb_free(&dsp->t1d.subset_vars_p); vectori_free(&dsp->t1d.active_vars); vectorb_free(&dsp->t1d.active_vars_p); vectorf_free(&dsp->t1d.lambda); vectorf_free(&dsp->t1d.tau); vectorf_free(&dsp->t1d.tinc); arrayd_free(&dsp->t1d.Fa, 0, 0); arrayd_free(&dsp->t1d.Fz, 0, 0); arrayd_free(&dsp->t1d.F, 0, 0); arrayd_free(&dsp->t1d.Ga, 0, 0); arrayd_free(&dsp->t1d.Gz, 0, 0); arrayd_free(&dsp->t1d.F, 0, 0); arrayd_free(&dsp->t1d.Va, 0, 0); arrayd_free(&dsp->t1d.Vz, 0, 0); arrayd_free(&dsp->t1d.tv, 0, 0); arrayd_free(&dsp->t1d_manbasis, 0, 0); } void tour1d_snap(ggobid *gg) { displayd *dsp = gg->current_display; splotd *sp = gg->current_splot; GGobiData *d = dsp->d; gint j; gdouble rnge; vartabled *vt; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); rnge = vt->lim.max - vt->lim.min; fprintf(stdout,"%f %f \n", dsp->t1d.F.vals[0][j], dsp->t1d.F.vals[0][j]/rnge*sp->scale.x); } } void tour1d_video(ggobid *gg) { displayd *dsp = gg->current_display; if (dsp == NULL) return; dsp->t1d_video = !dsp->t1d_video; } void tour1d_write_video(ggobid *gg) { displayd *dsp = gg->current_display; splotd *sp = gg->current_splot; GGobiData *d = dsp->d; gint j; gdouble rnge; vartabled *vt; gfloat ppval; if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) ppval = dsp->t1d.ppval; else ppval = 0.; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); rnge = vt->lim.max - vt->lim.min; fprintf(stdout,"%f %f %f \n", dsp->t1d.F.vals[0][j], dsp->t1d.F.vals[0][j]/rnge*sp->scale.x, ppval); } } void display_tour1d_init (displayd *dsp, ggobid *gg) { gint i, j; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gint nc = d->ncols; alloc_tour1d(dsp, gg); /* Initialize starting subset of active variables */ if (nc < 8) { dsp->t1d.nsubset = dsp->t1d.nactive = nc; for (j=0; jt1d.subset_vars.els[j] = dsp->t1d.active_vars.els[j] = j; dsp->t1d.subset_vars_p.els[j] = dsp->t1d.active_vars_p.els[j] = true; } } else { dsp->t1d.nsubset = dsp->t1d.nactive = 3; for (j=0; j<3; j++) { dsp->t1d.subset_vars.els[j] = dsp->t1d.active_vars.els[j] = j; dsp->t1d.subset_vars_p.els[j] = dsp->t1d.active_vars_p.els[j] = true; } for (j=3; jt1d.subset_vars.els[j] = dsp->t1d.active_vars.els[j] = 0; dsp->t1d.subset_vars_p.els[j] = dsp->t1d.active_vars_p.els[j] = false; } } /* declare starting base as first p chosen variables */ for (i=0; i<1; i++) for (j=0; jt1d.Fa.vals[i][j] = dsp->t1d.Fz.vals[i][j] = dsp->t1d.F.vals[i][j] = dsp->t1d.Ga.vals[i][j] = dsp->t1d.Gz.vals[i][j] = 0.0; for (i=0; i<1; i++) { dsp->t1d.Fz.vals[i][dsp->t1d.active_vars.els[i]] = dsp->t1d.Fa.vals[i][dsp->t1d.active_vars.els[i]] = dsp->t1d.F.vals[i][dsp->t1d.active_vars.els[i]] = dsp->t1d.Ga.vals[i][dsp->t1d.active_vars.els[i]] = dsp->t1d.Gz.vals[i][dsp->t1d.active_vars.els[i]] = 1.0; } dsp->t1d.dist_az = 0.0; dsp->t1d.delta = cpanel->t1d.step*M_PI_2/10.0; dsp->t1d.tang = 0.0; dsp->t1d.idled = 0; dsp->t1d.get_new_target = true; dsp->t1d_video = false; /* manip */ dsp->t1d_manip_var = 0; /* pp */ dsp->t1d.target_selection_method = TOUR_RANDOM; dsp->t1d_ppda = NULL; dsp->t1d_axes = true; dsp->t1d_pp_op.temp_start = 1.0; dsp->t1d_pp_op.cooling = 0.99; tour1d_speed_set_display(sessionOptions->defaultTour1dSpeed, dsp); } void tour1d_fade_vars (gboolean fade, ggobid *gg) { gg->tour1d.fade_vars = fade; } void tour1d_all_vars (displayd *dsp) { ggobid *gg = dsp->ggobi; GGobiData *d = dsp->d; gint j; //gg->tour1d.all_vars = !gg->tour1d.all_vars; //if (gg->tour1d.all_vars) //{ for (j=0; jncols; j++) { dsp->t1d.subset_vars.els[j] = j; dsp->t1d.active_vars.els[j] = j; dsp->t1d.subset_vars_p.els[j] = true; dsp->t1d.active_vars_p.els[j] = true; } dsp->t1d.nsubset = d->ncols; dsp->t1d.nactive = d->ncols; dsp->t1d.get_new_target = true; zero_tau(dsp->t1d.tau, 1); varcircles_visibility_set (dsp, gg); varpanel_refresh (dsp, gg); if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { free_optimize0_p(&dsp->t1d_pp_op); alloc_optimize0_p(&dsp->t1d_pp_op, d->nrows_in_plot, dsp->t1d.nactive, 1); free_pp(&dsp->t1d_pp_param); alloc_pp(&dsp->t1d_pp_param, d->nrows_in_plot, dsp->t1d.nactive, 1); t1d_pp_reinit(dsp, gg); } //} } static void tour1d_speed_set_display(gfloat slidepos, displayd *dsp) { cpaneld *cpanel = &dsp->cpanel; cpanel->t1d.slidepos = slidepos; speed_set(slidepos, &cpanel->t1d.step, &dsp->t1d.delta); } void tour1d_speed_set(gfloat slidepos, ggobid *gg) { tour1d_speed_set_display(slidepos, gg->current_display); } #ifdef TESTING_TOUR_STEP void tour1d_step_cb(displayd *dsp, tour td, gint projdim, ggobid *gg, void *display) { g_printerr ("tour_step\n"); } #endif void tour1d_pause (cpaneld *cpanel, gboolean state, displayd *dsp, ggobid *gg) { if (dsp == NULL) return; cpanel->t1d.paused = state; tour1d_func (!cpanel->t1d.paused, dsp, gg); if (cpanel->t1d.paused) { /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (dsp, FULL, gg); } } /*-- add/remove jvar to/from the subset of variables that be active --*/ static gboolean tour1d_subset_var_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gboolean in_subset = dsp->t1d.subset_vars_p.els[jvar]; gint j, k; gboolean changed = false; /* * require 2 variables in the subset, though only 1 is * required in active_vars */ if (in_subset) { if (dsp->t1d.nsubset > MIN_NVARS_FOR_TOUR1D) { dsp->t1d.subset_vars_p.els[jvar] = false; dsp->t1d.nsubset -= 1; changed = true; } } else { dsp->t1d.subset_vars_p.els[jvar] = true; dsp->t1d.nsubset += 1; changed = true; } /*-- reset subset_vars based on subset_vars_p --*/ if (changed) { dsp->t1d_manipvar_inc = false; for (j=0, k=0; jncols; j++) { if (dsp->t1d.subset_vars_p.els[j]) { dsp->t1d.subset_vars.els[k++] = j; if (j == dsp->t1d_manip_var) dsp->t1d_manipvar_inc = true; } } /*-- Manip var needs to be one of the active vars --*/ if (!dsp->t1d_manipvar_inc) { dsp->t1d_manip_var = dsp->t1d.subset_vars.els[0]; } zero_tau(dsp->t1d.tau, 1); dsp->t1d.get_new_target = true; } return changed; } void tour1d_active_var_set (gint jvar, GGobiData *d, displayd *dsp, ggobid *gg) { gint j, k; gboolean in_subset = dsp->t1d.subset_vars_p.els[jvar]; gboolean active = dsp->t1d.active_vars_p.els[jvar]; /* * This covers the case where we've just removed a variable * from the subset and then called tour1d_active_var_set .. * but the variable is already inactive, so we don't need to * do anything. */ if (!active && !in_subset) /**/return; /* deselect var if t1d.nactive > 2 */ if (active) { if (dsp->t1d.nactive > 1) { for (j=0; jt1d.nactive; j++) { if (jvar == dsp->t1d.active_vars.els[j]) break; } if (jt1d.nactive-1) { for (k=j; kt1d.nactive-1; k++){ dsp->t1d.active_vars.els[k] = dsp->t1d.active_vars.els[k+1]; } } dsp->t1d.nactive--; if (!gg->tour1d.fade_vars) /* set current position without sel var */ { gt_basis(dsp->t1d.Fa, dsp->t1d.nactive, dsp->t1d.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->t1d.Fa, &dsp->t1d.F); /* copy_mat(dsp->t1d.F.vals, dsp->t1d.Fa.vals, d->ncols, 1);*/ } dsp->t1d.active_vars_p.els[jvar] = false; } } else { /* not active, so add the variable */ if (jvar > dsp->t1d.active_vars.els[dsp->t1d.nactive-1]) { dsp->t1d.active_vars.els[dsp->t1d.nactive] = jvar; } else if (jvar < dsp->t1d.active_vars.els[0]) { for (j=dsp->t1d.nactive; j>0; j--) { dsp->t1d.active_vars.els[j] = dsp->t1d.active_vars.els[j-1]; } dsp->t1d.active_vars.els[0] = jvar; } else { gint jtmp = dsp->t1d.nactive; for (j=0; jt1d.nactive-1; j++) { if (jvar > dsp->t1d.active_vars.els[j] && jvar < dsp->t1d.active_vars.els[j+1]) { jtmp = j+1; break; } } for (j=dsp->t1d.nactive-1;j>=jtmp; j--) dsp->t1d.active_vars.els[j+1] = dsp->t1d.active_vars.els[j]; dsp->t1d.active_vars.els[jtmp] = jvar; } dsp->t1d.nactive++; dsp->t1d.active_vars_p.els[jvar] = true; } if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { free_optimize0_p(&dsp->t1d_pp_op); alloc_optimize0_p(&dsp->t1d_pp_op, d->nrows_in_plot, dsp->t1d.nactive, 1); free_pp(&dsp->t1d_pp_param); alloc_pp(&dsp->t1d_pp_param, d->nrows_in_plot, dsp->t1d.nactive, 1); t1d_pp_reinit(dsp, gg); } dsp->t1d.get_new_target = true; } static void tour1d_manip_var_set (gint j, gint btn, ggobid *gg) { displayd *dsp = gg->current_display; if (btn == 1) dsp->t1d_manip_var = j; } gboolean tour1d_varsel (GtkWidget *w, gint jvar, gint toggle, gint mouse, GGobiData *d, ggobid *gg) { displayd *dsp = gg->current_display; gboolean redraw = true; if (GTK_IS_TOGGLE_BUTTON(w) || GTK_IS_BUTTON(w)) { /* toggle or 'label' */ /* * add/remove jvar to/from the subset of variables that be active */ gboolean fade = gg->tour1d.fade_vars; redraw = tour1d_subset_var_set (jvar, d, dsp, gg); if (redraw) { varcircles_visibility_set (dsp, gg); /*-- Add/remove the variable to/from the active set, too. But: if we just removed it from the subset, but it was already inactive, there's no need to do anything --*/ if (dsp->t1d.subset_vars_p.els[jvar] == false && dsp->t1d.active_vars_p.els[jvar] == false) ; else { gg->tour1d.fade_vars = false; tour1d_active_var_set (jvar, d, dsp, gg); gg->tour1d.fade_vars = fade; if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { free_optimize0_p(&dsp->t1d_pp_op); alloc_optimize0_p(&dsp->t1d_pp_op, d->nrows_in_plot, dsp->t1d.nactive, 1); free_pp(&dsp->t1d_pp_param); alloc_pp(&dsp->t1d_pp_param, d->nrows_in_plot, dsp->t1d.nactive, 1); t1d_pp_reinit(dsp, gg); } } } } else if (GTK_IS_DRAWING_AREA(w)) { /*-- any button --*/ if (d->vcirc_ui.jcursor == GDK_HAND2) { /* This part sets the manip var */ tour1d_manip_var_set (jvar, mouse, gg); varcircles_cursor_set_default (d); } else { /* This part sets active/not active var */ tour1d_active_var_set (jvar, d, dsp, gg); if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { free_optimize0_p(&dsp->t1d_pp_op); alloc_optimize0_p(&dsp->t1d_pp_op, d->nrows_in_plot, dsp->t1d.nactive, 1); free_pp(&dsp->t1d_pp_param); alloc_pp(&dsp->t1d_pp_param, d->nrows_in_plot, dsp->t1d.nactive, 1); t1d_pp_reinit(dsp, gg); } } } return redraw; } void tour1d_projdata(splotd *sp, greal **world_data, GGobiData *d, ggobid *gg) { gint i, j, m; displayd *dsp = (displayd *) sp->displayptr; gfloat min, max, mean; gfloat precis = PRECISION1; cpaneld *cpanel = &dsp->cpanel; gfloat *yy; if (sp == NULL) return; if (sp->p1d.spread_data.nels != d->nrows) vectorf_realloc (&sp->p1d.spread_data, d->nrows); yy = (gfloat *) g_malloc (d->nrows_in_plot * sizeof (gfloat)); for (m=0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; yy[m] = sp->planar[i].x = 0; sp->planar[i].y = 0; for (j=0; jncols; j++) { yy[m] += (gfloat)(dsp->t1d.F.vals[0][j]*world_data[i][j]); } } do_ash1d (yy, d->nrows_in_plot, cpanel->t1d.nbins, cpanel->t1d.nASHes, sp->p1d.spread_data.els, &min, &max, &mean); if (sp->tour1d.initmax) { sp->tour1d.mincnt = 0.0; /* let this be zero for consistency */ sp->tour1d.maxcnt = max; sp->tour1d.initmax = false; sp->tour1d.minscreenx = yy[0]; sp->tour1d.maxscreenx = yy[0]; } else if (max > sp->tour1d.maxcnt) sp->tour1d.maxcnt = max; /*max = 2*mean; * try letting the max for scaling depend on the mean */ max = sp->tour1d.maxcnt; if (cpanel->t1d.vert) { for (m=0; mnrows_in_plot; m++) { if (yy[m] < sp->tour1d.minscreenx) { sp->tour1d.minscreenx = yy[m]; } else if (yy[m] > sp->tour1d.maxscreenx) { sp->tour1d.maxscreenx = yy[m]; } } for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; sp->planar[i].x = (greal) (precis*(-1.0+2.0* sp->p1d.spread_data.els[m]/max)); /*(sp->p1d_data.els[i]-min)/(max-min)));*/ /* sp->planar[i].y = yy[i];*/ sp->planar[i].y = (greal) (precis*(-1.0+2.0* ((yy[m]-sp->tour1d.minscreenx)/ (sp->tour1d.maxscreenx-sp->tour1d.minscreenx)))); } } else { for (m=0; mnrows_in_plot; m++) { if (yy[m] < sp->tour1d.minscreenx) { sp->tour1d.minscreenx = yy[m]; } else if (yy[m] > sp->tour1d.maxscreenx) { sp->tour1d.maxscreenx = yy[m]; } } for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; sp->planar[i].x = (greal) (precis*(-1.0+2.0* ((yy[m]-sp->tour1d.minscreenx)/ (sp->tour1d.maxscreenx-sp->tour1d.minscreenx)))); /* sp->planar[i].x = yy[i];*/ sp->planar[i].y = (greal) (precis*(-1.0+2.0* sp->p1d.spread_data.els[m]/max)); /*(sp->p1d_data.els[i]-min)/(max-min)));*/ } } g_free ((gpointer) yy); } void tour1d_run(displayd *dsp, ggobid *gg) { GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; /* static gint count = 0;*/ gboolean revert_random = false; gint pathprob = 0; gint i, nv; extern void t1d_ppdraw_think(displayd *, ggobid *); /* Controls interpolation steps */ if (!dsp->t1d.get_new_target && !reached_target(dsp->t1d.tang, dsp->t1d.dist_az, dsp->t1d.target_selection_method,&dsp->t1d.ppval, &dsp->t1d.oppval)) { increment_tour(dsp->t1d.tinc, dsp->t1d.tau, dsp->t1d.dist_az, dsp->t1d.delta, &dsp->t1d.tang, (gint) 1); tour_reproject(dsp->t1d.tinc, dsp->t1d.G, dsp->t1d.Ga, dsp->t1d.Gz, dsp->t1d.F, dsp->t1d.Va, d->ncols, (gint) 1); /* plot pp indx */ if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { /* if (dsp->t1d_ppda != NULL) {*/ dsp->t1d.oppval = dsp->t1d.ppval; revert_random = t1d_switch_index(cpanel->t1d.pp_indx, 0, dsp, gg); t1d_ppdraw(dsp->t1d.ppval, dsp, gg); } } else { /* we're at the target plane */ if (dsp->t1d.get_new_target) { /* store the pp parameters */ if (dsp->t1d.target_selection_method == TOUR_PP) { /* dsp->t1d_pp_op.index_best = dsp->t1d.ppval; for (j=0; jt1d.nactive; j++) dsp->t1d_pp_op.proj_best.vals[0][j] = dsp->t1d.F.vals[0][dsp->t1d.active_vars.els[j]];*/ } } else { /* make sure the ending projection is the same as the target */ if (dsp->t1d.target_selection_method == TOUR_RANDOM) { do_last_increment(dsp->t1d.tinc, dsp->t1d.tau, dsp->t1d.dist_az, (gint) 1); tour_reproject(dsp->t1d.tinc, dsp->t1d.G, dsp->t1d.Ga, dsp->t1d.Gz, dsp->t1d.F, dsp->t1d.Va, d->ncols, (gint) 1); } } /* now cleanup: store the current basis into the starting basis */ arrayd_copy(&dsp->t1d.F, &dsp->t1d.Fa); nv = 0; for (i=0; incols; i++) if (fabs(dsp->t1d.Fa.vals[0][i]) > 0.01) { nv++; } if (nv == 1 && dsp->t1d.nactive == 1) /* only generate new dir if num of active/used variables is > 2 */ dsp->t1d.get_new_target = true; else { if (dsp->t1d.target_selection_method == TOUR_RANDOM) { gt_basis(dsp->t1d.Fz, dsp->t1d.nactive, dsp->t1d.active_vars, d->ncols, (gint) 1); } else if (dsp->t1d.target_selection_method == TOUR_PP) { /* pp guided tour */ /* get new target according to the selected pp index */ for (i=0; incols; i++) dsp->t1d.Fz.vals[0][i] = 0.0; dsp->t1d.Fz.vals[0][dsp->t1d.active_vars.els[0]]=1.0; dsp->t1d.oppval = -1.0; t1d_ppdraw_think(dsp, gg); gdk_flush (); revert_random = t1d_switch_index(cpanel->t1d.pp_indx, dsp->t1d.target_selection_method, dsp, gg); if (!revert_random) { for (i=0; it1d.nactive; i++) { if (isfinite((gdouble)dsp->t1d_pp_op.proj_best.vals[0][i]) != 0) dsp->t1d.Fz.vals[0][dsp->t1d.active_vars.els[i]] = dsp->t1d_pp_op.proj_best.vals[0][i]; } dsp->t1d_pp_op.index_best = 0.0; /*g_printerr ("tour_run:index_best %f temp %f \n", dsp->t1d_pp_op.index_best, dsp->t1d_pp_op.temp); g_printerr ("proj: "); for (i=0; it1d_pp_op.proj_best.ncols; i++) g_printerr ("%f ", dsp->t1d_pp_op.proj_best.vals[0][i]); g_printerr ("\n");*/ /* if the best projection is the same as the previous one, switch to a random projection */ /* if (!checkequiv(dsp->t1d.Fa.vals, dsp->t1d.Fz.vals, d->ncols, 1)) { g_printerr ("Using random projection\n"); gt_basis(dsp->t1d.Fz, dsp->t1d.nactive, dsp->t1d.active_vars, d->ncols, (gint) 1); for (j=0; jt1d.nactive; j++) dsp->t1d_pp_op.proj_best.vals[0][j] = dsp->t1d.Fz.vals[0][dsp->t1d.active_vars.els[j]]; revert_random = t1d_switch_index(cpanel->t1d.pp_indx, dsp->t1d.target_selection_method, dsp, gg); }*/ /* t1d_ppdraw(dsp->t1d.ppval, dsp, gg);*/ /* count = 0;*/ ggobi_sleep(0); } else /* Use random target */ { /* gt_basis(dsp->t1d.Fz, dsp->t1d.nactive, dsp->t1d.active_vars, d->ncols, (gint) 1); g_printerr ("Using random projection 2\n");*/ } } pathprob = tour_path(dsp->t1d.Fa, dsp->t1d.Fz, dsp->t1d.F, d->ncols, (gint) 1, dsp->t1d.Ga, dsp->t1d.Gz, dsp->t1d.G, dsp->t1d.lambda, dsp->t1d.tv, dsp->t1d.Va, dsp->t1d.Vz, dsp->t1d.tau, dsp->t1d.tinc, &dsp->t1d.dist_az, &dsp->t1d.tang); if (pathprob == 0) dsp->t1d.get_new_target = false; else if (pathprob == 1) { /* problems with Fa so need to force a jump */ tour1d_scramble(gg); pathprob = tour_path(dsp->t1d.Fa, dsp->t1d.Fz, dsp->t1d.F, d->ncols, (gint) 1, dsp->t1d.Ga, dsp->t1d.Gz, dsp->t1d.G, dsp->t1d.lambda, dsp->t1d.tv, dsp->t1d.Va, dsp->t1d.Vz, dsp->t1d.tau, dsp->t1d.tinc, &dsp->t1d.dist_az, &dsp->t1d.tang); } else if (pathprob == 2 || pathprob == 3) { /* problems with Fz, so will force a new choice of Fz */ dsp->t1d.get_new_target = true; } } } /* tour_reproject(dsp, 2);*/ #ifdef TESTING_TOUR_STEP { GGobiDisplayClass *klass; klass = GGOBI_DISPLAY_GET_CLASS(dsp); g_signal_emit(G_OBJECT(dsp), klass->signals[TOUR_STEP_SIGNAL], 0, dsp->t1d, (gint) 1, gg); } #endif display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); if (dsp->t1d_video) tour1d_write_video(gg); } void tour1d_do_step(displayd *dsp, ggobid *gg) { tour1d_run(dsp, gg); } gint tour1d_idle_func (displayd *dsp) { ggobid *gg = GGobiFromDisplay (dsp); cpaneld *cpanel = &dsp->cpanel; gboolean doit = !cpanel->t1d.paused; if (doit) { tour1d_run (dsp, gg); gdk_flush (); } return (doit); } void tour1d_func (gboolean state, displayd *dsp, ggobid *gg) { splotd *sp = (splotd *) g_list_nth_data (dsp->splots, 0); if (state) { if (dsp->t1d.idled == 0) { dsp->t1d.idled = g_idle_add_full (G_PRIORITY_LOW, (GtkFunction) tour1d_idle_func, dsp, NULL); } gg->tour1d.idled = 1; } else { if (dsp->t1d.idled) { g_source_remove (dsp->t1d.idled); dsp->t1d.idled = 0; } gg->tour1d.idled = 0; } splot_connect_expose_handler (dsp->t1d.idled, sp); } void tour1d_reinit(ggobid *gg) { gint i, j; displayd *dsp = gg->current_display; GGobiData *d = dsp->d; splotd *sp = gg->current_splot; for (i=0; i<1; i++) { for (j=0; jncols; j++) { dsp->t1d.Fa.vals[i][j] = 0.; dsp->t1d.F.vals[i][j] = 0.; } dsp->t1d.Fa.vals[i][dsp->t1d.active_vars.els[i]] = 1.; dsp->t1d.F.vals[i][dsp->t1d.active_vars.els[i]] = 1.; } /* Reinits the vertical height for the ashes */ sp->tour1d.initmax = true; dsp->t1d.get_new_target = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) t1d_pp_reinit(dsp, gg); } void tour1d_scramble(ggobid *gg) { int i, j; displayd *dsp = gg->current_display; GGobiData *d = dsp->d; gint nc = d->ncols; for (i=0; i<1; i++) for (j=0; jt1d.Fa.vals[i][j] = dsp->t1d.Fz.vals[i][j] = dsp->t1d.F.vals[i][j] = dsp->t1d.Ga.vals[i][j] = dsp->t1d.Gz.vals[i][j] = 0.0; gt_basis(dsp->t1d.Fa, dsp->t1d.nactive, dsp->t1d.active_vars, d->ncols, (gint) 1); arrayd_copy(&dsp->t1d.Fa, &dsp->t1d.F); /* copy_mat(dsp->t1d.F.vals, dsp->t1d.Fa.vals, d->ncols, 1);*/ dsp->t1d.get_new_target = true; display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) t1d_pp_reinit(dsp, gg); } void tour1d_vert(cpaneld *cpanel, gboolean state) { cpanel->t1d.vert = state; } /* Variable manipulation */ void tour1d_manip_init(gint p1, gint p2, splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); gint j; gint n1vars = dsp->t1d.nactive; gboolean dontdoit = false; dsp->t1d_phi = 0.; /* gets mouse position */ if (cpanel->t1d.vert) dsp->t1d_pos = dsp->t1d_pos_old = p2; else dsp->t1d_pos = dsp->t1d_pos_old = p1; /* initializes indicator for manip var being one of existing vars */ dsp->t1d_manipvar_inc = false; /* need to turn off tour */ if (!cpanel->t1d.paused) tour1d_func(T1DOFF, gg->current_display, gg); /* check if manip var is one of existing vars */ /* n1vars, n2vars is the number of variables, excluding the manip var in hor and vert directions */ for (j=0; jt1d.nactive; j++) if (dsp->t1d.active_vars.els[j] == dsp->t1d_manip_var) { dsp->t1d_manipvar_inc = true; n1vars--; } /* make manip basis, from existing projection */ /* 0 will be the remainder of the projection, and 1 will be the indicator vector for the manip var */ for (j=0; jncols; j++) { dsp->t1d_manbasis.vals[0][j] = dsp->t1d.F.vals[0][j]; dsp->t1d_manbasis.vals[1][j] = 0.; } dsp->t1d_manbasis.vals[1][dsp->t1d_manip_var]=1.; if (n1vars > 0) { while (!gram_schmidt(dsp->t1d_manbasis.vals[0], dsp->t1d_manbasis.vals[1], d->ncols)) { gt_basis(dsp->t1d.tv, dsp->t1d.nactive, dsp->t1d.active_vars, d->ncols, (gint) 1); for (j=0; jncols; j++) dsp->t1d_manbasis.vals[1][j] = dsp->t1d.tv.vals[0][j]; } } if (dontdoit) disconnect_motion_signal (sp); } void tour1d_manip(gint p1, gint p2, splotd *sp, ggobid *gg) { displayd *dsp = (displayd *) sp->displayptr; GGobiData *d = dsp->d; cpaneld *cpanel = &dsp->cpanel; gfloat xcosphi=1., xsinphi=0.; gfloat distx, disty; gfloat denom = (float) MIN(sp->max.x, sp->max.y)/2.; gint actual_nxvars = dsp->t1d.nactive; gint j; gboolean offscreen = false; gboolean pp_problem = false; /* check if off the plot window */ if (p1 > sp->max.x || p1 < 0 || p2 > sp->max.y || p2 <0) offscreen = true; if (dsp->t1d_manipvar_inc) actual_nxvars = dsp->t1d.nactive-1; if (!offscreen) { dsp->t1d_pos_old = dsp->t1d_pos; dsp->t1d_pos = p1; if (actual_nxvars > 0) { if (cpanel->t1d.vert) { distx = 0.; disty = dsp->tc2_pos_old - dsp->tc2_pos; } else { distx = dsp->t1d_pos - dsp->t1d_pos_old; disty = 0.; } dsp->t1d_phi = dsp->t1d_phi + distx / denom; xcosphi = (gfloat) cos((gdouble) dsp->t1d_phi); xsinphi = (gfloat) sin((gdouble) dsp->t1d_phi); if (xcosphi > 1.0) { xcosphi = 1.0; xsinphi = 0.0; } else if (xcosphi < -1.0) { xcosphi = -1.0; xsinphi = 0.0; } } /* generate the projection basis */ if (actual_nxvars > 0) { for (j=0; jncols; j++) dsp->t1d.F.vals[0][j] = xcosphi * dsp->t1d_manbasis.vals[0][j] + xsinphi * dsp->t1d_manbasis.vals[1][j]; } /* plot pp index */ /* if (dsp->t1d_ppda != NULL) {*/ if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { dsp->t1d.oppval = dsp->t1d.ppval; pp_problem = t1d_switch_index(cpanel->t1d.pp_indx, 0, dsp, gg); t1d_ppdraw(dsp->t1d.ppval, dsp, gg); } display_tailpipe (dsp, FULL, gg); varcircles_refresh (d, gg); } else { disconnect_motion_signal (sp); arrayd_copy(&dsp->t1d.F, &dsp->t1d.Fa); /* copy_mat(dsp->t1d.Fa.vals, dsp->t1d.F.vals, d->ncols, 1);*/ dsp->t1d.get_new_target = true; if (!cpanel->t1d.paused) tour1d_func(T1DON, gg->current_display, gg); } } void tour1d_manip_end(splotd *sp) { displayd *dsp = (displayd *) sp->displayptr; cpaneld *cpanel = &dsp->cpanel; ggobid *gg = GGobiFromSPlot(sp); disconnect_motion_signal (sp); arrayd_copy(&dsp->t1d.F, &dsp->t1d.Fa); /* copy_mat(dsp->t1d.Fa.vals, dsp->t1d.F.vals, d->ncols, 1);*/ dsp->t1d.get_new_target = true; /* need to turn on tour? */ if (!cpanel->t1d.paused) { tour1d_pause(cpanel, T1DOFF, dsp, gg); /*-- whenever motion stops, we need a FULL redraw --*/ display_tailpipe (dsp, FULL, gg); } } #undef T1DON #undef T1DOFF ggobi-2.1.12/src/scatterplotClass.h0000644000175000017500000000555014651527764012665 /* scatterplotClass.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef SCATTERPLOT_CLASS_H #define SCATTERPLOT_CLASS_H #include "ggobi.h" #define GGOBI_TYPE_SCATTER_SPLOT (ggobi_scatter_splot_get_type()) #define GGOBI_SCATTER_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_SCATTER_SPLOT, scatterSPlotd)) #define GGOBI_SCATTER_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_SCATTER_SPLOT, GGobiScatterSPlotClass)) #define GGOBI_IS_SCATTER_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_SCATTER_SPLOT)) #define GGOBI_IS_SCATTER_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_SCATTER_SPLOT)) #define GGOBI_SCATTER_SPLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_SCATTER_SPLOT, GGobiScatterSPlotClass)) GType ggobi_scatter_splot_get_type(void); typedef struct { GGobiExtendedSPlotClass parent_class; } GGobiScatterSPlotClass; typedef struct { extendedSPlotd extendedSPlot; } scatterSPlotd; #define GGOBI_TYPE_SCATTERPLOT_DISPLAY (ggobi_scatterplot_display_get_type ()) #define GGOBI_SCATTERPLOT_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_SCATTERPLOT_DISPLAY, scatterplotDisplayd)) #define GGOBI_SCATTERPLOT_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_SCATTERPLOT_DISPLAY, GGobiScatterplotDisplayClass)) #define GGOBI_IS_SCATTERPLOT_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_SCATTERPLOT_DISPLAY)) #define GGOBI_IS_SCATTERPLOT_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_SCATTERPLOT_DISPLAY)) #define GGOBI_SCATTERPLOT_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_SCATTERPLOT_DISPLAY, GGobiScatterplotDisplayClass)) GType ggobi_scatterplot_display_get_type(); displayd *ggobi_scatterplot_display_new(gint type, gboolean missing_p, GGobiData *d, ggobid *gg); typedef struct { GGobiExtendedDisplayClass parent_class; } GGobiScatterplotDisplayClass; typedef struct { extendedDisplayd extendedDpy; } scatterplotDisplayd; void scatterSPlotClassInit(GGobiScatterSPlotClass *klass); void scatterplotDisplayClassInit(GGobiScatterplotDisplayClass *display); void scatterplotDisplayInit(scatterplotDisplayd *display); displayd *createScatterplot(displayd *, gboolean use_window, gboolean missing_p, splotd *sp, gint numVars, gint *vars, GGobiData *d, ggobid *gg); #endif ggobi-2.1.12/src/tour1d_pp_ui.c0000644000175000017500000003706014651527764011741 /* tour1d_pp_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #define WIDTH 200 #define HEIGHT 100 /*-- projection pursuit indices --*/ #define PCA 0 #define LDA 1 #define CGINI 2 #define CENTROPY 3 #define CART_VAR 4 #define SUBD 5 /* terms in expansion, bandwidth */ /* static GtkWidget *param_vb, *param_lbl, *param_scale; static GtkAdjustment *param_adj; */ /*-- called when closed from the close menu item --*/ static void action_close_cb (GtkAction *action, displayd *dsp) { gtk_widget_hide (dsp->t1d_window); t1d_optimz(0, &dsp->t1d.get_new_target, &dsp->t1d.target_selection_method, dsp); /* free_optimize0_p(&dsp->t1d_pp_op); * should this go here? * free_pp(&dsp->t1d_pp_param); seems not, causes a crash because window just gets hidden, so shouldn't free the arrays. */ } /*-- called when destroyed from the window manager --*/ static void close_wmgr_cb (GtkWidget *w, GdkEventButton *event, displayd *dsp) { gtk_widget_hide (dsp->t1d_window); t1d_optimz(0, &dsp->t1d.get_new_target, &dsp->t1d.target_selection_method, dsp); free_optimize0_p(&dsp->t1d_pp_op); free_pp(&dsp->t1d_pp_param); gtk_widget_destroy (dsp->t1d_window); dsp->t1d_window = NULL; } static void action_show_controls_cb(GtkToggleAction *action, displayd *dsp) { if (gtk_toggle_action_get_active(action)) gtk_widget_show (dsp->t1d_control_frame); else gtk_widget_hide (dsp->t1d_control_frame); } /*static void line_options_cb(gpointer data, guint action, GtkCheckMenuItem *w) { g_printerr ("action = %d\n", action); switch (action) { case 0: case 1: case 2: default: fprintf(stderr, "Unhandled switch-case in line_options_cb\n"); } }*/ /*static void bitmap_size_cb(gpointer data, guint action, GtkCheckMenuItem *w) { g_printerr ("action = %d\n", action); switch (action) { case 0: case 1: case 2: default: fprintf(stderr, "Unhandled switch-case in bitmap_size_cb\n"); } }*/ /*static void replot_freq_cb(gpointer data, guint action, GtkCheckMenuItem *w) { g_printerr ("action = %d\n", action); switch (action) { case 1: case 2: case 4: case 8: case 16: break; default: fprintf(stderr, "Unhandled switch-case in replot_freq_cb\n"); } }*/ static void t1d_optimz_cb (GtkToggleButton *w, displayd *dsp) { if (dsp == NULL) { g_printerr ("No display corresponds to these controls\n"); return; } t1d_optimz(w->active, &dsp->t1d.get_new_target, &dsp->t1d.target_selection_method, dsp); } static void t1d_pptemp_set_cb (GtkAdjustment *adj, displayd *dsp) { t1d_pptemp_set(adj->value, dsp, dsp->d->gg); } static void t1d_ppcool_set_cb (GtkAdjustment *adj, displayd *dsp) { t1d_ppcool_set(adj->value, dsp, dsp->d->gg); } gchar *t1d_pp_func_lbl[] = {"Holes","Central Mass","PCA","LDA","Gini-C","Entropy-C"}; /*,"LDA","CART Gini","CART Entropy", "CART Variance","SUB-D" };*/ void t1d_pp_func_cb (GtkWidget *w, displayd *dsp) { cpaneld *cpanel = NULL; gint indx = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); gchar *label = g_strdup("PP index: (0.000) 0.0000 (0.000)"); ggobid *gg; if (dsp == NULL) { g_printerr ("No display corresponds to these controls\n"); return; } gg = GGobiFromDisplay (dsp); cpanel = &dsp->cpanel; cpanel->t1d.pp_indx = indx; dsp->t1d.get_new_target = true; dsp->t1d.ppval = 0.0; dsp->t1d.oppval = -1.0; dsp->t1d_pp_op.index_best = 0.0; sprintf(label, "PP index: (%3.1f) %5.3f (%3.1f) ",0.0,dsp->t1d.ppval,0.0); gtk_label_set_text(GTK_LABEL(dsp->t1d_pplabel),label); t1d_clear_ppda(dsp, gg); /* if (indx == SUBD || LDA || CART_GINI || CART_ENTROPY || CART_VAR || PCA) gtk_widget_hide (param_vb); else { gtk_widget_show (param_vb); }*/ } /* static void bitmap_cb (GtkButton *button) { g_printerr ("drop a new bitmp\n"); } static void return_to_bitmap_cb (GtkToggleButton *w) { g_printerr ("return to bitmap? %d\n", w->active); } static void record_bitmap_cb (GtkToggleButton *w) { g_printerr ("record bitmap? %d\n", w->active); } */ static gint ppda_configure_cb (GtkWidget *w, GdkEventConfigure *event, displayd *dsp) { gint wid = w->allocation.width, hgt = w->allocation.height; if (dsp->t1d_pp_pixmap != NULL) gdk_pixmap_unref (dsp->t1d_pp_pixmap); dsp->t1d_pp_pixmap = gdk_pixmap_new (dsp->t1d_ppda->window, wid, hgt, -1); return false; } static gint ppda_expose_cb (GtkWidget *w, GdkEventConfigure *event, displayd *dsp) { ggobid *gg = dsp->d->gg; /* gint margin=10; gint j; gint xpos, ypos, xstrt, ystrt; gchar *tickmk; GtkStyle *style = gtk_widget_get_style (dsp->t1d_ppda); GGobiData *d = dsp->d; */ gint wid = w->allocation.width, hgt = w->allocation.height; /* static gboolean init = true;*/ /* if (init) { t1d_clear_ppda(dsp, gg); init=false; }*/ gdk_draw_pixmap (dsp->t1d_ppda->window, gg->plot_GC, dsp->t1d_pp_pixmap, 0, 0, 0, 0, wid, hgt); return false; } static const gchar* tour1dpp_ui = "" " " " " " " " " " " " " " " " " ""; static GtkActionEntry entries[] = { { "File", NULL, "_File" }, { "Close", GTK_STOCK_CLOSE, "_Close", "C", "Hide the projection pursuit window", G_CALLBACK(action_close_cb) }, { "Options", NULL, "_Options" } }; static GtkToggleActionEntry t_entries[] = { { "ShowControls", NULL, "_Show controls", "S", "Hide the controls on the left so that the graph consumes the entire window", G_CALLBACK(action_show_controls_cb), true } }; void tour1dpp_window_open (ggobid *gg) { GtkWidget *hbox, *vbox, *vbc, *vb, *frame, *tgl, *hb, *opt, *sbar, *lbl; GtkObject *adj; /*GtkWidget *da, *label, *entry;*/ displayd *dsp = gg->current_display; /* ok as long as we only use the gui */ GGobiData *d = dsp->d; /*-- to initialize the checkboxes in the menu --*/ if (dsp->t1d_window == NULL) { GtkUIManager *manager = gtk_ui_manager_new(); GtkActionGroup *actions = gtk_action_group_new("Tour1DPPActions"); dsp->t1d_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (dsp->t1d_window), "Projection Pursuit - 1D"); g_signal_connect (G_OBJECT (dsp->t1d_window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) dsp); /*gtk_window_set_policy (GTK_WINDOW (dsp->t1d_window), true, true, false);*/ g_signal_connect (G_OBJECT(d), "rows_in_plot_changed", G_CALLBACK(reset_pp), gg); gtk_container_set_border_width (GTK_CONTAINER (dsp->t1d_window), 10); /* * Add the main menu bar */ vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (dsp->t1d_window), vbox); gtk_action_group_add_actions(actions, entries, G_N_ELEMENTS(entries), dsp); gtk_action_group_add_toggle_actions(actions, t_entries, G_N_ELEMENTS(t_entries), dsp); gtk_ui_manager_insert_action_group(manager, actions, 0); g_object_unref(G_OBJECT(actions)); dsp->t1d_mbar = create_menu_bar(manager, tour1dpp_ui, dsp->t1d_window); /*dsp->t1d_pp_accel_group = gtk_accel_group_new (); factory = get_main_menu (menu_items, sizeof (menu_items) / sizeof (menu_items[0]), dsp->t1d_pp_accel_group, dsp->t1d_window, &dsp->t1d_mbar, (gpointer) dsp);*/ gtk_box_pack_start (GTK_BOX (vbox), dsp->t1d_mbar, false, true, 0); /* * Divide the window: controls on the left, plot on the right */ hbox = gtk_hbox_new (false, 1); gtk_container_set_border_width (GTK_CONTAINER (hbox), 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, true, true, 1); /* * Controls */ dsp->t1d_control_frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (dsp->t1d_control_frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (dsp->t1d_control_frame), 5); gtk_box_pack_start (GTK_BOX (hbox), dsp->t1d_control_frame, false, false, 1); vbc = gtk_vbox_new (false, 5); gtk_container_set_border_width (GTK_CONTAINER (vbc), 5); gtk_container_add (GTK_CONTAINER (dsp->t1d_control_frame), vbc); /* * Optimize toggle */ tgl = gtk_check_button_new_with_mnemonic ("_Optimize"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Guide the tour using projection pursuit optimization or tour passively", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (t1d_optimz_cb), (gpointer) dsp); gtk_box_pack_start (GTK_BOX (vbc), tgl, false, false, 1); /* * Box to hold temp start and cooling controls */ hb = gtk_hbox_new (true, 2); vb = gtk_vbox_new (false, 0); lbl = gtk_label_new_with_mnemonic ("_Temp start:"); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); /*-- value, lower, upper, step --*/ adj = gtk_adjustment_new (1.0, 0.1, 3.0, 0.1, 0.1, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (t1d_pptemp_set_cb), dsp); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_widget_set_name (sbar, "TOUR1D:PP_TEMPST"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust starting temp of pp", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); gtk_box_pack_start (GTK_BOX (hb), vb, false, false, 0); /*-- value, lower, upper, step --*/ vb = gtk_vbox_new (false, 0); lbl = gtk_label_new_with_mnemonic ("_Cooling:"); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); adj = gtk_adjustment_new (0.99, 0.5, 1.0, 0.05, 0.05, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (t1d_ppcool_set_cb), dsp); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_widget_set_name (sbar, "TOUR1D:PP_COOLING"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust cooling", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); gtk_box_pack_start (GTK_BOX (hb), vb, false, false, 0); gtk_box_pack_start (GTK_BOX (vbc), hb, false, false, 0); /* * Index value with label */ hb = gtk_hbox_new (false, 3); gtk_box_pack_start (GTK_BOX (vbc), hb, false, false, 2); dsp->t1d_pplabel = gtk_label_new ("PP index: (0.00) 0.0000 (0.00)"); gtk_misc_set_alignment (GTK_MISC (dsp->t1d_pplabel), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), dsp->t1d_pplabel, false, false, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), dsp->t1d_pplabel, "The value of the projection pursuit index for the current projection", NULL); /* entry = gtk_entry_new_with_max_length (32); gtk_entry_set_editable (GTK_ENTRY (entry), false); gtk_entry_set_text (GTK_ENTRY (entry), "0"); gtk_box_pack_start (GTK_BOX (hb), entry, false, false, 2); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "The value of the projection pursuit index for the current projection", NULL); g_signal_connect (G_OBJECT (entry), "value_changed", G_CALLBACK (t1d_writeindx_cb), gg);*/ /* g_signal_connect (G_OBJECT (dsp->t1d.ppval), "value_changed", G_CALLBACK (t1d_writeindx_cb), gg);*/ /* * pp index menu and scale inside frame */ /* frame = gtk_frame_new ("PP index function"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbc), frame, false, false, 0); */ vb = gtk_vbox_new (false, 3); gtk_box_pack_start (GTK_BOX (vbc), vb, false, false, 2); /* gtk_container_add (GTK_CONTAINER (frame), vb);*/ opt = gtk_combo_box_new_text (); //gtk_container_set_border_width (GTK_CONTAINER (opt), 4); /* gtk_misc_set_alignment (opt, 0, 0.5); */ gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Set the projection pursuit index", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); /* gtk_box_pack_start (GTK_BOX (hb), opt, false, false, 0);*/ populate_combo_box (opt, t1d_pp_func_lbl, G_N_ELEMENTS(t1d_pp_func_lbl), G_CALLBACK(t1d_pp_func_cb), (gpointer) dsp); /* param_vb = gtk_vbox_new (false, 3); gtk_container_set_border_width (GTK_CONTAINER (param_vb), 4); gtk_box_pack_start (GTK_BOX (vb), param_vb, false, false, 2); param_lbl = gtk_label_new ("Terms in expansion:"); gtk_misc_set_alignment (GTK_MISC (param_lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (param_vb), param_lbl, false, false, 0); param_adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 30.0, 1.0, 1.0, 0.0); param_scale = gtk_hscale_new (GTK_ADJUSTMENT (param_adj)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), param_scale, "Set number of terms in the expansion for some indices; bandwidth for others", NULL); gtk_range_set_update_policy (GTK_RANGE (param_scale), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE (param_scale), 0); gtk_scale_set_value_pos (GTK_SCALE (param_scale), GTK_POS_BOTTOM); gtk_box_pack_start (GTK_BOX (param_vb), param_scale, true, true, 0); */ /* * Drawing area in a frame */ frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_box_pack_start (GTK_BOX (hbox), frame, true, true, 1); dsp->t1d_ppda = gtk_drawing_area_new (); gtk_widget_set_double_buffered(dsp->t1d_ppda, false); gtk_widget_set_size_request (GTK_WIDGET (dsp->t1d_ppda), WIDTH, HEIGHT); g_signal_connect (G_OBJECT (dsp->t1d_ppda), "configure_event", G_CALLBACK(ppda_configure_cb), (gpointer) dsp); g_signal_connect (G_OBJECT (dsp->t1d_ppda), "expose_event", G_CALLBACK(ppda_expose_cb), (gpointer) dsp); gtk_container_add (GTK_CONTAINER (frame), dsp->t1d_ppda); gtk_widget_show_all (dsp->t1d_window); } alloc_optimize0_p(&dsp->t1d_pp_op, d->nrows_in_plot, dsp->t1d.nactive, 1); alloc_pp(&dsp->t1d_pp_param, d->nrows_in_plot, dsp->t1d.nactive, 1); gtk_widget_show_all (dsp->t1d_window); } #undef SUBD #undef LDA #undef CGINI #undef CENTROPY #undef CART_VAR #undef PCA ggobi-2.1.12/src/tsdisplay.c0000644000175000017500000002270014651527764011336 /* tsdisplay.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of time series code: Nicholas Lewin-Koh */ #include "ggobi.h" #include "tsdisplay.h" #include "externs.h" #include displayd * timeSeriesDisplayCreate(gboolean use_window, gboolean missing_p, splotd *sp, GGobiData *d, ggobid *gg) { gint *selected_vars, nselected_vars = 0; displayd *dpy = NULL; selected_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nselected_vars = selected_cols_get (selected_vars, d, gg); dpy = tsplot_new (dpy, use_window, false, nselected_vars, selected_vars, d, gg); g_free(selected_vars); return(dpy); } gint tsplotIsVarPlotted(displayd *display, gint *cols, gint ncols, GGobiData *d) { GList *l; splotd *sp; int j; for (l = display->splots; l; l = l->next) { sp = (splotd *) l->data; for (j=0; jxyvars.x == cols[j]) { return(sp->xyvars.x); } if (sp->xyvars.y == cols[j]) { return(sp->xyvars.y); } } } return(-1); } gboolean tsplotCPanelSet(displayd *dpy, cpaneld *cpanel, ggobid *gg) { GtkWidget *w; w = GGOBI_EXTENDED_DISPLAY(dpy)->cpanelWidget; if(!w) { GGOBI_EXTENDED_DISPLAY(dpy)->cpanelWidget = w = cpanel_tsplot_make(gg); } /* Can actually be more efficient here by storing the option menu used in tsplot_set and avoid looking it up each time. Store it in the displayd object. */ cpanel_tsplot_set (dpy, cpanel, w, gg); cpanel_brush_set (dpy, cpanel, gg); cpanel_identify_set (dpy, cpanel, gg); return(true); } void tsplotDisplaySet(displayd *dpy, ggobid *gg) { } void tsplotVarpanelRefresh(displayd *display, splotd *sp, GGobiData *d) { gint j; GList *l; for (j=0; jncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, true, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } l = display->splots; while (l) { j = ((splotd *) l->data)->xyvars.y; varpanel_toggle_set_active (VARSEL_Y, j, true, d); j = ((splotd *) l->data)->xyvars.x; varpanel_toggle_set_active (VARSEL_X, j, true, d); l = l->next; } } gboolean tsplotHandlesInteraction(displayd *dpy, InteractionMode mode) { return(mode == BRUSH || mode == IDENT || mode == DEFAULT_IMODE); } #ifdef STORE_SESSION_ENABLED /* Write out the variables in a time series plot to the current node in the XML tree. */ void add_xml_tsplot_variables(xmlNodePtr node, GList *plots, displayd *dpy) { splotd *plot; xmlNodePtr no; plot = (splotd *)plots->data; no = XML_addVariable(node, plot->xyvars.x, dpy->d); xmlSetProp(no, (xmlChar *) "type", (xmlChar *) "time"); while(plots) { plot = (splotd *)plots->data; XML_addVariable(node, plot->xyvars.y, dpy->d); plots = plots->next; } } #endif void tsplotVarpanelTooltipsSet(displayd *dpy, ggobid *gg, GtkWidget *wx, GtkWidget *wy, GtkWidget *wz, GtkWidget *label) { gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Select to replace the horizontal (time) variable.", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wy, "Select to delete or append a Y variable; drag plots to reorder.", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click left to replace the horizontal (time) variable. Click middle or right to append or delete a Y variable; drag plots to reorder.", NULL); } gint tsplotPlottedColsGet(displayd *display, gint *cols, GGobiData *d, ggobid *gg) { GList *l; splotd *s; gint ncols = 0; for (l=display->splots; l; l=l->next) { s = (splotd *) l->data; if (!array_contains (cols, ncols, s->xyvars.y)) cols[ncols++] = s->xyvars.y; } return(ncols); } GtkWidget * tsplotCPanelWidget(displayd *dpy, gchar **modeName, ggobid *gg) { GtkWidget *w = GGOBI_EXTENDED_DISPLAY(dpy)->cpanelWidget; if(!w) { GGOBI_EXTENDED_DISPLAY(dpy)->cpanelWidget = w = cpanel_tsplot_make(gg); } *modeName = "TSPlot"; return(w); } /*********************************************************************/ void start_timeSeries_drag(GtkWidget *src, GdkDragContext *ctxt, GtkSelectionData *data, guint info, guint time, gpointer udata) { gtk_selection_data_set(data, data->target, 8, (guchar *) src, sizeof(splotd *)); } void receive_timeSeries_drag(GtkWidget *src, GdkDragContext *context, int x, int y, const GtkSelectionData *data, unsigned int info, unsigned int event_time, gpointer *udata) { splotd *to = GGOBI_SPLOT(src), *from, *sp; displayd *display; display = to->displayptr; GList *l; gint k; GList *ivars = NULL; gint xvar; from = GGOBI_SPLOT(gtk_drag_get_source_widget(context)); if(from->displayptr != display) { gg_write_to_statusbar("the source and destination of the parallel coordinate plots are not from the same display.\n", display->ggobi); return; } /* Get the x variable */ sp = (splotd *) (display->splots)->data; xvar = sp->xyvars.x; /* Gather a list of indices of the vertically plotted variables */ l = display->splots; while (l) { sp = (splotd *) l->data; ivars = g_list_append(ivars, GINT_TO_POINTER(sp->xyvars.y)); l = l->next; } /* Find the index of the to element */ k = g_list_index(ivars, GINT_TO_POINTER(to->xyvars.y)); /* Remove the from element */ ivars = g_list_remove(ivars, GINT_TO_POINTER(from->xyvars.y)); /* Insert the from element in the position of the to element */ ivars = g_list_insert(ivars, GINT_TO_POINTER(from->xyvars.y), k); /* Assign them to the existing plots */ k = 0; l = display->splots; while (l) { sp = (splotd *) l->data; sp->xyvars.y = GPOINTER_TO_INT(g_list_nth_data(ivars, k)); k++; l = l->next; } g_list_free(ivars); display_tailpipe (display, FULL, display->ggobi); varpanel_refresh (display, display->ggobi); } void timeSeriesPlotDragAndDropEnable(splotd *sp, gboolean active) { static GtkTargetEntry target = {"text/plain", GTK_TARGET_SAME_APP, 1001}; if (active) { gtk_drag_source_set(GTK_WIDGET(sp), GDK_BUTTON1_MASK, &target, 1, GDK_ACTION_COPY); g_signal_connect(G_OBJECT(sp), "drag_data_get", G_CALLBACK(start_timeSeries_drag), NULL); gtk_drag_dest_set(GTK_WIDGET(sp), GTK_DEST_DEFAULT_ALL /* DROP */, &target, 1, GDK_ACTION_COPY /*MOVE*/); g_signal_connect(G_OBJECT(sp), "drag_data_received", G_CALLBACK(receive_timeSeries_drag), NULL); } else { g_signal_handlers_disconnect_by_func(G_OBJECT(sp), G_CALLBACK(start_timeSeries_drag), NULL); g_signal_handlers_disconnect_by_func(G_OBJECT(sp), G_CALLBACK(receive_timeSeries_drag), NULL); gtk_drag_source_unset(GTK_WIDGET(sp)); gtk_drag_dest_unset(GTK_WIDGET(sp)); } } void timeSeriesDragAndDropEnable(displayd *dsp, gboolean active) { GList *l; for (l = dsp->splots; l; l = l->next) { splotd *sp = (splotd *)l->data; timeSeriesPlotDragAndDropEnable(sp, active); } } /*************************************************************************/ gboolean tsplotEventHandlersToggle(displayd *dpy, splotd *sp, gboolean state, ProjectionMode pmode, InteractionMode imode) { timeSeriesDragAndDropEnable(dpy, false); switch (imode) { case DEFAULT_IMODE: timeSeriesDragAndDropEnable(dpy, true); xyplot_event_handlers_toggle (sp, state); /*-- ?? --*/ break; case BRUSH: brush_event_handlers_toggle (sp, state); break; case IDENT: identify_event_handlers_toggle (sp, state); break; default: break; } return false; } #include gboolean tsplotKeyEventHandled(GtkWidget *w, displayd *display, splotd *sp, GdkEventKey *event, ggobid *gg) { gboolean ok = true; ProjectionMode pmode = NULL_PMODE; InteractionMode imode = DEFAULT_IMODE; if (event->state == 0 || event->state == GDK_CONTROL_MASK) { switch (event->keyval) { case GDK_h: case GDK_H: pmode = EXTENDED_DISPLAY_PMODE; break; case GDK_b: case GDK_B: imode = BRUSH; break; case GDK_i: case GDK_I: imode = IDENT; break; default: ok = false; break; } if (ok) { GGOBI(full_viewmode_set)(pmode, imode, gg); } } else { ok = false; } return ok; } gchar * tsplot_tree_label(splotd *sp, GGobiData *d, ggobid *gg) { return(ggobi_data_get_col_name(d, sp->xyvars.y)); } /*************************************************/ void tsplot_cpanel_init (cpaneld* cpanel, ggobid *gg) { cpanel->pmode = EXTENDED_DISPLAY_PMODE; cpanel->imode = DEFAULT_IMODE; /*-- 1d plots --*/ cpanel->p1d.type = DOTPLOT; cpanel_p1d_init (cpanel, gg); cpanel->tsplot_arrangement = ARRANGE_COL; /*-- available modes --*/ cpanel_brush_init (cpanel, gg); cpanel_identify_init (cpanel, gg); } /*--------------------------------------------------------------------*/ /* Time series: Options menu */ /*--------------------------------------------------------------------*/ ggobi-2.1.12/src/splash.h0000644000175000017500000066140314651527764010632 /* XPM */ static char *splash[] = { /* width height num_colors chars_per_pixel */ " 664 332 2 1", /* colors */ ". c #e0caff", "# c #000000", /* pixels */ "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................#######............#######......................###............###............................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................##########.........##########.....................###............###............................................................................................................................................................................................................................................................................................................................", ".......................................................................................................................................................................................................................................................................................#####...####.......#####...####....................###............###............................................................................................................................................................................................................................................................................................................................", "......................................................................................................................................................................................................................................................................................####......###......####......###....................###...........................................................................................................................................................................................................................................................................................................................................", ".....................................................................................................................................................................................................................................................................................###........###.....###........###...................###............................................................................................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................................................................####...............####...................####.......###.#####......###.............................................................................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................................................................###................###..................########.....##########.....###.............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................####...............####.................####..###.....#####..###.....###.............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................###................###.................###.....###...####.....###...###..............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................###......########..###......########..###......###...###......###...###..............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................###......########..###......########..###......###...###......###...###..............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................###..........###...###..........###..###.......###...###......###...###..............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................###..........###...###..........###..###.......###..###......###...###...............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................###.........####...###.........####..###......###...###......###...###...............................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................####........###....####........###...###......###...###.....###....###...............................................................................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................................................................###.......####.....###.......####...###.....###....###.....###....###...............................................................................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................................................................####....######.....####....######....###..####....#####..####....###................................................................................................................................................................................................................................................................................................................................", ".....................................................................................................................................................................................................................................................................................############.......############.....########.....##########.....###................................................................................................................................................................................................................................................................................................................................", "......................................................................................................................................................................................................................................................................................#######..##........#######..##.......####.......###.#####......###................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................###.........................................................................................................###...............................................###.............................................###..........................................###.........................................###..........###......................................................................................................................................................................................................", "...........................................................................................................................................................###...........................................................................###...........................###...............................................###.............................................###....................###...................###.........................................###..........###......................................................................................................................................................................................................", "...........................................................................................................................................................###...........................................................................###...........................###...............................................###.............................................###....................###...................###.........................................###..........###......................................................................................................................................................................................................", ".........................................................................................................................................................................................................................................###...........................###...............................................###....................................................................###...............................................................###..........###......................................................................................................................................................................................................", "........................................................................................................................................................................................................................................###...........................###...............................................###....................................................................###...............................................................###..........###.......................................................................................................................................................................................................", "..........................................................................................................................................................###.....######...............####......###..##......#####........######.....#######......#####.........####.###............######......###.####..........####.###..........###.####..#####........######......###....###.####......#######.....######......###....###.####..........#####.........####.###..........###.#####....###.......###................................................................................................................................................................................", "..........................................................................................................................................................###...#########............#######.....###.###....########.....#########....#######....########......##########..........#########.....#########.......##########..........################.....#########.....###....#########.....#######...#########.....###....#########.......########......##########..........##########...###.......###................................................................................................................................................................................", "..........................................................................................................................................................###..####...####..........####..###....#######...####..###....####...###......###.....####..###.....####..#####.........####...###.....####...###.....####..#####..........####..#####..###....####...###.....###....####...###......###....####...###.....###....####...###.....####..###.....####..#####..........#####..###...###......###.................................................................................................................................................................................", ".........................................................................................................................................................###...###.....###.........###.....##...#####.....###.....###...###....###.....###.....###.....###...###.....###..........###....###....####....###....###.....###..........####...####...###....###....###....###....####....###.....###.....###....###....###....####....###....###.....###...###.....###..........####.....###..###......###.................................................................................................................................................................................", ".........................................................................................................................................................###...###................###...........####.....###......###.........####.....###....###......###..###......###................####....###.....###...###......###..........###....###....###..........####....###....###.....###.....###...........####....###....###.....###...###......###..###......###..........###......###...###....###..................................................................................................................................................................................", ".........................................................................................................................................................###...#####..............###...........###......###......###......######......###....###......###..###......###.............######.....###.....###...###......###..........###....###....###.......######.....###....###.....###.....###........######.....###....###.....###...###......###..###......###..........###......###...###....###..................................................................................................................................................................................", ".........................................................................................................................................................###....######...........###............###.....#############....########......###...#############.###.......###...........########.....###.....###..###.......###..........###....###....###.....########.....###....###.....###.....###......########.....###....###.....###..#############.###.......###..........###......###...###...###...................................................................................................................................................................................", "........................................................................................................................................................###.......######.........###...........###......############....####..###.....###....############..###.......###..........####..###....###.....###...###.......###.........###....###....###.....####..###....###....###.....###.....###......####..###....###....###.....###...############..###.......###.........###......###....###...###...................................................................................................................................................................................", "........................................................................................................................................................###..........####........###...........###......###............###....###.....###....###...........###......###..........###....###....###.....###...###......###..........###....###....###....###....###....###....###.....###.....###.....###....###....###....###.....###...###...........###......###..........###......###.....###.###....................................................................................................................................................................................", "........................................................................................................................................................###...###.....###........###...........###......###...........###.....###.....###....###...........###......###.........###.....###....###.....###...###......###..........###....###....###...###.....###....###....###.....###.....###....###.....###....###....###.....###...###...........###......###..........###.....###......###.###....................................................................................................................................................................................", "........................................................................................................................................................###...###.....###........###.....###...###......###.....###...###....###.....###.....###.....###...###.....####.........###....###.....###.....###...###.....####..........###....###....###...###....###.....###....###.....###....###.....###....###.....###....###.....###...###.....###...###.....####..........###.....###......######.....................................................................................................................................................................................", ".......................................................................................................................................................###....####...####.........###..####...###........###..####....###..#####.....###......###..####.....###..#####..........###..#####....###.....###.....###..#####..........###....###....###....###..#####....###....###.....###.....###.....###..#####....###....###.....###.....###..####.....###..#####..........#####..####........####......................................................................................................................................................................................", ".......................................................................................................................................................###.....#########..........########....###........########.....##########.....#####....########......##########..........##########....###.....###.....##########..........###....###....###....##########....###....###.....###.....#####...##########....###....###.....###.....########......##########..........##########.........####......................................................................................................................................................................................", ".......................................................................................................................................................###......######..............####......###..........####........####..###......####......####..........####.###...........####..###....###.....###.......####.###..........###....###....###.....####..###....###....###.....###......####....####..###....###....###.....###.......####..........####.###..........###.#####..........###.......................................................................................................................................................................................", "..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................###.......................................................................................................................................................................................", ".............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................###........................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................###.........................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................#####.........................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................####..........................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................##########.......................###..................................................###......................######................................................................................................................................................##########.....................................................................................###############....................................................###........................###.....................................................................................................................................", "..............................................................................############.....................###..................................................###....................#########...............................................................................................................................................############...................................................................................###############....................................................###........................###.....................................................................................................................................", "..............................................................................###.....#####....................###..................................................###...................####...####..............................................................................................................................................###.....#####........................................................................................###..........................................................###........................###.....................................................................................................................................", "..............................................................................###.......###....................###..................................................###..................###......###..............................................................................................................................................###.......###........................................................................................###..........................................................###........................###.....................................................................................................................................", ".............................................................................###.........###..................###..................................................###..................###.......###.............................................................................................................................................###.........###......................................................................................###..........................................................###........................###......................................................................................................................................", ".............................................................................###.........###.......#####......###.#####.........####.......###..##.....######......###.####.............###............###.....###.....###....######....###.......###...###.####..........#####...................................................................###.........###....###.....###....###.####..........####........######......###.####.................###...........#####......###.####..#####......###.####.......###.......#####............###..............######......###.####..........####.###..................................................................................", ".............................................................................###.........###.....########.....##########......########.....###.###...#########.....#########............####...........###....####.....###..#########...###.......###...#########.......########..................................................................###.........###....###.....###....#########.......#######.....#########.....#########................###.........########.....################.....##########.....###.....########...........###............#########.....#########.......##########..................................................................................", ".............................................................................###.........###....####..###.....#####..###.....####..###.....#######..####...###.....####...###............#####.........###....####....###..####...###...###......###....####...###.....####..###..................................................................###.........###....###.....###....####...###.....####..###...####...###.....####...###...............###........####..###.....####..#####..###.....#####..###.....###....####..###...........###...........####...###.....####...###.....####..#####..................................................................................", "............................................................................###..........###...###.....###...####.....###...###.....###...#####.....###....###....####....###.............#######......###...#####...###...###....###...###......###...####....###....###.....###................................................................###..........###...###.....###....####....###....###.....##...###....###....####....###..............###........###.....###...####...####...###....####.....###...###....###.....###.........###............###....###....####....###....###.....###...................................................................................", "............................................................................###..........###..###......###...###......###..###......###...####............####....###.....###...............#######....###...##.##...###.........####....###....###....###.....###...###......###................................................................###..........###...###.....###....###.....###...###.................####....###.....###..............###.......###......###...###....###....###....###......###...###...###......###.........###..................####....###.....###...###......###...................................................................................", "............................................................................###..........###..###......###...###......###..###......###...###..........######.....###.....###..................#####...###..###.##..###.......######.....###....###....###.....###...###......###................................................................###..........###...###.....###....###.....###...###..............######.....###.....###..............###.......###......###...###....###....###....###......###...###...###......###.........###...............######.....###.....###...###......###...................................................................................", "............................................................................###.........###..#############...###......###.###.......###...###........########.....###.....###....................###...###..##..##..###.....########.....###...###.....###.....###..#############................................................................###.........###....###.....###....###.....###..###.............########.....###.....###..............###......#############...###....###....###...###.......###...###..#############.........###.............########.....###.....###..###.......###...................................................................................", "...........................................................................###..........###..############...###......###..###.......###..###........####..###....###.....###.....................###...###.###..##.###.....####..###.....###...###....###.....###...############................................................................###..........###...###.....###....###.....###...###............####..###....###.....###..............###.......############...###....###....###....###.......###..###...############.........###.............####..###....###.....###...###......###....................................................................................", "...........................................................................###.........####..###............###......###..###......###...###.......###....###....###.....###.........###.........###...###.##...##.##.....###....###......###.###.....###.....###...###.........................................................................###.........####...###.....###....###.....###...###...........###....###....###.....###..............###.......###............###....###....###....###......###...###...###..................###............###....###....###.....###...###......###....................................................................................", "...........................................................................###........####...###............###.....###...###......###...###......###.....###....###.....###.........###........####....#####...#####....###.....###......###.###.....###.....###...###.........................................................................###........####....###....####....###.....###...###..........###.....###....###.....###..............###.......###............###....###....###....###......###...###...###..................###...........###.....###....###.....###...###......###....................................................................................", "...........................................................................###.......####....###.....###....###.....###...###.....###....###......###....###.....###.....###.........####......####.....####....####.....###....###.......######......###.....###...###.....###.................................................................###.......####.....###...#####....###.....###...###.....###..###....###.....###.....###..............###.......###.....###....###....###....###....###.....###....###...###.....###..........###...........###....###.....###.....###...###.....####....................................................................................", "..........................................................................###......#####......###..####....#####..####.....###..####....###.......###..#####....###.....###...........#####..#####......####....####.....###..#####........####......###.....###.....###..####.................................................................###......#####......###..#####....###.....###.....###..####...###..#####....###.....###..............###.........###..####....###....###....###....#####..####....###.....###..####..........###............###..#####....###.....###.....###..#####.....................................................................................", "..........................................................................#############.......########.....##########......########.....###.......##########....###.....###............##########.......###.....###......##########........####......###.....###.....########..................................................................#############........#####.###....###.....###.....########....##########....###.....###..............###.........########.....###....###....###....##########.....###.....########...........############...##########....###.....###.....##########.....................................................................................", "..........................................................................###########...........####.......###.#####.........####.......###........####..###....###.....###..............######.........###.....###.......####..###........###.......###.....###.......####....................................................................###########...........###..###....###.....###.......####.......####..###....###.....###..............###...........####.......###....###....###....###.####.......###.......####.............############....####..###....###.....###.......####.###.....................................................................................", "...........................................................................................................................................................................................................................................###....................................................................................................................................................................................................................................................###...........................................................................................###.....................................................................................", "..........................................................................................................................................................................................................................................###....................................................................................................................................................................................................................................................###..................................................................................###......###......................................................................................", ".........................................................................................................................................................................................................................................###.....................................................................................................................................................................................................................................................###..................................................................................####....###.......................................................................................", ".......................................................................................................................................................................................................................................#####.....................................................................................................................................................................................................................................................###...................................................................................##########.......................................................................................", ".......................................................................................................................................................................................................................................####......................................................................................................................................................................................................................................................###.....................................................................................######.........................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................##########.........###........................................................................#######...................................###............................................................................###................................###.............................................................###########......................###........................................................................................................................................................................................", "..................................................................................................................................############.......###......................................................................##########..................................###...........................................................................####................................###.............................................................############.....................###........................................................................................................................................................................................", "..................................................................................................................................###.....#####......###.....................................................................#####...####.................................###..........................................................................#####................................###.............................................................###......####....................###........................................................................................................................................................................................", "..................................................................................................................................###.......###.............................................................................####......###.................................###..........................................................................#####................................###.............................................................###.......###...............................................................................................................................................................................................................", ".................................................................................................................................###.........###...........................................................................###........###................................###..........................................................................###.###..............................###.............................................................###........###...............................................................................................................................................................................................................", ".................................................................................................................................###.........###....###......######......###.####.......###.####..........#####...........####..................####..........####.......###....###..................................................................###..###.......###.####..........####.###....###..##......#####........######.......######............###........###....###.....###....###......######.............................................................................................................................................................................", ".................................................................................................................................###.........###....###....#########.....#########......#########.......########..........###.................########......########.....###...###...................................................................###..###.......#########.......##########....###.###....########.....#########....#########...........###.......####....###.....###....###....#########............................................................................................................................................................................", ".................................................................................................................................###.........###....###...####...###.....####...###.....####...###.....####..###.........####................####..###.....####..###.....###..###...................................................................###...###.......####...###.....####..#####....#######...####..###....####...###...####...####..........###......####.....###.....###....###...####...###............................................................................................................................................................................", "................................................................................................................................###..........###...###....###....###....####....###....####....###....###.....###........###................###.....###...###.....###...###..###...................................................................###....###......####....###....###.....###....#####.....###.....###...###....###...###.....###.........#############.....###.....###....###....###....###............................................................................................................................................................................", "................................................................................................................................###..........###...###..........####....###.....###....###.....###...###......###........###...............###......###..###......###...#######....................................................................###....###......###.....###...###......###....####.....###......###.........####...###.................#############.....###.....###....###..........####............................................................................................................................................................................", "................................................................................................................................###..........###...###.......######.....###.....###....###.....###...###......###........###...............###......###..###......###...######....................................................................###.....###......###.....###...###......###....###......###......###......######....#####...............###........###....###.....###....###.......######.............................................................................................................................................................................", "................................................................................................................................###.........###....###.....########.....###.....###....###.....###..#############........###..............###.......###.###.......###...#######...................................................................###.....###......###.....###..###.......###....###.....#############....########.....######.............###........###....###.....###....###.....########.............................................................................................................................................................................", "...............................................................................................................................###..........###...###.....####..###....###.....###....###.....###...############.........###..............###.......###.###.......###..###..###..................................................................############.....###.....###...###.......###...###......############....####..###.......######..........###.........###...###.....###....###.....####..###.............................................................................................................................................................................", "...............................................................................................................................###.........####...###....###....###....###.....###....###.....###...###..................###.........###..###......###..###......###...###...###................................................................##############....###.....###...###......###....###......###............###....###..........####.........###.........###...###.....###....###....###....###.............................................................................................................................................................................", "...............................................................................................................................###........####....###...###.....###....###.....###....###.....###...###..................####.......####..###......###..###......###...###...###................................................................###........###....###.....###...###......###....###......###...........###.....###...###.....###.........###........####...###....####....###...###.....###.............................................................................................................................................................................", "...............................................................................................................................###.......####.....###...###....###.....###.....###....###.....###...###.....###...........###......####...###.....###...###.....###....###....###..............................................................###.........###....###.....###...###.....####....###......###.....###...###....###....###.....###........###........####....###...#####....###...###....###..............................................................................................................................................................................", "..............................................................................................................................###......#####.....###....###..#####....###.....###....###.....###.....###..####............####...#####.....###..####.....###..####....###.....###..............................................................###.........###...###.....###.....###..#####....###........###..####....###..#####....####...####........###......#####.....###..#####....###....###..#####..............................................................................................................................................................................", "..............................................................................................................................#############......###....##########....###.....###....###.....###.....########..............##########......########......########.....###......###............................................................###..........###...###.....###.....##########....###........########.....##########.....#########.........#############.......#####.###....###....##########..............................................................................................................................................................................", "..............................................................................................................................###########........###.....####..###....###.....###....###.....###.......####.................#######..........####..........####.......###......###............................................................###..........###...###.....###.......####.###....###..........####........####..###......######...........###########..........###..###....###.....####..###..............................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................###.............................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................###.............................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................###.............................................................................................................................................................................................", "......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................####..............................................................................................................................................................................................", "......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................####..............................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", ".........................############.................................###.....................####.......................................................................###............................................................................###..............................................................................###..........................................................####....................................................................###....###....###........................................###....###.......................................................................................................................................", ".........................############.................................###....................#####...............................................................###.....###............................................................................###...........###................................................................###..................###....................................#####....................................................................###....###....###........................................###....###..................###..................................................................................................................", ".........................###..........................................###....................###.................................................................###.....###............................................................................###...........###................................................................###..................###....................................###......................................................................###....###....###........................................###....###..................###..................................................................................................................", ".........................###................................................................###..................................................................###....................................................................................###...........###.....................................................................................###...................................###..............................................................................###...............................................###.........................###..................................................................................................................", "........................###.................................................................###.................................................................###....................................................................................###...........###.....................................................................................###....................................###.............................................................................###...............................................###.........................###...................................................................................................................", "........................###...............####.......###..##.........###....###.####......#######......####.......###..##...###.####..#####........######.....#######...###.......####.......###.####...............######......###.####..........####.###.........#######......####.............###..##......#####.........####.###....###.....######.....#######......#####......###..##........#######......####.......###..##.........###.####..#####........######......###....###....###....###.####..........####.###..........###....###.....######.....#######....######....................######.........#####.........#####.................................................", "........................###.............########.....###.###.........###....#########.....#######....########.....###.###...################.....#########....#######...###.....########.....#########............#########.....#########.......##########.........#######....########...........###.###....########......##########....###...#########....#######....########.....###.###........#######....########.....###.###.........################.....#########.....###....###....###....#########.......##########..........###....###...#########....#######..#########.................#########......########......########................................................", "........................###............####..###.....#######.........###....####...###......###.....####..###.....#######...####..#####..###....####...###......###.....###....####..###.....####...###..........####...###.....####...###.....####..#####...........###.....####..###...........#######...####..###.....####..#####....###..####...####.....###.....####..###.....#######..........###.....####..###.....#######.........####..#####..###....####...###.....###....###....###....####...###.....####..#####..........###....###..####...####.....###...####...####...............####...####....####..###.....####..###................................................", ".......................###########....###.....###...#####...........###....####....###.....###.....###.....###...#####.....####...####...###....###....###.....###.....###....###.....###...####....###..........###....###....####....###....###.....###...........###.....###.....###.........#####.....###.....###...###.....###....###...###.....###....###.....###.....###...#####............###.....###.....###...#####...........####...####...###....###....###....###....###....###....####....###....###.....###..........###....###...###.....###....###....###.....###...............###.....###...###.....###...###.....###...............................................", ".......................###########...###......###...####............###....###.....###.....###....###......###...####......###....###....###..........####.....###.....###...###......###...###.....###................####....###.....###...###......###...........###....###......###.........####.....###......###..###......###....###...###............###....###......###...####.............###....###......###...####............###....###....###..........####....###....###....###....###.....###...###......###..........###....###...###............###....###.......................###..........###......###..###......###...............................................", ".......................###...........###......###...###.............###....###.....###.....###....###......###...###.......###....###....###.......######......###.....###...###......###...###.....###.............######.....###.....###...###......###...........###....###......###.........###......###......###..###......###....###...#####..........###....###......###...###..............###....###......###...###.............###....###....###.......######.....###....###....###....###.....###...###......###..........###....###...#####..........###....#####.....................#####........###......###..###......###...............................................", ".......................###..........###.......###...###.............###....###.....###.....###...###.......###...###.......###....###....###.....########......###.....###..###.......###...###.....###...........########.....###.....###..###.......###...........###...###.......###.........###.....#############.###.......###....###....######........###...#############...###..............###...###.......###...###.............###....###....###.....########.....###....###....###....###.....###..###.......###..........###....###....######........###.....######....................######.....#############.#############...............................................", "......................###...........###.......###..###.............###....###.....###.....###....###.......###..###.......###....###....###.....####..###.....###.....###...###.......###..###.....###...........####..###....###.....###...###.......###..........###....###.......###........###......############..###......###....###.......######.....###....############...###..............###....###.......###..###.............###....###....###.....####..###....###....###....###....###.....###...###......###..........###....###.......######.....###........######....................######...############..############................................................", "......................###...........###......###...###.............###....###.....###.....###....###......###...###.......###....###....###....###....###.....###.....###...###......###...###.....###..........###....###....###.....###...###......###...........###....###......###.........###......###...........###......###....###..........####....###....###............###..............###....###......###...###.............###....###....###....###....###....###....###....###....###.....###...###......###..........###....###..........####....###...........####......................####..###...........###.........................................................", "......................###...........###......###...###.............###....###.....###.....###....###......###...###.......###....###....###...###.....###.....###.....###...###......###...###.....###.........###.....###....###.....###...###......###...........###....###......###.........###......###...........###......###....###...###.....###....###....###............###..............###....###......###...###.............###....###....###...###.....###....###....###....###....###.....###...###......###..........###....###...###.....###....###....###.....###...............###.....###..###...........###.........................................................", "......................###...........###.....###....###.............###....###.....###.....###....###.....###....###.......###....###....###...###....###.....###......###...###.....###....###.....###.........###....###.....###.....###...###.....####..........###.....###.....###..........###......###.....###...###.....####....###...###.....###...###.....###.....###....###..............###....###.....###....###.............###....###....###...###....###.....###....###....###....###.....###...###.....####..........###....###...###.....###...###.....###.....###...............###.....###..###.....###...###.....###.................................................", ".....................###.............###..####....###.............###....###.....###.....###......###..####....###.......###....###....###....###..#####.....###.....###.....###..####....###.....###..........###..#####....###.....###.....###..#####...........###......###..####..........###........###..####.....###..#####....###....####...####...###......###..####....###..............###......###..####....###.............###....###....###....###..#####....###....###....###....###.....###.....###..#####..........###....###....####...####...###.....####...####..###..........####...####...###..####.....###..####..................................................", ".....................###.............########.....###.............###....###.....###.....###......########.....###.......###....###....###....##########.....#####...###.....########.....###.....###..........##########....###.....###.....##########...........#####....########...........###........########......##########....###.....#########....#####....########.....###..............###......########.....###.............###....###....###....##########....###....###....###....###.....###.....##########..........###....###.....#########....#####....#########...###...........#########....########......########...................................................", ".....................###...............####.......###.............###....###.....###.....###........####.......###.......###....###....###.....####..###......####...###.......####.......###.....###...........####..###....###.....###.......####.###............####......####.............###..........####..........####.###....###......######.......####......####.......###..............###........####.......###.............###....###....###.....####..###....###....###....###....###.....###.......####.###..........###....###......######.......####.....######.....###............######........####..........####.....................................................", "..............................................................................................................................................................................................................................................................................................................................###.....................................................................................................................................................................................###............................................................##.................................................................................................", "....................................................................................................................................................................................................................................................................................................................###......###............................................................................................................................................................................###......###............................................................##..................................................................................................", "....................................................................................................................................................................................................................................................................................................................####....###.............................................................................................................................................................................####....###............................................................##...................................................................................................", ".....................................................................................................................................................................................................................................................................................................................##########..............................................................................................................................................................................##########.................................................................................................................................................................", ".......................................................................................................................................................................................................................................................................................................................######..................................................................................................................................................................................######...................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................................................................................................................................###............###....................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................................................................................................................................###............###....................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................................................................................................................................###............###....................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................................................................................................................................###...................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................................................................................................................................................................................................................................###....................................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###.....###.....######.....###.....######.....###.....###............####.###.......####.###.......####.......###.#####......###..............####.......###..##......####.###.......................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###....####.....######....####.....######....####.....###..........##########.....##########.....########.....##########.....###............########.....###.###....##########.......................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###....####....###.###....####....###.###....####....###..........####..#####....####..#####....####..###.....#####..###.....###...........####..###.....#######...####..#####.......................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###...#####...###..###...#####...###..###...#####...###..........###.....###....###.....###....###.....###...####.....###...###...........###.....###...#####.....###.....###........................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###...##.##...###..###...##.##...###..###...##.##...###.........###......###...###......###...###......###...###......###...###..........###......###...####.....###......###........................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###..###.##..###...###..###.##..###...###..###.##..###..........###......###...###......###...###......###...###......###...###..........###......###...###......###......###........................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###..##..##..###...###..##..##..###...###..##..##..###.........###.......###..###.......###..###.......###...###......###...###.........###.......###...###.....###.......###........................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###.###..##.###....###.###..##.###....###.###..##.###..........###......###...###......###...###.......###..###......###...###..........###.......###..###......###......###.........................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................###.##...##.##.....###.##...##.##.....###.##...##.##...........###......###...###......###...###......###...###......###...###..........###......###...###......###......###.........................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................#####...#####......#####...#####......#####...#####...........###......###...###......###...###......###...###.....###....###..........###......###...###......###......###.........................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................####....####.......####....####.......####....####............###.....####...###.....####...###.....###....###.....###....###..........###.....###....###......###.....####.........................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................####....####.......####....####.......####....####.....###.....###..#####.....###..#####.....###..####....#####..####....###....###.....###..####....###........###..#####..........................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................###.....###........###.....###........###.....###......###.....##########.....##########.....########.....##########.....###....###.....########.....###........##########..........................................................................................................................................................................................................................................................................", "....................................................................................................................................................................................................................................###.....###........###.....###........###.....###......###.......####.###.......####.###.......####.......###.#####......###....###.......####.......###..........####.###..........................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................###............###...............................................................................###..........................................................................................................................................................................................................................................................................", "................................................................................................................................................................................................................................................................................................###......###...###......###......................................................................###......###...........................................................................................................................................................................................................................................................................", "................................................................................................................................................................................................................................................................................................####....###....####....###.......................................................................####....###............................................................................................................................................................................................................................................................................", ".................................................................................................................................................................................................................................................................................................##########.....##########........................................................................##########............................................................................................................................................................................................................................................................................", "...................................................................................................................................................................................................................................................................................................######.........######............................................................................######..............................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................" }; ggobi-2.1.12/src/utils_pango.c0000644000175000017500000000254314651527764011651 /*-- utils_gdk.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #include /** Lays out the text using the given layout. If 'rect' is non-NULL it contains the logical text extents. */ void layout_text (PangoLayout * layout, const gchar * text, PangoRectangle * rect) { if (text) { pango_layout_set_text (layout, text, -1); if (rect) pango_layout_get_pixel_extents (layout, NULL, rect); } } void underline_text (PangoLayout * layout) { PangoAttrList *list; PangoAttribute *attr; attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); attr->start_index = 0; attr->end_index = strlen (pango_layout_get_text (layout)); list = pango_attr_list_new (); pango_attr_list_insert (list, attr); pango_layout_set_attributes (layout, list); pango_attr_list_unref (list); } ggobi-2.1.12/src/scatterplot_ui.c0000644000175000017500000001502614651527764012366 /* scatterplot_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /*--------------------------------------------------------------------*/ /* Resetting the main menubar */ /*--------------------------------------------------------------------*/ static const gchar *mode_ui_str = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; const gchar * scatterplot_mode_ui_get (displayd * display) { return (mode_ui_str); } /*--------------------------------------------------------------------*/ /* Setting the display menubar */ /*--------------------------------------------------------------------*/ static const gchar *edge_ui = "" " " " " " " " " " " ""; static const gchar *edge_option_ui = "" " " " " " " " " " " " " " " " " " " ""; /* * This handles the initialization of the edge menu item and menu, * and it should also be called whenever the number of edge sets * might have changed: when an edge set is added or removed, and * when a datad is added or removed. */ void scatterplot_display_edge_menu_update (displayd * display, GtkAccelGroup * accel_group, ggobid * gg) { GGobiData *d = display->d; /*-- this dataset --*/ gint nd = g_slist_length (gg->d); GGobiData *e; gint k, ne = 0; /*-- If this datad has ids, find the number of other datad's with edges --*/ if (d->rowIds) { endpointsd *endpoints; for (k = 0; k < nd; k++) { e = (GGobiData *) g_slist_nth_data (gg->d, k); if (e->edge.n > 0) { endpoints = resolveEdgePoints (e, d); if (endpoints != NULL) { ne++; } } } } /*-- remove any existing submenu --*/ if (display->edge_merge != -1) { gtk_ui_manager_remove_ui (display->menu_manager, display->edge_merge); if (display->edge_option_merge != -1) gtk_ui_manager_remove_ui (display->menu_manager, display->edge_option_merge); if (ne < 1) { /*-- destroy menu item if there are no edge sets --*/ display->edge_merge = display->edge_option_merge = -1; } } /*-- then build the new menu if appropriate --*/ if (ne) { GtkAction *action = NULL; GSList *group = NULL; const gchar *tooltip = "Attach this edge dataset"; GtkActionGroup *actions = gtk_action_group_new ("Edge Datasets"); if (display->edgeset_action_group) { gtk_ui_manager_remove_action_group (display->menu_manager, display->edgeset_action_group); g_object_unref (G_OBJECT (display->edgeset_action_group)); } gtk_ui_manager_insert_action_group (display->menu_manager, actions, -1); display->edgeset_action_group = actions; /*-- build the menu --*/ display->edge_merge = gtk_ui_manager_add_ui_from_string (display->menu_manager, edge_ui, -1, NULL); if (display->e) { gtk_ui_manager_ensure_update (display->menu_manager); display->edge_option_merge = gtk_ui_manager_add_ui_from_string (display->menu_manager, edge_option_ui, -1, NULL); } /* When there's only one edge set, indicate that on the menu with a single menu item naming the edge set. Let it behave like the other menu items, too, turning on undirected edges. Selecting an edge set is required. */ for (k = 0; k < nd; k++) { e = (GGobiData *) g_slist_nth_data (gg->d, k); if (e->edge.n > 0) { gchar *lbl, *path, *name; if (resolveEdgePoints (e, d) != NULL) { if (ne == 1) { lbl = g_strdup_printf ("Attach edge set (%s)", e->name); path = "/menubar/Edges"; name = g_strdup ("edges"); } else { lbl = ggobi_data_get_name (e); path = "/menubar/Edges/Edgesets"; name = g_strdup_printf ("edgeset_%p", e); } if (ne == 1 || !display->e) { action = gtk_action_new (name, lbl, tooltip, NULL); } else { action = GTK_ACTION (gtk_radio_action_new (name, lbl, tooltip, NULL, GPOINTER_TO_INT (e))); gtk_radio_action_set_group (GTK_RADIO_ACTION (action), group); group = gtk_radio_action_get_group (GTK_RADIO_ACTION (action)); if (e == display->e) gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), true); } g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (edgeset_add_cb), e); gtk_action_group_add_action (actions, action); g_object_unref (action); gtk_ui_manager_add_ui (display->menu_manager, display->edge_merge, path, name, name, GTK_UI_MANAGER_MENUITEM, true); g_object_set_data (G_OBJECT (action), "display", display); g_free (lbl); g_free (name); } } } } } ggobi-2.1.12/src/writedata.h0000644000175000017500000000070114651527764011310 /*-- writedatad.h --*/ /*-- format --*/ #define XMLDATA 0 #define CSVDATA 1 #define BINARYDATA 2 #define MYSQL_DATA 3 /*-- stage --*/ #define RAWDATA 0 #define TFORMDATA 1 /*-- row_ind --*/ #define ALLROWS 0 #define DISPLAYEDROWS 1 #define LABELLEDROWS 2 /*-- column_ind --*/ #define ALLCOLS 0 #define SELECTEDCOLS 1 /*-- missing_ind --*/ #define MISSINGSNA 0 #define MISSINGSDOT 1 #define MISSINGSIMPUTED 2 ggobi-2.1.12/src/barchart.c0000644000175000017500000014141514651527764011115 /* barchart.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of barchart and histogram code: Heike Hofmann */ /* not dealt with: missings, hiddens in overflow bins */ #include #include #include #include #include #include "vars.h" #include "externs.h" #include "barchartDisplay.h" #define WIDTH 370 #define HEIGHT 370 gfloat barchart_sort_index (gfloat * yy, gint ny, ggobid * gg, barchartSPlotd * sp); void barchart_init_categorical (barchartSPlotd * sp, GGobiData * d); void barchart_set_initials (barchartSPlotd * sp, GGobiData * d); void rectangle_inset (gbind * bin); void barchart_allocate_structure (barchartSPlotd * sp, GGobiData * d); void button_draw_with_shadows (GdkPoint * region, GdkDrawable * drawable, ggobid * gg); gboolean rect_intersect (GdkRectangle * rect1, GdkRectangle * rect2, GdkRectangle * dest); gboolean pt_in_rect (icoords pt, GdkRectangle rect); /*----------------------------------------------------------------------*/ /* Options section */ /*----------------------------------------------------------------------*/ /* static const gchar *menu_ui = "" " " " " " " " " " " " " " " ""; */ static const gchar *menu_ui = "" " " " " ""; static void action_toggle_show_bars (GtkToggleAction * action, displayd * display) { set_display_option (gtk_toggle_action_get_active (action), DOPT_POINTS, display); } /* the 'ShowPoints' display action is overridden here for bar display */ static GtkToggleActionEntry toggle_entries[] = { {"ShowPoints", NULL, "Show _bars", "B", "Toggle bar display", G_CALLBACK (action_toggle_show_bars), true}, }; static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries); displayd * barchart_new (gboolean use_window, gboolean missing_p, splotd * sp, GGobiData * d, ggobid * gg) { return (createBarchart (NULL, use_window, missing_p, sp, -1, d, gg)); } displayd * barchart_new_with_vars (gboolean use_window, gboolean missing_p, gint nvars, gint * vars, GGobiData * d, ggobid * gg) { return (createBarchart (NULL, use_window, missing_p, NULL, vars ? vars[0] : 0, d, gg)); } displayd * createBarchart (displayd * display, gboolean use_window, gboolean missing_p, splotd * sp, gint var, GGobiData * d, ggobid * gg) { GtkWidget *table, *vbox; if (d == NULL || d->ncols < 1) return (NULL); if (!display) { if (sp == NULL || sp->displayptr == NULL) { display = g_object_new (GGOBI_TYPE_BARCHART_DISPLAY, NULL); display_set_values (display, d, gg); } else { display = (displayd *) sp->displayptr; display->d = d; } } GGOBI_WINDOW_DISPLAY(display)->useWindow = use_window; /* Want to make certain this is true, and perhaps it may be different for other plot types and so not be set appropriately in DefaultOptions. display->options.axes_center_p = true; */ barchart_cpanel_init (&display->cpanel, gg); if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) display_window_init (GGOBI_WINDOW_DISPLAY (display), WIDTH, HEIGHT, 3, gg); /*-- 3 = width = any small int --*/ /*-- Add the main menu bar --*/ vbox = GTK_WIDGET (display); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); display->menu_manager = display_menu_manager_create (display); if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->window) { GtkActionGroup *actions = gtk_action_group_new ("BarchartActions"); gtk_action_group_add_toggle_actions (actions, toggle_entries, n_toggle_entries, display); gtk_ui_manager_insert_action_group (display->menu_manager, actions, 0); g_object_unref (G_OBJECT (actions)); display->menubar = create_menu_bar (display->menu_manager, menu_ui, GGOBI_WINDOW_DISPLAY (display)->window); gtk_container_add (GTK_CONTAINER (GGOBI_WINDOW_DISPLAY (display)->window), vbox); gtk_box_pack_start (GTK_BOX (vbox), display->menubar, false, true, 0); } /*-- Initialize a single splot --*/ if (sp == NULL) { sp = ggobi_barchart_splot_new (display, gg); } /* Reset sp->p1dvar based on the plotted variables in the current display, if appropriate -- it has already been initialized to zero in splot_init, a few levels down from ggobi_barchart_splot_new(), */ if (gg->current_display != NULL && gg->current_display != display && gg->current_display->d == d && GGOBI_IS_EXTENDED_DISPLAY (gg->current_display)) { gint nplotted_vars; gint *plotted_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); displayd *dsp = gg->current_display; nplotted_vars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dsp)->plotted_vars_get (dsp, plotted_vars, d, gg); if (nplotted_vars && plotted_vars[0] != 0) { sp->p1dvar = plotted_vars[0]; barchart_clean_init (GGOBI_BARCHART_SPLOT (sp)); barchart_recalc_counts (GGOBI_BARCHART_SPLOT (sp), d, gg); } } display->splots = NULL; display->splots = g_list_append (display->splots, (gpointer) sp); /*-- Initialize tours if possible --*/ display_tour1d_init_null (display, gg); if (d->ncols >= MIN_NVARS_FOR_TOUR1D) display_tour1d_init (display, gg); table = gtk_table_new (3, 2, false); /* rows, columns, homogeneous */ gtk_box_pack_start (GTK_BOX (vbox), table, true, true, 0); gtk_table_attach (GTK_TABLE (table), sp->da, 1, 2, 0, 1, (GtkAttachOptions) (GTK_SHRINK | GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_SHRINK | GTK_EXPAND | GTK_FILL), 0, 0); /* * The horizontal ruler goes on top. As the mouse moves across the * drawing area, a motion_notify_event is passed to the * appropriate event handler for the ruler. */ display->hrule = gtk_hruler_new (); /* gtk_table_attach (GTK_TABLE (table), display->hrule, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), (GtkAttachOptions) GTK_FILL, 0, 0); */ /* * The vertical ruler goes on the left. As the mouse moves across * the drawing area, a motion_notify_event is passed to the * appropriate event handler for the ruler. */ display->vrule = gtk_vruler_new (); /* gtk_table_attach (GTK_TABLE (table), display->vrule, 0, 1, 0, 1, (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0); display->p1d_orientation = VERTICAL; scatterplot_show_rulers (display, P1PLOT); */ if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) { gtk_widget_show_all (GGOBI_WINDOW_DISPLAY (display)->window); // ruler_ranges_set (true, display, sp, gg); } else gtk_widget_show_all (table); return display; } void barchart_clean_init (barchartSPlotd * sp) { displayd *display; GGobiData *d; gint i, j; display = (displayd *) GGOBI_SPLOT (sp)->displayptr; d = display->d; sp->bar->nbins = -1; sp->bar->new_nbins = -1; barchart_allocate_structure (sp, d); for (i = 0; i < sp->bar->nbins; i++) { sp->bar->bins[i].count = 0; sp->bar->bins[i].nhidden = 0; sp->bar->bar_hit[i] = FALSE; sp->bar->old_bar_hit[i] = FALSE; for (j = 0; j < sp->bar->ncolors; j++) { sp->bar->cbins[i][j].count = 0; sp->bar->cbins[i][j].rect.width = 1; } } for (i = 0; i < sp->bar->nbins + 2; i++) sp->bar->bar_hit[i] = sp->bar->old_bar_hit[i] = false; sp->bar->old_nbins = -1; /* */ barchart_set_initials (sp, d); sp->bar->offset = 0; GGOBI_SPLOT (sp)->pmid.y = 0; vectori_realloc (&sp->bar->index_to_rank, d->nrows_in_plot); barchart_init_categorical (sp, d); } static void barchart_recalc_group_counts (barchartSPlotd * sp, GGobiData * d, ggobid * gg) { gint i, j, m, bin; vartabled *vtx = vartable_element_get (GGOBI_SPLOT (sp)->p1dvar, d); g_assert (sp->bar->index_to_rank.nels == d->nrows_in_plot); for (i = 0; i < sp->bar->nbins; i++) for (j = 0; j < sp->bar->ncolors; j++) sp->bar->cbins[i][j].count = 0; /* initialize overflow bins */ if (sp->bar->high_pts_missing) { for (j = 0; j < sp->bar->ncolors; j++) sp->bar->col_high_bin[j].count = 0; } if (sp->bar->low_pts_missing) { for (j = 0; j < sp->bar->ncolors; j++) sp->bar->col_low_bin[j].count = 0; } /* count points in bins */ for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; /*-- skip missings? --*/ if (!d->missings_show_p && ggobi_data_is_missing(d, m, GGOBI_SPLOT (sp)->p1dvar)) continue; /*-- skip hiddens? here, yes. --*/ if (d->hidden_now.els[m]) { continue; } bin = GGOBI_SPLOT (sp)->planar[m].x; /* dfs */ if (vtx->vartype == categorical) bin = sp->bar->index_to_rank.els[i]; /* --- */ if ((bin >= 0) && (bin < sp->bar->nbins)) { sp->bar->cbins[bin][d->color_now.els[m]].count++; } if (bin == -1) { sp->bar->col_low_bin[d->color_now.els[m]].count++; } else if (bin == sp->bar->nbins) { sp->bar->col_high_bin[d->color_now.els[m]].count++; } } barchart_recalc_group_dimensions (sp, gg); } void barchart_recalc_group_dimensions (barchartSPlotd * sp, ggobid * gg) { gint colorwidth, i, j, xoffset; for (i = 0; i < sp->bar->nbins; i++) { xoffset = sp->bar->bins[i].rect.x; /* first all bins in the current color */ j = gg->color_id; colorwidth = 1; if (sp->bar->bins[i].count > 0) colorwidth = (gint) ((gfloat) sp->bar->cbins[i][j].count / sp->bar->bins[i].count * sp->bar->bins[i].rect.width); sp->bar->cbins[i][j].rect.x = xoffset; sp->bar->cbins[i][j].rect.y = sp->bar->bins[i].rect.y; sp->bar->cbins[i][j].rect.height = sp->bar->bins[i].rect.height; sp->bar->cbins[i][j].rect.width = colorwidth; if (colorwidth) { colorwidth++; rectangle_inset (&sp->bar->cbins[i][j]); } xoffset += colorwidth; /* then all other colors follow in the order of the color table */ for (j = 0; j < sp->bar->ncolors; j++) { if (j != gg->color_id) { colorwidth = 0; if (sp->bar->bins[i].count > 0) colorwidth = (gint) ((gfloat) sp->bar->cbins[i][j].count / sp->bar->bins[i].count * sp->bar->bins[i].rect.width); sp->bar->cbins[i][j].rect.x = xoffset; sp->bar->cbins[i][j].rect.y = sp->bar->bins[i].rect.y; sp->bar->cbins[i][j].rect.height = sp->bar->bins[i].rect.height; sp->bar->cbins[i][j].rect.width = colorwidth; if (colorwidth) { colorwidth++; rectangle_inset (&sp->bar->cbins[i][j]); } xoffset += colorwidth; } } } /* now eliminate rounding problems - last color in each bin gets adjusted */ for (i = 0; i < sp->bar->nbins; i++) { gboolean stop = FALSE; /*-- dfs: don't do this if nmissing > 0; leave the shadow in place --*/ if (sp->bar->bins[i].nhidden) continue; for (j = sp->bar->ncolors - 1; (j >= 0) && (!stop); j--) if (j != gg->color_id) if (sp->bar->cbins[i][j].count > 0) stop = TRUE; /* find last color used */ if (stop) { j++; sp->bar->cbins[i][j].rect.width = sp->bar->bins[i].rect.x + sp->bar->bins[i].rect.width - sp->bar->cbins[i][j].rect.x + 2; } } /* deal with overflow bins to the left and right now: */ if (sp->bar->high_pts_missing) { j = gg->color_id; xoffset = sp->bar->high_bin->rect.x; colorwidth = (gint) ((gfloat) sp->bar->col_high_bin[j].count / sp->bar->high_bin->count * sp->bar->high_bin->rect.width); sp->bar->col_high_bin[j].rect.x = xoffset; sp->bar->col_high_bin[j].rect.y = sp->bar->high_bin->rect.y; sp->bar->col_high_bin[j].rect.height = sp->bar->high_bin->rect.height; sp->bar->col_high_bin[j].rect.width = colorwidth; if (colorwidth) { colorwidth++; rectangle_inset (&sp->bar->col_high_bin[j]); } xoffset += colorwidth; for (j = 0; j < sp->bar->ncolors; j++) { if (j != gg->color_id) { colorwidth = (gint) ((gfloat) sp->bar->col_high_bin[j].count / sp->bar->high_bin->count * sp->bar->high_bin->rect.width); sp->bar->col_high_bin[j].rect.x = xoffset; sp->bar->col_high_bin[j].rect.y = sp->bar->high_bin->rect.y; sp->bar->col_high_bin[j].rect.height = sp->bar->high_bin->rect.height; sp->bar->col_high_bin[j].rect.width = colorwidth; if (colorwidth) { colorwidth++; rectangle_inset (&sp->bar->col_high_bin[j]); } xoffset += colorwidth; } } } if (sp->bar->low_pts_missing) { j = gg->color_id; xoffset = sp->bar->low_bin->rect.x; colorwidth = (gint) ((gfloat) sp->bar->col_low_bin[j].count / sp->bar->low_bin->count * sp->bar->low_bin->rect.width); sp->bar->col_low_bin[j].rect.x = xoffset; sp->bar->col_low_bin[j].rect.y = sp->bar->low_bin->rect.y; sp->bar->col_low_bin[j].rect.height = sp->bar->low_bin->rect.height; sp->bar->col_low_bin[j].rect.width = colorwidth; if (colorwidth) { colorwidth++; rectangle_inset (&sp->bar->col_low_bin[j]); } xoffset += colorwidth; for (j = 0; j < sp->bar->ncolors; j++) { if (j != gg->color_id) { colorwidth = (gint) ((gfloat) sp->bar->col_low_bin[j].count / sp->bar->low_bin->count * sp->bar->low_bin->rect.width); sp->bar->col_low_bin[j].rect.x = xoffset; sp->bar->col_low_bin[j].rect.y = sp->bar->low_bin->rect.y; sp->bar->col_low_bin[j].rect.height = sp->bar->low_bin->rect.height; sp->bar->col_low_bin[j].rect.width = colorwidth; if (colorwidth) { colorwidth++; rectangle_inset (&sp->bar->col_low_bin[j]); } xoffset += colorwidth; } } } } void rectangle_inset (gbind * bin) { /* works around the gdk convention, that the areas of filled and framed rectangles differ by one pixel in each dimension */ bin->rect.height += 1; if (bin->rect.height < 1) bin->rect.height = 1; /* set minimal height */ bin->rect.x += 1; bin->rect.width += 1; if (bin->rect.width < 1) bin->rect.width = 1; /* set minimal width */ } void barchart_init_vectors (barchartSPlotd * sp) { /* shouldn't be necessary ...*/ if (sp->bar != NULL) { sp->bar->bins = NULL; sp->bar->cbins = NULL; sp->bar->breaks = NULL; sp->bar->high_bin = NULL; sp->bar->low_bin = NULL; sp->bar->col_high_bin = NULL; sp->bar->col_low_bin = NULL; sp->bar->bar_hit = NULL; sp->bar->old_bar_hit = NULL; } } void barchart_free_structure (barchartSPlotd * sp) { gint i; /* free all previously allocated pointers */ if (sp->bar->bins) g_free ((gpointer) (sp->bar->bins)); if (sp->bar->cbins) { gint nbins = sp->bar->nbins; for (i = 0; i < nbins; i++) if (sp->bar->cbins[i]) g_free ((gpointer) (sp->bar->cbins[i])); g_free ((gpointer) (sp->bar->cbins)); } if (sp->bar->breaks) g_free ((gpointer) sp->bar->breaks); if (sp->bar->high_bin) g_free ((gpointer) sp->bar->high_bin); if (sp->bar->low_bin) g_free ((gpointer) sp->bar->low_bin); if (sp->bar->col_high_bin) g_free ((gpointer) sp->bar->col_high_bin); if (sp->bar->col_low_bin) g_free ((gpointer) sp->bar->col_low_bin); if (sp->bar->bar_hit) g_free ((gpointer) sp->bar->bar_hit); if (sp->bar->old_bar_hit) g_free ((gpointer) sp->bar->old_bar_hit); barchart_init_vectors (sp); } void barchart_allocate_structure (barchartSPlotd * sp, GGobiData * d) { vartabled *vtx; gint i, nbins; splotd *rawsp = GGOBI_SPLOT (sp); ggobid *gg = GGobiFromSPlot (rawsp); colorschemed *scheme = gg->activeColorScheme; vtx = vartable_element_get (rawsp->p1dvar, d); if (sp->bar->new_nbins < 0) { if (vtx->vartype == categorical) { nbins = (ggobi_data_get_col_n_missing(d, rawsp->p1dvar)) ? vtx->nlevels + 1 : vtx->nlevels; sp->bar->is_histogram = FALSE; } else { nbins = 10; /* replace by a more sophisticated rule */ sp->bar->is_histogram = TRUE; } } else nbins = sp->bar->new_nbins; sp->bar->new_nbins = -1; if (vtx->lim_specified_p) { rawsp->p1d.lim.min = vtx->lim_specified.min; rawsp->p1d.lim.max = vtx->lim_specified.max; } else { rawsp->p1d.lim.min = vtx->lim.min; rawsp->p1d.lim.max = vtx->lim.max; /* dfs */ if (vtx->vartype == categorical) { rawsp->p1d.lim.min = MIN (rawsp->p1d.lim.min, vtx->level_values[0]); rawsp->p1d.lim.max = MAX (rawsp->p1d.lim.max, vtx->level_values[vtx->nlevels - 1]); } /* --- */ } if (sp->bar->nbins && nbins == sp->bar->nbins) return; /* nothing else to be done */ /* free all previously allocated pointers */ barchart_free_structure (sp); sp->bar->nbins = nbins; /* allocate space */ sp->bar->bins = (gbind *) g_malloc (nbins * sizeof (gbind)); sp->bar->cbins = (gbind **) g_malloc (nbins * sizeof (gbind *)); sp->bar->ncolors = scheme->n; sp->bar->bar_hit = (gboolean *) g_malloc ((nbins + 2) * sizeof (gboolean)); sp->bar->old_bar_hit = (gboolean *) g_malloc ((nbins + 2) * sizeof (gboolean)); for (i = 0; i < sp->bar->nbins; i++) { sp->bar->cbins[i] = (gbind *) g_malloc (sp->bar->ncolors * sizeof (gbind)); } sp->bar->breaks = (gfloat *) g_malloc ((nbins + 1) * sizeof (nbins)); } void barchart_init_categorical (barchartSPlotd * sp, GGobiData * d) { splotd *rawsp = GGOBI_SPLOT (sp); displayd *display = (displayd *) rawsp->displayptr; gint proj = display->cpanel.pmode; gint i, j, m, jvar = rawsp->p1dvar; ggobid *gg = GGobiFromSPlot (rawsp); vartabled *vtx = vartable_element_get (rawsp->p1dvar, d); gfloat mindist, maxheight; gfloat min, max; gfloat *yy; yy = (gfloat *) g_malloc (d->nrows_in_plot * sizeof (gfloat)); if (proj == TOUR1D) { for (m=0; m < d->nrows_in_plot; m++) { i = d->rows_in_plot.els[m]; yy[m] = rawsp->planar[i].x = 0; rawsp->planar[i].y = 0; for (j=0; jncols; j++) { yy[m] += (gfloat)(display->t1d.F.vals[0][j]*d->world.vals[i][j]); } } } else { for (i = 0; i < d->nrows_in_plot; i++) yy[i] = d->tform.vals[d->rows_in_plot.els[i]][jvar]; } mindist = barchart_sort_index (yy, d->nrows_in_plot, gg, sp); g_free ((gpointer) yy); min = vtx->lim_tform.min; max = vtx->lim_tform.max; /* dfs */ if (vtx->vartype == categorical) { min = MIN (min, vtx->level_values[0]); max = MAX (max, vtx->level_values[vtx->nlevels - 1]); } /* --- */ maxheight = max - min; rawsp->scale.y = (1 - (1.0 - SCALE_DEFAULT) / 2) * maxheight / (maxheight + mindist); } gboolean barchart_redraw (splotd * rawsp, GGobiData * d, ggobid * gg, gboolean binned) { gint i, j, radius; colorschemed *scheme = gg->activeColorScheme; barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (rawsp); gbind *bin; barchart_recalc_counts (sp, d, gg); barchart_recalc_group_counts (sp, d, gg); /* dfs: if there are hiddens, draw the entire rectangle in the shadow color */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); for (i = 0; i < sp->bar->nbins; i++) { bin = &sp->bar->bins[i]; if (bin->nhidden) { gdk_draw_rectangle (rawsp->pixmap0, gg->plot_GC, TRUE, bin->rect.x, bin->rect.y, bin->rect.width, bin->rect.height + 1); } } /* */ for (j = 0; j < sp->bar->ncolors; j++) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[j]); for (i = 0; i < sp->bar->nbins; i++) { bin = &sp->bar->cbins[i][j]; if (bin->count > 0) { gdk_draw_rectangle (rawsp->pixmap0, gg->plot_GC, TRUE, bin->rect.x, bin->rect.y, bin->rect.width, bin->rect.height); } } } /* draw overflow bins if necessary */ if (sp->bar->high_pts_missing) { /* start with the hiddens */ if (sp->bar->high_bin->nhidden) { bin = sp->bar->high_bin; gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); gdk_draw_rectangle (rawsp->pixmap0, gg->plot_GC, TRUE, bin->rect.x, bin->rect.y, bin->rect.width, bin->rect.height + 1); } for (j = 0; j < sp->bar->ncolors; j++) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[j]); bin = &sp->bar->col_high_bin[j]; if (bin->count > 0) gdk_draw_rectangle (rawsp->pixmap0, gg->plot_GC, TRUE, bin->rect.x, bin->rect.y, bin->rect.width, bin->rect.height); } } if (sp->bar->low_pts_missing) { /* start with the hiddens */ if (sp->bar->low_bin->nhidden) { bin = sp->bar->low_bin; gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_hidden); gdk_draw_rectangle (rawsp->pixmap0, gg->plot_GC, TRUE, bin->rect.x, bin->rect.y, bin->rect.width, bin->rect.height + 1); } for (j = 0; j < sp->bar->ncolors; j++) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb[j]); bin = &sp->bar->col_low_bin[j]; if (bin->count > 0) gdk_draw_rectangle (rawsp->pixmap0, gg->plot_GC, TRUE, bin->rect.x, bin->rect.y, bin->rect.width, bin->rect.height); } } /* mark empty bins with a small circle */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); for (i = 0; i < sp->bar->nbins; i++) { bin = &sp->bar->bins[i]; if (bin->count == 0) { radius = bin->rect.height / 4; gdk_draw_line (rawsp->pixmap0, gg->plot_GC, bin->rect.x, bin->rect.y, bin->rect.x, bin->rect.y + bin->rect.height); gdk_draw_arc (rawsp->pixmap0, gg->plot_GC, FALSE, bin->rect.x - radius / 2, bin->rect.y + bin->rect.height / 2 - radius / 2, radius, radius, 0, 64 * 360); } } return (false); } void barchart_splot_add_plot_labels (splotd * sp, GdkDrawable * drawable, ggobid * gg) { displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (sp->da), NULL); PangoRectangle rect; vartabled *vtx; vtx = vartable_element_get (sp->p1dvar, d); layout_text (layout, ggobi_data_get_col_name(d, sp->p1dvar), &rect); gdk_draw_layout (drawable, gg->plot_GC, sp->max.x - rect.width - 5, sp->max.y - rect.height - 5, layout); if (vtx->vartype == categorical) { gint i; gchar *catname; barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); gint level; layout_text (layout, "yA", &rect); /* is there enough space for labels? If not - return */ if (!bsp->bar->is_spine) { if (bsp->bar->bins[1].rect.height < rect.height) return; } for (i = 0; i < bsp->bar->nbins; i++) { level = checkLevelValue (vtx, (gdouble) bsp->bar->bins[i].value); catname = g_strdup_printf ("%s", (level == -1) ? "missing" : vtx->level_names[level]); layout_text (layout, catname, NULL); gdk_draw_layout (drawable, gg->plot_GC, bsp->bar->bins[i].rect.x + 2, bsp->bar->bins[i].rect.y + bsp->bar->bins[i].rect.height / 2 + 2, layout); g_free (catname); } } g_object_unref (G_OBJECT (layout)); } void barchart_set_breakpoints (gfloat width, barchartSPlotd * sp, GGobiData * d) { gfloat rdiff; gint i, nbins; splotd *rawsp = GGOBI_SPLOT (sp); rdiff = rawsp->p1d.lim.max - rawsp->p1d.lim.min; nbins = (gint) (rdiff / width + 1); sp->bar->new_nbins = nbins; barchart_allocate_structure (sp, d); for (i = 0; i <= sp->bar->nbins; i++) { sp->bar->breaks[i] = rawsp->p1d.lim.min + width * i; sp->bar->old_bar_hit[i] = FALSE; sp->bar->bar_hit[i] = FALSE; } } void barchart_set_initials (barchartSPlotd * sp, GGobiData * d) { splotd *rawsp = GGOBI_SPLOT (sp); vartabled *vtx = vartable_element_get (rawsp->p1dvar, d); gboolean foundp = false; if (vtx->vartype == categorical) { if (vtx->nlevels > 1) { gint i, level; gfloat missing_val; gboolean add_level = false; if (ggobi_data_get_col_n_missing(d, rawsp->p1dvar)) { for (i = 0; i < d->nrows_in_plot; i++) { if (ggobi_data_is_missing(d, d->rows_in_plot.els[i], rawsp->p1dvar)) { missing_val = d->tform.vals[i][rawsp->p1dvar]; foundp = true; break; } } /* If the currently "imputed" value for missings is not one of the levels we already have, then we need an extra bin for the missings. */ if (foundp && checkLevelValue (vtx, missing_val) == -1) { add_level = true; level = 0; for (i = 0; i < sp->bar->nbins; i++) { if (add_level && (gint) missing_val < vtx->level_values[level]) { sp->bar->bins[i].value = (gint) missing_val; add_level = false; } else { sp->bar->bins[i].value = vtx->level_values[level++]; } } if (add_level && (gint) missing_val > vtx->level_values[vtx->nlevels - 1]) sp->bar->bins[sp->bar->nbins - 1].value = missing_val; } else { for (i = 0; i < vtx->nlevels; i++) sp->bar->bins[i].value = vtx->level_values[i]; sp->bar->nbins -= 1; sp->bar->bins = (gbind *) g_realloc (sp->bar->bins, sp->bar->nbins * sizeof (gbind)); sp->bar->bar_hit = (gboolean *) g_realloc (sp->bar->bar_hit, (sp->bar->nbins + 2) * sizeof (gboolean)); sp->bar->old_bar_hit = (gboolean *) g_realloc (sp->bar->old_bar_hit, (sp->bar->nbins + 2) * sizeof (gboolean)); g_free ((gpointer) (sp->bar->cbins[sp->bar->nbins])); sp->bar->cbins = (gbind **) g_realloc (sp->bar->cbins, sp->bar->nbins * sizeof (gbind *)); } } else { for (i = 0; i < vtx->nlevels; i++) sp->bar->bins[i].value = vtx->level_values[i]; } } /* --- */ } else { gint i; gfloat rdiff = rawsp->p1d.lim.max - rawsp->p1d.lim.min; for (i = 0; i < sp->bar->nbins; i++) { sp->bar->breaks[i] = rawsp->p1d.lim.min + rdiff / sp->bar->nbins * i; } sp->bar->breaks[sp->bar->nbins] = rawsp->p1d.lim.max; } } void barchart_recalc_counts (barchartSPlotd * sp, GGobiData * d, ggobid * gg) { gfloat yy; gint i, bin, m; splotd *rawsp = GGOBI_SPLOT (sp); vartabled *vtx = vartable_element_get (rawsp->p1dvar, d); if (sp->bar->index_to_rank.nels != d->nrows_in_plot) { vectori_realloc (&sp->bar->index_to_rank, d->nrows_in_plot); barchart_init_categorical (sp, d); } if (vtx->vartype != categorical) rawsp->scale.y = 1 - (1 - SCALE_DEFAULT) / 2; for (i = 0; i < sp->bar->nbins; i++) { sp->bar->bins[i].count = 0; sp->bar->bins[i].nhidden = 0; } sp->bar->high_pts_missing = sp->bar->low_pts_missing = FALSE; if (vtx->vartype == categorical) { for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; /*-- skip missings? --*/ if (!d->missings_show_p && ggobi_data_is_missing(d, m, rawsp->p1dvar)) continue; bin = sp->bar->index_to_rank.els[i]; if ((bin >= 0) && (bin < sp->bar->nbins)) { sp->bar->bins[bin].count++; if (d->hidden_now.els[m]) sp->bar->bins[bin].nhidden++; } rawsp->planar[m].x = (greal) sp->bar->bins[bin].value; } } else { /* all vartypes but categorical */ gint index, m, rank = 0; index = sp->bar->index_to_rank.els[rank]; m = d->rows_in_plot.els[index]; yy = d->tform.vals[m][rawsp->p1dvar]; while ((yy < sp->bar->breaks[0] + sp->bar->offset) && (rank < d->nrows_in_plot - 1)) { rawsp->planar[m].x = -1; rank++; index = sp->bar->index_to_rank.els[rank]; m = d->rows_in_plot.els[index]; yy = d->tform.vals[m][rawsp->p1dvar]; } if (rank > 0) { gint k; sp->bar->low_pts_missing = TRUE; if (sp->bar->low_bin == NULL) sp->bar->low_bin = (gbind *) g_malloc (sizeof (gbind)); if (sp->bar->col_low_bin == NULL) sp->bar->col_low_bin = (gbind *) g_malloc (sp->bar->ncolors * sizeof (gbind)); sp->bar->low_bin->count = rank; /*-- count the hiddens among the elements in low_bin --*/ sp->bar->low_bin->nhidden = 0; for (k = 0; k < rank; k++) { index = sp->bar->index_to_rank.els[k]; m = d->rows_in_plot.els[index]; if (d->hidden_now.els[m]) sp->bar->low_bin->nhidden++; } } bin = 0; while (rank < d->nrows_in_plot) { index = sp->bar->index_to_rank.els[rank]; m = d->rows_in_plot.els[index]; yy = d->tform.vals[m][rawsp->p1dvar]; while ((bin < sp->bar->nbins) && (sp->bar->breaks[bin + 1] + sp->bar->offset < yy)) { bin++; } if (bin > sp->bar->nbins - 1) { /* check whether the value is the maximum, if so, add it to the last bin - slight inconsistency with histograms */ if (yy == sp->bar->breaks[sp->bar->nbins] + sp->bar->offset) { bin--; sp->bar->bins[bin].count++; if (d->hidden_now.els[m]) sp->bar->bins[bin].nhidden++; } else { if (sp->bar->high_pts_missing == FALSE) { sp->bar->high_pts_missing = TRUE; if (sp->bar->high_bin == NULL) sp->bar->high_bin = (gbind *) g_malloc (sizeof (gbind)); if (sp->bar->col_high_bin == NULL) { sp->bar->col_high_bin = (gbind *) g_malloc (sp->bar->ncolors * sizeof (gbind)); } sp->bar->high_bin->count = 0; sp->bar->high_bin->nhidden = 0; } sp->bar->high_bin->count++; if (d->hidden_now.els[m]) sp->bar->high_bin->nhidden++; } } else { sp->bar->bins[bin].count++; if (d->hidden_now.els[m]) sp->bar->bins[bin].nhidden++; } rawsp->planar[m].x = bin; rank++; } } if (sp->bar->low_pts_missing == FALSE) { if (sp->bar->low_bin != NULL) g_free ((gpointer) (sp->bar->low_bin)); if (sp->bar->col_low_bin != NULL) g_free ((gpointer) (sp->bar->col_low_bin)); sp->bar->low_bin = NULL; sp->bar->col_low_bin = NULL; } if (sp->bar->high_pts_missing == FALSE) { if (sp->bar->high_bin != NULL) g_free ((gpointer) (sp->bar->high_bin)); if (sp->bar->col_high_bin != NULL) g_free ((gpointer) (sp->bar->col_high_bin)); sp->bar->high_bin = NULL; sp->bar->col_high_bin = NULL; } barchart_recalc_dimensions (GGOBI_SPLOT (sp), d, gg); } void barchart_recalc_dimensions (splotd * rawsp, GGobiData * d, ggobid * gg) { gint i, maxbincount = 0, maxbin = -1; gfloat precis = PRECISION1; vartabled *vtx; gfloat scale_y; gint index; gint minwidth; gfloat rdiff, ftmp; gbind *bin; GdkRectangle *rect; barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (rawsp); scale_y = rawsp->scale.y; /* * Calculate is, a scale factor. Scale so as to use the entire * plot window (well, as much of the plot window as scale.x and * scale.y permit.) */ vtx = vartable_element_get (rawsp->p1dvar, d); rdiff = rawsp->p1d.lim.max - rawsp->p1d.lim.min; index = 0; for (i = 0; i < sp->bar->nbins; i++) { bin = &sp->bar->bins[i]; if (bin->count > maxbincount) { maxbincount = bin->count; maxbin = i; } sp->bar->bins[i].planar.x = -1; if (vtx->vartype == categorical) { ftmp = -1.0 + 2.0 * ((greal) bin->value - rawsp->p1d.lim.min) / rdiff; bin->planar.y = (greal) (PRECISION1 * ftmp); } else { ftmp = -1.0 + 2.0 * (sp->bar->breaks[i] - sp->bar->breaks[0]) / rdiff; bin->planar.y = (glong) (precis * ftmp); } } sp->bar->maxbincounts = maxbincount; if (!sp->bar->is_spine) { greal precis = (greal) PRECISION1; greal gtmp; gbind *binminus; scale_y /= 2; rawsp->iscale.y = (greal) (-1 * (gfloat) rawsp->max.y * scale_y); minwidth = rawsp->max.y; for (i = 0; i < sp->bar->nbins; i++) { bin = &sp->bar->bins[i]; rect = &sp->bar->bins[i].rect; gtmp = bin->planar.y - rawsp->pmid.y; rect->y = (gint) (gtmp * rawsp->iscale.y / precis); rect->x = 10; rect->y += (rawsp->max.y / 2); if (i == 0) minwidth = 2 * (rawsp->max.y - rect->y); if (i > 0) { binminus = &sp->bar->bins[i - 1]; minwidth = MIN (minwidth, binminus->rect.y - rect->y - 2); binminus->rect.height = binminus->rect.y - rect->y - 2; } rect->width = MAX (1, (gint) ((gfloat) (rawsp->max.x - 2 * rect->x) * bin->count / sp->bar->maxbincounts)); } sp->bar->bins[sp->bar->nbins - 1].rect.height = sp->bar->bins[sp->bar->nbins - 2].rect.y - sp->bar->bins[sp->bar->nbins - 1].rect.y - 1; /* set overflow bins to the left and right */ if (sp->bar->low_pts_missing) { gbind *lbin = sp->bar->low_bin; lbin->rect.height = minwidth; lbin->rect.x = 10; lbin->rect.width = MAX (1, (gint) ((gfloat) (rawsp->max.x - 2 * lbin->rect.x) * lbin->count / sp->bar->maxbincounts)); lbin->rect.y = sp->bar->bins[0].rect.y + 2; } if (sp->bar->high_pts_missing) { gbind *hbin = sp->bar->high_bin; hbin->rect.height = sp->bar->bins[0].rect.height; hbin->rect.x = 10; hbin->rect.width = MAX (1, (gint) ((gfloat) (rawsp->max.x - 2 * hbin->rect.x) * hbin->count / sp->bar->maxbincounts)); i = sp->bar->nbins - 1; hbin->rect.y = sp->bar->bins[i].rect.y - 2 * sp->bar->bins[i].rect.height - 1; } minwidth = MAX ((gint) (0.9 * minwidth), 0); for (i = 0; i < sp->bar->nbins; i++) { if (vtx->vartype != categorical) sp->bar->bins[i].rect.y -= sp->bar->bins[i].rect.height; else { sp->bar->bins[i].rect.height = minwidth; sp->bar->bins[i].rect.y -= minwidth / 2; } } } else { /* spine plot representation */ GdkRectangle *rect; gint bindist = 2; /* distance between two bins */ gint maxheight; gint yoffset; gint n = d->nrows_in_plot; scale_y = 1 - (1 - SCALE_DEFAULT) / 2; maxheight = (rawsp->max.y - (sp->bar->nbins - 1) * bindist) * scale_y; yoffset = (gint) (rawsp->max.y * .5 * (1 + scale_y)); for (i = 0; i < sp->bar->nbins; i++) { rect = &sp->bar->bins[i].rect; rect->x = 10; rect->width = rawsp->max.x - 2 * rect->x; rect->height = (gint) ((gfloat) sp->bar->bins[i].count / n * maxheight); rect->y = yoffset; yoffset -= (rect->height + bindist); } minwidth = (gint) (0.9 * minwidth); for (i = 0; i < sp->bar->nbins; i++) { sp->bar->bins[i].rect.y -= sp->bar->bins[i].rect.height; } /* draw overflow bins */ if (sp->bar->high_pts_missing) { sp->bar->high_bin->rect.width = rawsp->max.x - 2 * 10; //10=rect->x; sp->bar->high_bin->rect.x = 10; sp->bar->high_bin->rect.height = (gint) ((gfloat) sp->bar->high_bin->count / n * maxheight); i = sp->bar->nbins - 1; sp->bar->high_bin->rect.y = (gint) (rawsp->max.y * .5 * (1 - scale_y)) - sp->bar->high_bin->rect.height - 2; } if (sp->bar->low_pts_missing) { sp->bar->low_bin->rect.x = 10; sp->bar->low_bin->rect.width = rawsp->max.x - 2 * 10; //10=rect->x; sp->bar->low_bin->rect.height = (gint) ((gfloat) sp->bar->low_bin->count / n * maxheight); sp->bar->low_bin->rect.y = (gint) (rawsp->max.y * .5 * (1 + scale_y)) + 2; } } } gboolean barchart_active_paint_points (splotd * rawsp, GGobiData * d, ggobid * gg) { barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (rawsp); brush_coords *brush_pos = &rawsp->brush_pos; gint i, m, indx; GdkRectangle brush_rect; GdkRectangle dummy; gint x1 = MIN (brush_pos->x1, brush_pos->x2); gint x2 = MAX (brush_pos->x1, brush_pos->x2); gint y1 = MIN (brush_pos->y1, brush_pos->y2); gint y2 = MAX (brush_pos->y1, brush_pos->y2); gboolean *hits; vartabled *vtx = vartable_element_get (rawsp->p1dvar, d); cpaneld *cpanel = &gg->current_display->cpanel; hits = (gboolean *) g_malloc ((sp->bar->nbins + 2) * sizeof (gboolean)); brush_rect.x = x1; brush_rect.y = y1; brush_rect.width = x2 - x1; brush_rect.height = y2 - y1; for (i = 0; i < sp->bar->nbins; i++) { hits[i + 1] = rect_intersect (&sp->bar->bins[i].rect, &brush_rect, &dummy); } if (sp->bar->high_pts_missing) hits[sp->bar->nbins + 1] = rect_intersect (&sp->bar->high_bin->rect, &brush_rect, &dummy); else hits[sp->bar->nbins + 1] = FALSE; if (sp->bar->low_pts_missing) hits[0] = rect_intersect (&sp->bar->low_bin->rect, &brush_rect, &dummy); else hits[0] = FALSE; d->npts_under_brush = 0; for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; /*-- skip missings? --*/ if (!d->missings_show_p && ggobi_data_is_missing(d, m, rawsp->p1dvar)) continue; if (d->hidden_now.els[m] && (cpanel->br.point_targets != br_shadow && cpanel->br.point_targets != br_unshadow)) { continue; } /*-- dfs -- this seems to assume that the values of planar begin at 0, which may not be true ... this change makes it work for categorical, but breaks it otherwise --*/ if (vtx->vartype == categorical) { indx = (gint) (rawsp->planar[m].x - rawsp->p1d.lim.min + 1); } else { indx = (gint) (rawsp->planar[m].x + 1); } d->pts_under_brush.els[m] = hits[indx]; if (hits[indx]) d->npts_under_brush++; #ifdef PREV d->pts_under_brush.els[m] = hits[(gint) rawsp->planar[m].x + 1]; if (hits[(gint) rawsp->planar[m].x + 1]) d->npts_under_brush++; #endif } g_free ((gpointer) hits); return d->npts_under_brush; } static ggobid *CurrentGGobi = NULL; gint barpsort (const void *arg1, const void *arg2) { ggobid *gg = CurrentGGobi; gint val = 0; gint *x1 = (gint *) arg1; gint *x2 = (gint *) arg2; if (gg->p1d.gy[*x1] == gg->p1d.gy[*x2]) return 0; /* to speed things up for categorical variables */ if (gg->p1d.gy[*x1] < gg->p1d.gy[*x2]) val = -1; else if (gg->p1d.gy[*x1] > gg->p1d.gy[*x2]) val = 1; return (val); } gfloat barchart_sort_index (gfloat * yy, gint ny, ggobid * gg, barchartSPlotd * sp) { gint i, *indx; gint rank; gfloat mindist = 0.0; indx = (gint *) g_malloc (ny * sizeof (gint)); /* * gy is needed solely for the psort routine: psort is used by * qsort to put an index vector in the order that yy will assume. */ gg->p1d.gy = (gfloat *) g_malloc (ny * sizeof (gfloat)); for (i = 0; i < ny; i++) { indx[i] = i; gg->p1d.gy[i] = yy[i]; } CurrentGGobi = gg; qsort ((void *) indx, (gsize) ny, sizeof (gint), barpsort); CurrentGGobi = NULL; /* * Bug here: this is screwy if ny < 4. */ if (sp->bar->is_histogram) { /* vartype != categorical */ mindist = 0; for (i = 0; i < ny; i++) { sp->bar->index_to_rank.els[i] = indx[i]; } } else { /* vartype = categorical */ /* dfs */ /* XXX Later, when labelling, if a value doesn't match one of the level_values, label it 'missing' */ /* assumption: there exist at least two bins */ mindist = sp->bar->bins[1].value - sp->bar->bins[0].value; for (i = 1; i < sp->bar->nbins; i++) mindist = MIN (mindist, sp->bar->bins[i].value - sp->bar->bins[i - 1].value); rank = 0; /*-- there are bin values that don't exist in the data --*/ while (yy[indx[0]] > sp->bar->bins[rank].value) rank++; for (i = 0; i < sp->bar->nbins; i++) sp->bar->bins[i].index = -1; for (i = 0; i < ny; i++) { if (i > 0) { if (yy[indx[i]] != yy[indx[i - 1]]) { rank++; while (yy[indx[i]] > sp->bar->bins[rank].value) { rank++; } sp->bar->bins[rank].index = indx[i]; /* do I care? */ } } /* This takes me from index to bin -- dfs */ sp->bar->index_to_rank.els[indx[i]] = rank; } /* --- */ #ifdef PREV rank = 0; for (i = 0; i < sp->bar->nbins; i++) sp->bar->bins[i].index = -1; mindist = yy[indx[ny - 1]] - yy[indx[0]]; sp->bar->bins[rank].index = indx[0]; for (i = 0; i < ny; i++) { if (i > 0) { if (yy[indx[i]] != yy[indx[i - 1]]) { rank++; mindist = MIN (yy[indx[i]] - yy[indx[i - 1]], mindist); sp->bar->bins[rank].index = indx[i]; } } sp->bar->index_to_rank.els[indx[i]] = rank; } #endif } g_free ((gpointer) (gg->p1d.gy)); g_free ((gpointer) (indx)); return mindist; } void barchart_default_visual_cues_draw (splotd * rawsp, GdkDrawable * drawable, ggobid * gg) { vartabled *vtx; displayd *display = gg->current_display; GGobiData *d = display->d; barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (rawsp); vtx = vartable_element_get (GGOBI_SPLOT (sp)->p1dvar, d); GdkPoint btn[4]; /* Experiment: ontinue to draw small triangular buttons, but allow the regions to grow into long rectangles running along the bars. dfs */ if (vtx->vartype != categorical) { /* calculate & draw anchor_rgn */ gint y = sp->bar->bins[0].rect.y + sp->bar->bins[0].rect.height; gint x = sp->bar->bins[0].rect.x; gint halfwidth = sp->bar->bins[0].rect.height / 2 - 2; if (halfwidth <= 0) halfwidth = 1; sp->bar->anchor_rgn[0].x = sp->bar->anchor_rgn[1].x = x - 5; sp->bar->anchor_rgn[2].x = x + GGOBI_SPLOT (sp)->max.x; // extend sp->bar->anchor_rgn[0].y = y + halfwidth; sp->bar->anchor_rgn[1].y = y - halfwidth; //sp->bar->anchor_rgn[2].y = y; // Rectangle instead of triangle sp->bar->anchor_rgn[3].x = sp->bar->anchor_rgn[2].x; sp->bar->anchor_rgn[2].y = sp->bar->anchor_rgn[1].y; sp->bar->anchor_rgn[3].y = sp->bar->anchor_rgn[0].y; btn[0].x = btn[1].x = x - 5; btn[2].x = x; btn[0].y = y + halfwidth; btn[1].y = y - halfwidth; btn[2].y = y; button_draw_with_shadows (btn, drawable, gg); //button_draw_with_shadows(sp->bar->anchor_rgn, drawable, gg); /* calculate & draw offset_rgn */ y = sp->bar->bins[0].rect.y; sp->bar->offset_rgn[0].x = sp->bar->offset_rgn[1].x = x - 5; sp->bar->offset_rgn[2].x = x + GGOBI_SPLOT (sp)->max.x; // extend sp->bar->offset_rgn[0].y = y + halfwidth; sp->bar->offset_rgn[1].y = y - halfwidth; //sp->bar->offset_rgn[2].y = y; // Rectangle instead of triangle -- dfs sp->bar->offset_rgn[3].x = sp->bar->offset_rgn[2].x; sp->bar->offset_rgn[2].y = sp->bar->offset_rgn[1].y; sp->bar->offset_rgn[3].y = sp->bar->offset_rgn[0].y; btn[0].x = btn[1].x = x - 5; btn[2].x = x; btn[0].y = y + halfwidth; btn[1].y = y - halfwidth; btn[2].y = y; button_draw_with_shadows (btn, drawable, gg); //button_draw_with_shadows(sp->bar->offset_rgn, drawable, gg); } } void button_draw_with_shadows (GdkPoint * region, GdkDrawable * drawable, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; /*gdk_gc_set_foreground(gg->plot_GC, &gg->wvis.gray3); */ gdk_gc_set_foreground (gg->plot_GC, &gg->lightgray); gdk_draw_polygon (drawable, gg->plot_GC, TRUE, region, 3); /* dark shadows */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_bg); gdk_draw_polygon (drawable, gg->plot_GC, FALSE, region, 3); gdk_draw_line (drawable, gg->plot_GC, region[0].x, region[2].y, region[2].x, region[2].y); /* light shadows */ gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_draw_line (drawable, gg->plot_GC, region[0].x, region[0].y, region[1].x, region[1].y); gdk_draw_line (drawable, gg->plot_GC, region[1].x, region[1].y, region[2].x, region[2].y); gdk_draw_line (drawable, gg->plot_GC, region[0].x, region[2].y + 1, region[2].x, region[2].y + 1); } gboolean rect_intersect (GdkRectangle * rect1, GdkRectangle * rect2, GdkRectangle * dest) { gint right, bottom; icoords pt; // horizontal intersection pt.x = dest->x = MAX (rect1->x, rect2->x); right = MIN (rect1->x + rect1->width, rect2->x + rect2->width); dest->width = MAX (0, right - dest->x); // vertical intersection pt.y = dest->y = MAX (rect1->y, rect2->y); bottom = MIN (rect1->y + rect1->height, rect2->y + rect2->height); dest->height = MAX (0, bottom - dest->y); return (pt_in_rect (pt, *rect1) && pt_in_rect (pt, *rect2)); } gboolean pt_in_rect (icoords pt, GdkRectangle rect) { return ((pt.x >= rect.x) && (pt.x <= rect.x + rect.width) && (pt.y >= rect.y) && (pt.y <= rect.y + rect.height)); } /* Cues that are drawn in the default mode, indicating that the * binwidth and anchor point can be changed. */ void barchart_add_bar_cues (splotd * rawsp, GdkDrawable * drawable, ggobid * gg) { displayd *display = rawsp->displayptr; cpaneld *cpanel = &display->cpanel; if (cpanel->imode != DEFAULT_IMODE) return; barchart_default_visual_cues_draw (rawsp, drawable, gg); } gboolean barchart_identify_bars (icoords mousepos, splotd * rawsp, GGobiData * d, ggobid * gg) { /* returns 0 if nothing has changed from the last time */ /* 1 if different bars are hit */ gint i, nbins; gboolean stop; barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (rawsp); nbins = sp->bar->nbins; /* check, which bars are hit */ if (sp->bar->low_pts_missing) sp->bar->bar_hit[0] = pt_in_rect (mousepos, sp->bar->high_bin->rect); else sp->bar->bar_hit[0] = FALSE; for (i = 0; i < sp->bar->nbins; i++) { sp->bar->bar_hit[i + 1] = pt_in_rect (mousepos, sp->bar->bins[i].rect); } if (sp->bar->high_pts_missing) sp->bar->bar_hit[nbins + 1] = pt_in_rect (mousepos, sp->bar->high_bin->rect); else sp->bar->bar_hit[nbins + 1] = FALSE; /* are those bars the same as last time? */ stop = FALSE; if (sp->bar->old_nbins == sp->bar->nbins) { for (i = 0; (i < nbins + 2) && !stop; i++) stop = (sp->bar->bar_hit[i] != sp->bar->old_bar_hit[i]); } else { sp->bar->old_nbins = sp->bar->nbins; } sp->bar->same_hits = !stop; if (!stop) return FALSE; /* nothing else needs to be changed */ /* set old bar hits to match the new results */ for (i = 0; i < nbins + 2; i++) sp->bar->old_bar_hit[i] = sp->bar->bar_hit[i]; return TRUE; } splotd * ggobi_barchart_splot_new (displayd * dpy, ggobid * gg) { barchartSPlotd *bsp; splotd *sp; bsp = g_object_new (GGOBI_TYPE_BARCHART_SPLOT, NULL); sp = GGOBI_SPLOT (bsp); splot_init (sp, dpy, gg); barchart_clean_init (bsp); barchart_recalc_counts (bsp, dpy->d, gg); return (sp); } /** Called when we create the barchart. */ void barchart_cpanel_init (cpaneld * cpanel, ggobid * gg) { cpanel->imode = DEFAULT_IMODE; cpanel->pmode = EXTENDED_DISPLAY_PMODE; cpanel->barchart_display_mode = 0; /*-- 1d plots --*/ cpanel_p1d_init (cpanel, gg); /*-- available modes --*/ cpanel_brush_init (cpanel, gg); cpanel_identify_init (cpanel, gg); } void barchartRulerRangesSet (gboolean force, displayd * display, splotd * sp, ggobid * gg) { // Do nothing! } ggobi-2.1.12/src/parcoords.c0000644000175000017500000003635014651527764011324 /*-- parcoords.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #include "parcoordsClass.h" #define WIDTH 150 #define HEIGHT 300 /*--------------------------------------------------------------------*/ /* Options section */ /*--------------------------------------------------------------------*/ static const gchar* parcoords_ui = "" " " " " " " " " " " " " ""; void parcoords_reset_arrangement (displayd *display, gint arrangement, ggobid *gg) { GList *l; GtkWidget *frame, *w; splotd *sp; gint x, y, width, height, depth; gint wframe, hframe; GdkWindow *window; if (display->cpanel.parcoords_arrangement == arrangement) return; for (l=display->splots; l; l=l->next) { w = ((splotd *) l->data)->da; gtk_widget_ref (w); gtk_container_remove (GTK_CONTAINER (gg->parcoords.arrangement_box), w); } frame = gg->parcoords.arrangement_box->parent; // Resize the enclosing window according to the new arrangement. window = gtk_widget_get_parent_window (frame); gdk_window_get_geometry(window, &x, &y, &width, &height, &depth); wframe = (arrangement == ARRANGE_ROW) ? MAX(width,height) : MIN(width,height); hframe = (arrangement == ARRANGE_ROW) ? MIN(width,height) : MAX(width,height); gdk_window_resize(window, wframe, hframe); gtk_widget_destroy (gg->parcoords.arrangement_box); if (arrangement == ARRANGE_ROW) gg->parcoords.arrangement_box = gtk_hbox_new (true, 0); else gg->parcoords.arrangement_box = gtk_vbox_new (true, 0); gtk_container_add (GTK_CONTAINER (frame), gg->parcoords.arrangement_box); display->p1d_orientation = (arrangement == ARRANGE_ROW) ? VERTICAL : HORIZONTAL; for (l=display->splots; l; l=l->next) { sp = (splotd *) l->data; gtk_box_pack_start (GTK_BOX (gg->parcoords.arrangement_box), sp->da, true, true, 0); gtk_widget_unref (sp->da); /*-- keep the ref_count appropriate --*/ } /*-- position the display toward the lower left of the main window --*/ display_set_position (GGOBI_WINDOW_DISPLAY(display), gg); gtk_widget_show_all (gg->parcoords.arrangement_box); display_tailpipe (display, FULL, gg); varpanel_refresh (display, gg); } #define MAXNPCPLOTS 5 displayd * parcoords_new_with_vars(gboolean use_window, gboolean missing_p, gint nvars, gint *vars, GGobiData *d, ggobid *gg) { return(parcoords_new(NULL, use_window, missing_p, nvars, vars, d, gg)); } displayd * parcoords_new (displayd *display, gboolean use_window, gboolean missing_p, gint nvars, gint *vars, GGobiData *d, ggobid *gg) { GtkWidget *vbox, *frame; gint i; splotd *sp; gint nplots; gint arrangement = ARRANGE_ROW; /*-- default initial orientation --*/ gint width, screenwidth; gint height, screenheight; if(!display) display = g_object_new(GGOBI_TYPE_PAR_COORDS_DISPLAY, NULL); display_set_values(display, d, gg); GGOBI_WINDOW_DISPLAY(display)->useWindow = use_window; if (nvars == 0) { nplots = MIN (d->ncols, sessionOptions->info->numParCoordsVars); if(nplots < 0) { nplots = d->ncols; } /* Initialize using the plotted variables in the current display, if appropriate */ if (gg->current_display != NULL && gg->current_display != display && gg->current_display->d == d && GGOBI_IS_EXTENDED_DISPLAY(gg->current_display)) { gint j, k, nplotted_vars; gint *plotted_vars = (gint *) g_malloc(d->ncols * sizeof(gint)); displayd *dsp = gg->current_display; nplotted_vars = GGOBI_EXTENDED_DISPLAY_GET_CLASS(dsp)->plotted_vars_get(dsp, plotted_vars, d, gg); nplots = MAX (nplots, nplotted_vars); for (j=0; jncols; k++) { if (!in_vector(k, plotted_vars, nplotted_vars)) { vars[j] = k; j++; if (j == nplots) break; } } g_free (plotted_vars); } else { for (i=0; icpanel, gg); /*-- make sure the initial plot doesn't spill outside the screen --*/ /*-- this should know about the display borders, but it doesn't --*/ /*-- at the moment, the arrangement is forced to be ARRANGE_ROW --*/ width = WIDTH; height = HEIGHT; if (arrangement == ARRANGE_ROW) { screenwidth = gdk_screen_width(); while (nplots * width > screenwidth) { width -= 10; } } else { screenheight = gdk_screen_height(); while (nplots * height > screenheight) { height -= 10; } } if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) display_window_init (GGOBI_WINDOW_DISPLAY(display), nplots*width, height, 3, gg); /* * Add the main menu bar */ vbox = GTK_WIDGET(display); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); display->menu_manager = display_menu_manager_create(display); if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->window) { gtk_container_add (GTK_CONTAINER (GGOBI_WINDOW_DISPLAY(display)->window), vbox); //gg->parcoords.accel_group = gtk_accel_group_new (); display->menubar = create_menu_bar(display->menu_manager, parcoords_ui, GGOBI_WINDOW_DISPLAY(display)->window); /*-- add a tooltip to the file menu --*/ /* - tooltips are generally not done for toplevel menus w = gtk_item_factory_get_widget (factory, "
/File"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gtk_menu_get_attach_widget (GTK_MENU(w)), "File menu for this display", NULL); */ /* * After creating the menubar, and populating the file menu, * add the Options and Link menus another way */ /*parcoords_display_menus_make (display, gg->parcoords.accel_group, G_CALLBACK(display_options_cb), display->menubar, gg);*/ gtk_box_pack_start (GTK_BOX (vbox), display->menubar, false, true, 0); } /* * splots in a box in a frame -- either a vbox or an hbox. */ frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_box_pack_start (GTK_BOX (vbox), frame, true, true, 1); /* * this is the box that would have to change from horizontal to vertical * when the plot arrangement changes */ gg->parcoords.arrangement_box = gtk_hbox_new (true, 0); gtk_container_add (GTK_CONTAINER (frame), gg->parcoords.arrangement_box); display->splots = NULL; /*-- --*/ for (i = 0; i < nplots; i++) { sp = ggobi_parcoords_splot_new(display, gg); sp->p1dvar = vars[i]; /* if (sub_plots == NULL) { sp = splot_new (display, width, height, gg); sp->p1dvar = i; } else sp = sub_plots[i]; */ display->splots = g_list_append (display->splots, (gpointer) sp); gtk_box_pack_start (GTK_BOX (gg->parcoords.arrangement_box), sp->da, true, true, 0); } if(GGOBI_WINDOW_DISPLAY(display)->window) gtk_widget_show_all (GGOBI_WINDOW_DISPLAY(display)->window); return display; } static gboolean parcoords_var_selected (gint jvar, displayd *display) { gboolean selected = false; splotd *s; GList *l = display->splots; while (l) { s = (splotd *) l->data; if (s->p1dvar == jvar) { selected = true; break; } l = l->next ; } return selected; } gboolean parcoords_varsel (cpaneld *cpanel, splotd *sp, gint jvar, gint *jvar_prev, ggobid *gg) { gboolean status = false; status = parcoords_add_delete_splot(cpanel, sp, jvar, jvar_prev, gg, gg->current_display); return(status); } gboolean parcoords_add_delete_splot(cpaneld *cpanel, splotd *sp, gint jvar, gint *jvar_prev, ggobid *gg, displayd *display) { gboolean redraw = true; gint nplots = g_list_length (display->splots); gint k; gint indx = -1, new_indx; GList *l, *ltofree = NULL; splotd *sp_jvar = NULL, *s, *sp_new; GtkWidget *box; /* sp = gg->current_splot jvar = the variable being deleted or added */ /*-- Delete a plot --*/ if (parcoords_var_selected (jvar, display)) { if (nplots > 1) { k = 0; l = display->splots; while (l) { s = (splotd *) l->data; if (s->p1dvar == jvar) { ltofree = l; sp_jvar = s; indx = k; break; } l = l->next; k++; } if (indx == -1 || ltofree == NULL || sp_jvar == NULL) return false; // No plot was found. /*-- Delete the plot from the list without freeing it. --*/ display->splots = g_list_remove_link (display->splots, ltofree); //display->splots = g_list_remove_link (display->splots, // (gpointer) sp_jvar); nplots--; /* * If the plot being removed is the current plot, reset * gg->current_splot. */ if (sp_jvar == gg->current_splot) { sp_event_handlers_toggle (sp_jvar, off, cpanel->pmode, cpanel->imode); new_indx = (indx == 0) ? 0 : MIN (nplots-1, indx); s = (splotd *) g_list_nth_data (display->splots, new_indx); /* just for insurance, to handle the unforeseen */ if (s == NULL) { s = (splotd *) g_list_nth_data (display->splots, 0); } display->current_splot = gg->current_splot = s; /* If we're brushing, is this ok? */ sp_event_handlers_toggle (s, on, cpanel->pmode, cpanel->imode); } // Try to get all the event handlers toggled before the plot is freed. gdk_flush(); splot_free (sp_jvar, display, gg); g_list_free(ltofree); // Free the list element that pointed to sp_jvar. } } else /* Append a new variable */ { sp_new = ggobi_parcoords_splot_new (display, gg); sp_new->p1dvar = jvar; box = (sp->da)->parent; gtk_box_pack_start (GTK_BOX (box), sp_new->da, true, true, 0); display->splots = g_list_append (display->splots, (gpointer) sp_new); gtk_widget_show (sp_new->da); /* I don't think it's possible to initialize brushing until the data has run through the pipeline. Since I can't cleanly add a plot in brushing mode, I think it's best to switch back to the default mode. -- dfs */ GGOBI(full_viewmode_set)(EXTENDED_DISPLAY_PMODE, DEFAULT_IMODE, gg); redraw = true; } return redraw; } /*--------------------------------------------------------------------*/ /* The whiskers, ie the parallel coordinate lines */ /*--------------------------------------------------------------------*/ static void sp_rewhisker (splotd *sp_prev, splotd *sp, splotd *sp_next, ggobid *gg) { gint i, k, m; displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = (cpaneld *) &display->cpanel; GGobiData *d = display->d; gboolean draw_whisker; for (k=0; knrows_in_plot; k++) { i = d->rows_in_plot.els[k]; m = 2*i; /*-- if it's the leftmost plot, don't draw the left whisker --*/ if (sp_prev == NULL) draw_whisker = false; /*-- .. also if we're not drawing missings, and an endpoint is missing --*/ else if (!d->missings_show_p && (ggobi_data_is_missing(d, i, sp->p1dvar) || ggobi_data_is_missing(d, i, sp_prev->p1dvar))) { draw_whisker = false; } else draw_whisker = true; /* --- left (or top) whisker --- */ if (cpanel->parcoords_arrangement == ARRANGE_ROW) { if (draw_whisker) { sp->whiskers[m].x1 = 0; sp->whiskers[m].y1 = (sp_prev->screen[i].y + sp->screen[i].y) / 2; sp->whiskers[m].x2 = sp->screen[i].x; sp->whiskers[m].y2 = sp->screen[i].y; } else { sp->whiskers[m].x1 = sp->screen[i].x; sp->whiskers[m].y1 = sp->screen[i].y; sp->whiskers[m].x2 = sp->screen[i].x; sp->whiskers[m].y2 = sp->screen[i].y; } } else { /* ARRANGE_COLUMN */ if (draw_whisker) { sp->whiskers[m].x1 = (sp_prev->screen[i].x + sp->screen[i].x) / 2; sp->whiskers[m].y1 = 0; sp->whiskers[m].x2 = sp->screen[i].x; sp->whiskers[m].y2 = sp->screen[i].y; } else { sp->whiskers[m].x1 = sp->screen[i].x; sp->whiskers[m].y1 = sp->screen[i].y; sp->whiskers[m].x2 = sp->screen[i].x; sp->whiskers[m].y2 = sp->screen[i].y; } } m++; /*-- if it's the rightmost plot, don't draw the right whisker --*/ if (sp_next == NULL) draw_whisker = false; /*-- .. also if we're not drawing missings, and an endpoint is missing --*/ else if (!d->missings_show_p && (ggobi_data_is_missing(d, i, sp->p1dvar) || ggobi_data_is_missing(d, i, sp_next->p1dvar))) { draw_whisker = false; } else draw_whisker = true; /* --- right (or bottom) whisker --- */ if (cpanel->parcoords_arrangement == ARRANGE_ROW) { if (draw_whisker) { sp->whiskers[m].x1 = sp->screen[i].x; sp->whiskers[m].y1 = sp->screen[i].y; sp->whiskers[m].x2 = sp->max.x; sp->whiskers[m].y2 = (sp->screen[i].y + sp_next->screen[i].y) / 2; } else { sp->whiskers[m].x1 = sp->screen[i].x; sp->whiskers[m].y1 = sp->screen[i].y; sp->whiskers[m].x2 = sp->screen[i].x; sp->whiskers[m].y2 = sp->screen[i].y; } } else { /* ARRANGE_COLUMN */ if (draw_whisker) { sp->whiskers[m].x1 = sp->screen[i].x; sp->whiskers[m].y1 = sp->screen[i].y; sp->whiskers[m].x2 = (sp->screen[i].x + sp_next->screen[i].x) / 2; sp->whiskers[m].y2 = sp->max.y; } else { sp->whiskers[m].x1 = sp->screen[i].x; sp->whiskers[m].y1 = sp->screen[i].y; sp->whiskers[m].x2 = sp->screen[i].x; sp->whiskers[m].y2 = sp->screen[i].y; } } } } /*-- set the positions of the whiskers for sp and prev_sp --*/ void sp_whiskers_make (splotd *sp, displayd *display, ggobid *gg) { GList *splist; splotd *splot; splotd *sp_prev = NULL, *sp_prev_prev = NULL, *sp_next = NULL; for (splist = display->splots; splist; splist = splist->next) { splot = (splotd *) splist->data; if (splot == sp) { sp_next = (splist->next == NULL) ? NULL : (splotd *) splist->next->data; sp_prev = (splist->prev == NULL) ? NULL : (splotd *) splist->prev->data; if (sp_prev != NULL) sp_prev_prev = (splist->prev->prev == NULL) ? NULL : (splotd *) splist->prev->prev->data; } } if (sp_prev != NULL) { sp_rewhisker (sp_prev_prev, sp_prev, sp, gg); } if (sp_next == NULL) { sp_rewhisker (sp_prev, sp, NULL, gg); } } ggobi-2.1.12/src/display.h0000644000175000017500000002662614651527764011007 /*-- display.h --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef DISPLAY_H #define DISPLAY_H #include "defines.h" #include "cpanel.h" #include "splot.h" #include "ggobi-data.h" #include "ggobi.h" #ifdef __cplusplus extern "C" { #endif struct _ggobid; #define GGOBI_TYPE_DISPLAY (ggobi_display_get_type ()) #define GGOBI_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_DISPLAY, displayd)) #define GGOBI_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_DISPLAY, GGobiDisplayClass)) #define GGOBI_IS_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_DISPLAY)) #define GGOBI_IS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_DISPLAY)) #define GGOBI_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_DISPLAY, GGobiDisplayClass)) GType ggobi_display_get_type(); enum { TOUR_STEP_SIGNAL, MAX_GGOBI_DISPLAY_SIGNALS}; typedef struct _GGobiDisplayClass { GtkVBoxClass parent_class; guint signals[MAX_GGOBI_DISPLAY_SIGNALS]; } GGobiDisplayClass; /** */ struct _displayd { GtkVBox vbox; /* * Used by all displays */ GtkWidget *menubar; GtkUIManager *menu_manager; guint imode_merge_id, pmode_merge_id; /*-- for scatterplots, where edge menus need to be rebuilt on the fly --*/ guint edge_merge, edge_option_merge; GtkActionGroup *edgeset_action_group; cpaneld cpanel; GList *splots; /*-- doubly linked list of splots --*/ splotd *current_splot; /*-- multi-plot displays need this notion --*/ GGobiData *d; /*-- pointer to a particular gg->d[] --*/ GGobiData *e; /*-- pointer to a particular gg->d[] --*/ /*-- --*/ /* * Actually, this might need to be a pair of vectors * or linked lists, corresponding to the number of plots in * the display. But let's be lazy for the moment. */ GtkWidget *hrule, *vrule; DisplayOptions options; /* * For an individual scatterplot */ fcoords drag_start; /* * Scatterplot matrix display */ GtkWidget *table; /* * Parallel coordinates display */ gint p1d_orientation; /* * Manipulation Vars */ array_d tc1_manbasis, tc2_manbasis, t1d_manbasis; gint tc1_manip_var, tc2_manip_var, t1d_manip_var; gint tc1_pos_old, tc1_pos, tc2_pos_old, tc2_pos, t1d_pos_old, t1d_pos; /*gint tc_manip_mode;*/ gboolean tc1_manipvar_inc, tc2_manipvar_inc, t1d_manipvar_inc; gfloat tc1_phi, tc2_phi, t1d_phi; gint t2d_manip_var, t2d_manipvar_inc; gint t2d_pos1_old, t2d_pos1, t2d_pos2_old, t2d_pos2; /*gint t2d_manip_mode;*/ array_d t2d_Rmat1, t2d_Rmat2; array_d t2d_manbasis; array_d t2d_mvar_3dbasis; gboolean t2d_no_dir_flag; gfloat t2d_rx, t2d_ry; /*-- 1d tour --*/ tour t1d; gboolean t1d_axes; gboolean t1d_video; /*-- rotation: 2d tour, constrained to 3 variables --*/ tour t2d3; gboolean t2d3_axes; gint t2d3_manip_var; array_d t2d3_manbasis, t2d3_mvar_3dbasis; array_d t2d3_Rmat1, t2d3_Rmat2; gint t2d3_pos1_old, t2d3_pos1, t2d3_pos2_old, t2d3_pos2; gfloat t2d3_rx, t2d3_ry; gboolean t2d3_no_dir_flag; gboolean t2d3_manipvar_inc; /*-- 2d tour --*/ tour t2d; gboolean t2d_axes; gboolean t2d_video; /*-- corr tour --*/ tour tcorr1, tcorr2; gboolean tcorr_axes; gboolean tourcorr_video; /* projection pursuit */ GtkWidget *t1d_pplabel, *t2d_pplabel; GtkWidget *t1d_ppda, *t2d_ppda; GdkPixmap *t1d_pp_pixmap, *t2d_pp_pixmap; GtkWidget *t1d_window, *t2d_window; GtkWidget *t1d_control_frame, *t2d_control_frame; GtkWidget *t1d_mbar, *t2d_mbar; GtkAccelGroup *t1d_pp_accel_group, *t2d_pp_accel_group; optimize0_param t1d_pp_op, t2d_pp_op; pp_param t1d_pp_param, t2d_pp_param; gfloat t2d_ppindx_mat[100], t1d_ppindx_mat[100]; gfloat t2d_indx_min, t2d_indx_max, t1d_indx_min, t1d_indx_max; gint t2d_ppindx_count, t1d_ppindx_count; struct _ggobid *ggobi; }; /* displayd; */ #define GGOBI_TYPE_EMBEDDED_DISPLAY (ggobi_embedded_display_get_type ()) #define GGOBI_EMBEDDED_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_EMBEDDED_DISPLAY, displayd)) #define GGOBI_EMBEDDED_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_EMBEDDED_DISPLAY, GGobiEmbeddedDisplayClass)) #define GGOBI_IS_EMBEDDED_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_EMBEDDED_DISPLAY)) #define GGOBI_IS_EMBEDDED_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_EMBEDDED_DISPLAY)) #define GGOBI_EMBEDDED_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_EMBEDDED_DISPLAY, GGobiEmbeddedDisplayClass)) GType ggobi_embedded_display_get_type(); typedef struct _GGobiEmbeddedDisplayClass { GGobiDisplayClass parent_class; } GGobiEmbeddedDisplayClass; typedef struct _embeddedDisplayd { displayd display; } embeddedDisplayd; #define GGOBI_TYPE_WINDOW_DISPLAY (ggobi_window_display_get_type ()) #define GGOBI_WINDOW_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_WINDOW_DISPLAY, windowDisplayd)) #define GGOBI_WINDOW_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_WINDOW_DISPLAY, GGobiWindowDisplayClass)) #define GGOBI_IS_WINDOW_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_WINDOW_DISPLAY)) #define GGOBI_IS_WINDOW_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_WINDOW_DISPLAY)) #define GGOBI_WINDOW_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_WINDOW_DISPLAY, GGobiWindowDisplayClass)) GType ggobi_window_display_get_type(); displayd *ggobi_window_display_new(gint type, gboolean missing_p, GGobiData *d, ggobid *gg); typedef struct { GGobiDisplayClass parent_class; } GGobiWindowDisplayClass; typedef struct _windowDisplayd { displayd dpy; GtkWidget *window; gboolean useWindow; } windowDisplayd; gboolean isEmbeddedDisplay(displayd *dpy); /** This is used as a trivial class for its type information so that we can detect whether we have one of the new style classes. We might remove it when we are finished the construction. */ #define GGOBI_TYPE_EXTENDED_DISPLAY (ggobi_extended_display_get_type ()) #define GGOBI_EXTENDED_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_EXTENDED_DISPLAY, extendedDisplayd)) #define GGOBI_EXTENDED_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_EXTENDED_DISPLAY, GGobiExtendedDisplayClass)) #define GGOBI_IS_EXTENDED_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_EXTENDED_DISPLAY)) #define GGOBI_IS_EXTENDED_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_EXTENDED_DISPLAY)) #define GGOBI_EXTENDED_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_EXTENDED_DISPLAY, GGobiExtendedDisplayClass)) GType ggobi_extended_display_get_type(); typedef struct { GGobiWindowDisplayClass parent_class; gboolean supports_edges_p; /* only true for scatterplots? */ gboolean show_edges_p; /* used in splot_draw_to_pixmap0_unbinned by scatmat and scatterplot (only) */ gboolean binning_ok; /* see binning_permitted in brush.c */ gboolean (*binningPermitted)(displayd *dpy); gboolean allow_reorientation; /* see p1d_varsel for changing vertical/horizontal orientation */ gboolean options_menu_p; /* whether this supports an option menu in the control panel. Default is yes! */ gboolean loop_over_points; /* See splot_draw_to_pixmap0_unbinned. */ gchar * treeLabel; gchar const * (*tree_label)(displayd *dpy); gchar * titleLabel; gchar const * (*title_label)(displayd *dpy); displayd *(*create)(gboolean use_window, gboolean missing_p, splotd *sp, GGobiData *d, ggobid *gg); displayd *(*createWithVars)(gboolean use_window, gboolean missing_p, gint nvars, gint *vars, GGobiData *d, ggobid *gg); gboolean (*variable_select)(GtkWidget *, displayd *, splotd *, gint jvar, gint toggle, gint mouse, cpaneld *cpanel, ggobid *gg); gint (*variable_plotted_p)(displayd *dpy, gint *cols, gint ncols, GGobiData *d); gboolean (*cpanel_set)(displayd *dpy, cpaneld *cp, ggobid *gg); const gchar *(*mode_ui_get)(displayd *dpy); void (*display_unset)(displayd *dpy); void (*display_set)(displayd *dpy, ggobid *gg); gboolean (*build_symbol_vectors)(cpaneld *, GGobiData *, ggobid *); void (*ruler_ranges_set)(gboolean, displayd *, splotd *, ggobid *); void (*varpanel_refresh)(displayd *dpy, splotd *sp, GGobiData *d); gboolean (*handles_projection)(displayd *dpy, ProjectionMode); gboolean (*handles_interaction)(displayd *dpy, InteractionMode); /* Probably should arrange for displayd to come first and no need to pass the splots. */ void (*xml_describe)(xmlNodePtr node, GList *splots, displayd *dpy); void (*varpanel_tooltips_set)(displayd *dpy, ggobid *gg, GtkWidget *wx, GtkWidget *wy, GtkWidget *wz, GtkWidget *label); gint (*plotted_vars_get)(displayd *display, gint *cols, GGobiData *d, ggobid *gg); GtkWidget *(*imode_control_box)(displayd *, gchar **modeName, ggobid *gg); GtkWidget *(*menus_make)(displayd *dpy, ggobid *gg); gboolean (*event_handlers_toggle)(displayd *dpy, splotd *sp, gboolean state, ProjectionMode, InteractionMode); gint (*splot_key_event_handler)(displayd *dpy, splotd *sp, gint keval); /* new - dfs */ gint (*splot_key_event_handled)(GtkWidget *, displayd *, splotd *, GdkEventKey *, ggobid *); void (*add_plot_labels)(displayd *dpy, splotd *sp, GdkDrawable *, GGobiData *, ggobid *); gboolean (*varpanel_highd)(displayd *dpy); void (*move_points_motion_cb)(displayd *, splotd *, GtkWidget *w, GdkEventMotion *event, ggobid *); void (*move_points_button_cb)(displayd *, splotd *, GtkWidget *w, GdkEventButton *event, ggobid *); /* XXX duncan and dfs: you need to sort this out void (*world_to_raw)(displayd *, splotd *, gint, GGobiData *, ggobid *); */ /* time will tell which of these we need -- dfs */ void (*viewmode_set)(displayd *, ggobid *); void (*pmode_set)(ProjectionMode, displayd *, ggobid *); /* */ gboolean (*varcircle_draw)(displayd *, gint jvar, GdkPixmap *da_pix, ggobid *gg); void (*select_X)(GtkWidget *, displayd *, gint, ggobid *); void (*tour1d_realloc)(displayd *, gint, GGobiData *); void (*tour2d3_realloc)(displayd *, gint, GGobiData *); void (*tour2d_realloc)(displayd *, gint, GGobiData *); void (*tourcorr_realloc)(displayd *, gint, GGobiData *); void (*set_show_axes_option)(displayd *, gboolean); void (*set_show_axes_label_option)(displayd *, gboolean); void (*set_show_axes_values_option)(displayd *, gboolean); } GGobiExtendedDisplayClass; typedef struct { windowDisplayd dpy; gchar * titleLabel; GtkWidget *cpanelWidget; } extendedDisplayd; void display_set_values(displayd *display, GGobiData *d, ggobid *gg); /* These functions are no longer const, because this is dangerous, given that the input is a pointer and the data it points to could change, fooling the compiler - mfl */ const gchar * /*const*/ ggobi_display_tree_label(displayd *dpy); const gchar * /*const*/ ggobi_display_title_label(displayd *dpy); displayd *ggobi_display_new(gboolean missing_p, GGobiData *d, ggobid *gg); #ifdef __cplusplus } /* end of extern "C" */ #endif #endif ggobi-2.1.12/src/main_ui.c0000644000175000017500000012020014651527764010735 /* main_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" #include "display_tree.h" #ifdef STORE_SESSION_ENABLED #include "write_state.h" #endif #include "plugin.h" #ifdef TEST_GGOBI_EVENTS #include "testEvents.h" #endif #include "scatmatClass.h" const char *const GGOBI (PModeNames)[] = { "DefaultPMode", "1D Plot", "XY Plot", "1D Tour", "Rotation", "2D Tour", "2x1D Tour", "ExtendedDisplayPMode"}; const char *const GGOBI (IModeNames)[] = { "DefaultIMode", "Scale", "Brush", "Identify", "Edit Edges", "Move Points",}; static const char *const *pmode_name = GGOBI (PModeNames); static const char *const *imode_name = GGOBI (IModeNames); const char *const GGOBI (PModeKeys)[] = { "", "d", "x", "t", "r", "g", "c", "", ""}; const char *const GGOBI (IModeKeys)[] = { "", "s", "b", "i", "e", "m", "", ""}; void addPreviousFilesMenu (GGobiInitInfo * info, ggobid * gg); #ifdef STORE_SESSION_ENABLED void store_session (ggobid * gg); #endif void show_plugin_list (ggobid * gg); void create_new_ggobi (); /* Listen for display_selected events; update control panel */ void control_panel_display_selected_cb (ggobid * gg, displayd * display) { cpanel_set (display, gg); } void make_control_panels (ggobid * gg) { cpanel_p1dplot_make (gg); cpanel_xyplot_make (gg); cpanel_tour1d_make (gg); cpanel_tour2d3_make (gg); cpanel_tour2d_make (gg); cpanel_ctour_make (gg); cpanel_brush_make (gg); cpanel_scale_make (gg); cpanel_identify_make (gg); cpanel_edgeedit_make (gg); cpanel_movepts_make (gg); /* Remove from here, and do like parcoords etc. * cpanel_scatmat_make (gg); */ /* Leave the extendeded display types to be done on demand. */ } /* This can return NULL, so calling routines must check */ GtkWidget * mode_panel_get_by_name (const gchar * name, ggobid * gg) { GList *l; GtkWidget *w = NULL; modepaneld *pnl; for (l = gg->control_panels; l; l = l->next) { pnl = (modepaneld *) l->data; if (strcmp (name, pnl->name) == 0) { w = pnl->w; break; } } return (GtkWidget *) w; } void tooltips_show (gboolean show, ggobid * gg) { if (show) gtk_tooltips_enable (gg->tips); else gtk_tooltips_disable (gg->tips); } void statusbar_show (gboolean show, ggobid * gg) { GtkWidget *entry = (GtkWidget *) g_object_get_data (G_OBJECT (gg->main_window), "MAIN:STATUSBAR"); if (entry) { if (show) gtk_widget_show (entry); else gtk_widget_hide (entry); } gg->statusbar_p = show; } /* gg->status_message_func((gchar *)domain_error_message, gg); */ void gg_write_to_statusbar (gchar * message, ggobid * gg) { GtkWidget *statusbar = (GtkWidget *) g_object_get_data (G_OBJECT (gg->main_window), "MAIN:STATUSBAR"); // for now we pop by default to prevent memory leaking, but we could // support a temporary statusbar message in which case we would not pop gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 0); if (message) gtk_statusbar_push (GTK_STATUSBAR (statusbar), 0, message); else { /*-- by default, describe the current datad --*/ GGobiData *d = datad_get_from_notebook (gg->varpanel_ui.notebook, gg); if (d) { gchar *msg = g_strdup_printf ("%s: %d x %d (%s)", d->name, d->nrows, d->ncols, gg->input->fileName); gtk_statusbar_push (GTK_STATUSBAR (statusbar), 0, msg); g_free (msg); } } } void cpanel_show (gboolean show, ggobid * gg) { if (gg->imode_frame) { if (show) gtk_widget_show (gg->imode_frame); else gtk_widget_hide (gg->imode_frame); } } ProjectionMode pmode_get (displayd * dsp, ggobid * gg) { if (dsp == NULL) return gg->pmode; else return dsp->cpanel.pmode; } InteractionMode imode_get (ggobid * gg) { return gg->imode; } /* * Use the mode to determine whether the variable selection * panel should display checkboxes or circles */ static gboolean varpanel_highd (displayd * display) { gboolean highd = false; if (display && GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->varpanel_highd) highd = klass->varpanel_highd (display); } return (highd); } /* * Use the widget state to figure out which is currently displayed. */ static gboolean varpanel_shows_circles (GGobiData * d) { return (d != NULL && d->vcirc_ui.ebox != NULL && GTK_WIDGET_REALIZED (d->vcirc_ui.ebox)); } static gboolean varpanel_shows_checkboxes (GGobiData * d) { return (d != NULL && d->vcbox_ui.ebox != NULL && GTK_WIDGET_REALIZED (d->vcbox_ui.ebox)); } void varpanel_reinit (ggobid * gg) { GGobiData *d; gboolean highd; displayd *display = gg->current_display; if (display == NULL) { if (g_slist_length (gg->d) > 0) { d = datad_get_from_notebook (gg->varpanel_ui.notebook, gg); /* if the circles are showing, hide them */ if (varpanel_shows_circles (d)) { varcircles_show (false, d, display, gg); } } } else { /*-- if there is a display present --*/ d = display->d; highd = varpanel_highd (display); if (highd && varpanel_shows_checkboxes (d)) { varcircles_show (true, d, display, gg); } else if (!highd && varpanel_shows_circles (d)) { varcircles_show (false, d, display, gg); } } } void rebuild_mode_menus (displayd * display, ggobid * gg) { static const gchar *iprefix = "/menubar/IMode/", *pprefix = "/menubar/PMode/"; gchar *path; GtkAction *action = NULL; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { gtk_ui_manager_remove_ui (gg->main_menu_manager, gg->mode_merge_id); /* Allow the extended display to override the submenu_destroy call. If it doesn't provide a method, then call submenu_destroy. */ void (*f) (displayd * dpy) = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->display_unset; if (f) { f (display); f (display); } /* else { if (gg->pmode_item) submenu_destroy (gg->pmode_item); submenu_destroy (gg->imode_item); } */ } /* Then rebuild */ if (GGOBI_IS_EXTENDED_DISPLAY (display)) { const gchar *(*ui_get) (displayd * dpy) = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->mode_ui_get; if (ui_get) { GError *error = NULL; const gchar *ui = ui_get (display); gg->mode_merge_id = gtk_ui_manager_add_ui_from_string (gg->main_menu_manager, ui, -1, &error); if (error) { g_message ("Could not merge main mode ui from display"); g_error_free (error); } } void (*f) (displayd * dpy, ggobid * gg) = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->display_set; if (f) f (display, gg); /* use an informative label for the default actions, if necessary */ path = g_strdup_printf ("%s%s", pprefix, "ExtendedDisplayPMode"); action = gtk_ui_manager_get_action (gg->main_menu_manager, path); if (action) g_object_set (G_OBJECT (action), "label", GGOBI (getPModeScreenName) (EXTENDED_DISPLAY_PMODE, display), NULL); g_free (path); path = g_strdup_printf ("%s%s", iprefix, "DefaultIMode"); action = gtk_ui_manager_get_action (gg->main_menu_manager, path); if (action) g_object_set (G_OBJECT (action), "label", GGOBI (getIModeScreenName) (DEFAULT_IMODE, display), NULL); g_free (path); /* force the radio actions to update */ path = g_strdup_printf ("%s%s", pprefix, GGOBI (getPModeName) (pmode_get (gg->current_display, gg))); action = gtk_ui_manager_get_action (gg->main_menu_manager, path); if (action) gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), true); g_free (path); path = g_strdup_printf ("%s%s", iprefix, GGOBI (getIModeName) (imode_get (gg))); action = gtk_ui_manager_get_action (gg->main_menu_manager, path); if (action) gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), true); g_free (path); } } void viewmode_set (ProjectionMode pmode, InteractionMode imode, ggobid * gg) { displayd *display = gg->current_display; if (pmode != NULL_PMODE) { gg->pmode_prev = gg->pmode; gg->pmode = pmode; } if (imode != NULL_IMODE) { gg->imode_prev = gg->imode; gg->imode = imode; } else { gg->imode_prev = gg->imode; gg->imode = DEFAULT_IMODE; } /* Experiment -- seems to work */ rebuild_mode_menus (display, gg); if (gg->pmode != NULL_PMODE && gg->pmode != gg->pmode_prev) { /* * If moving between modes whose variable selection interface * differs, swap in the correct display. */ varpanel_reinit (gg); varpanel_tooltips_set (display, gg); varpanel_refresh (display, gg); } /* * Just sets up the mode_frame and the variable selection panel. * Assume that it's always necessary. */ if (gg->current_control_panel) { GtkWidget *modeBox = gg->current_control_panel; if (modeBox) { gtk_widget_ref (modeBox); gtk_container_remove (GTK_CONTAINER (gg->imode_frame), modeBox); gg->current_control_panel = NULL; } } if (imode != NULL_IMODE) { gchar *modeName = NULL; GtkWidget *panel = NULL; /* a change within the set of imodes */ if (imode > DEFAULT_IMODE && imode < EXTENDED_DISPLAY_IMODE) { modeName = (gchar *) imode_name[imode]; /* could be DEFAULT */ panel = mode_panel_get_by_name (modeName, gg); } /* the pmode is taking over the control panel */ else if (imode == DEFAULT_IMODE && gg->pmode > NULL_PMODE) { if (gg->pmode == EXTENDED_DISPLAY_PMODE) { GGobiExtendedDisplayClass *klass; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); panel = klass->imode_control_box (display, &modeName, gg); } } else if (pmode < EXTENDED_DISPLAY_PMODE) { /* scatterplot? */ modeName = (gchar *) pmode_name[gg->pmode]; panel = mode_panel_get_by_name (modeName, gg); } } gtk_frame_set_label (GTK_FRAME (gg->imode_frame), modeName); gtk_container_add (GTK_CONTAINER (gg->imode_frame), panel); gg->current_control_panel = panel; /*-- avoid increasing the object's ref_count infinitely --*/ /* wow, super-dangerous - do we really need this? - mfl */ /*if (G_OBJECT (panel)->ref_count > 1) gtk_widget_unref (panel);*/ } if (pmode != NULL_PMODE && gg->pmode != gg->pmode_prev) { /* * The projection type is one of P1PLOT, XYPLOT, ROTATE, TOUR1D, * TOUR2D or COTOUR. It only changes if another projection type * is selected. (For parcoords, time series, and scatmat plots, * the value of projection is irrelevant. A second pmode is in * the process of being added to the barchart.) */ if (display && GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); if (klass->pmode_set) klass->pmode_set (pmode, display, gg); } } } /* * Turn the tour procs on and off here */ void procs_activate (gboolean state, ProjectionMode pmode, displayd * display, ggobid * gg) { if (!display) return; switch (pmode) { case TOUR1D: if (!display->cpanel.t1d.paused) tour1d_func (state, display, gg); break; case TOUR2D3: if (!display->cpanel.t2d3.paused) tour2d3_func (state, display, gg); break; case TOUR2D: if (!display->cpanel.t2d.paused) tour2d_func (state, display, gg); break; case COTOUR: if (!display->cpanel.tcorr1.paused) tourcorr_func (state, display, gg); break; default: break; } } RedrawStyle imode_activate (splotd * sp, ProjectionMode pmode, InteractionMode imode, gboolean state, ggobid * gg) { displayd *display = (displayd *) sp->displayptr; cpaneld *cpanel = &display->cpanel; RedrawStyle redraw_style = NONE; if (state == off) { switch (imode) { case DEFAULT_IMODE: switch (pmode) { case P1PLOT: p1d_activate (state, display, gg); break; case XYPLOT: xyplot_activate (state, display, gg); break; case TOUR2D3: if (cpanel->t2d3.manip_mode != MANIP_OFF) splot_cursor_unset (sp); break; case TOUR2D: if (cpanel->t2d.manip_mode != MANIP_OFF) splot_cursor_unset (sp); break; case COTOUR: if (cpanel->tcorr.manip_mode != MANIP_OFF) splot_cursor_unset (sp); break; case TOUR1D: case NULL_PMODE: case DEFAULT_PMODE: case EXTENDED_DISPLAY_PMODE: /* Each class needs its own one of these */ case N_PMODES: break; } break; case BRUSH: redraw_style = brush_activate (state, display, sp, gg); break; case IDENT: redraw_style = identify_activate (state, display, gg); break; case SCALE: splot_cursor_unset (sp); /*-- for insurance, because sometimes scaling doesn't quit --*/ disconnect_motion_signal (sp); /*-- --*/ break; case EDGEED: redraw_style = edgeedit_activate (state, display, gg); break; default: break; } } else if (state == on) { switch (imode) { case DEFAULT_IMODE: switch (pmode) { case P1PLOT: p1d_activate (state, display, gg); break; case XYPLOT: xyplot_activate (state, display, gg); break; case TOUR2D3: if (cpanel->t2d3.manip_mode != MANIP_OFF) splot_cursor_set (GDK_HAND2, sp); break; case TOUR2D: if (cpanel->t2d.manip_mode != MANIP_OFF) splot_cursor_set (GDK_HAND2, sp); break; case COTOUR: if (cpanel->tcorr.manip_mode != MANIP_OFF) splot_cursor_set (GDK_HAND2, sp); break; case TOUR1D: case NULL_PMODE: case DEFAULT_PMODE: case EXTENDED_DISPLAY_PMODE: case N_PMODES: break; } break; case BRUSH: redraw_style = brush_activate (state, display, sp, gg); break; case IDENT: redraw_style = identify_activate (state, display, gg); break; case SCALE: splot_cursor_set (GDK_HAND2, sp); break; case EDGEED: redraw_style = edgeedit_activate (state, display, gg); break; default: break; } } return redraw_style; } /* * Verify that the number of variables is large enough before * allowing the projection to be reset. */ gboolean projection_ok (ProjectionMode m, displayd * display) { gboolean ok = true; GGobiData *d = display->d; /*-- if the mode is a projection-setting mode ... --*/ if (m <= COTOUR) { switch (m) { case P1PLOT: if (d->ncols < 1) ok = false; break; case XYPLOT: if (d->ncols < 2) ok = false; break; case TOUR2D3: if (d->ncols < MIN_NVARS_FOR_TOUR2D3) ok = false; break; case TOUR1D: if (d->ncols < MIN_NVARS_FOR_TOUR1D) ok = false; break; case TOUR2D: if (d->ncols < MIN_NVARS_FOR_TOUR2D) ok = false; break; case COTOUR: if (d->ncols < MIN_NVARS_FOR_COTOUR) ok = false; break; default: break; } } return ok; } /* Do everything in one routine for now; split later if apropriate */ gint GGOBI (full_viewmode_set) (ProjectionMode pmode, InteractionMode imode, ggobid * gg) { /* * When a new pmode is selected, it sets a new pmode and then calls * this routine, because a new imode is also selected. */ /* * Some of the routines called here, like procs_activate * and reinit_transient brushing, are routines that we want * to have executed when a new viewmode is selected for the * current display, but not when the viewmode changes because * a new display becomes current. * Because of that, we don't put them in viewmode_activate. */ gboolean reinit_transient_p = false; gboolean cpanel_shows_pmode = (imode == DEFAULT_IMODE); if (gg->current_display != NULL && gg->current_splot != NULL) { splotd *sp = gg->current_splot; displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; RedrawStyle redraw_style = NONE; /* Shutting off event handlers and idle procs */ /* It may make sense to split the event handlers into two routines */ /* Each display class may need one of these */ sp_event_handlers_toggle (sp, off, gg->pmode, gg->imode); redraw_style = imode_activate (sp, gg->pmode, gg->imode, off, gg); procs_activate (off, gg->pmode, display, gg); /* UI part and resetting the variables */ if (pmode != NULL_PMODE) display->cpanel.pmode = pmode; display->cpanel.imode = imode; viewmode_set (pmode, imode, gg); /* */ sp_event_handlers_toggle (sp, on, gg->pmode, gg->imode); imode_activate (sp, gg->pmode, gg->imode, on, gg); if (cpanel_shows_pmode) procs_activate (on, gg->pmode, display, gg); if (gg->imode != BRUSH && gg->imode_prev == BRUSH) { if (cpanel->br.mode == BR_TRANSIENT) { reinit_transient_p = true; reinit_transient_brushing (display, gg); } } /* * work out which menus (Options, Reset, I/O) need to be present * on the main menubar and the display menubar. */ /*main_miscmenus_update (gg->pmode_prev, gg->imode_prev, display, gg); */ display_mode_menus_update (gg->pmode_prev, gg->imode_prev, display, gg); /*-- redraw this display --*/ display_tailpipe (display, FULL, gg); /*-- redraw as needed for transient brushing and identify --*/ if (redraw_style != NONE || reinit_transient_p) { displays_plot (sp, FULL, gg); } return (gg->imode); } else { /* if there's no display */ viewmode_set (NULL_PMODE, NULL_IMODE, gg); /*-- need to remove console menus: Options, Reset, ... --*/ /*main_miscmenus_update (gg->pmode_prev, gg->imode_prev, NULL, gg); */ if (gg->mode_merge_id) gtk_ui_manager_remove_ui (gg->main_menu_manager, gg->mode_merge_id); //submenu_destroy (gg->imode_item); return (NULL_IMODE); } return (-1); } /* #ifndef AS_GGOBI_LIBRARY */ /* Wrapper for gtk_main_quit so that we can override this in other applications to avoid quitting when the user selects the Quit button. */ void quit_ggobi (ggobid * gg) { extern void closePlugins (ggobid * gg); gint n, i; ggobid *el; n = GGobi_getNumGGobis (); for (i = 0; i < n; i++) { el = GGobi_ggobi_get (i); if (el != gg) closePlugins (el); } closePlugins (gg); procs_activate (off, gg->pmode, gg->current_display, gg); gtk_main_quit (); } /* action callbacks */ static void action_open_cb (GtkAction * action, ggobid * gg) { filename_get_r (gg); } static void action_new_cb (GtkAction * action, ggobid * gg) { create_new_ggobi (); } static void action_save_cb (GtkAction * action, ggobid * gg) { writeall_window_open (gg); } #ifdef STORE_SESSION_ENABLED static void action_store_session_cb (GtkAction * action, ggobid * gg) { store_session (gg); } #endif static void action_close_cb (GtkAction * action, ggobid * gg) { ggobi_close (gg); } static void /* this is to connect to the delete signal (window closed) */ signal_delete_cb (ggobid * gg, GdkEvent * ev, GtkWidget * w) { ggobi_close (gg); } static void action_quit_cb (GtkAction * action, ggobid * gg) { quit_ggobi (gg); } static void action_manipulate_cb (GtkAction * action, ggobid * gg) { vartable_open (gg); } static void action_transform_cb (GtkAction * action, ggobid * gg) { transform_window_open (gg); } static void action_sphere_cb (GtkAction * action, ggobid * gg) { sphere_panel_open (gg); } static void action_jitter_cb (GtkAction * action, ggobid * gg) { jitter_window_open (gg); } static void action_color_schemes_cb (GtkAction * action, ggobid * gg) { svis_window_open (gg); } static void action_autobrush_cb (GtkAction * action, ggobid * gg) { wvis_window_open (gg); } static void action_color_glyph_groups_cb (GtkAction * action, ggobid * gg) { cluster_window_open (gg); } static void action_subset_cb (GtkAction * action, ggobid * gg) { subset_window_open (gg); } #ifdef SMOOTH_IMPLEMENTED static void action_smooth_cb (GtkAction * action, ggobid * gg) { smooth_window_open (gg); } #endif static void action_impute_cb (GtkAction * action, ggobid * gg) { impute_window_open (gg); } static void action_about_cb (GtkAction * action, ggobid * gg) { splash_show (gg); } static void action_plugins_cb (GtkAction * action, ggobid * gg) { show_plugin_list (gg); } static void action_toggle_tooltips_cb (GtkToggleAction * action, ggobid * gg) { tooltips_show (gtk_toggle_action_get_active (action), gg); } static void action_toggle_cpanel_cb (GtkToggleAction * action, ggobid * gg) { cpanel_show (gtk_toggle_action_get_active (action), gg); } static void action_toggle_statusbar_cb (GtkToggleAction * action, ggobid * gg) { statusbar_show (gtk_toggle_action_get_active (action), gg); } static void action_radio_pmode_cb (GtkRadioAction * action, GtkRadioAction * current, ggobid * gg) { ProjectionMode pm = (ProjectionMode) gtk_radio_action_get_current_value (action); /* I don't know why this other test used to be necessary when it doesn't seem to be any more, but I know it does great harm when I'm using radio buttons ... dfs */ if ((pm != gg->pmode /*|| gg->imode != DEFAULT_IMODE */ ) && projection_ok (pm, gg->current_display)) { /* When the pmode is reset, the imode is set to the default */ GGOBI (full_viewmode_set) (pm, DEFAULT_IMODE, gg); } } static void action_radio_imode_cb (GtkRadioAction * action, GtkRadioAction * current, ggobid * gg) { InteractionMode im; im = (InteractionMode) gtk_radio_action_get_current_value (action); if (im != gg->imode) { GGOBI (full_viewmode_set) (NULL_PMODE, im, gg); } } static const gchar *main_ui_str = "" " " " " " " " " " " " " #ifdef STORE_SESSION_ENABLED " " " " #endif " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " #ifdef INFERENCE_IMPLEMENTED " " #endif " " " " " " " " " " " " " " #ifdef SMOOTH_IMPLEMENTED " " #endif " " " " " " " " " " " " " " " " ""; static GtkActionEntry entries[] = { {"File", NULL, "_File"}, {"Open", GTK_STOCK_OPEN, "_Open", NULL, "Open a datafile", G_CALLBACK (action_open_cb)}, {"New", GTK_STOCK_NEW, "_New", NULL, "Create a new GGobi instance", G_CALLBACK (action_new_cb)}, {"Save", GTK_STOCK_SAVE, "_Save", "V", "Save some data", G_CALLBACK (action_save_cb)}, {"Shortcuts", NULL, "Shortc_uts"}, #ifdef STORE_SESSION_ENABLED {"StoreSession", GTK_STOCK_GOTO_BOTTOM, "Store Session", NULL, "Save this GGobi session", G_CALLBACK (action_store_session_cb) }, #endif {"Close", GTK_STOCK_CLOSE, "_Close", "C", "Close this GGobi instance", G_CALLBACK (action_close_cb)}, {"Quit", GTK_STOCK_QUIT, "_Quit", "Q", "Quit GGobi", G_CALLBACK (action_quit_cb)}, {"Display", NULL, "_Display"}, {"PMode", NULL, "_View"}, {"IMode", NULL, "_Interaction"}, {"Options", NULL, "_Options"}, {"Tools", NULL, "_Tools"}, {"VariableManipulation", GTK_STOCK_INDEX, "Variable _Manipulation", NULL, "Open a table of variables for manipulation", G_CALLBACK (action_manipulate_cb) }, {"VariableTransformation", GTK_STOCK_CONVERT, "Variable _Transformation", NULL, "Perform transformations on the dataset's variables", G_CALLBACK (action_transform_cb) }, {"Sphering", GTK_STOCK_JUMP_TO, "_Sphering (PCA)", NULL, "Open a panel to perform sphering", G_CALLBACK (action_sphere_cb) }, #ifdef INFERENCE_IMPLEMENTED /* to do */ {"Inference", GTK_STOCK_EXECUTE, "_Inference", NULL, "Perform inference", NULL}, #endif {"VariableJittering", NULL, "Variable _Jittering", NULL, "'Jitter' some variables", G_CALLBACK (action_jitter_cb) }, {"ColorSchemes", GTK_STOCK_SELECT_COLOR, "_Color Schemes", NULL, "Configure and pick color schemes", G_CALLBACK (action_color_schemes_cb) }, {"AutoBrushing", NULL, "_Automatic Brushing", NULL, "Apply color scheme along a variable", G_CALLBACK (action_autobrush_cb) }, {"ColorAndGlyphGroups", NULL, "Color & _Glyph Groups", NULL, "Configure color and glyph groups", G_CALLBACK (action_color_glyph_groups_cb) }, {"CaseSubsettingAndSampling", NULL, "Case S_ubsetting and Sampling", NULL, "Extract and resample subsets of cases", G_CALLBACK (action_subset_cb) }, #ifdef SMOOTH_IMPLEMENTED {"Smoothing", NULL, "Sm_oothing", NULL, "Smooth the data", G_CALLBACK (action_smooth_cb)}, #endif {"MissingValues", NULL, "Missing _Values", NULL, "Impute missing values", G_CALLBACK (action_impute_cb) }, {"Help", NULL, "_Help"}, {"AboutGGobi", NULL, "About _GGobi", NULL, "Discover the magic behind GGobi", G_CALLBACK (action_about_cb) }, {"AboutPlugins", NULL, "About _Plugins", NULL, "Current plugin status", G_CALLBACK (action_plugins_cb) } }; static GtkRadioActionEntry pmode_entries[] = { /* here is where the i/p mode stuff goes */ {"ExtendedDisplayPMode", NULL, "Default", "H", /* assumes 'extended display pmode' is 'default' */ "Switch to the default view mode for this display", EXTENDED_DISPLAY_PMODE}, {"1D Plot", NULL, "1_D Plot", "D", "View a 1D plot of the data", P1PLOT}, {"XY Plot", NULL, "_XY Plot", "X", "View a 2D plot of the data", XYPLOT}, {"1D Tour", NULL, "1D _Tour", "T", "Tour the data in a single dimension", TOUR1D}, {"Rotation", NULL, "_Rotation", "R", "Tour the data in two dimensions, three variables at a time", TOUR2D3}, {"2D Tour", NULL, "2D To_ur", "G", "Take a grand tour of the data", TOUR2D}, {"2x1D Tour", NULL, "2x1D T_our", "U", "Take a 2x1D (correlation) tour of the data", COTOUR} }; static GtkRadioActionEntry imode_entries[] = { {"DefaultIMode", NULL, "Default", "H", /* assumes 'extended display pmode' is 'default' */ "Switch to the default interaction mode for this view mode", DEFAULT_IMODE}, {"Scale", NULL, "_Scale", "S", "Scale (pan and zoom) the data", SCALE}, {"Brush", NULL, "_Brush", "B", "Brush (color) points", BRUSH}, {"Identify", NULL, "_Identify", "I", "Identify points (query their values)", IDENT}, {"Edit Edges", NULL, "_Edit Edges", "E", "Edit the edges in the plot", EDGEED}, {"Move Points", NULL, "_Move Points", "M", "Move the points in the plot", MOVEPTS} }; GtkActionGroup * ggobi_actions_create (ggobid * gg) { GtkToggleActionEntry t_entries[] = { /* not global because depends on gg state */ {"ShowTooltips", NULL, "Show _Tooltips", NULL, "Toggle display of helpful tips like this one", G_CALLBACK (action_toggle_tooltips_cb), GTK_TOOLTIPS (gg->tips)->enabled}, {"ShowControlPanel", NULL, "Show _Control Panel", NULL, "Toggle display of control panel", G_CALLBACK (action_toggle_cpanel_cb), true}, {"ShowStatusbar", NULL, "Show _Statusbar", NULL, "Toggle display of statusbar at bottom", G_CALLBACK (action_toggle_statusbar_cb), gg->statusbar_p} }; GtkActionGroup *actions = gtk_action_group_new ("GGobiActions"); gtk_action_group_add_actions (actions, entries, G_N_ELEMENTS (entries), gg); gtk_action_group_add_toggle_actions (actions, t_entries, G_N_ELEMENTS (t_entries), gg); gtk_action_group_add_radio_actions (actions, pmode_entries, G_N_ELEMENTS (pmode_entries), EXTENDED_DISPLAY_PMODE, G_CALLBACK (action_radio_pmode_cb), gg); gtk_action_group_add_radio_actions (actions, imode_entries, G_N_ELEMENTS (imode_entries), DEFAULT_IMODE, G_CALLBACK (action_radio_imode_cb), gg); g_object_set (G_OBJECT (gtk_action_group_get_action (actions, "Display")), "hide_if_empty", false, NULL); /*g_object_set(G_OBJECT(gtk_action_group_get_action(actions, "Shortcuts")), "hide_if_empty", false, NULL); */ return (actions); } GtkUIManager * ggobi_menu_manager_create (ggobid * gg) { GtkUIManager *manager = gtk_ui_manager_new (); GtkActionGroup *actions = ggobi_actions_create (gg); gtk_ui_manager_insert_action_group (manager, actions, 0); gtk_ui_manager_set_add_tearoffs (manager, true); g_object_unref (G_OBJECT (actions)); return (manager); } void make_ui (ggobid * gg) { GtkWidget *window; GtkWidget *hbox, *vbox, *statusbar; GtkWidget *basement; gg->tips = gtk_tooltips_new (); gg->main_window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "GGobi"); gtk_window_set_policy (GTK_WINDOW (window), true, true, false); gtk_window_set_default_size (GTK_WINDOW (window), 400, 500); GGobi_widget_set (window, gg, true); #ifdef TEST_GGOBI_EVENTS /* g_signal_connect (G_OBJECT(gg), "splot_new", test_new_plot_cb, (gpointer) "A new plot"); */ g_signal_connect_swapped (G_OBJECT (gg), "splot_new", test_new_plot_cb, (gpointer) "A new plot"); g_signal_connect (G_OBJECT (gg), "datad_added", test_data_add_cb, NULL); g_signal_connect (G_OBJECT (gg), "sticky_point_added", test_sticky_points, NULL); g_signal_connect (G_OBJECT (gg), "sticky_point_removed", test_sticky_points, NULL); #endif g_signal_connect_swapped (G_OBJECT (window), "delete_event", G_CALLBACK (signal_delete_cb), (gpointer) gg); g_signal_connect_swapped (G_OBJECT (window), "destroy_event", G_CALLBACK (signal_delete_cb), (gpointer) gg); //gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* * Add the main menu bar */ vbox = gtk_vbox_new (false, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (window), vbox); gg->main_menu_manager = ggobi_menu_manager_create (gg); gg->main_menubar = create_menu_bar (gg->main_menu_manager, main_ui_str, window); gg->main_accel_group = gtk_ui_manager_get_accel_group (gg->main_menu_manager); if (sessionOptions->info && sessionOptions->info->numInputs > 0) { addPreviousFilesMenu (sessionOptions->info, gg); } display_menu_init (gg); gtk_box_pack_start (GTK_BOX (vbox), gg->main_menubar, false, false, 0); gtk_accel_group_lock (gg->main_accel_group); hbox = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, true, true, 0); /* * Create a frame to hold the mode panels, set its label * and contents, using the default mode for the default display. */ gg->imode_frame = gtk_frame_new ((gg->imode == NULL_IMODE) ? "" : imode_name[gg->imode]); gtk_box_pack_start (GTK_BOX (hbox), gg->imode_frame, false, false, 3); gtk_container_set_border_width (GTK_CONTAINER (gg->imode_frame), 2); gtk_frame_set_shadow_type (GTK_FRAME (gg->imode_frame), GTK_SHADOW_NONE); g_signal_connect (G_OBJECT (gg), "display_selected", G_CALLBACK (control_panel_display_selected_cb), NULL); make_control_panels (gg); if (gg->imode != NULL_IMODE) { if (gg->imode == DEFAULT_IMODE) gtk_container_add (GTK_CONTAINER (gg->imode_frame), mode_panel_get_by_name ((gchar *) pmode_name[gg->pmode], gg)); else gtk_container_add (GTK_CONTAINER (gg->imode_frame), mode_panel_get_by_name ((gchar *) imode_name[gg->imode], gg)); } gtk_box_pack_start (GTK_BOX (hbox), gtk_vseparator_new (), false, false, 2); /*-- Variable selection panel --*/ varpanel_make (hbox, gg); /*-- status bar --*/ statusbar = gtk_statusbar_new (); g_object_set_data (G_OBJECT (gg->main_window), "MAIN:STATUSBAR", statusbar); gtk_box_pack_start (GTK_BOX (vbox), statusbar, false, false, 0); /*-- --*/ gtk_widget_show_all (hbox); /* -- do not map or show this widget -- */ basement = gtk_vbox_new (false, 0); gtk_widget_set_name (basement, "BASEMENT"); gtk_box_pack_start (GTK_BOX (hbox), basement, false, false, 0); /* -- do not map or show this widget -- */ /*-- at this point, the mode could be NULLMODE, P1PLOT, or XYPLOT --*/ { void main_miscmenus_initialize (ggobid * gg); /*main_miscmenus_initialize (gg); */ } if (sessionOptions->showControlPanel) gtk_widget_show_all (window); } const gchar *const *GGOBI (getPModeNames) (int *n) { *n = sizeof (GGOBI (PModeNames)) / sizeof (GGOBI (PModeNames)[0]); return (GGOBI (PModeNames)); } const gchar *const *GGOBI (getIModeNames) (int *n) { *n = sizeof (GGOBI (IModeNames)) / sizeof (GGOBI (IModeNames)[0]); return (GGOBI (IModeNames)); } const gchar *const *GGOBI (getPModeKeys) (int *n) { *n = sizeof (GGOBI (PModeKeys)) / sizeof (GGOBI (PModeKeys)[0]); return (GGOBI (PModeKeys)); } void load_previous_file (GtkAction * action, gpointer cbd); /* Add the previous input sources to the menu. */ void addPreviousFilesMenu (GGobiInitInfo * info, ggobid * gg) { gint i; InputDescription *input; if (info) { GtkUIManager *manager = gg->main_menu_manager; GtkActionGroup *actions = gtk_action_group_new ("Shortcuts"); guint merge_id = gtk_ui_manager_new_merge_id (manager); gtk_ui_manager_insert_action_group (manager, actions, -1); for (i = 0; i < info->numInputs; i++) { input = &(info->descriptions[i].input); if (input && input->fileName) { gchar *action_name = g_strdup_printf ("Shortcut_%d", i); GtkAction *action = gtk_action_new (action_name, input->fileName, "Open this shortcut", #if GTK_MAJOR_VERSION > 2 && GTK_MINOR_VERSION > 4 GTK_STOCK_FILE); #else NULL); #endif g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (load_previous_file), info->descriptions + i); g_object_set_data (G_OBJECT (action), "ggobi", gg); gtk_action_group_add_action (actions, action); gtk_ui_manager_add_ui (manager, merge_id, "/menubar/File/Shortcuts", action_name, action_name, GTK_UI_MANAGER_MENUITEM, false); g_free (action_name); g_object_unref (action); } } g_object_unref (actions); } } ggobid *create_ggobi (InputDescription * desc); void load_previous_file (GtkAction * action, gpointer cbd) { InputDescription *desc; GGobiDescription *gdesc; ggobid *gg; gg = (ggobid *) g_object_get_data (G_OBJECT (action), "ggobi"); gdesc = (GGobiDescription *) cbd; desc = &(gdesc->input); if (g_slist_length (gg->d) > 0) create_ggobi (desc); else { read_input (desc, gg); /* Need to avoid the initial scatterplot. */ start_ggobi (gg, true, gdesc->displays == NULL); } if (gdesc->displays) { gint i, n; GGobiDisplayDescription *dpy; n = g_list_length (gdesc->displays); for (i = 0; i < n; i++) { dpy = (GGobiDisplayDescription *) g_list_nth_data (gdesc->displays, i); createDisplayFromDescription (gg, dpy); /* * This line is added to counteract something done in * display_add: if there's a previous splot, display_add * kindly arranges for it to get a QUICK redraw just to * eliminate the border. The API, though, allows many * plots to be added before anything is drawn. As a * result, if the first display is a parcoords plot, the * first splot is copied from pixmap0 to pixmap1 before it * has been drawn to pixmap1, resulting in garbage on the * screen. */ gg->current_splot = NULL; } } } /* This replicates code elsewhere and the two should be merged. */ ggobid * create_ggobi (InputDescription * desc) { gboolean init_data = true; ggobid *gg; gg = ggobi_alloc (NULL); /*-- some initializations --*/ gg->displays = NULL; gg->control_panels = NULL; globals_init (gg); /*-- variables that don't depend on the data --*/ special_colors_init (gg); make_ui (gg); gg->input = desc; read_input (desc, gg); if (sessionOptions->info != NULL) { extern gboolean registerPlugins (ggobid * gg, GList * plugins); registerPlugins (gg, sessionOptions->info->plugins); } start_ggobi (gg, init_data, sessionOptions->info->createInitialScatterPlot); return (gg); } void show_plugin_list (ggobid * gg) { if (sessionOptions->info && sessionOptions->info->plugins) showPluginInfo (sessionOptions->info->plugins, sessionOptions->info->inputPlugins, (ggobid *) gg); } #ifdef STORE_SESSION_ENABLED void store_session_in_file (GtkWidget * chooser) { gchar *fileName; ggobid *gg; fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); if (fileName && fileName[0]) { gg = g_object_get_data (G_OBJECT (chooser), "ggobi"); write_ggobi_as_xml (gg, fileName, NULL); g_free (fileName); } } void store_session (ggobid * gg) { GtkWidget *dlg; gchar *buf; if (!sessionOptions->info->sessionFile) { buf = g_strdup_printf ("%s%c%s", getenv ("HOME"), G_DIR_SEPARATOR, ".ggobi-session"); dlg = gtk_file_chooser_dialog_new ("Save ggobi session", NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); g_object_set_data (G_OBJECT (dlg), "ggobi", (gpointer) gg); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dlg), buf); g_free (buf); if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_ACCEPT) store_session_in_file (dlg); gtk_widget_destroy (dlg); } else { ggobi_write_session (sessionOptions->info->sessionFile); /* write_ggobi_as_xml(gg, sessionOptions->info->sessionFile); */ } } #endif void create_new_ggobi () { create_ggobi (NULL); } ggobi-2.1.12/src/.renderer.gob.stamp0000644000175000017500000000000014651530127012626 ggobi-2.1.12/src/vartable_ui.c0000644000175000017500000005140714651527764011625 /* vartable_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* interface code for the variable statistics table: dialogs and buttons */ #include #include #include #include "vars.h" #include "externs.h" #include "vartable.h" static void close_btn_cb (GtkWidget *w, ggobid *gg) { gtk_widget_hide (gg->vartable_ui.window); } static void clone_vars_cb (GtkWidget *w, ggobid *gg) { GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint ncols = selected_cols_get (cols, d, gg); if (ncols > 0) clone_vars (cols, ncols, d); g_free (cols); } /* not implemented static void delete_vars_cb (GtkWidget *w, ggobid *gg) { GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint ncols = selected_cols_get (cols, d, gg); if (ncols > 0) delete_vars (cols, ncols, d); g_free (cols); } */ /*-------------------------------------------------------------------------*/ /*--------------- Setting and clearing variable ranges --------------------*/ /*-------------------------------------------------------------------------*/ static void limits_type_cb (GtkToggleButton *w, ggobid *gg) { gg->lims_use_visible = w->active; } static void dialog_range_set (GtkWidget *w, ggobid *gg) { GtkWidget *dialog = w; GtkWidget *umin_entry, *umax_entry; GtkTreeModel *model; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint ncols = selected_cols_get (cols, d, gg); gint j, k; gchar *val_str; gfloat min_val = 0, max_val = 0; // compiler pacification gboolean min_p = false, max_p = false; vartabled *vt; umin_entry = widget_find_by_name (GTK_DIALOG(dialog)->vbox, "umin_entry"); if (umin_entry == NULL || !GTK_IS_ENTRY(umin_entry)) { g_printerr ("found the wrong widget; bail out\n"); return; } umax_entry = widget_find_by_name (GTK_DIALOG(dialog)->vbox, "umax_entry"); if (umax_entry == NULL || !GTK_IS_ENTRY(umax_entry)) { g_printerr ("found the wrong widget; bail out\n"); return; } /*-- minimum --*/ val_str = gtk_editable_get_chars (GTK_EDITABLE (umin_entry), 0, -1); if (val_str != NULL && strlen (val_str) > 0) { min_val = (gfloat) atof (val_str); g_free (val_str); min_p = true; } /*-- maximum --*/ val_str = gtk_editable_get_chars (GTK_EDITABLE (umax_entry), 0, -1); if (val_str != NULL && strlen (val_str) > 0) { max_val = (gfloat) atof (val_str); g_free (val_str); max_p = true; } /*-- require setting both, and make sure the values are consistent --*/ if (!min_p || !max_p || (min_p && max_p && max_vallim_specified.min = vt->lim_specified_tform.min = min_val; vt->lim_specified.max = vt->lim_specified_tform.max = max_val; gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_REAL_USER_MIN, min_val, VT_REAL_USER_MAX, max_val, -1); vt->lim_specified_p = min_p && max_p; } /* * the first function could be needed if transformation has been * going on, because lim_tform could be out of step. */ limits_set (d, false, false, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } g_free (cols); } static void range_unset_cb (GtkWidget *w, ggobid *gg) { range_unset (gg); } static void rescale_cb (GtkWidget *w, ggobid *gg) { GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } /* * open a dialog with two text entry widgets in it, * and fetch the range for the selected variables in * dialog_range_set. */ static void open_range_set_dialog (GtkWidget *w, ggobid *gg) { GtkWidget *frame, *vb, *hb, *btn, *lbl; GtkWidget *dialog, *umin, *umax; GtkWidget *radio1, *radio2; GSList *group; gint k; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint ncols = selected_cols_get (cols, d, gg); gboolean ok = true; vartabled *vt; for (k=0; ktform0 != NO_TFORM0 || vt->tform1 != NO_TFORM1 || vt->tform2 != NO_TFORM2) { ok = false; quick_message ("Sorry, can't set the range for a transformed variable\n", false); break; } } g_free (cols); if (!ok) return; dialog = gtk_dialog_new_with_buttons ("Range Dialog", NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); /*-- frame for a pair of radio buttons --*/ frame = gtk_frame_new ("Define rescaling behavior"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), frame); vb = gtk_vbox_new (true, 5); gtk_container_set_border_width (GTK_CONTAINER (vb), 5); gtk_container_add (GTK_CONTAINER (frame), vb); radio1 = gtk_radio_button_new_with_mnemonic (NULL, "Use _visible points"); GTK_TOGGLE_BUTTON (radio1)->active = TRUE; gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio1, "When rescaling, use only the cases that are visible: ie, not hidden by brushing and not excluded by subsampling", NULL); g_signal_connect (G_OBJECT (radio1), "toggled", G_CALLBACK (limits_type_cb), gg); gtk_box_pack_start (GTK_BOX (vb), radio1, false, false, 0); group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio1)); radio2 = gtk_radio_button_new_with_mnemonic (group, "Use _all points"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio2, "When rescaling, use all cases", NULL); gtk_box_pack_start (GTK_BOX (vb), radio2, TRUE, TRUE, 0); /*-- --*/ /*-- frame for setting the user-specified limits --*/ frame = gtk_frame_new ("Override default limits"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), frame); vb = gtk_vbox_new (true, 5); gtk_container_set_border_width (GTK_CONTAINER (vb), 5); gtk_container_add (GTK_CONTAINER (frame), vb); /*-- make an hbox to hold a label and a text entry widget --*/ hb = gtk_hbox_new (true, 5); lbl = gtk_label_new_with_mnemonic ("M_inimum: "); gtk_box_pack_start (GTK_BOX (hb), lbl, true, true, 0); umin = gtk_entry_new (); gtk_entry_set_width_chars(GTK_ENTRY(umin), 10); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), umin); gtk_widget_set_name (umin, "umin_entry"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), umin, "Minimum for the selected variable(s)", NULL); gtk_box_pack_start (GTK_BOX (hb), umin, true, true, 2); gtk_container_add (GTK_CONTAINER (vb), hb); /*-- make another hbox --*/ hb = gtk_hbox_new (true, 5); lbl = gtk_label_new_with_mnemonic ("M_aximum: "); gtk_box_pack_start (GTK_BOX (hb), lbl, true, true, 2); umax = gtk_entry_new (); gtk_entry_set_width_chars(GTK_ENTRY(umin), 10); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), umax); gtk_widget_set_name (umax, "umax_entry"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), umax, "Maximum for the selected variable(s)", NULL); gtk_box_pack_start (GTK_BOX (hb), umax, true, true, 2); gtk_container_add (GTK_CONTAINER (vb), hb); /*-- --*/ /*-- frame for the unset range button --*/ frame = gtk_frame_new ("Restore default limits"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), frame); vb = gtk_vbox_new (true, 5); gtk_container_set_border_width (GTK_CONTAINER (vb), 5); gtk_container_add (GTK_CONTAINER (frame), vb); btn = gtk_button_new_with_mnemonic ("_Clear user limits"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Unset user min and max for the selected variable(s)", NULL); gtk_box_pack_start (GTK_BOX (vb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (range_unset_cb), gg); /*-- --*/ gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) dialog_range_set(dialog, gg); gtk_widget_destroy(dialog); } void range_unset (ggobid *gg) { GtkTreeModel *model; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint *cols = (gint *) g_malloc (d->ncols * sizeof (gint)); gint ncols = selected_cols_get (cols, d, gg); gint j, k; vartabled *vt; for (k=0; klim_specified_p = false; /*-- then null out the two entries in the table --*/ gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_REAL_USER_MIN, 0.0, VT_REAL_USER_MAX, 0.0, -1); } g_free ((gchar *) cols); /*-- these 4 lines the same as in dialog_range_set --*/ limits_set (d, false, false, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } /*-------------------------------------------------------------------------*/ /*------- Adding derived variables (other than cloning, for now) ----------*/ /*-------------------------------------------------------------------------*/ static void dialog_newvar_add (GtkWidget *w, ggobid *gg) { GtkWidget *dialog = w; GtkWidget *entry, *radio_brush; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint vtype; gchar *vname; /*-- retrieve the radio button for the brushing groups --*/ radio_brush = widget_find_by_name (GTK_DIALOG(dialog)->vbox, "radio_brush"); if (radio_brush == NULL || !GTK_IS_RADIO_BUTTON(radio_brush)) { g_printerr ("found the wrong widget; bail out\n"); return; } if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio_brush))) vtype = ADDVAR_BGROUP; else vtype = ADDVAR_ROWNOS; /*-- retrieve the entry widget and variable name --*/ entry = widget_find_by_name (GTK_DIALOG(dialog)->vbox, "newvar_entry"); if (entry == NULL || !GTK_IS_ENTRY(entry)) { g_printerr ("found the wrong widget; bail out\n"); /**/return; } vname = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); if (vname != NULL && strlen(vname) > 0) { newvar_add_with_values(vtype == ADDVAR_BGROUP ? (gdouble *) &AddVarBrushGroup : (gdouble *) &AddVarRowNumbers, d->nrows, vname, real, 0, NULL, NULL, NULL, d); /* I think we still want to do this ... */ #ifdef FORMERLY /*-- scroll to the bottom to highlight the new variable --*/ nb = GTK_NOTEBOOK (gg->vartable_ui.notebook); indx = gtk_notebook_get_current_page (nb); /*-- each notebook page's child is a scrolled window --*/ swin = gtk_notebook_get_nth_page (nb, indx); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (swin)); adj->value += adj->page_increment; gtk_adjustment_value_changed (adj); #endif } } static void open_newvar_dialog (GtkWidget *w, ggobid *gg) { GtkWidget *dialog; GtkWidget *frame, *vb, *hb, *lbl; GtkWidget *radio1, *radio2, *entry; GSList *radio_group; dialog = gtk_dialog_new_with_buttons ("Add New Variable", NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); frame = gtk_frame_new ("Variable values"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), frame, false, false, 2); /*-- make a vb to hold the radio buttons --*/ vb = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (frame), vb); radio1 = gtk_radio_button_new_with_mnemonic (NULL, "1:_n"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio1, "Add a variable whose values run from 1 to the number of cases", NULL); gtk_box_pack_start (GTK_BOX (vb), radio1, false, false, 2); radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio1)); radio2 = gtk_radio_button_new_with_mnemonic (radio_group, "Brushed _groups"); gtk_widget_set_name (radio2, "radio_brush"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio2, "Add a variable whose values are based on the groups defined by brushing", NULL); gtk_box_pack_start (GTK_BOX (vb), radio2, false, false, 2); /*-- label and entry --*/ hb = gtk_hbox_new (false, 2); lbl = gtk_label_new_with_mnemonic ("Variable _name: "); gtk_box_pack_start (GTK_BOX (hb), lbl, true, true, 2); entry = gtk_entry_new(); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry); gtk_entry_set_text (GTK_ENTRY (entry), "foo"); gtk_widget_set_name (entry, "newvar_entry"); gtk_box_pack_start (GTK_BOX (hb), entry, true, true, 2); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hb, false, false, 2); gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) dialog_newvar_add(dialog, gg); gtk_widget_destroy(dialog); } /*-------------------------------------------------------------------------*/ /* Rename one variable */ /*-------------------------------------------------------------------------*/ static void dialog_rename_var (GtkWidget *w, ggobid *gg) { GtkWidget *dialog = w; GtkWidget *entry; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gchar *vname; gint *selected_vars, nselected_vars = 0; gint jvar; /*-- find out what variables are selected in the var statistics panel --*/ selected_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nselected_vars = selected_cols_get (selected_vars, d, gg); if (nselected_vars == 0) return; /*-- retrieve the entry widget and variable name --*/ entry = widget_find_by_name (GTK_DIALOG(dialog)->vbox, "rename_entry"); if (entry == NULL || !GTK_IS_ENTRY(entry)) { g_printerr ("found the wrong widget; bail out\n"); return; } jvar = selected_vars[0]; vname = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); if (vname != NULL && strlen(vname) > 1) { ggobi_data_set_col_name(d, jvar, vname); vartable_collab_set_by_var (jvar, d); tform_label_update (jvar, d); } } static void open_rename_dialog (GtkWidget *w, ggobid *gg) { GtkWidget *dialog, *hb, *entry, *lbl; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); gint *selected_vars, nselected_vars = 0; /*-- find out what variables are selected in the var statistics panel --*/ selected_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nselected_vars = selected_cols_get (selected_vars, d, gg); if (nselected_vars == 0) { gchar *message = g_strdup_printf ("You must select one variable.\n"); quick_message (message, false); g_free (message); return; } dialog = gtk_dialog_new_with_buttons ("Rename One Variable", NULL, 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); /*-- label and entry --*/ hb = gtk_hbox_new (false, 2); lbl = gtk_label_new ("Variable _name: "); gtk_box_pack_start (GTK_BOX (hb), lbl, true, true, 2); entry = gtk_entry_new(); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry); /*-- label it with the name of the variable being renamed --*/ gtk_entry_set_text (GTK_ENTRY (entry), ggobi_data_get_col_name(d, selected_vars[0])); gtk_widget_set_name (entry, "rename_entry"); gtk_box_pack_start (GTK_BOX (hb), entry, true, true, 2); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hb, false, false, 2); gtk_widget_show_all(GTK_DIALOG(dialog)->vbox); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) dialog_rename_var(dialog, gg); gtk_widget_destroy(dialog); } /*-------------------------------------------------------------------------*/ void select_all_cb (GtkWidget *w, ggobid *gg) { GtkWidget *tree_view = vartable_tree_view_get (gg); GtkTreeSelection *tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); gtk_tree_selection_select_all(tree_sel); } void deselect_all_cb (GtkWidget *w, ggobid *gg) { GtkWidget *tree_view = vartable_tree_view_get (gg); GtkTreeSelection *tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); gtk_tree_selection_unselect_all(tree_sel); } GtkWidget * vartable_buttonbox_build (ggobid *gg) { GtkWidget *hbox, *hb, *btn; /*-- hbox for the buttons along the bottom --*/ hbox = gtk_hbox_new (false, 12); /*-- Make and clear selections --*/ hb = gtk_hbox_new (false, 2); btn = gtk_button_new_with_mnemonic ("_Select all"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Select all variables", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (select_all_cb), gg); btn = gtk_button_new_with_mnemonic ("Clear s_election"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Deselect all variables", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (deselect_all_cb), gg); gtk_box_pack_start (GTK_BOX (hbox), hb, true, false, 1); /*-- --*/ /*-- Set and apply limits --*/ hb = gtk_hbox_new (false, 2); /*-- set and clear variable ranges --*/ btn = gtk_button_new_with_mnemonic ("_Limits ... "); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Set user min and max for the selected variable(s), and define rescaling behavior", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (open_range_set_dialog), gg); /*-- rescale after resetting variable ranges --*/ btn = gtk_button_new_with_mnemonic ("Resc_ale"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Rescale plots using specified limits and scaling behavior", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (rescale_cb), gg); gtk_box_pack_start (GTK_BOX (hbox), hb, true, false, 1); /*-- --*/ /*-- Clone, new, delete ... --*/ hb = gtk_hbox_new (false, 2); /*-- Clone or delete selected variables --*/ btn = gtk_button_new_with_mnemonic ("Cl_one"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Clone selected variables", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (clone_vars_cb), gg); /*-- New variable: index, derived from brushing, ... --*/ btn = gtk_button_new_with_mnemonic ("_New"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Add a new variable", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (open_newvar_dialog), gg); /*-- --*/ /* * not yet implemented btn = gtk_button_new_with_label ("Delete"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Delete selected variables", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (delete_vars_cb), gg); gtk_widget_set_sensitive (btn, false); */ gtk_box_pack_start (GTK_BOX (hbox), hb, true, false, 1); /*-- --*/ /*-- Rename one variable ... --*/ btn = gtk_button_new_with_mnemonic ("Rena_me ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Rename one variable -- one variable must be selected", NULL); gtk_box_pack_start (GTK_BOX (hbox), btn, true, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (open_rename_dialog), gg); /*-- --*/ btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Close the window", NULL); gtk_box_pack_start (GTK_BOX (hbox), btn, true, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); return hbox; } ggobi-2.1.12/src/movepts.c0000644000175000017500000001516514651527764011026 /* movepts.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" static gboolean movepts_history_contains (gint, gint, GGobiData *, ggobid *); /*------------------------------------------------------------------------*/ /* history */ /*------------------------------------------------------------------------*/ static gboolean movepts_history_contains (gint i, gint j, GGobiData * d, ggobid * gg) { if (g_slist_length (d->movepts_history) > 0) { GSList *l; celld *cell; for (l = d->movepts_history; l; l = l->next) { cell = (celld *) l->data; if (cell->i == i && cell->j == j) { return true; } } } return false; } void movepts_history_add (gint id, splotd * sp, GGobiData * d, ggobid * gg) { /* * So that it's possible to do 'undo last', always add two * celld elements. In the case that motion is not happening * in two directions, or one of them is redundant, then it * can be (-1, -1, NULL). */ celld *cell; cell = (celld *) g_malloc (sizeof (celld)); cell->i = cell->j = -1; if (gg->movepts.direction == horizontal || gg->movepts.direction == both) { /*-- the cell is (id, sp->xyvars.x), gg->raw.vals[id][sp->xyvars.x] --*/ if (!movepts_history_contains (id, sp->xyvars.x, d, gg)) { cell->i = id; cell->j = sp->xyvars.x; cell->val = d->raw.vals[id][sp->xyvars.x]; } } d->movepts_history = g_slist_append (d->movepts_history, cell); cell = (celld *) g_malloc (sizeof (celld)); cell->i = cell->j = -1; if (gg->movepts.direction == vertical || gg->movepts.direction == both) { /*-- the cell is (id, sp->xyvars.y), gg->raw.vals[id][sp->xyvars.y] --*/ if (!movepts_history_contains (id, sp->xyvars.y, d, gg)) { cell->i = id; cell->j = sp->xyvars.y; cell->val = d->raw.vals[id][sp->xyvars.y]; } } d->movepts_history = g_slist_append (d->movepts_history, cell); } void movepts_history_delete_last (GGobiData * d, ggobid * gg) { gint n; if ((n = g_slist_length (d->movepts_history)) > 0) { celld *cell = (celld *) g_slist_nth_data (d->movepts_history, n - 1); /*-- especially ignore cells with indices == -1 --*/ if (cell->i > -1 && cell->i < d->nrows_in_plot) { if (cell->j > -1 && cell->j < d->ncols) { d->raw.vals[cell->i][cell->j] = d->tform.vals[cell->i][cell->j] = cell->val; } } d->movepts_history = g_slist_remove (d->movepts_history, cell); g_free (cell); } } /*------------------------------------------------------------------------*/ void movept_screen_to_raw (splotd * sp, gint ipt, gcoords * eps, gboolean horiz, gboolean vert, ggobid * gg) { gint j; gcoords planar; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; greal *world = (greal *) g_malloc0 (d->ncols * sizeof (greal)); icoords pos; greal *raw = (greal *) g_malloc (d->ncols * sizeof (greal)); pos.x = sp->screen[ipt].x; pos.y = sp->screen[ipt].y; for (j = 0; j < d->ncols; j++) world[j] = d->world.vals[ipt][j]; pt_screen_to_plane (&pos, ipt, horiz, vert, eps, &planar, sp); pt_plane_to_world (sp, &planar, eps, world); for (j = 0; j < d->ncols; j++) pt_world_to_raw_by_var (j, world, raw, d); for (j = 0; j < d->ncols; j++) { d->raw.vals[ipt][j] = d->tform.vals[ipt][j] = raw[j]; d->world.vals[ipt][j] = world[j]; } sp->planar[ipt].x = planar.x; sp->planar[ipt].y = planar.y; g_free (raw); g_free (world); } void movept_plane_to_raw (splotd * sp, gint ipt, gcoords * eps, GGobiData * d, ggobid * gg) { gint j; gcoords planar; greal *world = (greal *) g_malloc0 (d->ncols * sizeof (greal)); greal *raw = (greal *) g_malloc (d->ncols * sizeof (greal)); planar.x = sp->planar[ipt].x; planar.y = sp->planar[ipt].y; for (j = 0; j < d->ncols; j++) world[j] = d->world.vals[ipt][j]; pt_plane_to_world (sp, &planar, eps, world); for (j = 0; j < d->ncols; j++) pt_world_to_raw_by_var (j, world, raw, d); for (j = 0; j < d->ncols; j++) { d->raw.vals[ipt][j] = d->tform.vals[ipt][j] = raw[j]; d->world.vals[ipt][j] = world[j]; } g_free (raw); g_free (world); } /*------------------------------------------------------------------------*/ void move_pt (gint id, gint x, gint y, splotd * sp, GGobiData * d, ggobid * gg) { gint i, k; gboolean horiz, vert; g_assert (d->clusterid.nels == d->nrows); g_assert (d->hidden.nels == d->nrows); horiz = gg->movepts.direction == horizontal || gg->movepts.direction == both; vert = gg->movepts.direction == vertical || gg->movepts.direction == both; if (horiz) /* Jump the point horizontally to the mouse position */ sp->screen[id].x = x; if (vert) /* Jump the point vertically to the mouse position */ sp->screen[id].y = y; /* run the pipeline backwards for case 'id' */ movept_screen_to_raw (sp, id, &gg->movepts.eps, horiz, vert, gg); /* Let this work even if all points are the same glyph and color */ if (gg->movepts.cluster_p) { gint cur_clust = d->clusterid.els[id]; /* * Move all points which belong to the same cluster * as the selected point. */ for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; if (k == id); else { if (d->clusterid.els[k] == cur_clust) { if (!d->hidden_now.els[k]) { /* ignore erased values altogether */ if (horiz) sp->planar[k].x += gg->movepts.eps.x; if (vert) sp->planar[k].y += gg->movepts.eps.y; /*-- run only the latter portion of the reverse pipeline --*/ movept_plane_to_raw (sp, k, &gg->movepts.eps, d, gg); } } } } } /* and now forward again, all the way ... */ tform_to_world (d, gg); displays_tailpipe (FULL, gg); { /* Now notify anyone who is interested in this move. */ GGobiPointMoveEvent ev; ev.id = id; ev.d = d; g_signal_emit (G_OBJECT (gg), GGobiSignals[POINT_MOVE_SIGNAL], 0, sp, id, d); } } ggobi-2.1.12/src/tour2d_pp_ui.c0000644000175000017500000004223114651527764011736 /* tour2d_pp_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #define WIDTH 200 #define HEIGHT 100 /* terms in expansion, bandwidth */ /* static GtkWidget *param_vb, *param_lbl, *param_scale; static GtkAdjustment *param_adj; */ /*-- called when closed from the close menu item --*/ static void action_close_cb (GtkAction *action, displayd *dsp) { gtk_widget_hide (dsp->t2d_window); t1d_optimz(0, &dsp->t2d.get_new_target, &dsp->t2d.target_selection_method, dsp); /* free_optimize0_p(&dsp->t2d_pp_op); * should this go here? * free_pp(&dsp->t2d_pp_param); seems not, causes a crash because window just gets hidden, so shouldn't free the arrays. */ } /*-- called when destroyed from the window manager --*/ static void close_wmgr_cb (GtkWidget *w, GdkEventButton *event, displayd *dsp) { gtk_widget_hide (dsp->t2d_window); t2d_optimz(0, &dsp->t2d.get_new_target, &dsp->t2d.target_selection_method, dsp); free_optimize0_p(&dsp->t2d_pp_op); free_pp(&dsp->t2d_pp_param); gtk_widget_destroy (dsp->t2d_window); dsp->t2d_window = NULL; } /* static void hide_cb (GtkWidget *w) { gtk_widget_hide (w); } */ static void action_show_controls_cb(GtkToggleAction *action, displayd *dsp) { if (gtk_toggle_action_get_active(action)) gtk_widget_show (dsp->t1d_control_frame); else gtk_widget_hide (dsp->t1d_control_frame); } /*static void line_options_cb(gpointer data, guint action, GtkCheckMenuItem *w) { switch (action) { case 0: case 1: case 2: default: fprintf(stderr, "Unhandled switch-case in line_options_cb\n"); } }*/ /*static void bitmap_size_cb(gpointer data, guint action, GtkCheckMenuItem *w) { switch (action) { case 0: case 1: case 2: default: fprintf(stderr, "Unhandled switch-case in bitmap_size_cb\n"); } }*/ /*static void replot_freq_cb(gpointer data, guint action, GtkCheckMenuItem *w) { switch (action) { case 1: case 2: case 4: case 8: case 16: break; default: fprintf(stderr, "Unhandled switch-case in replot_freq_cb\n"); } }*/ static void t2d_optimz_cb (GtkToggleButton *w, displayd *dsp) { if (dsp == NULL) { g_printerr ("No display corresponds to these projection pursuit controls; close this panel.\n"); return; } t2d_optimz(w->active, &dsp->t2d.get_new_target, &dsp->t2d.target_selection_method, dsp); } static void t2d_pptemp_set_cb (GtkAdjustment *adj, displayd *dsp) { t2d_pptemp_set(adj->value, dsp, dsp->d->gg); } static void t2d_ppcool_set_cb (GtkAdjustment *adj, displayd *dsp) { t2d_ppcool_set(adj->value, dsp, dsp->d->gg); } /* static void sphere_cb (GtkWidget *w, ggobid *gg) { sphere_panel_open(gg); } */ #include "tour_pp.h" static gchar *t2d_pp_func_lbl[] = {"Holes","Central Mass","LDA","Gini-C","Entropy-C"}; TourPPIndex StandardPPIndices[] = { {"Holes", &holes_raw, false, NULL}, {"Central Mass", ¢ral_mass_raw, false, NULL}, {"LDA", &discriminant, true, NULL}, {"Gini-C", &cartgini, true, NULL}, {"Entropy-C", &cartentropy, true, NULL}, }; void t2d_pp_func_cb (GtkWidget *w, displayd *dsp) { ggobid *gg; cpaneld *cpanel = NULL; gint indx = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); gchar *label = g_strdup("PP index: (0.000) 0.0000 (0.000)"); if (dsp == NULL) { g_printerr ("No display corresponds to these controls\n"); return; } gg = GGobiFromDisplay (dsp); cpanel = &dsp->cpanel; cpanel->t2d.pp_indx = indx; cpanel->t2d.ppindex = StandardPPIndices[indx]; dsp->t2d.get_new_target = true; dsp->t2d.ppval = 0.0; dsp->t2d.oppval = -1.0; dsp->t2d_pp_op.index_best = 0.0; sprintf(label,"PP index: (%3.1f) %5.3f (%3.1f) ", 0.0, dsp->t2d.ppval, 0.0); gtk_label_set_text(GTK_LABEL(dsp->t2d_pplabel),label); t2d_clear_ppda(dsp, gg); /* if (indx == SUBD || LDA || CART_GINI || CART_ENTROPY || CART_VAR || PCA) gtk_widget_hide (param_vb); else { gtk_widget_show (param_vb); }*/ } /* static void bitmap_cb (GtkButton *button) { g_printerr ("drop a new bitmp\n"); } static void return_to_bitmap_cb (GtkToggleButton *w) { g_printerr ("return to bitmap? %d\n", w->active); } static void record_bitmap_cb (GtkToggleButton *w) { g_printerr ("record bitmap? %d\n", w->active); } */ static gint t2d_ppda_configure_cb (GtkWidget *w, GdkEventConfigure *event, displayd *dsp) { gint wid = w->allocation.width, hgt = w->allocation.height; if (dsp->t2d_pp_pixmap != NULL) gdk_pixmap_unref (dsp->t2d_pp_pixmap); dsp->t2d_pp_pixmap = gdk_pixmap_new (dsp->t2d_ppda->window, wid, hgt, -1); return false; } static gint t2d_ppda_expose_cb (GtkWidget *w, GdkEventConfigure *event, displayd *dsp) { ggobid *gg = dsp->d->gg; /* gint margin=10; gint j; gint xpos, ypos, xstrt, ystrt; gchar *tickmk; GtkStyle *style = gtk_widget_get_style (dsp->t2d_ppda); GGobiData *d = dsp->d; */ gint wid = w->allocation.width, hgt = w->allocation.height; /* static gboolean init = true;*/ /* if (init) { t2d_clear_ppda(dsp, gg); init=false; }*/ gdk_draw_pixmap (dsp->t2d_ppda->window, gg->plot_GC, dsp->t2d_pp_pixmap, 0, 0, 0, 0, wid, hgt); return false; } static const gchar* tour2dpp_ui = "" " " " " " " " " " " " " " " " " ""; static GtkActionEntry entries[] = { { "File", NULL, "_File" }, { "Close", GTK_STOCK_CLOSE, "_Close", "C", "Hide the projection pursuit window", G_CALLBACK(action_close_cb) }, { "Options", NULL, "_Options" } }; static GtkToggleActionEntry t_entries[] = { { "ShowControls", NULL, "_Show controls", "S", "Hide the controls on the left so that the graph consumes the entire window", G_CALLBACK(action_show_controls_cb), true } }; void tour2dpp_window_open (ggobid *gg) { /*GtkWidget **btn, *label, *da, *entry;*/ GtkWidget *hbox, *vbox, *vbc, *vb, *frame, *tgl, *hb, *opt, *sbar, *lbl; GtkObject *adj; displayd *dsp = gg->current_display; /* ok as long as we only use the gui */ GGobiData *d = dsp->d; gboolean vars_sphered = true; /*-- to initialize the checkboxes in the menu --*/ GtkWidget *item; if (dsp == NULL) return; /* check if selected variables are sphered beforeing allowing window to popup */ /* if (dsp->t2d.nactive > d->sphere.pcvars.nels) vars_sphered = false; gint i, j; for (j=0; jt2d.nactive; j++) { for (i=0; isphere.pcvars.nels; i++) if (dsp->t2d.active_vars.els[j] == d->sphere.pcvars.els[i]) break; if ((i == d->sphere.pcvars.nels-1) && (dsp->t2d.active_vars.els[j] != d->sphere.pcvars.els[i])) { vars_sphered = false; break; } }*/ if (!vars_sphered) { quick_message ("The selected variables have to be sphered first. Use the Tools menu and select the sphering option.", false); } else { if (dsp->t2d_window == NULL) { GtkUIManager *manager = gtk_ui_manager_new(); GtkActionGroup *actions = gtk_action_group_new("Tour2DPPActions"); dsp->t2d_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (dsp->t2d_window), "Projection Pursuit - 2D"); g_signal_connect (G_OBJECT (dsp->t2d_window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) dsp); /*gtk_window_set_policy (GTK_WINDOW (dsp->t2d_window), true, true, false);*/ g_signal_connect (G_OBJECT(d), "rows_in_plot_changed", G_CALLBACK(reset_pp), gg); gtk_container_set_border_width (GTK_CONTAINER (dsp->t2d_window), 10); g_object_set_data(G_OBJECT (dsp->t2d_window), "displayd", dsp); /* * Add the main menu bar */ vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (dsp->t2d_window), vbox); gtk_action_group_add_actions(actions, entries, G_N_ELEMENTS(entries), dsp); gtk_action_group_add_toggle_actions(actions, t_entries, G_N_ELEMENTS(t_entries), dsp); gtk_ui_manager_insert_action_group(manager, actions, 0); g_object_unref(G_OBJECT(actions)); dsp->t2d_mbar = create_menu_bar(manager, tour2dpp_ui, dsp->t2d_window); /*dsp->t2d_pp_accel_group = gtk_accel_group_new (); factory = get_main_menu (menu_items, sizeof (menu_items) / sizeof (menu_items[0]), dsp->t2d_pp_accel_group, dsp->t2d_window, &dsp->t2d_mbar, (gpointer) dsp);*/ gtk_box_pack_start (GTK_BOX (vbox), dsp->t2d_mbar, false, true, 0); /* * Divide the window: controls on the left, plot on the right */ hbox = gtk_hbox_new (false, 1); gtk_container_set_border_width (GTK_CONTAINER (hbox), 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, true, true, 1); /* * Controls */ dsp->t2d_control_frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (dsp->t2d_control_frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (dsp->t2d_control_frame), 5); gtk_box_pack_start (GTK_BOX (hbox), dsp->t2d_control_frame, false, false, 1); vbc = gtk_vbox_new (false, 5); gtk_container_set_border_width (GTK_CONTAINER (vbc), 5); gtk_container_add (GTK_CONTAINER (dsp->t2d_control_frame), vbc); /* * Optimize toggle */ tgl = gtk_check_button_new_with_mnemonic ("_Optimize"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Guide the tour using projection pursuit optimization or tour passively", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (t2d_optimz_cb), (gpointer) dsp); gtk_box_pack_start (GTK_BOX (vbc), tgl, false, false, 1); /* * Box to hold temp start and cooling controls */ hb = gtk_hbox_new (true, 2); vb = gtk_vbox_new (false, 0); lbl = gtk_label_new_with_mnemonic ("_Temp start:"); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); /*-- value, lower, upper, step --*/ adj = gtk_adjustment_new (1.0, 0.1, 3.0, 0.1, 0.1, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (t2d_pptemp_set_cb), dsp); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_widget_set_name (sbar, "TOUR2D:PP_TEMPST"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust starting temp of pp", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); gtk_box_pack_start (GTK_BOX (hb), vb, false, false, 0); /*-- value, lower, upper, step --*/ vb = gtk_vbox_new (false, 0); lbl = gtk_label_new_with_mnemonic ("_Cooling:"); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); adj = gtk_adjustment_new (0.99, 0.50, 1.0, 0.05, 0.05, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (t2d_ppcool_set_cb), dsp); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), sbar); gtk_widget_set_name (sbar, "TOUR2D:PP_COOLING"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust cooling", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 0); gtk_box_pack_start (GTK_BOX (hb), vb, false, false, 0); gtk_box_pack_start (GTK_BOX (vbc), hb, false, false, 0); /* * Index value with label */ hb = gtk_hbox_new (false, 3); gtk_box_pack_start (GTK_BOX (vbc), hb, false, false, 2); dsp->t2d_pplabel = gtk_label_new ("PP index: 0.0000"); gtk_misc_set_alignment (GTK_MISC (dsp->t2d_pplabel), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), dsp->t2d_pplabel, false, false, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), dsp->t2d_pplabel, "The value of the projection pursuit index for the current projection", NULL); /* entry = gtk_entry_new_with_max_length (32); gtk_entry_set_editable (GTK_ENTRY (entry), false); gtk_entry_set_text (GTK_ENTRY (entry), "0"); gtk_box_pack_start (GTK_BOX (hb), entry, false, false, 2); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "The value of the projection pursuit index for the current projection", NULL); g_signal_connect (G_OBJECT (entry), "value_changed", G_CALLBACK (t2d_writeindx_cb), gg);*/ /* g_signal_connect (G_OBJECT (dsp->t2d.ppval), "value_changed", G_CALLBACK (t2d_writeindx_cb), gg);*/ /* * pp index menu and scale inside frame */ /* frame = gtk_frame_new ("PP index function"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbc), frame, false, false, 0); */ /* vb = gtk_vbox_new (false, 3);*/ vb = gtk_vbox_new (true, 2); gtk_box_pack_start (GTK_BOX (vbc), vb, false, false, 2); /* gtk_container_add (GTK_CONTAINER (frame), vb);*/ /* btn = gtk_button_new_with_label ("Sphere Vars"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Interface to sphering variables (principal components analysis)", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (sphere_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vb), btn, true, true, 1); */ opt = gtk_combo_box_new_text (); //gtk_container_set_border_width (GTK_CONTAINER (opt), 4); /* gtk_misc_set_alignment (opt, 0, 0.5); */ gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Set the projection pursuit index", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); /* gtk_box_pack_start (GTK_BOX (hb), opt, false, false, 0);*/ populate_combo_box (opt, t2d_pp_func_lbl, G_N_ELEMENTS(t2d_pp_func_lbl), G_CALLBACK(t2d_pp_func_cb), (gpointer) dsp); /* param_vb = gtk_vbox_new (false, 3); gtk_container_set_border_width (GTK_CONTAINER (param_vb), 4); gtk_box_pack_start (GTK_BOX (vb), param_vb, false, false, 2); param_lbl = gtk_label_new ("Terms in expansion:"); gtk_misc_set_alignment (GTK_MISC (param_lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (param_vb), param_lbl, false, false, 0); param_adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 30.0, 1.0, 1.0, 0.0); param_scale = gtk_hscale_new (GTK_ADJUSTMENT (param_adj)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), param_scale, "Set number of terms in the expansion for some indices; bandwidth for others", NULL); gtk_range_set_update_policy (GTK_RANGE (param_scale), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE (param_scale), 0); gtk_scale_set_value_pos (GTK_SCALE (param_scale), GTK_POS_BOTTOM); gtk_box_pack_start (GTK_BOX (param_vb), param_scale, true, true, 0); */ /* * Drawing area in a frame */ frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_box_pack_start (GTK_BOX (hbox), frame, true, true, 1); dsp->t2d_ppda = gtk_drawing_area_new (); gtk_widget_set_double_buffered(dsp->t2d_ppda, false); gtk_widget_set_size_request (GTK_WIDGET (dsp->t2d_ppda), WIDTH, HEIGHT); g_signal_connect (G_OBJECT (dsp->t2d_ppda), "configure_event", G_CALLBACK(t2d_ppda_configure_cb), (gpointer) dsp); g_signal_connect (G_OBJECT (dsp->t2d_ppda), "expose_event", G_CALLBACK(t2d_ppda_expose_cb), (gpointer) dsp); gtk_container_add (GTK_CONTAINER (frame), dsp->t2d_ppda); gtk_widget_show_all (dsp->t2d_window); /*-- Set the appropriate check menu items to true. -- dfs --*/ item = gtk_ui_manager_get_widget (manager, "/menubar/Options/ShowControls"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), true); } alloc_optimize0_p(&dsp->t2d_pp_op, d->nrows_in_plot, dsp->t2d.nactive, 2); alloc_pp(&dsp->t2d_pp_param, d->nrows_in_plot, dsp->t2d.nactive, 2); gtk_widget_show_all (dsp->t2d_window); } } ggobi-2.1.12/src/brushing.h0000644000175000017500000000505014651527764011147 /*-- brushing.h --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef BRUSH_H #define BRUSH_H #include #define NGLYPHTYPES 7 /* 0:6 */ #define NGLYPHSIZES 8 /* 0:7 */ #define NGLYPHS ((NGLYPHTYPES-1)*NGLYPHSIZES + 1) /* 0:48 */ #define OPEN 0 #define FILL 1 #define MAXNCOLORS 15 /* br_mode */ #define BR_PERSISTENT 0 #define BR_TRANSIENT 1 /* br_point_targets and br_edge_targets */ typedef enum { br_off, br_candg, br_color, br_glyph, br_shadow, br_unshadow } BrushTargetType; /* for binning the screen */ #define BRUSH_NBINS 20 #define BRUSH_MARGIN 10 #define BINBLOCKSIZE 50 #if 0 // Unused? /* br_linkby */ #define BR_LINKBYID 0 #define BR_LINKBYVAR 1 /* */ #endif /*-- for edge brushing: all sizes, 3 types for now --*/ #define NEDGETYPES 3 typedef enum {SOLID, WIDE_DASH, NARROW_DASH} EdgeType; /*-- --*/ typedef enum { RESET_EXCLUDE_SHADOW_POINTS, RESET_INCLUDE_SHADOW_POINTS, RESET_UNSHADOW_POINTS, RESET_EXCLUDE_SHADOW_EDGES, RESET_INCLUDE_SHADOW_EDGES, RESET_UNSHADOW_EDGES, RESET_INIT_BRUSH, RESET_POINT_COLORS, /* unused */ RESET_POINT_GLYPHS, /* unused */ RESET_EDGE_COLORS, /* unused */ RESET_EDGE_TYPES /* unused */ } BrushReset; typedef struct { gint x1, y1, x2, y2; } brush_coords; /* these data types seem to be missing in gdk */ typedef struct { gint x, y; gint width, height; } arcd; typedef struct { gint x, y; gint width, height; } rectd; typedef struct { guint n, nhidden, nshown; } symbol_cell; typedef struct { glong n, nshown, nhidden; gboolean hidden_p; gint glyphtype, glyphsize; gshort color; } clusterd; typedef struct { GtkWidget *da; /*-- buttons and labels for hide, show, complement --*/ GtkWidget *h_btn; /* hide */ GtkWidget *nh_lbl, *ns_lbl, *n_lbl; } clusteruid; /* structure for binning the plot window */ typedef struct { gulong *els; gint nels; gint nblocks; /* how many blocks have been allocated for els */ } bin_struct; /* row groups */ typedef struct { gint id, nels, *els; gboolean sampled; /* for subsetting */ } groupd; #endif ggobi-2.1.12/src/tour.h0000644000175000017500000000010214651527764010310 #ifndef TOUR_H #define TOUR_H #define MAX_TOUR_SPEED 100 #endif ggobi-2.1.12/src/pipeline.c0000644000175000017500000002424714651527764011137 /*-- pipeline.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include "vars.h" #include "externs.h" gfloat mean_largest_dist (gfloat **, gint *, gint, gfloat *, gfloat *, GGobiData *, ggobid *); gfloat median_largest_dist (gfloat **, gint *, gint, gfloat *, gfloat *, GGobiData *, ggobid *); /* ------------ Dynamic allocation, freeing section --------- */ void pipeline_init (GGobiData * d, ggobid * gg) { gint i; /*-- a handful of allocations and initializations --*/ pipeline_arrays_alloc (d, gg); for (i = 0; i < d->nrows; i++) { d->sampled.els[i] = true; d->excluded.els[i] = false; } /*-- maybe some points are tagged "hidden" in the data --*/ rows_in_plot_set (d, gg); /*-- some initializations --*/ edgeedit_init (gg); brush_init (d, gg); /*-- run the first half of the pipeline --*/ arrayf_copy (&d->raw, &d->tform); limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); /*-- does this do something here? --*/ vartable_stats_set (d); /*-- does this do something here? --*/ /* * If there are missings, they've been initialized with a value * of 0. Here, re-set that value to 15% below the minimum for each * variable. (dfs -- done at Di's request, September 2004) */ if (ggobi_data_has_missings(d)) { gint j; gint *vars = (gint *) g_malloc(d->ncols * sizeof(gint)); for (j = 0; j < d->ncols; j++) vars[j] = j; impute_fixed (IMP_BELOW, 15.0, d->ncols, vars, d, gg); limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); g_free(vars); } tform_to_world (d, gg); } /* * Dynamically free arrays used in data pipeline. */ void pipeline_arrays_free (GGobiData * d, ggobid * gg) { arrayf_free (&d->tform, 0, 0); arrayg_free (&d->world, 0, 0); arrayg_free (&d->jitdata, 0, 0); /*-- should these be freed here as well? --*/ vectori_free (&d->clusterid); vectori_free (&d->rows_in_plot); vectorb_free (&d->sampled); vectorb_free (&d->excluded); } /* * Dynamically allocate arrays. */ void pipeline_arrays_alloc (GGobiData * d, ggobid * gg) { gint nc = d->ncols, nr = d->nrows; if (d->tform.vals != NULL) pipeline_arrays_free (d, gg); arrayf_alloc (&d->tform, nr, nc); arrayg_alloc (&d->world, nr, nc); arrayg_alloc_zero (&d->jitdata, nr, nc); vectori_alloc (&d->rows_in_plot, nr); vectorb_alloc (&d->sampled, nr); vectorb_alloc (&d->excluded, nr); } void pipeline_arrays_check_dimensions (GGobiData * d) { gint n; /*-- d->raw --*/ if (d->raw.ncols < d->ncols) arrayf_add_cols (&d->raw, d->ncols); if (d->raw.nrows < d->nrows) arrayf_add_rows (&d->raw, d->nrows); /*-- d->tform --*/ if (d->tform.ncols < d->ncols) arrayf_add_cols (&d->tform, d->ncols); if (d->tform.nrows < d->nrows) arrayf_add_rows (&d->tform, d->nrows); /*-- d->world --*/ if (d->world.ncols < d->ncols) arrayg_add_cols (&d->world, d->ncols); if (d->world.nrows < d->nrows) arrayg_add_rows (&d->world, d->nrows); /*-- d->jitdata --*/ if (d->jitdata.ncols < d->ncols) { gint i, j, nc = d->jitdata.ncols; arrayg_add_cols (&d->jitdata, d->ncols); for (j = nc; j < d->ncols; j++) { for (i = 0; i < d->nrows; i++) d->jitdata.vals[i][j] = 0; } } if (d->jitdata.nrows < d->nrows) arrayg_add_rows (&d->jitdata, d->nrows); if ((n = d->sampled.nels) < d->nrows) { gint i; /*-- include any new rows in the sample -- add to rows_in_plot? --*/ vectorb_realloc (&d->sampled, d->nrows); for (i = n; i < d->nrows; i++) d->sampled.els[i] = true; } if ((n = d->excluded.nels) < d->nrows) { gint i; /*-- don't excluded new rows --*/ vectorb_realloc (&d->excluded, d->nrows); for (i = n; i < d->nrows; i++) d->excluded.els[i] = false; } /*-- d->rows_in_plot --*/ if (d->rows_in_plot.nels < d->nrows) vectori_realloc (&d->rows_in_plot, d->nrows); } /*-------------------------------------------------------------------------*/ /* pipeline */ /*-------------------------------------------------------------------------*/ gfloat median_largest_dist (gfloat ** vals, gint * cols, gint ncols, gfloat * min, gfloat * max, GGobiData * d, ggobid * gg) { /* * Find the minimum and maximum values of each variable, * scaling by median and largest distance */ gint i, j, k, n, np; gdouble dx, sumdist, lgdist = 0.0; gfloat *x, fmedian; gdouble dmedian = 0; np = ncols * d->nrows_in_plot; x = (gfloat *) g_malloc (np * sizeof (gfloat)); for (n = 0; n < ncols; n++) { j = cols[n]; for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; x[n * d->nrows_in_plot + i] = vals[k][j]; } } qsort ((void *) x, np, sizeof (gfloat), fcompare); dmedian = ((np % 2) != 0) ? x[(np - 1) / 2] : (x[np / 2 - 1] + x[np / 2]) / 2.; /* * Find the maximum of the sum of squared differences * from the mean over all rows */ for (i = 0; i < d->nrows_in_plot; i++) { sumdist = 0.0; for (j = 0; j < ncols; j++) { dx = (gdouble) vals[d->rows_in_plot.els[i]][cols[j]] - dmedian; sumdist += (dx * dx); } if (sumdist > lgdist) lgdist = sumdist; } lgdist = sqrt (lgdist); g_free ((gchar *) x); fmedian = (gfloat) dmedian; *min = fmedian - lgdist; *max = fmedian + lgdist; return fmedian; } gfloat mean_largest_dist (gfloat ** vals, gint * cols, gint ncols, gfloat * min, gfloat * max, GGobiData * d, ggobid * gg) { /* * Find the minimum and maximum values of each variable, * scaling by mean and largest distance */ gint i, j; gdouble dx, sumxi, mean, sumdist, lgdist = 0.0; /* * Find the overall mean for the columns */ sumxi = 0.0; for (j = 0; j < ncols; j++) { for (i = 0; i < d->nrows_in_plot; i++) { dx = (gdouble) vals[d->rows_in_plot.els[i]][cols[j]]; sumxi += dx; } } mean = sumxi / (gdouble) d->nrows_in_plot / (gdouble) ncols; /* * Find the maximum of the sum of squared differences * from the mean over all rows */ for (i = 0; i < d->nrows_in_plot; i++) { sumdist = 0.0; for (j = 0; j < ncols; j++) { dx = (gdouble) vals[d->rows_in_plot.els[i]][cols[j]] - mean; sumdist += (dx * dx); } if (sumdist > lgdist) lgdist = sumdist; } lgdist = sqrt (lgdist); *min = mean - lgdist; *max = mean + lgdist; return mean; } void tform_to_world_by_var (gint j, GGobiData * d, ggobid * gg) { gint i, m; greal max, min, range, ftmp; gfloat precis = PRECISION1; vartabled *vt = vartable_element_get (j, d); pipeline_arrays_check_dimensions (d); /*-- realloc as necessary --*/ /* * This is excluding missings -- which we don't want for * scaling, but we do want for display, so some more thought * is needed, or maybe another set of limits. */ max = (greal) vt->lim.max; min = (greal) vt->lim.min; range = max - min; for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; ftmp = -1.0 + 2.0 * ((greal) d->tform.vals[m][j] - min) / range; d->world.vals[m][j] = (greal) (precis * ftmp); /* Add in the jitter values */ d->world.vals[m][j] += d->jitdata.vals[m][j]; } } void tform_to_world (GGobiData * d, ggobid * gg) { /* * Take tform.vals[][], one column at a time, and generate world[] */ gint j; for (j = 0; j < d->ncols; j++) tform_to_world_by_var (j, d, gg); } /*-------------------------------------------------------------------------*/ /* keeping rows_in_plot up to date */ /*-------------------------------------------------------------------------*/ /* * Combine the values in two arrays: * excluded[] (which comes from the exclusion panel or from linking) * sampled[] (which come from the subset panel) * to determine which cases should be plotted. * * rows_in_plot = sampled && !excluded */ void rows_in_plot_set (GGobiData * d, ggobid * gg) { gint i; GGobiDataClass *klass; gint nprev = d->nrows_in_plot; d->nrows_in_plot = 0; for (i = 0; i < d->nrows; i++) if (d->sampled.els[i] && !d->excluded.els[i]) d->rows_in_plot.els[d->nrows_in_plot++] = i; klass = GGOBI_DATA_GET_CLASS (d); g_signal_emit_by_name (G_OBJECT (d), "rows-in-plot-changed", 0, nprev, gg); return; /* (nprev == d->nrows_in_plot); */ } /*-------------------------------------------------------------------------*/ /* reverse pipeline */ /*-------------------------------------------------------------------------*/ /* XXX duncan and dfs: you need to sort this out void world_to_raw_by_var (gint pt, gint j, displayd *display, GGobiData *d, ggobid *gg) { gfloat precis = PRECISION1; gfloat ftmp, rdiff; gfloat x; vartabled *vt = vartable_element_get (j, d); rdiff = vt->lim.max - vt->lim.min; ftmp = (gfloat) (d->world.vals[pt][j] - d->jitdata.vals[pt][j]) / precis; x = (ftmp + 1.0) * .5 * rdiff; x += vt->lim.min; d->raw.vals[pt][j] = d->tform.vals[pt][j] = x; } */ /* * allow the reverse pipeline only for * scatterplots in xyplot mode * the splotd members of a scatmat that are xyplots. */ /* XXX duncan and dfs: you need to sort this out void world_to_raw (gint pt, splotd *sp, GGobiData *d, ggobid *gg) { displayd *display = (displayd *) sp->displayptr; if(GGOBI_IS_EXTENDED_DISPLAY(display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_CLASS(GTK_OBJECT(display)->klass); if(klass->world_to_raw) klass->world_to_raw(display, sp, pt, d, gg); } } */ ggobi-2.1.12/src/varchange.c0000644000175000017500000002326114651527764011263 /* varchange.c: add or delete variables, including cloning */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include "vars.h" #include "externs.h" #include "vartable.h" const double AddVarRowNumbers = -1.0; const double AddVarBrushGroup = -1.0; void tour_realloc_up (GGobiData *d, gint nc); static void addvar_vartable_expand (GGobiData * d, gint ncols) { gint j; for (j = d->ncols; j < d->ncols + ncols; j++) { /*-- allocate the new vartable element, initialize with default values --*/ vartabled *vt = vartable_element_new (d); transform_values_init (vt); } } /*-- specific adding variables --*/ static void addvar_pipeline_realloc (GGobiData * d) { /*-- realloc pipeline arrays --*/ arrayf_add_cols (&d->raw, d->ncols); arrayf_add_cols (&d->tform, d->ncols); tour_realloc_up (d, d->ncols); missing_arrays_add_cols (d); } // displays should eventually listen to pipeline themselves void tour_realloc_up (GGobiData *d, gint nc) { g_return_if_fail(GGOBI_IS_GGOBI(d->gg)); ggobid *gg = d->gg; displayd *dsp; GList *l; for (l=gg->displays; l; l=l->next) { GGobiExtendedDisplayClass *klass; dsp = (displayd *) l->data; if(!GGOBI_IS_EXTENDED_DISPLAY(dsp)) continue; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS(dsp); if(klass->tourcorr_realloc) klass->tourcorr_realloc(dsp, nc, d); if(klass->tour2d3_realloc) klass->tour2d3_realloc(dsp, nc, d); if(klass->tour2d_realloc) klass->tour2d_realloc(dsp, nc, d); if(klass->tour1d_realloc) klass->tour1d_realloc(dsp, nc, d); } } /* XXX this routine just should not exist. The appropriate elements should be responding to the variable_added routine. But that could be messy, too, because they have to respond in a particular order .. Oh man ... g_signal_connect (G_OBJECT (gg), "variable_added", G_CALLBACK (variable_notebook_varchange_cb), GTK_OBJECT (notebook)); void variable_notebook_varchange_cb (ggobid *gg, vartabled *vt, gint which, GGobiData *data, void *notebook) */ void addvar_propagate (gint ncols_prev, gint ncols_added, GGobiData * d) { gint j, jvar; for (j = 0; j < ncols_added; j++) { jvar = ncols_prev + j; /*-- its new index --*/ /*-- update the tree_view widget (the visible table) --*/ vartable_row_append (jvar, d); /*-- append empty --*/ vartable_cells_set_by_var (jvar, d); /*-- then populate --*/ } /*-- in case some datad now has variables and it didn't before --*/ g_return_if_fail(GGOBI_IS_GGOBI(d->gg)); display_menu_build (d->gg); } /* FIXME: all this stuff should be moved into the GGobiData API, so that datad allocation, in particular, is encapsulated. */ void newvar_add_with_values (gdouble * vals, gint nvals, gchar * vname, vartyped type, /*-- if categorical, we need ... --*/ gint nlevels, gchar ** level_names, gint * level_values, gint * level_counts, GGobiData * d) { gint i; gint d_ncols_prev = d->ncols; gint jvar = d_ncols_prev; vartabled *vt; g_return_if_fail(GGOBI_IS_GGOBI(d->gg)); if (nvals != d->nrows && d->ncols > 0) return; d->ncols += 1; if (d->ncols == 1) { // lazily allocate datad d->nrows = nvals; pipeline_init (d, d->gg); } else { addvar_pipeline_realloc (d); } /* Create a new element in the vartable list iff we need to. Otherwise use the one in the current position. */ if (jvar >= g_slist_length (d->vartable)) vartable_element_new (d); vt = vartable_element_get (jvar, d); if (type == categorical) vartable_element_categorical_init (vt, nlevels, level_names, level_values, level_counts); transform_values_init (vt); for (i = 0; i < d->nrows; i++) { if (vals == &AddVarRowNumbers) { d->raw.vals[i][jvar] = d->tform.vals[i][jvar] = (gfloat) (i + 1); } else if (vals == &AddVarBrushGroup) { d->raw.vals[i][jvar] = d->tform.vals[i][jvar] = (gfloat) d->clusterid.els[i]; } else if (GGobiMissingValue && GGobiMissingValue (vals[i])) ggobi_data_set_missing(d, i, jvar); else d->raw.vals[i][jvar] = d->tform.vals[i][jvar] = (gfloat) vals[i]; } limits_set_by_var (d, jvar, true, true, d->gg->lims_use_visible); /*-- run the data through the head of the pipeline --*/ tform_to_world_by_var (jvar, d, d->gg); ggobi_data_set_col_name(d, jvar, vname); addvar_propagate (d_ncols_prev, 1, d); /* XXX be careful: this could be emitted before the variable type is set. */ /*-- emit variable_added signal --*/ //FIXME: send variable index instead of vartable g_signal_emit (G_OBJECT (d->gg), GGobiSignals[VARIABLE_ADDED_SIGNAL], 0, vt, d->ncols - 1, d); } void clone_vars (gint * cols, gint ncols, GGobiData * d) { gint i, k, n, jvar; gint d_ncols_prev = d->ncols; vartabled *vt; g_return_if_fail(GGOBI_IS_GGOBI(d->gg)); addvar_vartable_expand (d, ncols); /* * Be extremely careful here: make sure that d->ncols is * incremented in the right place. A problem in this sequence * just made me chase mysterious bugs for two days. */ d->ncols += ncols; addvar_pipeline_realloc (d); for (k = 0; k < ncols; k++) { n = cols[k]; /*-- variable being cloned --*/ jvar = d_ncols_prev + k; /*-- its new index --*/ /*-- copy the data --*/ for (i = 0; i < d->nrows; i++) d->raw.vals[i][jvar] = d->tform.vals[i][jvar] = d->tform.vals[i][n]; /*-- update the vartable struct --*/ vartable_copy_var (n, jvar, d); transform_values_copy (n, jvar, d); } addvar_propagate (d_ncols_prev, ncols, d); for (k = 0; k < ncols; k++) { n = cols[k]; vt = vartable_element_get (n, d); /*-- emit variable_added signal. Is n the correct index? --*/ g_signal_emit (G_OBJECT (d->gg), GGobiSignals[VARIABLE_ADDED_SIGNAL], 0, vt, n, d); } } static gint is_variable_plotted (gint * cols, gint ncols, GGobiData * d) { GList *dlist; displayd *display; gint jplotted = -1; if (!GGOBI_IS_GGOBI(d->gg)) return 0; /*-- check each display for each variable --*/ for (dlist = d->gg->displays; dlist; dlist = dlist->next) { display = (displayd *) dlist->data; if (display->d != d) continue; if (jplotted >= 0) break; if (GGOBI_IS_EXTENDED_DISPLAY (display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display); jplotted = klass->variable_plotted_p (display, cols, ncols, d); } } return jplotted; } gboolean delete_vars (gint * cols, gint ncols, GGobiData * d) { gint j; gint *keepers, nkeepers; vartabled *vt; if (!GGOBI_IS_GGOBI(d->gg)) return false; /*-- don't allow all variables to be deleted --*/ if (ncols >= d->ncols) return false; /* * If one of the variables to be deleted is currently plotted, * we won't proceed until the user cleans up. */ if ((j = is_variable_plotted (cols, ncols, d)) != -1) { gchar *message; message = g_strdup_printf ("Deletion failed; the variable '%s' is currently plotted\n", ggobi_data_get_col_name(d, j)); quick_message (message, false); g_free (message); return false; } keepers = g_malloc ((d->ncols - ncols) * sizeof (gint)); nkeepers = find_keepers (d->ncols, ncols, cols, keepers); if (nkeepers == -1) { g_free (keepers); return false; } if (d->vartable_tree_view[real] != NULL) { for (j = 0; j < ncols; j++) { GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_indices (cols[j], -1); vt = vartable_element_get (cols[j], d); model = gtk_tree_view_get_model (GTK_TREE_VIEW (d->vartable_tree_view[vt->vartype])); gtk_tree_model_get_iter (model, &iter, path); gtk_list_store_remove (GTK_LIST_STORE (model), &iter); gtk_tree_path_free (path); } } for (j = 0; j < ncols; j++) { vartable_element_remove (cols[j], d); } /*-- delete columns from pipeline arrays --*/ arrayf_delete_cols (&d->raw, ncols, cols); arrayf_delete_cols (&d->tform, ncols, cols); tour2d_realloc_down (ncols, cols, d, d->gg); tour1d_realloc_down (ncols, cols, d, d->gg); tourcorr_realloc_down (ncols, cols, d, d->gg); arrays_delete_cols (&d->missing, ncols, cols); arrayg_delete_cols (&d->jitdata, ncols, cols); /*-- reallocate the rest of the arrays --*/ arrayg_alloc (&d->world, d->nrows, nkeepers); /*-- delete checkboxes --*/ for (j = ncols - 1; j >= 0; j--) { varpanel_delete_nth (cols[j], d); } /*-- delete variable circles --*/ for (j = ncols - 1; j >= 0; j--) { varcircles_delete_nth (cols[j], d); } d->ncols -= ncols; /*-- emit a single variable_list_changed signal when finished --*/ /*-- doesn't need to give a variable index any more, really --*/ g_signal_emit (G_OBJECT (d->gg), GGobiSignals[VARIABLE_LIST_CHANGED_SIGNAL], 0, d); /*-- run the first part of the pipeline --*/ tform_to_world (d, d->gg); g_free (keepers); return true; } ggobi-2.1.12/src/parcoords_ui.c0000644000175000017500000002020314651527764012007 /*-- parcoords_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /*----------------------------------------------------------------------*/ /* Callbacks */ /*----------------------------------------------------------------------*/ static void ash_smoothness_cb (GtkAdjustment * adj, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; cpanel->p1d.nASHes = (gint) ((gfloat) cpanel->p1d.nbins * (adj->value / 2.0)); display_tailpipe (gg->current_display, FULL, gg); } static gchar *arrangement_lbl[] = { "Row", "Column" }; static void arrangement_cb (GtkWidget * w, ggobid * gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); if (indx != gg->current_display->cpanel.parcoords_arrangement) parcoords_reset_arrangement (gg->current_display, indx, gg); gg->current_display->cpanel.parcoords_arrangement = indx; } static gchar *type_lbl[] = { "Texturing", "ASH", "Dotplot" }; static void type_cb (GtkWidget * w, ggobid * gg) { cpaneld *cpanel; cpanel = &gg->current_display->cpanel; cpanel->p1d.type = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); display_tailpipe (gg->current_display, FULL, gg); } /* static gchar *showcases_lbl[] = {"All", "Labelled"}; static void showcases_cb (GtkWidget *w, gpointer cbd) { gint indx = GPOINTER_TO_INT (cbd); g_printerr ("cbd: %s\n", showcases_lbl[indx]); } static gchar *varscale_lbl[] = {"Common", "Independent"}; static void varscale_cb (GtkWidget *w, gpointer cbd) { gint indx = GPOINTER_TO_INT (cbd); g_printerr ("cbd: %s\n", varscale_lbl[indx]); } */ /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ GtkWidget * cpanel_parcoords_make (ggobid * gg) { modepaneld *panel; GtkWidget *vbox, *vb, *lbl, *sbar, *opt; GtkObject *adj; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup ("PCPLOT"); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /* * arrangement of plots, row or column */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Plot _arrangement:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), opt); gtk_widget_set_name (opt, "PCPLOT:sel_mode_option_menu"); //gtk_container_set_border_width (GTK_CONTAINER (opt), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "When opening a new parallel coordinates display, arrange the 1d plots in a row or a column", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_combo_box (opt, arrangement_lbl, G_N_ELEMENTS (arrangement_lbl), G_CALLBACK (arrangement_cb), gg); /* * option menu */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Sp_reading method:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Display either textured dot plots or average shifted histograms", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_combo_box (opt, type_lbl, G_N_ELEMENTS (type_lbl), G_CALLBACK (type_cb), gg); /*-- this should be set to the value of cpanel->p1d_type --*/ gtk_combo_box_set_active (GTK_COMBO_BOX (opt), DOTPLOT); /* * ASH smoothness */ vbox = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vbox, false, false, 0); lbl = gtk_label_new_with_mnemonic ("ASH s_moothness:"), gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vbox), lbl, false, false, 0); adj = gtk_adjustment_new (0.19, 0.02, 0.5, 0.01, .01, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (ash_smoothness_cb), gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), sbar); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust ASH smoothness", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vbox), sbar, false, false, 1); /* * show cases: label and option menu */ /* vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), vb, false, false, 0); lbl = gtk_label_new ("Show cases:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); opt = gtk_option_menu_new (); gtk_container_set_border_width (GTK_CONTAINER (opt), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Show all visible cases, or show only labelled cases", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_option_menu (opt, showcases_lbl, sizeof (showcases_lbl) / sizeof (gchar *), G_CALLBACK(showcases_cb), "GGobi", gg); */ /* * Variable scales */ /* vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (vbox), vb, false, false, 0); lbl = gtk_label_new ("Scales:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); opt = gtk_option_menu_new (); gtk_container_set_border_width (GTK_CONTAINER (opt), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Scale variables (and variable groups) on a common scale, or independently", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_option_menu (opt, varscale_lbl, sizeof (varscale_lbl) / sizeof (gchar *), G_CALLBACK(varscale_cb), "GGobi", gg); */ gtk_widget_show_all (panel->w); return (panel->w); } /*--------------------------------------------------------------------*/ /* Resetting the main menubar */ /*--------------------------------------------------------------------*/ static const gchar *mode_ui_str = "" " " " " " " " " " " " " " " " " ""; const gchar * parcoords_mode_ui_get (displayd * dsp) { return (mode_ui_str); } /* The useIds indicates whether the callback data should be integers identifying the menu item or the global gg. At present, this is always false. See scatmat_mode_menu_make and scatterplot_mode_menu_make. */ /*--------------------------------------------------------------------*/ /* End of main menubar section */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Control panel updating */ /*--------------------------------------------------------------------*/ /*-- there already exists parcoords_cpanel_init --*/ void cpanel_parcoords_set (displayd * display, cpaneld * cpanel, GtkWidget * panel, ggobid * gg) { } ggobi-2.1.12/src/lineedit_ui.c0000644000175000017500000004702514651527764011623 /* lineedit_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" static gchar *tip_edges = "Click and drag between\npoints to add edges.\nRight-click and drag\nfor more options."; static gchar *tip_points = "Click to add points.\nRight-click for more\noptions."; /*--------------------------------------------------------------------*/ /* Dialog for adding records */ /*--------------------------------------------------------------------*/ static void add_record_dialog_cancel (GtkWidget * w, ggobid * gg) { GtkWidget *dialog = gtk_widget_get_toplevel (w); gboolean rval = false; gg->edgeedit.a = -1; gtk_widget_destroy (dialog); edgeedit_event_handlers_toggle (gg->current_splot, true); g_signal_emit_by_name (G_OBJECT (gg->current_splot->da), "expose_event", (gpointer) gg, (gpointer) & rval); } static void add_record_dialog_apply (GtkWidget * w, displayd * display) { gint j; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; GGobiData *e = display->e; ggobid *gg = d->gg; GtkWidget *dialog = gtk_widget_get_toplevel (w); GtkWidget *label_entry, *id_entry; gchar *label = NULL, *id = NULL; gchar **vals = NULL; GGobiData *dtarget; dtarget = (cpanel->ee_mode == ADDING_EDGES) ? e : d; if (dtarget->ncols) { GList *list; GtkTableChild *child; GtkWidget *entry; gchar *lbl; GtkWidget *table = widget_find_by_name (GTK_DIALOG (dialog)->vbox, "EE:tablev"); vals = (gchar **) g_malloc (d->ncols * sizeof (gchar *)); for (list = GTK_TABLE (table)->children; list; list = list->next) { child = (GtkTableChild *) list->data; if (child->left_attach == 1) { entry = child->widget; lbl = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); vals[child->top_attach] = g_strdup (lbl); } } } if ((label_entry = widget_find_by_name (GTK_DIALOG (dialog)->vbox, "EE:rowlabel"))) { label = gtk_editable_get_chars (GTK_EDITABLE (label_entry), 0, -1); } if ((id_entry = widget_find_by_name (GTK_DIALOG (dialog)->vbox, "EE:recordid"))) { id = gtk_editable_get_chars (GTK_EDITABLE (id_entry), 0, -1); } if (cpanel->ee_mode == ADDING_EDGES) { /*-- Add the new edge to e --*/ record_add (cpanel->ee_mode, gg->edgeedit.a, d->nearest_point, label, id, vals, d, e, gg); } else if (cpanel->ee_mode == ADDING_POINTS) { record_add (cpanel->ee_mode, -1, -1, label, id, vals, d, e, gg); } if (vals) { for (j = 0; j < d->ncols; j++) g_free (vals[j]); g_free (vals); } gg->edgeedit.a = -1; gtk_widget_destroy (dialog); edgeedit_event_handlers_toggle (gg->current_splot, true); } static void add_record_dialog_open (GGobiData * d, GGobiData * e, displayd * dsp, ggobid * gg) { GtkWidget *dialog, *table; GtkWidget *entry, *w; gchar *lbl; cpaneld *cpanel = &dsp->cpanel; /* GtkAttachOptions table_opt = GTK_SHRINK|GTK_FILL|GTK_EXPAND; */ GtkAttachOptions table_opt = GTK_SHRINK; gint row = 0; GGobiData *dtarget; edgeedit_event_handlers_toggle (gg->current_splot, false); if (cpanel->ee_mode == ADDING_EDGES) dtarget = e; else dtarget = d; dialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (dialog), "Add a Record"); table = gtk_table_new (5, 2, false); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table, false, false, 5); w = gtk_label_new ("Record number"); gtk_misc_set_alignment (GTK_MISC (w), 1, .5); gtk_table_attach (GTK_TABLE (table), w, 0, 1, row, row + 1, table_opt, table_opt, 1, 1); lbl = g_strdup_printf ("%d", dtarget->nrows); w = gtk_label_new (lbl); gtk_misc_set_alignment (GTK_MISC (w), .5, .5); gtk_table_attach (GTK_TABLE (table), w, 1, 2, row, row + 1, table_opt, table_opt, 1, 1); g_free (lbl); row++; if (cpanel->ee_mode == ADDING_EDGES) { w = gtk_label_new ("Edge source"); gtk_misc_set_alignment (GTK_MISC (w), 1, .5); gtk_table_attach (GTK_TABLE (table), w, 0, 1, row, row + 1, table_opt, table_opt, 1, 1); /* This label should include both the rowlab and the rowId */ lbl = (gchar *) g_array_index (d->rowlab, gchar *, gg->edgeedit.a); w = gtk_label_new (lbl); gtk_misc_set_alignment (GTK_MISC (w), .5, .5); gtk_table_attach (GTK_TABLE (table), w, 1, 2, row, row + 1, table_opt, table_opt, 1, 1); row++; w = gtk_label_new ("Edge destination"); gtk_misc_set_alignment (GTK_MISC (w), 1, .5); gtk_table_attach (GTK_TABLE (table), w, 0, 1, row, row + 1, table_opt, table_opt, 1, 1); lbl = (gchar *) g_array_index (d->rowlab, gchar *, d->nearest_point); w = gtk_label_new (lbl); gtk_misc_set_alignment (GTK_MISC (w), .5, .5); gtk_table_attach (GTK_TABLE (table), w, 1, 2, row, row + 1, table_opt, table_opt, 1, 1); row++; } w = gtk_label_new_with_mnemonic ("Record _label"); gtk_misc_set_alignment (GTK_MISC (w), 1, .5); gtk_table_attach (GTK_TABLE (table), w, 0, 1, row, row + 1, table_opt, table_opt, 1, 1); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget (GTK_LABEL (w), entry); lbl = g_strdup_printf ("%d", dtarget->nrows + 1); gtk_entry_set_text (GTK_ENTRY (entry), lbl); g_free (lbl); gtk_widget_set_name (entry, "EE:rowlabel"); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, row, row + 1, table_opt, table_opt, 1, 1); row++; if ((cpanel->ee_mode == ADDING_POINTS && d->idTable) || (cpanel->ee_mode == ADDING_EDGES && e->idTable)) { w = gtk_label_new_with_mnemonic ("Record _id"); gtk_misc_set_alignment (GTK_MISC (w), 1, .5); gtk_table_attach (GTK_TABLE (table), w, 0, 1, row, row + 1, table_opt, table_opt, 1, 1); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget (GTK_LABEL (w), entry); lbl = g_strdup_printf ("%d", dtarget->nrows + 1); gtk_entry_set_text (GTK_ENTRY (entry), lbl); g_free (lbl); gtk_widget_set_name (entry, "EE:recordid"); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, row, row + 1, table_opt, table_opt, 1, 1); row++; } /*-- Another table to contain variable name-value pairs --*/ if (dtarget->ncols) { gint j; GtkWidget *tablev; gchar **vals = (gchar **) g_malloc (dtarget->ncols * sizeof (gchar *)); extern void fetch_default_record_values (gchar ** vals, GGobiData *, displayd *, ggobid * gg); fetch_default_record_values (vals, dtarget, dsp, gg); tablev = gtk_table_new (dtarget->ncols, 2, false); gtk_widget_set_name (tablev, "EE:tablev"); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tablev, false, false, 5); for (j = 0; j < dtarget->ncols; j++) { w = gtk_label_new (ggobi_data_get_col_name(d, j)); gtk_table_attach (GTK_TABLE (tablev), w, 0, 1, j, j + 1, table_opt, table_opt, 1, 1); entry = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (entry), vals[j]); gtk_table_attach (GTK_TABLE (tablev), entry, 1, 2, j, j + 1, table_opt, table_opt, 1, 1); } /* free vals, I think */ for (j = 0; j < dtarget->ncols; j++) g_free (vals[j]); g_free (vals); } /*-- ok button --*/ w = gtk_button_new_from_stock (GTK_STOCK_APPLY); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), w, "Add the point or edge. To avoid seeing this dialog, use the left button.", NULL); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (add_record_dialog_apply), dsp); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), w); /*-- cancel button --*/ w = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect (G_OBJECT (w), "clicked", G_CALLBACK (add_record_dialog_cancel), gg); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), w); gtk_widget_show_all (dialog); } /*--------------------------------------------------------------------*/ /* Respond to buttons and menus in the panel */ /*--------------------------------------------------------------------*/ static void add_edges_or_points_cb (GtkToggleButton * button, ggobid * gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; GtkWidget *panel = mode_panel_get_by_name (GGOBI (getIModeName) (EDGEED), gg); GtkWidget *w; w = widget_find_by_name (panel, "EDGEEDIT:tip_label"); if (button->active) { cpanel->ee_mode = ADDING_EDGES; splot_cursor_unset (gg->current_splot); gtk_label_set_text (GTK_LABEL (w), tip_edges); } else { cpanel->ee_mode = ADDING_POINTS; splot_cursor_set (GDK_CROSSHAIR, gg->current_splot); gtk_label_set_text (GTK_LABEL (w), tip_points); } } /*--------------------------------------------------------------------*/ /* Handling and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- handle the keys for setting the mode and launching generic events --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ return false; } static gint motion_notify_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp) { displayd *display = sp->displayptr; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; ggobid *gg = GGobiFromSPlot (sp); gboolean button1_p, button2_p; gint k; if (cpanel->ee_mode == ADDING_EDGES) { mousepos_get_motion (w, event, &button1_p, &button2_p, sp); k = find_nearest_point (&sp->mousepos, sp, d, gg); d->nearest_point = k; if (k != d->nearest_point_prev) { if (gg->edgeedit.a == -1) { /*-- looking for starting point --*/ if (k != d->nearest_point_prev) displays_plot (NULL, QUICK, gg); } else { /*-- found starting point; looking for ending point --*/ displays_plot (NULL, QUICK, gg); /*-- add a dotted line from gg->edgeedit.a to gg->nearest_point --*/ } } d->nearest_point_prev = d->nearest_point; } else if (cpanel->ee_mode == ADDING_POINTS) { ; } return true; } static gint button_press_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); displayd *display = sp->displayptr; GGobiData *d = display->d; gboolean button1_p, button2_p; mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); gg->current_splot = sp->displayptr->current_splot = sp; gg->current_display = display; gg->edgeedit.a = d->nearest_point; return true; } static gint button_release_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); displayd *display = sp->displayptr; cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; GGobiData *e = display->e; gint i, which_button = 1; void record_add_defaults (GGobiData * d, GGobiData * e, displayd * display, ggobid * gg); if ((event->state & GDK_BUTTON1_MASK) == GDK_BUTTON1_MASK) which_button = 1; else if ((event->state & GDK_BUTTON2_MASK) == GDK_BUTTON2_MASK) which_button = 2; else if ((event->state & GDK_BUTTON3_MASK) == GDK_BUTTON3_MASK) which_button = 2; gg->buttondown = 0; sp->mousepos.x = (gint) event->x; sp->mousepos.y = (gint) event->y; /* * add the edge to display->e. If display->e is NULL, then * initialize it first. * * If record indices are in use, use them; if not, initialize * indices for display->d. */ if (cpanel->ee_mode == ADDING_EDGES) { if (d->nearest_point >= 0 && gg->edgeedit.a >= 0 && d->nearest_point != gg->edgeedit.a) { /*-- Add rowids to d if necessary --*/ if (d->rowIds == NULL) { gchar **rowids = (gchar **) g_malloc (d->nrows * sizeof (gchar *)); for (i = 0; i < d->nrows; i++) rowids[i] = g_strdup_printf ("%d", i); datad_record_ids_set (d, rowids, true); for (i = 0; i < d->nrows; i++) g_free (rowids[i]); g_free (rowids); } if (e == NULL) { /*-- initialize e, the new datad --*/ e = ggobi_data_new (0, 0); e->name = g_strdup ("edges"); /* Add it to the display */ /*setDisplayEdge (display, e); *//* doesn't work, actually */ display->e = e; display->options.edges_undirected_show_p = true; } if (which_button == 1) record_add_defaults (d, e, display, gg); else /*-- Open a dialog window to ask for label, rowId, data ... --*/ add_record_dialog_open (d, e, display, gg); } } else if (cpanel->ee_mode == ADDING_POINTS) { if (d->rowIds == NULL) { /*-- Add rowids to d --*//* duplicate code -- see edges */ gchar **rowids = (gchar **) g_malloc (d->nrows * sizeof (gchar *)); for (i = 0; i < d->nrows; i++) rowids[i] = g_strdup_printf ("%d", i); datad_record_ids_set (d, rowids, true); for (i = 0; i < d->nrows; i++) g_free (rowids[i]); g_free (rowids); gdk_pointer_ungrab (event->time); } if (which_button == 1) record_add_defaults (d, e, display, gg); else /*-- Open a dialog window to ask for label, rowId, data ... --*/ add_record_dialog_open (d, e, display, gg); } /*-- Release the pointer so the button press can be detected --*/ gdk_pointer_ungrab (event->time); return retval; } /*--------------------------------------------------------------------*/ /* Add and remove event handlers */ /*--------------------------------------------------------------------*/ void edgeedit_event_handlers_toggle (splotd * sp, gboolean state) { displayd *display = sp->displayptr; if (state == on) { if (GGOBI_IS_WINDOW_DISPLAY (display)) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window), "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK (button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK (button_release_cb), (gpointer) sp); sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (motion_notify_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); disconnect_motion_signal (sp); } } void cpanel_edgeedit_make (ggobid * gg) { modepaneld *panel; GtkWidget *vb, *radio1, *radio2, *w; GSList *group; // This should be in an init routine gboolean adding_edges = true; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup (GGOBI (getIModeName) (EDGEED)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /*-- Radio group in a box: add edges or points buttons --*/ vb = gtk_vbox_new (false, 1); gtk_container_set_border_width (GTK_CONTAINER (vb), 3); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); radio1 = gtk_radio_button_new_with_mnemonic (NULL, "Add _edges"); gtk_widget_set_name (radio1, "EDGEEDIT:add_edges_radio_button"); if (adding_edges) GTK_TOGGLE_BUTTON (radio1)->active = true; gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio1, "Add new edges using the mouse. The right or middle button opens a dialog window; the left button adds an edge using defaults.", NULL); g_signal_connect (G_OBJECT (radio1), "toggled", G_CALLBACK (add_edges_or_points_cb), gg); gtk_box_pack_start (GTK_BOX (vb), radio1, false, false, 0); group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio1)); radio2 = gtk_radio_button_new_with_mnemonic (group, "Add _points"); gtk_widget_set_name (radio2, "EDGEEDIT:add_points_radio_button"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio2, "Add points using the mouse. The right or button opens a dialog window; the left button adds a point using defaults.", NULL); gtk_box_pack_start (GTK_BOX (vb), radio2, false, false, 0); w = gtk_label_new (tip_edges); gtk_label_set_line_wrap (GTK_LABEL (w), true); gtk_box_pack_start (GTK_BOX (vb), w, false, false, 0); gtk_widget_set_name (w, "EDGEEDIT:tip_label"); /*-- Undo --*/ /* not implemented btn = gtk_button_new_with_label ("Undo"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Undo last action", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (undo_last_cb), NULL); */ gtk_widget_show_all (panel->w); } /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ void cpanel_edgeedit_init (cpaneld * cpanel, ggobid * gg) { cpanel->ee_mode = ADDING_EDGES; } void cpanel_edgeedit_set (displayd * display, cpaneld * cpanel, ggobid * gg) { GtkWidget *w; GtkWidget *panel = mode_panel_get_by_name (GGOBI (getIModeName) (EDGEED), gg); GtkWidget *lbl = widget_find_by_name (panel, "EDGEEDIT:tip_label"); /*-- set the Drag or Click radio buttons --*/ if (cpanel->ee_mode == ADDING_EDGES) { w = widget_find_by_name (panel, "EDGEEDIT:add_edges_radio_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), true); gtk_label_set_text (GTK_LABEL (lbl), tip_edges); } else { w = widget_find_by_name (panel, "EDGEEDIT:add_points_radio_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), true); gtk_label_set_text (GTK_LABEL (lbl), tip_points); } } /*--------------------------------------------------------------------*/ RedrawStyle edgeedit_activate (gboolean state, displayd * display, ggobid * gg) { cpaneld *cpanel = &display->cpanel; RedrawStyle redraw_style = QUICK; if (state) { if (cpanel->ee_mode == ADDING_POINTS) splot_cursor_set (GDK_CROSSHAIR, gg->current_splot); } else splot_cursor_unset (gg->current_splot); return redraw_style; } ggobi-2.1.12/src/scatmatClass.h0000644000175000017500000000507114651527764011753 /* scatmatClass.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef SCATMAT_CLASS_H #define SCATMAT_CLASS_H #include "ggobi.h" #define GGOBI_TYPE_SCATMAT_SPLOT (ggobi_scatmat_splot_get_type()) #define GGOBI_SCATMAT_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_SCATMAT_SPLOT, scatmatSPlotd)) #define GGOBI_SCATMAT_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_SCATMAT_SPLOT, GGobiScatmatSPlotClass)) #define GGOBI_IS_SCATMAT_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_SCATMAT_SPLOT)) #define GGOBI_IS_SCATMAT_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_SCATMAT_SPLOT)) #define GGOBI_SCATMAT_SPLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_SCATMAT_SPLOT, GGobiScatmatSPlotClass)) GType ggobi_scatmat_splot_get_type(void); typedef struct { GGobiExtendedSPlotClass parent_class; } GGobiScatmatSPlotClass; typedef struct { extendedSPlotd extendedSPlot; } scatmatSPlotd; #define GGOBI_TYPE_SCATMAT_DISPLAY (ggobi_scatmat_display_get_type ()) #define GGOBI_SCATMAT_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_SCATMAT_DISPLAY, scatmatDisplayd)) #define GGOBI_SCATMAT_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_SCATMAT_DISPLAY, GGobiScatmatDisplayClass)) #define GGOBI_IS_SCATMAT_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_SCATMAT_DISPLAY)) #define GGOBI_IS_SCATMAT_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_SCATMAT_DISPLAY)) #define GGOBI_SCATMAT_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_SCATMAT_DISPLAY, GGobiScatmatDisplayClass)) GType ggobi_scatmat_display_get_type(); displayd *ggobi_scatmat_display_new(gint type, gboolean missing_p, GGobiData *d, ggobid *gg); typedef struct { GGobiExtendedDisplayClass parent_class; } GGobiScatmatDisplayClass; typedef struct { extendedDisplayd extendedDpy; } scatmatDisplayd; void scatmatDisplayClassInit(GGobiScatmatDisplayClass *klass); void scatmatSPlotClassInit(GGobiScatmatSPlotClass *klass) ; #endif ggobi-2.1.12/src/display_ui.c0000644000175000017500000004003014651527764011460 /*-- display_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #include "plugin.h" void buildExtendedDisplayMenu (ggobid * gg, int nd, GGobiData * d0); void display_set_position (windowDisplayd * display, ggobid * gg) { gint x, y, width, height; gint posx, posy; /*-- get the size and position of the gg->main_window) --*/ gdk_window_get_root_origin (gg->main_window->window, &x, &y); gdk_window_get_size (gg->main_window->window, &width, &height); gtk_widget_realize (display->window); if (x == 0 && y == 0) { /*-- can't get any info for the first display --*/ posx = gdk_screen_width () / 4; posy = gdk_screen_height () / 4; } else { posx = x + (3 * width) / 4; posy = y + (3 * height) / 4; } gtk_window_move (GTK_WINDOW (display->window), posx, posy); } void display_menu_build (ggobid * gg) { gint nd; GGobiData *d0; GtkWidget *item; if (gg == NULL || gg->d == NULL) return; nd = ndatad_with_vars_get (gg); d0 = (GGobiData *) gg->d->data; if (gg->display_menu != NULL) gtk_widget_destroy (gg->display_menu); if (nd > 0) { gg->display_menu = gtk_menu_new (); if (g_slist_length (ExtendedDisplayTypes)) { buildExtendedDisplayMenu (gg, nd, d0); } } item = gtk_tearoff_menu_item_new (); gtk_menu_shell_prepend (GTK_MENU_SHELL (gg->display_menu), item); /* Experiment: move the DisplayTree to the Display menu -- dfs */ /* Add a separator before the mode-specific items */ CreateMenuItem (gg->display_menu, NULL, "", "", NULL, NULL, NULL, NULL, gg); item = gtk_menu_item_new_with_label ("Show Display Tree"); g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (show_display_tree_cb), (gpointer) gg); gtk_menu_shell_append (GTK_MENU_SHELL (gg->display_menu), item); if (sessionOptions->info != NULL) { pluginsUpdateDisplayMenu (gg, gg->pluginInstances); } /*-- these two lines replace gtk_menu_popup --*/ if (nd) { gtk_widget_show_all (gg->display_menu); gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (gg->main_menu_manager, "/menubar/Display")), gg->display_menu); } } void display_menu_init (ggobid * gg) { /* gg->display_menu_item = submenu_make ("_Display", 'D', gg->main_accel_group); gtk_widget_show (gg->display_menu_item); submenu_insert (gg->display_menu_item, gg->main_menubar, 1); */ } typedef struct { GGobiExtendedDisplayClass *klass; GGobiData *d; } ExtendedDisplayCreateData; static void extended_display_open_cb (GtkWidget * w, ExtendedDisplayCreateData * data) { ggobid *gg = data->d->gg; displayd *dpy; if (data->d->nrows == 0) return; splot_set_current (gg->current_splot, off, gg); if (data->klass->create) { dpy = data->klass->create (true, false, NULL, data->d, gg); } else if (data->klass->createWithVars) { gint *selected_vars, nselected_vars = 0; selected_vars = (gint *) g_malloc (data->d->ncols * sizeof (gint)); nselected_vars = selected_cols_get (selected_vars, data->d, gg); dpy = data->klass->createWithVars (true, false, nselected_vars, selected_vars, data->d, gg); g_free (selected_vars); } else { /* How to get the name of the class from the class! GTK_OBJECT_CLASS(gtk_type_name(data->klass)->type) Close.. */ g_printerr ("Real problems! An extended display (%s) without a create routine!\n", g_type_name (G_TYPE_FROM_CLASS (data->klass))); return; } if (!dpy) { g_printerr ("Failed to create display of type %s\n", data->klass->titleLabel); return; } display_add (dpy, gg); varpanel_refresh (dpy, gg); } void buildExtendedDisplayMenu (ggobid * gg, gint nd, GGobiData * d0) { gchar label[200], *lbl; GGobiExtendedDisplayClass *klass; GSList *el = ExtendedDisplayTypes; const gchar *desc; GtkWidget *item, *submenu, *anchor; gint k; ExtendedDisplayCreateData *cbdata; while (el) { klass = GGOBI_EXTENDED_DISPLAY_CLASS (el->data); desc = klass->titleLabel; sprintf (label, "New %s", desc); if (nd == 1) { cbdata = (ExtendedDisplayCreateData *) g_malloc (sizeof (ExtendedDisplayCreateData)); cbdata->d = d0; cbdata->klass = klass; item = CreateMenuItem (gg->display_menu, label, NULL, NULL, gg->main_menubar, gg->main_accel_group, G_CALLBACK (extended_display_open_cb), (gpointer) cbdata, gg); g_object_set_data (G_OBJECT (item), "missing_p", GINT_TO_POINTER (0)); } else { submenu = gtk_menu_new (); anchor = CreateMenuItem (gg->display_menu, label, NULL, NULL, gg->main_menubar, NULL, NULL, NULL, NULL); k = 0; for (k = 0; k < g_slist_length (gg->d); k++) { GGobiData *d = (GGobiData *) g_slist_nth_data (gg->d, k); /*-- add an item for each datad with variables --*/ if (g_slist_length (d->vartable) > 0) { lbl = ggobi_data_get_name (d); cbdata = (ExtendedDisplayCreateData *) g_malloc (sizeof (ExtendedDisplayCreateData)); cbdata->d = d; cbdata->klass = klass; item = CreateMenuItem (submenu, lbl, NULL, NULL, gg->display_menu, gg->main_accel_group, G_CALLBACK (extended_display_open_cb), cbdata, gg); g_object_set_data (G_OBJECT (item), "displaytype", (gpointer) klass); g_object_set_data (G_OBJECT (item), "missing_p", GINT_TO_POINTER (0)); g_free (lbl); } } gtk_menu_item_set_submenu (GTK_MENU_ITEM (anchor), submenu); } el = el->next; } } #if 0 // unused on 3/12/06 static void action_show_control_panel_cb (GtkAction * action, displayd * display) { show_display_control_panel (display); } #endif static void action_close_cb (GtkAction * action, displayd * display) { display_close (display); } static void action_exclude_shadowed_points_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_EXCLUDE_SHADOW_POINTS); } static void action_include_shadowed_points_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_INCLUDE_SHADOW_POINTS); } static void action_unshadow_all_points_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_UNSHADOW_POINTS); } static void action_exclude_shadowed_edges_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_EXCLUDE_SHADOW_EDGES); } static void action_include_shadowed_edges_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_INCLUDE_SHADOW_EDGES); } static void action_unshadow_all_edges_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_UNSHADOW_EDGES); } static void action_reset_brush_cb (GtkAction * action, displayd * display) { brush_reset (display, RESET_INIT_BRUSH); } static void action_reset_pan_cb (GtkAction * action, displayd * display) { scale_pan_reset (display); } static void action_reset_zoom_cb (GtkAction * action, displayd * display) { scale_zoom_reset (display); } static void action_toggle_scale_update_cb (GtkToggleAction * action, displayd * display) { scale_update_set (gtk_toggle_action_get_active (action), display, display->ggobi); } static void action_select_all_1d_cb (GtkAction * action, displayd * display) { tour1d_all_vars (display); } static void action_select_all_2d_cb (GtkAction * action, displayd * display) { tour2d_all_vars (display); } static void action_toggle_axes_cb (GtkToggleAction * action, displayd * display) { set_display_option (gtk_toggle_action_get_active (action), DOPT_AXES, display); } static void action_toggle_axes_labels_cb (GtkToggleAction * action, displayd * display) { set_display_option (gtk_toggle_action_get_active (action), DOPT_AXESLAB, display); } static void action_toggle_axes_vals_cb (GtkToggleAction * action, displayd * display) { set_display_option (gtk_toggle_action_get_active (action), DOPT_AXESVALS, display); } static void action_toggle_lines_cb (GtkToggleAction * action, displayd * display) { set_display_option (gtk_toggle_action_get_active (action), DOPT_WHISKERS, display); } static void action_toggle_points_cb (GtkToggleAction * action, displayd * display) { set_display_option (gtk_toggle_action_get_active (action), DOPT_POINTS, display); } static void action_toggle_fade_vars_1d_cb (GtkToggleAction * action, displayd * display) { tour1d_fade_vars (gtk_toggle_action_get_active (action), display->ggobi); } static void action_toggle_fade_vars_2d_cb (GtkToggleAction * action, displayd * display) { tour2d_fade_vars (gtk_toggle_action_get_active (action), display->ggobi); } static void action_toggle_fade_vars_co_cb (GtkToggleAction * action, displayd * display) { tourcorr_fade_vars (gtk_toggle_action_get_active (action), display->ggobi); } static void action_toggle_brush_update_cb (GtkToggleAction * action, displayd * display) { brush_update_set (gtk_toggle_action_get_active (action), display, display->ggobi); } static void action_toggle_brush_on_cb (GtkToggleAction * action, displayd * display) { brush_on_set (gtk_toggle_action_get_active (action), display, display->ggobi); } static GtkActionEntry disp_action_entries[] = { {"File", NULL, "_File"}, {"Close", GTK_STOCK_CLOSE, "_Close", "C", "Close this display", G_CALLBACK (action_close_cb)}, {"Options", NULL, "_Options", NULL, "Options for this display"}, /* imode brush specific */ {"Brush", NULL, "_Brush"}, {"ExcludeShadowedPoints", NULL, "E_xclude shadowed points", "X", "Exclude the points that are currently shadowed", G_CALLBACK (action_exclude_shadowed_points_cb) }, {"IncludeShadowedPoints", NULL, "_Include shadowed points", "I", "Include the points that are currently shadowed", G_CALLBACK (action_include_shadowed_points_cb) }, {"UnshadowAllPoints", NULL, "_Unshadow all points", "U", "Make all points unshadowed", G_CALLBACK (action_unshadow_all_points_cb) }, {"ExcludeShadowedEdges", NULL, "_Exclude shadowed edges", "E", "Exclude the edges that are shadowed", G_CALLBACK (action_exclude_shadowed_edges_cb) }, {"IncludeShadowedEdges", NULL, "Include s_hadowed edges", "H", "Include the edges that are shadowed", G_CALLBACK (action_include_shadowed_edges_cb) }, {"UnshadowAllEdges", NULL, "U_nshadow all edges", "N", "Make all edges unshadowed", G_CALLBACK (action_unshadow_all_edges_cb) }, {"ResetBrushSize", NULL, "_Reset brush", "R", "Reset the size of the brush", G_CALLBACK (action_reset_brush_cb) }, /* i-mode scale specific */ {"Scale", NULL, "_Scale"}, {"ResetPan", NULL, "Reset _pan", "P", "Return to initial position", G_CALLBACK (action_reset_pan_cb) }, {"ResetZoom", NULL, "Reset _zoom", "Z", "Return to initial zoom", G_CALLBACK (action_reset_zoom_cb) }, /* p-mode specific stuff - should move elsewhere */ {"Tour1D", NULL, "_Tour1D"}, {"SelectAllVariables1D", NULL, "_Select all variables", "S", "Select all variables for this 1D tour", G_CALLBACK (action_select_all_1d_cb) }, {"Tour2D", NULL, "_Tour2D"}, {"SelectAllVariables2D", NULL, "_Select all variables", "S", "Select all variables for this 2D tour", G_CALLBACK (action_select_all_2d_cb) }, {"CorrTour", NULL, "_Correlation Tour"} }; GtkActionGroup * display_default_actions_create (displayd * display) { GtkToggleActionEntry disp_t_action_entries[] = { {"ShowAxes", NULL, "Show _Axes", "A", "Toggle visibility of axes on this display", G_CALLBACK (action_toggle_axes_cb), display->options.axes_show_p}, {"ShowLines", NULL, "Show _Lines", "L", "Toggle visibility of lines on this display", G_CALLBACK (action_toggle_lines_cb), display->options.whiskers_show_p}, {"ShowPoints", NULL, "Show P_oints", "O", "Toggle visibility of points on this display", G_CALLBACK (action_toggle_points_cb), display->options.points_show_p}, {"ShowAxesLabels", NULL, "Show Axes _Labels", "L", "Toggle display of the axes labels", G_CALLBACK (action_toggle_axes_labels_cb), display->options.axes_label_p}, {"ShowAxesVals", NULL, "Show Projection _Vals", "V", "Toggle display of the projection values", G_CALLBACK (action_toggle_axes_vals_cb), display->options.axes_values_p}, {"FadeVariables1D", NULL, "_Fade Variables on Deselection", NULL, "Toggle whether variables fade on when de-selected from the 1D tour", G_CALLBACK (action_toggle_fade_vars_1d_cb), display->ggobi->tour1d.fade_vars}, {"FadeVariables2D", NULL, "_Fade Variables on Deselection", NULL, "Toggle whether variables fade on when de-selected from the 2D tour", G_CALLBACK (action_toggle_fade_vars_2d_cb), display->ggobi->tour2d.fade_vars}, {"FadeVariablesCo", NULL, "_Fade Variables on Deselection", NULL, "Toggle whether variables fade on when de-selected from the corr tour", G_CALLBACK (action_toggle_fade_vars_co_cb), display->ggobi->tourcorr.fade_vars}, /* i-mode specific */ /* I'm going to make these display-specific since they're on the display menu -- dfs */ {"UpdateBrushContinuously", NULL, "Update Brushing _Continuously", NULL, "Toggle whether the brush operates continuously", G_CALLBACK (action_toggle_brush_update_cb), display->cpanel.br.updateAlways_p}, /* i-mode specific */ {"BrushOn", NULL, "Brush _On", NULL, "Toggle whether the brush is active", G_CALLBACK (action_toggle_brush_on_cb), display->cpanel.br.brush_on_p}, {"UpdateContinuously", NULL, "Update _Continuously", NULL, "Toggle whether panning and zooming operates continuously", G_CALLBACK (action_toggle_scale_update_cb), display->cpanel.scale.updateAlways_p} }; GtkActionGroup *actions = gtk_action_group_new ("DisplayActions"); gtk_action_group_add_actions (actions, disp_action_entries, G_N_ELEMENTS (disp_action_entries), display); gtk_action_group_add_toggle_actions (actions, disp_t_action_entries, G_N_ELEMENTS (disp_t_action_entries), display); return (actions); } static const gchar *display_default_ui = "" " " " " " " " " " " ""; GtkUIManager * display_menu_manager_create (displayd * display) { GError *error = NULL; GtkUIManager *manager = gtk_ui_manager_new (); GtkActionGroup *disp_actions = display_default_actions_create (display); gtk_ui_manager_insert_action_group (manager, disp_actions, 0); g_object_unref (G_OBJECT (disp_actions)); gtk_ui_manager_add_ui_from_string (manager, display_default_ui, -1, &error); if (error) { g_message ("Could not add default display ui!"); g_error_free (error); } return (manager); } ggobi-2.1.12/src/.renderer-factory.gob.stamp0000644000175000017500000000000014651530127014273 ggobi-2.1.12/src/sp_plot_axes.c0000644000175000017500000004075714651527764012036 /* sp_plot_axes.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include "vars.h" #include "externs.h" #include "colorscheme.h" /*------------------------------------------------------------------------*/ /* draw tour axes */ /*------------------------------------------------------------------------*/ void splot_draw_tour_axes (splotd * sp, GdkDrawable * drawable, ggobid * gg) { gint j, k, ix, iy, nc; displayd *dsp = (displayd *) sp->displayptr; cpaneld *cpanel = &dsp->cpanel; gint proj = cpanel->pmode; GGobiData *d = dsp->d; gfloat dst, val; gint textheight = 0, textheight2; gchar *varlab, *varval; gint dawidth = sp->da->allocation.width; gint daheight = sp->da->allocation.height; gint axindent = 20; vartabled *vt; colorschemed *scheme = gg->activeColorScheme; PangoContext *ctx; PangoFontMetrics *metrics; PangoLayout *layout = gtk_widget_create_pango_layout (sp->da, NULL); PangoRectangle rect; #ifdef ENABLE_CAIRO cairo_t *cr; #endif if (!dsp->options.axes_show_p) return; #ifdef ENABLE_CAIRO cr = gdk_cairo_create (drawable); #endif ctx = gtk_widget_get_pango_context (sp->da); metrics = pango_context_get_metrics (ctx, pango_context_get_font_description (ctx), NULL); if (sp != NULL && sp->da != NULL && sp->da->window != NULL) { gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); switch (proj) { case TOUR1D: /*-- use string height to place the labels --*/ textheight = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + pango_font_metrics_get_descent (metrics)); /*-- draw vertical lines to mark the min and max positions --*/ gdk_draw_line (drawable, gg->plot_GC, dawidth / 4, daheight - textheight * d->ncols - 10, dawidth / 4, daheight); gdk_draw_line (drawable, gg->plot_GC, 3 * dawidth / 4, daheight - textheight * d->ncols - 10, 3 * dawidth / 4, daheight); gdk_gc_set_line_attributes (gg->plot_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); for (k = 0; k < dsp->t1d.nsubset; k++) { j = dsp->t1d.subset_vars.els[k]; ix = dawidth / 2 + (gint) (dsp->t1d.F.vals[0][j] * (gfloat) dawidth / 4); iy = daheight - 10 - (dsp->t1d.nsubset - 1 - k) * textheight; if (j == dsp->t1d_manip_var) #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &gg->vcirc_manip_color); #else gdk_gc_set_foreground (gg->plot_GC, &gg->vcirc_manip_color); #endif else #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &scheme->rgb_accent); #else gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); #endif #ifdef ENABLE_CAIRO cairo_move_to (cr, dawidth / 2, daheight - 10 - textheight / 2 - (dsp->t1d.nsubset - 1 - k) * textheight); cairo_line_to (cr, ix, iy - textheight / 2); cairo_stroke (cr); #else gdk_draw_line (drawable, gg->plot_GC, dawidth / 2, daheight - 10 - textheight / 2 - (dsp->t1d.nsubset - 1 - k) * textheight, ix, iy - textheight / 2); #endif /* * An experiment: add the labels only for those variables with * non-zero multipliers. Add them on the right if positive, on * the left if negative. */ if (ix != dawidth / 2) { vt = vartable_element_get (j, d); varlab = g_strdup_printf ("%s:%4.3f(%.2f)", ggobi_data_get_transformed_col_name(d, j), dsp->t1d.F.vals[0][j], vt->lim.max - vt->lim.min); layout_text (layout, varlab, &rect); gdk_draw_layout (drawable, gg->plot_GC, (ix > dawidth / 2) ? 3 * dawidth / 4 + 10 : dawidth / 4 - rect.width - 10, iy - rect.height, layout); g_free (varlab); } } gdk_gc_set_line_attributes (gg->plot_GC, 1, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); break; case TOUR2D3: /* draws circle */ #ifdef ENABLE_CAIRO cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_arc (cr, axindent + daheight / 8, 7 * daheight / 8 - axindent, daheight / 8, 0, 2 * M_PI); cairo_stroke (cr); #else gdk_draw_arc (drawable, gg->plot_GC, FALSE, axindent, 3 * daheight / 4 - axindent, dawidth / 4, daheight / 4, 0, 360 * 64); #endif /* draw the axes and labels */ for (k = 0; k < dsp->t2d3.nsubset; k++) { j = dsp->t2d3.subset_vars.els[k]; ix = dawidth / 8 + axindent + (gint) (dsp->t2d3.F.vals[0][j] * (gfloat) dawidth / 8); iy = daheight - axindent - (daheight / 8 + (gint) (dsp->t2d3.F.vals[1][j] * (gfloat) daheight / 8)); gdk_gc_set_line_attributes (gg->plot_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); if (j == dsp->t2d_manip_var) #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &gg->vcirc_manip_color); #else gdk_gc_set_foreground (gg->plot_GC, &gg->vcirc_manip_color); #endif else #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &scheme->rgb_accent); #else gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); #endif #ifdef ENABLE_CAIRO cairo_move_to (cr, daheight / 8 + axindent, daheight - daheight / 8 - axindent); cairo_line_to (cr, ix, iy); cairo_stroke (cr); #else gdk_draw_line (drawable, gg->plot_GC, dawidth / 8 + axindent, daheight - daheight / 8 - axindent, ix, iy); #endif if (abs (ix - axindent - dawidth / 8) > 5 || abs (iy + axindent - (daheight - daheight / 8)) > 5) { if (dsp->options.axes_label_p) { vt = vartable_element_get (j, d); varlab = g_strdup (vt->nickname); } else { varlab = g_strdup_printf ("%d", j + 1); } layout_text (layout, varlab, &rect); ix = ix - axindent - dawidth / 8; iy = iy - (daheight - daheight / 8 - axindent); dst = sqrt (ix * ix + iy * iy); ix = axindent + dawidth / 8 + (gint) ((gfloat) ix / dst * (gfloat) dawidth / 8); iy = daheight - axindent - daheight / 8 + (gint) ((gfloat) iy / dst * (gfloat) daheight / 8); if (ix < dawidth / 8 + axindent) ix -= rect.width; else ix += (rect.width / 2); if (iy < daheight - daheight / 8 - axindent) iy -= (rect.height); //else // iy += (rect.height); gdk_draw_layout (drawable, gg->plot_GC, ix, iy, layout); g_free (varlab); } /* Drawing the axes values now */ if (dsp->options.axes_values_p) { varval = g_strdup_printf ("%d:%4.3f,%4.3f", j + 1, dsp->t2d3.F.vals[0][j], dsp->t2d3.F.vals[1][j]); //if (k == 0) { layout_text (layout, varval, &rect); textheight2 = rect.height; //} ix = dawidth - rect.width - axindent; iy = daheight - (dsp->t2d3.nsubset - k) * textheight2 - axindent; gdk_draw_layout (drawable, gg->plot_GC, ix, iy, layout); g_free (varval); } } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); break; case TOUR2D: /* draws circle */ #ifdef ENABLE_CAIRO cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_arc (cr, axindent + daheight / 8, 7 * daheight / 8 - axindent, daheight / 8, 0, 2 * M_PI); cairo_stroke (cr); #else gdk_draw_arc (drawable, gg->plot_GC, FALSE, axindent, 3 * daheight / 4 - axindent, daheight / 4, daheight / 4, 0, 360 * 64); #endif /* draw the axes and labels */ for (k = 0; k < dsp->t2d.nsubset; k++) { j = dsp->t2d.subset_vars.els[k]; ix = daheight / 8 + axindent + (gint) (dsp->t2d.F.vals[0][j] * (gfloat) daheight / 8); iy = daheight - axindent - (daheight / 8 + (gint) (dsp->t2d.F.vals[1][j] * (gfloat) daheight / 8)); gdk_gc_set_line_attributes (gg->plot_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); if (j == dsp->t2d_manip_var) #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &gg->vcirc_manip_color); #else gdk_gc_set_foreground (gg->plot_GC, &gg->vcirc_manip_color); #endif else #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &scheme->rgb_accent); #else gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); #endif #ifdef ENABLE_CAIRO cairo_move_to (cr, daheight / 8 + axindent, daheight - daheight / 8 - axindent); cairo_line_to (cr, ix, iy); cairo_stroke (cr); #else gdk_draw_line (drawable, gg->plot_GC, daheight / 8 + axindent, daheight - daheight / 8 - axindent, ix, iy); #endif if (abs (ix - axindent - daheight / 8) > 5 || abs (iy + axindent - (daheight - daheight / 8)) > 5) { if (dsp->options.axes_label_p) { vt = vartable_element_get (j, d); varlab = g_strdup (vt->nickname); } else { varlab = g_strdup_printf ("%d", j + 1); } layout_text (layout, varlab, &rect); ix = ix - axindent - daheight / 8; iy = iy - (daheight - daheight / 8 - axindent); dst = sqrt (ix * ix + iy * iy); ix = axindent + daheight / 8 + (gint) ((gfloat) ix / dst * (gfloat) daheight / 8); iy = daheight - axindent - daheight / 8 + (gint) ((gfloat) iy / dst * (gfloat) daheight / 8); if (ix < daheight / 8 + axindent) ix -= rect.width; else ix += (rect.width / 2); if (iy < daheight - daheight / 8 - axindent) iy -= (rect.height); //else // iy += (rect.height); gdk_draw_layout (drawable, gg->plot_GC, ix, iy, layout); g_free (varlab); } /* Drawing the axes values now */ if (dsp->options.axes_values_p) { vt = vartable_element_get (j, d); varval = g_strdup_printf ("%d:%4.3f,%4.3f(%.2f)", j + 1, dsp->t2d.F.vals[0][j], dsp->t2d.F.vals[1][j], vt->lim.max - vt->lim.min); //if (k == 0) { layout_text (layout, varval, &rect); textheight2 = rect.height; //} ix = dawidth - rect.width - axindent; iy = daheight - (dsp->t2d.nsubset - k) * textheight2 - axindent; gdk_draw_layout (drawable, gg->plot_GC, ix, iy, layout); g_free (varval); } } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); break; case COTOUR: if (d->ncols < MIN_NVARS_FOR_COTOUR) break; nc = dsp->tcorr1.nsubset + dsp->tcorr2.nsubset; /*-- use string height to place the labels --*/ textheight = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + pango_font_metrics_get_descent (metrics)); /*-- draw vertical lines to mark the min and max positions --*/ gdk_draw_line (drawable, gg->plot_GC, dawidth / 4, daheight - textheight * nc - 10, dawidth / 4, daheight); gdk_draw_line (drawable, gg->plot_GC, 3 * dawidth / 4, daheight - textheight * nc - 10, 3 * dawidth / 4, daheight); /*-- draw horizontal lines to mark the min and max positions --*/ gdk_draw_line (drawable, gg->plot_GC, 0, daheight / 4, textheight * nc, daheight / 4); gdk_draw_line (drawable, gg->plot_GC, 0, 3 * daheight / 4, textheight * nc, 3 * daheight / 4); gdk_gc_set_line_attributes (gg->plot_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); k = 0; for (j = 0; j < d->ncols; j++) { if (!dsp->tcorr1.subset_vars_p.els[j] && !dsp->tcorr2.subset_vars_p.els[j]) continue; vt = vartable_element_get (j, d); if (dsp->tcorr1.subset_vars_p.els[j]) { val = (ABS (dsp->tcorr1.F.vals[0][j]) > .004) ? dsp->tcorr1.F.vals[0][j] : 0.0; varlab = g_strdup_printf ("%s:%3.2f,0", ggobi_data_get_transformed_col_name(d, j), val); } else { val = (ABS (dsp->tcorr2.F.vals[0][j]) > .004) ? dsp->tcorr2.F.vals[0][j] : 0.0; varlab = g_strdup_printf ("%s:0,%3.2f", ggobi_data_get_transformed_col_name(d, j), val); } /* horizontal */ ix = dawidth / 2 + (gint) (dsp->tcorr1.F.vals[0][j] * (gfloat) dawidth / 4); iy = daheight - 10 - (nc - k) * textheight; if (j == dsp->tc1_manip_var) #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &gg->vcirc_manip_color); #else gdk_gc_set_foreground (gg->plot_GC, &gg->vcirc_manip_color); #endif else #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &scheme->rgb_accent); #else gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); #endif #ifdef ENABLE_CAIRO cairo_move_to (cr, dawidth / 2, iy + rect.height / 2); cairo_line_to (cr, ix, iy + rect.height / 2); cairo_stroke (cr); #else gdk_draw_line (drawable, gg->plot_GC, dawidth / 2, iy + rect.height / 2, ix, iy + rect.height / 2); #endif gdk_gc_set_line_attributes (gg->plot_GC, 1, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); layout_text (layout, varlab, &rect); gdk_draw_layout (drawable, gg->plot_GC, dawidth / 2 + dawidth / 4 + 10, iy, layout); /* vertical */ ix = 10 + k * textheight; iy = daheight - (daheight / 2 + (gint) (dsp->tcorr2.F.vals[0][j] * (gfloat) daheight / 4)); gdk_gc_set_line_attributes (gg->plot_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); if (j == dsp->tc2_manip_var) #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &gg->vcirc_manip_color); #else gdk_gc_set_foreground (gg->plot_GC, &gg->vcirc_manip_color); #endif else #ifdef ENABLE_CAIRO gdk_cairo_set_source_color (cr, &scheme->rgb_accent); #else gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); #endif #ifdef ENABLE_CAIRO cairo_move_to (cr, ix, daheight / 2); cairo_line_to (cr, ix, iy); cairo_stroke (cr); #else gdk_draw_line (drawable, gg->plot_GC, ix, daheight / 2, ix, iy); #endif g_free (varlab); /*-- can't add vertical variable labels --*/ k++; } gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); break; } } #ifdef ENABLE_CAIRO cairo_destroy (cr); #endif pango_font_metrics_unref (metrics); g_object_unref (layout); } ggobi-2.1.12/src/config.h0000644000175000017500000000766214651530125010567 /* src/config.h. Generated from config.h.in by configure. */ /* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if translation of program messages to the user's native language is requested. */ #define ENABLE_NLS 1 /* Location of GGobi data installation */ #define GGOBI_DATADIR "/usr/local/share" /* Location of locale files */ #define GGOBI_LOCALEDIR "/usr/local/share/locale" /* Date of GGobi's release */ #define GGOBI_RELEASE_DATE "March 16 2015" /* Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */ /* #undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES */ /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ /* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ /* Define if the GNU dcgettext() function is already present or preinstalled. */ #define HAVE_DCGETTEXT 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define if the GNU gettext() function is already present or preinstalled. */ #define HAVE_GETTEXT 1 /* Define if you have the iconv() function and it works. */ /* #undef HAVE_ICONV */ /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if your system has a GNU libc compatible 'malloc' function, and to 0 otherwise. */ #define HAVE_MALLOC 1 /* Define to 1 if you have the 'memset' function. */ #define HAVE_MEMSET 1 /* Define to 1 if you have the 'pow' function. */ /* #undef HAVE_POW */ /* Define to 1 if you have the 'sqrt' function. */ /* #undef HAVE_SQRT */ /* Define to 1 if stdbool.h conforms to C99. */ #define HAVE_STDBOOL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDIO_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the 'strchr' function. */ #define HAVE_STRCHR 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the 'strrchr' function. */ #define HAVE_STRRCHR 1 /* Define to 1 if you have the 'strstr' function. */ #define HAVE_STRSTR 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if the system has the type '_Bool'. */ #define HAVE__BOOL 1 /* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* The major x.*.* version */ #define MAJOR_VERSION 2 /* The micro *.*.x version */ #define MICRO_VERSION 12 /* The minor *.x.* version */ #define MINOR_VERSION 1 /* Name of package */ #define PACKAGE "ggobi" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "ggobi-help@lists.ggobi.org" /* Define to the full name of this package. */ #define PACKAGE_NAME "ggobi" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "ggobi 2.1.12" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "ggobi" /* Define to the home page for this package. */ #define PACKAGE_URL "" /* Define to the version of this package. */ #define PACKAGE_VERSION "2.1.12" /* 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. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "2.1.12" /* Define to empty if 'const' does not conform to ANSI C. */ /* #undef const */ /* Define to rpl_malloc if the replacement function should be used. */ /* #undef malloc */ ggobi-2.1.12/src/identify.c0000644000175000017500000002237514651527764011145 /* identify.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" gint find_nearest_point (icoords * lcursor_pos, splotd * splot, GGobiData * d, ggobid * gg) { /* * Returns index of nearest un-hidden point */ gint i, k, sqdist, near, xdist, ydist, npoint; g_assert (d->hidden.nels == d->nrows); npoint = -1; near = 20 * 20; /* If nothing is close, don't show any label */ for (i = 0; i < d->nrows_in_plot; i++) { if (!d->hidden_now.els[k = d->rows_in_plot.els[i]]) { xdist = splot->screen[k].x - lcursor_pos->x; ydist = splot->screen[k].y - lcursor_pos->y; sqdist = xdist * xdist + ydist * ydist; if (sqdist < near) { near = sqdist; npoint = k; } } } return (npoint); } /*-- still having trouble getting identify turned off properly --*/ RedrawStyle identify_activate (gint state, displayd * display, ggobid * gg) { RedrawStyle redraw_style = NONE; GGobiData *d = display->d; /* At the moment, do the same thing whether identify is turning on or off */ if (state == on || state == off) { if (d->nearest_point != -1) redraw_style = QUICK; d->nearest_point = -1; } return redraw_style; } void sticky_id_toggle (GGobiData * d, ggobid * gg) { gint i = 0; gboolean i_in_list = false; gpointer ptr = NULL; if (d->nearest_point != -1) { if (d->sticky_ids && g_slist_length (d->sticky_ids) > 0) { GSList *l; for (l = d->sticky_ids; l; l = l->next) { i = GPOINTER_TO_INT (l->data); if (i == d->nearest_point) { i_in_list = true; ptr = l->data; break; } } } if (i_in_list) { d->sticky_ids = g_slist_remove (d->sticky_ids, ptr); sticky_id_link_by_id (STICKY_REMOVE, d->nearest_point, d, gg); /* This will become an event on the datad when we move to Gtk objects (soon now!) */ g_signal_emit (G_OBJECT (gg), GGobiSignals[STICKY_POINT_REMOVED_SIGNAL], 0, d->nearest_point, (gint) STICKY_REMOVE, d); } else { ptr = GINT_TO_POINTER (d->nearest_point); d->sticky_ids = g_slist_append (d->sticky_ids, ptr); sticky_id_link_by_id (STICKY_ADD, d->nearest_point, d, gg); /* This will become an event on the datad when we move to Gtk objects (soon now!) */ g_signal_emit (G_OBJECT (gg), GGobiSignals[STICKY_POINT_ADDED_SIGNAL], 0, d->nearest_point, (gint) STICKY_ADD, d); } } } /*----------------------------------------------------------------------*/ /* Linking to other datad's by id */ /*----------------------------------------------------------------------*/ void identify_link_by_id (gint k, GGobiData * source_d, ggobid * gg) { GGobiData *d; GSList *l; gboolean inrange; /*-- k is the row number in source_d --*/ if (k < 0) { /*-- handle this case separately --*/ for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (d != source_d) d->nearest_point_prev = d->nearest_point = -1; } return; } if (source_d->rowIds) { /* if there is no */ if (!source_d->rowIds[k]) { return; } for (l = gg->d; l; l = l->next) { gpointer ptr; d = (GGobiData *) l->data; inrange = false; if (d == source_d || d->idTable == NULL) continue; /*-- skip the originating datad --*/ ptr = g_hash_table_lookup (d->idTable, source_d->rowIds[k]); if (ptr) { inrange = true; d->nearest_point_prev = d->nearest_point; d->nearest_point = *((guint *) ptr); } if (!inrange) { d->nearest_point_prev = d->nearest_point; d->nearest_point = -1; } } return; } } void sticky_id_link_by_id (gint whattodo, gint k, GGobiData * source_d, ggobid * gg) { GGobiData *d; GSList *l; gint i, n, id = -1; gboolean i_in_list = false; GSList *ll; gpointer ptr = NULL; /*-- k is the row number in source_d --*/ if (source_d->rowIds && source_d->rowIds[k]) { ptr = g_hash_table_lookup (source_d->idTable, source_d->rowIds[k]); if (ptr) id = *(guint *) ptr; } if (id < 0) /*-- this would indicate a bug --*/ return; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (d == source_d) continue; /*-- skip the originating datad --*/ i = -1; /*-- if this id exists is in the range of d's ids ... --*/ if (d->idTable) { gpointer ptr = g_hash_table_lookup (d->idTable, source_d->rowIds[k]); if (ptr) i = *(guint *) ptr; } if (i < 0) /*-- then no cases in d have this id --*/ continue; if (g_slist_length (d->sticky_ids) > 0) { for (ll = d->sticky_ids; ll; ll = ll->next) { n = GPOINTER_TO_INT (ll->data); if (n == i) { /*-- the row number of the id --*/ i_in_list = true; ptr = ll->data; break; } } } if (i_in_list && whattodo == STICKY_REMOVE) { d->sticky_ids = g_slist_remove (d->sticky_ids, ptr); } else if (!i_in_list && whattodo == STICKY_ADD) { ptr = GINT_TO_POINTER (i); d->sticky_ids = g_slist_append (d->sticky_ids, ptr); } } } /*----------------------------------------------------------------------*/ /* Called from sp_plot.c */ /*----------------------------------------------------------------------*/ gchar * identify_label_fetch (gint k, cpaneld * cpanel, GGobiData * d, ggobid * gg) { gchar *lbl = NULL; GList *labels = NULL, *l; gint id_display_type = cpanel->id_display_type; /* * How can I tell if the current page of the notebook * corresponds to the data? */ if (id_display_type & ID_VAR_LABELS) { GtkWidget *pnl = mode_panel_get_by_name (GGOBI (getIModeName) (IDENT), gg); GtkWidget *tree_view; GGobiData *tree_view_d; tree_view = get_tree_view_from_object (G_OBJECT (pnl)); tree_view_d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); if (tree_view_d != d) { id_display_type = ID_RECORD_LABEL; /*-- this will be caught below --*/ } else { gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint j, nvars; gchar *colname = NULL, *value = NULL; vars = get_selections_from_tree_view (tree_view, &nvars); for (j = 0; j < nvars; j++) { if (vars[j] < 0) continue; value = ggobi_data_get_string_value(d, k, vars[j], TRUE); colname = ggobi_data_get_transformed_col_name(d, vars[j]); lbl = g_strdup_printf ("%s=%s", colname, value); labels = g_list_append (labels, lbl); } g_free (vars); } } /* Should check here that d->rowlab is long enough */ if (id_display_type & ID_RECORD_LABEL) { lbl = (gchar *) g_array_index (d->rowlab, gchar *, k); if (id_display_type & ~ID_RECORD_LABEL) lbl = g_strdup_printf ("label=%s", lbl); else lbl = g_strdup (lbl); labels = g_list_append (labels, lbl); } if (id_display_type & ID_RECORD_NO) { if (id_display_type & ~ID_RECORD_NO) lbl = g_strdup_printf ("num=%d", k); else lbl = g_strdup_printf ("%d", k); labels = g_list_append (labels, lbl); } if (id_display_type & ID_RECORD_ID) { if (d->rowIds && d->rowIds[k]) { if (id_display_type & ~ID_RECORD_ID) lbl = g_strdup_printf ("id=%s", d->rowIds[k]); else lbl = g_strdup_printf ("%s", d->rowIds[k]); } else { lbl = g_strdup (""); } labels = g_list_append (labels, lbl); } if (lbl) { lbl = (gchar *) g_list_first (labels)->data; for (l = labels->next; l; l = l->next) { gchar *tmp_lbl = g_strdup_printf ("%s, %s", lbl, (gchar *)l->data); g_free (l->data); g_free (lbl); lbl = tmp_lbl; } } return lbl; } /* Recenter the data using the current sticky point */ void recenter_data (gint i, GGobiData * d, ggobid * gg) { vartabled *vt; greal x; gint j; g_assert (d->tform.nrows == d->nrows); g_assert (d->tform.ncols == d->ncols); for (j = 0; j < d->ncols; j++) { vt = vartable_element_get (j, d); if (i >= 0) { x = (vt->lim_tform.max - vt->lim_tform.min) / 2; vt->lim_specified_p = true; vt->lim_specified_tform.min = d->tform.vals[i][j] - x; vt->lim_specified_tform.max = d->tform.vals[i][j] + x; } else { /*-- if no point was specified, recenter using defaults --*/ vt->lim_specified_p = false; } } limits_set (d, false, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } ggobi-2.1.12/src/timeplot.c0000644000175000017500000003164714651527764011171 /* timeplot.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of time series code: Nicholas Lewin-Koh */ #include #include "vars.h" #include "externs.h" #include "tsdisplay.h" /* initial plot sizes */ #define WIDTH 150 #define HEIGHT 100 /*--------------------------------------------------------------------*/ /* Options section */ /*--------------------------------------------------------------------*/ static const gchar *timeplot_ui = "" " " " " " " " " " " " " ""; void tsplot_reset_arrangement (displayd * display, gint arrangement, ggobid * gg) { GList *l; GtkWidget *frame, *w; splotd *sp; if (display->cpanel.tsplot_arrangement == arrangement) return; for (l = display->splots; l; l = l->next) { w = ((splotd *) l->data)->da; gtk_widget_ref (w); gtk_container_remove (GTK_CONTAINER (gg->tsplot.arrangement_box), w); } frame = gg->tsplot.arrangement_box->parent; gtk_widget_destroy (gg->tsplot.arrangement_box); /* if (arrangement == ARRANGE_ROW) */ /* gg->tsplot.arrangement_box = gtk_hbox_new (true, 0); */ /* else */ gg->tsplot.arrangement_box = gtk_vbox_new (true, 0); gtk_container_add (GTK_CONTAINER (frame), gg->tsplot.arrangement_box); display->p1d_orientation = (arrangement == ARRANGE_ROW) ? VERTICAL : HORIZONTAL; for (l = display->splots; l; l = l->next) { sp = (splotd *) l->data; gtk_box_pack_start (GTK_BOX (gg->tsplot.arrangement_box), sp->da, true, true, 0); gtk_widget_unref (sp->da); } /*-- position the display toward the lower left of the main window --*/ display_set_position (GGOBI_WINDOW_DISPLAY (display), gg); gtk_widget_show_all (gg->tsplot.arrangement_box); display_tailpipe (display, FULL, gg); varpanel_refresh (display, gg); } #define MAXNTSPLOTS 6 displayd * tsplot_new_with_vars (gboolean use_window, gboolean missing_p, gint nvars, gint * vars, GGobiData * d, ggobid * gg) { return (tsplot_new (NULL, use_window, missing_p, nvars, vars, d, gg)); } displayd * tsplot_new (displayd * display, gboolean use_window, gboolean missing_p, gint nvars, gint * vars, GGobiData * d, ggobid * gg) { GtkWidget *vbox, *frame; gint i, timeVariable, cur; splotd *sp; gint nplots; if (!display) display = g_object_new (GGOBI_TYPE_TIME_SERIES_DISPLAY, NULL); GGOBI_WINDOW_DISPLAY(display)->useWindow = use_window; display_set_values (display, d, gg); timeVariable = 0; if (nvars == 0) { /* See if there is a variable which has been marked as isTime and use the first of these as the horizontal axis. */ for (i = 0; i < d->ncols; i++) { vartabled *el; el = vartable_element_get (i, d); if (el->isTime) { timeVariable = i; break; } } nplots = MIN ((d->ncols - 1), sessionOptions->info->numTimePlotVars); if (nplots < 0) nplots = d->ncols; if (gg->current_display != NULL && gg->current_display != display && gg->current_display->d == d && GGOBI_IS_EXTENDED_DISPLAY (gg->current_display)) { gint j, k, nplotted_vars; gint *plotted_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); displayd *dsp = gg->current_display; nplotted_vars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dsp)->plotted_vars_get (dsp, plotted_vars, d, gg); nplots = MAX (nplots, nplotted_vars); vars[0] = timeVariable; /* Loop through plotted_vars. Don't add timeVariable again, or exceed the number of plots */ j = 1; for (k = 0; k < nplotted_vars; k++) { if (plotted_vars[k] != timeVariable) { vars[j] = plotted_vars[k]; j++; if (j == nplots) break; } } /* If we still need more plots, loop through remaining variables. Don't add timeVariable again, or exceed the number of plots */ if (j < nplots) { for (k = 0; k < d->ncols; k++) { if (!in_vector (k, plotted_vars, nplotted_vars) && k != timeVariable) { vars[j] = k; j++; if (j == nplots) break; } } } g_free (plotted_vars); } else { for (i = 1, cur = 0; i < nplots; i++, cur++) { /* Check that we are not setting a variable to the timeVariable but also that we have enough variables. */ if (cur == timeVariable) { if (cur < d->ncols - 1) { vars[i] = ++cur; } } else vars[i] = cur; } } } else { nplots = nvars; timeVariable = vars[0]; } tsplot_cpanel_init (&display->cpanel, gg); if (GGOBI_WINDOW_DISPLAY (display)->useWindow) display_window_init (GGOBI_WINDOW_DISPLAY (display), 2.5 * WIDTH, nplots * HEIGHT, 3, gg); /* * Add the main menu bar */ vbox = GTK_WIDGET (display); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); display->menu_manager = display_menu_manager_create (display); if (GGOBI_WINDOW_DISPLAY (display)->useWindow) { gtk_container_add (GTK_CONTAINER (GGOBI_WINDOW_DISPLAY (display)->window), vbox); display->menubar = create_menu_bar (display->menu_manager, timeplot_ui, GGOBI_WINDOW_DISPLAY (display)-> window); gtk_box_pack_start (GTK_BOX (vbox), display->menubar, false, true, 0); } /* * splots in a box in a frame -- either a vbox or an hbox. */ frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_box_pack_start (GTK_BOX (vbox), frame, true, true, 1); /* * this is the box that would have to change from horizontal to vertical * when the plot arrangement changes */ gg->tsplot.arrangement_box = gtk_vbox_new (true, 0); gtk_container_add (GTK_CONTAINER (frame), gg->tsplot.arrangement_box); display->splots = NULL; for (i = 1; i < nplots; i++) { sp = ggobi_time_series_splot_new (display, gg); sp->xyvars.y = vars[i]; sp->xyvars.x = timeVariable; display->splots = g_list_append (display->splots, (gpointer) sp); gtk_box_pack_start (GTK_BOX (gg->tsplot.arrangement_box), sp->da, true, true, 0); } if (GGOBI_WINDOW_DISPLAY (display)->useWindow) gtk_widget_show_all (GGOBI_WINDOW_DISPLAY (display)->window); else gtk_widget_show_all (GTK_WIDGET (gg->tsplot.arrangement_box)); return display; } static gboolean tsplot_var_selected (gint jvar, displayd * display) { gboolean selected = false; splotd *s; GList *l = display->splots; while (l) { s = (splotd *) l->data; if (s->xyvars.y == jvar || s->xyvars.x == jvar) { selected = true; break; } l = l->next; } return selected; } gboolean tsplot_varsel (GtkWidget * w, displayd * display, splotd * sp, gint jvar, gint toggle, gint mouse, cpaneld * cpanel, ggobid * gg) { gboolean redraw = true; gint nplots = g_list_length (gg->current_display->splots); gint k; gint jvar_indx = -1, new_indx; GList *l; splotd *s, *sp_new; GtkWidget *box; /* * if left button click, the x variable no matter what * selection_mode prevails. */ if (toggle == VARSEL_X || mouse == 1) { l = display->splots; s = (splotd *) l->data; if (s->xyvars.x == jvar) redraw = false; /*-- this is already the x var --*/ else { while (l) { s = (splotd *) l->data; s->xyvars.x = jvar; l = l->next; } } } else if (toggle == VARSEL_Y || mouse == 2 || mouse == 3) { if (tsplot_var_selected (jvar, display)) { /* then delete */ /* If jvar is one of the plotted variables, its corresponding plot */ splotd *jvar_sp = NULL; k = 0; l = display->splots; while (l) { s = (splotd *) l->data; if (s->xyvars.y == jvar) { jvar_sp = s; jvar_indx = k; break; } l = l->next; k++; } if (jvar_sp != NULL && nplots > 1) { /*-- Delete the plot from the list, and destroy it. --*/ display->splots = g_list_remove (display->splots, (gpointer) jvar_sp); nplots--; /* * If the plot being removed is the current plot, reset * gg->current_splot. */ if (jvar_sp == gg->current_splot) { sp_event_handlers_toggle (sp, off, cpanel->pmode, cpanel->imode); new_indx = (jvar_indx == 0) ? 0 : MIN (nplots - 1, jvar_indx); gg->current_splot = (splotd *) g_list_nth_data (display->splots, new_indx); /* just for insurance, to handle the unforeseen */ if (gg->current_splot == NULL) gg->current_splot = (splotd *) g_list_nth_data (display->splots, 0); display->current_splot = gg->current_splot; sp_event_handlers_toggle (gg->current_splot, on, cpanel->pmode, cpanel->imode); } splot_free (jvar_sp, display, gg); } } else { /* Append */ l = display->splots; s = (splotd *) l->data; /* this let us set the x var for the new plot to be the same as that of the first plot. */ sp_new = ggobi_time_series_splot_new (display, gg); sp_new->xyvars.y = jvar; sp_new->xyvars.x = s->xyvars.x; display->splots = g_list_append (display->splots, (gpointer) sp_new); box = (sp->da)->parent; gtk_box_pack_end (GTK_BOX (box), sp_new->da, true, true, 0); gtk_widget_show (sp_new->da); //gg->current_splot = sp->displayptr->current_splot = sp_new; /* I don't think it's possible to initialize brushing until the data has run through the pipeline. Since I can't cleanly add a plot in brushing mode, I think it's best to switch back to the default mode. -- dfs */ GGOBI (full_viewmode_set) (EXTENDED_DISPLAY_PMODE, DEFAULT_IMODE, gg); /* Initialize drag and drop for the new panel */ sp_event_handlers_toggle (sp_new, on, cpanel->pmode, cpanel->imode); redraw = true; } } return redraw; } /*--------------------------------------------------------------------*/ /* The whiskers for timeseries lines */ /*--------------------------------------------------------------------*/ static void tsplot_rewhisker (splotd * sp, ggobid * gg) { gint i, k, n; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gboolean draw_whisker; for (k = 0; k < (d->nrows_in_plot - 1); k++) { i = d->rows_in_plot.els[k]; n = d->rows_in_plot.els[k + 1]; /*-- .. also if we're not drawing missings, and an endpoint is missing --*/ if (!d->missings_show_p && (ggobi_data_is_missing(d, i, sp->xyvars.x) || ggobi_data_is_missing(d, i, sp->xyvars.y) || ggobi_data_is_missing(d, n, sp->xyvars.x) || ggobi_data_is_missing(d, n, sp->xyvars.y)) && (sp->screen[i].x > sp->screen[n].x)) { /* to keep time going forwards */ draw_whisker = false; } else draw_whisker = true; /* --- all whiskers --- */ if (draw_whisker) { sp->whiskers[i].x1 = sp->screen[i].x; sp->whiskers[i].y1 = sp->screen[i].y; sp->whiskers[i].x2 = sp->screen[n].x; sp->whiskers[i].y2 = sp->screen[n].y; } } } /*-- set the positions of the whiskers for sp and prev_sp --*/ void tsplot_whiskers_make (splotd * sp, displayd * display, ggobid * gg) { GList *splist; splotd *splot; splotd *sp_next = (splotd *) NULL; for (splist = display->splots; splist; splist = splist->next) { splot = (splotd *) splist->data; if (splot == sp) { /*-- interesting -- what's sp_next used for? dfs --*/ sp_next = (splist->next == NULL) ? NULL : (splotd *) splist->next->data; } } tsplot_rewhisker (sp, gg); } ggobi-2.1.12/src/scale_api.c0000644000175000017500000000461514651527764011247 /* scale_api.c: some api scaling routines */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /* I didn't do these right, I don't think, because pan takes incremental steps, while zoom resets the scale value in an absolute way. Maybe the way I did the zooming is the way one would like. If that's so, it could be renamed splot_zoom_set and left as it is. splot_pan could be renamed splot_pan_set and reworked. */ /* void splot_pan (splotd *sp, gint xstep, gint ystep, ggobid *gg) { cpaneld *cpanel = &gg->current_display->cpanel; displayd *display = gg->current_display; if (cpanel->scale_pan_opt == P_OBLIQUE || cpanel->scale_pan_opt == P_HORIZ) { } if (cpanel->scale_pan_opt == P_OBLIQUE || cpanel->scale_pan_opt == P_VERT) { } splot_plane_to_screen (display, cpanel, sp, gg); ruler_ranges_set (false, gg->current_display, sp, gg); splot_redraw (sp, FULL, gg); } */ /*-- Set the current scale: xsc, ysc are on (SCALE_MIN, ...) */ void splot_zoom (splotd * sp, gfloat xsc, gfloat ysc) { ggobid *gg = GGobiFromSPlot(sp); displayd *display = gg->current_display; /*gint projection = projection_get (gg); */ icoords mid; /* gfloat *scale_x = (projection == TOUR2D) ? &sp->tour_scale.x : &sp->scale.x; gfloat *scale_y = (projection == TOUR2D) ? &sp->tour_scale.y : &sp->scale.y; */ gfloat *scale_x = &sp->scale.x; gfloat *scale_y = &sp->scale.y; gfloat scalefac_x = xsc / *scale_x; gfloat scalefac_y = ysc / *scale_y; mid.x = sp->max.x / 2; mid.y = sp->max.y / 2; if (xsc > SCALE_MIN && *scale_x * scalefac_x >= SCALE_MIN) { *scale_x = xsc; } if (scalefac_y > SCALE_MIN && *scale_y * scalefac_y >= SCALE_MIN) { *scale_y = ysc; } splot_plane_to_screen (display, &display->cpanel, sp, gg); ruler_ranges_set (false, gg->current_display, sp, gg); splot_redraw (sp, FULL, gg); } ggobi-2.1.12/src/plugin.h0000644000175000017500000000776014651527764010636 /* plugin.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_PLUGIN_H #define GGOBI_PLUGIN_H #include #include "ggobi.h" typedef enum {GENERAL_PLUGIN, INPUT_PLUGIN} GGobiPluginType; typedef enum {DL_UNLOADED = 0, DL_LOADED, DL_FAILED} PluginLoadStatus; typedef void (*DLFUNC)(); typedef struct { gchar *name; gchar *dllName; GModule *library; gchar *description; gchar *author; PluginLoadStatus loaded; gchar *onLoad; gchar *onUnload; gchar *language; GSList *depends; GSList *args; GHashTable *namedArgs; } GGobiPluginDetails; typedef struct { gchar *onCreate; gchar *onClose; gchar *onUpdateDisplay; } GGobiGeneralPluginInfo; /* The two plugin types should share the common information. */ struct _GGobiInputPluginInfo { gchar **modeNames; guint numModeNames; gchar *read_symbol_name; gchar *probe_symbol_name; gchar *getDescription; gboolean interactive; InputReader plugin_read_input; InputGetDescription get_description_f; InputProbe probe; /* Used when guessing the format. Each plugin is asked whether it supports this file. It can do so by looking at the extension, reading the start of the file, etc. */ DataMode mode; }; struct _GGobiPluginInfo { GGobiPluginDetails *details; GGobiPluginType type; union { GGobiGeneralPluginInfo *g; GGobiInputPluginInfo *i; } info; void *data; }; typedef gboolean (*ProcessPluginInfo)(xmlNodePtr, GGobiPluginInfo *, GGobiPluginType, GGobiPluginInfo *, GGobiInitInfo *info); typedef struct { gchar *processPluginName; gboolean (*processPlugin)(); } GGobiLanguagePluginData; typedef struct { GGobiPluginInfo *info; ggobid *gg; gboolean active; void *data; } PluginInstance; typedef gboolean (*OnLoad)(gboolean initializing, GGobiPluginInfo *plugin); typedef gboolean (*OnCreate)(ggobid *gg, GGobiPluginInfo *plugin, PluginInstance *inst); typedef gboolean (*OnClose)(ggobid *gg, GGobiPluginInfo *plugin, PluginInstance *inst); typedef gboolean (*OnUnload)(gboolean quitting, GGobiPluginInfo *plugin); typedef gboolean (*OnUpdateDisplayMenu)(ggobid *gg, PluginInstance *inst); GModule* load_plugin_library(GGobiPluginDetails *plugin, gboolean recurse); gpointer getPluginSymbol(const gchar *name, GGobiPluginDetails *plugin); void plugin_init(); gboolean registerPlugins(ggobid *gg, GList *plugins); gboolean pluginsUpdateDisplayMenu(ggobid *gg, GList *plugins); int GGOBI_addPluginInstance(PluginInstance *inst, ggobid *gg); gboolean GGOBI_removePluginInstance(PluginInstance *inst, ggobid *gg); void closePlugins(ggobid *gg); GGobiPluginInfo *runInteractiveInputPlugin(ggobid *gg); GtkWidget *showPluginInfo(GList *plugins, GList *inputPlugins, ggobid *gg); GGobiPluginInfo *getLanguagePlugin (GList * plugins, const char *name); gboolean loadPluginLibrary(GGobiPluginDetails *plugin, GGobiPluginInfo *realPlugin); gboolean GGobi_checkPlugin(GGobiPluginDetails *plugin); gboolean setLanguagePluginInfo(GGobiPluginDetails *details, const gchar *language, GGobiInitInfo *info); gboolean pluginSupportsInputMode(const gchar *modeName, GGobiPluginInfo *pluginInfo); GGobiPluginInfo *getInputPluginByModeNameIndex(gint index,gchar **modeName); InputDescription *callInputPluginGetDescription(const gchar *fileName, const gchar *modeName, GGobiPluginInfo *info, ggobid *gg); void registerDefaultPlugins(GGobiInitInfo *info); #endif ggobi-2.1.12/src/marshal.h0000644000175000017500000000506414651527764010762 #ifndef __ggobi_marshal_MARSHAL_H__ #define __ggobi_marshal_MARSHAL_H__ #include G_BEGIN_DECLS /* NONE:OBJECT,POINTER,OBJECT (marshal.list:1) */ extern void ggobi_marshal_VOID__OBJECT_POINTER_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); #define ggobi_marshal_NONE__OBJECT_POINTER_OBJECT ggobi_marshal_VOID__OBJECT_POINTER_OBJECT /* NONE:OBJECT,INT,OBJECT (marshal.list:2) */ extern void ggobi_marshal_VOID__OBJECT_INT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); #define ggobi_marshal_NONE__OBJECT_INT_OBJECT ggobi_marshal_VOID__OBJECT_INT_OBJECT /* NONE:POINTER,INT,OBJECT (marshal.list:3) */ extern void ggobi_marshal_VOID__POINTER_INT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); #define ggobi_marshal_NONE__POINTER_INT_OBJECT ggobi_marshal_VOID__POINTER_INT_OBJECT /* NONE:INT,INT,OBJECT (marshal.list:4) */ extern void ggobi_marshal_VOID__INT_INT_OBJECT (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); #define ggobi_marshal_NONE__INT_INT_OBJECT ggobi_marshal_VOID__INT_INT_OBJECT G_END_DECLS #endif /* __ggobi_marshal_MARSHAL_H__ */ ggobi-2.1.12/src/colorscheme.h0000644000175000017500000000401514651527764011631 /* colorscheme.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_COLOR_SCHEME_H #define GGOBI_COLOR_SCHEME_H #include typedef enum { diverging, sequential, spectral, qualitative, UNKNOWN_COLOR_TYPE } colorscaletype; typedef enum { rgb, hsv, cmy, cmyk, UNKNOWN_COLOR_SYSTEM } colorsystem; typedef struct { gchar *name; gchar *description; colorscaletype type; colorsystem system; /*-- system used in the xml description --*/ gint criticalvalue; /*-- if diverging, where's the center? --*/ gint n; /*-- n <= MAXNCOLORS --*/ gfloat **data; /*-- the data in the colortable, in its original system and dimensions --*/ GdkColor *rgb; /*-- the data converted to rgb, of length n --*/ GArray *colorNames; /*-- in case we have them --*/ gfloat *bg; /*-- high-contrast background color, rgb --*/ GdkColor rgb_bg; /*-- high-contrast background color, rgb --*/ GdkColor rgb_hidden; /*-- for hidden points and edges, close to bg --*/ gfloat *accent; /*-- high-contrast accent color, rgb --*/ GdkColor rgb_accent; /*-- high-contrast accent color, rgb --*/ } colorschemed; colorschemed *findColorSchemeByName(GList * schemes, const gchar * name); gint getColor(xmlNodePtr node, xmlDocPtr doc, gfloat ** original, GdkColor * col); colorschemed *read_colorscheme(char *fileName, GList **); #ifdef __cplusplus extern "C" { #endif void colorscheme_init(colorschemed * scheme); #ifdef __cplusplus } #endif #endif ggobi-2.1.12/src/renderer.gob0000644000175000017500000002253414651527764011462 %h{ #include %} %{ #include #if GTK_CHECK_VERSION(2,8,0) static cairo_surface_t *ref_cairo_surface(GdkDrawable *self); #endif %} /* Transfers logical drawing commands to a physical (screen) device */ /* The default renderer just passes everything through to GDK */ /* Since GGobi is an interactive graphics platform, the renderer design is biased towards screen devices. This doesn't preclude, however, off-screen devices that take "snapshots" of GGobi plots */ class GGobi:Renderer from Gdk:Drawable { /* everything passes through to this drawable by default */ private GdkDrawable *buffer unrefwith g_object_unref; /* buffer should be flushed to this drawable */ private GdkDrawable *parent unrefwith g_object_unref; property OBJECT parent (nick = "out", blurb = "The drawable to which this renderer is flushed", object_type = Gdk:Drawable, flags = CONSTRUCT_ONLY) set { GObject *obj = g_value_dup_object(VAL); if (selfp->parent) g_object_unref(G_OBJECT(selfp->parent)); selfp->parent = GDK_DRAWABLE(obj); if (selfp->buffer) g_object_unref(G_OBJECT(selfp->buffer)); selfp->buffer = self_create_target(self, selfp->parent); } get { g_value_set_object(VAL, selfp->parent); }; /* if you already have a special GdkDrawable, and want to make it into a GGobiRenderer, just override this to provide it */ private virtual GdkDrawable * create_target(self, GdkDrawable *parent) { gint width, height; gdk_drawable_get_size(parent, &width, &height); return gdk_pixmap_new(parent, width, height, -1); } /* buffers are created by cloning (prototype approach) */ public virtual GGobiRenderer * buffer(self) { GObject *obj = g_object_new(G_OBJECT_TYPE(self), "parent", self, NULL); return GGOBI_RENDERER(obj); } public virtual void flush(self, GdkGC *gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { gdk_draw_drawable(selfp->parent, gc, selfp->buffer, xsrc, ysrc, xdest, ydest, width, height); } /* pass everything through to underlying drawable */ override (Gdk:Drawable) void draw_rectangle (GdkDrawable *self, GdkGC *gc, gboolean filled, gint x, gint y, gint width, gint height) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_rectangle( SELF(self)->_priv->buffer, gc, filled, x, y, width, height); } override (Gdk:Drawable) void draw_arc(GdkDrawable *self, GdkGC *gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_arc( SELF(self)->_priv->buffer, gc, filled, x, y, width, height, angle1, angle2); } override (Gdk:Drawable) void draw_polygon(GdkDrawable *self, GdkGC *gc, gboolean filled, GdkPoint *points, gint npoints) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_polygon( SELF(self)->_priv->buffer, gc, filled, points, npoints); } override (Gdk:Drawable) void draw_points(GdkDrawable *self, GdkGC *gc, GdkPoint *points, gint npoints) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_points( SELF(self)->_priv->buffer, gc, points, npoints); } override (Gdk:Drawable) void draw_segments(GdkDrawable *self, GdkGC *gc, GdkSegment *segs, gint nsegs) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_segments( SELF(self)->_priv->buffer, gc, segs, nsegs); } override (Gdk:Drawable) void draw_lines(GdkDrawable *self, GdkGC *gc, GdkPoint *points, gint npoints) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_lines( SELF(self)->_priv->buffer, gc, points, npoints); } override (Gdk:Drawable) void draw_trapezoids(GdkDrawable *self, GdkGC *gc, GdkTrapezoid *trapezoids, gint n_trapezoids) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_trapezoids( SELF(self)->_priv->buffer, gc, trapezoids, n_trapezoids); } override (Gdk:Drawable) void draw_text(GdkDrawable *self, GdkFont *font, GdkGC *gc, gint x, gint y, const gchar *text, gint text_length) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_text( SELF(self)->_priv->buffer, font, gc, x, y, text, text_length); } override (Gdk:Drawable) void draw_text_wc(GdkDrawable *self, GdkFont *font, GdkGC *gc, gint x, gint y, const GdkWChar *text, gint text_length) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_text_wc( SELF(self)->_priv->buffer, font, gc, x, y, text, text_length); } override (Gdk:Drawable) void draw_glyphs(GdkDrawable *self, GdkGC *gc, PangoFont *font, gint x, gint y, PangoGlyphString *glyphs) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_glyphs( SELF(self)->_priv->buffer, gc, font, x, y, glyphs); } override (Gdk:Drawable) void draw_glyphs_transformed(GdkDrawable *self, GdkGC *gc, PangoMatrix *matrix, PangoFont *font, gint x, gint y, PangoGlyphString *glyphs) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_glyphs_transformed( SELF(self)->_priv->buffer, gc, matrix, font, x, y, glyphs); } override (Gdk:Drawable) GdkGC * create_gc(GdkDrawable *self, GdkGCValues *values, GdkGCValuesMask mask) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->create_gc( SELF(self)->_priv->buffer, values, mask); } override (Gdk:Drawable) void draw_drawable(GdkDrawable *self, GdkGC *gc, GdkDrawable *src, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_drawable( SELF(self)->_priv->buffer, gc, src, xsrc, ysrc, xdest, ydest, width, height); } override (Gdk:Drawable) void draw_image(GdkDrawable *self, GdkGC *gc, GdkImage *image, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_image( SELF(self)->_priv->buffer, gc, image, xsrc, ysrc, xdest, ydest, width, height); } override (Gdk:Drawable) gint get_depth(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_depth( SELF(self)->_priv->buffer); } override (Gdk:Drawable) void get_size(GdkDrawable *self, gint *width, gint *height) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_size( SELF(self)->_priv->buffer, width, height); } override (Gdk:Drawable) void set_colormap(GdkDrawable *self, GdkColormap *cmap) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->set_colormap( SELF(self)->_priv->buffer, cmap); } override (Gdk:Drawable) GdkColormap* get_colormap(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_colormap( SELF(self)->_priv->buffer); } override (Gdk:Drawable) GdkVisual* get_visual(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_visual( SELF(self)->_priv->buffer); } override (Gdk:Drawable) GdkScreen* get_screen(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_screen( SELF(self)->_priv->buffer); } override (Gdk:Drawable) GdkImage* get_image(GdkDrawable *self, gint x, gint y, gint width, gint height) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_image( SELF(self)->_priv->buffer, x, y, width, height); } override (Gdk:Drawable) GdkRegion* get_clip_region(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_clip_region( SELF(self)->_priv->buffer); } override (Gdk:Drawable) GdkRegion* get_visible_region(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_visible_region( SELF(self)->_priv->buffer); } override (Gdk:Drawable) GdkDrawable* get_composite_drawable(GdkDrawable *self, gint x, gint y, gint width, gint height, gint *composite_x_offset, gint *composite_y_offset) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_composite_drawable( SELF(self)->_priv->buffer, x, y, width, height, composite_x_offset, composite_y_offset); } override (Gdk:Drawable) void draw_pixbuf(GdkDrawable *self, GdkGC *gc, GdkPixbuf *pixbuf, gint src_x, gint src_y, gint dest_x, gint dest_y, gint width, gint height, GdkRgbDither dither, gint x_dither, gint y_dither) { GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_pixbuf( SELF(self)->_priv->buffer, gc, pixbuf, src_x, src_y, dest_x, dest_y, width, height, dither, x_dither, y_dither); } override (Gdk:Drawable) GdkImage* _copy_to_image(GdkDrawable *self, GdkImage *image, gint src_x, gint src_y, gint dest_x, gint dest_y, gint width, gint height) { return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->_copy_to_image( SELF(self)->_priv->buffer, image, src_x, src_y, dest_x, dest_y, width, height); } class_init(self_class) { /* need to do this one manually, to avoid GTK+ 2.8.x dep */ #if GTK_CHECK_VERSION(2,8,0) GDK_DRAWABLE_CLASS(self_class)->ref_cairo_surface = ref_cairo_surface; #endif } } %{ #if GTK_CHECK_VERSION(2,8,0) static cairo_surface_t * ref_cairo_surface(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(GGOBI_RENDERER(self)->_priv->buffer)->ref_cairo_surface( GGOBI_RENDERER(self)->_priv->buffer); } #endif %} ggobi-2.1.12/src/vector.c0000644000175000017500000003426114651527764010631 /*-- vector.c --*/ #include #include "vars.h" #include "externs.h" /*-------------------------------------------------------------------------*/ /* double vector management */ /*-------------------------------------------------------------------------*/ void vectord_init_null (vector_d *vecp) { vecp->nels = 0; vecp->els = (gdouble *) NULL; } void vectord_free (vector_d *vecp) { if (vecp->els != NULL) g_free ((gpointer) vecp->els); vecp->els = NULL; vecp->nels = 0; } /* Zero a vector of doubles. */ void vectord_zero (vector_d *vecp) { gint i; for (i=0; inels; i++) vecp->els[i] = 0.0; } /* allocate a vector of doubles */ void vectord_alloc (vector_d *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gdouble *) g_malloc (nels * sizeof (gdouble)); } void vectord_realloc (vector_d *vecp, gint nels) { if (nels > 0) { if (vecp->els == NULL || vecp->nels == 0) vecp->els = (gdouble *) g_malloc (nels * sizeof (gdouble)); else { gint i, nels_prev = vecp->nels; vecp->els = (gdouble *) g_realloc (vecp->els, nels * sizeof (gdouble)); /*-- initialize newly allocated slots to 0 --*/ for (i=nels_prev; iels[i] = 0.0; } } else { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; } vecp->nels = nels; } void vectord_delete_els (vector_d *vecp, gint nels, gint *els) { gint k; gint jto, jfrom; gint *keepers = g_malloc ((vecp->nels - nels) * sizeof (gint)); gint nkeepers = find_keepers (vecp->nels, nels, els, keepers); if (nels > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k=0; kels[jto] = vecp->els[jfrom]; } vecp->els = (gdouble *) g_realloc (vecp->els, nkeepers * sizeof (gdouble)); vecp->nels = nkeepers; } g_free (keepers); } /* allocate a vector of doubles populated with 0 */ void vectord_alloc_zero (vector_d *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gdouble *) g_malloc0 (nels * sizeof (gdouble)); } void vectord_copy (vector_d *vecp_from, vector_d *vecp_to) { gint i; if (vecp_from->nels == vecp_to->nels) for (i=0; inels; i++) vecp_to->els[i] = vecp_from->els[i]; else g_printerr ("(vectord_copy) length of source = %d, of destination = %d\n", vecp_from->nels, vecp_to->nels); } /*-------------------------------------------------------------------------*/ /* floating point vector management */ /*-------------------------------------------------------------------------*/ void vectorf_init_null (vector_f *vecp) { vecp->nels = 0; vecp->els = (gfloat *) NULL; } void vectorf_free (vector_f *vecp) { if (vecp->els != NULL) g_free ((gpointer) vecp->els); vecp->els = NULL; vecp->nels = 0; } /* Zero a floating point vector. */ void vectorf_zero (vector_f *vecp) { gint i; for (i=0; inels; i++) vecp->els[i] = 0.0; } /* allocate a floating point vector */ void vectorf_alloc (vector_f *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gfloat *) g_malloc (nels * sizeof (gfloat)); } void vectorf_realloc (vector_f *vecp, gint nels) { if (nels > 0) { if (vecp->els == NULL || vecp->nels == 0) vecp->els = (gfloat *) g_malloc (nels * sizeof (gfloat)); else { gint i, nels_prev = vecp->nels; vecp->els = (gfloat *) g_realloc (vecp->els, nels * sizeof (gfloat)); /*-- initialize newly allocated slots to 0 --*/ for (i=nels_prev; iels[i] = 0.0; } } else { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; } vecp->nels = nels; } void vectorf_delete_els (vector_f *vecp, gint nels, gint *els) { gint k; gint jto, jfrom; gint *keepers = g_malloc ((vecp->nels - nels) * sizeof (gint)); gint nkeepers = find_keepers (vecp->nels, nels, els, keepers); if (nels > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k=0; kels[jto] = vecp->els[jfrom]; } vecp->els = (gfloat *) g_realloc (vecp->els, nkeepers * sizeof (gfloat)); vecp->nels = nkeepers; } g_free (keepers); } /* allocate a floating point vector populated with 0 */ void vectorf_alloc_zero (vector_f *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gfloat *) g_malloc0 (nels * sizeof (gfloat)); } void vectorf_copy (vector_f *vecp_from, vector_f *vecp_to) { gint i; if (vecp_from->nels == vecp_to->nels) for (i=0; inels; i++) vecp_to->els[i] = vecp_from->els[i]; else g_printerr ("(vectorf_copy) length of source = %d, of destination = %d\n", vecp_from->nels, vecp_to->nels); } /*-------------------------------------------------------------------------*/ /* integer vector management */ /*-------------------------------------------------------------------------*/ void vectori_init_null (vector_i *vecp) { vecp->nels = 0; vecp->els = (gint *) NULL; } void vectori_free (vector_i *vecp) { if (vecp->els != NULL) g_free ((gpointer) vecp->els); vecp->els = NULL; vecp->nels = 0; } /* Zero an integer vector. */ void vectori_zero (vector_i *vecp) { gint i; for (i=0; inels; i++) vecp->els[i] = 0; } /* allocate an integer vector */ void vectori_alloc (vector_i *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gint *) g_malloc (nels * sizeof (gint)); } /* allocate an integer vector; populate with 0 */ void vectori_alloc_zero (vector_i *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gint *) g_malloc0 (nels * sizeof (gint)); } void vectori_realloc (vector_i *vecp, gint nels) { if (nels > 0) { if (vecp->els == NULL || vecp->nels == 0) vecp->els = (gint *) g_malloc (nels * sizeof (gint)); else { gint i, nels_prev = vecp->nels; vecp->els = (gint *) g_realloc (vecp->els, nels * sizeof (gint)); /*-- initialize newly allocated slots to 0 --*/ for (i=nels_prev; iels[i] = 0; } } else { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; } vecp->nels = nels; } void vectori_delete_els (vector_i *vecp, gint nels, gint *els) { gint k; gint jto, jfrom; gint *keepers = g_malloc ((vecp->nels - nels) * sizeof (gint)); gint nkeepers = find_keepers (vecp->nels, nels, els, keepers); if (nels > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k=0; kels[jto] = vecp->els[jfrom]; } vecp->els = (gint *) g_realloc (vecp->els, nkeepers * sizeof (gint)); vecp->nels = nkeepers; } g_free (keepers); } void vectori_copy (vector_i *vecp_from, vector_i *vecp_to) { gint i; if (vecp_from->nels == vecp_to->nels) for (i=0; inels; i++) vecp_to->els[i] = vecp_from->els[i]; else g_printerr ("(vectori_copy) length of source = %d, of destination = %d\n", vecp_from->nels, vecp_to->nels); } /*-------------------------------------------------------------------------*/ /* gboolean vector management */ /*-------------------------------------------------------------------------*/ void vectorb_init_null (vector_b *vecp) { vecp->nels = 0; vecp->els = (gboolean *) NULL; } void vectorb_free (vector_b *vecp) { if (vecp->els == NULL) g_free ((gpointer) vecp->els); vecp->els = NULL; vecp->nels = 0; } void vectorb_zero (vector_b *vecp) { gint i; for (i=0; inels; i++) vecp->els[i] = false; } void vectorb_alloc (vector_b *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gboolean *) g_malloc (nels * sizeof (gboolean)); } void vectorb_realloc (vector_b *vecp, gint nels) { if (nels > 0) { if (vecp->els == NULL || vecp->nels == 0) vecp->els = (gboolean *) g_malloc (nels * sizeof (gboolean)); else { gint i, nels_prev = vecp->nels; vecp->els = (gboolean *) g_realloc (vecp->els, nels * sizeof (gboolean)); /*-- initialize newly allocated slots to false --*/ for (i=nels_prev; iels[i] = false; } } else { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; } vecp->nels = nels; } void vectorb_alloc_zero (vector_b *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gboolean *) g_malloc0 (nels * sizeof (gboolean)); } void vectorb_delete_els (vector_b *vecp, gint nels, gint *els) { gint k; gint jto, jfrom; gint *keepers = g_malloc ((vecp->nels - nels) * sizeof (gint)); gint nkeepers = find_keepers (vecp->nels, nels, els, keepers); if (nels > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k=0; kels[jto] = vecp->els[jfrom]; } vecp->els = (gboolean *) g_realloc (vecp->els, nkeepers * sizeof (gboolean)); vecp->nels = nkeepers; } g_free (keepers); } void vectorb_copy (vector_b *vecp_from, vector_b *vecp_to) { gint i; if (vecp_from->nels == vecp_to->nels) for (i=0; inels; i++) vecp_to->els[i] = vecp_from->els[i]; else g_printerr ("(vectorb_copy) length of source = %d, of destination = %d\n", vecp_from->nels, vecp_to->nels); } /*-------------------------------------------------------------------------*/ /* gshort vector management */ /*-------------------------------------------------------------------------*/ void vectors_init_null (vector_s *vecp) { vecp->nels = 0; vecp->els = (gshort *) NULL; } void vectors_free (vector_s *vecp) { if (vecp->els == NULL) g_free ((gpointer) vecp->els); vecp->els = NULL; vecp->nels = 0; } void vectors_zero (vector_s *vecp) { gint i; for (i=0; inels; i++) vecp->els[i] = 0; } void vectors_alloc (vector_s *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gshort *) g_malloc (nels * sizeof (gshort)); } void vectors_realloc (vector_s *vecp, gint nels) { if (nels > 0) { if (vecp->els == NULL || vecp->nels == 0) vecp->els = (gshort *) g_malloc (nels * sizeof (gshort)); else { gint i, nels_prev = vecp->nels; vecp->els = (gshort *) g_realloc (vecp->els, nels * sizeof (gshort)); /*-- initialize newly allocated slots to 0 --*/ for (i=nels_prev; iels[i] = 0; } } else { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; } vecp->nels = nels; } void vectors_alloc_zero (vector_s *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (gshort *) g_malloc0 (nels * sizeof (gshort)); } void vectors_copy (vector_s *vecp_from, vector_s *vecp_to) { gint i; if (vecp_from->nels == vecp_to->nels) for (i=0; inels; i++) vecp_to->els[i] = vecp_from->els[i]; else g_printerr ("(vectors_copy) length of source = %d, of destination = %d\n", vecp_from->nels, vecp_to->nels); } /*-------------------------------------------------------------------------*/ /* glyphd vector management */ /*-------------------------------------------------------------------------*/ void vectorg_init_null (vector_g *vecp) { vecp->nels = 0; vecp->els = (glyphd *) NULL; } void vectorg_free (vector_g *vecp) { if (vecp->els == NULL) g_free ((gpointer) vecp->els); vecp->els = NULL; vecp->nels = 0; } /*-- let's calling zeroing out a glyph setting it to POINT --*/ void vectorg_zero (vector_g *vecp) { gint i; for (i=0; inels; i++) { vecp->els[i].type = DOT_GLYPH; vecp->els[i].size = 0; } } void vectorg_alloc (vector_g *vecp, gint nels) { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; vecp->nels = nels; if (nels > 0) vecp->els = (glyphd *) g_malloc (nels * sizeof (glyphd)); } void vectorg_realloc (vector_g *vecp, gint nels) { if (nels > 0) { if (vecp->els == NULL || vecp->nels == 0) vecp->els = (glyphd *) g_malloc (nels * sizeof (glyphd)); else { gint i, nels_prev = vecp->nels; vecp->els = (glyphd *) g_realloc (vecp->els, nels * sizeof (glyphd)); /*-- initialize newly allocated slots to 0 --*/ for (i=nels_prev; iels[i].type = 0; vecp->els[i].size = 0; } } } else { if (vecp->els != NULL) g_free (vecp->els); vecp->els = NULL; } vecp->nels = nels; } void vectorg_alloc_zero (vector_g *vecp, gint nels) { vectorg_alloc (vecp, nels); vectorg_zero (vecp); } void vectorg_copy (vector_g *vecp_from, vector_g *vecp_to) { gint i; if (vecp_from->nels == vecp_to->nels) for (i=0; inels; i++) { vecp_to->els[i].type = vecp_from->els[i].type; vecp_to->els[i].size = vecp_from->els[i].size; } else g_printerr ("(vectorg_copy) length of source = %d, of destination = %d\n", vecp_from->nels, vecp_to->nels); } ggobi-2.1.12/src/schemes_ui.c0000644000175000017500000003637614651527764011464 /* schemes_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * It is my understanding that I'm supposed to use gdk_colormap_free_colors * to free anything I've allocated with gdk_colormap_alloc_color(s), but * it just isn't working to free all the svis.color_map colors. * dfs, 10/30/2001 */ #include #include #include #include "vars.h" #include "externs.h" #include "colorscheme.h" static gint xmargin = 20; static gint ymargin = 20; GtkWidget *createColorSchemeTree (int numTypes, gchar * schemeTypes[], ggobid * gg); static void entry_set_scheme_name (ggobid * gg); /*-------------------------------------------------------------------*/ /* Using colorschemed objects */ /*-------------------------------------------------------------------*/ void colorscheme_set_cb (GtkTreeSelection * sel, GtkTreeView * tree_view) { ggobid *gg = GGobiFromWidget (GTK_WIDGET (tree_view), true); gboolean rval = false; GtkTreeModel *model; GGobiData *d; colorschemed *scheme; GtkTreeIter iter; /* * gg->svis sometimes has its own scheme, and then we'll use it. * If it's null, we use gg->activeColorScheme. We update * gg->activeColorScheme to the value of scheme when the user asks. */ if (!gtk_tree_selection_get_selected (sel, &model, &iter)) return; gtk_tree_model_get (model, &iter, 1, &scheme, -1); if (scheme) { gg->svis.scheme = scheme; entry_set_scheme_name (gg); colorscheme_init (scheme); } /*-- delete this line once debugging is complete --*/ displays_plot (NULL, FULL, gg); /*-- rebuild the drawing area in this window --*/ /* * This is using two expose events, which is odd: it's something * to do with getting the numbers of points in each bin to appear, * and there's probably a way to do it better. */ tree_view = gtk_tree_selection_get_tree_view (sel); if (tree_view != NULL) { d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); } else { d = (GGobiData *) g_slist_nth_data (gg->d, 0); } g_signal_emit_by_name (G_OBJECT (gg->svis.da), "expose_event", (gpointer) gg, (gpointer) & rval); } /*-------------------------------------------------------------------------*/ /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget * w, ggobid * gg) { gtk_widget_hide (gg->svis.window); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget * w, GdkEventButton * event, ggobid * gg) { gtk_widget_hide (gg->svis.window); } static gint da_configure_cb (GtkWidget * w, GdkEventConfigure * event, ggobid * gg) { /*-- Create new backing pixmaps of the appropriate size --*/ if (gg->svis.pix != NULL) gdk_pixmap_unref (gg->svis.pix); gg->svis.pix = gdk_pixmap_new (w->window, w->allocation.width, w->allocation.height, -1); gtk_widget_queue_draw (w); return false; } /* * Set the bin boundaries (the values of svis.pct[]) by * simply dividing the range of the data into * scheme->n equal-sized pieces */ static void bin_boundaries_set (GGobiData * d, ggobid * gg) { gint k; /* * These numbers are the upper boundaries of each interval. * By default, they start at .1 and end at 1.0. */ for (k = 0; k < gg->svis.npct; k++) { gg->svis.pct[k] = (gfloat) (k + 1) / (gfloat) gg->svis.npct; } } static void da_expose_cb (GtkWidget * w, GdkEventExpose * event, ggobid * gg) { gint height = w->allocation.height - 2 * ymargin; gint x0, x1, k, hgt; colorschemed *scheme = (gg->svis.scheme != NULL) ? gg->svis.scheme : gg->activeColorScheme; GGobiData *d = NULL; GdkPixmap *pix = gg->svis.pix; if (gg->svis.GC == NULL) gg->svis.GC = gdk_gc_new (w->window); hgt = height / (scheme->n - 1); if (gg->svis.npct != scheme->n) { gg->svis.npct = scheme->n; gg->svis.pct = (gfloat *) g_realloc (gg->svis.pct, gg->svis.npct * sizeof (gfloat)); bin_boundaries_set (d, gg); } /*-- clear the pixmap --*/ gdk_gc_set_foreground (gg->svis.GC, &scheme->rgb_bg); gdk_draw_rectangle (pix, gg->svis.GC, TRUE, 0, 0, w->allocation.width, w->allocation.height); /*-- draw the color bars --*/ x0 = xmargin; for (k = 0; k < scheme->n; k++) { x1 = xmargin + gg->svis.pct[k] * (w->allocation.width - 2 * xmargin); gdk_gc_set_foreground (gg->svis.GC, &scheme->rgb[k]); gdk_draw_rectangle (pix, gg->svis.GC, TRUE, x0, ymargin, x1 - x0, height); x0 = x1; } gdk_draw_pixmap (w->window, gg->svis.GC, pix, 0, 0, 0, 0, w->allocation.width, w->allocation.height); } /* * Find out whether it's possible to use the new scheme * without losing brushing information. If so, go ahead * and change index values if that's required * * If force is true, remap even if the number of colors * is too large. */ /*-- move this to color.c --*/ gboolean colors_remap (colorschemed * scheme, gboolean force, ggobid * gg) { gint i, k; gboolean all_colors_p[MAXNCOLORS]; GSList *l; GGobiData *d; gushort colors_used[MAXNCOLORS]; gint maxcolorid, ncolors_used; gboolean remap_ok = true; for (k = 0; k < MAXNCOLORS; k++) all_colors_p[k] = false; /*-- find out all the colors (indices) are currently in use --*/ for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; datad_colors_used_get (&ncolors_used, colors_used, d, gg); for (k = 0; k < ncolors_used; k++) all_colors_p[colors_used[k]] = true; } /*-- find out how many colors are currently in use --*/ ncolors_used = 0; for (k = 0; k < MAXNCOLORS; k++) if (all_colors_p[k]) ncolors_used++; /*-- find the largest color index currently in use --*/ maxcolorid = -1; for (k = MAXNCOLORS - 1; k > 0; k--) { if (all_colors_p[k]) { maxcolorid = k; break; } } if (maxcolorid < scheme->n) /* no problem, go right ahead */ ; else if (!force && ncolors_used > scheme->n) { /* fatal: bail out with a warning */ quick_message ("The number of colors now in use is greater than than\nthe number of colors in the chosen color scheme. Please choose a color scheme with more colours, or use less colors in the plot.", false); remap_ok = false; } else if (maxcolorid >= scheme->n) { /*-- build the vector that will be used to reset the current indices --*/ gint *newind = (gint *) g_malloc ((maxcolorid + 1) * sizeof (gint)); gint n = 0; for (k = 0; k <= maxcolorid; k++) { if (all_colors_p[k]) { newind[k] = n; /* * try to achieve a decent spread of the color values, * which is helpful in most color maps */ n += ((scheme->n + 1) / ncolors_used); /*-- make sure we haven't gone too far --*/ if (n >= scheme->n - 1) n = scheme->n - 1; } } for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; for (i = 0; i < d->nrows; i++) { d->color.els[i] = newind[d->color.els[i]]; d->color_now.els[i] = newind[d->color_now.els[i]]; /*-- what about color_prev? --*/ } } g_free (newind); } else { g_printerr ("nothing else should possibly happen, no?\n"); } return remap_ok; } static void scale_set_cb (GtkWidget * w, ggobid * gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (w)); GGobiData *d = NULL; gboolean rval = false; if (tree_view) d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); /* * If we've been using gg->svis.scheme, set gg->activeColorScheme * to the current scheme. */ if (gg->svis.scheme) { colorschemed *scheme = gg->svis.scheme; /*-- if no current color index is too high, continue --*/ if (!colors_remap (scheme, false, gg)) return; gg->activeColorScheme = scheme; gg->svis.scheme = NULL; } displays_plot (NULL, FULL, gg); g_signal_emit_by_name (G_OBJECT (gg->svis.da), "expose_event", (gpointer) gg, (gpointer) & rval); entry_set_scheme_name (gg); symbol_window_redraw (gg); cluster_table_update (d, gg); } static void entry_set_scheme_name (ggobid * gg) { gtk_entry_set_text (GTK_ENTRY (gg->svis.entry_preview), (gg->svis.scheme != NULL) ? gg->svis.scheme->name : gg->activeColorScheme->name); gtk_entry_set_text (GTK_ENTRY (gg->svis.entry_applied), gg->activeColorScheme->name); } void svis_window_open (ggobid * gg) { GtkWidget *vbox; GtkWidget *hb; GtkWidget *btn, *label; /*-- for colorscales --*/ GtkWidget *hpane, *tr, *sw; static gchar *colorscaletype_lbl[UNKNOWN_COLOR_TYPE] = { "Diverging", "Sequential", "Spectral", "Qualitative" }; if (gg->svis.window == NULL) { gg->svis.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->svis.window), "Choose Color Scheme"); g_signal_connect (G_OBJECT (gg->svis.window), "delete_event", G_CALLBACK (close_wmgr_cb), gg); hpane = gtk_hpaned_new (); //gtk_paned_set_position (GTK_PANED(hpane), 150); gtk_container_add (GTK_CONTAINER (gg->svis.window), hpane); /* Color scheme tree */ sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (hpane), sw); tr = createColorSchemeTree (UNKNOWN_COLOR_TYPE, colorscaletype_lbl, gg); gtk_widget_set_size_request (sw, 150, 20); gtk_container_add (GTK_CONTAINER (sw), tr); /* * Right half of window */ vbox = gtk_vbox_new (false, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_box_set_spacing (GTK_BOX (vbox), 5); gtk_container_add (GTK_CONTAINER (hpane), vbox); /* Name currently in use */ hb = gtk_hbox_new (true, 0); gtk_box_pack_start (GTK_BOX (vbox), hb, true, true, 5); label = gtk_label_new ("Color scheme in use"); gtk_misc_set_alignment (GTK_MISC (label), 0, .5); gtk_box_pack_start (GTK_BOX (hb), label, true, true, 0); gg->svis.entry_applied = gtk_entry_new (); gtk_editable_set_editable (GTK_EDITABLE (gg->svis.entry_applied), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->svis.entry_applied, "The name of the currently active color scheme.", NULL); gtk_box_pack_start (GTK_BOX (hb), gg->svis.entry_applied, true, true, 0); /**/ /* preview scheme */ hb = gtk_hbox_new (true, 0); gtk_box_pack_start (GTK_BOX (vbox), hb, true, true, 5); label = gtk_label_new ("Color scheme in preview"); gtk_misc_set_alignment (GTK_MISC (label), 0, .5); gtk_box_pack_start (GTK_BOX (hb), label, true, true, 0); gg->svis.entry_preview = gtk_entry_new (); gtk_editable_set_editable (GTK_EDITABLE (gg->svis.entry_preview), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), gg->svis.entry_preview, "The name of the color scheme whose colors are displayed below.", NULL); gtk_box_pack_start (GTK_BOX (hb), gg->svis.entry_preview, true, true, 0); /* Drawing area */ gg->svis.da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (gg->svis.da, false); gtk_widget_set_size_request (GTK_WIDGET (gg->svis.da), 300, 150); gtk_box_pack_start (GTK_BOX (vbox), gg->svis.da, false, false, 0); g_signal_connect (G_OBJECT (gg->svis.da), "configure_event", G_CALLBACK (da_configure_cb), (gpointer) gg); g_signal_connect (G_OBJECT (gg->svis.da), "expose_event", G_CALLBACK (da_expose_cb), (gpointer) gg); gtk_widget_set_events (gg->svis.da, GDK_EXPOSURE_MASK); /* Initializes both entries */ entry_set_scheme_name (gg); /*-- add a close button --*/ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), false, true, 2); hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 1); /* Apply button */ btn = gtk_button_new_from_stock (GTK_STOCK_APPLY); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Make this the current color scheme for brushing in ggobi, preserving current color groups. If the number of colors in the new scheme is less than the number of colors currently in use, this won't work.", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, true, 2); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (scale_set_cb), gg); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Close the window", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, true, 2); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); } gtk_widget_show_all (gg->svis.window); gdk_window_raise (gg->svis.window->window); } GtkWidget *createSchemeColorsTree (colorschemed * scheme); /** Create the tree displaying the colorscheme information. This displays the different levels: types of schemes, different schemes within each type, colors within each scheme. */ GtkWidget * createColorSchemeTree (gint numTypes, gchar * schemeTypes[], ggobid * gg) { //GtkWidget *item; //GtkWidget **trees, *top; /*GtkWidget *tree; */ GtkWidget *tree_view; GtkTreeStore *model; GtkTreeIter *iters; gint n; GList *l; colorschemed *scheme; model = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); iters = g_new (GtkTreeIter, numTypes); for (n = 0; n < numTypes; n++) { gtk_tree_store_append (GTK_TREE_STORE (model), &iters[n], NULL); gtk_tree_store_set (GTK_TREE_STORE (model), &iters[n], 0, schemeTypes[n], 1, NULL, -1); } for (l = gg->colorSchemes; l; l = l->next) { GtkTreeIter iter; scheme = (colorschemed *) l->data; gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &iters[scheme->type]); gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 0, scheme->name, 1, scheme, -1); } tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); GGobi_widget_set (tree_view, gg, true); populate_tree_view (tree_view, NULL, 1, false, GTK_SELECTION_SINGLE, G_CALLBACK (colorscheme_set_cb), tree_view); return (tree_view); } ggobi-2.1.12/src/ggobi-data.h0000644000175000017500000003011414651527764011323 /* Generated by GOB (v2.0.20) (do not edit directly) */ #include #include #ifndef __GGOBI_DATA_H__ #define __GGOBI_DATA_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "defines.h" #include "brushing.h" #include "vartable.h" #include "fileio.h" #include typedef struct _Subset { gint random_n; gint string_pos; /*-- adjustments from which to get values for blocksize, everyn --*/ GtkAdjustment *bstart_adj, *bsize_adj; GtkAdjustment *estart_adj, *estep_adj; } Subset; typedef struct _Jitterd { gfloat factor; gboolean type; gboolean convex; gfloat *jitfacv; } Jitterd; typedef struct _Varpanel_cboxd { GtkWidget *ebox; /*-- child1 of pane widget --*/ GtkWidget *swin; /*-- child of ebox --*/ GtkWidget *vbox; /*-- child of swin --*/ GSList *box; /*-- single column of hboxes --*/ } Varpanel_cboxd; typedef struct _Varpanel_circd { GtkWidget *ebox; /*-- child2 of pane widget --*/ GtkWidget *vbox; /*-- child of ebox --*/ GtkWidget *swin, *hbox; /*-- children of vbox --*/ GtkWidget *table; /*-- sole child of swin; now a vbox --*/ GtkWidget *manip_btn, *freeze_btn; /*-- children of hbox --*/ GdkCursor *cursor; gint jcursor; /*-- components and properties of the table --*/ GSList *vb, *da, *label; GSList *da_pix; /*-- backing pixmaps --*/ gint nvars; } Varpanel_circd; typedef struct _Varpaneld { GtkWidget *hpane; /*-- child of the ebox --*/ } Varpaneld; /*-------------------- transformation --------------------------------*/ /* sphering transformation */ typedef struct _Sphere_d { vector_i vars; /*-- vars available to be sphered --*/ vector_i vars_sphered;/*-- vars that have been sphered --*/ gint npcs; /*-- the first npcs vars of vars will be sphered --*/ vector_i pcvars;/*-- vars into which sphered data is written --*/ vector_f eigenval; array_d eigenvec; array_f vc; vector_f tform_mean; vector_f tform_stddev; gboolean vars_stdized; } Sphere_d; typedef struct _EdgeData { gint n; SymbolicEndpoints *sym_endpoints; GList *endpointList; /* a list of endpointsd elements corresponding to the resolved record ids relative to a given datad. This is akin to a table indexed by datad elements. */ gint nxed_by_brush; vector_b xed_by_brush; } EdgeData; typedef struct _BrushBins { gint nbins; bin_struct **binarray; icoords bin0, bin1; } BrushBins; /* * Type checking and casting macros */ #define GGOBI_TYPE_DATA (ggobi_data_get_type()) #define GGOBI_DATA(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_data_get_type(), GGobiData) #define GGOBI_DATA_CONST(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_data_get_type(), GGobiData const) #define GGOBI_DATA_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), ggobi_data_get_type(), GGobiDataClass) #define GGOBI_IS_DATA(obj) G_TYPE_CHECK_INSTANCE_TYPE((obj), ggobi_data_get_type ()) #define GGOBI_DATA_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), ggobi_data_get_type(), GGobiDataClass) /* * Main object structure */ #ifndef __TYPEDEF_GGOBI_DATA__ #define __TYPEDEF_GGOBI_DATA__ typedef struct _GGobiData GGobiData; #endif struct _GGobiData { GObject __parent__; /*< public >*/ const gchar * name; const gchar * nickname; InputDescription * input; guint nrows; gint ncols; gboolean missings; struct _ggobid * gg; GArray * rowlab; GHashTable * idTable; char ** rowIds; vartabled * linkvar_vt; Subset subset; Jitterd jitter; Varpanel_cboxd vcbox_ui; Varpanel_circd vcirc_ui; Varpaneld varpanel_ui; Sphere_d sphere; EdgeData edge; BrushBins brush; GSList * vartable; GtkWidget * vartable_tree_view[all_vartypes]; GtkTreeModel * vartable_tree_model; array_f raw; array_f tform; array_g world; array_g jitdata; array_s missing; gboolean missings_show_p; vector_i rows_in_plot; gint nrows_in_plot; vector_b sampled; vector_b excluded; symbol_cell symbol_table[NGLYPHTYPES][NGLYPHSIZES][MAXNCOLORS]; GtkWidget * cluster_table; gint nclusters; clusterd * clusv; clusteruid * clusvui; vector_i clusterid; gint npts_under_brush; vector_b pts_under_brush; vector_s color; vector_s color_now; vector_s color_prev; vector_b hidden; vector_b hidden_now; vector_b hidden_prev; vector_g glyph; vector_g glyph_now; vector_g glyph_prev; gint nearest_point; gint nearest_point_prev; GSList * sticky_ids; GSList * movepts_history; }; /* * Class definition */ typedef struct _GGobiDataClass GGobiDataClass; struct _GGobiDataClass { GObjectClass __parent__; /*signal*/void (* rows_in_plot_changed) (GGobiData * self, int arg1, int arg2, ggobid * arg3); /*signal*/void (* col_name_changed) (GGobiData * self, int j); }; /* * Public methods */ GType ggobi_data_get_type (void) G_GNUC_CONST; #line 182 "data.gob" guint ggobi_data_get_nrows (GGobiData * self); #line 199 "ggobi-data.h" #line 182 "data.gob" void ggobi_data_set_nrows (GGobiData * self, guint val); #line 203 "ggobi-data.h" #line 186 "data.gob" guint ggobi_data_get_ncols (GGobiData * self); #line 206 "ggobi-data.h" #line 186 "data.gob" void ggobi_data_set_ncols (GGobiData * self, guint val); #line 210 "ggobi-data.h" #line 193 "data.gob" void ggobi_data_col_name_changed (GGobiData * self, int j); #line 214 "ggobi-data.h" #line 235 "data.gob" GGobiData * ggobi_data_new (guint nrows, guint ncols); #line 218 "ggobi-data.h" #line 248 "data.gob" gchar * ggobi_data_get_name (GGobiData * self); #line 221 "ggobi-data.h" #line 254 "data.gob" void ggobi_data_set_name (GGobiData * self, gchar * name, gchar * nickname); #line 226 "ggobi-data.h" #line 264 "data.gob" guint ggobi_data_get_n_cols (GGobiData * self); #line 229 "ggobi-data.h" #line 269 "data.gob" guint ggobi_data_get_n_rows (GGobiData * self); #line 232 "ggobi-data.h" #line 275 "data.gob" gchar * ggobi_data_get_col_name (GGobiData * self, guint j); #line 236 "ggobi-data.h" #line 282 "data.gob" void ggobi_data_set_col_name (GGobiData * self, guint j, gchar * value); #line 241 "ggobi-data.h" #line 309 "data.gob" gchar * ggobi_data_get_transformed_col_name (GGobiData * self, guint j); #line 245 "ggobi-data.h" #line 316 "data.gob" void ggobi_data_set_transformed_col_name (GGobiData * self, guint j, gchar * value); #line 250 "ggobi-data.h" #line 330 "data.gob" void ggobi_data_set_missing (GGobiData * self, guint i, guint j); #line 255 "ggobi-data.h" #line 338 "data.gob" gboolean ggobi_data_is_missing (GGobiData * self, guint i, guint j); #line 260 "ggobi-data.h" #line 344 "data.gob" gboolean ggobi_data_has_missings (GGobiData * self); #line 263 "ggobi-data.h" #line 351 "data.gob" guint ggobi_data_get_col_n_missing (GGobiData * self, guint j); #line 267 "ggobi-data.h" #line 362 "data.gob" void ggobi_data_set_raw_values (GGobiData * self, guint j, gdouble * values); #line 272 "ggobi-data.h" #line 371 "data.gob" void ggobi_data_set_raw_value (GGobiData * self, guint i, guint j, gdouble value); #line 278 "ggobi-data.h" #line 419 "data.gob" gchar * ggobi_data_get_string_value (GGobiData * self, guint i, guint j, gboolean transformed); #line 284 "ggobi-data.h" #line 445 "data.gob" gboolean ggobi_data_has_edges (GGobiData * self); #line 287 "ggobi-data.h" #line 451 "data.gob" gboolean ggobi_data_has_variables (GGobiData * self); #line 290 "ggobi-data.h" /* * Signal connection wrapper macros */ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define ggobi_data_connect__rows_in_plot_changed(object,func,data) g_signal_connect(GGOBI_DATA(__extension__ ({GGobiData *___object = (object); ___object; })),"rows_in_plot_changed",(GCallback) __extension__ ({void (* ___rows_in_plot_changed) (GGobiData * ___fake___self, int ___fake___arg1, int ___fake___arg2, ggobid * ___fake___arg3, gpointer ___data ) = (func); ___rows_in_plot_changed; }), (data)) #define ggobi_data_connect_after__rows_in_plot_changed(object,func,data) g_signal_connect_after(GGOBI_DATA(__extension__ ({GGobiData *___object = (object); ___object; })),"rows_in_plot_changed",(GCallback) __extension__ ({void (* ___rows_in_plot_changed) (GGobiData * ___fake___self, int ___fake___arg1, int ___fake___arg2, ggobid * ___fake___arg3, gpointer ___data ) = (func); ___rows_in_plot_changed; }), (data)) #define ggobi_data_connect_data__rows_in_plot_changed(object,func,data,destroy_data,flags) g_signal_connect_data(GGOBI_DATA(__extension__ ({GGobiData *___object = (object); ___object; })),"rows_in_plot_changed",(GCallback) __extension__ ({void (* ___rows_in_plot_changed) (GGobiData * ___fake___self, int ___fake___arg1, int ___fake___arg2, ggobid * ___fake___arg3, gpointer ___data ) = (func); ___rows_in_plot_changed; }), (data), (destroy_data), (GConnectFlags)(flags)) #define ggobi_data_connect__col_name_changed(object,func,data) g_signal_connect(GGOBI_DATA(__extension__ ({GGobiData *___object = (object); ___object; })),"col_name_changed",(GCallback) __extension__ ({void (* ___col_name_changed) (GGobiData * ___fake___self, int ___fake___j, gpointer ___data ) = (func); ___col_name_changed; }), (data)) #define ggobi_data_connect_after__col_name_changed(object,func,data) g_signal_connect_after(GGOBI_DATA(__extension__ ({GGobiData *___object = (object); ___object; })),"col_name_changed",(GCallback) __extension__ ({void (* ___col_name_changed) (GGobiData * ___fake___self, int ___fake___j, gpointer ___data ) = (func); ___col_name_changed; }), (data)) #define ggobi_data_connect_data__col_name_changed(object,func,data,destroy_data,flags) g_signal_connect_data(GGOBI_DATA(__extension__ ({GGobiData *___object = (object); ___object; })),"col_name_changed",(GCallback) __extension__ ({void (* ___col_name_changed) (GGobiData * ___fake___self, int ___fake___j, gpointer ___data ) = (func); ___col_name_changed; }), (data), (destroy_data), (GConnectFlags)(flags)) #else /* __GNUC__ && !__STRICT_ANSI__ */ #define ggobi_data_connect__rows_in_plot_changed(object,func,data) g_signal_connect(GGOBI_DATA(object),"rows_in_plot_changed",(GCallback)(func),(data)) #define ggobi_data_connect_after__rows_in_plot_changed(object,func,data) g_signal_connect_after(GGOBI_DATA(object),"rows_in_plot_changed",(GCallback)(func),(data)) #define ggobi_data_connect_data__rows_in_plot_changed(object,func,data,destroy_data,flags) g_signal_connect_data(GGOBI_DATA(object),"rows_in_plot_changed",(GCallback)(func),(data),(destroy_data),(GConnectFlags)(flags)) #define ggobi_data_connect__col_name_changed(object,func,data) g_signal_connect(GGOBI_DATA(object),"col_name_changed",(GCallback)(func),(data)) #define ggobi_data_connect_after__col_name_changed(object,func,data) g_signal_connect_after(GGOBI_DATA(object),"col_name_changed",(GCallback)(func),(data)) #define ggobi_data_connect_data__col_name_changed(object,func,data,destroy_data,flags) g_signal_connect_data(GGOBI_DATA(object),"col_name_changed",(GCallback)(func),(data),(destroy_data),(GConnectFlags)(flags)) #endif /* __GNUC__ && !__STRICT_ANSI__ */ /* * Argument wrapping macros */ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define GGOBI_DATA_PROP_NROWS(arg) "nrows", __extension__ ({guint z = (arg); z;}) #define GGOBI_DATA_GET_PROP_NROWS(arg) "nrows", __extension__ ({guint *z = (arg); z;}) #define GGOBI_DATA_PROP_NCOLS(arg) "ncols", __extension__ ({guint z = (arg); z;}) #define GGOBI_DATA_GET_PROP_NCOLS(arg) "ncols", __extension__ ({guint *z = (arg); z;}) #else /* __GNUC__ && !__STRICT_ANSI__ */ #define GGOBI_DATA_PROP_NROWS(arg) "nrows",(guint )(arg) #define GGOBI_DATA_GET_PROP_NROWS(arg) "nrows",(guint *)(arg) #define GGOBI_DATA_PROP_NCOLS(arg) "ncols",(guint )(arg) #define GGOBI_DATA_GET_PROP_NCOLS(arg) "ncols",(guint *)(arg) #endif /* __GNUC__ && !__STRICT_ANSI__ */ void freeLevelHashEntry(gpointer key, gpointer value, gpointer data); /*-- used as an attribute of variable notebooks --*/ typedef enum {no_edgesets, edgesets_only, all_datatypes} datatyped; extern endpointsd *resolveEdgePoints(GGobiData *e, GGobiData *d); void unresolveAllEdgePoints(GGobiData *e); void datad_record_ids_set(GGobiData *d, gchar **ids, gboolean duplicate); void ggobi_data_set_row_labels(GGobiData *d, gchar **labels); #ifdef __cplusplus } #endif /* __cplusplus */ #endif ggobi-2.1.12/src/make_ggobi.c0000644000175000017500000001311614651527764011407 /*-- make_ggobi.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include "vars.h" #include "externs.h" #include "read_xml.h" #include "plugin.h" #ifdef USE_MYSQL #include "read_mysql.h" #endif guint GGobiSignals[MAX_GGOBI_SIGNALS]; /*-- initialize variables which don't depend on the size of the data --*/ void globals_init (ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; gg->close_pending = false; gg->glyph_id.type = gg->glyph_0.type = FC; gg->glyph_id.size = gg->glyph_0.size = 1; gg->color_0 = 0; gg->color_id = scheme->n - 1; /* default: initialize to last color */ /* can be overriden in xml file */ /*-- for linking by categorical variable --*/ gg->linkby_cv = false; gg->lims_use_visible = true; gg->buttondown = 0; /*-- no button is pressed --*/ gg->d = NULL; gg->statusbar_p = true; } gboolean fileset_read_init (const gchar * ldata_in, const gchar * pluginModeName, GGobiPluginInfo * plugin, ggobid * gg) { GSList *ds = fileset_read (ldata_in, pluginModeName, plugin, gg); for (; ds; ds = ds->next) { datad_init ((GGobiData *) ds->data, gg, FALSE); } return (ds != NULL); } // returns a list of datasets (some input types (eg. xml) may return multiple data types) GSList * fileset_read (const gchar * ldata_in, const gchar * pluginModeName, GGobiPluginInfo * plugin, ggobid * gg) { InputDescription *desc; desc = fileset_generate (ldata_in, pluginModeName, plugin, gg); if (desc == NULL) { g_printerr ("Cannot locate the file %s\n", ldata_in); return NULL; } if (desc->mode == unknown_data && desc->desc_read_input == NULL) { g_printerr ("Cannot determine the format of the data in file %s\n", desc->fileName); return NULL; } gg->input = desc; return (read_input (desc, gg)); } // returns a list of datasets (some input types (eg. xml) may return multiple data types) GSList * read_input (InputDescription * desc, ggobid * gg) { GSList *ds = NULL; if (desc == NULL) return (NULL); if (desc->desc_read_input) { if (!desc->baseName) completeFileDesc (desc->fileName, desc); ds = desc->desc_read_input (desc, gg, NULL); } else g_printerr ("Unknown data type in read_input\n"); if (ds && sessionOptions->verbose == GGOBI_VERBOSE) { showInputDescription (desc, gg); } return (ds); } /* * the first display is initialized in datad_init, so turn on * event handlers there as well */ void make_ggobi (GGobiOptions * options, gboolean processEvents, ggobid * gg) { gboolean init_data = false; /*-- some initializations --*/ gg->displays = NULL; globals_init (gg); /*-- variables that don't depend on the data --*/ special_colors_init (gg); wvis_init (gg); svis_init (gg); make_ui (gg); /* If the user specified a data file on the command line, then try to load that. If not, then look through the input plugins for the first interactive one (i.e. with an interactive="true" attribute) and then we try to run that. This allows input plugins that provide a user interface to query the user as to what to do. */ if (options->data_in != NULL) { if (fileset_read_init (options->data_in, sessionOptions->data_type, NULL, gg)) { init_data = true; } } else { if (runInteractiveInputPlugin (gg) == NULL) { if (sessionOptions->data_type) fprintf (stderr, "No available plugin to handle input mode %s\n", sessionOptions->data_type); fflush (stderr); } } if (sessionOptions->info != NULL) registerPlugins (gg, sessionOptions->info->plugins); resetDataMode (); start_ggobi (gg, init_data, sessionOptions->info->createInitialScatterPlot); if (sessionOptions->restoreFile) { processRestoreFile (sessionOptions->restoreFile, gg); } gg->status_message_func = gg_write_to_statusbar; if (processEvents) { gtk_main (); } } void resetDataMode () { if (sessionOptions->data_type) free (sessionOptions->data_type); sessionOptions->data_type = NULL; sessionOptions->data_mode = unknown_data; } void start_ggobi (ggobid * gg, gboolean init_data, gboolean createPlot) { GGobiData *d; if (init_data) { GSList *l; gboolean firstd = createPlot; for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; datad_init (d, gg, firstd); firstd = false; } /*-- destroy and rebuild the menu every time data is read in --*/ display_menu_build (gg); } /*-- now that we've read some data, set the mode --*/ if (createPlot && gg->d) { d = (GGobiData *) gg->d->data; if (d != NULL) { if (d->ncols > 0) { gg->pmode = (d->ncols == 1) ? P1PLOT : XYPLOT; gg->imode = DEFAULT_IMODE; } } } else { gg->pmode = NULL_PMODE; gg->imode = NULL_IMODE; } gg->pmode_prev = gg->pmode; gg->imode_prev = gg->imode; /*-- initialize the mode menus for the new mode --*/ /*main_miscmenus_update(NULL_PMODE, NULL_IMODE, (displayd *) NULL, gg); */ } ggobi-2.1.12/src/read_init.c0000644000175000017500000006732214651527764011271 /* read_init.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* Reads initialization file. */ #include "read_init.h" #include "read_xml.h" /* for asNumber() */ #include #include #include /* for xmlDoValidityChecking */ #include #include "plugin.h" #include "GGobiAPI.h" #include "externs.h" #include "tour.h" const gchar *const GlyphNames[] = { /* ".", "+", "x", "or", "fr", "oc", "fc", "" */ ".", "plus", "x", "oc", "or", "fc", "fr", "" }; gint getPreviousFiles (const xmlDocPtr doc, GGobiInitInfo * info); DataMode getPreviousInput (xmlNode * node, InputDescription * input); DataMode getInputType (xmlNode * node); gboolean getLogicalPreference (xmlNodePtr node, const char *elName, gboolean defaultValue); int getPlugins (xmlDocPtr doc, GGobiInitInfo * info, gboolean single); GGobiPluginInfo *processPlugin (xmlNodePtr node, GGobiInitInfo * info, xmlDocPtr doc); GGobiPluginInfo *processInputPlugin (xmlNodePtr node, GGobiInitInfo * info, xmlDocPtr doc); void getPluginSymbols (xmlNodePtr node, GGobiPluginInfo * plugin, xmlDocPtr doc, gboolean isLanguage); void getInputPluginValues (xmlNodePtr node, GGobiInputPluginInfo * plugin, xmlDocPtr doc); gboolean getPluginDetails (xmlNodePtr node, GGobiPluginDetails * plugin, xmlDocPtr doc); gboolean getPluginLanguage (xmlNodePtr node, GGobiPluginInfo * gplugin, GGobiPluginType type, GGobiInitInfo * info); GHashTable *getPluginNamedOptions (xmlNodePtr node, GGobiPluginDetails * info, xmlDocPtr doc); GSList *getPluginUnnamedArguments (xmlNodePtr node, GGobiPluginDetails * info, xmlDocPtr doc); gboolean getPluginOptions (xmlNodePtr node, GGobiPluginDetails * info, xmlDocPtr doc); GSList *getPluginDependencies (xmlNodePtr node, GGobiPluginDetails * info, xmlDocPtr doc); gint getPreviousGGobiDisplays (const xmlDocPtr doc, GGobiInitInfo * info); GGobiDisplayDescription *getDisplayDescription (xmlNodePtr node); gint getPreferences (const xmlDocPtr doc, GGobiInitInfo * info); GGobiInitInfo * read_init_file (const gchar * filename, GGobiInitInfo * info) { xmlDocPtr doc; gchar *fileName = NULL; gint oldValiditySetting = xmlDoValidityCheckingDefaultValue; xmlSubstituteEntitiesDefault (1); xmlDoValidityCheckingDefaultValue = false; if (sessionOptions->verbose == GGOBI_VERBOSE) g_printerr ("Reading initialization file %s\n", filename); fileName = g_strdup (filename); doc = xmlParseFile (fileName); if (doc == NULL) { return (info); } if (info == NULL) info = (GGobiInitInfo *) g_malloc (sizeof (GGobiInitInfo)); info->numInputs = 0; info->descriptions = NULL; info->filename = g_strdup (filename); getPreferences (doc, info); getPreviousFiles (doc, info); getPreviousGGobiDisplays (doc, info); info->plugins = NULL; getPlugins (doc, info, false); xmlDoValidityCheckingDefaultValue = oldValiditySetting; /* Causes a crash when started with -init notes/ggobirc, but not if there is a -colorschemes filename g_free(fileName); */ /* Should release the doc object also. */ xmlFreeDoc (doc); return (info); } /* Find a node with a secified tag Name */ xmlNode * getXMLDocElement (const xmlDocPtr doc, const char *tagName) { xmlNode *node = xmlDocGetRootElement (doc); return (getXMLElement (node, tagName)); } xmlNode * getXMLElement (xmlNodePtr node, const char *tagName) { if (xmlStrcmp (node->name, BAD_CAST (tagName)) == 0) return (node); node = XML_CHILDREN (node); while (node) { if (xmlStrcmp (node->name, BAD_CAST (tagName)) == 0) { return (node); } node = node->next; } return (node); } static void getTourSpeedValue (xmlNodePtr node, const xmlDocPtr doc, const gchar * name, gfloat * value) { xmlNodePtr el = getXMLElement (node, name); if (el) { xmlChar *tmp; gfloat val; tmp = xmlNodeListGetString (doc, XML_CHILDREN (el), 1); val = atof ((char *) tmp); if (val > 0 && val < MAX_TOUR_SPEED) *value = val; else g_printerr ("Value for %s in preferences file is invalid: %f\n", name, val); } } gint getPreferences (const xmlDocPtr doc, GGobiInitInfo * info) { xmlNode *node, *el; /*gint n, i; */ node = getXMLDocElement (doc, "preferences"); if (!node) return (-1); /* Don't read this setting if the user has specified a value in the command line argument. */ if (info->colorSchemeFile == NULL) { el = getXMLElement (node, "colorschemes"); if (el) { gchar *tmp; tmp = (gchar *) xmlGetProp (el, (xmlChar *) "file"); info->colorSchemeFile = g_strdup (tmp); } } info->bgColor = NULL; /*-- this needs to be initialized --*/ el = getXMLElement (node, "background"); if (el) { el = getXMLElement (el, "color"); if (el) { info->bgColor = (GdkColor *) g_malloc (sizeof (GdkColor)); getColor (el, doc, NULL, info->bgColor); if (gdk_colormap_alloc_color (gdk_colormap_get_system (), info->bgColor, false, true) == false) { g_printerr ("Can't allocate background color\n"); } } } info->fgColor = NULL; /*-- this needs to be initialized --*/ el = getXMLElement (node, "foreground"); if (el) { el = getXMLElement (el, "color"); if (el) { info->fgColor = (GdkColor *) g_malloc (sizeof (GdkColor)); getColor (el, doc, NULL, info->fgColor); if (gdk_colormap_alloc_color (gdk_colormap_get_system (), info->fgColor, false, true) == false) { g_printerr ("Can't allocate foreground color\n"); } } } el = getXMLElement (node, "glyph"); if (el) { gchar *tmp; tmp = (gchar *) xmlGetProp (el, (xmlChar *) "type"); if (tmp) { info->glyph.type = mapGlyphName (tmp); } tmp = (gchar *) xmlGetProp (el, (xmlChar *) "size"); if (tmp) { info->glyph.size = asNumber (tmp); } } /* Whether to use check menu items. XXX should this be in info or sessionOptions. */ sessionOptions->useRadioMenuItems = getLogicalPreference (node, "useRadioMenuItems", false); info->createInitialScatterPlot = getLogicalPreference (node, "autoplot", true); /* If we autoplot, then we will by default expect there to be at least one plot, so our default value for allowNoDisplays is the negation of autoplot. */ info->allowCloseLastDisplay = getLogicalPreference (node, "allowNoDisplays", !info->createInitialScatterPlot); info->quitWithNoGGobi = getLogicalPreference (node, "quitOnLastGGobi", info->allowCloseLastDisplay); el = getXMLElement (node, "numDefaultPlotVars"); if (el) { gchar *tmp; tmp = (gchar *) xmlGetProp (el, (xmlChar *) "scatmat"); if (tmp) { info->numScatMatrixVars = asNumber (tmp); } tmp = (gchar *) xmlGetProp (el, (xmlChar *) "parcoords"); if (tmp) { info->numParCoordsVars = asNumber (tmp); } tmp = (gchar *) xmlGetProp (el, (xmlChar *) "timeplot"); if (tmp) { info->numTimePlotVars = asNumber (tmp); } } el = getXMLElement (node, "sessionFile"); if (el) { gchar *tmp; tmp = (gchar *) xmlGetProp (el, (xmlChar *) "name"); if (tmp) info->sessionFile = g_strdup (tmp); tmp = (gchar *) xmlGetProp (el, (xmlChar *) "compress"); if (tmp) info->compress = asNumber (tmp); } getTourSpeedValue (node, doc, "tourSpeed", &sessionOptions->defaultTourSpeed); getTourSpeedValue (node, doc, "tour1dSpeed", &sessionOptions->defaultTourSpeed); return (0); } gboolean getLogicalPreference (xmlNodePtr node, const char *elName, gboolean defaultValue) { xmlNodePtr el; gboolean val = defaultValue; el = getXMLElement (node, elName); if (el) { gchar *tmp; tmp = (gchar *) xmlGetProp (el, (xmlChar *) "on"); if (tmp) { val = asLogical (tmp); } else { val = true; } } return (val); } gint getPreviousFiles (const xmlDocPtr doc, GGobiInitInfo * info) { xmlNode *node, *el; gint n, i; node = getXMLDocElement (doc, "previousFiles"); if (node == NULL) return (0); n = 0; el = XML_CHILDREN (node); while (el) { if (el->type != XML_TEXT_NODE) n++; el = el->next; } info->descriptions = g_malloc0 (n * sizeof (GGobiDescription)); info->numInputs = n; el = XML_CHILDREN (node); for (i = 0; el; el = el->next) { /* */ if (el->type != XML_TEXT_NODE) { /* * dfs; trying to get past my compiler */ /*memset((void*) info->descriptions+i, '\0', sizeof(GGobiDescription)); */ getPreviousInput (el, &(info->descriptions[i].input)); i++; } } return (n); } DataMode getPreviousInput (xmlNode * node, InputDescription * input) { const gchar *tmp; DataMode mode = getInputType (node); input->mode = mode; if ((tmp = (gchar *) xmlGetProp (node, (xmlChar *) "name"))) { input->fileName = g_strdup (tmp); } else input->fileName = NULL; /* This shold be connected to completeFileDesc(input->fileName, input); */ if (input->fileName) { completeFileDesc(input->fileName, input); } input->canVerify = 0; return (mode); } DataMode getInputType (xmlNode * node) { const xmlChar *tag; const xmlChar *mode; DataMode val = unknown_data; tag = node->name; if (strcmp ((char *) tag, "url") == 0) { val = url_data; } else if (strcmp ((char *) tag, "database") == 0) val = mysql_data; else { mode = xmlGetProp (node, (xmlChar *) "mode"); if (strcmp ((char *) tag, "file") == 0) { if (strcmp ((char *) mode, "xml") == 0) val = xml_data; } } return (val); } /*****************************************************************/ gint getPreviousGGobiDisplays (const xmlDocPtr doc, GGobiInitInfo * info) { xmlNode *node, *el; GGobiDescription *desc = NULL; gint i; node = getXMLDocElement (doc, "ggobis"); if (node) { el = XML_CHILDREN (node); i = 0; while (el) { if (el->type != XML_TEXT_NODE && strcmp ((char *) el->name, "ggobi") == 0) { /* Need to match these with the input source ids. */ desc = info->descriptions + i; getPreviousDisplays (el, desc); i++; } el = el->next; } } if (!desc) return (-1); return (g_list_length (desc->displays)); } gint getPreviousDisplays (xmlNodePtr node, GGobiDescription * desc) { xmlNodePtr el = XML_CHILDREN (node); GGobiDisplayDescription *dpy; gint n = 0; desc->displays = NULL; while (el) { if (el->type != XML_TEXT_NODE && strcmp ((char *) el->name, "display") == 0) { dpy = getDisplayDescription (el); if (dpy) { desc->displays = g_list_append (desc->displays, dpy); n++; } } el = el->next; } return (n); } GGobiDisplayDescription * getDisplayDescription (xmlNodePtr node) { GGobiDisplayDescription *dpy; xmlNodePtr el; gint i; xmlChar *tmp; dpy = (GGobiDisplayDescription *) g_malloc0 (sizeof (GGobiDisplayDescription)); dpy->canRecreate = true; tmp = xmlGetProp (node, (xmlChar *) "type"); dpy->typeName = g_strdup ((gchar *) tmp); tmp = xmlGetProp (node, (xmlChar *) "data"); if (tmp) { dpy->data = strToInteger ((char *) tmp) - 1; if (dpy->data < 0) dpy->datasetName = g_strdup ((gchar *) tmp); } else dpy->data = 0; if (xmlGetProp (node, (xmlChar *) "unsupported")) dpy->canRecreate = false; dpy->numVars = 0; el = XML_CHILDREN (node); while (el) { if (el->type != XML_TEXT_NODE && strcmp ((char *) el->name, "variable") == 0) dpy->numVars++; el = el->next; } dpy->varNames = (gchar **) g_malloc (dpy->numVars * sizeof (gchar *)); for (i = 0, el = XML_CHILDREN (node); i < dpy->numVars; el = el->next) { if (el->type != XML_TEXT_NODE && strcmp ((char *) el->name, "variable") == 0) { dpy->varNames[i++] = g_strdup ((char *) xmlGetProp (el, (xmlChar *) "name")); } } return (dpy); } /*****************************************************************/ /* Handle the plugins section, looping over each tag and passing it processPlugin(). */ static gboolean processXMLPluginNode (xmlNodePtr el, GGobiInitInfo * info, xmlDocPtr doc) { GGobiPluginInfo *plugin; gboolean ans = true; if (el->type != XML_TEXT_NODE) { if (strcmp ((char *) el->name, "plugin") == 0) { plugin = processPlugin (el, info, doc); if (plugin) { info->plugins = g_list_append (info->plugins, plugin); } } else if (strcmp ((char *) el->name, "inputPlugin") == 0) { GGobiPluginInfo *inputPlugin = processInputPlugin (el, info, doc); if (inputPlugin) { info->inputPlugins = g_list_append (info->inputPlugins, inputPlugin); } } else ans = false; } else ans = false; return (ans); } int processPluginNodes (xmlNode * el, GGobiInitInfo * info, xmlDocPtr doc) { int count = 0; if (el == NULL) return (-1); while (el) { if (processXMLPluginNode (el, info, doc)) count++; el = el->next; } return (count); } int getPlugins (xmlDocPtr doc, GGobiInitInfo * info, gboolean single) { xmlNode *node, *el = NULL; int count = 0; if (single) { /* Call recursively with single = false to get the "plugins" element. If there are any, then return assuming that we have .... We will ignore any outside of this. */ if ((count = getPlugins (doc, info, false)) > -1) return (count); /* Now handle the stand-alone elements. */ el = getXMLDocElement (doc, "plugin"); count = processPluginNodes (el, info, doc); el = getXMLDocElement (doc, "inputPlugin"); count += processPluginNodes (el, info, doc); } else { node = getXMLDocElement (doc, "plugins"); if (node) el = XML_CHILDREN (node); } return (processPluginNodes (el, info, doc)); } /* This handles the details of a tag, reading the description, author, etc. */ #define GET_PROP_VALUE(field,name) symInfo->field = ((tmp = xmlGetProp(c, BAD_CAST(name))) != NULL) ? g_strdup((gchar *)tmp) : NULL /** Get all the configuration values and optional settings for this plugin. */ GGobiPluginInfo * processPlugin (xmlNodePtr node, GGobiInitInfo * info, xmlDocPtr doc) { gboolean load; GGobiPluginInfo *plugin; gboolean isLanguage; plugin = (GGobiPluginInfo *) g_malloc0 (sizeof (GGobiPluginInfo)); plugin->details = g_malloc0 (sizeof (GGobiPluginDetails)); plugin->info.g = g_malloc0 (sizeof (GGobiGeneralPluginInfo)); load = getPluginDetails (node, plugin->details, doc); isLanguage = (xmlGetProp (node, (xmlChar *) "providesLanguage") != NULL); getPluginSymbols (node, plugin, doc, isLanguage); getPluginOptions (node, plugin->details, doc); plugin->details->depends = getPluginDependencies (node, plugin->details, doc); /* Weird casting going on here to avoid a void*. */ getPluginLanguage (node, plugin, GENERAL_PLUGIN, info); if (load) { loadPluginLibrary (plugin->details, plugin); } return (plugin); } /** Pick up and store the named and unnamed arguments for this plugin. These will be interpreted in a plugin-specific manner. */ gboolean getPluginOptions (xmlNodePtr node, GGobiPluginDetails * details, xmlDocPtr doc) { xmlNodePtr c; c = getXMLElement (node, "options"); if (!c) return (false); details->args = getPluginUnnamedArguments (c, details, doc); details->namedArgs = getPluginNamedOptions (c, details, doc); return (true); } /** Collect the options for the plugin that are enclosed within a element of the form value. The different `value's are stored in a simple single-linked list. */ GSList * getPluginUnnamedArguments (xmlNodePtr node, GGobiPluginDetails * details, xmlDocPtr doc) { GSList *l = NULL; xmlNodePtr c, el; c = getXMLElement (node, "args"); if (!c) return (NULL); el = XML_CHILDREN (c); while (el) { if (el->type != XML_TEXT_NODE && el->type != XML_COMMENT_NODE) { xmlChar *val; val = xmlNodeListGetString (doc, XML_CHILDREN (el), 1); l = g_slist_append (l, g_strdup ((gchar *) val)); } el = el->next; } return (l); } /** Collect the elements in the ... into a hashtable with elements indexed by the name of the element and value being the string contents of that element. Each element is assumed to be a simple text element. */ GHashTable * getPluginNamedOptions (xmlNodePtr node, GGobiPluginDetails * details, xmlDocPtr doc) { GHashTable *tbl; xmlNodePtr c, el; c = getXMLElement (node, "named"); if (!c) return (NULL); tbl = g_hash_table_new (g_str_hash, g_str_equal); el = XML_CHILDREN (c); while (el) { if (el->type != XML_TEXT_NODE && el->type != XML_COMMENT_NODE) { xmlChar *val; val = xmlNodeListGetString (doc, XML_CHILDREN (el), 1); g_hash_table_insert (tbl, g_strdup ((gchar *) el->name), g_strdup ((gchar *) val)); } el = el->next; } return (tbl); } /** Pick up the names of all the plugins on which this one depends. Then when we load this plugin, we will ensure that those plugins are also loaded. */ GSList * getPluginDependencies (xmlNodePtr node, GGobiPluginDetails * info, xmlDocPtr doc) { GSList *list = NULL; xmlNodePtr c, el; c = getXMLElement (node, "dependencies"); if (!c) return (NULL); el = XML_CHILDREN (c); while (el) { if (el->type != XML_TEXT_NODE && el->type != XML_COMMENT_NODE) { xmlChar *val; val = xmlGetProp (el, (xmlChar *) "name"); if (val) { list = g_slist_append (list, g_strdup ((gchar *) val)); } } el = el->next; } return (list); } void getPluginSymbols (xmlNodePtr node, GGobiPluginInfo * plugin, xmlDocPtr doc, gboolean isLanguage) { xmlNodePtr c; GGobiGeneralPluginInfo *symInfo = plugin->info.g; const xmlChar *tmp; c = getXMLElement (node, "dll"); if (!c) return; c = getXMLElement (c, "init"); if (!c) return; GET_PROP_VALUE (onCreate, "onCreate"); GET_PROP_VALUE (onClose, "onClose"); GET_PROP_VALUE (onUpdateDisplay, "onUpdateDisplayMenu"); if (isLanguage) { tmp = xmlGetProp (c, (xmlChar *) "processPlugin"); if (tmp) { GGobiLanguagePluginData *data; data = (GGobiLanguagePluginData *) g_malloc (sizeof (GGobiLanguagePluginData)); data->processPluginName = g_strdup ((gchar *) tmp); plugin->data = data; } else { fprintf (stderr, "No `processPlugin' entry found for language plugin!\n"); fflush (stderr); } } } gboolean getPluginDetails (xmlNodePtr node, GGobiPluginDetails * plugin, xmlDocPtr doc) { gboolean load = false; const xmlChar *tmp; GGobiPluginDetails *symInfo = plugin; xmlChar *val; xmlNodePtr el; tmp = xmlGetProp (node, (xmlChar *) "name"); if (tmp) { plugin->name = g_strdup ((char *) tmp); } tmp = xmlGetProp (node, (xmlChar *) "load"); if (tmp) { load = strcmp ((char *) tmp, "immediate") == 0; } el = XML_CHILDREN (node); while (el) { if (el->type != XML_TEXT_NODE) { if (strcmp ((char *) el->name, "author") == 0) { val = xmlNodeListGetString (doc, XML_CHILDREN (el), 1); plugin->author = g_strdup ((char *) val); } else if (strcmp ((char *) el->name, "description") == 0) { val = xmlNodeListGetString (doc, XML_CHILDREN (el), 1); plugin->description = g_strdup ((char *) val); } else if (strcmp ((char *) el->name, "dll") == 0) { plugin->dllName = g_strdup ((char *) xmlGetProp (el, (xmlChar *) "name")); if (XML_CHILDREN (el)) { xmlNodePtr c = XML_CHILDREN (el); while (c) { if (el->type != XML_TEXT_NODE && strcmp ((char *) c->name, "init") == 0) { GET_PROP_VALUE (onLoad, "onLoad"); GET_PROP_VALUE (onUnload, "onUnload"); break; } c = c->next; } } } } el = el->next; } return (load); } void fixJavaClassName (gchar * name) { gchar *p = name; while (p && (p = strchr (p, '.')) != NULL) { p[0] = '/'; p++; } } gboolean setLanguagePluginInfo (GGobiPluginDetails * details, const char *language, GGobiInitInfo * info) { GGobiPluginInfo *tmp = getLanguagePlugin (info->plugins, language); if (!tmp) { return (false); } else { GGobiPluginDetails *jdetails = tmp->details; details->dllName = g_strdup (jdetails->dllName); details->library = jdetails->library; details->loaded = 0; /* details->depends = g_slist_append(details->depends, tmp); */ details->depends = g_slist_append (details->depends, g_strdup (jdetails->name)); } return (true); } gboolean getPluginLanguage (xmlNodePtr node, GGobiPluginInfo * plugin, GGobiPluginType type, GGobiInitInfo * info) { gboolean done = false; const xmlChar *tmp; tmp = xmlGetProp (node, (xmlChar *) "language"); if (tmp) { GGobiPluginInfo *langPlugin = getLanguagePlugin (info->plugins, (char *) tmp); GGobiLanguagePluginData *d; ProcessPluginInfo f; if (langPlugin == NULL) { fprintf (stderr, "No language plugin for `%s'\n", (char *) tmp); fflush (stderr); return (false); } d = (GGobiLanguagePluginData *) langPlugin->data; if (loadPluginLibrary (langPlugin->details, langPlugin) && d) { f = (ProcessPluginInfo) getPluginSymbol (d->processPluginName, langPlugin->details); if (f) { done = f (node, plugin, type, langPlugin, info); } } if (done == false) g_printerr ("Problem processing `%s' language plugin processor.\n", langPlugin->details->name); } else done = true; return (done); } GGobiPluginInfo * processInputPlugin (xmlNodePtr node, GGobiInitInfo * info, xmlDocPtr doc) { GGobiPluginInfo *plugin; gboolean load; plugin = (GGobiPluginInfo *) g_malloc0 (sizeof (GGobiPluginInfo)); plugin->details = g_malloc0 (sizeof (GGobiPluginDetails)); plugin->info.i = g_malloc0 (sizeof (GGobiInputPluginInfo)); load = getPluginDetails (node, plugin->details, doc); getInputPluginValues (node, plugin->info.i, doc); getPluginOptions (node, plugin->details, doc); plugin->details->depends = getPluginDependencies (node, plugin->details, doc); if (!getPluginLanguage (node, plugin, INPUT_PLUGIN, info)) { return (plugin); } if (load) { loadPluginLibrary (plugin->details, (GGobiPluginInfo *) plugin); } return (plugin); } void getInputPluginValues (xmlNodePtr node, GGobiInputPluginInfo * plugin, xmlDocPtr doc) { xmlNodePtr c; GGobiInputPluginInfo *symInfo = plugin; const xmlChar *tmp; tmp = xmlGetProp (node, (xmlChar *) "interactive"); if (tmp) { plugin->interactive = (tmp[0] == 'T' || tmp[0] == 't'); } c = getXMLElement (node, "modeName"); if (c) { xmlChar *val = xmlNodeListGetString (doc, XML_CHILDREN (c), 1); plugin->modeNames = (char **) g_malloc (sizeof (char *)); plugin->modeNames[0] = g_strdup ((gchar *) val); plugin->numModeNames = 1; } else if ((c = getXMLElement (node, "modeNames"))) { xmlNodePtr tmp; int ctr = 0; tmp = XML_CHILDREN (c); while (tmp) { if (strcmp ((const char *) tmp->name, "modeName") == 0) { ctr++; } tmp = tmp->next; } if (ctr > 0) { plugin->modeNames = (char **) g_malloc (ctr * sizeof (char *)); plugin->numModeNames = ctr; ctr = 0; tmp = XML_CHILDREN (c); while (tmp) { if (strcmp ((const char *) tmp->name, "modeName") == 0) { xmlChar *val = xmlNodeListGetString (doc, XML_CHILDREN (tmp), 1); plugin->modeNames[ctr] = g_strdup ((gchar *) val); ctr++; } tmp = tmp->next; } } } c = getXMLElement (node, "dll"); if (!c) return; c = getXMLElement (c, "init"); if (!c) return; GET_PROP_VALUE (read_symbol_name, "read"); GET_PROP_VALUE (probe_symbol_name, "probe"); GET_PROP_VALUE (getDescription, "description"); } gint resolveVariableName (const gchar * name, GGobiData * d); displayd * createExtendedDisplay (const gchar * const type, gint * vars, gint numVars, GGobiData * d, ggobid * gg) { displayd *dpy; GGobiExtendedDisplayClass *klass; GType gtype = g_type_from_name (type); klass = g_type_class_peek (gtype); if (!klass->createWithVars) { g_printerr ("Cannot currently handle the extended display %s type.", type); return (NULL); } dpy = klass->createWithVars (true, false, numVars, vars, d, gg); if (!dpy) return (NULL); /*XXX does this get done via a callback. */ display_add (dpy, gg); return (dpy); } displayd * createDisplayFromDescription (ggobid * gg, GGobiDisplayDescription * desc) { displayd *dpy = NULL; GGobiData *data = NULL; gint *vars, i; if (desc->canRecreate == false) return (NULL); if (desc->data > -1) { data = (GGobiData *) g_slist_nth_data (gg->d, desc->data); } else if (desc->datasetName && desc->datasetName[0]) { GGobiData *tmp; GSList *l; for (l = gg->d; l; l = l->next) { tmp = (GGobiData *) l->data; if (strcmp (desc->datasetName, tmp->name) == 0) { data = tmp; break; } } } if (!data) { g_printerr ("Cannot resolve dataset "); if (desc->data > -1) g_printerr ("with index %d\n", desc->data + 1); else g_printerr ("named `%s'\n", desc->datasetName); return (NULL); } vars = (gint *) g_malloc (sizeof (gint) * desc->numVars); for (i = 0; i < desc->numVars; i++) vars[i] = resolveVariableName (desc->varNames[i], data); dpy = createExtendedDisplay (desc->typeName, vars, desc->numVars, data, gg); g_free (vars); return (dpy); } gint resolveVariableName (const gchar * name, GGobiData * d) { gint j; for (j = 0; j < d->ncols; j++) { if (strcmp (ggobi_data_get_col_name(d, j), name) == 0) return (j); } return (-1); } GGobiPluginInfo * readPluginFile (const char *const fileName, GGobiInitInfo * info) { xmlDocPtr doc; GGobiPluginInfo *plugin = NULL; int n; doc = xmlParseFile (fileName); if (doc == NULL) { fprintf (stderr, "Couldn't parse the xml file `%s'\n", fileName); return (NULL); } n = getPlugins (doc, sessionOptions->info, true); xmlFreeDoc (doc); return (plugin); } GlyphType mapGlyphName (const gchar * gtype) { GlyphType type; gint i; type = UNKNOWN_GLYPH; for (i = 0; i < sizeof (GlyphNames) / sizeof (GlyphNames[0]) - 1; i++) { if (strcmp (gtype, GlyphNames[i]) == 0) { type = (GlyphType) (i); break; } } return (type); } ggobi-2.1.12/src/utils_gdk.c0000644000175000017500000002401714651527764011312 /*-- utils_gdk.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" #ifdef ENABLE_CAIRO #ifndef WIN32 #include #include #else // win32 includes #endif #include #endif GdkColor * NewColor (glong red, glong green, glong blue) { gboolean writeable = false, best_match = true; GdkColor *c = (GdkColor *) g_malloc (sizeof (GdkColor)); c->red = red; c->green = green; c->blue = blue; if (gdk_colormap_alloc_color (gdk_colormap_get_system (), c, writeable, best_match) == false) { g_printerr ("Unable to allocate color\n"); c = NULL; } return (c); } /* * The plotted glyph is actually 2*size + 1 on a side, so the * size progression is 5, 7, 9, 11, 13, ... That's * because it seems necessary to have glyphs that have odd * sizes in order to make sure the point is at the center of * the glyph. That may be overly fastidious for large glyphs, * but it's neceessary for the small ones. */ void draw_glyph (GdkDrawable * drawable, glyphd * gl, icoords * xypos, gint jpos, ggobid * gg) { gushort size = gl->size + 1; switch (gl->type) { case PLUS: gdk_draw_line (drawable, gg->plot_GC, xypos[jpos].x - size, xypos[jpos].y, xypos[jpos].x + size, xypos[jpos].y); gdk_draw_line (drawable, gg->plot_GC, xypos[jpos].x, xypos[jpos].y - size, xypos[jpos].x, xypos[jpos].y + size); break; case X: gdk_draw_line (drawable, gg->plot_GC, xypos[jpos].x - size, xypos[jpos].y - size, xypos[jpos].x + size, xypos[jpos].y + size); gdk_draw_line (drawable, gg->plot_GC, xypos[jpos].x + size, xypos[jpos].y - size, xypos[jpos].x - size, xypos[jpos].y + size); break; case OR: gdk_draw_rectangle (drawable, gg->plot_GC, false, xypos[jpos].x - size, xypos[jpos].y - size, 2 * size, 2 * size); break; case FR: gdk_draw_rectangle (drawable, gg->plot_GC, false, xypos[jpos].x - size, xypos[jpos].y - size, 2 * size, 2 * size); gdk_draw_rectangle (drawable, gg->plot_GC, true, xypos[jpos].x - size, xypos[jpos].y - size, 2 * size, 2 * size); break; case OC: gdk_draw_arc (drawable, gg->plot_GC, false, xypos[jpos].x - size, xypos[jpos].y - size, 2 * size, 2 * size, 0, (gshort) 23040); break; case FC: gdk_draw_arc (drawable, gg->plot_GC, false, xypos[jpos].x - size, xypos[jpos].y - size, 2 * size, 2 * size, 0, (gshort) 23040); gdk_draw_arc (drawable, gg->plot_GC, true, xypos[jpos].x - size, xypos[jpos].y - size, 2 * size, 2 * size, 0, (gshort) 23040); break; case DOT_GLYPH: gdk_draw_point (drawable, gg->plot_GC, xypos[jpos].x, xypos[jpos].y); break; case UNKNOWN_GLYPH: default: g_printerr ("build_glyph: impossible glyph type %d\n", gl->type); } } void mousepos_get_pressed (GtkWidget * w, GdkEventButton * event, gboolean * btn1_down_p, gboolean * btn2_down_p, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); gint grab_ok; GdkModifierType state; *btn1_down_p = false; *btn2_down_p = false; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); grab_ok = gdk_pointer_grab (sp->da->window, false, (GdkEventMask) (GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK), (GdkWindow *) NULL, (GdkCursor *) NULL, event->time); if ((event->state & GDK_BUTTON1_MASK) == GDK_BUTTON1_MASK) *btn1_down_p = true; else if ((event->state & GDK_BUTTON2_MASK) == GDK_BUTTON2_MASK) *btn2_down_p = true; else if ((event->state & GDK_BUTTON3_MASK) == GDK_BUTTON3_MASK) *btn2_down_p = true; if (*btn1_down_p) gg->buttondown = 1; else if (*btn2_down_p) gg->buttondown = 2; } void mousepos_get_motion (GtkWidget * w, GdkEventMotion * event, gboolean * btn1_down_p, gboolean * btn2_down_p, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); GdkModifierType state; *btn1_down_p = false; *btn2_down_p = false; /*-- that is, if using motion hints --*/ /* if (event->is_hint) { */ gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); if ((state & GDK_BUTTON1_MASK) == GDK_BUTTON1_MASK) *btn1_down_p = true; else if ((state & GDK_BUTTON2_MASK) == GDK_BUTTON2_MASK) *btn2_down_p = true; else if ((state & GDK_BUTTON3_MASK) == GDK_BUTTON3_MASK) *btn2_down_p = true; /* } else { sp->mousepos.x = (gint) event->x; sp->mousepos.y = (gint) event->y; if ((event->state & GDK_BUTTON1_MASK) == GDK_BUTTON1_MASK) *btn1_down_p = true; else if ((event->state & GDK_BUTTON2_MASK) == GDK_BUTTON2_MASK) *btn2_down_p = true; else if ((event->state & GDK_BUTTON3_MASK) == GDK_BUTTON3_MASK) *btn2_down_p = true; } */ if (*btn1_down_p) gg->buttondown = 1; else if (*btn2_down_p) gg->buttondown = 2; } gboolean mouseinwindow (splotd * sp) { return (0 < sp->mousepos.x && sp->mousepos.x < sp->max.x && 0 < sp->mousepos.y && sp->mousepos.y < sp->max.y); } /*--------------------------------------------------------------------*/ /* Drawing 3D sliders */ /*--------------------------------------------------------------------*/ /* (x,y) is the center of the rectangle */ void draw_3drectangle (GtkWidget * widget, GdkDrawable * drawable, gint x, gint y, gint width, gint height, ggobid * gg) { GdkPoint points[7]; gint w = width / 2; gint h = height / 2; if (gg->rectangle_GC == NULL) gg->rectangle_GC = gdk_gc_new (widget->window); /*-- draw the rectangles --*/ gdk_gc_set_foreground (gg->rectangle_GC, &gg->mediumgray); gdk_draw_rectangle (drawable, gg->rectangle_GC, TRUE, x - w, y - h, width, height); /*-- draw the dark shadows --*/ gdk_gc_set_foreground (gg->rectangle_GC, &gg->darkgray); points[0].x = x - w; points[0].y = y + h; points[1].x = x + w; points[1].y = y + h; points[2].x = x + w; points[2].y = y - h; points[3].x = points[2].x - 1; points[3].y = points[2].y + 1; points[4].x = points[1].x - 1; points[4].y = points[1].y - 1; points[5].x = points[0].x + 1; points[5].y = points[0].y - 1; points[6].x = x - w; points[6].y = y + h; gdk_draw_polygon (drawable, gg->rectangle_GC, TRUE, points, 7); gdk_draw_line (drawable, gg->rectangle_GC, x - 1, y - (h - 1), x - 1, y + (h - 2)); /*-- draw the light shadows --*/ gdk_gc_set_foreground (gg->rectangle_GC, &gg->lightgray); points[0].x = x - w; /*-- lower left --*/ points[0].y = y + (h - 1); points[1].x = x - w; /*-- upper left --*/ points[1].y = y - h; points[2].x = x + (w - 1); /*-- upper right --*/ points[2].y = y - h; points[3].x = points[2].x - 1; points[3].y = points[2].y + 1; points[4].x = points[1].x + 1; points[4].y = points[1].y + 1; points[5].x = points[0].x + 1; points[5].y = points[0].y - 1; points[6].x = points[0].x; points[6].y = points[0].y; gdk_draw_polygon (drawable, gg->rectangle_GC, TRUE, points, 7); gdk_draw_line (drawable, gg->rectangle_GC, x, y - (h - 1), x, y + (h - 2)); } #ifdef ENABLE_CAIRO cairo_t * create_cairo_glitz (GdkDrawable * drawable) { cairo_surface_t *cairo_surface = g_object_get_data (G_OBJECT (drawable), "glitz_surface"); if (!cairo_surface) { guint width, height; glitz_drawable_t *glitz_d = NULL; glitz_surface_t *glitz_s; glitz_format_t *format; GdkVisual *visual = gdk_drawable_get_visual (drawable); g_return_val_if_fail (visual != NULL, NULL); gdk_drawable_get_size (drawable, &width, &height); #ifndef WIN32 glitz_glx_init (NULL); { Display *dpy = GDK_DRAWABLE_XDISPLAY (drawable); glitz_drawable_format_t *d_format = glitz_glx_find_drawable_format_for_visual (dpy, DefaultScreen (dpy), GDK_VISUAL_XVISUAL (visual)->visualid); if (GDK_IS_WINDOW (drawable)) glitz_d = glitz_glx_create_drawable_for_window (dpy, DefaultScreen (dpy), d_format, GDK_WINDOW_XID (GDK_WINDOW (drawable)), width, height); else glitz_d = glitz_glx_create_pbuffer_drawable (dpy, DefaultScreen (dpy), d_format, width, height); } #else // windows implementation #endif g_return_val_if_fail (glitz_d != NULL, NULL); format = glitz_find_standard_format (glitz_d, GLITZ_STANDARD_ARGB32); glitz_s = glitz_surface_create (glitz_d, format, width, height, 0, NULL); g_object_set_data_full (G_OBJECT (drawable), "glitz_surface", cairo_glitz_surface_create (glitz_s), (GDestroyNotify) cairo_surface_destroy); } return (cairo_create (cairo_surface)); } #endif ggobi-2.1.12/src/p1d_ui.c0000644000175000017500000002615314651527764010511 /*-- p1d_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" static gchar *type_lbl[] = { "Texturing", "ASH" }; static void type_cb (GtkWidget * w, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; cpanel->p1d.type = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); display_tailpipe (gg->current_display, FULL, gg); } static void ASH_add_lines_cb (GtkToggleButton * button, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; cpanel->p1d.ASH_add_lines_p = button->active; splot_redraw (gg->current_splot, FULL, gg); } static void ash_smoothness_cb (GtkAdjustment * adj, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; /*-- adj->value ranges from .01 to .5; min value for nASHes = 1 --*/ cpanel->p1d.nASHes = (gint) ((gfloat) cpanel->p1d.nbins * (adj->value / 2.0)); if (cpanel->p1d.type == ASH) display_tailpipe (gg->current_display, FULL, gg); } /*--------------------------------------------------------------------*/ /* Cycling */ /*--------------------------------------------------------------------*/ void p1d_cycle_activate (gboolean state, cpaneld * cpanel, ggobid * gg) { if (state) { gg->p1d.cycle_id = g_timeout_add (cpanel->p1d.cycle_delay, (GSourceFunc) p1dcycle_func, (gpointer) gg); cpanel->p1d.cycle_p = true; } else { if (gg->p1d.cycle_id) { g_source_remove (gg->p1d.cycle_id); gg->p1d.cycle_id = 0; cpanel->p1d.cycle_p = false; } } } static void cycle_cb (GtkToggleButton * button, ggobid * gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->p1d.cycle_p = button->active; p1d_cycle_activate (cpanel->p1d.cycle_p, cpanel, gg); } static void cycle_speed_cb (GtkAdjustment * adj, ggobid * gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->p1d.cycle_delay = -1 * (guint32) adj->value; if (cpanel->p1d.cycle_p) { g_source_remove (gg->p1d.cycle_id); gg->p1d.cycle_id = g_timeout_add (cpanel->p1d.cycle_delay, (GSourceFunc) p1dcycle_func, (gpointer) gg); } } static void chdir_cb (GtkButton * button, ggobid * gg) { displayd *display = gg->current_display; cpaneld *cpanel = &display->cpanel; cpanel->p1d.cycle_dir = -1 * cpanel->p1d.cycle_dir; } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg; cpaneld *cpanel; gg = GGobiFromSPlot (sp); if (!gg) return true; cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ return false; } void p1d_event_handlers_toggle (splotd * sp, gboolean state) { displayd *display; if (sp) { display = (displayd *) sp->displayptr; if (state == on) { if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window), "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); } } } /*--------------------------------------------------------------------*/ void cpanel_p1dplot_make (ggobid * gg) { modepaneld *panel; GtkWidget *frame, *framevb, *tgl, *btn, *vbox, *vb, *opt, *lbl; GtkWidget *sbar; GtkObject *adj; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); panel->name = g_strdup (GGOBI (getPModeName) (P1PLOT)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /*-- option menu --*/ opt = gtk_combo_box_new_text (); gtk_widget_set_name (opt, "P1PLOT:type_option_menu"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Display either textured dot plots or average shifted histograms", NULL); gtk_box_pack_start (GTK_BOX (panel->w), opt, false, false, 0); populate_combo_box (opt, type_lbl, G_N_ELEMENTS (type_lbl), G_CALLBACK (type_cb), gg); /*-- frame around ASH parameters --*/ frame = gtk_frame_new ("ASH parameters"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (panel->w), frame, false, false, 3); framevb = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (framevb), 4); gtk_container_add (GTK_CONTAINER (frame), framevb); /*-- ASH line segments --*/ btn = gtk_check_button_new_with_mnemonic ("ASH: _add lines"); gtk_widget_set_name (btn, "P1PLOT:ASH_add_lines"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "When displaying ASHes, add lines connecting each point to the baseline.", NULL); /*-- cpanel may not be available, so initialize this to false --*/ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), false); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (ASH_add_lines_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (framevb), btn, false, false, 0); /*-- ASH smoothness --*/ vbox = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (framevb), vbox, false, false, 0); lbl = gtk_label_new_with_mnemonic ("ASH _smoothness:"); gtk_box_pack_start (GTK_BOX (vbox), lbl, false, false, 0); /*-- value, lower, upper, step --*/ adj = gtk_adjustment_new (0.19, 0.02, 0.5, 0.01, .01, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (ash_smoothness_cb), gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), sbar); gtk_widget_set_name (sbar, "P1PLOT:ASH_smooth"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust ASH smoothness", NULL); gtk_range_set_update_policy (GTK_RANGE (sbar), GTK_UPDATE_CONTINUOUS); gtk_scale_set_value_pos (GTK_SCALE (sbar), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (sbar), 2); gtk_box_pack_start (GTK_BOX (vbox), sbar, false, false, 1); /* * Cycling controls */ frame = gtk_frame_new ("Plot cycling"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (panel->w), frame, false, false, 3); vb = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (vb), 4); gtk_container_add (GTK_CONTAINER (frame), vb); tgl = gtk_check_button_new_with_mnemonic ("_Cycle"); gtk_widget_set_name (tgl, "P1PLOT:cycle_toggle"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Cycle through 1D plots", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (cycle_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vb), tgl, false, false, 1); /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ gg->p1d.cycle_delay_adj = (GtkAdjustment *) gtk_adjustment_new (-1.0 * 1000 /* cpanel->p1d.cycle_delay */ , -5000.0, -250.0, 100.0, 1000.0, 0.0); g_signal_connect (G_OBJECT (gg->p1d.cycle_delay_adj), "value_changed", G_CALLBACK (cycle_speed_cb), gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (gg->p1d.cycle_delay_adj)); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust cycling speed", NULL); scale_set_default_values (GTK_SCALE (sbar)); gtk_box_pack_start (GTK_BOX (vb), sbar, false, false, 1); btn = gtk_button_new_with_mnemonic ("Change di_rection"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Change cycling direction", NULL); gtk_box_pack_start (GTK_BOX (vb), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (chdir_cb), gg); gtk_widget_show_all (panel->w); } /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ /*-- for all plot modes, for now: it excludes the changing variable --*/ void cpanel_p1d_init (cpaneld * cpanel, ggobid * gg) { cpanel->p1d.nASHes = 20; cpanel->p1d.nbins = 200; cpanel->p1d.ASH_add_lines_p = false; /*-- cycling --*/ cpanel->p1d.cycle_dir = FORWARD; cpanel->p1d.cycle_p = false; cpanel->p1d.cycle_delay = 1000; } /*-- scatterplot only; need a different routine for parcoords --*/ void cpanel_p1d_set (displayd * display, cpaneld * cpanel, ggobid * gg) /* * To handle the case where there are multiple scatterplots * which may have different p1d options and parameters selected */ { GtkWidget *pnl, *w; GtkAdjustment *adj; pnl = mode_panel_get_by_name (GGOBI (getPModeName) (P1PLOT), gg); /*-- Texturing or ASH --*/ w = widget_find_by_name (pnl, "P1PLOT:type_option_menu"); gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->p1d.type); /*-- ASH smoothness parameter --*/ w = widget_find_by_name (pnl, "P1PLOT:ASH_add_lines"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), cpanel->p1d.ASH_add_lines_p); /*-- ASH smoothness parameter --*/ w = widget_find_by_name (pnl, "P1PLOT:ASH_smooth"); adj = gtk_range_get_adjustment (GTK_RANGE (w)); gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), 2 * (gfloat) cpanel->p1d.nASHes / (gfloat) cpanel->p1d.nbins); /* gtk_adjustment_set_value (GTK_ADJUSTMENT (gg->ash.smoothness_adj), 2 * (gfloat) cpanel->p1d.nASHes / (gfloat) cpanel->p1d.nbins); */ /*-- Cycling on or off --*/ w = widget_find_by_name (pnl, "P1PLOT:cycle_toggle"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), cpanel->p1d.cycle_p); /*-- Cycling speed --*/ gtk_adjustment_set_value (GTK_ADJUSTMENT (gg->p1d.cycle_delay_adj), -1 * (gfloat) cpanel->p1d.cycle_delay); } ggobi-2.1.12/src/ggobi-renderer.h0000644000175000017500000000505714651527764012230 /* Generated by GOB (v2.0.18) (do not edit directly) */ #include #include #ifndef __GGOBI_RENDERER_H__ #define __GGOBI_RENDERER_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include /* * Type checking and casting macros */ #define GGOBI_TYPE_RENDERER (ggobi_renderer_get_type()) #define GGOBI_RENDERER(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_renderer_get_type(), GGobiRenderer) #define GGOBI_RENDERER_CONST(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), ggobi_renderer_get_type(), GGobiRenderer const) #define GGOBI_RENDERER_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), ggobi_renderer_get_type(), GGobiRendererClass) #define GGOBI_IS_RENDERER(obj) G_TYPE_CHECK_INSTANCE_TYPE((obj), ggobi_renderer_get_type ()) #define GGOBI_RENDERER_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), ggobi_renderer_get_type(), GGobiRendererClass) /* Private structure type */ typedef struct _GGobiRendererPrivate GGobiRendererPrivate; /* * Main object structure */ #ifndef __TYPEDEF_GGOBI_RENDERER__ #define __TYPEDEF_GGOBI_RENDERER__ typedef struct _GGobiRenderer GGobiRenderer; #endif struct _GGobiRenderer { GdkDrawable __parent__; /*< private >*/ GGobiRendererPrivate *_priv; }; /* * Class definition */ typedef struct _GGobiRendererClass GGobiRendererClass; struct _GGobiRendererClass { GdkDrawableClass __parent__; GdkDrawable * (* create_target) (GGobiRenderer * self, GdkDrawable * parent); GGobiRenderer * (* buffer) (GGobiRenderer * self); void (* flush) (GGobiRenderer * self, GdkGC * gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height); }; /* * Public methods */ GType ggobi_renderer_get_type (void) G_GNUC_CONST; #line 50 "renderer.gob" GGobiRenderer * ggobi_renderer_buffer (GGobiRenderer * self); #line 63 "ggobi-renderer.h" #line 57 "renderer.gob" void ggobi_renderer_flush (GGobiRenderer * self, GdkGC * gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height); #line 73 "ggobi-renderer.h" /* * Argument wrapping macros */ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define GGOBI_RENDERER_PROP_PARENT(arg) "parent", __extension__ ({GObject *z = (arg); z;}) #define GGOBI_RENDERER_GET_PROP_PARENT(arg) "parent", __extension__ ({GObject **z = (arg); z;}) #else /* __GNUC__ && !__STRICT_ANSI__ */ #define GGOBI_RENDERER_PROP_PARENT(arg) "parent",(GObject *)(arg) #define GGOBI_RENDERER_GET_PROP_PARENT(arg) "parent",(GObject **)(arg) #endif /* __GNUC__ && !__STRICT_ANSI__ */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif ggobi-2.1.12/src/print.h0000644000175000017500000000627014651527764010467 /* print.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_PRINT_H #define GGOBI_PRINT_H /* This file defines structures that store the settings that control how printing is done. */ #include "ggobi.h" #include "types.h" typedef struct _OutputDescription { DataMode format; char *fileName; gboolean toPrinter; } OutputDescription; struct _PrintOptions { int width; int height; OutputDescription *file; /* Add more fields here to store other settings. */ /* Here's what we had in xgobi: Postscript printer: Really the postscript printer command, eg lpr -Pserif Background color: (a string) Foreground color: (a string) Color for white glyphs: (a string) The purpose of this was to let a plot with a dark background be printed with a light background, and then to allow white glyphs to be reset as dark glyphs. I don't know how to do this now. Color names don't really make sense any more, since ggobi doesn't use color names, and they aren't portable to Windows, are they? Should people specify r,g,b? Or should we bring up a color wheel to let them set the color? Pointsize: Then we had two buttons: write to file, or send to printer */ GdkColor background; GdkColor foreground; }; /* This is a typedef for a class of routines that can be registered for performing the actual printing. For example, we might register a C routine in R which would call a function to do the printing. In the stand-alone ggobi, we would have a version that does the printing via SVG. */ struct _PrintInfo; typedef gboolean (*PrintDialogHandler)(PrintOptions *options, struct _PrintInfo *data, void *userData); struct _GGobiPrintHandler; typedef struct _GGobiPrintHandler GGobiPrintHandler; typedef PrintOptions *(*PrintCallbackHandler)(PrintOptions *options, displayd *dpy, ggobid *gg, GGobiPrintHandler *); struct _GGobiPrintHandler { PrintCallbackHandler callback; PrintDialogHandler dialog; void *userData; }; extern GGobiPrintHandler DefaultPrintHandler; typedef struct _PrintInfo { PrintOptions *options; displayd *dpy; ggobid *ggobi; PrintDialogHandler handler; void *userData; GtkWidget *dialog; } PrintInfo; /* This presents a dialog which allows the user to edit the setting options. The The PrintHandler allows the caller to specify a routine that will be invoked when the user clicks on the Ok button of the dialog. */ PrintOptions *showPrintDialog(PrintOptions *options, displayd *dpy, ggobid *gg, GGobiPrintHandler*); GtkWidget * createPrintDialog(displayd *dpy); void setStandardPrintHandlers(); PrintOptions *getDefaultPrintOptions(PrintOptions *opts); gboolean PrintAsSVG(PrintOptions *options, PrintInfo *info, void *userData); #endif ggobi-2.1.12/src/vartable.c0000644000175000017500000001753314651527764011132 /* vartable.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include "vars.h" #include "externs.h" #include "vartable.h" #ifdef __cplusplus extern "C" { #endif extern gfloat no_change (gfloat, gfloat); #ifdef __cplusplus } #endif /*-------------------------------------------------------------------------*/ /* utilities */ /*-------------------------------------------------------------------------*/ /*-- also used in varchange.c --*/ gboolean array_contains (gint* arr, gint n, gint el) { gint j; for (j=0; j= d->ncols) g_printerr ("(vartable_element_get) illegal variable number %d\n", j); else vt = (vartabled *) g_slist_nth_data (d->vartable, j); return (vt); } gint vartable_index_get_by_name(gchar *name, GGobiData *d) { gint j; gint index = -1; vartabled *vt; for (j=0; jncols; j++) { vt = vartable_element_get(j, d); if (strcmp(vt->collab, name) == 0) { index = j; break; } } return index; } void vartable_element_append (vartabled *vt, GGobiData *d) { d->vartable = g_slist_append (d->vartable, vt); } void vartable_element_remove (gint j, GGobiData *d) { vartabled *vt = vartable_element_get (j, d); d->vartable = g_slist_remove (d->vartable, vt); } gint selected_cols_get (gint *cols, GGobiData *d, ggobid *gg) { /* * Figure out which columns are selected. */ gint j, ncols = 0; vartabled *vt; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); if (vt->selected) cols[ncols++] = j; } return (ncols); } /* * When there aren't any columns in the variable statistics table, * this is how we find out which columns are selected for plotting. */ gint plotted_cols_get (gint *cols, GGobiData *d, ggobid *gg) { gint ncols = 0; splotd *sp = gg->current_splot; displayd *display = (displayd *) sp->displayptr; if(GGOBI_IS_EXTENDED_DISPLAY(display)) { GGobiExtendedDisplayClass *klass; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS(display); ncols = klass->plotted_vars_get(display, cols, d, gg); } return ncols; } /*-------------------------------------------------------------------------*/ /* memory management */ /*-------------------------------------------------------------------------*/ void vartable_free_element (gint j, GGobiData *d) { vartabled *vt = vartable_element_get (j, d); if (vt->collab != NULL) g_object_unref (vt->collab); if (vt->collab_tform != NULL) g_object_unref (vt->collab_tform); vartable_element_remove (j, d); } void vartable_free (GGobiData *d) { gint j; for (j=d->ncols-1; j >= 0; j--) { vartable_free_element (j, d); } g_slist_free (d->vartable); d->vartable = NULL; } void vartable_alloc (GGobiData *d) /* weird -- nothing is allocated here --*/ { if (d->vartable != NULL) vartable_free (d); d->vartable = NULL; } //FIXME: should be removed and replaced by vartable_clone //also see code in missings.c void vartable_copy_var (gint jfrom, gint jto, GGobiData *d) { gint k; vartabled *vt_from = vartable_element_get (jfrom, d); vartabled *vt_to = vartable_element_get (jto, d); g_assert (vt_from->collab != NULL); g_assert (vt_from->collab_tform != NULL); vt_to->collab = g_strdup (vt_from->collab); vt_to->collab_tform = g_strdup (vt_from->collab_tform); vt_to->nickname = g_strdup (vt_from->nickname); vt_to->vartype = vt_from->vartype; vt_to->nlevels = vt_from->nlevels; if (vt_from->nlevels && vt_from->vartype == categorical) { vt_to->level_values = (gint*) g_malloc(sizeof(gint) * vt_from->nlevels); vt_to->level_counts = (gint*) g_malloc(sizeof(gint) * vt_from->nlevels); vt_to->level_names = (gchar **) g_malloc(sizeof(gchar *) * vt_from->nlevels); } else { vt_to->level_values = NULL; vt_to->level_counts = NULL; vt_to->level_names = NULL; } for (k=0; knlevels; k++) { vt_to->level_values[k] = vt_from->level_values[k]; vt_to->level_counts[k] = vt_from->level_counts[k]; vt_to->level_names[k] = g_strdup(vt_from->level_names[k]); } vt_to->mean = vt_from->mean; vt_to->median = vt_from->median; vt_to->lim.min = vt_to->lim_raw.min = vt_to->lim_tform.min = vt_from->lim_tform.min; vt_to->lim.max = vt_to->lim_raw.max = vt_to->lim_tform.max = vt_from->lim_tform.max; vt_to->lim_display.min = vt_from->lim_display.min; vt_to->lim_display.max = vt_from->lim_display.max; vt_to->lim_specified_p = vt_from->lim_specified_p; } /*-------------------------------------------------------------------------*/ vartabled * vartable_element_new (GGobiData *d) { vartabled *vt = (vartabled *) g_malloc (sizeof (vartabled)); vt->d = G_OBJECT(d); vt->selected = false; vt->vartype = real; /*-- real-valued by default --*/ vt->nlevels = 0; vt->mean = 0.0; vt->median = 0.0; vt->lim_specified_p = false; /*-- no user-specified limits --*/ vt->lim_specified.min = 0.0; vt->lim_specified.max = 0.0; vt->lim_specified_tform.min = 0.0; vt->lim_specified_tform.max = 0.0; vt->lim_raw.min = 0.0; vt->lim_raw.max = 0.0; vt->lim_tform.min = 0.0; vt->lim_tform.max = 0.0; vt->tform0 = NO_TFORM0; vt->domain_incr = 0.; vt->domain_adj = no_change; vt->inv_domain_adj = no_change; vt->tform1 = NO_TFORM1; vt->param = 0.; vt->tform2 = NO_TFORM2; vt->jitter_factor = 0.0; vt->collab = NULL; vt->collab_tform = NULL; vartable_element_append (vt, d); return vt; } void vartable_init (GGobiData *d) { gint j; for (j=0; jncols; j++) vartable_element_new (d); } void vartable_element_categorical_init(vartabled *vt, gint nlevels, gchar **level_names, gint *level_values, gint *level_counts) { gint i; if(vt) { vt->vartype = categorical; vt->nlevels = nlevels; vt->level_names = (gchar **) g_malloc(sizeof(gchar*) * nlevels); vt->level_values = (gint *) g_malloc(sizeof(gint) * nlevels); vt->level_counts = (gint *) g_malloc(sizeof(gint) * nlevels); for(i = 0 ; i < nlevels; i++) { vt->level_names[i] = g_strdup(level_names[i]); if (level_counts) vt->level_counts[i] = level_counts[i]; else vt->level_counts[i] = 0; if (level_values) vt->level_values[i] = level_values[i]; else vt->level_values[i] = i+1; } } } /*-------------------------------------------------------------------------*/ /* finding the statistics for the table */ /*-------------------------------------------------------------------------*/ void vartable_stats_print (GGobiData *d, ggobid *gg) { gint j; vartabled *vt; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); g_printerr ("mean=%f, median=%f\n", vt->mean, vt->median); g_printerr ("lims: %7.2f %7.2f %7.2f %7.2f\n", vt->lim_raw.min, vt->lim_raw.max, vt->lim_tform.min, vt->lim_tform.max); } } gint checkLevelValue (vartabled *vt, double value) { gint i; for (i = 0; i < vt->nlevels; i++) { if (vt->level_values[i] == (int) value) return (i); } return (-1); } ggobi-2.1.12/src/ggobiClass.c0000644000175000017500000004743014651527764011406 /* ggobiClass.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "ggobi.h" #include "GGobiAPI.h" #include "externs.h" #include "tsdisplay.h" #include "tsPlot.h" #include "barchartDisplay.h" #include "parcoordsClass.h" #include "scatterplotClass.h" #include "scatmatClass.h" #include "marshal.h" extern gint num_ggobis, totalNumGGobis; extern ggobid **all_ggobis; void ggobi_ggobi_class_init (GGobiGGobiClass * klass); /** This registers and returns a unique GGobi type representing the ggobi class. */ GType ggobi_ggobi_get_type (void) { static GType ggobi_type = 0; if (!ggobi_type) { static const GTypeInfo ggobi_info = { sizeof (GGobiGGobiClass), NULL, NULL, (GClassInitFunc) ggobi_ggobi_class_init, NULL, NULL, sizeof (ggobid), 0, (GInstanceInitFunc) ggobi_alloc, NULL }; ggobi_type = g_type_register_static (G_TYPE_OBJECT, "GGobi", &ggobi_info, 0); } return ggobi_type; } /** Initialize the GGobiGGobi class, called when the type is initially registered with the GGobi mechanism. This registers */ void ggobi_ggobi_class_init (GGobiGGobiClass * klass) { GGobiSignals[DATAD_ADDED_SIGNAL] = g_signal_new ("datad_added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_DATA); GGobiSignals[BRUSH_MOTION_SIGNAL] = g_signal_new ("brush_motion", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__OBJECT_POINTER_OBJECT, G_TYPE_NONE, 3, GGOBI_TYPE_SPLOT, G_TYPE_POINTER, /* GdkEventMotion pointer */ GGOBI_TYPE_DATA); GGobiSignals[POINT_MOVE_SIGNAL] = g_signal_new ("move_point", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__OBJECT_INT_OBJECT, G_TYPE_NONE, 3, GGOBI_TYPE_SPLOT, G_TYPE_INT, GGOBI_TYPE_DATA); GGobiSignals[IDENTIFY_POINT_SIGNAL] = g_signal_new ("identify_point", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__OBJECT_INT_OBJECT, G_TYPE_NONE, 3, GGOBI_TYPE_SPLOT, G_TYPE_INT, GGOBI_TYPE_DATA); /* This should be for a ggobi datad rather than a widget. Make that a GObject and give it a type. */ GGobiSignals[VARIABLE_SELECTION_SIGNAL] = g_signal_new ("select_variable", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__OBJECT_INT_OBJECT, G_TYPE_NONE, 3, GGOBI_TYPE_DATA, G_TYPE_INT, GGOBI_TYPE_SPLOT); GGobiSignals[SPLOT_NEW_SIGNAL] = g_signal_new ("splot_new", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_SPLOT); GGobiSignals[VARIABLE_ADDED_SIGNAL] = g_signal_new ("variable_added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__POINTER_INT_OBJECT, G_TYPE_NONE, 3, G_TYPE_POINTER, /*vartabled XX */ G_TYPE_INT, /*index variable */ GGOBI_TYPE_DATA); GGobiSignals[VARIABLE_LIST_CHANGED_SIGNAL] = g_signal_new ("variable_list_changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_DATA); GGobiSignals[STICKY_POINT_ADDED_SIGNAL] = g_signal_new ("sticky_point_added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__INT_INT_OBJECT, G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_INT, GGOBI_TYPE_DATA); /* record index and datad pointer */ GGobiSignals[STICKY_POINT_REMOVED_SIGNAL] = g_signal_new ("sticky_point_removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__INT_INT_OBJECT, G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_INT, GGOBI_TYPE_DATA); /* record index and datad pointer */ GGobiSignals[CLUSTERS_CHANGED_SIGNAL] = g_signal_new ("clusters_changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_DATA); /* datad pointer */ GGobiSignals[DISPLAY_NEW_SIGNAL] = g_signal_new ("display_new", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_DISPLAY); /* displayd pointer */ /* This signal is to be emitted by display_set_current, and picked up by the console. */ GGobiSignals[DISPLAY_SELECTED_SIGNAL] = g_signal_new ("display_selected", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GGOBI_TYPE_DISPLAY); /* displayd pointer */ /*int i; for (i = 0; i < MAX_GGOBI_SIGNALS; i++) { printf("%d\n", GGobiSignals[i]); } */ } /****************************/ /******************************************************/ #ifdef TEST_DESTROY static void testDisplayDestroy (GGobiObject * obj) { GGobiObjectClass *klass; g_print ("In testDisplayDestroy\n"); klass = GTK_OBJECT_CLASS (G_TYPE_VBOX); if (klass->destroy) klass->destroy (obj); } #endif static void ggobi_display_class_init (GGobiDisplayClass * klass) { #ifdef TEST_DESTROY /* Just here to test the destroy mechanism is working. */ G_OBJECT_CLASS (klass)->destroy = testDisplayDestroy; #endif klass->signals[TOUR_STEP_SIGNAL] = g_signal_new ("tour_step", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, 0, NULL, NULL, ggobi_marshal_VOID__POINTER_INT_OBJECT, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_INT, GGOBI_TYPE_GGOBI); } static void display_init (displayd * display) { display->e = NULL; /*-- for dragging in the rulers --*/ display->drag_start.x = display->drag_start.y = 0; display->t1d_manip_var = -1; display->t2d_manip_var = -1; display->tc1_manip_var = -1; display->tc2_manip_var = -1; display->t1d_window = NULL; display->t2d_window = NULL; display->t1d_pp_pixmap = NULL; display->t2d_pp_pixmap = NULL; display->pmode_merge_id = display->imode_merge_id = 0; } GType ggobi_display_get_type (void) { static GType display_type = 0; if (!display_type) { static const GTypeInfo display_info = { sizeof (GGobiDisplayClass), NULL, NULL, (GClassInitFunc) ggobi_display_class_init, NULL, NULL, sizeof (struct _displayd), 0, (GInstanceInitFunc) display_init, NULL }; display_type = g_type_register_static (GTK_TYPE_VBOX, "GGobiDisplay", &display_info, 0); } return display_type; } void initWindowDisplayd (windowDisplayd * dpy) { GGOBI_WINDOW_DISPLAY (dpy)->useWindow = true; } GType ggobi_window_display_get_type (void) { static GType window_type = 0; if (!window_type) { static const GTypeInfo window_info = { sizeof (GGobiWindowDisplayClass), NULL, NULL, (GClassInitFunc) NULL, NULL, NULL, sizeof (struct _windowDisplayd), 0, (GInstanceInitFunc) initWindowDisplayd, NULL }; window_type = g_type_register_static (GGOBI_TYPE_DISPLAY, "GGobiWindowDisplay", &window_info, 0); } return window_type; } GType ggobi_embedded_display_get_type (void) { static GType embedded_type = 0; if (!embedded_type) { static const GTypeInfo embedded_info = { sizeof (GGobiEmbeddedDisplayClass), NULL, NULL, (GClassInitFunc) NULL, NULL, NULL, sizeof (struct _embeddedDisplayd), 0, (GInstanceInitFunc) NULL, NULL }; embedded_type = g_type_register_static (GGOBI_TYPE_DISPLAY, "GGobiEmbeddedDisplay", &embedded_info, 0); } return (embedded_type); } /***************************/ static void ggobi_splot_init (splotd * sp) { sp->da = (GtkWidget *) & sp->canvas; sp->pixmap0 = NULL; sp->pixmap1 = NULL; sp->redraw_style = FULL; sp->whiskers = NULL; /*sp->tour1d.firsttime = true; *//* Ensure that the 1D tour should be initialized. */ } /* In a version of a GGobi on my (DTL) Mac, there is no definition for GTK_TYPE_DRAWING_AREA I would be surprised if this bug still exists - mfl #ifndef GTK_TYPE_DRAWING_AREA #define GTK_TYPE_DRAWING_AREA gtk_drawing_area_get_type #endif */ static void splotDestroy (GtkObject * obj) { GtkObjectClass *klass; splotd *sp = GGOBI_SPLOT (obj); /* Can't we just do this in the extended display class, or even the displayd class itself. */ if (sp->whiskers) { g_free ((gpointer) sp->whiskers); sp->whiskers = NULL; } if (sp->edges != NULL) { g_free ((gpointer) sp->edges); sp->edges = NULL; } if (sp->arrowheads != NULL) { g_free ((gpointer) sp->arrowheads); sp->arrowheads = NULL; } sp->da = NULL; klass = GTK_OBJECT_CLASS (g_type_class_peek (GTK_TYPE_DRAWING_AREA)); if (klass->destroy) klass->destroy (obj); } static void splotClassInit (GGobiSPlotClass * klass) { klass->redraw = QUICK; GTK_OBJECT_CLASS (klass)->destroy = splotDestroy; } GType ggobi_splot_get_type (void) { static GType splot_type = 0; if (!splot_type) { static const GTypeInfo splot_info = { sizeof (GGobiSPlotClass), NULL, NULL, (GClassInitFunc) splotClassInit, NULL, NULL, sizeof (splotd), 0, (GInstanceInitFunc) ggobi_splot_init, NULL }; splot_type = g_type_register_static (GTK_TYPE_DRAWING_AREA, "GGobiSPlot", &splot_info, 0); } return splot_type; } static void extendedSPlotClassInit (GGobiExtendedSPlotClass * klass) { klass->tree_label = NULL; klass->createWithVars = NULL; } GType ggobi_extended_splot_get_type (void) { static GType splot_type = 0; if (!splot_type) { static const GTypeInfo splot_info = { sizeof (GGobiExtendedSPlotClass), NULL, NULL, (GClassInitFunc) extendedSPlotClassInit, NULL, NULL, sizeof (extendedSPlotd), 0, (GInstanceInitFunc) NULL, NULL }; splot_type = g_type_register_static (GGOBI_TYPE_SPLOT, "GGobiExtendedSPlot", &splot_info, 0); } return splot_type; } /********************************************/ static void extendedDisplayInit (extendedDisplayd * dpy) { } static GtkWidget * getExtendedDisplayCPanelWidget (displayd * dpy, gchar ** modeName, ggobid * gg) { *modeName = "Unknown mode!"; return (GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget); } static void extendedDisplayClassInit (GGobiExtendedDisplayClass * klass) { klass->imode_control_box = getExtendedDisplayCPanelWidget; klass->options_menu_p = true; klass->allow_reorientation = true; klass->binning_ok = true; /* DFS noticed that if this is false, no display is drawn. */ klass->loop_over_points = true; klass->supports_edges_p = false; } GType ggobi_extended_display_get_type (void) { static GType display_type = 0; if (!display_type) { static const GTypeInfo display_info = { sizeof (GGobiExtendedDisplayClass), NULL, NULL, (GClassInitFunc) extendedDisplayClassInit, NULL, NULL, sizeof (extendedDisplayd), 0, (GInstanceInitFunc) extendedDisplayInit, NULL }; display_type = g_type_register_static (GGOBI_TYPE_WINDOW_DISPLAY, "GGobiExtendedDisplay", &display_info, 0); } return display_type; } static void timeSeriesDisplayInit (timeSeriesDisplayd * dpy) { dpy->extendedDpy.titleLabel = NULL; } GType ggobi_time_series_display_get_type (void) { static GType time_series_type = 0; if (!time_series_type) { static const GTypeInfo time_series_info = { sizeof (GGobiTimeSeriesDisplayClass), NULL, NULL, (GClassInitFunc) timeSeriesClassInit, NULL, NULL, sizeof (timeSeriesDisplayd), 0, (GInstanceInitFunc) timeSeriesDisplayInit, NULL }; time_series_type = g_type_register_static (GGOBI_TYPE_EXTENDED_DISPLAY, "GGobiTimeSeriesDisplay", &time_series_info, 0); } return time_series_type; } /***********************************************************************/ static void barchartDisplayInit (barchartDisplayd * dpy) { dpy->extendedDpy.titleLabel = NULL; } /** This is where we register the barchart class with the GGobi type/class system. This is invoked "transparently" when we use the GGOBI_TYPE_... macros */ GType ggobi_barchart_display_get_type (void) { static GType barchart_type = 0; if (!barchart_type) { /* only register once. */ static const GTypeInfo barchart_info = { sizeof (GGobiBarChartDisplayClass), /* size of the class definition itself, methods, etc. */ NULL, NULL, (GClassInitFunc) barchartDisplayClassInit, /* routine to initialize the class, set the method pointers and constants */ NULL, NULL, sizeof (barchartDisplayd) /* size of the instance of this class. */ , 0, (GInstanceInitFunc) barchartDisplayInit, /* very basic routine to initialize an instance of this class, after it is allocated by the GGobi system using g_object_new(). Typically we will have a higher level routine say, ggobi__new_with...() which will in turn call g_object_new() and then initializes the structure with its own arguments. */ NULL }; barchart_type = g_type_register_static (GGOBI_TYPE_EXTENDED_DISPLAY, "GGobiBarChartDisplay", &barchart_info, 0); } return barchart_type; } static void barchartSPlotInit (barchartSPlotd * sp) { sp->bar = (barchartd *) g_malloc (1 * sizeof (barchartd)); vectori_init_null (&sp->bar->index_to_rank); sp->bar->is_spine = FALSE; barchart_init_vectors (sp); } GType ggobi_barchart_splot_get_type (void) { static GType barchart_type = 0; if (!barchart_type) { static const GTypeInfo barchart_info = { sizeof (GGobiBarChartSPlotClass), NULL, NULL, (GClassInitFunc) barchartSPlotClassInit, NULL, NULL, sizeof (barchartSPlotd), 0, (GInstanceInitFunc) barchartSPlotInit, NULL }; barchart_type = g_type_register_static (GGOBI_TYPE_EXTENDED_SPLOT, "GGobiBarChartSPlot", &barchart_info, 0); } return barchart_type; } /**************************************************************************/ GType ggobi_time_series_splot_get_type (void) { static GType time_series_type = 0; if (!time_series_type) { static const GTypeInfo time_series_info = { sizeof (GGobiTimeSeriesSPlotClass), NULL, NULL, (GClassInitFunc) timeSeriesSPlotClassInit, NULL, NULL, sizeof (timeSeriesSPlotd), 0, (GInstanceInitFunc) NULL, NULL }; time_series_type = g_type_register_static (GGOBI_TYPE_EXTENDED_SPLOT, "GGobiTimeSeriesSPlot", &time_series_info, 0); } return time_series_type; } /**************************************/ GType ggobi_par_coords_display_get_type (void) { static GType par_coords_type = 0; if (!par_coords_type) { static const GTypeInfo par_coords_info = { sizeof (GGobiParCoordsDisplayClass), NULL, NULL, (GClassInitFunc) parcoordsDisplayClassInit, NULL, NULL, sizeof (parcoordsDisplayd), 0, (GInstanceInitFunc) parcoordsDisplayInit, NULL }; par_coords_type = g_type_register_static (GGOBI_TYPE_EXTENDED_DISPLAY, "GGobiParCoordsDisplay", &par_coords_info, 0); } return par_coords_type; } GType ggobi_par_coords_splot_get_type (void) { static GType par_coords_type = 0; if (!par_coords_type) { static const GTypeInfo par_coords_info = { sizeof (GGobiParCoordsSPlotClass), NULL, NULL, (GClassInitFunc) parcoordsSPlotClassInit, NULL, NULL, sizeof (parcoordsSPlotd), 0, (GInstanceInitFunc) NULL, NULL }; par_coords_type = g_type_register_static (GGOBI_TYPE_EXTENDED_SPLOT, "GGobiParCoordsSPlot", &par_coords_info, 0); } return par_coords_type; } /********************************/ GType ggobi_scatter_splot_get_type (void) { static GType scatter_plot_type = 0; if (!scatter_plot_type) { static const GTypeInfo scatter_plot_info = { sizeof (GGobiScatterSPlotClass), NULL, NULL, (GClassInitFunc) scatterSPlotClassInit, NULL, NULL, sizeof (scatterSPlotd), 0, (GInstanceInitFunc) NULL, NULL }; scatter_plot_type = g_type_register_static (GGOBI_TYPE_EXTENDED_SPLOT, "GGobiScatterSPlot", &scatter_plot_info, 0); } return scatter_plot_type; } GType ggobi_scatterplot_display_get_type (void) { static GType scatter_plot_type = 0; if (!scatter_plot_type) { static const GTypeInfo scatter_plot_info = { sizeof (GGobiScatterplotDisplayClass), NULL, NULL, (GClassInitFunc) scatterplotDisplayClassInit, NULL, NULL, sizeof (scatterplotDisplayd), 0, (GInstanceInitFunc) scatterplotDisplayInit, NULL }; scatter_plot_type = g_type_register_static (GGOBI_TYPE_EXTENDED_DISPLAY, "GGobiScatterplotDisplay", &scatter_plot_info, 0); } return scatter_plot_type; } /******************************************/ GType ggobi_scatmat_splot_get_type (void) { static GType scatmat_type = 0; if (!scatmat_type) { static const GTypeInfo scatmat_info = { sizeof (GGobiScatmatSPlotClass), NULL, NULL, (GClassInitFunc) scatmatSPlotClassInit, NULL, NULL, sizeof (scatmatSPlotd), 0, (GInstanceInitFunc) NULL, NULL }; scatmat_type = g_type_register_static (GGOBI_TYPE_EXTENDED_SPLOT, "GGobiScatmatSPlot", &scatmat_info, 0); } return scatmat_type; } GType ggobi_scatmat_display_get_type (void) { static GType scatmat_type = 0; if (!scatmat_type) { static const GTypeInfo scatmat_info = { sizeof (GGobiScatmatDisplayClass), NULL, NULL, (GClassInitFunc) scatmatDisplayClassInit, NULL, NULL, sizeof (scatmatDisplayd), 0, (GInstanceInitFunc) NULL, NULL }; scatmat_type = g_type_register_static (GGOBI_TYPE_EXTENDED_DISPLAY, "GGobiScatmatDisplay", &scatmat_info, 0); } return scatmat_type; } ggobi-2.1.12/src/subset.c0000644000175000017500000001440514651527764010632 /* subset.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" void subset_init (GGobiData *d, ggobid *gg) { gfloat fnr = (gfloat) d->nrows; d->subset.random_n = d->nrows; d->subset.bstart_adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, (fnr-2.0), 1.0, 5.0, 0.0); d->subset.bsize_adj = (GtkAdjustment *) gtk_adjustment_new (fnr/10.0, 1.0, fnr, 1.0, 5.0, 0.0); d->subset.estart_adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, fnr-2.0, 1.0, 5.0, 0.0); d->subset.estep_adj = (GtkAdjustment *) gtk_adjustment_new (fnr/10.0, 1.0, fnr-1, 1.0, 5.0, 0.0); } /*------------------------------------------------------------------*/ /* utilities used within this file */ /*------------------------------------------------------------------*/ static gboolean add_to_subset (gint i, GGobiData *d, ggobid *gg) { gboolean added = false; added = true; d->sampled.els[i] = true; return added; } /*-- remove everything from the subset before constructing a new one --*/ static void subset_clear (GGobiData *d, ggobid *gg) { gint i; g_assert (d->sampled.nels == d->nrows); for (i=0; inrows; i++) d->sampled.els[i] = false; } /*------------------------------------------------------------------*/ void subset_apply (GGobiData *d, ggobid *gg) { rows_in_plot_set (d, gg); clusters_set (d, gg); if (gg->cluster_ui.window != NULL) cluster_table_update (d, gg); tform_to_world (d, gg); /* if (gg->is_pp) { gg->recalc_max_min = True; reset_pp_plot (); pp_index (gg, 0,1); } */ displays_tailpipe (FULL, gg); /*-- points rebinned here --*/ } void subset_include_all (GGobiData *d, ggobid *gg) { gint i; g_assert (d->sampled.nels == d->nrows); for (i=0; inrows; i++) d->sampled.els[i] = true; } /* * This algorithm taken from Knuth, Seminumerical Algorithms; * Vol 2 of his series. */ gboolean subset_random (gint n, GGobiData *d, ggobid *gg) { gint t, m; gboolean doneit = false; gfloat rrand; gint top = d->nrows; subset_clear (d, gg); if (n > 0 && n < top) { for (t=0, m=0; t= 0 && bstart < d->nrows && bsize > 0) { subset_clear (d, gg); for (i=bstart, k=1; inrows && k<=bsize; i++, k++) { add_to_subset (i, d, gg); subsetsize++; } } if (subsetsize == 0) quick_message ("The limits aren't correctly specified.", false); return (subsetsize > 0); } gboolean subset_range (GGobiData *d, ggobid *gg) { gint i, j; gint subsetsize = 0; vartabled *vt; gboolean add; subset_clear (d, gg); for (i=0; inrows; i++) { add = true; for (j=0; jncols; j++) { vt = vartable_element_get (j, d); if (vt->lim_specified_p) { if (d->tform.vals[i][j] < vt->lim_specified.min || d->tform.vals[i][j] > vt->lim_specified.max) { add = false; } } } if (add) { add_to_subset (i, d, gg); subsetsize++; } } if (subsetsize == 0) quick_message ("Use the variable manipulation panel to set ranges.", false); return (subsetsize > 0); } gboolean subset_everyn (gint estart, gint estep, GGobiData *d, ggobid *gg) { gint i; gint top = d->nrows; gboolean doneit = false; top -= 1; if (estart >= 0 && estart < top-1 && estep >= 0 && estep < top) { subset_clear (d, gg); i = estart; while (i < top) { if (add_to_subset (i, d, gg)) i += estep; else i++; } doneit = true; } else quick_message ("Interval not correctly specified.", false); return doneit; } /*-- create a subset of only the points with sticky ids --*/ /*-- Added by James Brook, Oct 1994 --*/ gboolean subset_sticky (GGobiData *d, ggobid *gg) { gint id; GSList *l; gint top = d->nrows; if (g_slist_length (d->sticky_ids) > 0) { subset_clear (d, gg); for (l = d->sticky_ids; l; l = l->next) { id = GPOINTER_TO_INT (l->data); if (id < top) add_to_subset (id, d, gg); } } return true; } gboolean subset_rowlab (gchar *substr, gint substr_pos, gboolean ignore_case, GGobiData *d, ggobid *gg) { gint i; gint top = d->nrows; gssize slen; GtkWidget *w, *pnl; pnl = mode_panel_get_by_name(GGOBI(getIModeName)(IDENT), gg); if (substr == NULL || (slen = g_utf8_strlen(substr, -1)) == 0) return false; /*-- remove all sticky labels --*/ w = widget_find_by_name (pnl, "IDENTIFY:remove_sticky_labels"); g_signal_emit_by_name (G_OBJECT (w), "clicked", gg); /*-- --*/ subset_clear (d, gg); if (ignore_case) substr = g_utf8_strdown(substr, -1); else substr = g_strdup(substr); for (i=0; irowlab, gchar *, i); gint llen = g_utf8_strlen(label, -1); gint start = substr_pos == 3 ? llen - slen : 0; gint safe_len = llen < slen ? llen : slen; if (start < 0) continue; if (ignore_case) label = g_utf8_strdown(label, substr_pos == 2 ? safe_len : llen); else label = g_strndup(label, substr_pos == 2 ? safe_len : llen); if (substr_pos == 1 || substr_pos == 4) { gchar *inside = strstr(label, substr); if ((inside && substr_pos == 1) || (!inside && substr_pos == 4)) add_to_subset (i, d, gg); } else if (!g_utf8_collate(g_utf8_offset_to_pointer(label, start), substr)) add_to_subset (i, d, gg); g_free(label); } g_free(substr); return true; } ggobi-2.1.12/src/ggobi-renderer.c0000644000175000017500000011116714651527764012223 /* Generated by GOB (v2.0.18) (do not edit directly) */ /* End world hunger, donate to the World Food Programme, http://www.wfp.org */ #define GOB_VERSION_MAJOR 2 #define GOB_VERSION_MINOR 0 #define GOB_VERSION_PATCHLEVEL 18 #define selfp (self->_priv) #include /* memset() */ #include "ggobi-renderer.h" #ifdef G_LIKELY #define ___GOB_LIKELY(expr) G_LIKELY(expr) #define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr) #else /* ! G_LIKELY */ #define ___GOB_LIKELY(expr) (expr) #define ___GOB_UNLIKELY(expr) (expr) #endif /* G_LIKELY */ #line 5 "renderer.gob" #include #if GTK_CHECK_VERSION(2,8,0) static cairo_surface_t *ref_cairo_surface(GdkDrawable *self); #endif #line 31 "ggobi-renderer.c" /* self casting macros */ #define SELF(x) GGOBI_RENDERER(x) #define SELF_CONST(x) GGOBI_RENDERER_CONST(x) #define IS_SELF(x) GGOBI_IS_RENDERER(x) #define TYPE_SELF GGOBI_TYPE_RENDERER #define SELF_CLASS(x) GGOBI_RENDERER_CLASS(x) #define SELF_GET_CLASS(x) GGOBI_RENDERER_GET_CLASS(x) /* self typedefs */ typedef GGobiRenderer Self; typedef GGobiRendererClass SelfClass; struct _GGobiRendererPrivate { #line 20 "renderer.gob" GdkDrawable * buffer; #line 23 "renderer.gob" GdkDrawable * parent; #line 50 "ggobi-renderer.c" }; /* here are local prototypes */ static void ___object_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); static void ___object_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); #line 1 "renderer.gob" static void ggobi_renderer_init (GGobiRenderer * o) G_GNUC_UNUSED; #line 57 "ggobi-renderer.c" static GdkDrawable * ___real_ggobi_renderer_create_target (GGobiRenderer * self, GdkDrawable * parent); #line 41 "renderer.gob" static GdkDrawable * ggobi_renderer_create_target (GGobiRenderer * self, GdkDrawable * parent) G_GNUC_UNUSED; #line 61 "ggobi-renderer.c" static GGobiRenderer * ___real_ggobi_renderer_buffer (GGobiRenderer * self); static void ___real_ggobi_renderer_flush (GGobiRenderer * self, GdkGC * gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height); #line 67 "renderer.gob" static void ___4_ggobi_renderer_draw_rectangle (GdkDrawable * self, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height) G_GNUC_UNUSED; #line 66 "ggobi-renderer.c" #line 74 "renderer.gob" static void ___5_ggobi_renderer_draw_arc (GdkDrawable * self, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2) G_GNUC_UNUSED; #line 69 "ggobi-renderer.c" #line 81 "renderer.gob" static void ___6_ggobi_renderer_draw_polygon (GdkDrawable * self, GdkGC * gc, gboolean filled, GdkPoint * points, gint npoints) G_GNUC_UNUSED; #line 72 "ggobi-renderer.c" #line 88 "renderer.gob" static void ___7_ggobi_renderer_draw_points (GdkDrawable * self, GdkGC * gc, GdkPoint * points, gint npoints) G_GNUC_UNUSED; #line 75 "ggobi-renderer.c" #line 94 "renderer.gob" static void ___8_ggobi_renderer_draw_segments (GdkDrawable * self, GdkGC * gc, GdkSegment * segs, gint nsegs) G_GNUC_UNUSED; #line 78 "ggobi-renderer.c" #line 100 "renderer.gob" static void ___9_ggobi_renderer_draw_lines (GdkDrawable * self, GdkGC * gc, GdkPoint * points, gint npoints) G_GNUC_UNUSED; #line 81 "ggobi-renderer.c" #line 106 "renderer.gob" static void ___a_ggobi_renderer_draw_trapezoids (GdkDrawable * self, GdkGC * gc, GdkTrapezoid * trapezoids, gint n_trapezoids) G_GNUC_UNUSED; #line 84 "ggobi-renderer.c" #line 114 "renderer.gob" static void ___b_ggobi_renderer_draw_text (GdkDrawable * self, GdkFont * font, GdkGC * gc, gint x, gint y, const gchar * text, gint text_length) G_GNUC_UNUSED; #line 87 "ggobi-renderer.c" #line 121 "renderer.gob" static void ___c_ggobi_renderer_draw_text_wc (GdkDrawable * self, GdkFont * font, GdkGC * gc, gint x, gint y, const GdkWChar * text, gint text_length) G_GNUC_UNUSED; #line 90 "ggobi-renderer.c" #line 128 "renderer.gob" static void ___d_ggobi_renderer_draw_glyphs (GdkDrawable * self, GdkGC * gc, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) G_GNUC_UNUSED; #line 93 "ggobi-renderer.c" #line 135 "renderer.gob" static void ___e_ggobi_renderer_draw_glyphs_transformed (GdkDrawable * self, GdkGC * gc, PangoMatrix * matrix, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) G_GNUC_UNUSED; #line 96 "ggobi-renderer.c" #line 143 "renderer.gob" static GdkGC * ___f_ggobi_renderer_create_gc (GdkDrawable * self, GdkGCValues * values, GdkGCValuesMask mask) G_GNUC_UNUSED; #line 99 "ggobi-renderer.c" #line 149 "renderer.gob" static void ___10_ggobi_renderer_draw_drawable (GdkDrawable * self, GdkGC * gc, GdkDrawable * src, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) G_GNUC_UNUSED; #line 102 "ggobi-renderer.c" #line 156 "renderer.gob" static void ___11_ggobi_renderer_draw_image (GdkDrawable * self, GdkGC * gc, GdkImage * image, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) G_GNUC_UNUSED; #line 105 "ggobi-renderer.c" #line 164 "renderer.gob" static gint ___12_ggobi_renderer_get_depth (GdkDrawable * self) G_GNUC_UNUSED; #line 108 "ggobi-renderer.c" #line 170 "renderer.gob" static void ___13_ggobi_renderer_get_size (GdkDrawable * self, gint * width, gint * height) G_GNUC_UNUSED; #line 111 "ggobi-renderer.c" #line 177 "renderer.gob" static void ___14_ggobi_renderer_set_colormap (GdkDrawable * self, GdkColormap * cmap) G_GNUC_UNUSED; #line 114 "ggobi-renderer.c" #line 183 "renderer.gob" static GdkColormap * ___15_ggobi_renderer_get_colormap (GdkDrawable * self) G_GNUC_UNUSED; #line 117 "ggobi-renderer.c" #line 189 "renderer.gob" static GdkVisual * ___16_ggobi_renderer_get_visual (GdkDrawable * self) G_GNUC_UNUSED; #line 120 "ggobi-renderer.c" #line 195 "renderer.gob" static GdkScreen * ___17_ggobi_renderer_get_screen (GdkDrawable * self) G_GNUC_UNUSED; #line 123 "ggobi-renderer.c" #line 201 "renderer.gob" static GdkImage * ___18_ggobi_renderer_get_image (GdkDrawable * self, gint x, gint y, gint width, gint height) G_GNUC_UNUSED; #line 126 "ggobi-renderer.c" #line 207 "renderer.gob" static GdkRegion * ___19_ggobi_renderer_get_clip_region (GdkDrawable * self) G_GNUC_UNUSED; #line 129 "ggobi-renderer.c" #line 213 "renderer.gob" static GdkRegion * ___1a_ggobi_renderer_get_visible_region (GdkDrawable * self) G_GNUC_UNUSED; #line 132 "ggobi-renderer.c" #line 219 "renderer.gob" static GdkDrawable * ___1b_ggobi_renderer_get_composite_drawable (GdkDrawable * self, gint x, gint y, gint width, gint height, gint * composite_x_offset, gint * composite_y_offset) G_GNUC_UNUSED; #line 135 "ggobi-renderer.c" #line 227 "renderer.gob" static void ___1c_ggobi_renderer_draw_pixbuf (GdkDrawable * self, GdkGC * gc, GdkPixbuf * pixbuf, gint src_x, gint src_y, gint dest_x, gint dest_y, gint width, gint height, GdkRgbDither dither, gint x_dither, gint y_dither) G_GNUC_UNUSED; #line 138 "ggobi-renderer.c" #line 236 "renderer.gob" static GdkImage * ___1d_ggobi_renderer__copy_to_image (GdkDrawable * self, GdkImage * image, gint src_x, gint src_y, gint dest_x, gint dest_y, gint width, gint height) G_GNUC_UNUSED; #line 141 "ggobi-renderer.c" #line 244 "renderer.gob" static void ggobi_renderer_class_init (GGobiRendererClass * self_class) G_GNUC_UNUSED; #line 144 "ggobi-renderer.c" enum { PROP_0, PROP_PARENT }; /* pointer to the class of our parent */ static GdkDrawableClass *parent_class = NULL; /* Short form macros */ #define self_create_target ggobi_renderer_create_target #define self_buffer ggobi_renderer_buffer #define self_flush ggobi_renderer_flush GType ggobi_renderer_get_type (void) { static GType type = 0; if ___GOB_UNLIKELY(type == 0) { static const GTypeInfo info = { sizeof (GGobiRendererClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) ggobi_renderer_class_init, (GClassFinalizeFunc) NULL, NULL /* class_data */, sizeof (GGobiRenderer), 0 /* n_preallocs */, (GInstanceInitFunc) ggobi_renderer_init, NULL }; type = g_type_register_static (GDK_TYPE_DRAWABLE, "GGobiRenderer", &info, (GTypeFlags)0); } return type; } /* a macro for creating a new object of our type */ #define GET_NEW ((GGobiRenderer *)g_object_new(ggobi_renderer_get_type(), NULL)) /* a function for creating a new object of our type */ #include static GGobiRenderer * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED; static GGobiRenderer * GET_NEW_VARG (const char *first, ...) { GGobiRenderer *ret; va_list ap; va_start (ap, first); ret = (GGobiRenderer *)g_object_new_valist (ggobi_renderer_get_type (), first, ap); va_end (ap); return ret; } static void ___dispose (GObject *obj_self) { #define __GOB_FUNCTION__ "GGobi:Renderer::dispose" GGobiRenderer *self G_GNUC_UNUSED = GGOBI_RENDERER (obj_self); if (G_OBJECT_CLASS (parent_class)->dispose) \ (* G_OBJECT_CLASS (parent_class)->dispose) (obj_self); #line 20 "renderer.gob" if(self->_priv->buffer) { g_object_unref ((gpointer) self->_priv->buffer); self->_priv->buffer = NULL; } #line 210 "ggobi-renderer.c" #line 23 "renderer.gob" if(self->_priv->parent) { g_object_unref ((gpointer) self->_priv->parent); self->_priv->parent = NULL; } #line 213 "ggobi-renderer.c" } #undef __GOB_FUNCTION__ static void ___finalize(GObject *obj_self) { #define __GOB_FUNCTION__ "GGobi:Renderer::finalize" GGobiRenderer *self G_GNUC_UNUSED = GGOBI_RENDERER (obj_self); gpointer priv G_GNUC_UNUSED = self->_priv; if(G_OBJECT_CLASS(parent_class)->finalize) \ (* G_OBJECT_CLASS(parent_class)->finalize)(obj_self); } #undef __GOB_FUNCTION__ static void ggobi_renderer_init (GGobiRenderer * o G_GNUC_UNUSED) { #define __GOB_FUNCTION__ "GGobi:Renderer::init" o->_priv = G_TYPE_INSTANCE_GET_PRIVATE(o,GGOBI_TYPE_RENDERER,GGobiRendererPrivate); } #undef __GOB_FUNCTION__ #line 244 "renderer.gob" static void ggobi_renderer_class_init (GGobiRendererClass * self_class G_GNUC_UNUSED) { #line 240 "ggobi-renderer.c" #define __GOB_FUNCTION__ "GGobi:Renderer::class_init" GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass*) self_class; GdkDrawableClass *gdk_drawable_class = (GdkDrawableClass *)self_class; g_type_class_add_private(self_class,sizeof(GGobiRendererPrivate)); parent_class = g_type_class_ref (GDK_TYPE_DRAWABLE); #line 41 "renderer.gob" self_class->create_target = ___real_ggobi_renderer_create_target; #line 50 "renderer.gob" self_class->buffer = ___real_ggobi_renderer_buffer; #line 57 "renderer.gob" self_class->flush = ___real_ggobi_renderer_flush; #line 67 "renderer.gob" gdk_drawable_class->draw_rectangle = ___4_ggobi_renderer_draw_rectangle; #line 74 "renderer.gob" gdk_drawable_class->draw_arc = ___5_ggobi_renderer_draw_arc; #line 81 "renderer.gob" gdk_drawable_class->draw_polygon = ___6_ggobi_renderer_draw_polygon; #line 88 "renderer.gob" gdk_drawable_class->draw_points = ___7_ggobi_renderer_draw_points; #line 94 "renderer.gob" gdk_drawable_class->draw_segments = ___8_ggobi_renderer_draw_segments; #line 100 "renderer.gob" gdk_drawable_class->draw_lines = ___9_ggobi_renderer_draw_lines; #line 106 "renderer.gob" gdk_drawable_class->draw_trapezoids = ___a_ggobi_renderer_draw_trapezoids; #line 114 "renderer.gob" gdk_drawable_class->draw_text = ___b_ggobi_renderer_draw_text; #line 121 "renderer.gob" gdk_drawable_class->draw_text_wc = ___c_ggobi_renderer_draw_text_wc; #line 128 "renderer.gob" gdk_drawable_class->draw_glyphs = ___d_ggobi_renderer_draw_glyphs; #line 135 "renderer.gob" gdk_drawable_class->draw_glyphs_transformed = ___e_ggobi_renderer_draw_glyphs_transformed; #line 143 "renderer.gob" gdk_drawable_class->create_gc = ___f_ggobi_renderer_create_gc; #line 149 "renderer.gob" gdk_drawable_class->draw_drawable = ___10_ggobi_renderer_draw_drawable; #line 156 "renderer.gob" gdk_drawable_class->draw_image = ___11_ggobi_renderer_draw_image; #line 164 "renderer.gob" gdk_drawable_class->get_depth = ___12_ggobi_renderer_get_depth; #line 170 "renderer.gob" gdk_drawable_class->get_size = ___13_ggobi_renderer_get_size; #line 177 "renderer.gob" gdk_drawable_class->set_colormap = ___14_ggobi_renderer_set_colormap; #line 183 "renderer.gob" gdk_drawable_class->get_colormap = ___15_ggobi_renderer_get_colormap; #line 189 "renderer.gob" gdk_drawable_class->get_visual = ___16_ggobi_renderer_get_visual; #line 195 "renderer.gob" gdk_drawable_class->get_screen = ___17_ggobi_renderer_get_screen; #line 201 "renderer.gob" gdk_drawable_class->get_image = ___18_ggobi_renderer_get_image; #line 207 "renderer.gob" gdk_drawable_class->get_clip_region = ___19_ggobi_renderer_get_clip_region; #line 213 "renderer.gob" gdk_drawable_class->get_visible_region = ___1a_ggobi_renderer_get_visible_region; #line 219 "renderer.gob" gdk_drawable_class->get_composite_drawable = ___1b_ggobi_renderer_get_composite_drawable; #line 227 "renderer.gob" gdk_drawable_class->draw_pixbuf = ___1c_ggobi_renderer_draw_pixbuf; #line 236 "renderer.gob" gdk_drawable_class->_copy_to_image = ___1d_ggobi_renderer__copy_to_image; #line 307 "ggobi-renderer.c" g_object_class->dispose = ___dispose; g_object_class->finalize = ___finalize; g_object_class->get_property = ___object_get_property; g_object_class->set_property = ___object_set_property; { GParamSpec *param_spec; param_spec = g_param_spec_object ("parent" /* name */, "out" /* nick */, "The drawable to which this renderer is flushed" /* blurb */, GDK_TYPE_DRAWABLE /* object_type */, (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (g_object_class, PROP_PARENT, param_spec); } { #line 244 "renderer.gob" /* need to do this one manually, to avoid GTK+ 2.8.x dep */ #if GTK_CHECK_VERSION(2,8,0) GDK_DRAWABLE_CLASS(self_class)->ref_cairo_surface = ref_cairo_surface; #endif #line 332 "ggobi-renderer.c" } } #undef __GOB_FUNCTION__ static void ___object_set_property (GObject *object, guint property_id, const GValue *VAL G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED) #define __GOB_FUNCTION__ "GGobi:Renderer::set_property" { GGobiRenderer *self G_GNUC_UNUSED; self = GGOBI_RENDERER (object); switch (property_id) { case PROP_PARENT: { #line 27 "renderer.gob" GObject *obj = g_value_dup_object(VAL); if (selfp->parent) g_object_unref(G_OBJECT(selfp->parent)); selfp->parent = GDK_DRAWABLE(obj); if (selfp->buffer) g_object_unref(G_OBJECT(selfp->buffer)); selfp->buffer = self_create_target(self, selfp->parent); #line 361 "ggobi-renderer.c" } break; default: /* Apparently in g++ this is needed, glib is b0rk */ #ifndef __PRETTY_FUNCTION__ # undef G_STRLOC # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } #undef __GOB_FUNCTION__ static void ___object_get_property (GObject *object, guint property_id, GValue *VAL G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED) #define __GOB_FUNCTION__ "GGobi:Renderer::get_property" { GGobiRenderer *self G_GNUC_UNUSED; self = GGOBI_RENDERER (object); switch (property_id) { case PROP_PARENT: { #line 35 "renderer.gob" g_value_set_object(VAL, selfp->parent); #line 394 "ggobi-renderer.c" } break; default: /* Apparently in g++ this is needed, glib is b0rk */ #ifndef __PRETTY_FUNCTION__ # undef G_STRLOC # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } #undef __GOB_FUNCTION__ #line 41 "renderer.gob" static GdkDrawable * ggobi_renderer_create_target (GGobiRenderer * self, GdkDrawable * parent) { #line 414 "ggobi-renderer.c" GGobiRendererClass *klass; #line 41 "renderer.gob" g_return_val_if_fail (self != NULL, (GdkDrawable * )0); #line 41 "renderer.gob" g_return_val_if_fail (GGOBI_IS_RENDERER (self), (GdkDrawable * )0); #line 420 "ggobi-renderer.c" klass = GGOBI_RENDERER_GET_CLASS(self); if(klass->create_target) return (*klass->create_target)(self,parent); else return (GdkDrawable * )(0); } #line 41 "renderer.gob" static GdkDrawable * ___real_ggobi_renderer_create_target (GGobiRenderer * self G_GNUC_UNUSED, GdkDrawable * parent) { #line 432 "ggobi-renderer.c" #define __GOB_FUNCTION__ "GGobi:Renderer::create_target" { #line 43 "renderer.gob" gint width, height; gdk_drawable_get_size(parent, &width, &height); return gdk_pixmap_new(parent, width, height, -1); }} #line 441 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #line 50 "renderer.gob" GGobiRenderer * ggobi_renderer_buffer (GGobiRenderer * self) { #line 448 "ggobi-renderer.c" GGobiRendererClass *klass; #line 50 "renderer.gob" g_return_val_if_fail (self != NULL, (GGobiRenderer * )0); #line 50 "renderer.gob" g_return_val_if_fail (GGOBI_IS_RENDERER (self), (GGobiRenderer * )0); #line 454 "ggobi-renderer.c" klass = GGOBI_RENDERER_GET_CLASS(self); if(klass->buffer) return (*klass->buffer)(self); else return (GGobiRenderer * )(0); } #line 50 "renderer.gob" static GGobiRenderer * ___real_ggobi_renderer_buffer (GGobiRenderer * self G_GNUC_UNUSED) { #line 466 "ggobi-renderer.c" #define __GOB_FUNCTION__ "GGobi:Renderer::buffer" { #line 52 "renderer.gob" GObject *obj = g_object_new(G_OBJECT_TYPE(self), "parent", self, NULL); return GGOBI_RENDERER(obj); }} #line 474 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #line 57 "renderer.gob" void ggobi_renderer_flush (GGobiRenderer * self, GdkGC * gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { #line 481 "ggobi-renderer.c" GGobiRendererClass *klass; #line 57 "renderer.gob" g_return_if_fail (self != NULL); #line 57 "renderer.gob" g_return_if_fail (GGOBI_IS_RENDERER (self)); #line 487 "ggobi-renderer.c" klass = GGOBI_RENDERER_GET_CLASS(self); if(klass->flush) (*klass->flush)(self,gc,xsrc,ysrc,xdest,ydest,width,height); } #line 57 "renderer.gob" static void ___real_ggobi_renderer_flush (GGobiRenderer * self G_GNUC_UNUSED, GdkGC * gc, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { #line 497 "ggobi-renderer.c" #define __GOB_FUNCTION__ "GGobi:Renderer::flush" { #line 60 "renderer.gob" gdk_draw_drawable(selfp->parent, gc, selfp->buffer, xsrc, ysrc, xdest, ydest, width, height); }} #line 505 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #line 67 "renderer.gob" static void ___4_ggobi_renderer_draw_rectangle (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height) #line 511 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___filled,___x,___y,___width,___height) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_rectangle) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_rectangle)(___self,___gc,___filled,___x,___y,___width,___height); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_rectangle" { #line 70 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_rectangle( SELF(self)->_priv->buffer, gc, filled, x, y, width, height); }} #line 523 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 74 "renderer.gob" static void ___5_ggobi_renderer_draw_arc (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2) #line 530 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___filled,___x,___y,___width,___height,___angle1,___angle2) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_arc) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_arc)(___self,___gc,___filled,___x,___y,___width,___height,___angle1,___angle2); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_arc" { #line 77 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_arc( SELF(self)->_priv->buffer, gc, filled, x, y, width, height, angle1, angle2); }} #line 542 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 81 "renderer.gob" static void ___6_ggobi_renderer_draw_polygon (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, gboolean filled, GdkPoint * points, gint npoints) #line 549 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___filled,___points,___npoints) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_polygon) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_polygon)(___self,___gc,___filled,___points,___npoints); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_polygon" { #line 84 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_polygon( SELF(self)->_priv->buffer, gc, filled, points, npoints); }} #line 561 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 88 "renderer.gob" static void ___7_ggobi_renderer_draw_points (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkPoint * points, gint npoints) #line 568 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___points,___npoints) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_points) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_points)(___self,___gc,___points,___npoints); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_points" { #line 90 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_points( SELF(self)->_priv->buffer, gc, points, npoints); }} #line 580 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 94 "renderer.gob" static void ___8_ggobi_renderer_draw_segments (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkSegment * segs, gint nsegs) #line 587 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___segs,___nsegs) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_segments) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_segments)(___self,___gc,___segs,___nsegs); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_segments" { #line 96 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_segments( SELF(self)->_priv->buffer, gc, segs, nsegs); }} #line 599 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 100 "renderer.gob" static void ___9_ggobi_renderer_draw_lines (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkPoint * points, gint npoints) #line 606 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___points,___npoints) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_lines) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_lines)(___self,___gc,___points,___npoints); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_lines" { #line 102 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_lines( SELF(self)->_priv->buffer, gc, points, npoints); }} #line 618 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 106 "renderer.gob" static void ___a_ggobi_renderer_draw_trapezoids (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkTrapezoid * trapezoids, gint n_trapezoids) #line 625 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___trapezoids,___n_trapezoids) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_trapezoids) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_trapezoids)(___self,___gc,___trapezoids,___n_trapezoids); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_trapezoids" { #line 109 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_trapezoids( SELF(self)->_priv->buffer, gc, trapezoids, n_trapezoids); }} #line 637 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 114 "renderer.gob" static void ___b_ggobi_renderer_draw_text (GdkDrawable * self G_GNUC_UNUSED, GdkFont * font, GdkGC * gc, gint x, gint y, const gchar * text, gint text_length) #line 644 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___font,___gc,___x,___y,___text,___text_length) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_text) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_text)(___self,___font,___gc,___x,___y,___text,___text_length); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_text" { #line 117 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_text( SELF(self)->_priv->buffer, font, gc, x, y, text, text_length); }} #line 656 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 121 "renderer.gob" static void ___c_ggobi_renderer_draw_text_wc (GdkDrawable * self G_GNUC_UNUSED, GdkFont * font, GdkGC * gc, gint x, gint y, const GdkWChar * text, gint text_length) #line 663 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___font,___gc,___x,___y,___text,___text_length) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_text_wc) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_text_wc)(___self,___font,___gc,___x,___y,___text,___text_length); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_text_wc" { #line 124 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_text_wc( SELF(self)->_priv->buffer, font, gc, x, y, text, text_length); }} #line 675 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 128 "renderer.gob" static void ___d_ggobi_renderer_draw_glyphs (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) #line 682 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___font,___x,___y,___glyphs) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs)(___self,___gc,___font,___x,___y,___glyphs); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_glyphs" { #line 131 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_glyphs( SELF(self)->_priv->buffer, gc, font, x, y, glyphs); }} #line 694 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 135 "renderer.gob" static void ___e_ggobi_renderer_draw_glyphs_transformed (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, PangoMatrix * matrix, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) #line 701 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___matrix,___font,___x,___y,___glyphs) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs_transformed) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs_transformed)(___self,___gc,___matrix,___font,___x,___y,___glyphs); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_glyphs_transformed" { #line 138 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_glyphs_transformed( SELF(self)->_priv->buffer, gc, matrix, font, x, y, glyphs); }} #line 713 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 143 "renderer.gob" static GdkGC * ___f_ggobi_renderer_create_gc (GdkDrawable * self G_GNUC_UNUSED, GdkGCValues * values, GdkGCValuesMask mask) #line 720 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___values,___mask) \ ((GDK_DRAWABLE_CLASS(parent_class)->create_gc)? \ (* GDK_DRAWABLE_CLASS(parent_class)->create_gc)(___self,___values,___mask): \ ((GdkGC * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::create_gc" { #line 145 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->create_gc( SELF(self)->_priv->buffer, values, mask); }} #line 733 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 149 "renderer.gob" static void ___10_ggobi_renderer_draw_drawable (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkDrawable * src, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) #line 740 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___src,___xsrc,___ysrc,___xdest,___ydest,___width,___height) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_drawable) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_drawable)(___self,___gc,___src,___xsrc,___ysrc,___xdest,___ydest,___width,___height); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_drawable" { #line 152 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_drawable( SELF(self)->_priv->buffer, gc, src, xsrc, ysrc, xdest, ydest, width, height); }} #line 752 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 156 "renderer.gob" static void ___11_ggobi_renderer_draw_image (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkImage * image, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) #line 759 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___image,___xsrc,___ysrc,___xdest,___ydest,___width,___height) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_image) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_image)(___self,___gc,___image,___xsrc,___ysrc,___xdest,___ydest,___width,___height); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_image" { #line 159 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_image( SELF(self)->_priv->buffer, gc, image, xsrc, ysrc, xdest, ydest, width, height); }} #line 771 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 164 "renderer.gob" static gint ___12_ggobi_renderer_get_depth (GdkDrawable * self G_GNUC_UNUSED) #line 778 "ggobi-renderer.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_depth)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_depth)(___self): \ ((gint )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_depth" { #line 166 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_depth( SELF(self)->_priv->buffer); }} #line 791 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 170 "renderer.gob" static void ___13_ggobi_renderer_get_size (GdkDrawable * self G_GNUC_UNUSED, gint * width, gint * height) #line 798 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___width,___height) \ { if(GDK_DRAWABLE_CLASS(parent_class)->get_size) \ (* GDK_DRAWABLE_CLASS(parent_class)->get_size)(___self,___width,___height); } { #define __GOB_FUNCTION__ "GGobi:Renderer::get_size" { #line 172 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_size( SELF(self)->_priv->buffer, width, height); }} #line 810 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 177 "renderer.gob" static void ___14_ggobi_renderer_set_colormap (GdkDrawable * self G_GNUC_UNUSED, GdkColormap * cmap) #line 817 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___cmap) \ { if(GDK_DRAWABLE_CLASS(parent_class)->set_colormap) \ (* GDK_DRAWABLE_CLASS(parent_class)->set_colormap)(___self,___cmap); } { #define __GOB_FUNCTION__ "GGobi:Renderer::set_colormap" { #line 179 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->set_colormap( SELF(self)->_priv->buffer, cmap); }} #line 829 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 183 "renderer.gob" static GdkColormap * ___15_ggobi_renderer_get_colormap (GdkDrawable * self G_GNUC_UNUSED) #line 836 "ggobi-renderer.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_colormap)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_colormap)(___self): \ ((GdkColormap * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_colormap" { #line 185 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_colormap( SELF(self)->_priv->buffer); }} #line 849 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 189 "renderer.gob" static GdkVisual * ___16_ggobi_renderer_get_visual (GdkDrawable * self G_GNUC_UNUSED) #line 856 "ggobi-renderer.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_visual)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_visual)(___self): \ ((GdkVisual * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_visual" { #line 191 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_visual( SELF(self)->_priv->buffer); }} #line 869 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 195 "renderer.gob" static GdkScreen * ___17_ggobi_renderer_get_screen (GdkDrawable * self G_GNUC_UNUSED) #line 876 "ggobi-renderer.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_screen)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_screen)(___self): \ ((GdkScreen * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_screen" { #line 197 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_screen( SELF(self)->_priv->buffer); }} #line 889 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 201 "renderer.gob" static GdkImage * ___18_ggobi_renderer_get_image (GdkDrawable * self G_GNUC_UNUSED, gint x, gint y, gint width, gint height) #line 896 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___x,___y,___width,___height) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_image)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_image)(___self,___x,___y,___width,___height): \ ((GdkImage * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_image" { #line 203 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_image( SELF(self)->_priv->buffer, x, y, width, height); }} #line 909 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 207 "renderer.gob" static GdkRegion * ___19_ggobi_renderer_get_clip_region (GdkDrawable * self G_GNUC_UNUSED) #line 916 "ggobi-renderer.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_clip_region)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_clip_region)(___self): \ ((GdkRegion * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_clip_region" { #line 209 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_clip_region( SELF(self)->_priv->buffer); }} #line 929 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 213 "renderer.gob" static GdkRegion * ___1a_ggobi_renderer_get_visible_region (GdkDrawable * self G_GNUC_UNUSED) #line 936 "ggobi-renderer.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_visible_region)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_visible_region)(___self): \ ((GdkRegion * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_visible_region" { #line 215 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_visible_region( SELF(self)->_priv->buffer); }} #line 949 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 219 "renderer.gob" static GdkDrawable * ___1b_ggobi_renderer_get_composite_drawable (GdkDrawable * self G_GNUC_UNUSED, gint x, gint y, gint width, gint height, gint * composite_x_offset, gint * composite_y_offset) #line 956 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___x,___y,___width,___height,___composite_x_offset,___composite_y_offset) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_composite_drawable)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_composite_drawable)(___self,___x,___y,___width,___height,___composite_x_offset,___composite_y_offset): \ ((GdkDrawable * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::get_composite_drawable" { #line 222 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->get_composite_drawable( SELF(self)->_priv->buffer, x, y, width, height, composite_x_offset, composite_y_offset); }} #line 969 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 227 "renderer.gob" static void ___1c_ggobi_renderer_draw_pixbuf (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkPixbuf * pixbuf, gint src_x, gint src_y, gint dest_x, gint dest_y, gint width, gint height, GdkRgbDither dither, gint x_dither, gint y_dither) #line 976 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___gc,___pixbuf,___src_x,___src_y,___dest_x,___dest_y,___width,___height,___dither,___x_dither,___y_dither) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_pixbuf) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_pixbuf)(___self,___gc,___pixbuf,___src_x,___src_y,___dest_x,___dest_y,___width,___height,___dither,___x_dither,___y_dither); } { #define __GOB_FUNCTION__ "GGobi:Renderer::draw_pixbuf" { #line 231 "renderer.gob" GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->draw_pixbuf( SELF(self)->_priv->buffer, gc, pixbuf, src_x, src_y, dest_x, dest_y, width, height, dither, x_dither, y_dither); }} #line 989 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 236 "renderer.gob" static GdkImage * ___1d_ggobi_renderer__copy_to_image (GdkDrawable * self G_GNUC_UNUSED, GdkImage * image, gint src_x, gint src_y, gint dest_x, gint dest_y, gint width, gint height) #line 996 "ggobi-renderer.c" #define PARENT_HANDLER(___self,___image,___src_x,___src_y,___dest_x,___dest_y,___width,___height) \ ((GDK_DRAWABLE_CLASS(parent_class)->_copy_to_image)? \ (* GDK_DRAWABLE_CLASS(parent_class)->_copy_to_image)(___self,___image,___src_x,___src_y,___dest_x,___dest_y,___width,___height): \ ((GdkImage * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer::_copy_to_image" { #line 239 "renderer.gob" return GDK_DRAWABLE_GET_CLASS(SELF(self)->_priv->buffer)->_copy_to_image( SELF(self)->_priv->buffer, image, src_x, src_y, dest_x, dest_y, width, height); }} #line 1009 "ggobi-renderer.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 251 "renderer.gob" #if GTK_CHECK_VERSION(2,8,0) static cairo_surface_t * ref_cairo_surface(GdkDrawable *self) { return GDK_DRAWABLE_GET_CLASS(GGOBI_RENDERER(self)->_priv->buffer)->ref_cairo_surface( GGOBI_RENDERER(self)->_priv->buffer); } #endif #line 1025 "ggobi-renderer.c" ggobi-2.1.12/src/noop-toggle.h0000644000175000017500000000225014651527764011557 /*-- noop-toggle.h --*/ #ifndef _INC_NOOP_TOGGLE_BUTTON_H #define _INC_NOOP_TOGGLE_BUTTON_H #include #include typedef struct _GGobiNoopToggleButton GGobiNoopToggleButton; typedef struct _GGobiNoopToggleButtonClass GGobiNoopToggleButtonClass; struct _GGobiNoopToggleButton { GtkToggleButton parent; }; struct _GGobiNoopToggleButtonClass { GtkToggleButtonClass parent_class; }; #define GGOBI_TYPE_NOOP_TOGGLE_BUTTON (ggobi_noop_toggle_button_get_type()) #define GGOBI_NOOP_TOGGLE_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GGOBI_TYPE_NOOP_TOGGLE_BUTTON,GGobiNoopToggleButton)) #define GGOBI_NOOP_TOGGLE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GGOBI_TYPE_NOOP_TOGGLE_BUTTON,GGobiNoopToggleButtonClass)) #define GGOBI_IS_NOOP_TOGGLE_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GGOBI_TYPE_NOOP_TOGGLE_BUTTON)) #define GGOBI_IS_NOOP_TOGGLE_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GGOBI_TYPE_NOOP_TOGGLE_BUTTON)) GType ggobi_noop_toggle_button_get_type(void); GtkWidget* ggobi_noop_toggle_button_new(void); GtkWidget* ggobi_noop_toggle_button_new_with_label(const gchar *label); #endif /* _INC_NOOP_TOGGLE_BUTTON_H */ ggobi-2.1.12/src/data.gob0000644000175000017500000003724214651527764010567 %h{ #include "defines.h" #include "brushing.h" #include "vartable.h" #include "fileio.h" #include typedef struct _Subset { gint random_n; gint string_pos; /*-- adjustments from which to get values for blocksize, everyn --*/ GtkAdjustment *bstart_adj, *bsize_adj; GtkAdjustment *estart_adj, *estep_adj; } Subset; typedef struct _Jitterd { gfloat factor; gboolean type; gboolean convex; gfloat *jitfacv; } Jitterd; typedef struct _Varpanel_cboxd { GtkWidget *ebox; /*-- child1 of pane widget --*/ GtkWidget *swin; /*-- child of ebox --*/ GtkWidget *vbox; /*-- child of swin --*/ GSList *box; /*-- single column of hboxes --*/ } Varpanel_cboxd; typedef struct _Varpanel_circd { GtkWidget *ebox; /*-- child2 of pane widget --*/ GtkWidget *vbox; /*-- child of ebox --*/ GtkWidget *swin, *hbox; /*-- children of vbox --*/ GtkWidget *table; /*-- sole child of swin; now a vbox --*/ GtkWidget *manip_btn, *freeze_btn; /*-- children of hbox --*/ GdkCursor *cursor; gint jcursor; /*-- components and properties of the table --*/ GSList *vb, *da, *label; GSList *da_pix; /*-- backing pixmaps --*/ gint nvars; } Varpanel_circd; typedef struct _Varpaneld { GtkWidget *hpane; /*-- child of the ebox --*/ } Varpaneld; /*-------------------- transformation --------------------------------*/ /* sphering transformation */ typedef struct _Sphere_d { vector_i vars; /*-- vars available to be sphered --*/ vector_i vars_sphered;/*-- vars that have been sphered --*/ gint npcs; /*-- the first npcs vars of vars will be sphered --*/ vector_i pcvars;/*-- vars into which sphered data is written --*/ vector_f eigenval; array_d eigenvec; array_f vc; vector_f tform_mean; vector_f tform_stddev; gboolean vars_stdized; } Sphere_d; typedef struct _EdgeData { gint n; SymbolicEndpoints *sym_endpoints; GList *endpointList; /* a list of endpointsd elements corresponding to the resolved record ids relative to a given datad. This is akin to a table indexed by datad elements. */ gint nxed_by_brush; vector_b xed_by_brush; } EdgeData; typedef struct _BrushBins { gint nbins; bin_struct **binarray; icoords bin0, bin1; } BrushBins; %} %{ #include "vars.h" #include "externs.h" %} class GGobi:Data from G:Object { public const gchar *name; public const gchar *nickname; public InputDescription *input; public guint nrows; public gint ncols; public gboolean missings; public struct _ggobid *gg; /*-- a pointer to the parent --*/ public GArray *rowlab; /*-- row ids to support generalized linking --*/ public GHashTable *idTable; public char **rowIds; /*-- to support brushing by categorical variable --*/ public vartabled *linkvar_vt; /*-- the linking variable --*/ public Subset subset; public Jitterd jitter; public Varpanel_cboxd vcbox_ui; public Varpanel_circd vcirc_ui; public Varpaneld varpanel_ui; public Sphere_d sphere; public EdgeData edge; public BrushBins brush; public GSList *vartable; public GtkWidget *vartable_tree_view[all_vartypes]; public GtkTreeModel *vartable_tree_model; /* the root model, with all vars */ public array_f raw; public array_f tform; public array_g world; public array_g jitdata; /*----------------------- missing values ---------------------------*/ public array_s missing; public gboolean missings_show_p; /*-- show/hide per datad, not per display --*/ /*---------------- deleting the hidden points; subsetting ----------*/ public vector_i rows_in_plot; /*-- always of length self->nrows --*/ public gint nrows_in_plot; /*-- how many elements of rows_in_plot to use --*/ public vector_b sampled; public vector_b excluded; /*--------------- clusters: hiding, excluding ----------------------*/ public symbol_cell symbol_table[NGLYPHTYPES][NGLYPHSIZES][MAXNCOLORS]; public GtkWidget *cluster_table; /*-- table of symbol groups from brushing --*/ public gint nclusters; public clusterd *clusv; public clusteruid *clusvui; public vector_i clusterid; /* cluster membership for each record */ /*------------------------ brushing ----------------------------------*/ public gint npts_under_brush; public vector_b pts_under_brush; public vector_s color; public vector_s color_now; public vector_s color_prev; public vector_b hidden; public vector_b hidden_now; public vector_b hidden_prev; public vector_g glyph; public vector_g glyph_now; public vector_g glyph_prev; /*-- used in identification, line editing, and point motion --*/ public gint nearest_point; public gint nearest_point_prev; public GSList *sticky_ids; /*-------------------- moving points ---------------------------------*/ public GSList *movepts_history; /*-- a list of elements of type celld --*/ property UINT nrows (nick = "nrows", blurb = "Number of rows in the dataset", minimum = 0, maximum = INT_MAX, default_value = 0, flags = CONSTRUCT_ONLY, link, export); property UINT ncols (nick = "ncols", blurb = "Number of cols in the dataset", minimum = 0, maximum = INT_MAX, default_value = 0, flags = CONSTRUCT_ONLY, link, export); signal private NONE (INT, INT, POINTER) void rows_in_plot_changed(self, int arg1, int arg2, ggobid* arg3); signal public NONE (INT) void col_name_changed(self, int j); init (self) { sphere_init(self); self_set_name(self, "unknown", NULL); self->nearest_point = -1; self->missings_show_p = true; } override (G:Object) GObject* constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) { GGobiData* d = (GGobiData*) PARENT_HANDLER(type, n_construct_properties, construct_properties); /* we can put these here OR we can put them in the setter for the 'ncols' property, since we know that comes last (after 'nrows' has been set) */ d->nrows_in_plot = d->nrows; /*-- for now --*/ arrayf_alloc (&d->raw, d->nrows, d->ncols); //FIXME: probably leaks memory //arrays_alloc (&d->missing, d->nrows, d->ncols); arrays_alloc_zero (&d->missing, d->nrows, d->ncols); rowlabels_alloc (d); vartable_alloc (d); vartable_init (d); br_glyph_ids_alloc (d); br_glyph_ids_init (d); br_color_ids_alloc (d); br_color_ids_init (d); br_hidden_alloc (d); br_hidden_init (d); return((GObject *)d); } public GGobiData* new(guint nrows, guint ncols) { GGobiData* d = (GGobiData*) g_object_new(GGOBI_TYPE_DATA, "ncols", ncols, "nrows", nrows, NULL); return(d); } /* General comments: 1) the (broken) datad_free function may not be necessary, since we can specify finalizers for all the fields using GOB 2) the (evil) datad_init function must be vanquished asap */ public gchar * get_name (self) { return (g_strdup(self->name)); } public void set_name (self, gchar *name, gchar *nickname) { if (name == NULL) name = g_strdup("unknown"); if (nickname == NULL) nickname = g_strndup(name, 5); self->name = g_strdup(name); self->nickname = g_strndup(name, 5); } public guint get_n_cols(self) { return self->ncols; } public guint get_n_rows(self) { return self->nrows; } public gchar* get_col_name(self, guint j) { vartabled* vt = vartable_element_get (j, self); return(vt->collab); } public void set_col_name(self, guint j, gchar* value) { vartabled* vt = vartable_element_get (j, self); //if (vt->collab) g_object_unref(vt->collab); //if (vt->nickname) g_object_unref(vt->nickname); //if (vt->collab_tform) g_object_unref(vt->collab_tform); if (value == NULL) value = g_strdup_printf("V%d", j + 1); vt->collab = g_strdup(value); vt->collab_tform = g_strdup(value); vt->nickname = g_strndup (vt->collab, 2); g_signal_emit_by_name (self, "col_name_changed", (gpointer) self, j); // SEND COLUMN NAME CHANGED SIGNAL // Listeners: // * vartable_collab_set_by_var (j, d); // * varpanel_label_set (j, d); /*-- checkboxes --*/ // * varcircle_label_set (j, d); /*-- variable circles --*/ // * tform_label_update (jvar, d); } // FIXME: to be removed once pipeline in place public gchar* get_transformed_col_name(self, guint j) { vartabled* vt = vartable_element_get (j, self); return(vt->collab_tform); } public void set_transformed_col_name(self, guint j, gchar* value) { vartabled* vt = vartable_element_get (j, self); //if (vt->collab_tform) g_object_unref(vt->collab_tform); //is this necessary? vt->collab_tform = g_strdup(value); } /** * set_missing: * * Set specified cell to be a missing value */ public void set_missing (self, guint i, guint j) { self->missing.vals[i][j] = 1; self->raw.vals[i][j] = 0; self->missings = TRUE; } public gboolean is_missing (self, guint i, guint j) { return self->missings && (self->missing.vals[i][j] == 1); } public gboolean has_missings(self) { return self->missings; } public guint get_col_n_missing(self, guint j) { guint i, n = 0; for(i = 0; i < self->nrows; i++) { if (self_is_missing(self, i, j)) n++; } return(n); } public void set_raw_values(self, guint j, gdouble *values) { gint i; for (i = 0; i < self->nrows; i++) { self_set_raw_value(self, i, j, values[i]); } } public void set_raw_value(self, guint i, guint j, gdouble value) { if(GGobiMissingValue && GGobiMissingValue(value)) self_set_missing(self, i, j); else self->raw.vals[i][j] = value; } /* public void set_catgorical_value(self, guint i, guint j, gchar* value) { vartabled *vt = vartable_element_get(j, self); guint i, level = -1; g_assert(vt->vartype == categorical); for(i = 0; i < vt->nlevels; i++) { if (g_ascii_strcasecmp(value, vt->level_names[i])) { level = i; break; } } //not found, must be new variable if (level == -1) { level = vt->nlevels++; vt->level_values[level] == level; } vt->level_counts[level]++; self_set_raw_value(self, i, j, vt->level_values[level]); } public void set_string_value(self, guint i, guint j, gchar* value) { if (FALSE) {//FIXME: should be is_numeric self_set_raw_value(self, i, j, (gfloat) g_strtod (value, NULL)); } else { if (value[0] == '\0' || !g_ascii_strcasecmp (value, "na") || !strcmp (value, ".")) self_set_missing(self, i, j); else self_set_categorical_value(self, i, j, value); } } */ public gchar* get_string_value(self, guint i, guint j, gboolean transformed) { gint n = 0, lval = -1; vartabled *vt = vartable_element_get(j, self); gdouble raw = transformed ? self->tform.vals[i][j] : self->raw.vals[i][j]; if (self_is_missing(self, i, j)) return g_strdup("NA"); if (vt->vartype != categorical) return g_strdup_printf("%g", raw); for (n = 0; n < vt->nlevels; n++) { if (vt->level_values[n] == raw) { lval = n; break; } } if (lval == -1) { g_printerr ("The levels for %s aren't specified correctly\n", vt->collab); return(NULL); } return vt->level_names[lval]; } public gboolean has_edges (self) { return (self->edge.n > 0); } public gboolean has_variables (self) { return (self->ncols > 0); } } %h{ void freeLevelHashEntry(gpointer key, gpointer value, gpointer data); /*-- used as an attribute of variable notebooks --*/ typedef enum {no_edgesets, edgesets_only, all_datatypes} datatyped; extern endpointsd *resolveEdgePoints(GGobiData *e, GGobiData *d); void unresolveAllEdgePoints(GGobiData *e); void datad_record_ids_set(GGobiData *d, gchar **ids, gboolean duplicate); void ggobi_data_set_row_labels(GGobiData *d, gchar **labels); %} %{ void datad_free (GGobiData *d, ggobid *gg) { arrayf_free (&d->raw, 0, 0); pipeline_arrays_free (d, gg); arrays_free (&d->missing, 0, 0); /* rowIds and idTable are intrinsically linked !*/ if(d->idTable) { g_hash_table_foreach(d->idTable, freeLevelHashEntry, d->idTable); g_hash_table_destroy(d->idTable); } if(d->rowIds) g_free(d->rowIds); g_free (d); } displayd * datad_init (GGobiData *d, ggobid *gg, gboolean cleanup) { /* GGobi assumes datasets have at least one row */ g_return_val_if_fail(d->nrows > 0, NULL); d->gg = gg; gg->d = g_slist_append (gg->d, d); displayd *display = NULL; if (cleanup) { varpanel_clear (d, gg); } varpanel_populate (d, gg); /*-- toggles */ /*-- circles: build but don't show --*/ varcircles_populate (d, gg); pipeline_init (d, gg); clusters_set (d, gg); /*-- find the clusters for data just read in --*/ if (cleanup || g_list_length(gg->displays) == 0) { display_free_all (gg); /*-- destroy any existing displays --*/ gg->pmode = NULL_PMODE; /*-- initialize the first display --*/ if(sessionOptions->info->createInitialScatterPlot && d->ncols > 0) { /*XXX allow this to be specified as a gtk type name on the command line, initialization file, etc. and invoke the corresponding create() method. */ display = scatterplot_new (true, false, NULL, d, gg); /* Need to make certain this is the only one there. */ if (display != NULL) { gg->displays = g_list_append (gg->displays, (gpointer) display); gg->current_splot = (splotd *) g_list_nth_data (display->splots, 0); display->current_splot = gg->current_splot; display_set_current (display, gg); /*-- turn on event handling in the very first plot --*/ /*-- ... but will it cause trouble for later plots? ok so far --*/ /* Is imode set yet? I hope so. */ sp_event_handlers_toggle (gg->current_splot, on, gg->pmode, gg->imode); } } } if (gg->current_display != NULL) varpanel_refresh (gg->current_display, gg); if (g_slist_index(gg->d, (gpointer)d) == 0) varpanel_set_sensitive (d, true, gg); g_signal_emit (G_OBJECT (gg), GGobiSignals[DATAD_ADDED_SIGNAL], 0, d); display_menu_build (gg); return (display); } /*------------------------------------------------------------------------*/ /* row labels */ /*------------------------------------------------------------------------*/ /* This initializes rowIds to row numbers if ids are not provided */ void datad_record_ids_set(GGobiData *d, gchar **ids, gboolean duplicate) { gint i; guint *index; gchar *tmp; d->idTable = g_hash_table_new(g_str_hash, g_str_equal); d->rowIds = (gchar **) g_malloc(sizeof(gchar *) * d->nrows); for(i = 0; i < d->nrows; i++) { if(ids) tmp = duplicate ? g_strdup(ids[i]) : ids[i]; else { char buf[10]; sprintf(buf, "%d", i+1); tmp = g_strdup(buf); } index = (guint *) g_malloc(sizeof(guint)); *index = i; g_hash_table_insert(d->idTable, tmp, index); d->rowIds[i] = tmp; /* do not free anything here */ } } /* Add a record id */ void datad_record_id_add (gchar *id, GGobiData *d) { gint i; guint *index; d->rowIds = (gchar **) g_realloc (d->rowIds, sizeof(gchar *) * d->nrows); i = d->nrows - 1; index = (guint *) g_malloc(sizeof(guint)); *index = i; g_hash_table_insert (d->idTable, id, index); d->rowIds[i] = id; /* * I don't really understand why I can't free this * when it's freed in datad_record_ids_set, but purify is * quite clear on this point. -- dfs */ /*g_free (index);*/ } /* FIXME: this only works the first time */ void ggobi_data_set_row_labels(GGobiData *d, gchar **labels) { gint i; for (i = 0; i < d->nrows; i++) { gchar *label; if (labels && labels[i]) label = g_strdup(labels[i]); else label = g_strdup_printf("%d", i); g_array_append_val(d->rowlab, label); } } void rowlabels_free (GGobiData *d) { g_array_free (d->rowlab, true); } void rowlabels_alloc (GGobiData *d) { if (d->rowlab != NULL) rowlabels_free (d); d->rowlab = g_array_sized_new (false, false, sizeof (gchar *), d->nrows); } void rowlabel_add (gchar *label, GGobiData *d) { g_array_append_val (d->rowlab, label); g_assert (d->rowlab->len == d->nrows); } %} ggobi-2.1.12/src/transform_ui.c0000644000175000017500000004132714651527764012040 /* transform_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include "vars.h" #include "externs.h" static void tf0_combo_box_set_value(vartabled *vt, gboolean, ggobid *gg); static void tf1_combo_box_set_value(vartabled *vt, gboolean, ggobid *gg); static void tf2_combo_box_set_value(vartabled *vt, gboolean, ggobid *gg); /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget *w, ggobid *gg) { gtk_widget_hide (gg->tform_ui.window); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget *w, GdkEvent *event, ggobid *gg) { gtk_widget_hide (gg->tform_ui.window); } static gchar *stage0_lbl[] = {"No transformation", "Raise minimum to 0", "Raise minimum to 1", "Negative"}; static void stage0_cb (GtkWidget *w, ggobid *gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX(w)); GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT(gg->tform_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); gint *vars;// = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; vars = get_selections_from_tree_view (tree_view, &nvars); if (nvars) { transform (0, indx, -99., vars, nvars, d, gg); g_free (vars); } } static gchar *stage1_lbl[] = {"No transformation", "Box-Cox", "Log base 10", "Inverse", "Absolute value", "Scale to [a,b]", }; static void stage1_cb (GtkWidget *w, ggobid *gg) { gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX(w)); GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT(gg->tform_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); gint *vars;// = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; vars = get_selections_from_tree_view (tree_view, &nvars); if (nvars) { transform (1, indx, gg->tform_ui.boxcox_adj->value, vars, nvars, d, gg); g_free (vars); } } /* * Set the spin widget's adjustment->step_increment to adj->value */ void boxcox_cb (GtkAdjustment *adj, ggobid *gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT(gg->tform_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; vars = get_selections_from_tree_view (tree_view, &nvars); if (nvars) { transform (1, BOXCOX, adj->value, vars, nvars, d, gg); g_free (vars); } } gfloat scale_get_a (ggobid *gg) { gchar *val_str; gfloat val = 0; /*-- default value --*/ GtkWidget *entry_a; entry_a = widget_find_by_name (gg->tform_ui.window, "TFORM:entry_a"); if (entry_a) { val_str = gtk_editable_get_chars (GTK_EDITABLE (entry_a), 0, -1); if (val_str != NULL && strlen (val_str) > 0) { val = (gfloat) atof (val_str); g_free (val_str); } } else { g_printerr ("Failed to locate the entry widget\n"); } return val; } gfloat scale_get_b (ggobid *gg) { gchar *val_str; gfloat val = 1; /*-- default value --*/ GtkWidget *entry_b; entry_b = widget_find_by_name (gg->tform_ui.window, "TFORM:entry_b"); if (entry_b) { val_str = gtk_editable_get_chars (GTK_EDITABLE (entry_b), 0, -1); if (val_str != NULL && strlen (val_str) > 0) { val = (gfloat) atof (val_str); g_free (val_str); } } else { g_printerr ("Failed to locate the entry widget\n"); } return val; } static gchar *stage2_lbl[] = {"No transformation", "Standardize", "Sort", "Rank", "Normal score", "Z-score", "Discretize: 2 levels" }; static void stage2_cb (GtkWidget *w, ggobid *gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT(gg->tform_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); gint *vars;// = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; gint indx = gtk_combo_box_get_active (GTK_COMBO_BOX(w)); vars = get_selections_from_tree_view (tree_view, &nvars); if (nvars) { transform (2, indx, -99, vars, nvars, d, gg); g_free (vars); } } static void tform_reset_cb (GtkWidget *w, ggobid *gg) { gint j; GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT(gg->tform_ui.window)); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); for (j=0; jncols; j++) { transform0_values_set (NO_TFORM0, j, d, gg); transform1_values_set (NO_TFORM1, 1.0, j, d, gg); transform2_values_set (NO_TFORM2, j, d, gg); transform1_apply (j, d, gg); transform2_apply (j, d, gg); tform_label_update (j, d); } limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } void tfvar_selection_made_cb (GtkTreeSelection *tree_sel, ggobid *gg) { GtkTreeView *tree_view = gtk_tree_selection_get_tree_view(tree_sel); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); gint j, nvars, *rows; /* Parameters of transformation */ vartabled *vt0, *vtnew; if (!d) return; rows = get_selections_from_tree_view(GTK_WIDGET(tree_view), &nvars); if (nvars <= 0) return; vtnew = (vartabled *) g_malloc(sizeof(vartabled)); vt0 = vartable_element_get (rows[0], d); vt_copy (vt0, vtnew); /* If there's only one selected variable, we're ready to reset the * variable selection panel. If there are more, we have to find out * if all the selected variables share the same transformation. */ if (nvars > 1) { gboolean same = true; for (j=1; jd == NULL || g_slist_length (gg->d) == 0) return; if (gg->tform_ui.window == NULL) { gg->tform_ui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->tform_ui.window), "Transform Variables"); gtk_container_set_border_width (GTK_CONTAINER (gg->tform_ui.window), 10); g_signal_connect (G_OBJECT (gg->tform_ui.window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) gg); /* * Transformations */ vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (gg->tform_ui.window), vbox); /* Create a notebook, set the position of the tabs */ notebook = create_variable_notebook (vbox, GTK_SELECTION_MULTIPLE, all_vartypes, all_datatypes, G_CALLBACK(tfvar_selection_made_cb), NULL, gg); /* * Stage 0: Domain adjustment */ frame = gtk_frame_new ("Stage 0"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbox), frame, false, false, 1); stage0_option_menu = gtk_combo_box_new_text (); gtk_widget_set_name (stage0_option_menu, "TFORM:stage0_options"); //gtk_container_set_border_width (GTK_CONTAINER (stage0_option_menu), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), stage0_option_menu, "Stage 0: Adjust the domain of the variables", NULL); populate_combo_box (stage0_option_menu, stage0_lbl, G_N_ELEMENTS(stage0_lbl), G_CALLBACK(stage0_cb), gg); gtk_container_add (GTK_CONTAINER (frame), stage0_option_menu); /* * Stage 1: Power transformations et al */ frame = gtk_frame_new ("Stage 1"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbox), frame, false, false, 1); vb = gtk_vbox_new (false, 5); gtk_container_set_border_width (GTK_CONTAINER (vb), 5); gtk_container_add (GTK_CONTAINER (frame), vb); stage1_option_menu = gtk_combo_box_new_text (); gtk_widget_set_name (stage1_option_menu, "TFORM:stage1_options"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), stage1_option_menu, "Stage 1: Data-independent transformations, preserving user-defined limits", NULL); populate_combo_box (stage1_option_menu, stage1_lbl, G_N_ELEMENTS(stage1_lbl), G_CALLBACK(stage1_cb), gg); gtk_box_pack_start (GTK_BOX (vb), stage1_option_menu, true, false, 1); /*-- label and spin button for Box-Cox parameter --*/ hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 2); lbl = gtk_label_new_with_mnemonic ("Box-Cox _param:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); gg->tform_ui.boxcox_adj = (GtkAdjustment *) gtk_adjustment_new (1.0, -4, 5, 0.05, .5, 0.0); spinner = gtk_spin_button_new (gg->tform_ui.boxcox_adj, 0, 3); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), spinner); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), spinner, "Set the Box-Cox power function parameter", NULL); gtk_box_pack_end (GTK_BOX (hb), spinner, true, true, 0); g_signal_connect (G_OBJECT (gg->tform_ui.boxcox_adj), "value_changed", G_CALLBACK (boxcox_cb), (gpointer) gg); /*-- labels and entries for scaling limits --*/ /*style = gtk_widget_get_style (spinner); gdk_text_extents ( gtk_style_get_font (style), "999999999", strlen ("999999999"), &lbearing, &rbearing, &width, &ascent, &descent);*/ hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 2); lbl = gtk_label_new_with_mnemonic ("_a:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); entry_a = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry_a); gtk_widget_set_name (entry_a, "TFORM:entry_a"); gtk_entry_set_text (GTK_ENTRY (entry_a), "0"); gtk_entry_set_width_chars(GTK_ENTRY(entry_a), 9); //gtk_widget_set_usize (entry_a, width, -1); gtk_box_pack_start (GTK_BOX (hb), entry_a, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_b:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), lbl, false, false, 0); entry_b = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), entry_b); gtk_widget_set_name (entry_b, "TFORM:entry_b"); gtk_entry_set_text (GTK_ENTRY (entry_b), "1"); gtk_entry_set_width_chars(GTK_ENTRY(entry_b), 9); //gtk_widget_set_usize (entry_b, width, -1); gtk_box_pack_start (GTK_BOX (hb), entry_b, false, false, 0); /* * Stage 2: Another standardization step */ frame = gtk_frame_new ("Stage 2"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbox), frame, false, false, 1); stage2_option_menu = gtk_combo_box_new_text (); gtk_widget_set_name (stage2_option_menu, "TFORM:stage2_options"); //gtk_container_set_border_width (GTK_CONTAINER (stage2_option_menu), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), stage2_option_menu, "Stage 2: Data-dependent transformations, ignoring user-defined limits", NULL); populate_combo_box (stage2_option_menu, stage2_lbl, G_N_ELEMENTS(stage2_lbl), G_CALLBACK(stage2_cb), gg); gtk_container_add (GTK_CONTAINER (frame), stage2_option_menu); /* * A button or two */ btn = gtk_button_new_with_mnemonic ("_Reset all"); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 0); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Set all transformation stages to 'no transformation' for the selected variables", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tform_reset_cb), gg); /*-- add a close button --*/ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new(), false, true, 2); hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 1); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Close the window", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); g_object_set_data(G_OBJECT (gg->tform_ui.window), "notebook", notebook); } gtk_widget_show_all (gg->tform_ui.window); gdk_window_raise (gg->tform_ui.window->window); } /* * These routines are used to set the values of the option menus. * They're used when the transformations are set from somewhere * other than those option menus, such as the reset button. */ /*----------------------------------------------------------------*/ static void tf0_combo_box_set_value (vartabled *vt, gboolean force, ggobid *gg) { GtkWidget *cbox; GCallback func = G_CALLBACK(stage0_cb); gint n; cbox = widget_find_by_name (gg->tform_ui.window, "TFORM:stage0_options"); if (cbox != NULL) { if (!force) { // remove callback: responding to variable selection n = g_signal_handlers_block_by_func(G_OBJECT(cbox), func, gg); } // Set the combo box selection gtk_combo_box_set_active (GTK_COMBO_BOX (cbox), vt->tform0); if (!force) { // restore callback n = g_signal_handlers_unblock_by_func(G_OBJECT(cbox), func, gg); } } } void transform0_combo_box_set_value (gint j, gboolean force, GGobiData *d, ggobid *gg) { vartabled *vt = vartable_element_get (j, d); if (vt != NULL) tf0_combo_box_set_value(vt, force, gg); } /*-------------------------------------------------------------------*/ static void tf1_combo_box_set_value(vartabled *vt, gboolean force, ggobid *gg) { gint n = 0; GtkWidget *cbox; GCallback func = G_CALLBACK(stage1_cb); cbox = widget_find_by_name (gg->tform_ui.window, "TFORM:stage1_options"); if (cbox) { if (!force) { // remove callback: responding to variable selection n = g_signal_handlers_block_by_func(G_OBJECT(cbox), func, gg); } // Set the combo box selection gtk_combo_box_set_active (GTK_COMBO_BOX (cbox), vt->tform1); if (!force) { // restore callback n = g_signal_handlers_unblock_by_func(G_OBJECT(cbox), func, gg); } } } void transform1_combo_box_set_value (gint j, gboolean force, GGobiData *d, ggobid *gg) { vartabled *vt = vartable_element_get (j, d); if (vt != NULL) tf1_combo_box_set_value(vt, force, gg); } /*-------------------------------------------------------------------*/ static void tf2_combo_box_set_value(vartabled *vt, gboolean force, ggobid *gg) { gint n; GtkWidget *cbox; cbox = widget_find_by_name (gg->tform_ui.window, "TFORM:stage2_options"); GCallback func = G_CALLBACK(stage2_cb); if (cbox != NULL) if (!force) { // remove callback: responding to variable selection n = g_signal_handlers_block_by_func(G_OBJECT(cbox), func, gg); } // Set the combo box selection gtk_combo_box_set_active (GTK_COMBO_BOX (cbox), vt->tform2); if (!force) { // restore callback n = g_signal_handlers_unblock_by_func(G_OBJECT(cbox), func, gg); } } void transform2_combo_box_set_value (gint j, gboolean force, GGobiData *d, ggobid *gg) { vartabled *vt = vartable_element_get (j, d); if (vt != NULL) tf2_combo_box_set_value(vt, force, gg); } ggobi-2.1.12/src/array.c0000644000175000017500000005413314651527764010445 /*-- array.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" /*-------------------------------------------------------------------------*/ /* double array management */ /*-------------------------------------------------------------------------*/ void arrayd_init_null (array_d * arrp) { arrp->nrows = arrp->ncols = 0; arrp->vals = (gdouble **) NULL; } void arrayd_free (array_d * arrp, gint nr, gint nc) { gint i; /*-- if nr != 0, free only the last nrows-nr rows --*/ for (i = nr; i < arrp->nrows; i++) if (arrp->vals[i] != NULL) g_free (arrp->vals[i]); if (nr == 0) { if (arrp->vals != NULL) g_free (arrp->vals); arrp->vals = (gdouble **) NULL; arrp->nrows = arrp->ncols = 0; } else { arrp->nrows = nr; arrp->ncols = nc; } } /* Zero an array of doubles. */ void arrayd_zero (array_d * arrp) { int i, j; for (i = 0; i < arrp->nrows; i++) { for (j = 0; j < arrp->ncols; j++) { arrp->vals[i][j] = 0.0; } } } /* allocate an array of doubles */ void arrayd_alloc (array_d * arrp, gint nr, gint nc) { gint i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrayd_free (arrp, 0, 0); arrp->vals = (gdouble **) g_malloc (nr * sizeof (gdouble *)); for (i = 0; i < nr; i++) arrp->vals[i] = (gdouble *) g_malloc (nc * sizeof (gdouble)); arrp->nrows = nr; arrp->ncols = nc; } /* allocate an array of doubles populated with 0 */ void arrayd_alloc_zero (array_d * arrp, gint nr, gint nc) { gint i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) { arrayd_free (arrp, 0, 0); } arrp->vals = (gdouble **) g_malloc (nr * sizeof (gdouble *)); for (i = 0; i < nr; i++) arrp->vals[i] = (gdouble *) g_malloc0 (nc * sizeof (gdouble)); arrp->nrows = nr; arrp->ncols = nc; } /* increase the number of rows in an array of doubles */ void arrayd_add_rows (array_d * arrp, gint nr) { gint i; if (nr > arrp->nrows) { arrp->vals = (gdouble **) g_realloc (arrp->vals, nr * sizeof (gdouble *)); for (i = arrp->nrows; i < nr; i++) arrp->vals[i] = (gdouble *) g_malloc0 (arrp->ncols * sizeof (gdouble)); arrp->nrows = nr; } } /* append columns to a floating point array for a total of nc columns */ void arrayd_add_cols (array_d * arrp, gint nc) { gint i, j; if (nc > arrp->ncols) { for (i = 0; i < arrp->nrows; i++) { arrp->vals[i] = (gdouble *) g_realloc (arrp->vals[i], nc * sizeof (gdouble)); /*-- initialize the new values to 0 --*/ for (j = arrp->ncols; j < nc; j++) arrp->vals[i][j] = 0; } arrp->ncols = nc; } } /*-- eliminate the nc columns contained in *cols --*/ void arrayd_delete_cols (array_d * arrp, gint nc, gint * cols) { gint i, k; gint jto, jfrom; gint *keepers = g_malloc ((arrp->ncols - nc) * sizeof (gint)); gint nkeepers = find_keepers (arrp->ncols, nc, cols, keepers); if (nc > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { jto = k; jfrom = keepers[k]; /*-- jto has to be less than jfrom --*/ if (jto != jfrom) { for (i = 0; i < arrp->nrows; i++) arrp->vals[i][jto] = arrp->vals[i][jfrom]; } } for (i = 0; i < arrp->nrows; i++) arrp->vals[i] = (gdouble *) g_realloc (arrp->vals[i], nkeepers * sizeof (gdouble)); arrp->ncols = nkeepers; } g_free (keepers); } /*-- eliminate the nr rows contained in *rows --*/ void arrayd_delete_rows (array_d * arrp, gint nr, gint * rows) { gint i, j, k; gint ito, ifrom; gint *keepers = g_malloc ((arrp->nrows - nr) * sizeof (gint)); gint nkeepers = find_keepers (arrp->nrows, nr, rows, keepers); if (nr > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { ito = k; ifrom = keepers[k]; /*-- ito has to be less than ifrom for copying --*/ if (ito != ifrom) { for (j = 0; j < arrp->ncols; j++) arrp->vals[ito][j] = arrp->vals[ifrom][j]; } } for (i = nkeepers; i < arrp->nrows; i++) g_free (arrp->vals[i]); arrp->vals = (gdouble **) g_realloc (arrp->vals, nkeepers * sizeof (gdouble *)); } g_free (keepers); } void arrayd_copy (array_d * arrp_from, array_d * arrp_to) { gint i, j; if (arrp_from->ncols == arrp_to->ncols && arrp_from->nrows == arrp_to->nrows) { for (i = 0; i < arrp_from->nrows; i++) for (j = 0; j < arrp_from->ncols; j++) arrp_to->vals[i][j] = arrp_from->vals[i][j]; } } /*-------------------------------------------------------------------------*/ /* floating point array management */ /*-------------------------------------------------------------------------*/ void arrayf_init_null (array_f * arrp) { arrp->nrows = arrp->ncols = 0; arrp->vals = (gfloat **) NULL; } void arrayf_free (array_f * arrp, gint nr, gint nc) { gint i; /*-- if nr != 0, free only the last nrows-nr rows --*/ for (i = nr; i < arrp->nrows; i++) if (arrp->vals[i] != NULL) g_free (arrp->vals[i]); if (nr == 0) { if (arrp->vals != NULL) g_free (arrp->vals); arrp->vals = (gfloat **) NULL; arrp->nrows = arrp->ncols = 0; } else { arrp->nrows = nr; arrp->ncols = nc; } } /* Zero a floating point array. */ void arrayf_zero (array_f * arrp) { int i, j; for (i = 0; i < arrp->nrows; i++) { for (j = 0; j < arrp->ncols; j++) { arrp->vals[i][j] = 0.0; } } } /* allocate a floating point array */ void arrayf_alloc (array_f * arrp, gint nr, gint nc) { gint i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrayf_free (arrp, 0, 0); arrp->vals = (gfloat **) g_malloc (nr * sizeof (gfloat *)); for (i = 0; i < nr; i++) arrp->vals[i] = (gfloat *) g_malloc (nc * sizeof (gfloat)); arrp->nrows = nr; arrp->ncols = nc; } /* allocate a floating point array populated with 0 */ void arrayf_alloc_zero (array_f * arrp, gint nr, gint nc) { gint i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) { arrayf_free (arrp, 0, 0); } arrp->vals = (gfloat **) g_malloc (nr * sizeof (gfloat *)); for (i = 0; i < nr; i++) arrp->vals[i] = (gfloat *) g_malloc0 (nc * sizeof (gfloat)); arrp->nrows = nr; arrp->ncols = nc; } /* increase the number of rows in a floating point array */ void arrayf_add_rows (array_f * arrp, gint nr) { gint i; if (nr > arrp->nrows) { arrp->vals = (gfloat **) g_realloc (arrp->vals, nr * sizeof (gfloat *)); for (i = arrp->nrows; i < nr; i++) arrp->vals[i] = (gfloat *) g_malloc0 (arrp->ncols * sizeof (gfloat)); arrp->nrows = nr; } } /* append columns to a floating point array for a total of nc columns */ void arrayf_add_cols (array_f * arrp, gint nc) { gint i, j; if (nc > arrp->ncols) { for (i = 0; i < arrp->nrows; i++) { arrp->vals[i] = (gfloat *) g_realloc (arrp->vals[i], nc * sizeof (gfloat)); /*-- initialize the new values to 0 --*/ for (j = arrp->ncols; j < nc; j++) arrp->vals[i][j] = 0; } arrp->ncols = nc; } } /*-- eliminate the nc columns contained in *cols --*/ void arrayf_delete_cols (array_f * arrp, gint nc, gint * cols) { gint i, k; gint jto, jfrom; gint *keepers = g_malloc ((arrp->ncols - nc) * sizeof (gint)); gint nkeepers = find_keepers (arrp->ncols, nc, cols, keepers); if (nc > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { jto = k; jfrom = keepers[k]; /*-- jto has to be less than jfrom --*/ if (jto != jfrom) { for (i = 0; i < arrp->nrows; i++) arrp->vals[i][jto] = arrp->vals[i][jfrom]; } } for (i = 0; i < arrp->nrows; i++) arrp->vals[i] = (gfloat *) g_realloc (arrp->vals[i], nkeepers * sizeof (gfloat)); arrp->ncols = nkeepers; } g_free (keepers); } /*-- eliminate the nr rows contained in *rows --*/ void arrayf_delete_rows (array_f * arrp, gint nr, gint * rows) { gint i, j, k; gint ito, ifrom; gint *keepers = g_malloc ((arrp->nrows - nr) * sizeof (gint)); gint nkeepers = find_keepers (arrp->nrows, nr, rows, keepers); if (nr > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { ito = k; ifrom = keepers[k]; /*-- ito has to be less than ifrom for copying --*/ if (ito != ifrom) { for (j = 0; j < arrp->ncols; j++) arrp->vals[ito][j] = arrp->vals[ifrom][j]; } } for (i = nkeepers; i < arrp->nrows; i++) g_free (arrp->vals[i]); arrp->vals = (gfloat **) g_realloc (arrp->vals, nkeepers * sizeof (gfloat *)); } g_free (keepers); } void arrayf_copy (array_f * arrp_from, array_f * arrp_to) { gint i, j; if (arrp_from->ncols == arrp_to->ncols && arrp_from->nrows == arrp_to->nrows) { for (i = 0; i < arrp_from->nrows; i++) for (j = 0; j < arrp_from->ncols; j++) arrp_to->vals[i][j] = arrp_from->vals[i][j]; } } /*-------------------------------------------------------------------------*/ /* short integer array management */ /*-------------------------------------------------------------------------*/ void arrays_init_null (array_s * arrp) { arrp->nrows = arrp->ncols = 0; arrp->vals = (gshort **) NULL; } void arrays_free (array_s * arrp, gint nr, gint nc) { gint i; /*-- if nr != 0, free only the last nrows-nr rows --*/ for (i = nr; i < arrp->nrows; i++) if (arrp->vals[i] != NULL) g_free (arrp->vals[i]); if (nr == 0) { if (arrp->vals != NULL) g_free (arrp->vals); arrp->vals = (gshort **) NULL; } arrp->nrows = nr; arrp->ncols = nc; } /* Zero a short array. */ void arrays_zero (array_s * arrp) { int i, j; for (i = 0; i < arrp->nrows; i++) { for (j = 0; j < arrp->ncols; j++) { arrp->vals[i][j] = 0; } } } /* allocate a short integer array */ void arrays_alloc (array_s * arrp, gint nr, gint nc) { int i; /*-- if the dimensions match, then the allocated size is surely ok --*/ if (arrp->nrows != nr || arrp->ncols != nc) { if (arrp->nrows != 0 || arrp->ncols != 0) arrays_free (arrp, 0, 0); arrp->vals = (gshort **) g_malloc (nr * sizeof (gshort *)); for (i = 0; i < nr; i++) arrp->vals[i] = (gshort *) g_malloc (nc * sizeof (gshort)); arrp->nrows = nr; arrp->ncols = nc; } } /* allocate a short integer array populated with 0 */ void arrays_alloc_zero (array_s * arrp, gint nr, gint nc) { int i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrays_free (arrp, 0, 0); arrp->vals = (gshort **) g_malloc (nr * sizeof (gshort *)); for (i = 0; i < nr; i++) arrp->vals[i] = (gshort *) g_malloc0 (nc * sizeof (gshort)); arrp->nrows = nr; arrp->ncols = nc; } /* increase the number of rows in a short integer array */ void arrays_add_rows (array_s * arrp, gint nr) { gint i; if (nr > arrp->nrows) { arrp->vals = (gshort **) g_realloc (arrp->vals, nr * sizeof (gshort *)); for (i = arrp->nrows; i < nr; i++) arrp->vals[i] = (gshort *) g_malloc0 (arrp->ncols * sizeof (gshort)); arrp->nrows = nr; } } /* append columns to a short array for a total of nc columns */ void arrays_add_cols (array_s * arrp, gint nc) { gint i, j; if (nc > arrp->ncols) { for (i = 0; i < arrp->nrows; i++) { arrp->vals[i] = (gshort *) g_realloc (arrp->vals[i], nc * sizeof (gshort)); /*-- initialize the new values to 0 --*/ for (j = arrp->ncols; j < nc; j++) arrp->vals[i][j] = 0; } arrp->ncols = nc; } } /*-- eliminate the nc columns contained in *cols --*/ void arrays_delete_cols (array_s * arrp, gint nc, gint * cols) { gint i, k; gint jto, jfrom; gint *keepers = g_malloc ((arrp->ncols - nc) * sizeof (gint)); gint nkeepers = find_keepers (arrp->ncols, nc, cols, keepers); if (nc > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { jto = k; jfrom = keepers[k]; /*-- jto has to be less than jfrom --*/ if (jto != jfrom) { for (i = 0; i < arrp->nrows; i++) arrp->vals[i][jto] = arrp->vals[i][jfrom]; } } for (i = 0; i < arrp->nrows; i++) arrp->vals[i] = (gshort *) g_realloc (arrp->vals[i], nkeepers * sizeof (gshort)); arrp->ncols = nkeepers; } g_free (keepers); } /*-- eliminate the nr rows contained in *rows --*/ void arrays_delete_rows (array_s * arrp, gint nr, gint * rows) { gint i, j, k; gint ito, ifrom; gint *keepers = g_malloc ((arrp->nrows - nr) * sizeof (gint)); gint nkeepers = find_keepers (arrp->nrows, nr, rows, keepers); if (nr > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { ito = k; ifrom = keepers[k]; /*-- ito has to be less than ifrom for copying --*/ if (ito != ifrom) { for (j = 0; j < arrp->ncols; j++) arrp->vals[ito][j] = arrp->vals[ifrom][j]; } } for (i = nkeepers; i < arrp->nrows; i++) g_free (arrp->vals[i]); arrp->vals = (gshort **) g_realloc (arrp->vals, nkeepers * sizeof (gshort *)); } g_free (keepers); } /*-------------------------------------------------------------------------*/ /* long array management */ /*-------------------------------------------------------------------------*/ void arrayl_init_null (array_l * arrp) { arrp->nrows = arrp->ncols = 0; arrp->vals = (glong **) NULL; } void arrayl_free (array_l * arrp, gint nr, gint nc) { gint i; /*-- if nr != 0, free only the last nrows-nr rows --*/ for (i = nr; i < arrp->nrows; i++) if (arrp->vals[i] != NULL) g_free (arrp->vals[i]); if (nr == 0) { if (arrp->vals != NULL) g_free (arrp->vals); arrp->vals = (glong **) NULL; } arrp->nrows = nr; arrp->ncols = nc; } /* Zero a long array. */ void arrayl_zero (array_l * arrp) { int i, j; for (i = 0; i < arrp->nrows; i++) { for (j = 0; j < arrp->ncols; j++) { arrp->vals[i][j] = 0; } } } /* allocate a long array */ void arrayl_alloc (array_l * arrp, gint nr, gint nc) { int i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrayl_free (arrp, 0, 0); arrp->vals = (glong **) g_malloc (nr * sizeof (glong *)); for (i = 0; i < nr; i++) arrp->vals[i] = (glong *) g_malloc (nc * sizeof (glong)); arrp->nrows = nr; arrp->ncols = nc; } /* allocate a long array populated with 0 */ void arrayl_alloc_zero (array_l * arrp, gint nr, gint nc) { int i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrayl_free (arrp, 0, 0); arrp->vals = (glong **) g_malloc (nr * sizeof (glong *)); for (i = 0; i < nr; i++) arrp->vals[i] = (glong *) g_malloc0 (nc * sizeof (glong)); arrp->nrows = nr; arrp->ncols = nc; } /* increase the number of rows in a long integer array */ void arrayl_add_rows (array_l * arrp, gint nr) { int i; if (nr > arrp->nrows) { arrp->vals = (glong **) g_realloc (arrp->vals, nr * sizeof (glong *)); for (i = arrp->nrows; i < nr; i++) arrp->vals[i] = (glong *) g_malloc0 (arrp->ncols * sizeof (glong)); arrp->nrows = nr; } } /* append columns to a long array for a total of nc columns */ void arrayl_add_cols (array_l * arrp, gint nc) { gint i, j; if (nc > arrp->ncols) { for (i = 0; i < arrp->nrows; i++) { arrp->vals[i] = (glong *) g_realloc (arrp->vals[i], nc * sizeof (glong)); /*-- initialize the new values to 0 --*/ for (j = arrp->ncols; j < nc; j++) arrp->vals[i][j] = 0; } arrp->ncols = nc; } } /*-- eliminate the nc columns contained in *cols --*/ void arrayl_delete_cols (array_l * arrp, gint nc, gint * cols) { gint i, k; gint jto, jfrom; gint *keepers = g_malloc ((arrp->ncols - nc) * sizeof (gint)); gint nkeepers = find_keepers (arrp->ncols, nc, cols, keepers); if (nc > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { jto = k; jfrom = keepers[k]; /*-- jto has to be less than jfrom --*/ if (jto != jfrom) { for (i = 0; i < arrp->nrows; i++) arrp->vals[i][jto] = arrp->vals[i][jfrom]; } } for (i = 0; i < arrp->nrows; i++) arrp->vals[i] = (glong *) g_realloc (arrp->vals[i], nkeepers * sizeof (glong)); arrp->ncols = nkeepers; } g_free (keepers); } /*-- eliminate the nr rows contained in *rows --*/ void arrayl_delete_rows (array_l * arrp, gint nr, gint * rows) { gint i, j, k; gint ito, ifrom; gint *keepers = g_malloc ((arrp->nrows - nr) * sizeof (gint)); gint nkeepers = find_keepers (arrp->nrows, nr, rows, keepers); if (nr > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { ito = k; ifrom = keepers[k]; /*-- ito has to be less than ifrom for copying --*/ if (ito != ifrom) { for (j = 0; j < arrp->ncols; j++) arrp->vals[ito][j] = arrp->vals[ifrom][j]; } } for (i = nkeepers; i < arrp->nrows; i++) g_free (arrp->vals[i]); arrp->vals = (glong **) g_realloc (arrp->vals, nkeepers * sizeof (glong *)); } g_free (keepers); } /*-------------------------------------------------------------------------*/ /* greal array management */ /*-------------------------------------------------------------------------*/ void arrayg_init_null (array_g * arrp) { arrp->nrows = arrp->ncols = 0; arrp->vals = (greal **) NULL; } void arrayg_free (array_g * arrp, gint nr, gint nc) { gint i; /*-- if nr != 0, free only the last nrows-nr rows --*/ for (i = nr; i < arrp->nrows; i++) if (arrp->vals[i] != NULL) g_free (arrp->vals[i]); if (nr == 0) { if (arrp->vals != NULL) g_free (arrp->vals); arrp->vals = (greal **) NULL; } arrp->nrows = nr; arrp->ncols = nc; } /* Zero a greal array. */ void arrayg_zero (array_g * arrp) { int i, j; for (i = 0; i < arrp->nrows; i++) { for (j = 0; j < arrp->ncols; j++) { arrp->vals[i][j] = 0; } } } /* allocate a greal array */ void arrayg_alloc (array_g * arrp, gint nr, gint nc) { int i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrayg_free (arrp, 0, 0); arrp->vals = (greal **) g_malloc (nr * sizeof (greal *)); for (i = 0; i < nr; i++) arrp->vals[i] = (greal *) g_malloc (nc * sizeof (greal)); arrp->nrows = nr; arrp->ncols = nc; } /* allocate a greal array populated with 0 */ void arrayg_alloc_zero (array_g * arrp, gint nr, gint nc) { int i; if ((arrp->nrows != 0) || (arrp->ncols != 0)) arrayg_free (arrp, 0, 0); arrp->vals = (greal **) g_malloc (nr * sizeof (greal *)); for (i = 0; i < nr; i++) arrp->vals[i] = (greal *) g_malloc0 (nc * sizeof (greal)); arrp->nrows = nr; arrp->ncols = nc; } /* increase the number of rows in a greal integer array */ void arrayg_add_rows (array_g * arrp, gint nr) { int i; if (nr > arrp->nrows) { arrp->vals = (greal **) g_realloc (arrp->vals, nr * sizeof (greal *)); for (i = arrp->nrows; i < nr; i++) arrp->vals[i] = (greal *) g_malloc0 (arrp->ncols * sizeof (greal)); arrp->nrows = nr; } } /* append columns to a greal array for a total of nc columns */ void arrayg_add_cols (array_g * arrp, gint nc) { gint i, j; if (nc > arrp->ncols) { for (i = 0; i < arrp->nrows; i++) { arrp->vals[i] = (greal *) g_realloc (arrp->vals[i], nc * sizeof (greal)); /*-- initialize the new values to 0 --*/ for (j = arrp->ncols; j < nc; j++) arrp->vals[i][j] = 0.0; } arrp->ncols = nc; } } /*-- eliminate the nc columns contained in *cols --*/ void arrayg_delete_cols (array_g * arrp, gint nc, gint * cols) { gint i, k; gint jto, jfrom; gint *keepers = g_malloc ((arrp->ncols - nc) * sizeof (gint)); gint nkeepers = find_keepers (arrp->ncols, nc, cols, keepers); if (nc > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { jto = k; jfrom = keepers[k]; /*-- jto has to be less than jfrom --*/ if (jto != jfrom) { for (i = 0; i < arrp->nrows; i++) arrp->vals[i][jto] = arrp->vals[i][jfrom]; } } for (i = 0; i < arrp->nrows; i++) arrp->vals[i] = (greal *) g_realloc (arrp->vals[i], nkeepers * sizeof (greal)); arrp->ncols = nkeepers; } g_free (keepers); } /*-- eliminate the nr rows contained in *rows --*/ void arrayg_delete_rows (array_g * arrp, gint nr, gint * rows) { gint i, j, k; gint ito, ifrom; gint *keepers = g_malloc ((arrp->nrows - nr) * sizeof (gint)); gint nkeepers = find_keepers (arrp->nrows, nr, rows, keepers); if (nr > 0 && nkeepers > 0) { /*-- copy before reallocating --*/ for (k = 0; k < nkeepers; k++) { ito = k; ifrom = keepers[k]; /*-- ito has to be less than ifrom for copying --*/ if (ito != ifrom) { for (j = 0; j < arrp->ncols; j++) arrp->vals[ito][j] = arrp->vals[ifrom][j]; } } for (i = nkeepers; i < arrp->nrows; i++) g_free (arrp->vals[i]); arrp->vals = (greal **) g_realloc (arrp->vals, nkeepers * sizeof (greal *)); } g_free (keepers); } ggobi-2.1.12/src/vartable_nbook.c0000644000175000017500000005111214651527764012311 /* vartable_nbook.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* interface code for the variable statistics table: notebook only */ #include #include #include #include "vars.h" #include "externs.h" #include "vartable.h" #include /* for strcmp() */ extern GtkWidget * vartable_buttonbox_build (ggobid *gg); static void vartable_subwindow_init (GGobiData *d, ggobid *gg); /*-------------------------------------------------------------------------*/ /* Listen for display_selected events */ /*-------------------------------------------------------------------------*/ /* Update variable selection panel */ void vartable_show_page_cb (ggobid *gg, displayd *display) { vartable_show_page(display->d, gg); } /*-------------------------------------------------------------------------*/ static void close_wmgr_cb (GtkWidget *cl, GdkEventButton *event, ggobid *gg) { gtk_widget_hide (gg->vartable_ui.window); } static void destroyit (ggobid *gg) { gtk_widget_destroy (gg->vartable_ui.window); gg->vartable_ui.window = NULL; } static void vartable_notebook_adddata_cb (ggobid *gg, GGobiData *d, void *notebook) { vartable_subwindow_init (d, gg); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (GTK_WIDGET(notebook)), g_slist_length (gg->d) > 1); } CHECK_EVENT_SIGNATURE(vartable_notebook_adddata_cb, datad_added_f) vartyped tree_view_get_type (GGobiData *d, GtkWidget *tree_view) { vartyped vtype = all_vartypes; if (d->vartable_tree_view[real] != NULL) { if (tree_view == d->vartable_tree_view[real]) vtype = real; } else if (d->vartable_tree_view[categorical] != NULL) { if (tree_view == d->vartable_tree_view[categorical]) vtype = categorical; } else if (d->vartable_tree_view[integer] != NULL) { if (tree_view == d->vartable_tree_view[integer]) vtype = integer; } else if (d->vartable_tree_view[counter] != NULL) { if (tree_view == d->vartable_tree_view[counter]) vtype = counter; } else if (d->vartable_tree_view[uniform] != NULL) { if (tree_view == d->vartable_tree_view[uniform]) vtype = uniform; } return vtype; } /* * Clear all selected rows from notebook pages when they're * de-selected. This callback applies to swapping pages for * variable types within a datad. */ void vartable_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, ggobid *gg) { gint prev_page = gtk_notebook_get_current_page (notebook); GtkWidget *swin, *tree_view; GList *children; if (prev_page > -1) { GtkTreeSelection *tree_sel; swin = gtk_notebook_get_nth_page (notebook, prev_page); children = gtk_container_get_children (GTK_CONTAINER (swin)); tree_view = g_list_nth_data (children, 0); tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); gtk_tree_selection_unselect_all(tree_sel); } // Figure out the page type from page_num -- doesn't do anything // yet. dfs if (page_num > -1) { vartyped vtype; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); swin = gtk_notebook_get_nth_page (notebook, page_num); children = gtk_container_get_children (GTK_CONTAINER (swin)); tree_view = g_list_nth_data (children, 0); vtype = tree_view_get_type(d, tree_view); //vartable_buttons_update(vtype, gg); // g_printerr ("vtype %d\n", vtype); } } GtkTreeModel * vartable_tree_model_get (GGobiData *d) { return(d->vartable_tree_model); } GtkWidget * vartable_tree_view_get (ggobid *gg) { GtkNotebook *nb, *subnb; gint indx, subindx; GtkWidget *swin; GList *children; /* * Each page of vartable_ui.notebook has one child, which is * another notebook. * That notebook has two children, two scrolled windows, and * each scrolled window has one child, a tree_view */ /* vartable_ui.notebook page 0: datad 0 nbook page 0: swin -> real page 1: swin -> categorical page n: datad n nbook page 0: swin -> real page 1: swin -> categorical */ nb = GTK_NOTEBOOK (gg->vartable_ui.notebook); indx = gtk_notebook_get_current_page (nb); /*-- get the current page of the vartable notebook --*/ subnb = (GtkNotebook *) gtk_notebook_get_nth_page (nb, indx); subindx = gtk_notebook_get_current_page (subnb); /*-- get the current page of the variable type notebook --*/ swin = gtk_notebook_get_nth_page (subnb, subindx); children = gtk_container_get_children (GTK_CONTAINER (swin)); return ((GtkWidget *) g_list_nth_data (children, 0)); /* swin = gtk_notebook_get_nth_page (nb, indx); GList *swin_children = gtk_container_get_children (GTK_CONTAINER (swin)); */ } void vartable_show_page (GGobiData *d, ggobid *gg) { GtkNotebook *nb; gint page, page_new; GList *l, *children; GtkWidget *child, *tab_label; if (gg == NULL || gg->vartable_ui.notebook == NULL) return; nb = GTK_NOTEBOOK (gg->vartable_ui.notebook); page = gtk_notebook_get_current_page (nb); if (page < 0) return; page_new = 0; children = gtk_container_get_children (GTK_CONTAINER (gg->vartable_ui.notebook)); for (l = children; l; l = l->next) { child = l->data; tab_label = (GtkWidget *) gtk_notebook_get_tab_label (nb, child); if (tab_label && GTK_IS_LABEL (tab_label)) { if (strcmp (GTK_LABEL (tab_label)->label, d->name) == 0) { if (page != page_new) { gtk_notebook_set_current_page (nb, page_new); break; } } } page_new++; } } gint vartable_varno_from_path(GtkTreeModel *model, GtkTreePath *path) { GtkTreeModel *unsorted_model, *root_model; GtkTreePath *unsorted_path, *root_path; gint varno; unsorted_model = gtk_tree_model_sort_get_model(GTK_TREE_MODEL_SORT(model)); g_object_get(G_OBJECT(unsorted_model), "child-model", &root_model, NULL); unsorted_path = gtk_tree_model_sort_convert_path_to_child_path( GTK_TREE_MODEL_SORT(model), path); root_path = gtk_tree_model_filter_convert_path_to_child_path( GTK_TREE_MODEL_FILTER(unsorted_model), unsorted_path); varno = gtk_tree_path_get_indices(root_path)[0]; gtk_tree_path_free(unsorted_path); gtk_tree_path_free(root_path); return(varno); } gboolean vartable_iter_from_varno(gint var, GGobiData *d, GtkTreeModel **model, GtkTreeIter *iter) { GtkTreeModel *loc_model; GtkTreePath *path; gboolean valid; loc_model = vartable_tree_model_get(d); if (!loc_model) return(FALSE); path = gtk_tree_path_new_from_indices(var, -1); valid = gtk_tree_model_get_iter(loc_model, iter, path); gtk_tree_path_free(path); if (model) *model = loc_model; return(valid); } /* GtkTreeSelection only tells us when the selection has changed, so we have to reset the selected status of the vartable */ void selection_changed_cb (GtkTreeSelection *tree_sel, ggobid *gg) { gint j; GGobiData *d = datad_get_from_notebook (gg->vartable_ui.notebook, gg); vartabled *vt; GList *rows, *l; GtkTreeModel *model; for (j = 0 ; j < d->ncols ; j++) { /* clear selection */ vt = vartable_element_get (j, d); vt->selected = false; } rows = gtk_tree_selection_get_selected_rows(tree_sel, &model); for (l = rows; l; l = l->next) { gint varno; GtkTreePath *path = (GtkTreePath*)l->data; varno = vartable_varno_from_path(model, path); gtk_tree_path_free(path); vt = vartable_element_get (varno, d); vt->selected = true; } g_list_free(rows); } /** 'row' here corresponds to 'variable' (top-level rows) */ void vartable_row_append (gint jvar, GGobiData *d) { gint k; vartabled *vt = vartable_element_get (jvar, d); GtkTreeModel *model = vartable_tree_model_get(d); GtkTreeIter iter; GtkTreeIter child; if (!model) return; gtk_tree_store_append(GTK_TREE_STORE(model), &iter, NULL); for (k=0; knlevels; k++) gtk_tree_store_append(GTK_TREE_STORE(model), &child, &iter); } static gboolean real_filter_func (GtkTreeModel *model, GtkTreeIter *iter, GGobiData *d) { GtkTreePath *path = gtk_tree_model_get_path(model, iter); if (gtk_tree_path_get_depth(path) > 1) return(false); vartabled *vt = vartable_element_get (gtk_tree_path_get_indices(path)[0], d); gtk_tree_path_free(path); return(vt->vartype != categorical); } static gboolean cat_filter_func (GtkTreeModel *model, GtkTreeIter *iter, GGobiData *d) { GtkTreePath *path = gtk_tree_model_get_path(model, iter); if (gtk_tree_path_get_depth(path) > 1) return(true); vartabled *vt = vartable_element_get (gtk_tree_path_get_indices(path)[0], d); gtk_tree_path_free(path); return(vt->vartype == categorical); } static void vartable_subwindow_init (GGobiData *d, ggobid *gg) { gint j; GtkWidget *sw, *wlbl; gchar *lbl; static gchar *titles[] = { "Variable", "Transform", "Min (user)", "Max (user)", "Min (data)", "Max (data)", "Mean", "Median", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "N NAs"}; static gchar *titles_cat[] = { "Variable", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "N Levels", "Level", "Value", "Count", "Min (user)", "Max (user)", "Min (data)", "Max (data)", "N NAs", }; GtkWidget *nbook = gtk_notebook_new (); GtkTreeStore *model; GtkTreeModel *sort_model, *filter_model; g_signal_connect (G_OBJECT (nbook), "switch-page", G_CALLBACK (vartable_switch_page_cb), gg); lbl = ggobi_data_get_name (d); /* * We're showing all datasets for now, whether they have variables * or not. That could change. */ g_object_set_data(G_OBJECT(nbook), "datad", d); /*setdata*/ gtk_notebook_append_page (GTK_NOTEBOOK (gg->vartable_ui.notebook), nbook, gtk_label_new (lbl)); g_free (lbl); /* Pack each tree_view into a scrolled window */ sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_NONE); /* * Page for real, counter and integer variables */ model = gtk_tree_store_new(NCOLS_VT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); d->vartable_tree_model = GTK_TREE_MODEL(model); /*-- populate the tables BEFORE attaching filters --*/ for (j = 0 ; j < d->ncols ; j++) { vartable_row_append(j, d); vartable_cells_set_by_var(j, d); } filter_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(model), NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter_model), (GtkTreeModelFilterVisibleFunc)real_filter_func, d, NULL); sort_model = gtk_tree_model_sort_new_with_model(filter_model); d->vartable_tree_view[real] = gtk_tree_view_new_with_model(sort_model); populate_tree_view(d->vartable_tree_view[real], titles, G_N_ELEMENTS(titles), true, GTK_SELECTION_MULTIPLE, G_CALLBACK(selection_changed_cb), gg); gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(d->vartable_tree_view[real]), true); /*-- right justify all the numerical columns --*/ /*-- set the column width automatically --*/ gtk_container_add (GTK_CONTAINER (sw), d->vartable_tree_view[real]); wlbl = gtk_label_new_with_mnemonic("_Real"); /* This works for showing tooltips in the tabs, but unfortunately it interferes with the normal operation of the widget -- I can't switch pages any more! GtkWidget *ebox; ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (ebox), wlbl); gtk_widget_show(wlbl); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "Table of statistics for real, integer and counter variables", NULL); gtk_notebook_append_page (GTK_NOTEBOOK (nbook), scrolled_window, ebox); */ gtk_notebook_append_page (GTK_NOTEBOOK (nbook), sw, wlbl); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_NONE); /* * Page for categorical variables */ filter_model = gtk_tree_model_filter_new(GTK_TREE_MODEL(model), NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter_model), (GtkTreeModelFilterVisibleFunc)cat_filter_func, d, NULL); sort_model = gtk_tree_model_sort_new_with_model(filter_model); d->vartable_tree_view[categorical] = gtk_tree_view_new_with_model(sort_model); populate_tree_view(d->vartable_tree_view[categorical], titles_cat, G_N_ELEMENTS(titles_cat), true, GTK_SELECTION_MULTIPLE, G_CALLBACK(selection_changed_cb), gg); gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(d->vartable_tree_view[categorical]), true); /*-- right justify all the numerical columns --*/ gtk_container_add (GTK_CONTAINER (sw), d->vartable_tree_view[categorical]); wlbl = gtk_label_new_with_mnemonic("_Categorical"); /* ebox = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (ebox), wlbl); gtk_widget_show(wlbl); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), ebox, "Table of statistics for categorical variables", NULL); gtk_notebook_append_page (GTK_NOTEBOOK (nbook), scrolled_window, ebox); */ gtk_notebook_append_page (GTK_NOTEBOOK (nbook), sw, wlbl); /*-- 3 = COLUMN_INSET --*/ gtk_widget_show_all (nbook); } void vartable_open (ggobid *gg) { GtkWidget *vbox, *hbox; GSList *l; GGobiData *d; /*-- if used before we have data, bail out --*/ if (gg->d == NULL || g_slist_length (gg->d) == 0) return; /*-- if new datad's have been added, the user has to reopen the window --*/ if (gg->vartable_ui.window != NULL) { destroyit (gg); } gg->vartable_ui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(gg->vartable_ui.window), 750, 300); g_signal_connect (G_OBJECT (gg->vartable_ui.window), "delete_event", G_CALLBACK (close_wmgr_cb), gg); gtk_window_set_title (GTK_WINDOW (gg->vartable_ui.window), "Variable Manipulation"); vbox = gtk_vbox_new (false, 5); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_container_add (GTK_CONTAINER (gg->vartable_ui.window), vbox); gtk_widget_show (vbox); /* Create a notebook, set the position of the tabs */ gg->vartable_ui.notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (gg->vartable_ui.notebook), GTK_POS_TOP); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (gg->vartable_ui.notebook), g_slist_length (gg->d) > 1); gtk_box_pack_start (GTK_BOX (vbox), gg->vartable_ui.notebook, true, true, 2); /* Needed?: a switch-page callback so that we can keep track of * the vartyped of the current page, and show or hide buttons * as appropriate -- dfs */ /* Connecting to display_selected event */ g_signal_connect (G_OBJECT (gg), "display_selected", G_CALLBACK (vartable_show_page_cb), NULL); /* */ for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; vartable_subwindow_init (d, gg); } /*-- listen for datad_added events --*/ g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK (vartable_notebook_adddata_cb), GTK_OBJECT (gg->vartable_ui.notebook)); hbox = vartable_buttonbox_build (gg); gtk_box_pack_start (GTK_BOX (vbox), hbox, false, false, 1); gtk_widget_show_all (gg->vartable_ui.window); /*-- set it to the page corresponding to the current display --*/ d = (gg->current_display ? gg->current_display->d : (GGobiData *)gg->d->data); vartable_show_page (d, gg); } /*-------------------------------------------------------------------------*/ /* set values in the table */ /*-------------------------------------------------------------------------*/ /*-- sets the name of the un-transformed variable --*/ void vartable_collab_set_by_var (gint j, GGobiData *d) { vartabled *vt = vartable_element_get (j, d); gint k; GtkTreeModel *model; GtkTreeIter iter; GtkTreeIter child; gchar *fmtname; if (!vartable_iter_from_varno(j, d, &model, &iter)) return; if (vt) { switch (vt->vartype) { case categorical: gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_NLEVELS, vt->nlevels, -1); gtk_tree_model_iter_children(model, &child, &iter); /*-- set the level fields --*/ for (k=0; knlevels; k++) { fmtname = g_markup_printf_escaped("%s", vt->level_names[k]); gtk_tree_store_set(GTK_TREE_STORE(model), &child, VT_LEVEL_NAME, fmtname, VT_LEVEL_VALUE, vt->level_values[k], VT_LEVEL_COUNT, vt->level_counts[k], -1); g_free(fmtname); gtk_tree_model_iter_next(model, &child); } // no more break case integer: case counter: case uniform: case real: gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_VARNAME, vt->collab, -1); break; case all_vartypes: g_printerr ("(vartable_collab_set_by_var) illegal variable type %d\n", all_vartypes); break; } } } /*-- sets the name of the transformed variable --*/ void vartable_collab_tform_set_by_var (gint j, GGobiData *d) { vartabled *vt; GtkTreeModel *model; GtkTreeIter iter; if (!vartable_iter_from_varno(j, d, &model, &iter)) return; vt = vartable_element_get (j, d); if (vt->tform0 == NO_TFORM0 && vt->tform1 == NO_TFORM1 && vt->tform2 == NO_TFORM2) { gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_TFORM, "", -1); } else { gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_TFORM, vt->collab_tform, -1); } } /*-- sets the limits for a variable --*/ void vartable_limits_set_by_var (gint j, GGobiData *d) { vartabled *vt = vartable_element_get (j, d); GtkTreeModel *model; GtkTreeIter iter; if (!vartable_iter_from_varno(j, d, &model, &iter)) return; if (vt) { switch (vt->vartype) { case integer: case counter: case uniform: case real: gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_REAL_DATA_MIN, vt->lim_display.min, VT_REAL_DATA_MAX, vt->lim_display.max, -1); if (vt->lim_specified_p) { gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_REAL_USER_MIN, vt->lim_specified_tform.min, VT_REAL_USER_MAX, vt->lim_specified_tform.max, -1); } break; case categorical: gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_CAT_DATA_MIN, (gint)vt->lim_display.min, VT_CAT_DATA_MAX, (gint)vt->lim_display.max, -1); if (vt->lim_specified_p) { gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_CAT_USER_MIN, (gint)vt->lim_specified_tform.min, VT_CAT_USER_MAX, (gint)vt->lim_specified_tform.max, -1); } break; case all_vartypes: g_printerr ("(vartable_limits_set_by_var) %d: illegal variable type %d\n", j, all_vartypes); break; } } } void vartable_limits_set (GGobiData *d) { gint j; if (d->vartable_tree_model != NULL) for (j=0; jncols; j++) vartable_limits_set_by_var (j, d); } /*-- sets the mean, median, and number of missings for a variable --*/ void vartable_stats_set_by_var (gint j, GGobiData *d) { vartabled *vt = vartable_element_get (j, d); vartyped type; GtkTreeModel *model; GtkTreeIter iter; if (!vartable_iter_from_varno(j, d, &model, &iter)) return; if (vt) { switch (vt->vartype) { case integer: case counter: case uniform: case real: type = real; /*-- for counter variables, don't display the mean --*/ if (vt->vartype != counter) gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_MEAN, vt->mean, VT_MEDIAN, vt->median, -1); //break; case categorical: gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VT_NMISSING, ggobi_data_get_col_n_missing(d, j), -1); break; case all_vartypes: g_printerr ("(vartable_stats_set_by_var) %d: illegal variable type %d\n", j, vt->vartype); break; } } } void vartable_stats_set (GGobiData *d) { gint j; if (d->vartable_tree_model != NULL) for (j=0; jncols; j++) vartable_stats_set_by_var (j, d); } /* * in one routine, populate every cell in a row -- all these * functions call gtk_tree_view_set_text. */ void vartable_cells_set_by_var (gint j, GGobiData *d) { vartable_stats_set_by_var (j, d); vartable_limits_set_by_var (j, d); vartable_collab_set_by_var (j, d); vartable_collab_tform_set_by_var (j, d); } ggobi-2.1.12/src/extendedDisplay.c0000644000175000017500000000441214651527764012450 /* extendedDisplay.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "ggobi.h" #include "display.h" const gchar * /*const */ ggobi_display_tree_label (displayd * dpy) { GGobiExtendedDisplayClass *klass; gchar *const label = "?"; klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dpy); if (klass->treeLabel) return (klass->treeLabel); if (klass->tree_label) return (klass->tree_label (dpy)); return (label); } const gchar * /*const */ ggobi_display_title_label (displayd * dpy) { GGobiExtendedDisplayClass *klass; extendedDisplayd *edpy; gchar *const label = "?"; edpy = GGOBI_EXTENDED_DISPLAY (dpy); if (edpy->titleLabel) { return (edpy->titleLabel); } klass = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dpy); if (klass->titleLabel) return (klass->treeLabel); if (klass->title_label) return (klass->title_label (dpy)); return (label); } /********************************/ /* Add by type and deduce the class from that. Can add be specifying pointers to routines to get the GType. Also can do this with dlsym() to resolve a routine by name. And can also lookup the name of a previously instantiated GType. */ GSList *ExtendedDisplayTypes = NULL; int addDisplayType (GType type) { GObjectClass *klass; if (!g_type_is_a (type, GGOBI_TYPE_EXTENDED_DISPLAY)) { g_printerr ("%s is not a GType that extends GGobiExtendedDisplay", g_type_name (type)); } klass = g_type_class_ref (type); ExtendedDisplayTypes = g_slist_append (ExtendedDisplayTypes, klass); return (g_slist_length (ExtendedDisplayTypes)); } void registerDisplayTypes (const GTypeLoad * const loaders, int n) { int i; GType type; for (i = 0; i < n; i++) { type = loaders[i] (); addDisplayType (type); } } ggobi-2.1.12/src/scatterplotClass.c0000644000175000017500000014215214651527764012660 /* scatterplotClass.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "ggobi.h" #include "scatterplotClass.h" #include "externs.h" #include #include #include #ifdef ENABLE_CAIRO #include #endif /* display_datad_added_cb() in display.c scatterplot_wants to display_edge_menu_update() Hint that scatmat_edge... also needed. display_options_cb varpanel_highd needs a new method to be defined. viewmode_set needs a special handler. motion_notify_cb in movepts_ui.c works only for scatterplot and scatterplot matrices Perhaps just don't register the event handler for other types. Same with button_press_cb world_to_raw needs methods. display_data_added_cb should only be called for scatterplot guys. splot_draw_to_pixmap0_unbinned needs an additional pre-plot hook for drawing edges. tour1d tourcorr and tour2d realloc up's don't get done for anything but scatterplot. varcircle_draw needs a hook. selectScatterplotX only applies to scatterplots. */ static void setShowAxesLabelOption (displayd * display, gboolean active) { if (display->cpanel.pmode == TOUR2D) display_plot (display, FULL, display->ggobi); else if (display->cpanel.pmode == TOUR2D3) display_plot (display, FULL, display->ggobi); } static void setShowAxesValuesOption (displayd * display, gboolean active) { if (display->cpanel.pmode == TOUR2D) display_plot (display, FULL, display->ggobi); else if (display->cpanel.pmode == TOUR2D3) display_plot (display, FULL, display->ggobi); } static void setShowAxesOption (displayd * display, gboolean active) { switch (display->cpanel.pmode) { case XYPLOT: if (display->hrule != NULL) { scatterplot_show_vrule (display, active); scatterplot_show_hrule (display, active); } break; case P1PLOT: if (display->hrule != NULL) { if (display->p1d_orientation == VERTICAL) scatterplot_show_vrule (display, active); else scatterplot_show_hrule (display, active); } case TOUR1D: case TOUR2D3: case TOUR2D: case COTOUR: display_plot (display, FULL, display->ggobi); break; default: break; } } static void selectXVar (GtkWidget * w, displayd * display, gint jvar, ggobid * gg) { GGobiData *d = display->d; splotd *sp = (splotd *) display->splots->data; cpaneld *cpanel = &display->cpanel; varsel (w, cpanel, sp, jvar, VARSEL_X, -1, false, false, false, d, gg); } static void varpanelRefresh (displayd * display, splotd * sp, GGobiData * d) { cpaneld *cpanel = &display->cpanel; gint j; switch (cpanel->pmode) { case P1PLOT: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, j == sp->p1dvar, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } break; case XYPLOT: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, (j == sp->xyvars.x), d); varpanel_widget_set_visible (VARSEL_Y, j, true, d); varpanel_toggle_set_active (VARSEL_Y, j, (j == sp->xyvars.y), d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } break; case TOUR1D: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } for (j = 0; j < display->t1d.nsubset; j++) { varpanel_toggle_set_active (VARSEL_X, display->t1d.subset_vars.els[j], true, d); } break; case TOUR2D3: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, true, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, true, d); } varpanel_toggle_set_active (VARSEL_X, display->t2d3.subset_vars.els[0], true, d); varpanel_toggle_set_active (VARSEL_Y, display->t2d3.subset_vars.els[1], true, d); varpanel_toggle_set_active (VARSEL_Z, display->t2d3.subset_vars.els[2], true, d); break; case TOUR2D: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } for (j = 0; j < display->t2d.nsubset; j++) { varpanel_toggle_set_active (VARSEL_X, display->t2d.subset_vars.els[j], true, d); } break; case COTOUR: for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, true, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } for (j = 0; j < display->tcorr1.nsubset; j++) { varpanel_toggle_set_active (VARSEL_X, display->tcorr1.subset_vars.els[j], true, d); } for (j = 0; j < display->tcorr2.nsubset; j++) { varpanel_toggle_set_active (VARSEL_Y, display->tcorr2.subset_vars.els[j], true, d); } break; /*-- to pacify compiler --*/ default: break; } } static gboolean variableSelect (GtkWidget * w, displayd * display, splotd * sp, gint jvar, gint toggle, gint mouse, cpaneld * cpanel, ggobid * gg) { gboolean redraw = false; gint jvar_prev = -1; switch (cpanel->pmode) { case P1PLOT: redraw = p1d_varsel (sp, jvar, &jvar_prev, toggle, mouse); if (imode_get (gg) == BRUSH && cpanel->br.mode == BR_TRANSIENT) reinit_transient_brushing (display, gg); break; case XYPLOT: redraw = xyplot_varsel (sp, jvar, &jvar_prev, toggle, mouse); if (redraw) if (imode_get (gg) == BRUSH && cpanel->br.mode == BR_TRANSIENT) reinit_transient_brushing (display, gg); break; case TOUR1D: redraw = tour1d_varsel (w, jvar, toggle, mouse, display->d, gg); break; case TOUR2D3: redraw = tour2d3_varsel (w, jvar, toggle, mouse, display->d, gg); break; case TOUR2D: redraw = tour2d_varsel (w, jvar, toggle, mouse, display->d, gg); break; case COTOUR: redraw = tourcorr_varsel (w, jvar, toggle, mouse, display->d, gg); break; /*-- to pacify compiler if we change these to an enum --*/ default: break; } return (redraw); } static gboolean varcircleDraw (displayd * display, gint jvar, GdkPixmap * da_pix, ggobid * gg) { gdouble r = VAR_CIRCLE_DIAM / 2.0; gint x, y, k; cpaneld *cpanel = &display->cpanel; gboolean chosen = false; #ifdef ENABLE_CAIRO cairo_t *c = gdk_cairo_create (da_pix); cairo_set_source_rgb (c, 1.0, 0, 1.0); cairo_set_line_width (c, 1); #endif switch (cpanel->pmode) { case TOUR1D: x = (gint) (display->t1d.F.vals[0][jvar] * (gfloat) r); y = 0; #ifndef ENABLE_CAIRO gdk_draw_line (da_pix, gg->selvarfg_GC, r, r, r + x, r - y); #endif if (jvar == display->t1d_manip_var) { #ifdef ENABLE_CAIRO cairo_arc (c, r, r, r - 5, (5.0 / 6) * M_PI, (7.0 / 6) * M_PI); cairo_stroke (c); cairo_arc (c, r, r, r - 5, (11.0 / 6) * M_PI, (13.0 / 6) * M_PI); #else gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 150 * 64, 60 * 64); gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 330 * 64, 60 * 64); #endif } for (k = 0; k < display->t1d.nactive; k++) { if (display->t1d.active_vars.els[k] == jvar) { chosen = true; break; } } break; case TOUR2D3: x = (gint) (display->t2d3.F.vals[0][jvar] * (gfloat) r); y = (gint) (display->t2d3.F.vals[1][jvar] * (gfloat) r); #ifndef ENABLE_CAIRO gdk_draw_line (da_pix, gg->selvarfg_GC, r, r, r + x, r - y); #endif if (jvar == display->t2d3_manip_var) { #ifdef ENABLE_CAIRO cairo_arc (c, r, r, r - 5, 0, 2 * M_PI); #else gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 0 * 64, 360 * 64); #endif } for (k = 0; k < display->t2d3.nactive; k++) { if (display->t2d3.active_vars.els[k] == jvar) { chosen = true; break; } } break; case TOUR2D: x = (gint) (display->t2d.F.vals[0][jvar] * (gfloat) r); y = (gint) (display->t2d.F.vals[1][jvar] * (gfloat) r); #ifndef ENABLE_CAIRO gdk_draw_line (da_pix, gg->selvarfg_GC, r, r, r + x, r - y); #endif if (jvar == display->t2d_manip_var) { #ifdef ENABLE_CAIRO cairo_arc (c, r, r, r - 5, 0, 2 * M_PI); #else gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 0 * 64, 360 * 64); #endif } for (k = 0; k < display->t2d.nactive; k++) { if (display->t2d.active_vars.els[k] == jvar) { chosen = true; break; } } break; case COTOUR: /* for (i=0; itcorr1.nactive; i++) if (jvar == display->tcorr1.active_vars.els[i]) { xvar = true; break; } */ /* if (xvar) { */ x = (gint) (display->tcorr1.F.vals[0][jvar] * (gfloat) r); y = (gint) (display->tcorr2.F.vals[0][jvar] * (gfloat) r); #ifndef ENABLE_CAIRO gdk_draw_line (da_pix, gg->selvarfg_GC, r, r, r + x, r - y); #endif if (jvar == display->tc1_manip_var) { #ifdef ENABLE_CAIRO cairo_arc (c, r, r, r - 5, (5.0 / 6) * M_PI, (7.0 / 6) * M_PI); cairo_stroke (c); cairo_arc (c, r, r, r - 5, (11.0 / 6) * M_PI, (13.0 / 6) * M_PI); #else gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 150 * 64, 60 * 64); gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 330 * 64, 60 * 64); #endif } if (jvar == display->tc2_manip_var) { #ifdef ENABLE_CAIRO cairo_arc (c, r, r, r - 5, (1.0 / 3) * M_PI, (2.0 / 3) * M_PI); cairo_stroke (c); cairo_arc (c, r, r, r - 5, (4.0 / 3) * M_PI, (5.0 / 3) * M_PI); #else gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 60 * 64, 60 * 64); gdk_draw_arc (da_pix, gg->manipvarfg_GC, false, 5, 5, VAR_CIRCLE_DIAM - 10, VAR_CIRCLE_DIAM - 10, 240 * 64, 60 * 64); #endif } for (k = 0; k < display->tcorr1.nactive; k++) { if (display->tcorr1.active_vars.els[k] == jvar) { chosen = true; break; } } for (k = 0; k < display->tcorr2.nactive; k++) { if (display->tcorr2.active_vars.els[k] == jvar) { chosen = true; break; } } break; /* } else { x = 0; y = (gint) (display->tcorr2.F.vals[0][jvar]*(gfloat)r); gdk_draw_line (da_pix, gg->selvarfg_GC, r, r, r+x, r-y); } */ default: break; } #ifdef ENABLE_CAIRO cairo_stroke (c); cairo_set_source_rgb (c, 0, 0, 0); cairo_set_line_width (c, 2); cairo_move_to (c, r, r); cairo_line_to (c, r + x, r - y); cairo_stroke (c); cairo_destroy (c); #endif return (chosen); } static void tourCorrRealloc (displayd * dsp, gint nc, GGobiData * d) { /* * because display_tourcorr_init_null has been performed even if * alloc_tourcorr has not, Fa.ncols has been initialized, and * dsp->tcorr1.Fa.ncols = 0. */ gint old_ncols, i; old_ncols = dsp->tcorr1.Fa.ncols; if (nc >= MIN_NVARS_FOR_COTOUR) { if (old_ncols < MIN_NVARS_FOR_COTOUR) display_tourcorr_init (dsp, d->gg); if (dsp->d == d) { arrayd_add_cols (&dsp->tcorr1.Fa, nc); arrayd_add_cols (&dsp->tcorr1.Fz, nc); arrayd_add_cols (&dsp->tcorr1.F, nc); arrayd_add_cols (&dsp->tcorr1.Ga, nc); arrayd_add_cols (&dsp->tcorr1.Gz, nc); arrayd_add_cols (&dsp->tcorr1.G, nc); arrayd_add_cols (&dsp->tcorr1.Va, nc); arrayd_add_cols (&dsp->tcorr1.Vz, nc); arrayd_add_cols (&dsp->tcorr1.tv, nc); vectori_realloc (&dsp->tcorr1.subset_vars, nc); vectorb_realloc (&dsp->tcorr1.subset_vars_p, nc); vectori_realloc (&dsp->tcorr1.active_vars, nc); vectorb_realloc (&dsp->tcorr1.active_vars_p, nc); vectorf_realloc (&dsp->tcorr1.lambda, nc); vectorf_realloc (&dsp->tcorr1.tau, nc); vectorf_realloc (&dsp->tcorr1.tinc, nc); arrayd_add_cols (&dsp->tc1_manbasis, (gint) nc); arrayd_add_cols (&dsp->tc2_manbasis, (gint) nc); arrayd_add_cols (&dsp->tcorr2.Fa, nc); arrayd_add_cols (&dsp->tcorr2.Fz, nc); arrayd_add_cols (&dsp->tcorr2.F, nc); arrayd_add_cols (&dsp->tcorr2.Ga, nc); arrayd_add_cols (&dsp->tcorr2.Gz, nc); arrayd_add_cols (&dsp->tcorr2.G, nc); arrayd_add_cols (&dsp->tcorr2.Va, nc); arrayd_add_cols (&dsp->tcorr2.Vz, nc); arrayd_add_cols (&dsp->tcorr2.tv, nc); vectori_realloc (&dsp->tcorr2.subset_vars, nc); vectorb_realloc (&dsp->tcorr2.subset_vars_p, nc); vectori_realloc (&dsp->tcorr2.active_vars, nc); vectorb_realloc (&dsp->tcorr2.active_vars_p, nc); vectorf_realloc (&dsp->tcorr2.lambda, nc); vectorf_realloc (&dsp->tcorr2.tau, nc); vectorf_realloc (&dsp->tcorr2.tinc, nc); /* need to zero extra cols */ for (i = old_ncols; i < nc; i++) { dsp->tcorr1.Fa.vals[0][i] = 0.0; dsp->tcorr1.Fz.vals[0][i] = 0.0; dsp->tcorr1.F.vals[0][i] = 0.0; dsp->tcorr1.Ga.vals[0][i] = 0.0; dsp->tcorr1.Gz.vals[0][i] = 0.0; dsp->tcorr1.G.vals[0][i] = 0.0; dsp->tcorr1.Va.vals[0][i] = 0.0; dsp->tcorr1.Vz.vals[0][i] = 0.0; dsp->tcorr1.tv.vals[0][i] = 0.0; dsp->tcorr1.subset_vars.els[i] = 0; dsp->tcorr1.subset_vars_p.els[i] = false; dsp->tcorr1.active_vars.els[i] = 0; dsp->tcorr1.active_vars_p.els[i] = false; dsp->tcorr1.lambda.els[i] = 0.0; dsp->tcorr1.tau.els[i] = 0.0; dsp->tcorr1.tinc.els[i] = 0.0; dsp->tcorr2.Fa.vals[0][i] = 0.0; dsp->tcorr2.Fz.vals[0][i] = 0.0; dsp->tcorr2.F.vals[0][i] = 0.0; dsp->tcorr2.Ga.vals[0][i] = 0.0; dsp->tcorr2.Gz.vals[0][i] = 0.0; dsp->tcorr2.G.vals[0][i] = 0.0; dsp->tcorr2.Va.vals[0][i] = 0.0; dsp->tcorr2.Vz.vals[0][i] = 0.0; dsp->tcorr2.tv.vals[0][i] = 0.0; dsp->tcorr2.subset_vars.els[i] = 0; dsp->tcorr2.subset_vars_p.els[i] = false; dsp->tcorr2.active_vars.els[i] = 0; dsp->tcorr2.active_vars_p.els[i] = false; dsp->tcorr2.lambda.els[i] = 0.0; dsp->tcorr2.tau.els[i] = 0.0; dsp->tcorr2.tinc.els[i] = 0.0; } } } } static void tour2d3Realloc (displayd * dsp, gint nc, GGobiData * d) { gint old_ncols, i; /* * because display_tour2d_init_null has been performed even if * alloc_tour2d has not, Fa.ncols has been initialized. */ old_ncols = dsp->t2d3.Fa.ncols; if (nc >= MIN_NVARS_FOR_TOUR2D3) { if (old_ncols < MIN_NVARS_FOR_TOUR2D3) display_tour2d3_init (dsp, d->gg); if (dsp->d == d) { arrayd_add_cols (&dsp->t2d3.Fa, nc); arrayd_add_cols (&dsp->t2d3.Fz, nc); arrayd_add_cols (&dsp->t2d3.F, nc); arrayd_add_cols (&dsp->t2d3.Ga, nc); arrayd_add_cols (&dsp->t2d3.Gz, nc); arrayd_add_cols (&dsp->t2d3.G, nc); arrayd_add_cols (&dsp->t2d3.Va, nc); arrayd_add_cols (&dsp->t2d3.Vz, nc); arrayd_add_cols (&dsp->t2d3.tv, nc); vectori_realloc (&dsp->t2d3.subset_vars, nc); vectorb_realloc (&dsp->t2d3.subset_vars_p, nc); vectori_realloc (&dsp->t2d3.active_vars, nc); vectorb_realloc (&dsp->t2d3.active_vars_p, nc); vectorf_realloc (&dsp->t2d3.lambda, nc); vectorf_realloc (&dsp->t2d3.tau, nc); vectorf_realloc (&dsp->t2d3.tinc, nc); arrayd_add_cols (&dsp->t2d3_manbasis, (gint) nc); /* need to zero extra cols */ for (i = old_ncols; i < nc; i++) { dsp->t2d3.Fa.vals[0][i] = dsp->t2d3.Fa.vals[1][i] = 0.0; dsp->t2d3.Fz.vals[0][i] = dsp->t2d3.Fz.vals[1][i] = 0.0; dsp->t2d3.F.vals[0][i] = dsp->t2d3.F.vals[1][i] = 0.0; dsp->t2d3.Ga.vals[0][i] = dsp->t2d3.Ga.vals[1][i] = 0.0; dsp->t2d3.Gz.vals[0][i] = dsp->t2d3.Gz.vals[1][i] = 0.0; dsp->t2d3.G.vals[0][i] = dsp->t2d3.G.vals[1][i] = 0.0; dsp->t2d3.Va.vals[0][i] = dsp->t2d3.Va.vals[1][i] = 0.0; dsp->t2d3.Vz.vals[0][i] = dsp->t2d3.Vz.vals[1][i] = 0.0; dsp->t2d3.tv.vals[0][i] = dsp->t2d3.tv.vals[1][i] = 0.0; dsp->t2d3.subset_vars.els[i] = 0; dsp->t2d3.subset_vars_p.els[i] = false; dsp->t2d3.active_vars.els[i] = 0; dsp->t2d3.active_vars_p.els[i] = false; dsp->t2d3.lambda.els[i] = 0.0; dsp->t2d3.tau.els[i] = 0.0; dsp->t2d3.tinc.els[i] = 0.0; } } } } static void tour2dRealloc (displayd * dsp, gint nc, GGobiData * d) { gint old_ncols, i; /* * because display_tour2d_init_null has been performed even if * alloc_tour2d has not, Fa.ncols has been initialized. */ old_ncols = dsp->t2d.Fa.ncols; if (nc >= MIN_NVARS_FOR_TOUR2D) { if (old_ncols < MIN_NVARS_FOR_TOUR2D) display_tour2d_init (dsp, d->gg); if (dsp->d == d) { arrayd_add_cols (&dsp->t2d.Fa, nc); arrayd_add_cols (&dsp->t2d.Fz, nc); arrayd_add_cols (&dsp->t2d.F, nc); arrayd_add_cols (&dsp->t2d.Ga, nc); arrayd_add_cols (&dsp->t2d.Gz, nc); arrayd_add_cols (&dsp->t2d.G, nc); arrayd_add_cols (&dsp->t2d.Va, nc); arrayd_add_cols (&dsp->t2d.Vz, nc); arrayd_add_cols (&dsp->t2d.tv, nc); vectori_realloc (&dsp->t2d.subset_vars, nc); vectorb_realloc (&dsp->t2d.subset_vars_p, nc); vectori_realloc (&dsp->t2d.active_vars, nc); vectorb_realloc (&dsp->t2d.active_vars_p, nc); vectorf_realloc (&dsp->t2d.lambda, nc); vectorf_realloc (&dsp->t2d.tau, nc); vectorf_realloc (&dsp->t2d.tinc, nc); arrayd_add_cols (&dsp->t2d_manbasis, (gint) nc); /* need to zero extra cols */ for (i = old_ncols; i < nc; i++) { dsp->t2d.Fa.vals[0][i] = dsp->t2d.Fa.vals[1][i] = 0.0; dsp->t2d.Fz.vals[0][i] = dsp->t2d.Fz.vals[1][i] = 0.0; dsp->t2d.F.vals[0][i] = dsp->t2d.F.vals[1][i] = 0.0; dsp->t2d.Ga.vals[0][i] = dsp->t2d.Ga.vals[1][i] = 0.0; dsp->t2d.Gz.vals[0][i] = dsp->t2d.Gz.vals[1][i] = 0.0; dsp->t2d.G.vals[0][i] = dsp->t2d.G.vals[1][i] = 0.0; dsp->t2d.Va.vals[0][i] = dsp->t2d.Va.vals[1][i] = 0.0; dsp->t2d.Vz.vals[0][i] = dsp->t2d.Vz.vals[1][i] = 0.0; dsp->t2d.tv.vals[0][i] = dsp->t2d.tv.vals[1][i] = 0.0; dsp->t2d.subset_vars.els[i] = 0; dsp->t2d.subset_vars_p.els[i] = false; dsp->t2d.active_vars.els[i] = 0; dsp->t2d.active_vars_p.els[i] = false; dsp->t2d.lambda.els[i] = 0.0; dsp->t2d.tau.els[i] = 0.0; dsp->t2d.tinc.els[i] = 0.0; } } } } static void tour1dRealloc (displayd * dsp, gint nc, GGobiData * d) { gint old_ncols, i; /* * because display_tour1d_init_null has been performed even if * alloc_tour1d has not, Fa.ncols has been initialized. */ old_ncols = dsp->t1d.Fa.ncols; if (old_ncols < MIN_NVARS_FOR_TOUR1D && nc >= MIN_NVARS_FOR_TOUR1D) { display_tour1d_init (dsp, d->gg); } if (dsp->d == d) { arrayd_add_cols (&dsp->t1d.Fa, nc); arrayd_add_cols (&dsp->t1d.Fz, nc); arrayd_add_cols (&dsp->t1d.F, nc); arrayd_add_cols (&dsp->t1d.Ga, nc); arrayd_add_cols (&dsp->t1d.Gz, nc); arrayd_add_cols (&dsp->t1d.G, nc); arrayd_add_cols (&dsp->t1d.Va, nc); arrayd_add_cols (&dsp->t1d.Vz, nc); arrayd_add_cols (&dsp->t1d.tv, nc); vectori_realloc (&dsp->t1d.subset_vars, nc); vectorb_realloc (&dsp->t1d.subset_vars_p, nc); vectori_realloc (&dsp->t1d.active_vars, nc); vectorb_realloc (&dsp->t1d.active_vars_p, nc); vectorf_realloc (&dsp->t1d.lambda, nc); vectorf_realloc (&dsp->t1d.tau, nc); vectorf_realloc (&dsp->t1d.tinc, nc); arrayd_add_cols (&dsp->t1d_manbasis, (gint) nc); /* need to zero extra cols */ for (i = old_ncols; i < nc; i++) { dsp->t1d.Fa.vals[0][i] = 0.0; dsp->t1d.Fz.vals[0][i] = 0.0; dsp->t1d.F.vals[0][i] = 0.0; dsp->t1d.Ga.vals[0][i] = 0.0; dsp->t1d.Gz.vals[0][i] = 0.0; dsp->t1d.G.vals[0][i] = 0.0; dsp->t1d.Va.vals[0][i] = 0.0; dsp->t1d.Vz.vals[0][i] = 0.0; dsp->t1d.tv.vals[0][i] = 0.0; dsp->t1d.subset_vars.els[i] = 0; dsp->t1d.subset_vars_p.els[i] = false; dsp->t1d.active_vars.els[i] = 0; dsp->t1d.active_vars_p.els[i] = false; dsp->t1d.lambda.els[i] = 0.0; dsp->t1d.tau.els[i] = 0.0; dsp->t1d.tinc.els[i] = 0.0; } } } /* XXX duncan and dfs: you need to sort this out void worldToRaw(displayd *display, splotd *sp, gint pt, GGobiData *d, ggobid *gg) { cpaneld *cpanel = &display->cpanel; ProjectionMode proj = cpanel->pmode; gint j; switch (proj) { case P1PLOT: if (display->p1d_orientation == VERTICAL) world_to_raw_by_var (pt, sp->p1dvar, display, d, gg); else world_to_raw_by_var (pt, sp->p1dvar, display, d, gg); break; case XYPLOT: world_to_raw_by_var (pt, sp->xyvars.x, display, d, gg); world_to_raw_by_var (pt, sp->xyvars.y, display, d, gg); break; case TOUR1D: for (j=0; jt1d.nactive; j++) world_to_raw_by_var (pt, display->t1d.active_vars.els[j], display, d, gg); break; case TOUR2D3: for (j=0; jt2d3.nactive; j++) world_to_raw_by_var (pt, display->t2d3.active_vars.els[j], display, d, gg); break; case TOUR2D: for (j=0; jt2d.nactive; j++) world_to_raw_by_var (pt, display->t2d.active_vars.els[j], display, d, gg); break; case COTOUR: for (j=0; jtcorr1.nactive; j++) world_to_raw_by_var (pt, display->tcorr1.active_vars.els[j], display, d, gg); for (j=0; jtcorr2.nactive; j++) world_to_raw_by_var (pt, display->tcorr2.active_vars.els[j], display, d, gg); break; default: break; } } */ void scatterplotMovePointsButtonCb (displayd * display, splotd * sp, GtkWidget * w, GdkEventButton * event, ggobid * gg) { GGobiData *d = gg->current_display->d; g_assert (d->clusterid.nels == d->nrows); if (d->nearest_point != -1) { movepts_history_add (d->nearest_point, sp, d, gg); /*-- add the history information for the cluster here --*/ if (gg->movepts.cluster_p) { clusters_set (d, gg); if (d->nclusters > 1) { gint i, k, id = d->nearest_point; gfloat cur_clust = d->clusterid.els[id]; for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; if (k == id); else if (d->clusterid.els[k] == cur_clust) if (!d->hidden_now.els[k]) movepts_history_add (k, sp, d, gg); } } } splot_redraw (sp, QUICK, gg); } } void scatterplotMovePointsMotionCb (displayd * display, splotd * sp, GtkWidget * w, GdkEventMotion * event, ggobid * gg) { GGobiData *d = display->d; gboolean button1_p, button2_p; gboolean inwindow, wasinwindow; /*-- define wasinwindow before the new mousepos is calculated --*/ wasinwindow = mouseinwindow (sp); /*-- get the mouse position and find out which buttons are pressed --*/ mousepos_get_motion (w, event, &button1_p, &button2_p, sp); inwindow = mouseinwindow (sp); if (gg->buttondown == 0) { gint k = find_nearest_point (&sp->mousepos, sp, d, gg); d->nearest_point = k; if (k != d->nearest_point_prev) { displays_plot (NULL, QUICK, gg); d->nearest_point_prev = k; } } else { /*-- If the pointer is inside the plotting region ... --*/ if (inwindow) { /*-- ... and if the pointer has moved ...--*/ if ((sp->mousepos.x != sp->mousepos_o.x) || (sp->mousepos.y != sp->mousepos_o.y)) { /* * move the point: compute the data pipeline in reverse, * (then run it forward again?) and draw the plot. */ if (d->nearest_point != -1) { move_pt (d->nearest_point, sp->mousepos.x, sp->mousepos.y, sp, d, gg); } sp->mousepos_o.x = sp->mousepos.x; sp->mousepos_o.y = sp->mousepos.y; } } else { /*-- if !inwindow --*/ if (wasinwindow) { d->nearest_point = -1; splot_redraw (sp, QUICK, gg); } } } } static void pmodeSet (ProjectionMode pmode, displayd * display, ggobid * gg) { if (display && pmode != NULL_PMODE) { display->cpanel.pmode = pmode; if (pmode != gg->pmode_prev) { scatterplot_show_rulers (display, pmode); } } } static gboolean scatterplotKeyEventHandled (GtkWidget * w, displayd * display, splotd * sp, GdkEventKey * event, ggobid * gg) { gboolean ok = true; cpaneld *cpanel = &display->cpanel; ProjectionMode pmode = NULL_PMODE; InteractionMode imode = DEFAULT_IMODE; /* The key press could either lead to a pmode or an imode change; this works with or without the control key being pressed */ if (event->state == 0 || event->state == GDK_CONTROL_MASK) { switch (event->keyval) { case GDK_0: case GDK_1: case GDK_2: case GDK_3: case GDK_4: case GDK_5: case GDK_6: case GDK_7: case GDK_8: case GDK_9: if (gg->NumberedKeyEventHandler != NULL && gg->NumberedKeyEventHandler->handlerRoutine) { (gg->NumberedKeyEventHandler->handlerRoutine) (event->keyval, w, event, cpanel, sp, gg, gg-> NumberedKeyEventHandler-> userData); } break; case GDK_d: case GDK_D: pmode = P1PLOT; break; case GDK_x: case GDK_X: pmode = XYPLOT; break; case GDK_t: case GDK_T: pmode = TOUR1D; break; case GDK_r: case GDK_R: pmode = TOUR2D3; break; case GDK_g: case GDK_G: pmode = TOUR2D; break; case GDK_c: case GDK_C: pmode = COTOUR; break; case GDK_s: case GDK_S: imode = SCALE; break; case GDK_b: case GDK_B: imode = BRUSH; break; case GDK_i: case GDK_I: imode = IDENT; break; case GDK_e: case GDK_E: imode = EDGEED; break; case GDK_m: case GDK_M: imode = MOVEPTS; break; default: ok = false; } if (ok) { if (pmode > -1 && !projection_ok (pmode, display)) ok = false; else GGOBI (full_viewmode_set) (pmode, imode, gg); } } else { ok = false; } return ok; } static gboolean varpanelHighd (displayd * display) { ProjectionMode proj = display->cpanel.pmode; return (proj == TOUR1D || proj == TOUR2D3 || proj == TOUR2D || proj == COTOUR); } void scatterplotDisplayInit (scatterplotDisplayd * display) { GGOBI_DISPLAY (display)->p1d_orientation = HORIZONTAL; } gboolean binningPermitted (displayd * dpy) { cpaneld *cpanel = &dpy->cpanel; ggobid *gg = dpy->ggobi; GGobiData *e = dpy->e; if (pmode_get (dpy, gg) == P1PLOT && cpanel->p1d.type == ASH && cpanel->p1d.ASH_add_lines_p) return (false); /* if (cpanel->br_point_targets == br_select) return(false); */ /*-- if we're drawing edges --*/ if (e != NULL && e->edge.n > 0) { if (dpy->options.edges_undirected_show_p || dpy->options.edges_directed_show_p || dpy->options.whiskers_show_p) { return (false); } } return (true); } gboolean cpanelSet (displayd * dpy, cpaneld * cpanel, ggobid * gg) { cpanel_p1d_set (dpy, cpanel, gg); cpanel_xyplot_set (dpy, cpanel, gg); cpanel_tour1d_set (dpy, cpanel, gg); if (dpy->d->ncols >= MIN_NVARS_FOR_TOUR2D3) cpanel_tour2d3_set (dpy, cpanel, gg); if (dpy->d->ncols >= MIN_NVARS_FOR_TOUR2D) cpanel_tour2d_set (dpy, cpanel, gg); if (dpy->d->ncols >= MIN_NVARS_FOR_COTOUR) cpanel_tourcorr_set (dpy, cpanel, gg); cpanel_brush_set (dpy, cpanel, gg); cpanel_scale_set (dpy, cpanel, gg); cpanel_edgeedit_set (dpy, cpanel, gg); cpanel_identify_set (dpy, cpanel, gg); return (true); } void displaySet (displayd * dpy, ggobid * gg) { } /* Hmm. These are probably useful in the other display classes. dfs */ static gboolean handlesProjection (displayd * dpy, ProjectionMode v) { return (true); } static gboolean handlesInteraction (displayd * dpy, InteractionMode v) { return (true); } static gint plotted (displayd * display, gint * cols, gint ncols, GGobiData * d) { gint j, k; splotd *sp = (splotd *) display->splots->data; /*-- only one splot --*/ ProjectionMode projection = (gint) pmode_get (display, display->ggobi); switch (projection) { case P1PLOT: for (j = 0; j < ncols; j++) { if (sp->p1dvar == cols[j]) { return (sp->p1dvar); } } break; case XYPLOT: for (j = 0; j < ncols; j++) { if (sp->xyvars.x == cols[j]) { return (sp->xyvars.x); } if (sp->xyvars.y == cols[j]) { return (sp->xyvars.y); } } break; case TOUR1D: for (j = 0; j < ncols; j++) { for (k = 0; k < display->t1d.nactive; k++) { if (display->t1d.active_vars.els[k] == cols[j]) { return (display->t1d.active_vars.els[k]); } } } break; case TOUR2D3: for (j = 0; j < ncols; j++) { for (k = 0; k < display->t2d3.nactive; k++) { if (display->t2d3.active_vars.els[k] == cols[j]) { return (display->t2d3.active_vars.els[k]); } } } break; case TOUR2D: for (j = 0; j < ncols; j++) { for (k = 0; k < display->t2d.nactive; k++) { if (display->t2d.active_vars.els[k] == cols[j]) { return (display->t2d.active_vars.els[k]); } } } break; case COTOUR: for (j = 0; j < ncols; j++) { for (k = 0; k < display->tcorr1.nactive; k++) { if (display->tcorr1.active_vars.els[k] == cols[j]) { return (display->tcorr1.active_vars.els[k]); } } for (k = 0; k < display->tcorr2.nactive; k++) { if (display->tcorr2.active_vars.els[k] == cols[j]) { return (display->tcorr2.active_vars.els[k]); } } } break; case NULL_PMODE: case DEFAULT_PMODE: case EXTENDED_DISPLAY_PMODE: case N_PMODES: g_printerr ("Unexpected pmode value %d\n", projection); break; } return (-1); } static void varpanelTooltipsReset (displayd * display, ggobid * gg, GtkWidget * wx, GtkWidget * wy, GtkWidget * wz, GtkWidget * label) { ProjectionMode projection = pmode_get (display, gg); switch (projection) { case P1PLOT: gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Select to plot", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click left to plot horizontally, right or middle to plot vertically", NULL); break; case XYPLOT: gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Press to select the horizontally plotted variable", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wy, "Press to select the vertically plotted variable", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click left to select the horizontal variable, middle for vertical", NULL); break; case TOUR1D: gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Click to select a variable to be available for touring", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click to select a variable to be available for touring", NULL); break; case TOUR2D3: gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Click to select a variable to be available for rotation", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wy, "Click to select a variable to be available for rotation", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wz, "Click to select a variable to be available for rotation", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click to select a variable to be available for rotation", NULL); break; case TOUR2D: gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Click to select a variable to be available for touring", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click to select a variable to be available for touring", NULL); break; case COTOUR: gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Click to select a variable to be toured horizontally", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wy, "Click to select a variable to be toured vertically", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Click to select a variable to be available for touring", NULL); break; /*-- to pacify compiler if we change these to an enum --*/ default: break; } } static gint plottedVarsGet (displayd * display, gint * cols, GGobiData * d, ggobid * gg) { ProjectionMode mode = pmode_get (display, gg); gint ncols = 0, k; splotd *sp = gg->current_splot; switch (mode) { case P1PLOT: cols[ncols++] = sp->p1dvar; break; case XYPLOT: cols[ncols++] = sp->xyvars.x; cols[ncols++] = sp->xyvars.y; break; case TOUR1D: for (k = 0; k < display->t1d.nactive; k++) cols[ncols++] = display->t1d.active_vars.els[k]; break; case TOUR2D3: for (k = 0; k < display->t2d3.nactive; k++) cols[ncols++] = display->t2d3.active_vars.els[k]; break; case TOUR2D: for (k = 0; k < display->t2d.nactive; k++) cols[ncols++] = display->t2d.active_vars.els[k]; break; case COTOUR: for (k = 0; k < display->tcorr1.nactive; k++) cols[ncols++] = display->tcorr1.active_vars.els[k]; for (k = 0; k < display->tcorr2.nactive; k++) cols[ncols++] = display->tcorr2.active_vars.els[k]; break; default: break; } return (ncols); } #ifdef STORE_SESSION_ENABLED /* Write out the variables in a scatterplot to the current node in the XML tree. */ static void add_xml_scatterplot_variables (xmlNodePtr node, GList * plots, displayd * dpy) { splotd *plot = (splotd *) plots->data; XML_addVariable (node, plot->xyvars.x, dpy->d); XML_addVariable (node, plot->xyvars.y, dpy->d); } #endif /* Splot methods. */ static gchar * treeLabel (splotd * splot, GGobiData * d, ggobid * gg) { gchar *buf = NULL; displayd *display = (displayd *) splot->displayptr; cpaneld *cpanel = &display->cpanel; switch (cpanel->pmode) { case P1PLOT: case TOUR1D: buf = ggobi_data_get_col_name(d, splot->p1dvar); break; case XYPLOT: buf = g_strdup_printf("%s v %s", ggobi_data_get_col_name(d, splot->xyvars.x), ggobi_data_get_col_name(d, splot->xyvars.y) ); break; case TOUR2D: buf = g_strdup("grand tour"); break; case TOUR2D3: buf = g_strdup("rotation"); break; case COTOUR: buf = g_strdup("correlation tour"); break; default: break; } return (buf); } static void subPlaneToScreen (splotd * sp, displayd * dpy, GGobiData * d, ggobid * gg) { ash_baseline_set (&sp->p1d.ash_baseline, sp); ash_baseline_set (&sp->tour1d.ash_baseline, sp); } static void worldToPlane (splotd * sp, GGobiData * d, ggobid * gg) { cpaneld *cpanel = &(sp->displayptr->cpanel); switch (cpanel->pmode) { case P1PLOT: p1d_reproject (sp, d->world.vals, d, gg); break; case XYPLOT: xy_reproject (sp, d->world.vals, d, gg); break; case TOUR1D: tour1d_projdata (sp, d->world.vals, d, gg); break; case TOUR2D3: tour2d3_projdata (sp, d->world.vals, d, gg); break; case TOUR2D: tour2d_projdata (sp, d->world.vals, d, gg); break; case COTOUR: tourcorr_projdata (sp, d->world.vals, d, gg); break; default: break; } } static gboolean drawCase (splotd * sp, gint m, GGobiData * d, ggobid * gg) { displayd *display = sp->displayptr; gboolean draw_case = true; ProjectionMode proj = pmode_get (display, gg); gint j; switch (proj) { case P1PLOT: if (ggobi_data_is_missing(d, m, sp->p1dvar)) draw_case = false; break; case XYPLOT: if (ggobi_data_is_missing(d, m, sp->xyvars.x)) draw_case = false; else if (ggobi_data_is_missing(d, m, sp->xyvars.y)) draw_case = false; break; case TOUR1D: for (j = 0; j < display->t1d.nactive; j++) { if (ggobi_data_is_missing(d, m, display->t1d.active_vars.els[j])) { draw_case = false; break; } } break; case TOUR2D3: for (j = 0; j < display->t2d3.nactive; j++) { if (ggobi_data_is_missing(d, m, display->t2d3.active_vars.els[j])) { draw_case = false; break; } } break; case TOUR2D: for (j = 0; j < display->t2d.nactive; j++) { if (ggobi_data_is_missing(d, m, display->t2d.active_vars.els[j])) { draw_case = false; break; } } break; case COTOUR: for (j = 0; j < display->tcorr1.nactive; j++) { if (ggobi_data_is_missing(d, m, display->tcorr1.active_vars.els[j])) { draw_case = false; break; } } if (draw_case) { for (j = 0; j < display->tcorr2.nactive; j++) { if (ggobi_data_is_missing(d, m, display->tcorr2.active_vars.els[j])) { draw_case = false; break; } } } break; case NULL_PMODE: case DEFAULT_PMODE: case EXTENDED_DISPLAY_PMODE: case N_PMODES: g_printerr ("Unexpected pmode value %d\n", proj); break; } return (draw_case); } static gboolean drawEdge (splotd * sp, gint m, GGobiData * d, GGobiData * e, ggobid * gg) { displayd *display = sp->displayptr; gboolean draw_edge = true; ProjectionMode proj = pmode_get (display, gg); switch (proj) { case P1PLOT: if (ggobi_data_is_missing(e, m, sp->p1dvar)) draw_edge = false; break; case XYPLOT: if (ggobi_data_is_missing(e, m, sp->xyvars.x)) draw_edge = false; else if (ggobi_data_is_missing(e, m, sp->xyvars.y)) draw_edge = false; break; case TOUR1D: if (ggobi_data_is_missing(e, m, sp->displayptr->t1d.active_vars.els[m])) draw_edge = false; break; case TOUR2D3: if (ggobi_data_is_missing(e, m, sp->displayptr->t2d3.active_vars.els[m])) draw_edge = false; break; case TOUR2D: if (ggobi_data_is_missing(e, m, sp->displayptr->t2d.active_vars.els[m])) draw_edge = false; break; case COTOUR: if (ggobi_data_is_missing(e, m, sp->displayptr->tcorr1.active_vars.els[m])) draw_edge = false; else if (ggobi_data_is_missing(e, m, sp->displayptr->tcorr2.active_vars.els[m])) draw_edge = false; break; case NULL_PMODE: case DEFAULT_PMODE: case EXTENDED_DISPLAY_PMODE: case N_PMODES: g_printerr ("Unexpected pmode value %d\n", proj); break; } return (draw_edge); } void scatter1DAddPlotLabels (splotd * sp, GdkDrawable * drawable, GdkGC * gc) { PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (sp->da), NULL); PangoRectangle rect; GGobiData *d = sp->displayptr->d; layout_text (layout, ggobi_data_get_transformed_col_name(d, sp->p1dvar), &rect); gdk_draw_layout (drawable, gc, sp->max.x / 2 - rect.width / 2, sp->max.y - rect.height - 5, layout); g_object_unref (G_OBJECT (layout)); } void scatterXYAddPlotLabels (splotd * sp, GdkDrawable * drawable, GdkGC * gc) { PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (sp->da), NULL); PangoRectangle rect; GGobiData *d = sp->displayptr->d; /*-- xyplot: right justify the label --*/ layout_text (layout, ggobi_data_get_transformed_col_name(d, sp->xyvars.x), &rect); gdk_draw_layout (drawable, gc, sp->max.x - rect.width - 5, sp->max.y - rect.height - 5, layout); layout_text (layout, ggobi_data_get_transformed_col_name(d, sp->xyvars.y), &rect); gdk_draw_layout (drawable, gc, 5, 5, layout); g_object_unref (G_OBJECT (layout)); } static void addPlotLabels (splotd * sp, GdkDrawable * drawable, ggobid * gg) { /* Same as scatmat... */ cpaneld *cpanel = &(sp->displayptr->cpanel); if (cpanel->pmode == XYPLOT) scatterXYAddPlotLabels (sp, drawable, gg->plot_GC); else if (cpanel->pmode == P1PLOT) scatter1DAddPlotLabels (sp, drawable, gg->plot_GC); } static void withinDrawToUnbinned (splotd * sp, gint m, GdkDrawable * drawable, GdkGC * gc) { displayd *display = sp->displayptr; cpaneld *cpanel = &display->cpanel; ProjectionMode proj = cpanel->pmode; icoords *baseline; /*-- add ash baseline to p1d or tour1d --*/ if ((proj == TOUR1D && cpanel->t1d.ASH_add_lines_p) || (proj == P1PLOT && cpanel->p1d.type == ASH && cpanel->p1d.ASH_add_lines_p)) { baseline = (proj == TOUR1D) ? &sp->tour1d.ash_baseline : &sp->p1d.ash_baseline; if (display->p1d_orientation == HORIZONTAL) gdk_draw_line (drawable, gc, sp->screen[m].x, sp->screen[m].y, sp->screen[m].x, baseline->y); else gdk_draw_line (drawable, gc, sp->screen[m].x, sp->screen[m].y, baseline->x, sp->screen[m].y); } } void addMarkupCues (splotd * sp, GdkDrawable * drawable, ggobid * gg) { /* See splot_add_markup_to_pixmap */ displayd *display = sp->displayptr; GGobiData *e = display->e; if (e) if (display->options.edges_undirected_show_p || display->options.edges_arrowheads_show_p || display->options.edges_directed_show_p) if (e->nearest_point != -1) splot_add_identify_edge_cues (sp, drawable, e->nearest_point, true, gg); } void addScalingCues (splotd * sp, GdkDrawable * drawable, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; if (!cpanel->scale.updateAlways_p) { if (gg->buttondown) gdk_draw_line (drawable, gg->plot_GC, sp->mousedownpos.x, sp->mousedownpos.y, sp->mousepos.x, sp->mousepos.y); } } static void splotAssignPointsToBins (GGobiData * d, splotd * sp, ggobid * gg) { if (sp == gg->current_splot) /* whether binning permitted or not */ assign_points_to_bins (d, sp, gg); } static void splotScreenToTform (cpaneld * cpanel, splotd * sp, icoords * scr, fcoords * tfd, ggobid * gg) { gcoords planar, world; greal precis = (greal) PRECISION1; greal ftmp, max, min, rdiff; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gfloat scale_x, scale_y; vartabled *vt, *vtx, *vty; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; /* * screen to plane */ planar.x = (scr->x - sp->max.x / 2) * precis / sp->iscale.x; planar.x += sp->pmid.x; planar.y = (scr->y - sp->max.y / 2) * precis / sp->iscale.y; planar.y += sp->pmid.y; /* * plane to world */ switch (cpanel->pmode) { case P1PLOT: vt = vartable_element_get (sp->p1dvar, d); max = vt->lim.max; min = vt->lim.min; rdiff = max - min; if (display->p1d_orientation == HORIZONTAL) { /* x */ world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; } else { /* y */ world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } break; case XYPLOT: /* x */ vtx = vartable_element_get (sp->xyvars.x, d); max = vtx->lim.max; min = vtx->lim.min; rdiff = max - min; world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; /* y */ vty = vartable_element_get (sp->xyvars.y, d); max = vty->lim.max; min = vty->lim.min; rdiff = max - min; world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; break; default: break; } } void scatterplotDisplayClassInit (GGobiScatterplotDisplayClass * klass) { klass->parent_class.createWithVars = scatterplot_new_with_vars; klass->parent_class.create = scatterplot_new; klass->parent_class.supports_edges_p = true; klass->parent_class.show_edges_p = true; klass->parent_class.binningPermitted = binningPermitted; klass->parent_class.cpanel_set = cpanelSet; klass->parent_class.display_set = displaySet; klass->parent_class.mode_ui_get = scatterplot_mode_ui_get; klass->parent_class.handles_projection = handlesProjection; klass->parent_class.handles_interaction = handlesInteraction; klass->parent_class.variable_plotted_p = plotted; klass->parent_class.varpanel_tooltips_set = varpanelTooltipsReset; klass->parent_class.plotted_vars_get = plottedVarsGet; klass->parent_class.titleLabel = "Scatterplot Display"; klass->parent_class.treeLabel = "Scatterplot"; klass->parent_class.ruler_ranges_set = ruler_ranges_set; #ifdef STORE_SESSION_ENABLED klass->parent_class.xml_describe = add_xml_scatterplot_variables; #endif klass->parent_class.varpanel_highd = varpanelHighd; klass->parent_class.varpanel_refresh = varpanelRefresh; klass->parent_class.variable_select = variableSelect; klass->parent_class.pmode_set = pmodeSet; klass->parent_class.splot_key_event_handled = scatterplotKeyEventHandled; klass->parent_class.move_points_motion_cb = scatterplotMovePointsMotionCb; klass->parent_class.move_points_button_cb = scatterplotMovePointsButtonCb; klass->parent_class.tour1d_realloc = tour1dRealloc; klass->parent_class.tour2d3_realloc = tour2d3Realloc; klass->parent_class.tour2d_realloc = tour2dRealloc; klass->parent_class.tourcorr_realloc = tourCorrRealloc; #ifdef STORE_SESSION_ENABLED klass->parent_class.xml_describe = add_xml_scatterplot_variables; #endif klass->parent_class.set_show_axes_option = setShowAxesOption; klass->parent_class.set_show_axes_label_option = setShowAxesLabelOption; klass->parent_class.set_show_axes_values_option = setShowAxesValuesOption; /* XXX duncan and dfs: you need to sort this out klass->parent_class.world_to_raw = worldToRaw; */ klass->parent_class.select_X = selectXVar; klass->parent_class.varcircle_draw = varcircleDraw; } static gint splotVariablesGet (splotd * sp, gint * cols, GGobiData * d) { cols[0] = sp->xyvars.x; cols[1] = sp->xyvars.y; return (2); } void scatterSPlotClassInit (GGobiScatterSPlotClass * klass) { klass->parent_class.within_draw_to_unbinned = withinDrawToUnbinned; klass->parent_class.tree_label = treeLabel; /* reverse pipeline */ klass->parent_class.screen_to_tform = splotScreenToTform; klass->parent_class.sub_plane_to_screen = subPlaneToScreen; klass->parent_class.world_to_plane = worldToPlane; klass->parent_class.draw_case_p = drawCase; klass->parent_class.draw_edge_p = drawEdge; klass->parent_class.add_plot_labels = addPlotLabels; klass->parent_class.within_draw_to_unbinned = withinDrawToUnbinned; klass->parent_class.add_markup_cues = addMarkupCues; klass->parent_class.add_scaling_cues = addScalingCues; klass->parent_class.splot_assign_points_to_bins = splotAssignPointsToBins; klass->parent_class.plotted_vars_get = splotVariablesGet; } ggobi-2.1.12/src/ggobi-renderer-factory.c0000644000175000017500000001157414651527764013671 /* Generated by GOB (v2.0.18) (do not edit directly) */ /* End world hunger, donate to the World Food Programme, http://www.wfp.org */ #define GOB_VERSION_MAJOR 2 #define GOB_VERSION_MINOR 0 #define GOB_VERSION_PATCHLEVEL 18 #define selfp (self->_priv) #include /* memset() */ #include "ggobi-renderer-factory.h" #ifdef G_LIKELY #define ___GOB_LIKELY(expr) G_LIKELY(expr) #define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr) #else /* ! G_LIKELY */ #define ___GOB_LIKELY(expr) (expr) #define ___GOB_UNLIKELY(expr) (expr) #endif /* G_LIKELY */ #line 4 "renderer-factory.gob" #include #if GTK_CHECK_VERSION(2,8,0) #include "ggobi-renderer-cairo.h" #else #define GGOBI_TYPE_RENDERER_CAIRO GGOBI_TYPE_RENDERER #endif #line 33 "ggobi-renderer-factory.c" /* self casting macros */ #define SELF(x) GGOBI_RENDERER_FACTORY(x) #define SELF_CONST(x) GGOBI_RENDERER_FACTORY_CONST(x) #define IS_SELF(x) GGOBI_IS_RENDERER_FACTORY(x) #define TYPE_SELF GGOBI_TYPE_RENDERER_FACTORY #define SELF_CLASS(x) GGOBI_RENDERER_FACTORY_CLASS(x) #define SELF_GET_CLASS(x) GGOBI_RENDERER_FACTORY_GET_CLASS(x) /* self typedefs */ typedef GGobiRendererFactory Self; typedef GGobiRendererFactoryClass SelfClass; /* here are local prototypes */ #line 1 "renderer-factory.gob" static void ggobi_renderer_factory_init (GGobiRendererFactory * o) G_GNUC_UNUSED; #line 50 "ggobi-renderer-factory.c" #line 1 "renderer-factory.gob" static void ggobi_renderer_factory_class_init (GGobiRendererFactoryClass * c) G_GNUC_UNUSED; #line 53 "ggobi-renderer-factory.c" static GGobiRenderer * ___real_ggobi_renderer_factory_create (GGobiRendererFactory * self, GdkDrawable * parent); /* pointer to the class of our parent */ static GObjectClass *parent_class = NULL; /* Short form macros */ #define self_new ggobi_renderer_factory_new #define self_create ggobi_renderer_factory_create GType ggobi_renderer_factory_get_type (void) { static GType type = 0; if ___GOB_UNLIKELY(type == 0) { static const GTypeInfo info = { sizeof (GGobiRendererFactoryClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) ggobi_renderer_factory_class_init, (GClassFinalizeFunc) NULL, NULL /* class_data */, sizeof (GGobiRendererFactory), 0 /* n_preallocs */, (GInstanceInitFunc) ggobi_renderer_factory_init, NULL }; type = g_type_register_static (G_TYPE_OBJECT, "GGobiRendererFactory", &info, (GTypeFlags)0); } return type; } /* a macro for creating a new object of our type */ #define GET_NEW ((GGobiRendererFactory *)g_object_new(ggobi_renderer_factory_get_type(), NULL)) /* a function for creating a new object of our type */ #include static GGobiRendererFactory * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED; static GGobiRendererFactory * GET_NEW_VARG (const char *first, ...) { GGobiRendererFactory *ret; va_list ap; va_start (ap, first); ret = (GGobiRendererFactory *)g_object_new_valist (ggobi_renderer_factory_get_type (), first, ap); va_end (ap); return ret; } static void ggobi_renderer_factory_init (GGobiRendererFactory * o G_GNUC_UNUSED) { #define __GOB_FUNCTION__ "GGobi:Renderer:Factory::init" } #undef __GOB_FUNCTION__ static void ggobi_renderer_factory_class_init (GGobiRendererFactoryClass * c G_GNUC_UNUSED) { #define __GOB_FUNCTION__ "GGobi:Renderer:Factory::class_init" parent_class = g_type_class_ref (G_TYPE_OBJECT); #line 20 "renderer-factory.gob" c->create = ___real_ggobi_renderer_factory_create; #line 119 "ggobi-renderer-factory.c" } #undef __GOB_FUNCTION__ #line 13 "renderer-factory.gob" GGobiRendererFactory * ggobi_renderer_factory_new (void) { #line 129 "ggobi-renderer-factory.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Factory::new" { #line 15 "renderer-factory.gob" GObject *obj = (GObject *)GET_NEW; return GGOBI_RENDERER_FACTORY(obj); }} #line 137 "ggobi-renderer-factory.c" #undef __GOB_FUNCTION__ #line 20 "renderer-factory.gob" GGobiRenderer * ggobi_renderer_factory_create (GGobiRendererFactory * self, GdkDrawable * parent) { #line 144 "ggobi-renderer-factory.c" GGobiRendererFactoryClass *klass; #line 20 "renderer-factory.gob" g_return_val_if_fail (self != NULL, (GGobiRenderer * )0); #line 20 "renderer-factory.gob" g_return_val_if_fail (GGOBI_IS_RENDERER_FACTORY (self), (GGobiRenderer * )0); #line 150 "ggobi-renderer-factory.c" klass = GGOBI_RENDERER_FACTORY_GET_CLASS(self); if(klass->create) return (*klass->create)(self,parent); else return (GGobiRenderer * )(0); } #line 20 "renderer-factory.gob" static GGobiRenderer * ___real_ggobi_renderer_factory_create (GGobiRendererFactory * self G_GNUC_UNUSED, GdkDrawable * parent) { #line 162 "ggobi-renderer-factory.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Factory::create" { #line 22 "renderer-factory.gob" GObject *obj = g_object_new(GGOBI_TYPE_RENDERER, "parent", parent, NULL); return GGOBI_RENDERER(obj); }} #line 170 "ggobi-renderer-factory.c" #undef __GOB_FUNCTION__ ggobi-2.1.12/src/read_xml.h0000644000175000017500000001423214651527764011123 /* read_xml.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef READ_XML_H #define READ_XML_H #include "vars.h" #include enum xmlDataState { TOP = 0, DATASET, DESCRIPTION, RECORD, RECORDS, VARIABLES, VARIABLE, COLORMAP, COLOR, REAL_VARIABLE, CATEGORICAL_VARIABLE, INTEGER_VARIABLE, COUNTER_VARIABLE, UNIFORM_VARIABLE, CATEGORICAL_LEVELS, CATEGORICAL_LEVEL, COLORSCHEME, BRUSHSTYLE, REAL, INTEGER, STRING, NA, QUICK_HELP, EDGES, EDGE, /* HELP, DESCRIPTION */ UNKNOWN }; typedef enum xmlDataState XmlTagType; typedef struct { int color; int glyphType; int glyphSize; int edgeWidth; /*-- this has no home in ggobi --*/ int hidden; } DataOptions; typedef struct _XMLUserData { enum xmlDataState state; gint current_variable; /* Indexes the current variable. */ gint current_record; /* Indexes the record we are currently working on. */ gint current_element; /* Indexes the values within a record. */ gint current_level; /* */ gint current_color; /* The index of the current element being processed in the colormap */ xmlChar *recordString; int recordStringLength; /* Flag that says we are reading color entries from another file via a * sub-parser. This allows us to reuse the same instance of user data * and the same handlers. */ gboolean reading_colormap_file_p; /* A boolean indicating whether the transformation name of a variable was stored as an attribute. */ gboolean variable_transform_name_as_attribute; /* The ggobi instance that is being initialized. */ ggobid *gg; InputDescription *input; /* The current data object to which new records are added. */ GGobiData *current_data; // The list of all datad's read. GSList *dlist; /* Flag indicating whether we should convert char arrays into null-terminated strings before passing them to the sub-handlers (e.g. setColorValue, setVariableName). */ gboolean terminateStrings_p; /* The datasets global missing value identifier. */ gchar *NA_identifier; /* The identifier for a missing value that is currently in effect. This might be specified per record and will be discarded at the end of that record. We could also do this columnwise. */ gchar *current_NA_identifier; /* A set of values that apply to records when an attribute is not specified for that specific record but is set in the ggobidata tag. */ DataOptions defaults; /* Local set of record identifiers that are used here for matching purposes when specifying edges. These are not set in the datad structure and are different from the record's label attribute. Currently these are used to verify that the id's are unique within a dataset. */ GHashTable *idNamesTable; GHashTable *idTable; gboolean usesStringIds; /* this is now unused; it's always true */ gint recordLabelsVariable; GHashTable **autoLevels; gint counterVariableIndex; /* Reference to the handlers being used as callbacks. Need this so that we can re-specify it when creating new sub-parsers. */ xmlSAXHandlerPtr handlers; /* The number of datasets to expect within the file. */ int expectedDatasetCount; xmlParserCtxtPtr parser; } XMLParserData; #ifdef __cplusplus extern "C" { #endif enum xmlDataState tagType(const xmlChar * name, gboolean endTag); gboolean newVariable(const xmlChar ** attrs, XMLParserData * data, const xmlChar * tagName); gboolean newEdgeVariable(const xmlChar ** attrs, XMLParserData * data); gboolean setDatasetInfo(const xmlChar ** attrs, XMLParserData * data); gboolean setGeneralInfo(const xmlChar ** attrs, XMLParserData * data); gboolean allocVariables(const xmlChar ** attrs, XMLParserData * data); gboolean newRecord(const xmlChar ** attrs, XMLParserData * data); gboolean setDataset(const xmlChar ** attrs, XMLParserData * parserData, enum xmlDataState); gboolean setBrushStyle(const xmlChar ** attrs, XMLParserData * parserData); gboolean setRecordValues(XMLParserData * data, const xmlChar * line, gint len, gint ncols); gboolean setVariableName(XMLParserData * data, const xmlChar * name, gint len); gboolean setDefaultDatasetValues(const xmlChar ** attrs, XMLParserData * data); const xmlChar *skipWhiteSpace(const xmlChar * ch, gint * len); const gchar *getAttribute(const xmlChar ** attrs, gchar * name); void xml_warning(const gchar * attribute, const gchar * value, const gchar * msg, XMLParserData * data); void initParserData(XMLParserData * data, xmlSAXHandlerPtr handler, ggobid * gg); gboolean setGlyph(const xmlChar ** attrs, XMLParserData * data, gint i); gboolean setColor(const xmlChar ** attrs, XMLParserData * data, gint i); void categoricalLevels(const xmlChar ** attrs, XMLParserData * data); int setLevelIndex(const xmlChar ** attrs, XMLParserData * data); void addLevel(XMLParserData * data, const char *c, int len); GSList * data_xml_read(InputDescription * desc, ggobid * gg); gboolean setHidden(const xmlChar ** attrs, XMLParserData * data, gint i); int asInteger(const gchar * tmp); double asNumber(const char *sval); gboolean asLogical(const gchar * sval); GGobiData *getCurrentXMLData(XMLParserData * parserData); gboolean readXMLRecord(const xmlChar ** attrs, XMLParserData * data); gchar * intern(XMLParserData *, const char * el); gboolean isXMLFile (const gchar * fileName, ggobid * gg, GGobiPluginInfo * info); #ifdef __cplusplus } #endif #endif ggobi-2.1.12/src/renderer-cairo.gob0000644000175000017500000002142414651527764012552 %a{ /* only use cairo when GTK+ 2.8.0 or higher installed */ #include #if GTK_CHECK_VERSION(2,8,0) %} %{ #include /* Takes 1/64 degrees to radians and reverses */ #define CAIRO_ANGLE(x) ((360 - (x/64.)) * M_PI / 180) /* millimeters per inch */ #define MM_PER_INCH 25.4 %} %h{ #include "ggobi-renderer.h" #include %} class GGobi:Renderer:Cairo from GGobi:Renderer { private cairo_t *cairo destroywith cairo_destroy; /* This should only be changed for "once off" operations like saving to a file or printing - set to NULL to reset to blank surface */ property POINTER cairo (nick = "cr", blurb = "The cairo context to which this renders", type = cairo_t *, flags = CONSTRUCT_ONLY, export) set { if (g_value_get_pointer(VAL)) { if (selfp->cairo) cairo_destroy(selfp->cairo); selfp->cairo = cairo_reference(g_value_get_pointer(VAL)); } } get { g_value_set_pointer(VAL, selfp->cairo); }; override (GGobi:Renderer) GdkDrawable * create_target(GGobi:Renderer *self, GdkDrawable *parent) { // FIXME: eventually we don't want to use the parent's drawable at all // -- we should override everything with cairo GdkDrawable *target = PARENT_HANDLER(self, parent); /* if we do not have a cairo context yet, try for a glitz (pbuffer) surface, otherwise fallback to image surface */ if (!SELF(self)->_priv->cairo) SELF(self)->_priv->cairo = self_create_cairo(SELF(self), target); return target; } private virtual cairo_t * create_cairo(self, GdkDrawable *target) { return gdk_cairo_create(target); } private void line_type(self, GdkGCValues *values) { cairo_line_cap_t cap = CAIRO_LINE_CAP_ROUND; cairo_line_join_t join = CAIRO_LINE_JOIN_ROUND; /*static double dashes[8]; gint i;*/ cairo_set_line_width(selfp->cairo, values->line_width+1); switch(values->cap_style) { case GDK_CAP_ROUND: cap = CAIRO_LINE_CAP_ROUND; break; case GDK_CAP_BUTT: case GDK_CAP_NOT_LAST: cap = CAIRO_LINE_CAP_BUTT; break; case GDK_CAP_PROJECTING: cap = CAIRO_LINE_CAP_SQUARE; break; } cairo_set_line_cap(selfp->cairo, cap); switch(values->join_style) { case GDK_JOIN_ROUND: join = CAIRO_LINE_JOIN_ROUND; break; case GDK_JOIN_MITER: join = CAIRO_LINE_JOIN_MITER; //cairo_set_miter_limit(selfp->cairo, gc->lmitre); break; case GDK_JOIN_BEVEL: join = CAIRO_LINE_JOIN_BEVEL; break; } cairo_set_line_join(selfp->cairo, join); // FIXME: Don't know how to get the dashes out of the GdkGC // Perhaps we could extend GdkGC /* for(i = 0; i < 8 && gc->lty & 15; i++) { dashes[i] = gc->lty & 15; gc->lty = gc->lty >> 4; } cairo_set_dash(cr, dashes, i, 0);*/ } private void stroke(self, GdkGC *gc, gboolean filled) { GdkColor color; GdkGCValues values; GdkColormap *colors = gdk_gc_get_colormap(gc); gdk_gc_get_values(gc, &values); gdk_colormap_query_color(colors, values.foreground.pixel, &color); //g_debug("color: %d %d %d", color.red, color.green, color.blue); gdk_cairo_set_source_color(selfp->cairo, &color); if (filled) cairo_fill_preserve(selfp->cairo); self_line_type(self, &values); cairo_stroke(selfp->cairo); } private void polypath(self, guint npoints, GdkPoint *points) { gint i; cairo_move_to(selfp->cairo, points[0].x, points[0].y); for (i = 1; i < npoints; i++) cairo_line_to(selfp->cairo, points[i].x, points[i].y); } override (Gdk:Drawable) void draw_rectangle (GdkDrawable *self, GdkGC *gc, gboolean filled, gint x, gint y, gint width, gint height) { //g_debug("drawing rect: %d %d %d %d", x, y, width, height); cairo_rectangle(SELF(self)->_priv->cairo, x, y, width, height); self_stroke(SELF(self), gc, filled); } override (Gdk:Drawable) void draw_arc(GdkDrawable *self, GdkGC *gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2) { //cairo_move_to(cr, x+r, y); cairo_t *cr = SELF(self)->_priv->cairo; cairo_save(cr); cairo_translate (cr, x + width / 2., y + height / 2.); cairo_scale (cr, (width / 2.), (height / 2.)); //g_debug("drawing arc from: %f to %f", CAIRO_ANGLE(angle2), CAIRO_ANGLE(angle1)); cairo_arc_negative (cr, 0., 0., 1., CAIRO_ANGLE(angle1), CAIRO_ANGLE(angle2)); self_stroke(SELF(self), gc, filled); cairo_restore(cr); } override (Gdk:Drawable) void draw_polygon(GdkDrawable *self, GdkGC *gc, gboolean filled, GdkPoint *points, gint npoints) { //g_debug("POLYGON"); self_polypath(SELF(self), npoints, points); cairo_close_path(SELF(self)->_priv->cairo); self_stroke(SELF(self), gc, filled); } override (Gdk:Drawable) void draw_points(GdkDrawable *self, GdkGC *gc, GdkPoint *points, gint npoints) { guint i; //g_debug("POINTS"); cairo_t *cr = SELF(self)->_priv->cairo; for (i = 0; i < npoints; i++) cairo_rectangle(cr, points[i].x - 0.5, points[i].y - 0.5, 1., 1.); self_stroke(SELF(self), gc, FALSE); } override (Gdk:Drawable) void draw_segments(GdkDrawable *self, GdkGC *gc, GdkSegment *segs, gint nsegs) { guint i; //g_debug("SEGMENTS"); cairo_t *cr = SELF(self)->_priv->cairo; for (i = 0; i < nsegs; i++) { cairo_move_to(cr, segs[i].x1, segs[i].y1); cairo_line_to(cr, segs[i].x2, segs[i].y2); } self_stroke(SELF(self), gc, FALSE); } override (Gdk:Drawable) void draw_lines(GdkDrawable *self, GdkGC *gc, GdkPoint *points, gint npoints) { self_polypath(SELF(self), npoints, points); self_stroke(SELF(self), gc, FALSE); } override (Gdk:Drawable) void draw_trapezoids(GdkDrawable *self, GdkGC *gc, GdkTrapezoid *trapezoids, gint n_trapezoids) { guint i; cairo_t *cr = SELF(self)->_priv->cairo; for (i = 0; i < n_trapezoids; i++) { cairo_move_to(cr, trapezoids[i].x11, trapezoids[i].y1); cairo_line_to(cr, trapezoids[i].x21, trapezoids[i].y1); cairo_line_to(cr, trapezoids[i].x22, trapezoids[i].y2); cairo_line_to(cr, trapezoids[i].x12, trapezoids[i].y2); cairo_line_to(cr, trapezoids[i].x11, trapezoids[i].y1); } self_stroke(SELF(self), gc, FALSE); } /* we do not support the old GDK text stuff (yet) */ override (Gdk:Drawable) void draw_text(GdkDrawable *self, GdkFont *font, GdkGC *gc, gint x, gint y, const gchar *text, gint text_length) { } override (Gdk:Drawable) void draw_text_wc(GdkDrawable *self, GdkFont *font, GdkGC *gc, gint x, gint y, const GdkWChar *text, gint text_length) { } /* here is the modern pango stuff */ override (Gdk:Drawable) void draw_glyphs(GdkDrawable *self, GdkGC *gc, PangoFont *font, gint x, gint y, PangoGlyphString *glyphs) { cairo_move_to(SELF(self)->_priv->cairo, x, y); pango_cairo_show_glyph_string(SELF(self)->_priv->cairo, font, glyphs); } override (Gdk:Drawable) void draw_glyphs_transformed(GdkDrawable *self, GdkGC *gc, PangoMatrix *matrix, PangoFont *font, gint x, gint y, PangoGlyphString *glyphs) { cairo_t *cr = SELF(self)->_priv->cairo; cairo_matrix_t cr_matrix = { matrix->xx, matrix->xy, matrix->yx, matrix->yy, matrix->x0, matrix->y0 }; cairo_save(cr); cairo_set_matrix(cr, &cr_matrix); GDK_DRAWABLE_GET_CLASS(self)->draw_glyphs(self, gc, font, x, y, glyphs); cairo_restore(cr); } override (Gdk:Drawable) void draw_drawable(GdkDrawable *self, GdkGC *gc, GdkDrawable *src, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) { cairo_t *cr = SELF(self)->_priv->cairo; cairo_surface_t *surf = GDK_DRAWABLE_GET_CLASS(src)->ref_cairo_surface(src); cairo_set_source_surface(cr, surf, xdest - xsrc, ydest - ysrc); cairo_save(cr); cairo_rectangle(cr, xdest, ydest, width, height); cairo_clip(cr); cairo_paint(cr); cairo_restore(cr); } override (Gdk:Drawable) GdkDrawable* get_composite_drawable(GdkDrawable *self, gint x, gint y, gint width, gint height, gint *composite_x_offset, gint *composite_y_offset) { GdkDrawable *parent, *composite; cairo_t *cr; g_object_get(G_OBJECT(self), "parent", &parent, NULL); composite = gdk_pixmap_new(parent, width, height, -1); cr = gdk_cairo_create(composite); cairo_set_source_surface(cr, cairo_get_target(SELF(self)->_priv->cairo), -1*x, -1*y); cairo_paint(cr); cairo_destroy(cr); *composite_x_offset = 0; *composite_y_offset = 0; return composite; } override (Gdk:Drawable) cairo_surface_t * ref_cairo_surface(GdkDrawable *self) { return cairo_surface_reference(cairo_get_target(SELF(self)->_priv->cairo)); } } %a{ #endif %} ggobi-2.1.12/src/brush_ui.c0000644000175000017500000004615114651527764011150 /* brush_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * Code pertaining to the control panel for brushing. */ #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" void brush_update_set (gboolean update, displayd * dsp, ggobid * gg) { dsp->cpanel.br.updateAlways_p = update; } void brush_on_set (gboolean brushon, displayd * dsp, ggobid * gg) { dsp->cpanel.br.brush_on_p = brushon; splot_redraw (gg->current_splot, QUICK, gg); } static void brush_undo_cb (GtkToggleButton * button, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; splotd *sp = gg->current_splot; displayd *display = sp->displayptr; GGobiData *d = display->d; GGobiData *e = display->e; if (cpanel->br.point_targets) brush_undo (sp, d, gg); if (cpanel->br.edge_targets) brush_undo (sp, e, gg); /*-- when rows_in_plot changes ... --*/ rows_in_plot_set (d, gg); if (GGOBI_IS_EXTENDED_SPLOT (sp)) { void (*f) (GGobiData *, splotd *, ggobid *); GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); f = klass->splot_assign_points_to_bins; if (f) { f (d, sp, gg); // need to exclude area plots } } clusters_set (d, gg); /*-- --*/ if (gg->cluster_ui.window != NULL) cluster_table_update (d, gg); displays_plot (NULL, FULL, gg); } static gchar *point_targets_lbl[] = { "Off", "Color and glyph", "Color only", "Glyph only", "Shadow", "Unshadow" }; static void brush_point_targets_cb (GtkWidget * w, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; if (cpanel->br.mode == BR_TRANSIENT) reinit_transient_brushing (gg->current_display, gg); cpanel->br.point_targets = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); /* binning not permitted here */ brush_once_and_redraw (false, gg->current_splot, gg->current_display, gg); } static gchar *edge_targets_lbl[] = { "Off", "Color and line", "Color only", "Line only", "Shadow", "Unshadow" }; static void brush_edge_targets_cb (GtkWidget * w, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; if (cpanel->br.mode == BR_TRANSIENT) reinit_transient_brushing (gg->current_display, gg); cpanel->br.edge_targets = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); /* binning not permitted here */ brush_once_and_redraw (false, gg->current_splot, gg->current_display, gg); } void brush_mode_set (gint mode, splotd * sp, displayd * display, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; gint prev_mode = cpanel->br.mode; cpanel->br.mode = mode; if (mode == BR_PERSISTENT && mode != prev_mode) { brush_once (false, sp, gg); } display_plot (display, QUICK, gg); } static void brush_mode_cb (GtkWidget * w, ggobid * gg) { splotd *sp = gg->current_splot; brush_mode_set (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)), sp, gg->current_display, gg); } static void open_symbol_window_cb (GtkWidget * w, ggobid * gg) { make_symbol_window (gg); } void brush_reset (displayd * display, gint action) { gint i, k; ggobid *gg = display->ggobi; GGobiData *d = display->d; GGobiData *e = display->e; cpaneld *cpanel = &display->cpanel; g_assert (d->hidden.nels == d->nrows); if (e) g_assert (e->hidden.nels == e->nrows); switch (action) { case RESET_EXCLUDE_SHADOW_POINTS: /*-- exclude all shadowed points --*/ include_hiddens (false, d, gg); break; case RESET_INCLUDE_SHADOW_POINTS: /*-- include all shadowed points --*/ include_hiddens (true, d, gg); break; case RESET_UNSHADOW_POINTS: /*-- un-hide all points --*/ for (i = 0; i < d->nrows; i++) d->hidden.els[i] = d->hidden_now.els[i] = false; rows_in_plot_set (d, gg); /*-- code borrowed from exclusion_ui.c, the 'show' routine --*/ clusters_set (d, gg); cluster_table_labels_update (d, gg); rows_in_plot_set (d, gg); tform_to_world (d, gg); displays_tailpipe (FULL, gg); /*-- --*/ break; /* * Ambiguity: If an edge is connected to a shadowed point, it's * drawn in shadow -- yet it isn't "hidden", so it doesn't respond * to this operation. -- dfs */ case RESET_EXCLUDE_SHADOW_EDGES: /*-- exclude all shadowed edges --*/ if (e) include_hiddens (false, e, gg); break; case RESET_INCLUDE_SHADOW_EDGES: /*-- include all shadowed edges --*/ if (e) include_hiddens (true, e, gg); break; case RESET_UNSHADOW_EDGES: /*-- un-hide all edges --*/ if (e != NULL) { for (k = 0; k < e->edge.n; k++) e->hidden_now.els[k] = e->hidden.els[k] = false; rows_in_plot_set (e, gg); /*-- code borrowed from exclusion_ui.c, the 'show' routine --*/ clusters_set (e, gg); cluster_table_labels_update (e, gg); rows_in_plot_set (e, gg); tform_to_world (e, gg); displays_tailpipe (FULL, gg); /*-- --*/ } break; case RESET_INIT_BRUSH: /*-- reset brush size --*/ brush_pos_init (gg->current_splot); if (cpanel->br.mode == BR_TRANSIENT) { reinit_transient_brushing (display, gg); displays_plot (NULL, FULL, gg); } else { splot_redraw (gg->current_splot, QUICK, gg); } break; case RESET_POINT_COLORS: /*-- reset point colors -- to what? --*/ case RESET_POINT_GLYPHS: /*-- reset point glyphs -- to what? --*/ case RESET_EDGE_COLORS: /*-- reset edge colors -- to what? --*/ case RESET_EDGE_TYPES: /*-- reset edge colors -- to what? --*/ break; } } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ #include static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &gg->current_display->cpanel; if (!sp || !gg || !cpanel) return false; /*-- handle the keys for setting the mode and launching generic events --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ /* Persistent/transient */ if ((event->state & GDK_MOD1_MASK) == GDK_MOD1_MASK) { if (event->keyval == GDK_t || event->keyval == GDK_T) { brush_mode_set (BR_TRANSIENT, sp, gg->current_display, gg); return true; } else if (event->keyval == GDK_p || event->keyval == GDK_P) { brush_mode_set (BR_PERSISTENT, sp, gg->current_display, gg); return true; } } return false; } static gint motion_notify_cb (GtkWidget * w, GdkEventMotion * event, cpaneld * cpanel) { gboolean button1_p, button2_p; ggobid *gg = GGobiFromWidget (w, true); splotd *sp = gg->current_splot; /*-- get the mouse position and find out which buttons are pressed --*/ mousepos_get_motion (w, event, &button1_p, &button2_p, sp); if (button1_p || button2_p) { gboolean changed; changed = brush_motion (&sp->mousepos, button1_p, button2_p, cpanel, sp, gg); /*XXX Like this to be emitted from the display. Or what about the splotd? or perhaps both the ggobi and the splotd? or perhaps only on scatterSPlotds And we might store the signal ids in the class itself. */ #if TEST_BRUSH_MOTION_CB fprintf (stderr, "emiting brush motion signal (w) %p (gg) %p (sp) %p (event) %p\n", (void *) w, (void *) gg, (void *) sp, (void *) event); fflush (stderr); #endif /*XX is this the correct source object? */ /*if (changed)*/ /* MFL: emit signal whenever brush moves */ g_signal_emit (G_OBJECT (gg), GGobiSignals[BRUSH_MOTION_SIGNAL], 0, sp, event, sp->displayptr->d); } return true; } /*-- response to the mouse click event --*/ static gint button_press_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { displayd *display; cpaneld *cpanel; gboolean retval = true; gboolean button1_p, button2_p; ggobid *gg = GGobiFromSPlot (sp); GGobiData *d, *e; if (!sp || !gg) return false; gg->current_splot = sp->displayptr->current_splot = sp; gg->current_display = sp->displayptr; display = gg->current_display; cpanel = &display->cpanel; d = display->d; e = display->e; brush_prev_vectors_update (d, gg); if (e != NULL) brush_prev_vectors_update (e, gg); mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (motion_notify_cb), (gpointer) cpanel); brush_set_pos ((gint) sp->mousepos.x, (gint) sp->mousepos.y, sp); /* * We might need to make certain that the current splot is * redrawn without binning, in case some other plot is also in * transient brushing. */ if (cpanel->br.brush_on_p) { brush_once_and_redraw (false, sp, display, gg); /* no binning */ } else { splot_redraw (sp, QUICK, gg); } /*-- --*/ return retval; } static gint button_release_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { displayd *display = (displayd *) sp->displayptr; ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &display->cpanel; GGobiData *d = display->d; gboolean retval = true; GdkModifierType state; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); gg->buttondown = 0; disconnect_motion_signal (sp); gdk_pointer_ungrab (event->time); /*-- grabbed in mousepos_get_pressed --*/ if (cpanel->br.mode == BR_PERSISTENT) { //rows_in_plot_set (d, gg); if (GGOBI_IS_EXTENDED_SPLOT (sp)) { void (*f) (GGobiData *, splotd *, ggobid *); GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); f = klass->splot_assign_points_to_bins; if (f) { f (d, sp, gg); // need to exclude area plots } } /*-- reset the number and properties of the brush groups --*/ clusters_set (d, gg); /* ?? * g_signal_emit (GTK_OBJECT (gg->main_window), * gg->signal_symbols_changed, gg); */ /*-- If we've also been brushing an edge set, set its clusters --*/ /* if (display->e != NULL && cpanel->br.edge_targets != br_off) { clusters_set(display->e, gg); } */ /*-- If we've been brushing by variable, set everybody's clusters --*/ /*if (cpanel->br_linkby == BR_LINKBYVAR) { */ /* * Since any datad might be linked to this one, reset * everybody's clusters until more elaborate tests are * necessary. */ { GSList *l; GGobiData *dd; for (l = gg->d; l; l = l->next) { dd = (GGobiData *) l->data; if (dd != d) { clusters_set (dd, gg); } } } /*-- this updates the tables for every datad --*/ cluster_table_update (d, gg); } /*-- if we're only doing linked brushing on mouse up, do it now --*/ if (!cpanel->br.updateAlways_p) displays_plot (sp, FULL, gg); return retval; } /*--------------------------------------------------------------------*/ /* Add and remove event handlers */ /*--------------------------------------------------------------------*/ void brush_event_handlers_toggle (splotd * sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window), "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK (button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK (button_release_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); } } /*--------------------------------------------------------------------*/ /* Resetting the main menubar */ /*--------------------------------------------------------------------*/ GtkWidget *create_linkby_notebook (GtkWidget *, ggobid *); void cpanel_brush_make (ggobid * gg) { modepaneld *panel; GtkWidget *btn, *hb; GtkWidget *option_menu, *check_btn; GtkWidget *vb, *lbl; GtkWidget *notebook; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup (GGOBI (getIModeName) (BRUSH)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /*-- button: open symbol panel --*/ btn = gtk_button_new_with_mnemonic ("_Choose color & glyph..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for choosing color and glyph", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (open_symbol_window_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); /* hbox to hold the Persistent checkbox and the Undo button */ hb = gtk_hbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), hb, false, false, 0); /*-- check button: persistent/transient --*/ /*-- this was an option menu but was changed to allow accelerators in GTK2 */ check_btn = gtk_check_button_new_with_mnemonic ("_Persistent"); gtk_widget_set_name (check_btn, "BRUSH:mode_check_btn"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), check_btn, "Persistent or transient brushing", NULL); g_signal_connect (G_OBJECT (check_btn), "clicked", G_CALLBACK (brush_mode_cb), gg); gtk_box_pack_start (GTK_BOX (hb), check_btn, false, false, 0); /* initialize transient */ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_btn), false); btn = gtk_button_new_from_stock (GTK_STOCK_UNDO); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Undo the most recent persistent brushing changes, from button down to button up", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, true, 0); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (brush_undo_cb), gg); /*-- option menu: brush with color/glyph/both --*/ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Poi_nt brushing:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); option_menu = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), option_menu); gtk_widget_set_name (option_menu, "BRUSH:point_targets_option_menu"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), option_menu, "Brushing points: what characteristics, if any, should respond?", NULL); gtk_box_pack_start (GTK_BOX (vb), option_menu, false, false, 0); populate_combo_box (option_menu, point_targets_lbl, G_N_ELEMENTS (point_targets_lbl), NULL, NULL); /*-- initial value: both --*/ /* defer signal registration until after setting the active option */ gtk_combo_box_set_active (GTK_COMBO_BOX (option_menu), 1); g_signal_connect (G_OBJECT (option_menu), "changed", G_CALLBACK (brush_point_targets_cb), gg); /*-- new, for edges --*/ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Edge brushing:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); /*-- option menu: Off, color&line, color only, ... --*/ option_menu = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), option_menu); gtk_widget_set_name (option_menu, "BRUSH:edge_targets_option_menu"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), option_menu, "Brushing edges: what characteristics, if any, should respond?", NULL); gtk_box_pack_start (GTK_BOX (vb), option_menu, false, false, 0); populate_combo_box (option_menu, edge_targets_lbl, G_N_ELEMENTS (edge_targets_lbl), G_CALLBACK (brush_edge_targets_cb), gg); /*-- Define the linking rule --*/ notebook = create_linkby_notebook (panel->w, gg); gtk_widget_set_name (notebook, "BRUSH:linkby_notebook"); /* btn = gtk_check_button_new_with_mnemonic("_Brush on"); gtk_widget_set_name(btn, "BRUSH:brush_on_button"); gtk_tooltips_set_tip(GTK_TOOLTIPS(gg->tips), btn, "Make the brush active or inactive. Drag the left button to brush and the right or middle button to resize the brush.", NULL); g_signal_connect(G_OBJECT(btn), "toggled", G_CALLBACK(brush_on_cb), (gpointer) gg); gtk_box_pack_start(GTK_BOX(panel->w), btn, false, false, 0); */ gtk_widget_show_all (panel->w); } /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ void cpanel_brush_init (cpaneld * cpanel, ggobid * gg) { cpanel->br.brush_on_p = true; cpanel->br.updateAlways_p = true; cpanel->br.mode = BR_TRANSIENT; cpanel->br.linkby_row = 0; /*-- point brushing on, edge brushing off --*/ cpanel->br.point_targets = br_candg; cpanel->br.edge_targets = br_off; } void cpanel_brush_set (displayd * display, cpaneld * cpanel, ggobid * gg) { GtkWidget *w; GtkWidget *pnl = mode_panel_get_by_name (GGOBI (getIModeName) (BRUSH), gg); if (pnl == (GtkWidget *) NULL) return; w = widget_find_by_name (pnl, "BRUSH:mode_check_btn"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), !cpanel->br.mode); /* Open the correct page in the linking rule notebook */ w = widget_find_by_name (pnl, "BRUSH:linkby_notebook"); linkby_current_page_set (display, w, gg); w = widget_find_by_name (pnl, "BRUSH:point_targets_option_menu"); gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->br.point_targets); w = widget_find_by_name (pnl, "BRUSH:edge_targets_option_menu"); gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->br.edge_targets); } /*--------------------------------------------------------------------*/ ggobi-2.1.12/src/impute.c0000644000175000017500000001614514651527764010633 /* impute.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include "vars.h" #include "externs.h" gboolean impute_fixed (ImputeType impute_type, gfloat val, gint nvars, gint * vars, GGobiData * d, ggobid * gg) { gint i, j, k, m; gfloat maxval, minval, range, impval = 0; gboolean ok = true; vartabled *vt; if (impute_type == IMP_ABOVE || impute_type == IMP_BELOW) { gdouble drand; for (k = 0; k < nvars; k++) { gdouble jmult; j = vars[k]; vt = vartable_element_get (j, d); /* Use find the limits of the non-missing data */ minval = vt->lim_display.min; maxval = vt->lim_display.max; range = maxval - minval; /* Then fill it in */ if (impute_type == IMP_ABOVE) { impval = maxval + (val / 100.) * range; jmult = (impval - maxval) * .2; /* using 20% of the space */ } else { impval = minval - (val / 100.) * range; jmult = (minval - impval) * .2; } for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if (ggobi_data_is_missing(d, m, j)) { drand = randvalue (); drand = (drand - .5) * jmult; d->raw.vals[m][j] = d->tform.vals[m][j] = impval + (gfloat) drand; } } } } else if (impute_type == IMP_FIXED) { for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; for (k = 0; k < nvars; k++) { j = vars[k]; if (ggobi_data_is_missing(d, m, j)) { d->raw.vals[m][j] = d->tform.vals[m][j] = val; } } } } return ok; } gboolean impute_mean_or_median (gint type, gint nvars, gint * vars, GGobiData * d, ggobid * gg) { gint i, j, k, m, n; gint np, nmissing; greal sum, val; greal *x; gint *missv; vartabled *vt; gboolean redraw = false; if (!ggobi_data_has_missings(d)) return false; /* If responding to brushing group ... */ if (gg->impute.bgroup_p && d->nclusters > 1) { missv = (gint *) g_malloc (d->nrows_in_plot * sizeof (gint)); x = (greal *) g_malloc (d->nrows_in_plot * sizeof (greal)); /* Loop over the number of brushing groups */ for (n = 0; n < d->nclusters; n++) { /* Then loop over the number of columns */ for (m = 0; m < nvars; m++) { np = nmissing = 0; j = vars[m]; sum = 0; /* * And finally over the rows, including only those rows * which belong to the current cluster */ for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; if (d->clusterid.els[k] == n) { if (!d->hidden_now.els[k]) { /* ignore erased values */ if (ggobi_data_is_missing(d, k, j)) missv[nmissing++] = k; else { sum += d->tform.vals[k][j]; /* for mean */ x[np++] = d->tform.vals[k][j]; /* for median */ } } } } if (np && nmissing) { if (gg->impute.type == IMP_MEAN) { val = sum / (greal) np; } else { // if (gg->impute.type == IMP_MEDIAN) { qsort ((void *) x, np, sizeof (gfloat), fcompare); val = ((np % 2) != 0) ? x[(np - 1) / 2] : (x[np / 2 - 1] + x[np / 2]) / 2.; } for (i = 0; i < nmissing; i++) d->raw.vals[missv[i]][j] = d->tform.vals[missv[i]][j] = val; } } } g_free (missv); g_free (x); redraw = true; } else { for (m = 0; m < nvars; m++) { j = vars[m]; vt = vartable_element_get (j, d); for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; if (!d->hidden_now.els[k]) { /* ignore erased values altogether */ if (ggobi_data_is_missing(d, k, j)) { d->raw.vals[k][j] = d->tform.vals[k][j] = (type == IMP_MEAN) ? vt->mean : vt->median; redraw = true; } } } } } return redraw; } static void impute_single (gint * missv, gint nmissing, gint * presv, gint npresent, gint col, GGobiData * d, ggobid * gg) { gint i, k; gfloat rrand; /* * Then loop over the missing values, plugging in some value * drawn from the present values. */ for (i = 0; i < nmissing; i++) { for (k = 0; k < npresent; k++) { rrand = (gfloat) randvalue (); if (((npresent - k) * rrand) < 1.0) { d->raw.vals[missv[i]][col] = d->raw.vals[presv[k]][col]; /* * This is the default -- transformations will be applied * later to those that need it. */ d->tform.vals[missv[i]][col] = d->tform.vals[presv[k]][col]; break; } } } } void impute_random (GGobiData * d, gint nvars, gint * vars, ggobid * gg) { /* Perform single random imputation */ gint i, j, k, n, m, npresent, *presv, nmissing, *missv; if (!ggobi_data_has_missings(d)) return; presv = (gint *) g_malloc (d->nrows_in_plot * sizeof (gint)); missv = (gint *) g_malloc (d->nrows_in_plot * sizeof (gint)); if (gg->impute.bgroup_p && d->nclusters > 1) { /* Loop over the number of brushing groups */ for (n = 0; n < d->nclusters; n++) { /* Then loop over the number of columns */ for (m = 0; m < nvars; m++) { npresent = nmissing = 0; j = vars[m]; /* * And finally over the rows, including only those rows * which belong to the current cluster */ for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; if (d->clusterid.els[k] == n) { if (!d->hidden_now.els[k]) { /* ignore erased values altogether */ if (ggobi_data_is_missing(d, k, j)) missv[nmissing++] = k; else presv[npresent++] = k; } } } impute_single (missv, nmissing, presv, npresent, j, d, gg); } } } else { for (m = 0; m < nvars; m++) { npresent = nmissing = 0; j = vars[m]; /* * Build the vector of indices of present values that can be used * to draw from. */ for (i = 0; i < d->nrows_in_plot; i++) { k = d->rows_in_plot.els[i]; if (!d->hidden_now.els[k]) { /* ignore erased values altogether */ if (ggobi_data_is_missing(d, k, j)) missv[nmissing++] = k; else presv[npresent++] = k; } } impute_single (missv, nmissing, presv, npresent, j, d, gg); } } g_free (presv); g_free (missv); } ggobi-2.1.12/src/Makefile.am0000644000175000017500000000714614651527764011221 lib_LTLIBRARIES = libggobi.la libggobi_la_GOBS = data.gob renderer.gob renderer-factory.gob renderer-cairo.gob libggobi_la_GOBSOURCES = $(libggobi_la_GOBS:%.gob=ggobi-%.c) libggobi_la_GOBHEADERS = $(libggobi_la_GOBS:%.gob=ggobi-%.h) libggobi_la_GOBOBJECTS = $(libggobi_la_GOBS:%.gob=ggobi-%.lo) libggobi_la_GOBSTAMPS = $(libggobi_la_GOBS:%.gob=.%.gob.stamp) libggobi_la_LDFLAGS = @GTK_LIBS@ @GMODULE_LIBS@ @LIBXML_LIBS@ -lm libggobi_la_BUILT = array.c ash1d.c barchart.c barchartClass.c \ barchart_ui.c brush.c brush_api.c brush_bins.c brush_init.c brush_link.c \ brush_ui.c color.c color_ui.c cpanel.c display.c display_tree.c display_ui.c \ edges.c exclusion.c exclusion_ui.c extendedDisplay.c fileio.c ggobi-API.c \ ggobi.c GGobiAppClass.c ggobiClass.c identify.c identify_ui.c \ impute.c impute_ui.c io.c jitter.c jitter_ui.c limits.c lineedit.c \ lineedit_ui.c main_ui.c make_ggobi.c marshal.c menus.c missing.c \ movepts.c movepts_ui.c noop-toggle.c p1d.c p1d_ui.c parcoords.c \ parcoordsClass.c parcoords_ui.c plugin.c pipeline.c ppcorr_ui.c print.c \ read_init.c read_color.c read_csv.c read_xml.c scale_api.c scale_drag.c \ scale_ui.c scatmat.c scatmatClass.c scatmat_ui.c scatterplot.c \ scatterplotClass.c scatterplot_ui.c schemes.c schemes_ui.c sphere.c \ sphere_ui.c splash.c splot.c sp_plot.c sp_plot_axes.c sp_plot_edges.c \ subset.c subset_ui.c svd.c texture.c timeplot.c time_ui.c tour.c tour1d.c \ tour1d_pp.c tour1d_pp_ui.c tour1d_ui.c tour2d.c tour2d3.c tour2d3_ui.c \ tour2d_pp.c tour2d_pp_ui.c tour2d_ui.c tourcorr.c tourcorr_ui.c tour_pp.c \ transform.c transform_ui.c tsdisplay.c tsPlot.c utils.c utils_gdk.c \ utils_pango.c utils_ui.c varchange.c varcircles.c varpanel_ui.c vartable.c \ vartable_nbook.c vartable_ui.c vector.c win32_draw.c writedata_ui.c \ write_csv.c write_xml.c wvis.c wvis_ui.c xlines.c xyplot.c \ xyplot_ui.c $(libggobi_la_GOBSOURCES) libggobi_la_SOURCES = $(libggobi_la_BUILT) $(libggobi_la_GOBSTAMPS) libggobi_la_LIBADD = $(libggobi_la_GOBOBJECTS) libggobi_la_DEPENDENCIES = $(libggobi_la_GOBOBJECTS) pkginclude_HEADERS = GGobiAPI.h ggobiClass.h tour1d_pp.h GGobiApp.h \ noop-toggle.h tour2d_pp.h GGobiEvents.h parcoordsClass.h tour_pp.h \ barchartDisplay.h plugin.h tsPlot.h brushing.h print.h tsdisplay.h \ colorscheme.h read_csv.h types.h config.h read_init.h vars.h cpanel.h \ read_xml.h varseldata.h defines.h scatmatClass.h vartable.h display.h \ scatterplotClass.h display_tree.h splash.h write_xml.h ggobi-intl.h \ externs.h splot.h writedata.h fileio.h testEvents.h ggobi.h tour.h \ $(libggobi_la_GOBHEADERS) GGStructSizes.c marshal.h BUILT_SOURCES = $(libggobi_la_GOBSTAMPS) $(libggobi_la_GOBSOURCES) $(libggobi_la_GOBHEADERS) MAINTAINERCLEANFILES = $(BUILT_SOURCES) #$(libggobi_la_GOBSOURCES): $(libggobi_la_GOBSOURCES:ggobi-%.c=%.gob) # @GOB2@ --no-touch $(patsubst ggobi-%.c,%.gob,$@) .%.gob.stamp: %.gob @GOB2@ --no-touch --no-private-header $< @touch $@ bin_PROGRAMS = ggobi ggobi_SOURCES = ggobiMain.c ggobi_LDADD = libggobi.la INCLUDES = @SRC_DEBUG@ @GTK_CFLAGS@ @GMODULE_CFLAGS@ @LIBXML_CFLAGS@ EXTRA_DIST = $(libggobi_la_GOBS) # Windows specific if OS_WIN32 libggobi_la_DEPENDENCIES+=libggobi.def libggobi_la_LDFLAGS+=-Wc,-s -no-undefined -export-symbols libggobi.def ggobi_LDFLAGS = -mwindows -s endif # The .def file is autogenerated now from all symbols, until we clean up # ggobi to the point where we can actually maintain the .def file. libggobi.def: $(libggobi_la_BUILT:%.c=.libs/%.o) echo EXPORTS > $@ nm -g --defined-only $(libggobi_la_BUILT:%.c=.libs/%.o) > tmp sed -n '/^........ [T|C] _/s/^........ [T|C] _/ /p' tmp >> $@ rm tmp ggobi-2.1.12/src/brush_bins.c0000644000175000017500000000774314651527764011472 /* brush_bins.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * Routines for dealing with the use of "binning" of the current_splot * drawing area to optimize brushing speed */ #include #include "vars.h" #include "externs.h" void assign_points_to_bins (GGobiData * d, splotd * sp, ggobid * gg) { gint i, k, ih, iv; /* * Reset bin counts to zero -- but don't bother to free any space. */ for (ih = 0; ih < d->brush.nbins; ih++) for (iv = 0; iv < d->brush.nbins; iv++) d->brush.binarray[ih][iv].nels = 0; for (k = 0; k < d->nrows_in_plot; k++) { i = d->rows_in_plot.els[k]; if (sp->screen[i].x >= 0 && sp->screen[i].x <= sp->max.x && sp->screen[i].y >= 0 && sp->screen[i].y <= sp->max.y) { if (point_in_which_bin (sp->screen[i].x, sp->screen[i].y, &ih, &iv, d, sp)) { /* See whether it's necessary to allocate more space for elements */ if (d->brush.binarray[ih][iv].nels == d->brush.binarray[ih][iv].nblocks * BINBLOCKSIZE) { d->brush.binarray[ih][iv].nblocks += 1; d->brush.binarray[ih][iv].els = (gulong *) g_realloc ((gpointer) d->brush.binarray[ih][iv].els, d->brush.binarray[ih][iv].nblocks * BINBLOCKSIZE * sizeof (gulong)); } /* * brush.binarray contains the index of rows_in_plot[] rather * than the contents, so the assignment is k rather than i */ d->brush.binarray[ih][iv].els[d->brush.binarray[ih][iv].nels] = (gulong) k; d->brush.binarray[ih][iv].nels += 1; } } } } void get_extended_brush_corners (icoords * bin0, icoords * bin1, GGobiData * d, splotd * sp) { brush_coords *brush = &sp->brush_pos; brush_coords *obrush = &sp->brush_pos_o; gint x1 = MIN (brush->x1, brush->x2); gint y1 = MIN (brush->y1, brush->y2); gint x2 = MAX (brush->x1, brush->x2); gint y2 = MAX (brush->y1, brush->y2); gint ox1, oy1, ox2, oy2; ox1 = MIN (obrush->x1, obrush->x2); oy1 = MIN (obrush->y1, obrush->y2); ox2 = MAX (obrush->x1, obrush->x2); oy2 = MAX (obrush->y1, obrush->y2); /* * What bins contain the brush and the previous brush? Allow * extension for safety, using BRUSH_MARGIN. */ if (!point_in_which_bin (MIN (x1, ox1) - 2 * BRUSH_MARGIN, MIN (y1, oy1) - 2 * BRUSH_MARGIN, &bin0->x, &bin0->y, d, sp)) { bin0->x = MAX (bin0->x, 0); bin0->x = MIN (bin0->x, d->brush.nbins - 1); bin0->y = MAX (bin0->y, 0); bin0->y = MIN (bin0->y, d->brush.nbins - 1); } if (!point_in_which_bin (MAX (x2, ox2) + 2 * BRUSH_MARGIN, MAX (y2, oy2) + 2 * BRUSH_MARGIN, &bin1->x, &bin1->y, d, sp)) { bin1->x = MAX (bin1->x, 0); bin1->x = MIN (bin1->x, d->brush.nbins - 1); bin1->y = MAX (bin1->y, 0); bin1->y = MIN (bin1->y, d->brush.nbins - 1); } obrush->x1 = brush->x1; obrush->y1 = brush->y1; obrush->x2 = brush->x2; obrush->y2 = brush->y2; } gboolean point_in_which_bin (gint x, gint y, gint * ih, gint * iv, GGobiData * d, splotd * sp) { gboolean inwindow = true; *ih = (gint) ((gfloat) d->brush.nbins * (gfloat) x / (sp->max.x + 1.0)); *iv = (gint) ((gfloat) d->brush.nbins * (gfloat) y / (sp->max.y + 1.0)); if (*ih < 0 || *ih > d->brush.nbins - 1 || *iv < 0 || *iv > d->brush.nbins - 1) { inwindow = false; } return (inwindow); } ggobi-2.1.12/src/scatmat_ui.c0000644000175000017500000000437514651527764011463 /* scatmat_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifdef USE_STRINGS_H #include #endif #include #include #include "vars.h" #include "externs.h" /*------------------------------------------------------------------------*/ /* Control panel */ /*------------------------------------------------------------------------*/ GtkWidget * cpanel_scatmat_make (ggobid * gg) { modepaneld *panel; panel = (modepaneld *) g_malloc (sizeof (modepaneld)); gg->control_panels = g_list_append (gg->control_panels, (gpointer) panel); panel->name = g_strdup ("SCATMAT"); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); gtk_widget_show_all (panel->w); return panel->w; } /*------------------------------------------------------------------------*/ /* Resetting the main menubar */ /*------------------------------------------------------------------------*/ static const gchar *mode_ui_str = "" " " " " " " " " " " " " " " " " " " ""; const gchar * scatmat_mode_ui_get (displayd * display) { return (mode_ui_str); } /*--------------------------------------------------------------------*/ /* Control panel updating */ /*--------------------------------------------------------------------*/ /*-- there already exists scatmat_cpanel_init --*/ void cpanel_scatmat_set (displayd * display, cpaneld * cpanel, ggobid * gg) { } ggobi-2.1.12/src/barchart_ui.c0000644000175000017500000003371314651527764011613 /* barchart_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of barchart and histogram code: Heike Hofmann */ #include #include #include "vars.h" #include "externs.h" static gchar *display_mode_lbl[] = { "Bars", "Spines" }; static gboolean barchart_scale (gboolean button1_p, gboolean button2_p, splotd * sp); void barchart_set_initials (splotd * sp, GGobiData * d); void barchart_allocate_structure (splotd * sp, GGobiData * d); extern void barchart_set_breakpoints (gfloat width, splotd * sp, GGobiData * d); static void display_mode_cb (GtkWidget * w, ggobid * gg) { cpaneld *cpanel = &gg->current_display->cpanel; barchartSPlotd *sp = GGOBI_BARCHART_SPLOT (gg->current_splot); displayd *display = gg->current_display; cpanel->barchart_display_mode = gtk_combo_box_get_active (GTK_COMBO_BOX (w)); sp->bar->is_spine = !sp->bar->is_spine; scatterplot_show_vrule (display, !sp->bar->is_spine); } /*--------------------------------------------------------------------*/ /* Control panel section */ /*--------------------------------------------------------------------*/ GtkWidget * cpanel_barchart_make (ggobid * gg) { GtkWidget *vb, *lbl, *opt; GtkWidget *panel; panel = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel), 5); /* * option menu: selection mode */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("Display _mode:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); //opt = gtk_option_menu_new(); opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget (GTK_LABEL (lbl), opt); gtk_widget_set_name (opt, "BARCHART:display_mode_option_menu"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "switch between height (bars) and width (spines) to represent count", NULL); gtk_box_pack_start (GTK_BOX (vb), opt, false, false, 0); populate_combo_box (opt, display_mode_lbl, G_N_ELEMENTS (display_mode_lbl), G_CALLBACK (display_mode_cb), gg); gtk_widget_show_all (panel); return (panel); } /*--------------------------------------------------------------------*/ /* Resetting the main menubar */ /*--------------------------------------------------------------------*/ static const gchar *mode_ui_str = "" " " /*" " " " " " " "*/ " " " " " " #if BARCHART_SCALE " " #endif " " " " " " " " ""; const gchar * barchart_mode_ui_get (displayd * display) { return (mode_ui_str); } /*--------------------------------------------------------------------*/ /* End of main menubar section */ /*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/ /* Control panel updating */ /*--------------------------------------------------------------------*/ /*-- there already exists barchart_cpanel_init --*/ void cpanel_barchart_set (displayd * display, cpaneld * cpanel, GtkWidget * panel, ggobid * gg) { GtkWidget *w; w = widget_find_by_name (panel, "BARCHART:display_mode_option_menu"); gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->barchart_display_mode); } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget * w, GdkEventKey * event, splotd * sp) { ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &gg->current_display->cpanel; gboolean reallocate = FALSE; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; vartabled *vtx; barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); vtx = vartable_element_get (sp->p1dvar, d); /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ switch (event->keyval) { case GDK_plus: if (vtx->vartype != categorical) { bsp->bar->new_nbins = bsp->bar->nbins + 1; reallocate = TRUE; } break; case GDK_minus: if (vtx->vartype != categorical) { if (bsp->bar->nbins > 2) { bsp->bar->new_nbins = bsp->bar->nbins - 1; reallocate = TRUE; } } break; } if (reallocate) { displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; ggobid *gg = GGobiFromSPlot (sp); barchart_allocate_structure (sp, d); barchart_set_initials (sp, d); barchart_recalc_counts (GGOBI_BARCHART_SPLOT (sp), d, gg); sp->redraw_style = FULL; splot_redraw (sp, sp->redraw_style, gg); return true; } return false; } static gint button_release_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); GdkModifierType state; disconnect_motion_signal (sp); gg->buttondown = 0; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); gdk_pointer_ungrab (event->time); /* * When the mouse comes up, return to the default cursor. If it's * actually still inside one of the triangular regions, it will * be restored to the special cursor as soon as the mouse moves. * If we want to be really precise, we can check the regions here, too. */ splot_cursor_unset (sp); return retval; } static gint mouse_motion_notify_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp) { gboolean button1_p, button2_p; barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); /*-- get the mouse position and find out which buttons are pressed --*/ mousepos_get_motion (w, event, &button1_p, &button2_p, sp); /*-- I'm not sure this could ever happen --*/ if (sp->mousepos.x == sp->mousepos_o.x && sp->mousepos.y == sp->mousepos_o.y) return false; if (bsp->bar->is_histogram) { GdkRegion *region; gboolean cursor_set = FALSE; /* This should be determined by when the button is pressed, and * not re-decided while the button is moving -- dfs */ region = gdk_region_polygon (bsp->bar->anchor_rgn, 3, GDK_WINDING_RULE); if (gdk_region_point_in (region, sp->mousepos.x, sp->mousepos.y)) { splot_cursor_set (GDK_HAND2, sp); cursor_set = TRUE; } gdk_region_destroy (region); region = gdk_region_polygon (bsp->bar->offset_rgn, 3, GDK_WINDING_RULE); if (gdk_region_point_in (region, sp->mousepos.x, sp->mousepos.y)) { splot_cursor_set (GDK_BOTTOM_SIDE, sp); cursor_set = TRUE; } gdk_region_destroy (region); /* If all buttons are up and we're outside the triangular regions, restore the cursor to the default. */ if (!button1_p && !button2_p && !cursor_set && sp->jcursor) { splot_cursor_unset (sp); } } if (button1_p || button2_p) { barchart_scale (button1_p, button2_p, sp); } sp->mousepos_o.x = sp->mousepos.x; sp->mousepos_o.y = sp->mousepos.y; return true; } /* Reset bin width or anchor point */ gboolean barchart_scale (gboolean button1_p, gboolean button2_p, splotd * sp) { displayd *display = sp->displayptr; ggobid *gg = GGobiFromSPlot (sp); cpaneld *cpanel = &display->cpanel; barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); GGobiData *d = display->d; GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); /*-- I'm not sure this could ever happen --*/ if (sp->mousepos.x == sp->mousepos_o.x && sp->mousepos.y == sp->mousepos_o.y) return false; if (bsp->bar->is_histogram && (bsp->bar->anchor_drag || bsp->bar->width_drag)) { gint idy = sp->mousepos.y - sp->mousepos_o.y; greal dy = (greal) idy; fcoords pts1, pts2; if (bsp->bar->anchor_drag) { gfloat scale_y; icoords scr; if (idy != 0) { gboolean set_anchor = TRUE; gfloat offset_old = bsp->bar->offset; gint pmid_old = sp->pmid.y; scr.x = scr.y = 0; scale_y = sp->scale.y; scale_y /= 2; sp->iscale.y = (gfloat) sp->max.y * scale_y; klass->screen_to_tform (cpanel, sp, &scr, &pts1, gg); sp->pmid.y -= (dy * (greal) PRECISION1 / sp->iscale.y); klass->screen_to_tform (cpanel, sp, &scr, &pts2, gg); bsp->bar->offset += (pts1.y - pts2.y); /* moving the anchor more than one binwidth up or down doesn't make sense */ if (bsp->bar->offset > offset_old) { /* not too high */ set_anchor = (bsp->bar->offset < (bsp->bar->breaks[1] - bsp->bar->breaks[0])); } if (bsp->bar->offset < offset_old) { /* and not too low */ set_anchor = (bsp->bar->offset > -(bsp->bar->breaks[1] - bsp->bar->breaks[0])); } if (set_anchor) { barchart_recalc_counts (GGOBI_BARCHART_SPLOT (sp), d, gg); splot_redraw (sp, FULL, gg); } else { sp->pmid.y = pmid_old; bsp->bar->offset = offset_old; } } } else { /* if (bsp->bar->width_drag) */ if (idy != 0) { gfloat width, oldwidth; klass->screen_to_tform (cpanel, sp, &sp->mousepos_o, &pts1, gg); klass->screen_to_tform (cpanel, sp, &sp->mousepos, &pts2, gg); oldwidth = bsp->bar->breaks[1] - bsp->bar->breaks[0]; width = oldwidth - (pts1.y - pts2.y); if (width > 0.) { gboolean set_breaks = TRUE; gint pix_width = bsp->bar->bins[0].rect.y - bsp->bar->bins[1].rect.y; if (width > oldwidth) { set_breaks = bsp->bar->bins[0].rect.y > (sp->max.y / 2 + 1); /* not too big */ } if (width < oldwidth) { set_breaks = pix_width > 6; /* not too small */ } if (set_breaks) { barchart_set_breakpoints (width, sp, d); barchart_recalc_counts (GGOBI_BARCHART_SPLOT (sp), d, gg); splot_redraw (sp, FULL, gg); } } } } } else { /*-- we're not dragging the bars, only scaling --*/ #if BARCHART_SCALE if (button1_p) { pan_by_drag (sp, gg); } else if (button2_p) { zoom_by_drag (sp, gg); } /*-- redisplay this plot --*/ splot_plane_to_screen (display, &display->cpanel, sp, gg); // ruler_ranges_set (false, gg->current_display, sp, gg); splot_redraw (sp, FULL, gg); #endif } return true; } static gint button_press_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { gboolean retval = true; ggobid *gg = GGobiFromSPlot (sp); gboolean button1_p, button2_p; GdkRegion *region; barchartSPlotd *bsp = GGOBI_BARCHART_SPLOT (sp); mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); gg->current_splot = sp->displayptr->current_splot = sp; gg->current_display = (displayd *) sp->displayptr; if (bsp->bar->is_histogram) { bsp->bar->anchor_drag = FALSE; bsp->bar->width_drag = FALSE; region = gdk_region_polygon (bsp->bar->anchor_rgn, 3, GDK_WINDING_RULE); if (gdk_region_point_in (region, sp->mousepos.x, sp->mousepos.y)) { bsp->bar->anchor_drag = TRUE; } gdk_region_destroy (region); region = gdk_region_polygon (bsp->bar->offset_rgn, 3, GDK_WINDING_RULE); if (gdk_region_point_in (region, sp->mousepos.x, sp->mousepos.y)) { bsp->bar->width_drag = TRUE; } gdk_region_destroy (region); } sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (mouse_motion_notify_cb), (gpointer) sp); sp->mousepos_o.x = sp->mousepos.x; sp->mousepos_o.y = sp->mousepos.y; return retval; } void barchart_event_handlers_toggle (displayd * display, splotd * sp, gboolean state, ProjectionMode pmode, InteractionMode imode) { if (!GGOBI_IS_WINDOW_DISPLAY (display)) return; if (state == on) { GtkObject *winobj = GTK_OBJECT (GGOBI_WINDOW_DISPLAY (display)->window); /* Mode selection */ sp->key_press_id = g_signal_connect (winobj, "key_press_event", G_CALLBACK (key_press_cb), (gpointer) sp); /* Resetting bin width and anchor */ sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK (button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK (button_release_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); } } ggobi-2.1.12/src/scatmatClass.c0000644000175000017500000004256114651527764011753 /* scatmatClass.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "scatmatClass.h" #include #include #include #include #include "externs.h" static gboolean cpanelSet (displayd * dpy, cpaneld * cpanel, ggobid * gg) { cpanel_scatmat_set (dpy, cpanel, gg); cpanel_brush_set (dpy, cpanel, gg); cpanel_identify_set (dpy, cpanel, gg); return (true); } static void movePointsMotionCb (displayd * display, splotd * sp, GtkWidget * w, GdkEventMotion * event, ggobid * gg) { if (sp->p1dvar == -1) scatterplotMovePointsMotionCb (display, sp, w, event, gg); } static void movePointsButtonCb (displayd * display, splotd * sp, GtkWidget * w, GdkEventButton * event, ggobid * gg) { if (sp->p1dvar == -1) scatterplotMovePointsButtonCb (display, sp, w, event, gg); } /* XXX duncan and dfs: you need to sort this out static void worldToRaw(displayd *display, splotd *sp, gint pt, GGobiData *d, ggobid *gg) { if (sp->p1dvar == -1) { world_to_raw_by_var (pt, sp->xyvars.x, display, d, gg); world_to_raw_by_var (pt, sp->xyvars.y, display, d, gg); } } */ static gint variablePlottedP (displayd * display, gint * cols, gint ncols, GGobiData * d) { GList *l; gint j; splotd *sp; for (l = display->splots; l; l = l->next) { sp = (splotd *) l->data; for (j = 0; j < ncols; j++) { if (sp->p1dvar == -1) { if (sp->xyvars.x == cols[j]) { return (sp->xyvars.x); } if (sp->xyvars.y == cols[j]) { return (sp->xyvars.y); } } else if (sp->p1dvar == cols[j]) { return (sp->p1dvar); } } } return (-1); } static gboolean variableSelect (GtkWidget * w, displayd * dpy, splotd * sp, gint jvar, gint toggle, gint mouse, cpaneld * cpanel, ggobid * gg) { gint jvar_prev; return (scatmat_varsel_simple (cpanel, sp, jvar, &jvar_prev, gg)); } static void varpanelRefresh (displayd * display, splotd * sp, GGobiData * d) { gint j, n, *vars; ggobid *gg = GGobiFromDisplay (display); for (j = 0; j < d->ncols; j++) { varpanel_toggle_set_active (VARSEL_X, j, false, d); varpanel_toggle_set_active (VARSEL_Y, j, false, d); varpanel_widget_set_visible (VARSEL_Y, j, false, d); varpanel_toggle_set_active (VARSEL_Z, j, false, d); varpanel_widget_set_visible (VARSEL_Z, j, false, d); } vars = (gint *) g_malloc (d->ncols * sizeof (gint)); n = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->plotted_vars_get (display, vars, d, gg); for (j = 0; j < n; j++) varpanel_toggle_set_active (VARSEL_X, vars[j], true, d); g_free (vars); } static void varpanelTooltipsSet (displayd * display, ggobid * gg, GtkWidget * wx, GtkWidget * wy, GtkWidget * wz, GtkWidget * label) { gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), wx, "Toggle to append or delete; drag along the plot diagonal to reorder", NULL); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), label, "Toggle to append or delete; drag along the plot diagonal to reorder", NULL); } static gint plottedVarsGet (displayd * display, gint * vars, GGobiData * d, ggobid * gg) { GList *l; GtkTableChild *child; GtkWidget *da; splotd *sp; gint nvars = 0; /* First count the number of variables */ for (l = (GTK_TABLE (display->table))->children; l; l = l->next) { child = (GtkTableChild *) l->data; da = child->widget; sp = (splotd *) g_object_get_data (G_OBJECT (da), "splotd"); if (sp->p1dvar != -1) nvars += 1; } /* Then populate the vector of variables */ for (l = (GTK_TABLE (display->table))->children; l; l = l->next) { child = (GtkTableChild *) l->data; da = child->widget; sp = (splotd *) g_object_get_data (G_OBJECT (da), "splotd"); if (sp->p1dvar != -1) { vars[child->left_attach] = sp->p1dvar; } } return nvars; } displayd * createWithVars (gboolean use_window, gboolean missing_p, gint nvars, gint * vars, GGobiData * d, ggobid * gg) { return (GGOBI (newScatmat) (vars, vars, nvars, nvars, use_window, d, gg)); } #ifdef STORE_SESSION_ENABLED void add_xml_scatmat_variables (xmlNodePtr node, GList * plots, displayd * dpy) { splotd *plot = plots->data; int n, n1, i; n1 = g_list_length (plots); n = sqrt (n1); for (i = 0; i < n1; i += n) { plot = (splotd *) g_list_nth_data (plots, i); XML_addVariable (node, plot->xyvars.x, dpy->d); } } #endif static gboolean scatmatKeyEventHandled (GtkWidget * w, displayd * display, splotd * sp, GdkEventKey * event, ggobid * gg) { gboolean ok = true; ProjectionMode pmode = NULL_PMODE; InteractionMode imode = DEFAULT_IMODE; if (event->state == 0 || event->state == GDK_CONTROL_MASK) { switch (event->keyval) { case GDK_h: case GDK_H: pmode = EXTENDED_DISPLAY_PMODE; break; case GDK_s: case GDK_S: imode = SCALE; break; case GDK_b: case GDK_B: imode = BRUSH; break; case GDK_i: case GDK_I: imode = IDENT; break; default: ok = false; break; } if (ok) { GGOBI (full_viewmode_set) (pmode, imode, gg); } } else { ok = false; } return ok; } static void displaySet (displayd * display, ggobid * gg) { } static gboolean handlesInteraction (displayd * display, InteractionMode v) { return (v == SCALE || v == BRUSH || v == IDENT || /*v == MOVEPTS || */ v == DEFAULT_IMODE); } /*-------------------------------------------------------------------*/ /*--------------- Drag and Drop -------------------------------------*/ /*-------------------------------------------------------------------*/ void start_scatmat_drag (GtkWidget * src, GdkDragContext * ctxt, GtkSelectionData * data, guint info, guint time, gpointer udata) { gtk_selection_data_set (data, data->target, 8, (guchar *) src, sizeof (splotd *)); } void receive_scatmat_drag (GtkWidget * src, GdkDragContext * context, int x, int y, const GtkSelectionData * data, unsigned int info, unsigned int event_time, gpointer * udata) { splotd *to = GGOBI_SPLOT (src), *from, *sp; displayd *display; GList *l; gint k, n, sprow, spcol; GtkWidget *da; GtkTableChild *child; GList *ivars = NULL; gint nvars, *vars; GGobiData *d; ggobid *gg; display = to->displayptr; d = display->d; gg = GGobiFromDisplay (display); from = GGOBI_SPLOT (gtk_drag_get_source_widget (context)); if (from->displayptr != display) { gg_write_to_statusbar ("the source and destination of the scatterplots are not from the same display.\n", display->ggobi); return; } /* Require symmetry, and require drag and drop motions in which either the row or the column is held constant -- actually, start by requiring that both plots be along the diagonal. */ if (from->p1dvar != -1 && to->p1dvar != -1) { vars = (gint *) g_malloc (d->ncols * sizeof (gint)); nvars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (display)->plotted_vars_get (display, vars, d, gg); /* Easier to do this with a linked list, perhaps */ for (n = 0; n < nvars; n++) ivars = g_list_append (ivars, GINT_TO_POINTER (vars[n])); /* Find the index of the to element */ k = g_list_index (ivars, GINT_TO_POINTER (to->p1dvar)); /* Remove the from element */ ivars = g_list_remove (ivars, GINT_TO_POINTER (from->p1dvar)); /* Insert the from element in the position of the to element */ ivars = g_list_insert (ivars, GINT_TO_POINTER (from->p1dvar), k); /* Loop through the plots setting the values of xyvars and p1dvar */ for (l = (GTK_TABLE (display->table))->children; l; l = l->next) { child = (GtkTableChild *) l->data; da = child->widget; sp = (splotd *) g_object_get_data (G_OBJECT (da), "splotd"); sprow = child->top_attach; /* 0, ..., nrows-1 */ spcol = child->left_attach; /* 0, ..., ncols-1 */ if (sprow == spcol) { sp->p1dvar = GPOINTER_TO_INT (g_list_nth_data (ivars, sprow)); } else { sp->p1dvar = -1; sp->xyvars.x = GPOINTER_TO_INT (g_list_nth_data (ivars, spcol)); sp->xyvars.y = GPOINTER_TO_INT (g_list_nth_data (ivars, sprow)); } } display_tailpipe (display, FULL, display->ggobi); varpanel_refresh (display, display->ggobi); g_free (vars); } } void scatmatPlotDragAndDropEnable (splotd * sp, gboolean active) { static GtkTargetEntry target = { "text/plain", GTK_TARGET_SAME_APP, 1001 }; if (active) { gtk_drag_source_set (GTK_WIDGET (sp), GDK_BUTTON1_MASK, &target, 1, GDK_ACTION_COPY); g_signal_connect (G_OBJECT (sp), "drag_data_get", G_CALLBACK (start_scatmat_drag), NULL); gtk_drag_dest_set (GTK_WIDGET (sp), GTK_DEST_DEFAULT_ALL /* DROP */ , &target, 1, GDK_ACTION_COPY /*MOVE*/); g_signal_connect (G_OBJECT (sp), "drag_data_received", G_CALLBACK (receive_scatmat_drag), NULL); } else { g_signal_handlers_disconnect_by_func (G_OBJECT (sp), G_CALLBACK (start_scatmat_drag), NULL); g_signal_handlers_disconnect_by_func (G_OBJECT (sp), G_CALLBACK (receive_scatmat_drag), NULL); gtk_drag_source_unset (GTK_WIDGET (sp)); gtk_drag_dest_unset (GTK_WIDGET (sp)); } } void scatmatDragAndDropEnable (displayd * dsp, gboolean active) { GList *l; for (l = dsp->splots; l; l = l->next) { splotd *sp = (splotd *) l->data; if (sp->p1dvar != -1) scatmatPlotDragAndDropEnable (sp, active); } } gboolean scatmatEventHandlersToggle (displayd * dpy, splotd * sp, gboolean state, ProjectionMode pmode, InteractionMode imode) { scatmatDragAndDropEnable (dpy, false); switch (imode) { case DEFAULT_IMODE: switch (sp->p1dvar) { case -1: xyplot_event_handlers_toggle (sp, state); break; default: p1d_event_handlers_toggle (sp, state); } scatmatDragAndDropEnable (dpy, true); break; case SCALE: scale_event_handlers_toggle (sp, state); break; case BRUSH: brush_event_handlers_toggle (sp, state); break; case IDENT: identify_event_handlers_toggle (sp, state); break; default: break; } return (false); } /*-------------------------------------------------------------------*/ static GtkWidget * scatmatCPanelWidget (displayd * dpy, gchar ** modeName, ggobid * gg) { GtkWidget *w = GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget; if (!w) { GGOBI_EXTENDED_DISPLAY (dpy)->cpanelWidget = w = cpanel_scatmat_make (gg); } *modeName = "Scatterplot Matrix"; return (w); } static void splotAssignPointsToBins (GGobiData * d, splotd * sp, ggobid * gg) { if (sp == gg->current_splot) assign_points_to_bins (d, sp, gg); } static void splotScreenToTform (cpaneld * cpanel, splotd * sp, icoords * scr, fcoords * tfd, ggobid * gg) { gcoords planar, world; greal precis = (greal) PRECISION1; greal ftmp, max, min, rdiff; displayd *display = (displayd *) sp->displayptr; GGobiData *d = display->d; gfloat scale_x, scale_y; vartabled *vt, *vtx, *vty; scale_x = sp->scale.x; scale_y = sp->scale.y; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; /* * screen to plane */ planar.x = (scr->x - sp->max.x / 2) * precis / sp->iscale.x; planar.x += sp->pmid.x; planar.y = (scr->y - sp->max.y / 2) * precis / sp->iscale.y; planar.y += sp->pmid.y; /* * plane to world */ if (sp->p1dvar != -1) { vt = vartable_element_get (sp->p1dvar, d); max = vt->lim.max; min = vt->lim.min; rdiff = max - min; if (display->p1d_orientation == HORIZONTAL) { /* x */ world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; } else { /* y */ world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } } else { /* x */ vtx = vartable_element_get (sp->xyvars.x, d); max = vtx->lim.max; min = vtx->lim.min; rdiff = max - min; world.x = planar.x; ftmp = world.x / precis; tfd->x = (ftmp + 1.0) * .5 * rdiff; tfd->x += min; /* y */ vty = vartable_element_get (sp->xyvars.y, d); max = vty->lim.max; min = vty->lim.min; rdiff = max - min; world.y = planar.y; ftmp = world.y / precis; tfd->y = (ftmp + 1.0) * .5 * rdiff; tfd->y += min; } } void scatmatDisplayClassInit (GGobiScatmatDisplayClass * klass) { klass->parent_class.show_edges_p = true; klass->parent_class.treeLabel = klass->parent_class.titleLabel = "Scatterplot Matrix"; klass->parent_class.cpanel_set = cpanelSet; klass->parent_class.imode_control_box = scatmatCPanelWidget; #ifdef STORE_SESSION_ENABLED klass->parent_class.xml_describe = add_xml_scatmat_variables; #endif klass->parent_class.move_points_motion_cb = movePointsMotionCb; klass->parent_class.move_points_button_cb = movePointsButtonCb; /* XXX duncan and dfs: you need to sort this out klass->parent_class.world_to_raw = worldToRaw; */ klass->parent_class.variable_plotted_p = variablePlottedP; klass->parent_class.variable_select = variableSelect; klass->parent_class.varpanel_refresh = varpanelRefresh; klass->parent_class.varpanel_tooltips_set = varpanelTooltipsSet; klass->parent_class.plotted_vars_get = plottedVarsGet; klass->parent_class.createWithVars = createWithVars; klass->parent_class.display_set = displaySet; klass->parent_class.mode_ui_get = scatmat_mode_ui_get; klass->parent_class.handles_interaction = handlesInteraction; klass->parent_class.event_handlers_toggle = scatmatEventHandlersToggle; klass->parent_class.splot_key_event_handled = scatmatKeyEventHandled; } /* */ static gchar * treeLabel (splotd * splot, GGobiData * d, ggobid * gg) { return (g_strdup_printf("%s v %s", ggobi_data_get_col_name(d, splot->xyvars.x), ggobi_data_get_col_name(d, splot->xyvars.y) )); } static void worldToPlane (splotd * sp, GGobiData * d, ggobid * gg) { if (sp->p1dvar == -1) xy_reproject (sp, d->world.vals, d, gg); else p1d_reproject (sp, d->world.vals, d, gg); } static void addIdentifyCues (gboolean nearest_p, gint k, splotd * sp, GdkDrawable * drawable, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; if (nearest_p) splot_add_diamond_cue (k, sp, drawable, gg); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); splot_add_point_label (nearest_p, k, false, sp, drawable, gg); } gboolean drawEdgeP (splotd * sp, gint m, GGobiData * d, GGobiData * e, ggobid * gg) { gboolean draw_edge = true; if (sp->p1dvar != -1) { if (ggobi_data_is_missing(e, m, sp->p1dvar)) draw_edge = false; } else { if (ggobi_data_is_missing(e, m, sp->xyvars.x) || ggobi_data_is_missing(e, m, sp->xyvars.y)) { draw_edge = false; } } return (draw_edge); } gboolean drawCaseP (splotd * sp, gint m, GGobiData * d, ggobid * gg) { gboolean draw_case = true; if (sp->p1dvar != -1) { if (ggobi_data_is_missing(d, m, sp->p1dvar)) draw_case = false; } else { if (ggobi_data_is_missing(d, m, sp->xyvars.x) || ggobi_data_is_missing(d, m, sp->xyvars.y)) { draw_case = false; } } return (draw_case); } void addPlotLabels (splotd * sp, GdkDrawable * drawable, ggobid * gg) { if (sp->p1dvar == -1) scatterXYAddPlotLabels (sp, drawable, gg->plot_GC); else { /*-- 1dplot: center the label --*/ scatter1DAddPlotLabels (sp, drawable, gg->plot_GC); } } static gint splotVariablesGet (splotd * sp, gint * cols, GGobiData * d) { if (sp->p1dvar > -1) { cols[0] = sp->p1dvar; return (1); } else { cols[0] = sp->xyvars.x; cols[1] = sp->xyvars.y; return (2); } } void scatmatSPlotClassInit (GGobiScatmatSPlotClass * klass) { klass->parent_class.tree_label = treeLabel; /* reverse pipeline */ klass->parent_class.screen_to_tform = splotScreenToTform; klass->parent_class.world_to_plane = worldToPlane; klass->parent_class.draw_case_p = drawCaseP; klass->parent_class.draw_edge_p = drawEdgeP; klass->parent_class.add_plot_labels = addPlotLabels; klass->parent_class.add_identify_cues = addIdentifyCues; klass->parent_class.splot_assign_points_to_bins = splotAssignPointsToBins; klass->parent_class.plotted_vars_get = splotVariablesGet; } ggobi-2.1.12/src/tourcorr_ui.c0000644000175000017500000003606614651527764011710 /* tourcorr_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" #include "tour.h" /* This function initializes the tour variables - it should only be called more than once, when a new tour is started since a new subset of variable might be used, or when there is new data. */ void cpanel_tcorr_init (cpaneld *cpanel, ggobid *gg) { cpanel->tcorr1.paused = false; cpanel->tcorr1.step = TOURSTEP0; cpanel->tcorr2.paused = false; cpanel->tcorr2.step = TOURSTEP0; cpanel->tcorr.slidepos = sessionOptions->defaultTourSpeed; cpanel->tcorr.manip_mode = CMANIP_COMB; } /*-- scatterplot only; need a different routine for parcoords --*/ void cpanel_tourcorr_set (displayd *display, cpaneld *cpanel, ggobid* gg) /* * To handle the case where there are multiple scatterplots * which may have different tour options and parameters selected */ { GtkWidget *pnl, *w, *btn; GtkAdjustment *adj; pnl = (GtkWidget *) mode_panel_get_by_name(GGOBI(getPModeName)(COTOUR), gg); /*-- speed --*/ w = widget_find_by_name (pnl, "COTOUR:speed_bar"); adj = gtk_range_get_adjustment (GTK_RANGE (w)); gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), cpanel->tcorr.slidepos); /*-- paused --*/ btn = widget_find_by_name (pnl, "COTOUR:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), cpanel->tcorr1.paused); /*-- manual manip --*/ w = widget_find_by_name (pnl, "COTOUR:manip"); if (w) gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->tcorr.manip_mode); /*-- PC axes --*/ /*-- backtracking --*/ /*-- local scan --*/ /*-- path len... --*/ } #ifdef TOUR_PP_IMPLEMENTED static void ctouradv_window_open (void); #endif static void speedcorr_set_cb (GtkAdjustment *adj, ggobid *gg) { tourcorr_speed_set(adj->value, gg); } static void tourcorr_pause_cb (GtkToggleButton *button, ggobid *gg) { tourcorr_pause (&gg->current_display->cpanel, button->active, gg); } static void tourcorr_reinit_cb (GtkWidget *w, ggobid *gg) { tourcorr_reinit(gg); } static void tourcorr_scramble_cb (GtkWidget *w, ggobid *gg) { tourcorr_scramble(gg); } static void tourcorr_snap_cb (GtkWidget *w, ggobid *gg) { tourcorr_snap(gg); } static void tourcorr_video_cb (GtkToggleButton *button, ggobid *gg) { tourcorr_video(gg); } /* static void syncaxes_cb (GtkToggleButton *button) { g_printerr ("syncaxes: %d\n", button->active); } */ /* static void hide_cb (GtkWidget *w ) { gtk_widget_hide (w); } */ #ifdef TOUR_PP_IMPLEMENTED static void ctourpp_cb (GtkWidget *w, ggobid *gg) { ctourpp_window_open (gg); } #endif #ifdef TOUR_ADV_IMPLEMENTED static void ctouradv_cb (GtkWidget *w, gpointer dummy) { ctouradv_window_open (); } #endif static gchar *manip_lbl[] = {"Off", "Comb", "Vertical", "Horizontal", "EqualComb"}; static void manip_cb (GtkWidget *w, ggobid *gg) { displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; splotd *sp = gg->current_splot; cpanel->tcorr.manip_mode = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); if (cpanel->tcorr.manip_mode == CMANIP_OFF) splot_cursor_unset (sp); else splot_cursor_set (GDK_HAND2, sp); } /* static gchar *pathlen_lbl[] = {"1/10", "1/5", "1/4", "1/3", "1/2", "1", "2", "10", "Infinite"}; static void pathlen_cb (GtkWidget *w, gpointer cbd) { gint indx = GPOINTER_TO_INT (cbd); g_printerr ("cbd: %s\n", pathlen_lbl[indx]); } */ void cpanel_ctour_make (ggobid *gg) { modepaneld *panel; GtkWidget *box, *btn, *sbar, *vb, *lbl; GtkObject *adj; GtkWidget *manip_opt; /* GtkWidget *pathlen_opt, *tgl; */ panel = (modepaneld *) g_malloc(sizeof(modepaneld)); gg->control_panels = g_list_append(gg->control_panels, (gpointer) panel); panel->name = g_strdup(GGOBI(getPModeName)(COTOUR)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /* * speed scrollbar */ /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ adj = gtk_adjustment_new (sessionOptions->defaultTourSpeed, 0.0, MAX_TOUR_SPEED, 1.0, 1.0, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (speedcorr_set_cb), (gpointer) gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_widget_set_name (sbar, "COTOUR:speed_bar"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust speed of tour motion", NULL); scale_set_default_values (GTK_SCALE (sbar)); gtk_box_pack_start (GTK_BOX (panel->w), sbar, false, false, 1); /* * Box to hold 'pause' toggle button */ box = gtk_hbox_new (true, 1); btn = gtk_check_button_new_with_mnemonic ("_Pause"); gtk_widget_set_name (btn, "COTOUR:pause_button"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Stop tour motion temporarily (keyboard shortcut: w)", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (tourcorr_pause_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * Box to hold 'Reinit' toggle and 'Scramble' button */ box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic("_Reinit"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tourcorr_reinit_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_button_new_with_mnemonic ("Scr_amble"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection to random value", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tourcorr_scramble_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * snapshot and video stream controls box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic ("_Snap"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Take a snapshot of this frame to re-generate plot outside ggobi", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (tourcorr_snap_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_check_button_new_with_mnemonic ("Vid_eo"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Save sequence of projection frames out to file", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (tourcorr_video_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); */ /* * manipulation option menu with label */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Manual manipulation:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); manip_opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), manip_opt); gtk_widget_set_name (manip_opt, "COTOUR:manip"); //gtk_container_set_border_width (GTK_CONTAINER (manip_opt), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), manip_opt, "Set the manual manipulation method", NULL); gtk_container_add (GTK_CONTAINER (vb), manip_opt); populate_combo_box (manip_opt, manip_lbl, G_N_ELEMENTS(manip_lbl), G_CALLBACK(manip_cb), (gpointer) gg); /* * path length option menu */ /* vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new ("Path length:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); pathlen_opt = gtk_option_menu_new (); gtk_container_set_border_width (GTK_CONTAINER (pathlen_opt), 4); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), pathlen_opt, "Set the path length", NULL); gtk_container_add (GTK_CONTAINER (vb), pathlen_opt); populate_option_menu (pathlen_opt, pathlen_lbl, sizeof (pathlen_lbl) / sizeof (gchar *), G_CALLBACK(pathlen_cb), "GGobi", gg); */ /* * Sync Axes toggle */ /* tgl = gtk_check_button_new_with_label ("Sync axes"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Synchronize the horizontal and vertical axes", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (syncaxes_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (panel->w), tgl, false, false, 1); */ /* * projection pursuit button */ /* btn = gtk_button_new_with_label ("Projection pursuit ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for correlation tour projection pursuit", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (ctourpp_cb), gg); */ /* * advanced features button */ /* btn = gtk_button_new_with_label ("Advanced features ..."); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open panel for additional correlation tour features", NULL); gtk_box_pack_start (GTK_BOX (panel->w), btn, false, false, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (ctouradv_cb), NULL); */ gtk_widget_show_all (panel->w); } /*----------------------------------------------------------------------*/ /* Advanced features panel and callbacks */ /*----------------------------------------------------------------------*/ /* The following are considered advanced features for now: history */ #ifdef TOUR_PP_IMPLEMENTED static GtkWidget *window = NULL; static void ctouradv_window_open (void) { GtkWidget *vbox, *btn, *frame; if (window == NULL) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Advanced Correlation Tour"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (window), vbox); frame = gtk_frame_new ("History"); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_OUT); gtk_box_pack_start (GTK_BOX (vbox), frame, false, false, 0); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect_swapped (G_OBJECT (btn), "clicked", G_CALLBACK (hide_cb), (GtkObject*) window); gtk_box_pack_start (GTK_BOX (vbox), btn, false, true, 2); } gtk_widget_show_all (window); } #endif /*----------------------------------------------------------------------*/ /* I/O events */ /*----------------------------------------------------------------------*/ /*-- called from the Options menu --*/ void tourcorr_io_cb (GtkWidget *w, gpointer *cbd) { /* gchar *lbl = (gchar *) cbd; g_printerr ("cbd: %s\n", lbl); */ } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget *w, GdkEventKey *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ if (event->keyval == GDK_w || event->keyval == GDK_W) { /*-- turn pause on and off --*/ GtkWidget *pnl; GtkWidget *pause_button = NULL; pnl = mode_panel_get_by_name(GGOBI(getPModeName)(COTOUR), gg); if (pnl) { pause_button = widget_find_by_name (pnl, "COTOUR:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_button), !cpanel->tcorr1.paused || !cpanel->tcorr2.paused); return true; } } return false; } static gint motion_notify_cb (GtkWidget *w, GdkEventMotion *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); gboolean button1_p, button2_p; mousepos_get_motion (w, event, &button1_p, &button2_p, sp); /*-- if neither button is pressed, we shouldn't have gotten the event --*/ if (!button1_p && !button2_p) return false; tourcorr_manip(sp->mousepos.x, sp->mousepos.y, sp, gg); return true; } static gint button_press_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { ggobid *gg = GGobiFromWidget(w, true); displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; gboolean button1_p, button2_p; mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); if (cpanel->tcorr.manip_mode != CMANIP_OFF) { sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK(motion_notify_cb), (gpointer) sp); tourcorr_manip_init(sp->mousepos.x, sp->mousepos.y, sp); } return true; } static gint button_release_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { gboolean retval = true; GdkModifierType state; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); tourcorr_manip_end(sp); gdk_pointer_ungrab (event->time); return retval; } void ctour_event_handlers_toggle (splotd *sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), "key_press_event", G_CALLBACK(key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK(button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK(button_release_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); } } ggobi-2.1.12/src/read_init.h0000644000175000017500000000511414651527764011265 /* read_init.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_READ_INIT_H #define GGOBI_READ_INIT_H #include "ggobi.h" #include "defines.h" #include #include "fileio.h" #ifdef XML_USE_CHILDS # define XML_CHILDREN(node) (node)->childs #else # define XML_CHILDREN(node) (node)->children #endif typedef struct { gchar *typeName; /* use for the extended type. */ gint numVars; /* the number of variables in the plot. */ gchar **varNames; /* the variables in the plot. */ gchar *datasetName; /* name of the dataset in which to find the variables. */ gint data; /* with which datad is this associated */ gboolean canRecreate; /* see the unsupported tag in the output from write_state.*/ } GGobiDisplayDescription; typedef struct { InputDescription input; GList *displays; } GGobiDescription; typedef struct _GGobiInitInfo { gint numInputs; /* number of previously read input sources */ GGobiDescription *descriptions; #if 0 InputDescription *inputs; /* previously read input sources. */ #endif GList *plugins; /* list of known available plugins */ GList *inputPlugins; /* list of the input reading plugins */ gchar *filename; /* the name of the file from which this information was read. */ gchar *colorSchemeFile; /* */ GdkColor *bgColor; GdkColor *fgColor; glyphd glyph; gboolean createInitialScatterPlot; gboolean allowCloseLastDisplay; gboolean quitWithNoGGobi; gint numScatMatrixVars; gint numParCoordsVars; gint numTimePlotVars; gchar *sessionFile; gint compress; #if 0 gboolean useRadioMenuItems; #endif } GGobiInitInfo; GGobiInitInfo *read_init_file(const gchar *filename, GGobiInitInfo *info); xmlNode *getXMLDocElement(const xmlDocPtr doc, const gchar *tagName); xmlNode *getXMLElement(const xmlNodePtr doc, const gchar *tagName); #ifdef __cplusplus extern "C" { #endif gint getPreviousDisplays(xmlNodePtr node, GGobiDescription *desc); #ifdef __cplusplus } #endif #endif /* end of GGOBI_READ_INIT_H */ ggobi-2.1.12/src/scatterplot.c0000644000175000017500000004626614651527764011703 /* scatterplot.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include #include #include "vars.h" #include "scatterplotClass.h" #include "externs.h" #define WIDTH 370 #define HEIGHT 370 /*-- as long as these are static, they can probably stay here --*/ static gboolean ruler_shift_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp); static void ruler_down_cb (GtkWidget * w, GdkEventButton * event, splotd * sp); static gboolean ruler_motion_cb (GtkWidget * ruler, GdkEventMotion * event, GtkWidget * da); void scatterplot_show_hrule (displayd * display, gboolean show) { if (show) { if (!GTK_WIDGET_VISIBLE (display->hrule)) gtk_widget_show (display->hrule); } else { if (GTK_WIDGET_VISIBLE (display->hrule)) gtk_widget_hide (display->hrule); } } void scatterplot_show_vrule (displayd * display, gboolean show) { if (show) { if (!GTK_WIDGET_VISIBLE (display->vrule)) gtk_widget_show (display->vrule); } else { if (GTK_WIDGET_VISIBLE (display->vrule)) gtk_widget_hide (display->vrule); } } void scatterplot_show_rulers (displayd * display, gint projection) { /* * Retrieve the size of the drawing area before the axes are added * or removed, and then set the da size afterwards. This prevents * plots that have been reduced in size from suddenly being resized * up to the original default size. */ switch (projection) { case P1PLOT: if (display->p1d_orientation == VERTICAL) { scatterplot_show_vrule (display, display->options.axes_show_p); scatterplot_show_hrule (display, false); } else { scatterplot_show_vrule (display, false); scatterplot_show_hrule (display, display->options.axes_show_p); } break; case XYPLOT: scatterplot_show_vrule (display, display->options.axes_show_p); scatterplot_show_hrule (display, display->options.axes_show_p); break; case TOUR1D: case TOUR2D3: case TOUR2D: case COTOUR: default: /* in any other projection, no rulers */ scatterplot_show_vrule (display, false); scatterplot_show_hrule (display, false); break; } //gtk_widget_set_usize(GTK_WIDGET (sp->da), width, height); } void ruler_ranges_set_on_realize (splotd * sp, gpointer user_data) { ruler_ranges_set(true, sp->displayptr, sp, sp->displayptr->ggobi); } void ruler_ranges_set (gboolean force, displayd * display, splotd * sp, ggobid * gg) { /* * Run 0 and sp->max through the reverse pipeline to find out * what their values should be in terms of the data. Set the * ruler min and max to those values. * Force the ranges to be set when a display is being initialized. */ icoords scr; fcoords tfmin, tfmax; cpaneld *cpanel = &display->cpanel; if (display->hrule == NULL) return; tfmin.x = tfmin.y = tfmax.x = tfmax.y = 0.0; scr.x = scr.y = 0; if (sp && GGOBI_IS_EXTENDED_SPLOT (sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (klass->screen_to_tform) klass->screen_to_tform (cpanel, sp, &scr, &tfmin, gg); } scr.x = sp->max.x; scr.y = sp->max.y; if (sp && GGOBI_IS_EXTENDED_SPLOT (sp)) { GGobiExtendedSPlotClass *klass; klass = GGOBI_EXTENDED_SPLOT_GET_CLASS (sp); if (klass->screen_to_tform) klass->screen_to_tform (cpanel, sp, &scr, &tfmax, gg); } /* * Reset only if necessary: if the ruler is visible and the * ranges have changed. Force when initializing display. */ if (force || GTK_WIDGET_VISIBLE (display->hrule)) { if (((gfloat) GTK_RULER (display->hrule)->lower != tfmin.x) || ((gfloat) GTK_RULER (display->hrule)->upper != tfmax.x)) { /* What should the final 2 arguments be. */ gtk_ruler_set_range (GTK_RULER (display->hrule), (gdouble) tfmin.x, (gdouble) tfmax.x, (gdouble) (tfmax.x - tfmin.x) / 2 + tfmin.x, tfmax.x); } } if (force || GTK_WIDGET_VISIBLE (display->vrule)) { if (((gfloat) GTK_RULER (display->vrule)->upper != tfmin.y) || ((gfloat) GTK_RULER (display->vrule)->lower != tfmax.y)) { gtk_ruler_set_range (GTK_RULER (display->vrule), (gdouble) tfmin.y, (gdouble) tfmax.y, (gdouble) (tfmax.y - tfmin.y) / 2 + tfmin.y, tfmax.y); } } } /*----------------------------------------------------------------------*/ /* Options section */ /*----------------------------------------------------------------------*/ static const gchar *scatterplot_ui = "" " " " " " " " " " " " " " " ""; static void display_datad_added_cb (ggobid * gg, GGobiData * d, void *win) { windowDisplayd *display = GGOBI_WINDOW_DISPLAY (GTK_OBJECT (win)); /*-- this is all true even when the display is first opened --*/ if (display->window && GTK_WIDGET_REALIZED (display->window)) { scatterplot_display_edge_menu_update (GGOBI_DISPLAY (display), gg->app.sp_accel_group, gg); } } CHECK_EVENT_SIGNATURE (display_datad_added_cb, datad_added_f) splotd *ggobi_scatter_plot_new (displayd * dpy, ggobid * gg) { splotd *sp = g_object_new (GGOBI_TYPE_SCATTER_SPLOT, NULL); splot_init (sp, dpy, gg); return (sp); } displayd * scatterplot_new_with_vars (gboolean use_window, gboolean missing_p, gint numVars, gint * vars, GGobiData * d, ggobid * gg) { return (createScatterplot (NULL, use_window, missing_p, NULL, numVars, vars, d, gg)); } displayd * scatterplot_new (gboolean use_window, gboolean missing_p, splotd * sp, GGobiData * d, ggobid * gg) { return (createScatterplot (NULL, use_window, missing_p, sp, 0, NULL, d, gg)); } void GGOBI (edge_menus_update) (ggobid * gg) { GList *dlist; displayd *display; for (dlist = gg->displays; dlist != NULL; dlist = dlist->next) { display = (displayd *) dlist->data; if (GGOBI_WINDOW_DISPLAY (display)->useWindow && GTK_WIDGET_REALIZED (GGOBI_WINDOW_DISPLAY (display)->window) && GGOBI_IS_SCATTERPLOT_DISPLAY (display)) { scatterplot_display_edge_menu_update (GGOBI_DISPLAY (display), gg->app.sp_accel_group, gg); } } } static GtkActionEntry edge_actions[] = { {"Edges", NULL, "_Edges"}, {"Edgesets", NULL, "_Attach edge set"} }; static GtkRadioActionEntry edge_radio_actions[] = { {"ShowUndirectedEdges", NULL, "Show _lines only", "L", "Show edges without arrowheads", DOPT_EDGES_U}, {"ShowDirectedEdges", NULL, "Show lines _with arrowheads", "W", "Show edges with arrowheads", DOPT_EDGES_D}, {"ShowArrowheadsOnly", NULL, "Show arrowheads _only", "O", "Show only the arrowheads, no line", DOPT_EDGES_A}, {"HideEdges", NULL, "_Hide edges", "H", "Make the edges invisible", DOPT_EDGES_H} }; static void edge_options_cb (GtkRadioAction * action, GtkRadioAction * current, displayd * dsp) { gint active = gtk_radio_action_get_current_value (action); set_display_option (true, active, dsp); } displayd * createScatterplot (displayd * display, gboolean use_window, gboolean missing_p, splotd * sp, gint numVars, gint * vars, GGobiData * d, ggobid * gg) { GtkWidget *table, *vbox; ProjectionMode projection; if (d == NULL || d->ncols < 1) return (NULL); if (!display) { if (sp == NULL || sp->displayptr == NULL) { display = g_object_new (GGOBI_TYPE_SCATTERPLOT_DISPLAY, NULL); display_set_values (display, d, gg); } else { display = (displayd *) sp->displayptr; display->d = d; } } GGOBI_WINDOW_DISPLAY(display)->useWindow = use_window; /* Want to make certain this is true, and perhaps it may be different for other plot types and so not be set appropriately in DefaultOptions. display->options.axes_center_p = true; */ projection = (d->ncols >= 2) ? XYPLOT : P1PLOT; scatterplot_cpanel_init (&display->cpanel, projection, DEFAULT_IMODE, gg); vbox = GTK_WIDGET (display); /* gtk_vbox_new (false, 1); */ display->menu_manager = display_menu_manager_create (display); if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) { GtkActionGroup *actions = gtk_action_group_new ("Edge Actions"); gtk_action_group_add_actions (actions, edge_actions, G_N_ELEMENTS (edge_actions), NULL); gtk_action_group_add_radio_actions (actions, edge_radio_actions, G_N_ELEMENTS (edge_radio_actions), DOPT_EDGES_H, G_CALLBACK (edge_options_cb), display); display_window_init (GGOBI_WINDOW_DISPLAY (display), WIDTH, HEIGHT, 3, gg); /*-- Add the main menu bar --*/ gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (GGOBI_WINDOW_DISPLAY (display)->window), vbox); gtk_ui_manager_insert_action_group (display->menu_manager, actions, -1); g_object_unref (actions); display->menubar = create_menu_bar (display->menu_manager, scatterplot_ui, GGOBI_WINDOW_DISPLAY (display)-> window); /* * After creating the menubar, and populating the file menu, * add the other menus manually */ scatterplot_display_edge_menu_update (display, gg->app.sp_accel_group, gg); gtk_box_pack_start (GTK_BOX (vbox), display->menubar, false, true, 0); } /*-- Initialize a single splot --*/ if (sp == NULL) { sp = ggobi_scatter_plot_new (display, gg); if (numVars < 2 || vars == NULL) { /* Initialize display with the plotted variables in the current display, if appropriate */ if (gg->current_display != NULL && gg->current_display != display && gg->current_display->d == d && GGOBI_IS_EXTENDED_DISPLAY (gg->current_display)) { gint nplotted_vars; gint *plotted_vars = (gint *) g_malloc (d->ncols * sizeof (gint)); displayd *dsp = gg->current_display; nplotted_vars = GGOBI_EXTENDED_DISPLAY_GET_CLASS (dsp)->plotted_vars_get (dsp, plotted_vars, d, gg); if (nplotted_vars) { if (projection == XYPLOT) sp->xyvars.x = plotted_vars[0]; else sp->p1dvar = plotted_vars[0]; } if (nplotted_vars > 1 && projection == XYPLOT) sp->xyvars.y = plotted_vars[1]; g_free (plotted_vars); } } else { if (projection == XYPLOT) { sp->xyvars.x = vars[0]; sp->xyvars.y = vars[1]; } else { sp->p1dvar = vars[0]; } } } display->splots = NULL; display->splots = g_list_append (display->splots, (gpointer) sp); /*-- Initialize tours if possible --*/ { /*XX seems like only scatterplot gets in here. (i.e. not scatmat) */ display_tour1d_init_null (display, gg); if (d->ncols >= MIN_NVARS_FOR_TOUR1D) display_tour1d_init (display, gg); display_tour2d3_init_null (display, gg); if (d->ncols >= MIN_NVARS_FOR_TOUR2D3) display_tour2d3_init (display, gg); display_tour2d_init_null (display, gg); if (d->ncols >= MIN_NVARS_FOR_TOUR2D) display_tour2d_init (display, gg); display_tourcorr_init_null (display, gg); if (d->ncols >= MIN_NVARS_FOR_COTOUR) display_tourcorr_init (display, gg); } table = gtk_table_new (3, 2, false); /* rows, columns, homogeneous */ gtk_box_pack_start (GTK_BOX (vbox), table, true, true, 0); gtk_table_attach (GTK_TABLE (table), sp->da, 1, 2, 0, 1, (GtkAttachOptions) (GTK_SHRINK | GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_SHRINK | GTK_EXPAND | GTK_FILL), 0, 0); /* * The horizontal ruler goes on the bottom. As the mouse moves * across the drawing area, a motion_notify_event is passed to the * appropriate event handler for the ruler. */ /* */ display->hrule = gtk_hruler_new (); g_signal_connect (G_OBJECT (display->hrule), "motion_notify_event", G_CALLBACK (ruler_shift_cb), sp); g_signal_connect (G_OBJECT (display->hrule), "button_press_event", G_CALLBACK (ruler_down_cb), sp); g_signal_connect_swapped (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (ruler_motion_cb), display->hrule); /* What about the events above. */ gtk_table_attach (GTK_TABLE (table), display->hrule, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), (GtkAttachOptions) GTK_FILL, 0, 0); /* * The vertical ruler goes on the left. As the mouse moves across * the drawing area, a motion_notify_event is passed to the * appropriate event handler for the ruler. */ display->vrule = gtk_vruler_new (); g_signal_connect (G_OBJECT (display->vrule), "motion_notify_event", G_CALLBACK (ruler_shift_cb), sp); g_signal_connect (G_OBJECT (display->vrule), "button_press_event", G_CALLBACK (ruler_down_cb), sp); g_signal_connect_swapped (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK (ruler_motion_cb), display->vrule); gtk_table_attach (GTK_TABLE (table), display->vrule, 0, 1, 0, 1, (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0); scatterplot_show_rulers (display, projection); if (GGOBI_IS_WINDOW_DISPLAY (display) && GGOBI_WINDOW_DISPLAY (display)->useWindow) { gtk_widget_show_all (GGOBI_WINDOW_DISPLAY (display)->window); /* only set rulers if we know the plot widget has been configured */ ruler_ranges_set (true, display, sp, gg); } else gtk_widget_show_all (GTK_WIDGET(display)); g_signal_connect_object (G_OBJECT (gg), "datad_added", G_CALLBACK (display_datad_added_cb), G_OBJECT (display), 0); return display; } /*-------------------------------------------------------------------- Responding to the rulers ----------------------------------------------------------------------*/ static gboolean ruler_motion_cb (GtkWidget * ruler, GdkEventMotion * event, GtkWidget * da) { gint pos, max; gdouble position; gdouble lower, upper; gint x, y; GdkModifierType state; gdk_window_get_pointer (da->window, &x, &y, &state); if (GTK_IS_HRULER (ruler)) { pos = x; max = da->allocation.width; } else { pos = y; max = da->allocation.height; } gtk_ruler_get_range (GTK_RULER (ruler), &lower, &upper, NULL, NULL); position = lower + pos * (upper - lower) / max; g_object_set (G_OBJECT (ruler), "position", position, NULL); return (false); } static void ruler_down_cb (GtkWidget * w, GdkEventButton * event, splotd * sp) { displayd *display = (displayd *) sp->displayptr; if (w == display->hrule) display->drag_start.x = event->x; else display->drag_start.y = event->y; } static gboolean ruler_shift_cb (GtkWidget * w, GdkEventMotion * event, splotd * sp) { displayd *display = (displayd *) sp->displayptr; /*cpaneld *cpanel = &display->cpanel; */ ggobid *gg = display->ggobi; gboolean button1_p, button2_p; gint direction = (w == display->hrule) ? HORIZONTAL : VERTICAL; gboolean redraw = false; greal precis = (greal) PRECISION1; /*-- find out if any buttons are pressed --*/ mousepos_get_motion (w, event, &button1_p, &button2_p, sp); if (button1_p) { if (direction == HORIZONTAL) { greal scale_x; greal dx = (greal) (event->x - display->drag_start.x); /*-- exactly as in pan_by_drag --*/ /* scale_x = (cpanel->projection == TOUR2D) ? sp->tour_scale.x : sp->scale.x; */ scale_x = sp->scale.x; scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; sp->pmid.x -= (dx * precis / sp->iscale.x); /* */ display->drag_start.x = event->x; redraw = true; } else { greal scale_y; greal dy = -1 * (greal) (event->y - display->drag_start.y); /*-- exactly as in pan_by_drag --*/ /* scale_y = (cpanel->projection == TOUR2D) ? sp->tour_scale.y : sp->scale.y; */ scale_y = sp->scale.y; scale_y /= 2; sp->iscale.y = (greal) sp->max.y * scale_y; sp->pmid.y -= (dy * precis / sp->iscale.y); /* */ display->drag_start.y = event->y; redraw = true; } } else if (button2_p) { gint npix = 5; /*-- lifting code from zoom_by_drag as much as possible --*/ if (direction == HORIZONTAL) { gfloat *scale_x; icoords mid; fcoords scalefac; mid.x = sp->max.x / 2; scalefac.x = 1.0; /* scale_x = (cpanel->projection == TOUR2D) ? &sp->tour_scale.x : &sp->scale.x; */ scale_x = &sp->scale.x; if (ABS (event->x - mid.x) >= npix) { scalefac.x = (gfloat) (event->x - mid.x) / (gfloat) (display->drag_start.x - mid.x); if (*scale_x * scalefac.x >= SCALE_MIN) *scale_x = *scale_x * scalefac.x; display->drag_start.x = event->x; redraw = true; } } else { gfloat *scale_y; icoords mid; fcoords scalefac; mid.y = sp->max.y / 2; scalefac.y = 1.0; /* scale_y = (cpanel->projection == TOUR2D) ? &sp->tour_scale.y : &sp->scale.y; */ scale_y = &sp->scale.y; if (ABS (event->y - mid.y) >= npix) { scalefac.y = (gfloat) (event->y - mid.y) / (gfloat) (display->drag_start.y - mid.y); if (*scale_y * scalefac.y >= SCALE_MIN) *scale_y = *scale_y * scalefac.y; display->drag_start.y = event->y; redraw = true; } } } /* * In motion_notify in scale_ui.c, ruler_ranges_set is also * executed, but I presumably don't have to do that here, as * long as these processes remain adequately in sync. */ if (redraw) { splot_plane_to_screen (display, &display->cpanel, sp, gg); splot_redraw (sp, FULL, gg); } return (false); } ggobi-2.1.12/src/subset_ui.c0000644000175000017500000005132114651527764011325 /* subset_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include "vars.h" #include "externs.h" #define SS_RANDOM 0 #define SS_BLOCK 1 #define SS_RANGE 2 #define SS_EVERYN 3 #define SS_STICKY 4 #define SS_ROWLAB 5 /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget *w, ggobid *gg) { gtk_widget_hide (gg->subset_ui.window); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget *w, GdkEventButton *event, ggobid *gg) { gtk_widget_hide (gg->subset_ui.window); } static GGobiData * datad_get_from_widget (GtkWidget *w, ggobid *gg) { GGobiData *d = NULL; GtkTreeSelection *sel; gint kd; if (g_slist_length (gg->d) == 0) ; else if (g_slist_length (gg->d) == 1) d = gg->d->data; else { GtkWidget *tree_view = (GtkWidget *) g_object_get_data(G_OBJECT (w), "datad_tree_view"); if (tree_view) { sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); kd = tree_selection_get_selected_row(sel); /*-- Assume that all datad's are included --*/ if (kd >= 0) d = (GGobiData *) g_slist_nth_data (gg->d, kd); } } return d; } static void set_adjustment (GtkWidget *w, GtkAdjustment *adj_new) { GtkAdjustment *adj_current; GtkSpinButton *btn; if (w) { btn = GTK_SPIN_BUTTON (w); adj_current = gtk_spin_button_get_adjustment (btn); if (adj_current != adj_new) { g_object_ref (G_OBJECT(adj_current)); gtk_spin_button_set_adjustment (btn, adj_new); } } } static const gchar *const substr_lbl[] = { "Is identical to the string", "Includes the string", "Begins with the string", "Ends with the string", "Does not include the string", }; static void subset_string_pos_cb (GtkWidget *w, ggobid *gg) { GGobiData *d = datad_get_from_widget (w, gg); d->subset.string_pos = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); } static void subset_display_update (GGobiData *d, ggobid *gg) { GtkWidget *spinbtn, *entry; /* * If this is a different d than was used the last time * the subset panel was opened, attach the right adjustments * to the spin_buttons. */ spinbtn = (GtkWidget *) g_object_get_data(G_OBJECT(d->subset.bstart_adj), "WIDGET"); set_adjustment (spinbtn, d->subset.bstart_adj); spinbtn = (GtkWidget *) g_object_get_data(G_OBJECT(d->subset.bsize_adj), "WIDGET"); set_adjustment (spinbtn, d->subset.bsize_adj); spinbtn = (GtkWidget *) g_object_get_data(G_OBJECT(d->subset.estart_adj), "WIDGET"); set_adjustment (spinbtn, d->subset.estart_adj); spinbtn = (GtkWidget *) g_object_get_data(G_OBJECT(d->subset.estep_adj), "WIDGET"); set_adjustment (spinbtn, d->subset.estep_adj); /*-- ... and set the values of the text entries, too --*/ entry = (GtkWidget *) g_object_get_data(G_OBJECT(gg->subset_ui.window), "SS:RANDOM_ENTRY"); if (entry) { gchar *txt = g_strdup_printf ("%d", d->subset.random_n); gtk_entry_set_text (GTK_ENTRY (entry), txt); g_free (txt); } entry = (GtkWidget *) g_object_get_data(G_OBJECT(gg->subset_ui.window), "SS:NROWS_ENTRY"); if (entry) { gchar *txt = g_strdup_printf ("%d", d->nrows); gtk_entry_set_text (GTK_ENTRY (entry), txt); g_free (txt); } /*-- --*/ } static void subset_datad_set_cb (GtkTreeSelection *tree_sel, ggobid *gg) { /*-- Assume that all datad's are included --*/ gint row = tree_selection_get_selected_row(tree_sel); if (row != -1) { GGobiData *d = g_slist_nth_data (gg->d, row); if (d) subset_display_update (d, gg); } } static void rescale_cb (GtkWidget *w, ggobid *gg) { GGobiData *d = datad_get_from_widget (w, gg); if (d) { limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } } static void subset_cb (GtkWidget *w, ggobid *gg) { gint subset_type; gchar *sample_str, *substr; gint bstart, bsize; gint estart, estep; gboolean redraw = false; GGobiData *d = datad_get_from_widget (w, gg); GtkWidget *entry, *tgl; if (!d) return; subset_type = gtk_notebook_get_current_page (GTK_NOTEBOOK (gg->subset_ui.notebook)); switch (subset_type) { case SS_RANDOM: entry = (GtkWidget *) g_object_get_data(G_OBJECT(gg->subset_ui.window), "SS:RANDOM_ENTRY"); sample_str = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); d->subset.random_n = atoi (sample_str); redraw = subset_random (d->subset.random_n, d, gg); break; case SS_BLOCK: bstart = (gint) d->subset.bstart_adj->value; bsize = (gint) d->subset.bsize_adj->value; redraw = subset_block (bstart-1, bsize, d, gg); break; case SS_RANGE: redraw = subset_range (d, gg); break; case SS_EVERYN: estart = (gint) d->subset.estart_adj->value; estep = (gint) d->subset.estep_adj->value; redraw = subset_everyn (estart-1, estep, d, gg); break; case SS_STICKY: redraw = subset_sticky (d, gg); break; case SS_ROWLAB: /* use a toggle widget to specify whether to ignore case or not */ entry = (GtkWidget *) g_object_get_data(G_OBJECT(gg->subset_ui.window), "SS:ROWLAB"); tgl = (GtkWidget *) g_object_get_data(G_OBJECT(gg->subset_ui.window), "SS:IGNORE_CASE"); substr = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1); redraw = subset_rowlab (substr, d->subset.string_pos, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(tgl)), d, gg); break; } if (redraw) subset_apply (d, gg); } static void include_all_cb (GtkWidget *w, ggobid *gg) { GGobiData *d = datad_get_from_widget (w, gg); if (d != NULL) { subset_include_all (d, gg); subset_apply (d, gg); } } static void subset_tree_view_datad_added_cb (ggobid *gg, GGobiData *d, GtkWidget *tree_view) { GtkTreeIter iter; GtkTreeModel *model; GtkWidget *swin = (GtkWidget *) g_object_get_data(G_OBJECT (tree_view), "datad_swin"); subset_init (d, gg); model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)); gtk_list_store_append(GTK_LIST_STORE(model), &iter); gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, d->name, -1); gtk_widget_show_all (swin); } CHECK_EVENT_SIGNATURE(subset_tree_view_datad_added_cb,datad_added_f) /*------------------------------------------------------------------*/ void subset_window_open (ggobid *gg) { GtkWidget *button, *t; GtkWidget *vbox, *frame, *hb, *vb, *button_hbox, *close_hbox; GtkWidget *label, *btn, *spinbtn, *entry, *opt; GGobiData *d; static gchar *tree_view_titles[1] = {"datasets"}; GtkWidget *swin, *tree_view; GtkListStore *model; GSList *l; /*-- if used before we have data, bail out --*/ if (gg->d == NULL || g_slist_length (gg->d) == 0) return; else { d = gg->d->data; if (gg->subset_ui.window == NULL) { gg->subset_ui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->subset_ui.window), "Subset Data"); g_signal_connect (G_OBJECT (gg->subset_ui.window), "delete_event", G_CALLBACK (close_wmgr_cb), (gpointer) gg); gtk_container_set_border_width (GTK_CONTAINER (gg->subset_ui.window), 5); vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (gg->subset_ui.window), vbox); /* Create a scrolled window to pack the list widget into */ swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); model = gtk_list_store_new(1, G_TYPE_STRING); tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); populate_tree_view(tree_view, tree_view_titles, G_N_ELEMENTS(tree_view_titles), true, GTK_SELECTION_BROWSE, G_CALLBACK(subset_datad_set_cb), gg); g_object_set_data(G_OBJECT (tree_view), "datad_swin", swin); g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK(subset_tree_view_datad_added_cb), tree_view); /*-- --*/ /*-- All datad's are included. This assumption is used in two places. */ for (l = gg->d; l; l = l->next) { GtkTreeIter iter; d = (GGobiData *) l->data; subset_init (d, gg); gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, d->name, -1); if (l == gg->d) gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)), &iter); } gtk_container_add (GTK_CONTAINER (swin), tree_view); gtk_box_pack_start (GTK_BOX (vbox), swin, true, true, 2); d = gg->d->data; /* Create a new notebook, place the position of the tabs */ gg->subset_ui.notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (gg->subset_ui.notebook), GTK_POS_TOP); gtk_box_pack_start (GTK_BOX (vbox), gg->subset_ui.notebook, false, false, 2); /*-- Random sample without replacement --*/ frame = gtk_frame_new ("Random sample without replacement"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); hb = gtk_hbox_new (false, 2); gtk_container_add (GTK_CONTAINER (frame), hb); label = gtk_label_new_with_mnemonic ("Sample si_ze"); gtk_box_pack_start (GTK_BOX (hb), label, false, false, 2); /*-- entry: random sample size --*/ entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); g_object_set_data(G_OBJECT(gg->subset_ui.window), "SS:RANDOM_ENTRY", entry); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "Type in the desired sample size", NULL); gtk_box_pack_start (GTK_BOX (hb), entry, true, true, 2); label = gtk_label_new_with_mnemonic ("_out of"); gtk_box_pack_start (GTK_BOX (hb), label, false, false, 2); /*-- entry: data size --*/ entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); g_object_set_data(G_OBJECT(gg->subset_ui.window), "SS:NROWS_ENTRY", entry); gtk_editable_set_editable (GTK_EDITABLE (entry), false); gtk_box_pack_start (GTK_BOX (hb), entry, true, true, 2); label = gtk_label_new_with_mnemonic ("R_andom"); gtk_notebook_append_page (GTK_NOTEBOOK (gg->subset_ui.notebook), frame, label); /*-----------------------*/ /*-- Consecutive block --*/ /*-----------------------*/ frame = gtk_frame_new ("Consecutive block"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); t = gtk_table_new (2, 2, true); gtk_table_set_col_spacing (GTK_TABLE (t), 0, 20); gtk_container_set_border_width (GTK_CONTAINER (t), 5); gtk_container_add (GTK_CONTAINER (frame), t); /*-- Block subsetting: First case (bstart) --*/ vb = gtk_vbox_new (false, 3); label = gtk_label_new_with_mnemonic ("_First case:"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), label, false, false, 0); spinbtn = gtk_spin_button_new (d->subset.bstart_adj, 0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spinbtn); g_object_set_data(G_OBJECT(d->subset.bstart_adj), "WIDGET", spinbtn); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinbtn), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), spinbtn, "Specify the first row of the block", NULL); gtk_box_pack_start (GTK_BOX (vb), spinbtn, false, false, 0); gtk_table_attach_defaults (GTK_TABLE (t), vb, 0,1,0,1); /*-- Block subsetting: blocksize (bsize) --*/ vb = gtk_vbox_new (false, 2); label = gtk_label_new_with_mnemonic ("Blocksi_ze:"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), label, false, false, 0); spinbtn = gtk_spin_button_new (d->subset.bsize_adj, 0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spinbtn); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinbtn), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), spinbtn, "Specify the size of the block", NULL); gtk_box_pack_start (GTK_BOX (vb), spinbtn, false, false, 0); gtk_table_attach_defaults (GTK_TABLE (t), vb, 1,2,0,1); label = gtk_label_new_with_mnemonic ("_Block"); gtk_notebook_append_page (GTK_NOTEBOOK (gg->subset_ui.notebook), frame, label); /*---------------------------*/ /*-- Points within a range --*/ /*---------------------------*/ frame = gtk_frame_new ("Variable limits"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); vb = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (frame), vb); gtk_box_pack_start (GTK_BOX (vb), gtk_label_new ("Exclude data outside the user limits\nin the variable manipulation table"), false, false, 0); label = gtk_label_new_with_mnemonic ("_Limits"); gtk_notebook_append_page (GTK_NOTEBOOK (gg->subset_ui.notebook), frame, label); /*--------------------*/ /*-- Every nth case --*/ /*--------------------*/ frame = gtk_frame_new ("Every nth case"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); t = gtk_table_new (1, 2, true); gtk_table_set_col_spacing (GTK_TABLE (t), 0, 20); gtk_container_set_border_width (GTK_CONTAINER (t), 5); gtk_container_add (GTK_CONTAINER (frame), t); /*-- everyn subsetting: start --*/ vb = gtk_vbox_new (false, 3); label = gtk_label_new_with_mnemonic ("_First case:"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), label, false, false, 0); spinbtn = gtk_spin_button_new (d->subset.estart_adj, 0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spinbtn); g_object_set_data(G_OBJECT(d->subset.estart_adj), "WIDGET", spinbtn); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinbtn), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), spinbtn, "Specify the first row of the block", NULL); gtk_box_pack_start (GTK_BOX (vb), spinbtn, false, false, 0); gtk_table_attach_defaults (GTK_TABLE (t), vb, 0,1,0,1); /*-- everyn subsetting: stepsize --*/ vb = gtk_vbox_new (false, 2); label = gtk_label_new_with_mnemonic ("_N:"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), label, false, false, 0); spinbtn = gtk_spin_button_new (d->subset.estep_adj, 0, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spinbtn); g_object_set_data(G_OBJECT(d->subset.estep_adj), "WIDGET", spinbtn); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinbtn), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), spinbtn, "Specify the size of the block", NULL); gtk_box_pack_start (GTK_BOX (vb), spinbtn, false, false, 0); gtk_table_attach_defaults (GTK_TABLE (t), vb, 1,2,0,1); label = gtk_label_new_with_mnemonic ("_Every n"); gtk_notebook_append_page (GTK_NOTEBOOK (gg->subset_ui.notebook), frame, label); /*-------------------------------------------------------*/ /*-- Cases whose row label is one of the sticky labels --*/ /*-------------------------------------------------------*/ frame = gtk_frame_new ("Cases whose row label is sticky"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); //gtk_widget_set_usize (frame, 100, 75); vb = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (frame), vb); gtk_box_pack_start (GTK_BOX (vb), gtk_label_new ("Include only those cases with a sticky label"), false, false, 0); label = gtk_label_new_with_mnemonic ("S_ticky"); gtk_notebook_append_page (GTK_NOTEBOOK (gg->subset_ui.notebook), frame, label); /*---------------------------------------------------------*/ /*-- Cases whose row label includes the specified string --*/ /*---------------------------------------------------------*/ frame = gtk_frame_new ("Cases with specified row label"); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); vb = gtk_vbox_new (false, 5); gtk_container_add (GTK_CONTAINER (frame), vb); hb = gtk_hbox_new (false, 5); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 5); label = gtk_label_new_with_mnemonic ("S_ubstring:"); gtk_box_pack_start (GTK_BOX (hb), label, false, false, 2); entry = gtk_entry_new (); gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); g_object_set_data(G_OBJECT(gg->subset_ui.window), "SS:ROWLAB", entry); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "Type in a string to specify the cases you want in the subset", NULL); gtk_box_pack_start (GTK_BOX (hb), entry, false, false, 2); hb = gtk_hbox_new (false, 5); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 5); opt = gtk_combo_box_new_text (); g_object_set_data(G_OBJECT(gg->subset_ui.window), "SS:ROWLAB_POS", opt); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Specify the position in the row labels to check for the substring", NULL); gtk_box_pack_start (GTK_BOX (hb), opt, false, false, 0); populate_combo_box (opt, (gchar**) substr_lbl, G_N_ELEMENTS(substr_lbl), G_CALLBACK(subset_string_pos_cb), gg); btn = gtk_check_button_new_with_mnemonic ("_Ignore case"); g_object_set_data(G_OBJECT(gg->subset_ui.window), "SS:IGNORE_CASE", btn); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(btn), true); gtk_box_pack_start (GTK_BOX (hb), btn, false, false, 0); label = gtk_label_new_with_mnemonic ("R_ow label"); gtk_notebook_append_page (GTK_NOTEBOOK (gg->subset_ui.notebook), frame, label); /*-- hbox to hold a few buttons --*/ button_hbox = gtk_hbox_new (true, 2); gtk_box_pack_start (GTK_BOX (vbox), button_hbox, false, false, 2); button = gtk_button_new_with_mnemonic ("_Subset"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), button, "Draw a new subset and update all plots", NULL); g_object_set_data(G_OBJECT (button), "datad_tree_view", tree_view); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (subset_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (button_hbox), button, true, true, 2); button = gtk_button_new_with_mnemonic ("_Rescale"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), button, "Rescale the data after choosing a new subset", NULL); g_object_set_data(G_OBJECT (button), "datad_tree_view", tree_view); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (rescale_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (button_hbox), button, true, true, 2); button = gtk_button_new_with_mnemonic ("Include _all"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), button, "Stop subsetting: include all cases and update all plots", NULL); g_object_set_data(G_OBJECT (button), "datad_tree_view", tree_view); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (include_all_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (button_hbox), button, true, true, 2); /*-- Separator --*/ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new(), false, true, 2); /*-- Close button --*/ close_hbox = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), close_hbox, false, false, 1); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), (ggobid *) gg); gtk_box_pack_start (GTK_BOX (close_hbox), btn, true, false, 0); /*-- initialize display --*/ subset_display_update (gg->d->data, gg); if (g_slist_length (gg->d) > 1) gtk_widget_show_all (swin); gtk_widget_show (vbox); gtk_widget_show_all (button_hbox); gtk_widget_show_all (close_hbox); gtk_widget_show_all (gg->subset_ui.notebook); } /*-- if window == NULL --*/ gtk_widget_show (gg->subset_ui.window); gdk_window_raise (gg->subset_ui.window->window); } } ggobi-2.1.12/src/plugin.c0000644000175000017500000004464514651527764010634 /* plugin.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include "plugin.h" #include "externs.h" #include "read_xml.h" #include "read_csv.h" #include #include void addPluginDetails (GGobiPluginDetails * info, GtkWidget * list, ggobid * gg, gboolean active); void addInputPlugin (GGobiPluginInfo * info, GtkWidget * list, ggobid * gg); void addPlugin (GGobiPluginInfo * info, GtkWidget * list, ggobid * gg); void plugin_init() { // no op } gboolean GGobi_checkPlugin (GGobiPluginDetails * plugin) { gboolean (*f) (const GGobiPluginDetails *); gboolean ok = true; f = (gboolean (*)(const GGobiPluginDetails * plugin)) getPluginSymbol ("checkGGobiStructSizes", plugin); if (f) { if (!(ok = f (plugin))) g_printerr ("Problems with plugin %s. Incosistent view of ggobi's data structures.\n", plugin->name); else if (sessionOptions->verbose == GGOBI_VERBOSE) g_printerr ("plugin %s appears consistent with ggobi structures.\n", plugin->name); } else if (sessionOptions->verbose == GGOBI_VERBOSE) g_printerr ("plugin %s has no validation mechanism\n", plugin->name); return (ok); } GGobiPluginInfo * getLanguagePlugin (GList * plugins, const char *name) { GList *el = plugins; while (el) { GGobiPluginInfo *info; info = (GGobiPluginInfo *) el->data; if (strcmp (info->details->name, name) == 0) return (info); el = el->next; } return (NULL); } gboolean loadPluginLibrary (GGobiPluginDetails * plugin, GGobiPluginInfo * realPlugin) { /* If it has already been loaded, just return. */ if (plugin->loaded != DL_UNLOADED) { return (plugin->loaded == DL_FAILED ? false : true); } /* Load any plugins on which this one depends. Make certain they are fully loaded and initialized. Potential for inter-dependencies that would make this an infinite loop. Hope the user doesn't get this wrong as there are no checks at present. */ if (plugin->depends) { GSList *el = plugin->depends; while (el) { gchar *tmp = (gchar *) el->data; GGobiPluginInfo *info; info = getLanguagePlugin (sessionOptions->info->plugins, tmp); if (sessionOptions->verbose == GGOBI_VERBOSE) { fprintf (stderr, "Loading dependent plugin %s\n", tmp); fflush (stderr); } if (!loadPluginLibrary (info->details, info)) return (false); el = el->next; } } plugin->library = load_plugin_library (plugin, true); plugin->loaded = plugin->library != NULL ? DL_LOADED : DL_FAILED; if (plugin->loaded == DL_LOADED && GGobi_checkPlugin (plugin) && plugin->onLoad) { OnLoad f = (OnLoad) getPluginSymbol (plugin->onLoad, plugin); if (f) { f (0, realPlugin); } else { g_critical("error loading plugin %s: %s", plugin->dllName, g_module_error()); } } return (plugin->loaded == DL_LOADED); } GModule * load_plugin_library (GGobiPluginDetails * plugin, gboolean recurse) { GModule *handle = NULL; gchar *fileName = ggobi_find_data_file(plugin->dllName); if (fileName) { handle = g_module_open(fileName, G_MODULE_BIND_LAZY); g_free(fileName); } if (!handle) { if (sessionOptions->verbose != GGOBI_SILENT) { g_critical("Error on loading plugin library %s: %s", plugin->dllName, g_module_error()); } plugin->loaded = DL_FAILED; } else { plugin->loaded = DL_LOADED; } return (handle); } gpointer getPluginSymbol (const char *name, GGobiPluginDetails * plugin) { GModule *lib; gpointer sym; if (!plugin) return(NULL); else if (plugin->library == NULL && plugin->loaded != DL_LOADED) { lib = plugin->library = load_plugin_library (plugin, true); } else lib = plugin->library; g_module_symbol(lib, name, &sym); return sym; } gboolean registerPlugin (ggobid * gg, GGobiPluginInfo * plugin) { gboolean ok = true; OnCreate f; PluginInstance *inst; if (plugin->type != GENERAL_PLUGIN) return (false); if (!plugin->details->loaded) { loadPluginLibrary (plugin->details, plugin); } if (plugin->info.g->onCreate) { f = (OnCreate) getPluginSymbol (plugin->info.g->onCreate, plugin->details); if (f) { inst = (PluginInstance *) g_malloc (sizeof (PluginInstance)); inst->data = NULL; inst->info = plugin; inst->active = true; ok = f (gg, plugin, inst); if (ok) { GGOBI_addPluginInstance (inst, gg); } else g_free (inst); } else { g_critical("can't locate required plugin routine %s in %s", plugin->info.g->onCreate, plugin->details->name); } } else { inst = (PluginInstance *) g_malloc (sizeof (PluginInstance)); inst->data = NULL; inst->info = plugin; inst->gg = gg; inst->active = true; GGOBI_addPluginInstance (inst, gg); } return (ok); } gboolean registerPlugins (ggobid * gg, GList * plugins) { GList *el = plugins; gboolean ok = false; GGobiPluginInfo *plugin; while (el) { plugin = (GGobiPluginInfo *) el->data; ok = registerPlugin (gg, plugin) || ok; el = el->next; } return (ok); } gboolean pluginsUpdateDisplayMenu (ggobid * gg, GList * plugins) { GList *el = plugins; OnUpdateDisplayMenu f; PluginInstance *plugin; gboolean ok = true; while (el) { plugin = (PluginInstance *) el->data; if (plugin->info->type == GENERAL_PLUGIN && plugin->info->info.g->onUpdateDisplay) { f = (OnUpdateDisplayMenu) getPluginSymbol (plugin->info->info.g-> onUpdateDisplay, plugin->info->details); if (f) { ok = f (gg, plugin); } } el = el->next; } return (ok); } int GGOBI_addPluginInstance (PluginInstance * inst, ggobid * gg) { inst->gg = gg; gg->pluginInstances = g_list_append (gg->pluginInstances, inst); return (g_list_length (gg->pluginInstances)); } gboolean GGOBI_removePluginInstance (PluginInstance * inst, ggobid * gg) { inst->gg = NULL; gg->pluginInstances = g_list_remove (gg->pluginInstances, inst); /* should return whether the instance was actually there. */ return (true); } /* */ void addPlugins (GList * plugins, GtkWidget * list, ggobid * gg, GGobiPluginType); void addPlugin (GGobiPluginInfo * info, GtkWidget * list, ggobid * gg); GtkWidget * createPluginList () { /* Number of entries here should be the same as in set_column_width below and as the number of elements in addPlugin(). */ static gchar *titles[] = { "Name", "Description", "Author", "Location", "Loaded", "Active" }; static const gint widths[] = { 100, 225, 150, 225, 50, 50 }; gint i; GtkWidget *list; GList *cols, *l; //list = gtk_clist_new_with_titles(sizeof(titles)/sizeof(titles[0]), (gchar **) titles); GtkListStore *model = gtk_list_store_new (6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); populate_tree_view (list, titles, G_N_ELEMENTS (titles), true, GTK_SELECTION_SINGLE, NULL, NULL); cols = gtk_tree_view_get_columns (GTK_TREE_VIEW (list)); for (i = 0, l = cols; l; l = l->next, i++) { gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (l->data), GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (l->data), widths[i]); } /* gtk_clist_set_column_width(GTK_CLIST(list), 0, 100); gtk_clist_set_column_width(GTK_CLIST(list), 1, 225); gtk_clist_set_column_width(GTK_CLIST(list), 2, 150); gtk_clist_set_column_width(GTK_CLIST(list), 3, 225); gtk_clist_set_column_width(GTK_CLIST(list), 4, 50); gtk_clist_set_column_width(GTK_CLIST(list), 5, 50); */ return (list); } /* We should move to an interface more like Gnumeric's plugin info list. */ GtkWidget * showPluginInfo (GList * plugins, GList * inputPlugins, ggobid * gg) { GtkWidget *win, *main_vbox, *list, *swin, *lbl = NULL; win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (win), 850, 200); gtk_window_set_title (GTK_WINDOW (win), "About Plugins"); main_vbox = gtk_notebook_new (); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0); gtk_container_add (GTK_CONTAINER (win), main_vbox); if (plugins) { swin = gtk_scrolled_window_new (NULL, NULL); list = createPluginList (); gtk_container_add (GTK_CONTAINER (swin), list); addPlugins (plugins, list, gg, GENERAL_PLUGIN); lbl = gtk_label_new_with_mnemonic ("_General"); gtk_notebook_append_page (GTK_NOTEBOOK (main_vbox), swin, lbl); } if (inputPlugins) { swin = gtk_scrolled_window_new (NULL, NULL); list = createPluginList (); gtk_container_add (GTK_CONTAINER (swin), list); addPlugins (inputPlugins, list, gg, INPUT_PLUGIN); lbl = gtk_label_new_with_mnemonic ("_Input Readers"); gtk_notebook_append_page (GTK_NOTEBOOK (main_vbox), swin, lbl); } gtk_widget_show_all (win); return (win); } /** Determine whether the specified plugin is active for the given GGobi instance. */ gboolean isPluginActive (GGobiPluginInfo * info, ggobid * gg) { GList *el; PluginInstance *plugin; el = gg->pluginInstances; while (el) { plugin = (PluginInstance *) el->data; if (plugin->info == info) return (true); el = el->next; } return (false); } /** Create a summary line for each plugin, adding it to the table widget. @see addPlugin() */ void addPlugins (GList * plugins, GtkWidget * list, ggobid * gg, GGobiPluginType type) { gint n = g_list_length (plugins), i; GGobiPluginInfo *plugin; for (i = 0; i < n; i++) { plugin = (GGobiPluginInfo *) g_list_nth_data (plugins, i); switch (type) { case GENERAL_PLUGIN: addPlugin (plugin, list, gg); break; case INPUT_PLUGIN: addInputPlugin (plugin, list, gg); break; default: break; } } } /** Create the summary information line for a given plugin, giving the name, description, author, shared library/DLL, whether it is loaded and if it is active. @see addPlugins() */ void addPlugin (GGobiPluginInfo * info, GtkWidget * list, ggobid * gg) { addPluginDetails (info->details, list, gg, isPluginActive (info, gg)); } void addInputPlugin (GGobiPluginInfo * info, GtkWidget * list, ggobid * gg) { addPluginDetails (info->details, list, gg, true); } void addPluginDetails (GGobiPluginDetails * info, GtkWidget * list, ggobid * gg, gboolean active) { GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (list)); GtkTreeIter iter; gtk_list_store_append (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, info->name, 1, info->description, 2, info->author, 3, info->dllName, 4, info->loaded == DL_LOADED, 5, active, -1); /* gchar **els = (gchar **) g_malloc(6*sizeof(gchar*)); els[0] = info->name; els[1] = info->description; els[2] = info->author; els[3] = info->dllName; els[4] = info->loaded ? "yes" : "no"; els[5] = active ? "yes" : "no"; gtk_clist_append(GTK_CLIST(list), els); */ } /** Close each of the plugins within the specified GGobi instance. This doesn't unload the plugin. */ void closePlugins (ggobid * gg) { GList *el, *tmp; PluginInstance *plugin; el = gg->pluginInstances; if (!el || g_list_length (el) == 0) { return; } while (el) { plugin = (PluginInstance *) el->data; if (plugin->info->info.g->onClose) { DLFUNC f = getPluginSymbol (plugin->info->info.g->onClose, plugin->info->details); if (f) f (gg, plugin->info, plugin); } tmp = el; el = el->next; g_free (plugin); /* g_free(tmp); */ } gg->pluginInstances = NULL; } /* Determine if the plugin handles this mode. */ gboolean pluginSupportsInputMode (const gchar * modeName, GGobiPluginInfo * pluginInfo) { int i; if (!modeName) return (false); for (i = 0; i < pluginInfo->info.i->numModeNames; i++) { if (strcmp (modeName, pluginInfo->info.i->modeNames[i]) == 0) return (true); } return (false); } GGobiPluginInfo * runInteractiveInputPlugin (ggobid * gg) { GGobiPluginInfo *plugin = NULL; GList *l = sessionOptions->info->inputPlugins; for (; l; l = l->next) { plugin = (GGobiPluginInfo *) l->data; if (plugin->info.i->interactive) { if (!sessionOptions->data_type || pluginSupportsInputMode (sessionOptions->data_type, plugin)) { InputGetDescription f; if (!loadPluginLibrary (plugin->details, plugin)) { g_printerr ("Failed to load plugin %s\n", plugin->details->name); continue; } f = (InputGetDescription) getPluginSymbol (plugin->info.i-> getDescription, plugin->details); if (f) { InputDescription *desc; desc = f (NULL, sessionOptions->data_type, gg, plugin); if (desc && desc->desc_read_input) { gg->input = desc; desc->desc_read_input (desc, gg, plugin); break; } } } } } return (plugin); } /***************************************************************************/ gchar *XMLModeNames[] = { "xml", "url" }; GGobiInputPluginInfo XMLInputPluginInfo = { NULL, 0, "", "", "read_xml_input_description", false, read_xml, &read_xml_input_description, isXMLFile, xml_data }; GGobiPluginDetails XMLDetails = { "XML reader", NULL, NULL, "Reads XML URLs (http, ftp, local files or zipped local files)", "GGobi core", TRUE }; gchar *CSVModeNames[] = { "csv" }; GGobiInputPluginInfo CSVInputPluginInfo = { NULL, 0, "", "", "read_csv_input_description", false, read_csv, read_csv_input_description, isCSVFile, csv_data }; GGobiPluginDetails CSVDetails = { "CSV reader", NULL, NULL, "Reads Comma-separated data from local files", "Michael Lawrence", TRUE }; GGobiPluginInfo * createGGobiInputPluginInfo (GGobiInputPluginInfo * info, GGobiPluginDetails * details, gchar ** modeNames, guint numModes) { GGobiPluginInfo *plugin; plugin = (GGobiPluginInfo *) g_malloc0 (sizeof (GGobiPluginInfo)); plugin->type = INPUT_PLUGIN; plugin->info.i = info; plugin->details = details; if (modeNames) { guint i; plugin->info.i->modeNames = (gchar **) g_malloc (sizeof (gchar *) * numModes); plugin->info.i->numModeNames = numModes; for (i = 0; i < numModes; i++) plugin->info.i->modeNames[i] = g_strdup (modeNames[i]); } return (plugin); } /* Register the basic, built-in "plugins", specifically the input plugins for XML, CSV. */ void registerDefaultPlugins (GGobiInitInfo * info) { GGobiPluginInfo *plugin; plugin = createGGobiInputPluginInfo (&XMLInputPluginInfo, &XMLDetails, XMLModeNames, sizeof (XMLModeNames) / sizeof (XMLModeNames[0])); info->inputPlugins = g_list_append (info->inputPlugins, plugin); plugin = createGGobiInputPluginInfo (&CSVInputPluginInfo, &CSVDetails, CSVModeNames, sizeof (CSVModeNames) / sizeof (CSVModeNames[0])); info->inputPlugins = g_list_append (info->inputPlugins, plugin); } const gchar *DefaultUnknownInputModeName = "unknown"; GList * getInputPluginSelections (ggobid * gg) { GList *els = NULL, *plugins; GGobiPluginInfo *plugin; int i, n, k; gchar *buf; els = g_list_append (els, g_strdup (DefaultUnknownInputModeName)); plugins = sessionOptions->info->inputPlugins; n = g_list_length (plugins); for (i = 0; i < n; i++) { plugin = g_list_nth_data (plugins, i); for (k = 0; k < plugin->info.i->numModeNames; k++) { buf = g_strdup_printf ("%s (%s)", plugin->info.i->modeNames[k], plugin->details->name); els = g_list_append (els, buf); } } return (els); } GGobiPluginInfo * getInputPluginByModeNameIndex (gint which, gchar ** modeName) { gint ctr = 1, numPlugins, i; /* Start at 1 since guess/unknown is 0. */ GList *plugins = sessionOptions->info->inputPlugins; GGobiPluginInfo *plugin; if (which == 0) { *modeName = g_strdup (DefaultUnknownInputModeName); return (NULL); } numPlugins = g_list_length (plugins); for (i = 0; i < numPlugins; i++) { plugin = g_list_nth_data (plugins, i); if (which >= ctr && which < ctr + plugin->info.i->numModeNames) { *modeName = g_strdup (plugin->info.i->modeNames[which - ctr]); return (plugin); } ctr += plugin->info.i->numModeNames; } return (NULL); /* Should never happen */ } InputDescription * callInputPluginGetDescription (const gchar * fileName, const gchar * modeName, GGobiPluginInfo * plugin, ggobid * gg) { GGobiInputPluginInfo *info; InputGetDescription f; if (sessionOptions->verbose == GGOBI_VERBOSE) { g_printerr ("Checking input plugin %s.\n", plugin->details->name); } info = plugin->info.i; if (info->get_description_f) f = info->get_description_f; else f = (InputGetDescription) getPluginSymbol (info->getDescription, plugin->details); if (f) { InputDescription *desc; desc = f (fileName, modeName, gg, plugin); if (desc) return (desc); } else if (sessionOptions->verbose == GGOBI_VERBOSE) { g_printerr ("No handler routine for plugin %s.: %s\n", plugin->details->name, info->getDescription); } return (NULL); } ggobi-2.1.12/src/read_csv.c0000644000175000017500000003726614651527764011125 /* read_csv.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu * * Contributing author of csv parsing code: Michael Lawrence */ /* This file contains code written by Paul Hsieh (specifically the csv_row_parse() * function and related code). His license demands the inclusion of the below * copyright notice, conditions, and disclaimer. It also probably contains some * code by Dongshin Kim, a student who worked with Di Cook at ISU and original * author of the GGobi csv parsing code. */ /* bcsv - read comma separated value format * Copyright (c) 2003 Paul Hsieh * Modified by Michael Lawrence (c) 2005 to depend on GLib instead of bstring * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of bcsv nor the names of its contributors may be * used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include "vars.h" #include "externs.h" #include "string.h" /* Error conditions */ #define ERR_GARBAGE_AROUND_QUOTE (-1) #define ERR_NO_ENTRY (-2) #define ERR_NON_ENCLOSED_QUOTE (-3) #define ERR_DANGLING_QUOTE (-4) #define ERR_STREAM_READ (-5) #ifdef DISALLOW_PARADOX_QUOTE_ERRORS #define crpStrictAssert(cond,error) g_return_val_if_fail (cond, error) #else #define crpStrictAssert(cond,error) #endif #define fastIsSpace(x) (isSpaceTable[128+(x)]) static gchar isSpaceTable[128 + 256]; struct RowEntry { gint ofs, len; }; typedef struct _Row { GString *src; gint rIdx; struct RowEntry *entry; } Row; static int csv_row_parse (Row * row, GIOChannel * channel, gint trim); static gboolean is_numeric (gchar * str, gint len); static gboolean has_row_labels (GList * rows); static void load_column_labels (Row * row, GGobiData * d, gboolean row_labels); static void load_row_labels (GList * rows, GGobiData * d, gboolean has_labels); static void load_levels_from_hash (gpointer key, gpointer value, vartabled * vt); static void load_row_values (GList * rows, GGobiData * d, gboolean row_labels); static void tokenize_row (Row * row); GSList *read_csv_data (InputDescription * desc, ggobid * gg); static void row_free (Row * r); /* This code would probably be simpler if it used GScanner */ static int csv_row_parse (Row * row, GIOChannel * channel, gint trim) { gint i = 0, startOfs = 0, k, QuoteAfterQuote = 0; gint rowMlen; if (row == NULL || channel == NULL) return 0; row->rIdx = 0; row->src = g_string_new (""); if (g_io_channel_read_line_string (channel, row->src, NULL, NULL) != G_IO_STATUS_NORMAL) { return ERR_STREAM_READ; } g_string_append_c (row->src, '\r'); //fprintf(stderr, "%s\n", row->src->str); rowMlen = 4; /* Set smaller if this leads to too much memory usage */ row->entry = g_new (struct RowEntry, rowMlen); if (row->entry == NULL) { return 0; } goto LParseNewEntry; LPostProcessQuote: /* Post-process quote enclosed strings */ { gint ll, l, m; guchar *v; ll = l = row->entry[row->rIdx].len; v = row->src->str + row->entry[row->rIdx].ofs; m = k = 1; for (m = k = 1; m < l; k++, m++) { if (v[m] == '"' && v[m - 1] == '"') { /* Skip the second of two consecutive " characters */ ll--; m++; } v[k] = v[m]; } row->entry[row->rIdx].len = ll; } /* Check for pending exit condition */ if (row->src->str[i] == '\r' || row->src->str[i] == '\n') { goto LDoneLast; } QuoteAfterQuote = 0; LCommaEncountered: /* , encountered */ i++; row->rIdx++; /* New row entry */ if (row->rIdx >= rowMlen) { struct RowEntry *t; rowMlen += rowMlen; t = g_renew (struct RowEntry, row->entry, rowMlen); if (t == NULL) { g_free (row->src); row->rIdx = 0; g_free (row->entry); return 0; } row->entry = t; } LParseNewEntry: /* End of , or beginning */ k = i; while (fastIsSpace (row->src->str[i])) i++; if (row->src->str[i] == '"') { /* Single quote encountered */ i++; startOfs = i; /* Will be useful for the triple quote case. */ row->entry[row->rIdx].ofs = i; g_return_val_if_fail (i < row->src->len, ERR_DANGLING_QUOTE); goto LAfterOpenQuote; } /* If there is no trimming, then consumption is obvious */ if (!trim) { row->entry[row->rIdx].ofs = k; while (row->src->str[i] != ',') { crpStrictAssert (row->src->str[i] != '"', ERR_GARBAGE_AROUND_QUOTE); i++; if (row->src->str[i] == '\r' || row->src->str[i] == '\n') { row->entry[row->rIdx].len = i - k; goto LDoneLast; } } row->entry[row->rIdx].len = i - k; goto LCommaEncountered; } row->entry[row->rIdx].ofs = i; if (row->src->str[i] == ',') { row->entry[row->rIdx].len = 0; goto LCommaEncountered; } startOfs = i; k = i; /* Middle unquoted characters */ while (row->src->str[i] != ',') { if (row->src->str[i] == '\r' || row->src->str[i] == '\n') { row->entry[row->rIdx].len = k - startOfs; /* A single empty entry should be explicitely given in quotes */ if (row->rIdx == 0 && k == startOfs) return 1; goto LDoneLast; } i++; k = i; /* Consume whatever spaces there are */ while (fastIsSpace (row->src->str[i])) i++; crpStrictAssert (row->src->str[i] != '"', ERR_NON_ENCLOSED_QUOTE); } row->entry[row->rIdx].len = k - startOfs; goto LCommaEncountered; LAfterOpenQuote: /* Characters after an open quote */ while (1) { while (row->src->str[i] != '"') { LInsideQuote: i++; /* Go by length, and potentially read in more lines, since the \r character may be embedded in the quoted string */ if (i >= row->src->len) { GString *tmp_str = g_string_new (""); if (g_io_channel_read_line_string (channel, tmp_str, NULL, NULL) != G_IO_STATUS_NORMAL) { g_string_free (tmp_str, TRUE); return ERR_STREAM_READ; } g_return_val_if_fail (tmp_str->len > 0, ERR_DANGLING_QUOTE); g_string_append (row->src, tmp_str->str); g_string_free (tmp_str, TRUE); } } /* Quote after characters after an open quote */ k = i; i++; if (row->src->str[i] == '\r' || row->src->str[i] == '\n') { row->entry[row->rIdx].len = k - startOfs; if (QuoteAfterQuote) goto LPostProcessQuote; goto LDoneLast; } if (row->src->str[i] == '"') { QuoteAfterQuote = 1; goto LInsideQuote; } while (fastIsSpace (row->src->str[i])) i++; crpStrictAssert (row->src->str[i] == ',', ERR_GARBAGE_AROUND_QUOTE); if (row->src->str[i] == ',') { row->entry[row->rIdx].len = k - startOfs; if (QuoteAfterQuote) goto LPostProcessQuote; goto LCommaEncountered; } } LDoneLast: row->rIdx++; return 1; } /* END BCSV CODE */ GSList * read_csv (InputDescription * desc, ggobid * gg, GGobiPluginInfo * plugin) { return (read_csv_data (desc, gg)); } InputDescription * read_csv_input_description (const char *const fileName, const char *const modeName, ggobid * gg, GGobiPluginInfo * info) { InputDescription *desc; desc = (InputDescription *) g_malloc0 (sizeof (InputDescription)); desc->fileName = g_strdup (fileName); desc->mode = csv_data; desc->desc_read_input = &read_csv; return (desc); } /* string is null terminated, but pass len for maximum efficiency (since we always know it) */ static gboolean is_numeric (gchar * str, gint len) { gchar *end; g_strtod (str, &end); return len > 0 && end == str + len; } /* Heuristic: If the first row has an empty in the first column and and all the values in the first column are unique, we have row names. */ static gboolean has_row_labels (GList * rows) { GHashTable *hash = g_hash_table_new ((GHashFunc) g_str_hash, (GEqualFunc) g_str_equal); Row *first = (Row *) rows->data; if (first->entry[0].len != 0) return false; while (rows) { Row *row = (Row *) rows->data; gchar *str = row->src->str + row->entry[0].ofs; if (g_hash_table_lookup (hash, str)) { g_warning ("Duplicate row name: %s - treating rownames as data", str); g_hash_table_destroy (hash); return false; } g_hash_table_insert (hash, str, str); rows = g_list_next (rows); } g_hash_table_destroy (hash); return true; } static void load_column_labels (Row * row, GGobiData * d, gboolean row_labels) { gint i; gint offset = (row_labels ? 1 : 0); for (i = 0; i < d->ncols; i++) { if (row->entry[i + offset].len == 0) ggobi_data_set_col_name(d, i, NULL); else ggobi_data_set_col_name(d, i, row->src->str + row->entry[i + offset].ofs); } } static void load_row_labels (GList * rows, GGobiData * d, gboolean has_labels) { gint i; for (i = 0; rows; rows = g_list_next (rows), i++) { gchar *label; if (has_labels) { Row *row = (Row *) rows->data; label = g_strdup (row->src->str + row->entry[0].ofs); } else label = g_strdup_printf ("%d", i); g_array_append_val (d->rowlab, label); } } static void load_levels_from_hash (gpointer key, gpointer value, vartabled * vt) { gint val = GPOINTER_TO_INT (value); vt->level_values[val - 1] = val; vt->level_names[val - 1] = g_strdup (key); } static void load_row_values (GList * rows, GGobiData * d, gboolean row_labels) { gint i, j, offset = (row_labels ? 1 : 0); GList *cur; for (j = 0; j < d->ncols; j++) { GHashTable *hash = g_hash_table_new ((GHashFunc) g_str_hash, (GEqualFunc) g_str_equal); vartabled *vt = vartable_element_get (j, d); vt->nlevels = 0; for (cur = rows, i = 0; cur; cur = cur->next, i++) { Row *row = (Row *) cur->data; gchar *str = row->src->str + row->entry[j + offset].ofs; //fprintf(stderr, "string: %s\n", str); if (is_numeric (str, row->entry[j + offset].len) && !vt->nlevels) ggobi_data_set_raw_value(d, i, j, (gfloat) g_strtod (str, NULL)); else { if (str[0] == '\0' || !g_ascii_strcasecmp (str, "na") || !strcmp (str, ".")) { ggobi_data_set_missing(d, i, j); } else { gint index; /* values start from 1 */ //fprintf(stderr, "string: %s (%d) at %d,%d\n", str, row->entry[j + offset].len, i, j); if (!(index = GPOINTER_TO_INT (g_hash_table_lookup (hash, str)))) { index = ++(vt->nlevels); g_hash_table_insert (hash, str, GINT_TO_POINTER (index)); } d->raw.vals[i][j] = index; } } } if (vt->nlevels > 0) { vt->vartype = categorical; vt->level_values = (gint *) g_malloc (vt->nlevels * sizeof (gint)); vt->level_names = (gchar **) g_malloc (vt->nlevels * sizeof (gchar *)); g_hash_table_foreach (hash, (GHFunc) load_levels_from_hash, vt); vt->level_counts = (gint *) g_malloc0 (vt->nlevels * sizeof (gint)); for (i = 0; i < d->nrows; i++) { gint inx; if (ggobi_data_is_missing(d, i, j)) continue; inx = (gint) d->raw.vals[i][j]; vt->level_counts[inx - 1]++; } } g_hash_table_destroy (hash); } } static GGobiData * create_data (GList * rows, gchar * name) { GGobiData *d; guint nrows = g_list_length (rows), ncols = 0; gboolean row_labels = has_row_labels (rows); /* must have at least 2 CSV rows (first is column names) */ if (nrows <= 1) { g_critical("CSV file does not contain any data rows; not loading"); return(NULL); } g_return_val_if_fail(nrows > 1, NULL); ncols = ((Row *) rows->data)->rIdx; if (row_labels) ncols--; /* Initialize datad structure */ d = ggobi_data_new (nrows - 1, ncols); ggobi_data_set_name(d, name, NULL); load_column_labels ((Row *) rows->data, d, row_labels); rows = g_list_next (rows); /* skip the column labels */ load_row_labels (rows, d, row_labels); load_row_values (rows, d, row_labels); return (d); } /* This makes things a lot easier - Michael */ static void tokenize_row (Row * row) { gint i; for (i = 0; i < row->rIdx; i++) { row->src->str[row->entry[i].ofs + row->entry[i].len] = '\0'; } } GSList * read_csv_data (InputDescription * desc, ggobid * gg) { GGobiData *d; GIOChannel *channel; gint ret; GList *rows = NULL; GSList *ds = NULL; /*fprintf (stderr, "Reading csv data\n");*/ memset (isSpaceTable, 0, sizeof (isSpaceTable)); fastIsSpace ((gchar) ' ') = 1; fastIsSpace ((gchar) '\f') = 1; fastIsSpace ((gchar) '\t') = 1; fastIsSpace ((gchar) '\v') = 1; fastIsSpace ((guchar) ' ') = 1; fastIsSpace ((guchar) '\f') = 1; fastIsSpace ((guchar) '\t') = 1; fastIsSpace ((guchar) '\v') = 1; /* Open the file */ if (!(channel = g_io_channel_new_file (desc->fileName, "r", NULL))) { return false; } /* Parse each row */ do { Row *cur = g_new0 (Row, 1); ret = csv_row_parse (cur, channel, 1); if (ret >= 0 && cur->rIdx > 0) { /* skip empty rows */ tokenize_row (cur); rows = g_list_append (rows, cur); } else row_free (cur); } while (ret >= 0); /*fprintf (stderr, "Finished parsing\n");*/ /* Close the file */ g_io_channel_shutdown (channel, FALSE, NULL); /* Load the parsed data into the GGobiData */ d = create_data (rows, desc->baseName); /* Cleanup */ g_list_foreach (rows, (GFunc) row_free, NULL); g_list_free (rows); if (d) ds = g_slist_append (ds, d); return (ds); } static void row_free (Row * row) { g_string_free (row->src, true); if (row->entry) g_free (row->entry); g_free (row); } gboolean isCSVFile (const gchar * fileName, ggobid * gg, GGobiPluginInfo * plugin) { gchar *extension = strrchr (fileName, '.'); return(extension && (!strcmp (extension, ".asc") || !strcmp (extension, ".txt") || !strcmp (extension, ".csv"))); } ggobi-2.1.12/src/texture.c0000644000175000017500000002111014651527764011014 /* texture.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /*-- generates the data for a textured dotplot --*/ #include #include /*#include #include */ #include #include #include "ggobi.h" #include "externs.h" /* * The code in this file is taken from code written by Paul Tukey and * John Tukey, as described in their paper entitled * "Strips Displaying Empirical Distributions: I. Textured Dot * Strips." I've converted it to C from ratfor and modfied it so * that it returns the texture axis in the order of the original * data. */ gint myrnd (gint); /* This variable is used as a temporary global value which is used to communicate with qsort and p_sort since we have no provision from textur to pass additional arguments. In a multi-threaded version, we would need to protect this. */ static ggobid *CurrentGGobi; gint p_sort (const void *arg1, const void *arg2) { ggobid *gg = CurrentGGobi; gint val = 0; gint *x1 = (gint *) arg1; gint *x2 = (gint *) arg2; if (gg->p1d.gy[*x1] < gg->p1d.gy[*x2]) val = -1; else if (gg->p1d.gy[*x1] > gg->p1d.gy[*x2]) val = 1; return (val); } void next5 (gint * xlast, gint * perm) { /* * Extend a 5-string by 5 more numbers: * Given a last perm of length 5, choose a next perm, subject to restrictions * * perms is the list of all 32 possible permutations of (0,1,2,3,4) * with no runs up or down of length 3 * Note: for every perm in the list, (4 - perm) is also in the list, * symmetrically placed. */ gint i, j, last[5]; gint nperms = 32; static gint cumcnt[5] = { 4, 11, 19, 26, 31 }; static gint perms[32][5] = { {0, 2, 1, 4, 3}, {0, 3, 1, 4, 2}, {0, 3, 2, 4, 1}, {0, 4, 1, 3, 2}, {0, 4, 2, 3, 1}, {1, 0, 3, 2, 4}, {1, 0, 4, 2, 3}, {1, 2, 0, 4, 3}, {1, 3, 0, 4, 2}, {1, 3, 2, 4, 0}, {1, 4, 0, 3, 2}, {1, 4, 2, 3, 0}, {2, 0, 3, 1, 4}, {2, 0, 4, 1, 3}, {2, 1, 3, 0, 4}, {2, 1, 4, 0, 3}, {2, 3, 0, 4, 1}, {2, 3, 1, 4, 0}, {2, 4, 0, 3, 1}, {2, 4, 1, 3, 0}, {3, 0, 2, 1, 4}, {3, 0, 4, 1, 2}, {3, 1, 2, 0, 4}, {3, 1, 4, 0, 2}, {3, 2, 4, 0, 1}, {3, 4, 0, 2, 1}, {3, 4, 1, 2, 0}, {4, 0, 2, 1, 3}, {4, 0, 3, 1, 2}, {4, 1, 2, 0, 3}, {4, 1, 3, 0, 2}, {4, 2, 3, 0, 1} }; for (i = 0; i < 5; i++) last[i] = xlast[i]; if (last[0] == 0 && last[1] == 0) { /* * Initialize a new perm by choosing a perm at random */ j = myrnd (nperms) - 1; for (i = 0; i < 5; i++) last[i] = perms[j][i]; } /* * Randomly choose a permutation perm(1-5) from among those * that do not start with the previous digit and that make a * transition which reverses the previous direction. */ if (last[3] < last[4]) { j = myrnd (cumcnt[last[4]]) - 1; for (i = 0; i < 5; i++) perm[i] = perms[j][i]; } else { j = myrnd (cumcnt[3 - last[4]]) - 1; for (i = 0; i < 5; i++) perm[i] = 4 - perms[j][i]; } return; } void next25 (gint * tt, gint * bigt, gint * smallt) { /* * Calculate the next 25 values of a 2nd-stage shift vector * by interleaving five 5-strings */ gint i, j, k; if (bigt[0] == 0 && bigt[1] == 0) { /* * Force initialization */ bigt[20] = 0; bigt[21] = 0; for (i = 0; i < 25; i++) smallt[i] = 0; } /* * Get next 25 elements of bigt, 5 at a time */ next5 (&bigt[20], bigt); for (j = 5; j < 21; j = j + 5) next5 (&bigt[j - 5], &bigt[j]); /* * Extend each of the smallt series by 5 */ for (j = 0; j < 21; j = j + 5) next5 (&smallt[j], &smallt[j]); /* * Interleave the smallt series according to bigt */ for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) { k = 5 * i + j; tt[k] = smallt[i + 5 * bigt[k]]; } return; } void textur (gfloat * yy, gfloat * shft, gint ny, gint option, gfloat del, gint stages, ggobid * gg) { /* * Calculate a texturing shft vector based on data yy * Note: data vector yy is returned sorted * * Return shft resorted into the original order of yy. * Use the default values for these arguments, as follow: * option=1, del=1.0, stages=3 * * A bit of work is needed if we want to use option=2. */ gfloat lohnge, hihnge, delta; gfloat srnge, slo, shi; gint nny, window, mid, k, h, kk, hh; gint tmp5x5[25]; gint tlarge[25], tsmall[25]; gint i, ii; gint *indx; gfloat *xx; /* * Force initialization on first calls to next5. */ for (i = 0; i < 2; i++) tlarge[i] = tsmall[i] = 0; indx = (gint *) g_malloc (ny * sizeof (gint)); /* * gy is needed solely for the p_sort routine: p_sort is used by * qsort to put an index vector in the order that yy will assume. */ gg->p1d.gy = (gfloat *) g_malloc (ny * sizeof (gfloat)); xx = (gfloat *) g_malloc (ny * sizeof (gfloat)); for (i = 0; i < ny; i++) { indx[i] = i; gg->p1d.gy[i] = yy[i]; } CurrentGGobi = gg; qsort ((void *) indx, (gsize) ny, sizeof (gint), p_sort); qsort ((void *) yy, (gsize) ny, sizeof (gfloat), fcompare); CurrentGGobi = NULL; /* * Bug here: this is screwy if ny < 4. */ lohnge = yy[ny / 4 - 1]; hihnge = yy[ny - ny / 4 - 1]; delta = del * .03 * (hihnge - lohnge); /* * Do the first two stages of shift, based on 5-strings */ nny = ny; /* * if( option == 2 ) * nny = MIN(nny, 50); */ for (i = 0; i < nny; i++) { ii = (i % 25); if (ii == 0) next25 (tsmall, tlarge, tmp5x5); if (stages >= 2) shft[i] = (gfloat) (20 * tlarge[ii] + 4 * tsmall[ii]) + 2; else shft[i] = (gfloat) (20 * tlarge[ii]) + 2; /* * Note: we use the same tlarge 5-string both for gross shift * and to interleave the 2nd-stage 5-strings. */ } if (stages <= 1) { g_free ((gpointer) indx); g_free ((gpointer) gg->p1d.gy); g_free ((gpointer) xx); return; } /* * Optionally, add a tiny bit of uniform jitter on the smallest scale */ if (option == 1) { for (i = 0; i < ny; i++) { shft[i] = shft[i] + ((gfloat) randvalue ()) * 4 - 2; } } /* * Optionally, repeat first block of 50, shifting the first 25 by a bit * else if (option == 2) * { * for (i=0; i<25 && i yy[h] + 10. * delta) break; if (k - mid + window >= ny) break; hh = h - mid; kk = k - h + window; slo = 5; shi = 0; for (i = hh; i < hh + kk; i++) { if (shft[i] < slo) slo = shft[i]; if (shft[i] > shi) shi = shft[i]; } srnge = shi - slo; for (i = hh; i < kk; i++) shft[i] = 100 * (shft[i] - slo) / srnge; h = k + window; } /* * Again looking at y values, pull points back to center thread, * or to the 30% and 70% positions, in sparse regions */ for (i = 1; i < ny - 1; i++) { if ((yy[i] - yy[i - 1] > delta) && (yy[i + 1] - yy[i] > delta)) { shft[i] = 50; } } for (i = 1; i < ny - 2; i++) { if ((yy[i] - yy[i - 1] > delta) && (yy[i + 2] - yy[i + 1] > delta) && (yy[i + 1] - yy[i] < delta)) { shft[i] = 30; shft[i + 1] = 70; } } if (yy[1] - yy[0] > delta) shft[0] = 50; if (yy[ny - 1] - yy[ny - 2] > delta) shft[ny - 1] = 50; if ((yy[2] - yy[1] > delta) && (yy[1] - yy[0] < delta)) { shft[0] = 30; shft[1] = 70; } if ((yy[ny - 1] - yy[ny - 2] < delta) && (yy[ny - 2] - yy[ny - 3] > delta)) { shft[ny - 2] = 30; shft[ny - 1] = 70; } for (i = 0; i < ny; i++) xx[indx[i]] = shft[i]; for (i = 0; i < ny; i++) shft[i] = xx[i]; g_free ((gpointer) indx); g_free ((gpointer) gg->p1d.gy); g_free ((gpointer) xx); return; } gint myrnd (gint n) { /* * Select a random integer between 1 and n */ gint nn, myrndval; gfloat rrand; nn = MAX (n, 1); rrand = (gfloat) randvalue (); myrndval = MIN (nn, (gint) (rrand * (gfloat) nn) + 1); return (myrndval); } ggobi-2.1.12/src/ppcorr_ui.c0000644000175000017500000001213514651527764011325 /* ppcorr_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #define WIDTH 600 #define HEIGHT 300 static GtkWidget *window = NULL; static GtkWidget *control_frame; static GtkWidget *mbar; //static GtkAccelGroup *cpp_accel_group; static void hide_cb (GtkAction * action, GtkWidget * window) { gtk_widget_hide (window); } static void optimize_cb (GtkToggleButton * w) { g_printerr ("optimize? %d\n", w->active); } static const gchar *ui_str = "" " " " " " " " " " " ""; static GtkActionEntry entries[] = { {"File", NULL, "_File"}, {"Close", GTK_STOCK_CLOSE, "_Close", "C", "Hide the projection pursuit window", G_CALLBACK (hide_cb) } }; static guint n_entries = G_N_ELEMENTS (entries); /* static GtkItemFactoryEntry menu_items[] = { { "/_File", NULL, NULL, 0, "" }, { "/File/Close", "", (GtkItemFactoryCallback) hide_cb, 0, "" }, };*/ void ctourpp_window_open (ggobid * gg) { GtkWidget *hbox, *vbox, *vbc, *frame, *tgl, *entry; GtkWidget *da, *label, *hb; if (window == NULL) { GtkActionGroup *actions = gtk_action_group_new ("PPActions"); GtkUIManager *manager = gtk_ui_manager_new (); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (hide_cb), (gpointer) NULL); gtk_window_set_title (GTK_WINDOW (window), "Projection Pursuit"); //gtk_window_set_policy (GTK_WINDOW (window), true, true, false); gtk_container_set_border_width (GTK_CONTAINER (window), 5); /* * Add the main menu bar */ vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (vbox), 1); gtk_container_add (GTK_CONTAINER (window), vbox); /* cpp_accel_group = gtk_accel_group_new (); get_main_menu (menu_items, sizeof (menu_items) / sizeof (menu_items[0]), cpp_accel_group, window, &mbar, (gpointer) window); */ gtk_action_group_add_actions (actions, entries, n_entries, window); gtk_ui_manager_insert_action_group (manager, actions, 0); mbar = create_menu_bar (manager, ui_str, window); g_object_unref (G_OBJECT (actions)); gtk_box_pack_start (GTK_BOX (vbox), mbar, false, true, 0); /* * Divide the window: controls on the left, plot on the right */ hbox = gtk_hbox_new (false, 1); gtk_container_set_border_width (GTK_CONTAINER (hbox), 1); gtk_box_pack_start (GTK_BOX (vbox), hbox, true, true, 1); /* * Controls */ control_frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (control_frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (control_frame), 5); gtk_box_pack_start (GTK_BOX (hbox), control_frame, false, false, 1); vbc = gtk_vbox_new (false, 5); gtk_container_set_border_width (GTK_CONTAINER (vbc), 5); gtk_container_add (GTK_CONTAINER (control_frame), vbc); /* * Optimize toggle */ tgl = gtk_check_button_new_with_mnemonic ("_Optimize"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Guide the tour using projection pursuit optimization or tour passively", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (optimize_cb), (gpointer) NULL); gtk_box_pack_start (GTK_BOX (vbc), tgl, false, false, 1); /* * Index value with label */ hb = gtk_hbox_new (false, 3); gtk_box_pack_start (GTK_BOX (vbc), hb, false, false, 2); label = gtk_label_new ("PP index:"); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_box_pack_start (GTK_BOX (hb), label, false, false, 0); entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (entry), 32); gtk_editable_set_editable (GTK_EDITABLE (entry), false); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), entry, "The value of the projection pursuit index for the current projection", NULL); gtk_box_pack_start (GTK_BOX (hb), entry, false, false, 2); /* * Drawing area in a frame */ frame = gtk_frame_new (NULL); //gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_set_border_width (GTK_CONTAINER (frame), 5); gtk_box_pack_start (GTK_BOX (hbox), frame, true, true, 1); da = gtk_drawing_area_new (); gtk_widget_set_double_buffered (da, false); gtk_widget_set_size_request (GTK_WIDGET (da), WIDTH, HEIGHT); gtk_container_add (GTK_CONTAINER (frame), da); } gtk_widget_show_all (window); } ggobi-2.1.12/src/utils_ui.c0000644000175000017500000006776714651527764011205 /*-- utils_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" GtkWidget *CreateMenuItemWithCheck (GtkWidget * menu, gchar * szName, gchar * szAccel, gchar * szTip, GtkWidget * win_main, GtkAccelGroup * accel_group, GtkSignalFunc func, gpointer data, ggobid * gg, GSList * radiogroup, gboolean check); /* * Taken from 'Developing Linux Applications with GTK+ and GDK' * by Eric Harlow. */ /* * CreateMenuItem * * Creates an item and puts it in the menu and returns the item. * * menu - container menu * szName - Name of the menu - NULL for a separator * szAccel - Acceleration string - "^C" for Control-C * szTip - Tool tip * func - Call back function * data - call back function data * * returns new menuitem */ GtkWidget * CreateMenuItem (GtkWidget * menu, gchar * szName, gchar * szAccel, gchar * szTip, GtkWidget * win_main, GtkAccelGroup * accel_group, GtkSignalFunc func, gpointer data, ggobid * gg) { return (CreateMenuItemWithCheck (menu, szName, szAccel, szTip, win_main, accel_group, func, data, gg, NULL, false)); } GtkWidget * CreateMenuItemWithCheck (GtkWidget * menu, gchar * szName, gchar * szAccel, gchar * szTip, GtkWidget * win_main, GtkAccelGroup * accel_group, GtkSignalFunc func, gpointer data, ggobid * gg, GSList * RadioGroup, gboolean check) { GtkWidget *menuitem; if (check && RadioGroup == NULL) { menuitem = gtk_radio_menu_item_new (RadioGroup); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); RadioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); } /* --- If there's a name, create the item and add the signal handler --- */ if (szName && strlen (szName)) { menuitem = check ? gtk_radio_menu_item_new_with_label (RadioGroup, szName) : gtk_menu_item_new_with_label (szName); if (func) g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (func), data); GGobi_widget_set (GTK_WIDGET (menuitem), gg, true); } else { /* --- Create a separator --- */ menuitem = check ? gtk_radio_menu_item_new (RadioGroup) : gtk_menu_item_new (); } if (check) RadioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); /* --- Add menu item to the menu and show it. --- */ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); /* --- If there was an accelerator --- */ if (szAccel && accel_group) { if (szAccel[0] == '^') { /* control-keypress */ gtk_widget_add_accelerator (menuitem, "activate", accel_group, szAccel[1], GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); /* How can I find out if there's an item already using this signal? Sheesh, nothing seems to work. */ } else { /* alt-keypress */ gtk_widget_add_accelerator (menuitem, "activate", accel_group, szAccel[0], GDK_MOD1_MASK, GTK_ACCEL_VISIBLE); } } /* --- If there was a tool tip --- */ if (szTip && strlen (szTip)) gtk_tooltips_set_tip (gg->tips, menuitem, szTip, NULL); return (menuitem); } /* * Taken from 'Developing Linux Applications with GTK+ and GDK' * by Eric Harlow. */ /* * CreateMenuCheck * * Create a menu checkbox * * menu - container menu * szName - name of the menu * func - Call back function. * data - call back function data * state - whether it's on or not * * returns new menuitem */ GtkWidget * CreateMenuCheck (GtkWidget * menu, gchar * szName, GtkSignalFunc func, gpointer data, gboolean state, ggobid * gg) { GtkWidget *menuitem; /* --- Create menu item --- */ menuitem = gtk_check_menu_item_new_with_label (szName); /*-- display always, not just when the mouse floats over --*/ /* I don't even think this is possible in GTK2 - mfl */ //gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menuitem), true); GGobi_widget_set (GTK_WIDGET (menuitem), gg, true); /* --- set its state --- */ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), state); /* --- Add it to the menu --- */ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); /* --- Listen for "toggled" messages --- */ g_signal_connect (G_OBJECT (menuitem), "toggled", G_CALLBACK (func), data); return (menuitem); } /* * Function to open a dialog box displaying the message provided. * Now based on GTK2 convenience class GtkMessageDialog */ void quick_message (const gchar * const message, gboolean modal) { GtkWidget *dialog; /* Create the widgets */ dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", message); if (modal) gtk_window_set_modal (GTK_WINDOW (dialog), true); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); } /* This function produces a menu bar from a GtkUIManager and ui spec. It accepts a GtkUIManager that is assumed to be configured with the necessary actions referenced from the ui_xml that is loaded into the manager before creation of the menubar. If window is non-NULL then the accelerators from the GtkUIManager are loaded into the specified window. */ GtkWidget * create_menu_bar (GtkUIManager * manager, const gchar * ui_xml, GtkWidget * window) { GError *error = NULL; GtkWidget *mbar = NULL; if (!gtk_ui_manager_add_ui_from_string (manager, ui_xml, -1, &error)) { g_message ("building ui failed: %s\n", error->message); g_error_free (error); } else { if (window) { gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (manager)); g_object_set_data_full (G_OBJECT (window), "ui-manager", manager, g_object_unref); } mbar = gtk_ui_manager_get_widget (manager, "/menubar"); } return (mbar); } void populate_combo_box (GtkWidget * combo_box, gchar ** lbl, gint nitems, GCallback func, gpointer obj) { gint i; for (i = 0; i < nitems; i++) { gtk_combo_box_append_text (GTK_COMBO_BOX (combo_box), lbl[i]); } //gtk_combo_box_set_add_tearoffs(GTK_COMBO_BOX(combo_box), true); gtk_combo_box_set_active (GTK_COMBO_BOX (combo_box), 0); if (func) g_signal_connect (G_OBJECT (combo_box), "changed", G_CALLBACK (func), obj); } /* adds columns to the tree_view labeled by lbl. If headers is true, the headers are displayed, otherwise they are not and the labels are ignored. Columns are only added for non-NULL labels if headers is true. The callback is connected to the 'changed' signal of the associated GtkTreeSelection. The columns render text from the corresponding model columns. */ void populate_tree_view (GtkWidget * tree_view, gchar ** lbl, gint nitems, gboolean headers, GtkSelectionMode mode, GCallback func, gpointer obj) { gint i; GtkTreeSelection *sel; for (i = 0; i < nitems; i++) { if (!headers || lbl[i]) { GtkTreeViewColumn *col = gtk_tree_view_column_new_with_attributes (headers ? lbl[i] : NULL, gtk_cell_renderer_text_new (), "markup", i, NULL); gtk_tree_view_column_set_sort_column_id (col, i); gtk_tree_view_column_set_resizable (col, true); gtk_tree_view_insert_column (GTK_TREE_VIEW (tree_view), col, -1); } } gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), headers); sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); gtk_tree_selection_set_mode (sel, mode); if (func) g_signal_connect (G_OBJECT (sel), "changed", G_CALLBACK (func), obj); } void scale_set_default_values (GtkScale * scale) { gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_CONTINUOUS); gtk_scale_set_draw_value (scale, false); } /*--------------------------------------------------------------------*/ /* Notebook containing the variable list for each datad */ /*--------------------------------------------------------------------*/ void variable_notebook_subwindow_add (GGobiData * d, GCallback func, gpointer func_data, GtkWidget * notebook, vartyped vtype, datatyped dtype, ggobid * gg) { GtkWidget *swin, *tree_view; GtkListStore *model; GtkTreeIter iter; gint j; vartabled *vt; GtkSelectionMode mode = (GtkSelectionMode) g_object_get_data (G_OBJECT (notebook), "SELECTION"); if (d->ncols == 0) return; if (vtype == categorical) { /* is there in fact a categorical variable? */ gboolean categorical_variable_present = false; for (j = 0; j < g_slist_length (d->vartable); j++) { vt = (vartabled *) g_slist_nth_data (d->vartable, j); if (vt->vartype == categorical) { categorical_variable_present = true; break; } } if (!categorical_variable_present) return; } /* Create a scrolled window to pack the tree view widget into */ swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin), GTK_SHADOW_NONE); g_object_set_data (G_OBJECT (swin), "datad", d); /*setdata */ /* * name or nickname? Which one we'd prefer to use depends on the * size of the space we're working in -- maybe this will become an * argument. */ gtk_notebook_append_page (GTK_NOTEBOOK (notebook), swin, (d->nickname != NULL) ? gtk_label_new (d->nickname) : gtk_label_new (d-> name)); /* add the tree view */ model = gtk_list_store_new (VARLIST_NCOLS, G_TYPE_STRING, G_TYPE_INT); tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model)); gtk_widget_set_size_request (tree_view, -1, 70); g_object_set_data (G_OBJECT (tree_view), "datad", d); if (!func_data) func_data = gg; populate_tree_view (tree_view, NULL, 1, false, mode, func, func_data); gtk_tree_view_column_set_spacing (gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), 0), 0); //if(func) // g_signal_connect (G_OBJECT (tree_view), "select_row", G_CALLBACK (func), gg); for (j = 0; j < d->ncols; j++) { vt = vartable_element_get (j, d); if (vtype == all_vartypes || vtype == vt->vartype) { gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, VARLIST_NAME, vt->collab_tform, VARLIST_INDEX, j, -1); } } gtk_container_add (GTK_CONTAINER (swin), tree_view); gtk_widget_show_all (swin); } static void variable_notebook_adddata_cb (ggobid * gg, GGobiData * d, void *notebook) { GCallback func; gpointer func_data; vartyped vtype; datatyped dtype; func = G_CALLBACK (g_object_get_data (G_OBJECT (notebook), "selection-func")); func_data = g_object_get_data (G_OBJECT (notebook), "selection-func-data"); vtype = (vartyped) g_object_get_data (G_OBJECT (notebook), "vartype"); dtype = (vartyped) g_object_get_data (G_OBJECT (notebook), "datatype"); if ((dtype == all_datatypes) || (dtype == no_edgesets && d->edge.n == 0) || (dtype == edgesets_only && d->edge.n > 0)) { if (g_slist_length (d->vartable)) { variable_notebook_subwindow_add (d, func, func_data, notebook, vtype, dtype, gg); } } // Removing this line fixes identify; I'm not sure if it hurts // anything else -- dfs. //gtk_notebook_set_show_tabs (GTK_NOTEBOOK (GTK_OBJECT(notebook)), // g_slist_length (gg->d) > 1); } void variable_notebook_handlers_disconnect (GtkWidget * notebook, ggobid * gg) { g_signal_handlers_disconnect_by_func (G_OBJECT (gg), G_CALLBACK (variable_notebook_varchange_cb), GTK_OBJECT (notebook)); g_signal_handlers_disconnect_by_func (G_OBJECT (gg), G_CALLBACK (variable_notebook_varchange_cb), GTK_OBJECT (notebook)); g_signal_handlers_disconnect_by_func (G_OBJECT (gg), G_CALLBACK (variable_notebook_adddata_cb), GTK_OBJECT (notebook)); } GtkWidget * get_tree_view_from_object (GObject * obj) { GtkWidget *notebook = NULL, *swin = NULL, *tree_view = NULL; gint page; if (obj != NULL) { /*-- find the current notebook page, then get the current tree_view --*/ notebook = (GtkWidget *) g_object_get_data (obj, "notebook"); if (notebook && GTK_IS_NOTEBOOK (notebook)) { page = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook)); swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page); if (swin) { tree_view = GTK_BIN (swin)->child; } } } return tree_view; } gint /*-- assumes GTK_SELECTION_SINGLE --*/ get_one_selection_from_tree_view (GtkWidget * tree_view, GGobiData * d) { GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); GtkTreeModel *model; GtkTreeIter iter; gint selected_var = -1; gboolean selected = gtk_tree_selection_get_selected (sel, &model, &iter); if (selected) gtk_tree_model_get (model, &iter, VARLIST_INDEX, &selected_var, -1); return selected_var; } /** returns the dataset indices of the view's selected variables */ gint * /*-- assumes multiple selection is possible --*/ get_selections_from_tree_view (GtkWidget * tree_view, gint * nvars) { GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); GtkTreeModel *model; GtkTreeIter iter; GList *rows, *l; gint selected_var, i; gint *vars; rows = gtk_tree_selection_get_selected_rows (sel, &model); *nvars = g_list_length (rows); vars = g_new (gint, *nvars); for (l = rows, i = 0; l; l = l->next, i++) { GtkTreePath *path = (GtkTreePath *) l->data; gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, VARLIST_INDEX, &selected_var, -1); vars[i] = selected_var; gtk_tree_path_free (path); } g_list_free (rows); return vars; } void select_tree_view_row (GtkWidget * tree_view, gint row) { GtkTreeSelection *tree_sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); GtkTreePath *path = gtk_tree_path_new_from_indices (row, -1); gtk_tree_selection_select_path (tree_sel, path); gtk_tree_path_free (path); } /** gets the selected row index from a GtkTreeSelection in 'single' mode. if the model is a GtkTreeModelSort, it will get the row index in the child model note: only works for flat views */ gint tree_selection_get_selected_row (GtkTreeSelection * tree_sel) { GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path, *child_path; gint row = -1; gboolean selected; selected = gtk_tree_selection_get_selected (tree_sel, &model, &iter); if (selected) { path = gtk_tree_model_get_path (model, &iter); if (GTK_IS_TREE_MODEL_SORT (model)) { child_path = gtk_tree_model_sort_convert_path_to_child_path (GTK_TREE_MODEL_SORT (model), path); gtk_tree_path_free (path); path = child_path; } row = gtk_tree_path_get_indices (path)[0]; gtk_tree_path_free (path); } return (row); } /*-------------------------------------------------------------------------*/ /* * Notice that this callback could be used to respond to any * change in the variable list, because it doesn't count the * number of variables; it just clears the list and then * rebuilds it. */ void variable_notebook_varchange_cb (ggobid * gg, vartabled * vt, gint which, GGobiData * data, void *notebook) { GtkWidget *swin, *tree_view; GGobiData *d; gint kd = -1; /*-- add one or more variables to this datad --*/ d = (GGobiData *) datad_get_from_notebook (GTK_WIDGET (notebook), gg); kd = g_slist_index (gg->d, d); /*-- get the tree_view associated with this data; clear and rebuild --*/ swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), kd); if (swin) { gint j; vartabled *vt; GtkTreeModel *model; GtkTreeIter iter; tree_view = GTK_BIN (swin)->child; model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); gtk_list_store_clear (GTK_LIST_STORE (model)); for (j = 0; j < d->ncols; j++) { vt = vartable_element_get (j, d); if (vt) { gtk_list_store_append (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, VARLIST_NAME, vt->collab_tform, VARLIST_INDEX, j, -1); } } } } void variable_notebook_list_changed_cb (ggobid * gg, GGobiData * d, void *notebook) { variable_notebook_varchange_cb (gg, NULL, -1, d, notebook); } CHECK_EVENT_SIGNATURE (variable_notebook_adddata_cb, datad_added_f) CHECK_EVENT_SIGNATURE (variable_notebook_varchange_cb, variable_added_f) CHECK_EVENT_SIGNATURE (variable_notebook_list_changed_cb, variable_list_changed_f) GtkWidget *create_variable_notebook (GtkWidget * box, GtkSelectionMode mode, vartyped vtype, datatyped dtype, GtkSignalFunc func, gpointer func_data, ggobid * gg) { GtkWidget *notebook; //gint nd = g_slist_length (gg->d); GSList *l; GGobiData *d; /* Create a notebook, set the position of the tabs */ notebook = gtk_notebook_new (); /* gtk_notebook_set_homogeneous_tabs (GTK_NOTEBOOK (notebook), true); */ gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); // This will have to be done per notebook. //gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), nd > 1); gtk_box_pack_start (GTK_BOX (box), notebook, true, true, 2); g_object_set_data (G_OBJECT (notebook), "SELECTION", (gpointer) mode); g_object_set_data (G_OBJECT (notebook), "selection-func", func); g_object_set_data (G_OBJECT (notebook), "selection-func-data", func_data); g_object_set_data (G_OBJECT (notebook), "vartype", (gpointer) vtype); g_object_set_data (G_OBJECT (notebook), "datatype", (gpointer) dtype); for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if ((dtype == all_datatypes) || (dtype == no_edgesets && d->edge.n == 0) || (dtype == edgesets_only && d->edge.n > 0)) { if (g_slist_length (d->vartable)) { variable_notebook_subwindow_add (d, func, func_data, notebook, vtype, dtype, gg); } } } /*-- listen for variable_added and _list_changed events on main_window --*/ /*-- ... list_changed would be enough --*/ g_signal_connect (G_OBJECT (gg), "variable_added", G_CALLBACK (variable_notebook_varchange_cb), GTK_OBJECT (notebook)); g_signal_connect (G_OBJECT (gg), "variable_list_changed", G_CALLBACK (variable_notebook_list_changed_cb), GTK_OBJECT (notebook)); /*-- listen for datad_added events on main_window --*/ g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK (variable_notebook_adddata_cb), GTK_OBJECT (notebook)); return notebook; } static void variable_notebook_page_add_prefices (GtkWidget * notebook, gint page) { GtkTreeIter iter; gint i, sel_prefix, n_prefices; GtkWidget *nth_page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), page); GGobiData *d; if (!nth_page) return; d = g_object_get_data (G_OBJECT (nth_page), "datad"); GtkWidget *view = GTK_BIN (nth_page)->child; GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (view)); GGobiVariableNotebookPrefixFunc p_func = g_object_get_data (G_OBJECT (notebook), "prefix_func"); const gchar **prefices = p_func (notebook, d, &sel_prefix, &n_prefices); for (i = n_prefices - 1; i >= 0; i--) { gtk_list_store_insert (GTK_LIST_STORE (model), &iter, 0); gtk_list_store_set (GTK_LIST_STORE (model), &iter, VARLIST_NAME, prefices[i], VARLIST_INDEX, -(n_prefices - i), -1); } if (sel_prefix >= 0) { select_tree_view_row (view, sel_prefix); } } static void prefixed_variable_notebook_varchange_cb (ggobid * gg, vartabled * vt, gint which, GGobiData * data, void *notebook) { GGobiData *d; gint kd; d = (GGobiData *) datad_get_from_notebook (GTK_WIDGET (notebook), gg); kd = g_slist_index (gg->d, d); variable_notebook_page_add_prefices (GTK_WIDGET (notebook), kd); } void prefixed_variable_notebook_list_changed_cb (ggobid * gg, GGobiData * d, GtkNotebook * notebook) { prefixed_variable_notebook_varchange_cb (gg, NULL, -1, d, notebook); } static void prefixed_variable_notebook_adddata_cb (ggobid * gg, GGobiData * d, void *notebook) { datatyped dtype = (datatyped) g_object_get_data (G_OBJECT (notebook), "datatype"); if ((dtype == all_datatypes) || (dtype == no_edgesets && d->edge.n == 0) || (dtype == edgesets_only && d->edge.n > 0)) { if (g_slist_length (d->vartable)) variable_notebook_page_add_prefices (GTK_WIDGET (notebook), gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) - 1); } } /* modeled on the routine in brush_link.c void prefixed_variable_notebook_current_page_set (displayd *display, GtkWidget *notebook, ggobid *gg) { GtkWidget *swin; GGobiData *d = display->d, *paged; gint page_num, cur_page_num; if (notebook == NULL) { return; } page_num = 0; swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK(notebook), page_num); while (swin) { paged = (GGobiData *) g_object_get_data (G_OBJECT (swin), "datad"); gtk_widget_set_sensitive (swin, (paged == d)); if (paged == d) { gtk_notebook_set_current_page (GTK_NOTEBOOK(notebook), page_num); break; } page_num += 1; swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK(notebook), page_num); } } */ GtkWidget * create_prefixed_variable_notebook (GtkWidget * box, GtkSelectionMode mode, vartyped vtype, datatyped dtype, GtkSignalFunc func, gpointer func_data, ggobid * gg, GGobiVariableNotebookPrefixFunc prefix_func) { gint i; GtkWidget *notebook = create_variable_notebook (box, mode, vtype, dtype, func, func_data, gg); g_object_set_data (G_OBJECT (notebook), "prefix_func", prefix_func); for (i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); i++) variable_notebook_page_add_prefices (notebook, i); g_signal_connect (G_OBJECT (gg), "variable_added", G_CALLBACK (prefixed_variable_notebook_varchange_cb), GTK_OBJECT (notebook)); g_signal_connect (G_OBJECT (gg), "variable_list_changed", G_CALLBACK (prefixed_variable_notebook_list_changed_cb), GTK_OBJECT (notebook)); g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK (prefixed_variable_notebook_adddata_cb), GTK_OBJECT (notebook)); return (notebook); } /*--------------------------------------------------------------------*/ /* These are for the benefit of plugins, though they might have other */ /* uses as well */ /* - might be nice to move to a GtkUIManager paradigm here... mfl */ /*--------------------------------------------------------------------*/ GtkWidget * GGobi_addDisplayMenuItem (const gchar * label, ggobid * gg) { GtkWidget *entry = NULL; GtkWidget *dpy_menu = gg->display_menu; /*-- this is null --*/ GGobiData *data; if (dpy_menu != NULL) { entry = gtk_menu_item_new_with_mnemonic (label); data = GGobi_data_get (0, gg); g_object_set_data (G_OBJECT (entry), "data", (gpointer) data); gtk_widget_show (entry); /* Add a separator */ CreateMenuItem (dpy_menu, NULL, "", "", NULL, NULL, NULL, NULL, gg); gtk_menu_shell_append (GTK_MENU_SHELL (dpy_menu), entry); } return (entry); } gboolean GGobi_addToolsMenuWidget (GtkWidget * entry, ggobid * gg) { GtkWidget *tools_menu = NULL, *tools_item = NULL; GtkUIManager *manager; manager = gg->main_menu_manager; /* gtk_item_factory_from_path ("
"); */ tools_item = gtk_ui_manager_get_widget (manager, "/menubar/Tools"); if (tools_item) tools_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (tools_item)); if (tools_menu) { gtk_menu_shell_append (GTK_MENU_SHELL (tools_menu), entry); } else return (false); return (true); } void GGobi_addToolAction (GtkActionEntry * entry, gpointer * data, ggobid * gg) { GtkActionGroup *actions = gtk_action_group_new (entry->name); gtk_action_group_add_actions (actions, entry, 1, data); gtk_ui_manager_insert_action_group (gg->main_menu_manager, actions, -1); gtk_ui_manager_add_ui (gg->main_menu_manager, gtk_ui_manager_new_merge_id (gg->main_menu_manager), "/menubar/Tools/", entry->name, entry->name, GTK_UI_MANAGER_AUTO, false); } GtkWidget * GGobi_addToolsMenuItem (gchar * lbl, ggobid * gg) { GtkWidget *entry; if (!lbl) { return (NULL); } /*-- purify goes crazy here, and I have no idea why -- dfs --*/ entry = gtk_menu_item_new_with_mnemonic (lbl); if (GGobi_addToolsMenuWidget (entry, gg) == false) { gtk_widget_destroy (entry); } else gtk_widget_show (entry); return (entry); } /* * Several tables use notebook widgets to separate the controls * corresponding to different datad's. This is a way to figure * out which datad we should be operating on in that case. */ GGobiData* datad_get_from_notebook (GtkWidget *notebook, ggobid *gg) { GGobiData *d = NULL; //gint nd = g_slist_length (gg->d); //if (nd == 1) { // d = gg->d->data; //} else { GtkNotebook *nb = GTK_NOTEBOOK (notebook); gint indx = gtk_notebook_get_current_page (nb); GtkWidget *page = gtk_notebook_get_nth_page (nb, indx); // Assume that each notebook page has a datad attached. if (page) { d = g_object_get_data (G_OBJECT(page), "datad"); } //} return d; } ggobi-2.1.12/src/types.h0000644000175000017500000001656114651527764010503 /*-- types.h --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef TYPES_H #define TYPES_H #include typedef struct { GtkWidget *w; gchar *name; } modepaneld; /* * greal is at several steps in the pipeline, in particular * for world, jitdata, and planar, as we eliminate the conversion * to longs. Defining 'greal' allows us to compare the behavior * of floats and doubles for speed and storage. */ typedef gfloat greal; typedef enum {Sprocess_data, xml_data, mysql_data, url_data, csv_data, unknown_data, num_data_modes} DataMode; typedef enum {NONE, EXPOSE, QUICK, BINNED, FULL, FULL_1PIXMAP} RedrawStyle; /* see varpanel_ui.c and especially varpanel_names. */ enum {VARSEL_X, VARSEL_Y, VARSEL_Z, VARSEL_LABEL}; /* For use in the sticky_point_added and sticky_point_removed events. */ typedef enum {STICKY, UNSTICKY} PointIdentifyState; typedef enum {DOT_GLYPH=0, PLUS, X, OC, OR, FC, FR, UNKNOWN_GLYPH} GlyphType; typedef enum {ADDING_EDGES=0, ADDING_POINTS} eeMode; typedef enum { IMP_RANDOM, IMP_FIXED, IMP_BELOW, IMP_ABOVE, IMP_MEAN, IMP_MEDIAN } ImputeType; typedef struct { GlyphType type; gint size; } glyphd; typedef struct { glong x, y; } lcoords; typedef struct { greal x, y; } gcoords; typedef struct { gint x, y; } icoords; typedef struct { gfloat x, y; } fcoords; typedef struct { gfloat min, max; } lims; typedef struct { gint a, b; /* * by default, jpartner = -1, but if this edge is one of a * bidirectional pair, jpartner is the index of the edge going * in the other direction. */ gint jpartner; } endpointsd; /* The symbolic edge description which keeps the endpoints as record ids */ typedef gchar *RecordKey; typedef struct { RecordKey a; RecordKey b; gint jpartner; } SymbolicEndpoints; typedef struct { gchar *a; gchar *b; gint jcase; } SortableEndpoints; typedef struct { endpointsd *endpoints; GObject *data; // GGobiData pointer } DatadEndpoints; /*-- arrays --*/ /*-- double: some plugins will want these --*/ typedef struct { gdouble **vals; guint nrows, ncols; } array_d; /*-- floating point: for gg.raw_data, tform1, tform2 --*/ typedef struct { gfloat **vals; guint nrows, ncols; } array_f; /*-- short: for gg.missing --*/ typedef struct { gshort **vals; guint nrows, ncols; } array_s; /*-- long: for world, jitdata --*/ typedef struct { glong **vals; guint nrows, ncols; } array_l; /*-- real: for the new world, jitdata --*/ typedef struct { greal **vals; guint nrows, ncols; } array_g; /*-- vectors --*/ typedef struct { gdouble *els; guint nels; } vector_d; typedef struct { gfloat *els; guint nels; } vector_f; typedef struct { gint *els; guint nels; } vector_i; typedef struct { gshort *els; guint nels; } vector_s; typedef struct { gboolean *els; guint nels; } vector_b; typedef struct { glyphd *els; guint nels; } vector_g; typedef struct { /*-- used for obtaining ranks --*/ gfloat f; gint indx; } paird; /*-- used to keep track of history in moving points --*/ typedef struct { gint i, j; gfloat val; } celld; typedef gint (*Tour_PPIndex_f)(array_f *pd, void *params, gfloat *val, gpointer userData); typedef struct { gchar *ppIndexName; /* a string that can be used in the GUI to describe this PP index. */ Tour_PPIndex_f index_f; /* The C routine that calculates the PP index value.*/ gboolean checkGroups; /* Whether we have to call compute_groups and calculate the index only if this returns false(). */ gpointer userData; /* arbitrary data object that is passed in the call to index_f to parameterize it. */ } TourPPIndex; /*-- tour elements --*/ typedef struct { gint datadim, projdim; /* * the variables that are in the current subset, and represented by * circles or rectangles in the right-hand pane. */ gint nsubset; vector_i subset_vars; vector_b subset_vars_p; /* * Of the variables in the current subset, these are the variables * that are currently touring. Their meaning remains the same * despite the variable selection panel redesign. */ gint nactive; vector_i active_vars; vector_b active_vars_p; /* */ array_d Fa, Fz, F, Ga, Gz, G, Va, Vz, tv; vector_f lambda, tau, tinc; gfloat dist_az, delta, tang; gint target_selection_method; gint idled; gboolean get_new_target; gint index; /* this is for counting planes passed */ gfloat ppval, oppval; /* for projection pursuit */ } tour; typedef struct { vector_i ngroup, group; /* for class indices */ gint numgroups; /* previously called groups in class code */ array_d cov, tcov, mean; /* for lda, holes, cm */ vector_d ovmean; /* for lda, holes, cm */ vector_i nright, index; /* for gini, entropy */ vector_d x; /* for gini, entropy */ } pp_param; typedef struct { gfloat temp_start, temp_end, cooling, heating, temp, index_best; gint restart, maxproj, success; array_f proj_best, data, pdata; } optimize0_param; /* * display options */ typedef struct { gboolean points_show_p; /* scatterplot, scatmat, parcoords */ gboolean axes_show_p; /* scatterplot, scatmat, parcoords */ gboolean axes_label_p; /* scatterplot; tour */ gboolean axes_values_p; /* scatterplot; tour */ gboolean edges_undirected_show_p; /* scatterplot */ gboolean edges_arrowheads_show_p; /* scatterplot */ gboolean edges_directed_show_p; /* scatterplot: both of the above */ gboolean whiskers_show_p; /* parcoords, time series */ /* unused gboolean missings_show_p; * scatterplot, scatmat, parcoords * gboolean axes_center_p; * scatterplot * gboolean double_buffer_p; * parcoords * gboolean link_p; * scatterplot, scatmat, parcoords * */ } DisplayOptions; extern DisplayOptions DefaultDisplayOptions; /* bin struct for bins in Barcharts, histograms, ... */ typedef struct { glong count, nhidden; /* dfs: count includes nhidden */ gint index; gint value; /* dfs; restricting index to non-categorical variables */ gcoords planar; GdkRectangle rect; } gbind; /* end bind */ /* structure for a barchart, in splotd only a pointer to this structure is made to save memory */ typedef struct { gboolean is_histogram; /* true if variable not categorical */ gboolean is_spine; /* false by default */ gint nbins; gint new_nbins; gint ncolors; gint maxbincounts; gbind *bins; gbind **cbins; gfloat *breaks; GdkPoint anchor_rgn[4]; GdkPoint offset_rgn[4]; gboolean anchor_drag; gboolean width_drag; gfloat offset; /* whenever points in histograms "overflow" to the left or right of the first or last bin, they need a place to stay */ gboolean high_pts_missing; gboolean low_pts_missing; gbind *high_bin; gbind *low_bin; gbind *col_high_bin; gbind *col_low_bin; /* identify bars */ gboolean *bar_hit; gboolean *old_bar_hit; gboolean same_hits; gint old_nbins; vector_i index_to_rank; } barchartd; #define TYPES_H #endif ggobi-2.1.12/src/tour_pp.c0000644000175000017500000007202314651527764011015 /* tour_pp.c */ /* Copyright (C) 2001 Dianne Cook and Sigbert Klinke and Eun-Kyung Lee This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA The authors can be contacted at the following email addresses: dicook@iastate.edu sigbert@wiwi.hu-berlin.de */ #include #ifdef USE_STRINGS_H #include #endif #include #include #include #include #if !defined __APPLE__ && !defined __GNUC__ #endif #include "vars.h" #include "externs.h" #include "tour_pp.h" #include "tour1d_pp.h" #include "tour2d_pp.h" gfloat randomval, nrand; gint nset; /* reset pp variables */ void reset_pp(GGobiData *d, gint nprev, gint b, ggobid *gg, void *data) { displayd *dsp; GList *l; for (l=gg->displays; l; l=l->next) { dsp = (displayd *) l->data; if (dsp->t1d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t1d_window)) { free_optimize0_p(&dsp->t1d_pp_op); alloc_optimize0_p(&dsp->t1d_pp_op, d->nrows_in_plot, dsp->t1d.nactive, 1); t1d_pp_reinit(dsp, gg); } if (dsp->t2d_window != NULL && GTK_WIDGET_VISIBLE (dsp->t2d_window)) { free_optimize0_p(&dsp->t2d_pp_op); alloc_optimize0_p(&dsp->t2d_pp_op, d->nrows_in_plot, dsp->t2d.nactive, 2); t2d_pp_reinit(dsp, gg); } } } /******************************************************************** OPTIMIZATION The index function has to be defined as gint index (array_f *pdata, void *param, gfloat *val) with Input: pdata projected data param additional parameters for the index (will not be touched by the optimization routine) Output: val the index-value The return value should be zero, otherwise the optimization routine assumes an error has occurred during computation of the index. *********************************************************************/ gint alloc_optimize0_p (optimize0_param *op, gint nrows, gint ncols, gint ndim) { arrayf_init_null (&op->proj_best); /* arrayf_alloc_zero (&op->proj_best, ncols, ndim); *nrows, ncols);*/ arrayf_alloc_zero (&op->proj_best, ndim, ncols); /*nrows, ncols);*/ arrayf_init_null (&op->data); arrayf_alloc_zero (&op->data, nrows, ncols); arrayf_init_null (&op->pdata); arrayf_alloc_zero (&op->pdata, nrows, ndim); return 0; } gint free_optimize0_p (optimize0_param *op) { arrayf_free (&op->proj_best, 0, 0); arrayf_free (&op->data, 0, 0); arrayf_free(&op->pdata, 0, 0); return 0; } gint realloc_optimize0_p (optimize0_param *op, gint ncols, vector_i pcols) { gint i, ncolsdel; gint *cols;/* = g_malloc (ncols*sizeof(gint));*/ /* pdata doesn't need to be reallocated, since it doesn't depend on ncols */ if (op->proj_best.ncols < ncols) { arrayf_add_cols(&op->proj_best, ncols); arrayf_add_cols(&op->data, ncols); } else { ncolsdel = op->proj_best.ncols - ncols; cols = g_malloc (ncolsdel*sizeof(gint)); for (i=0; iproj_best, ncolsdel, cols); arrayf_delete_cols(&op->data, ncolsdel, cols); g_free (cols); } return 0; } gboolean iszero (array_f *data) { gfloat sum = 0; gint i, j; for (i=0; inrows; i++) { for (j=0; jncols; j++) sum += fabs(data->vals[i][j]); } return (sum<1e-6); } gfloat uniformrandom() { randomval = fmod (27132.0 * randomval + 7.0, 62748517.0); return (randomval / 62748517.0); } gfloat normalrandom() { gfloat x, y, r; if (nset) { nset = 0; return(nrand); } do { x = 2.0*uniformrandom()-1.0; y = 2.0*uniformrandom()-1.0; r = x*x+y*y; } while (r>=1.0); r = sqrt(-2.0*log(r)/r); nrand = x*r; nset = 1; return(y*r); } void normal_fill (array_f *data, gfloat delta, array_f *base) { int i, j; for (i=0; inrows; i++) { for (j=0; jncols; j++) data->vals[i][j] = base->vals[i][j]+delta*normalrandom(); } } void orthonormal (array_f *proj) { gint i, j, k; gfloat *ip = g_malloc (proj->ncols*sizeof(gfloat)); gfloat norm; /* First norm vector p_i */ for (i=0; inrows; i++) { norm = 0.0; for (k=0; kncols; k++) norm += (proj->vals[i][k]*proj->vals[i][k]); norm = sqrt(norm); for (k=0; kncols; k++) proj->vals[i][k] /= norm; } for (i=0; inrows; i++) { /* Compute inner product between p_i and all p_j */ for (j=0; jncols; k++) ip[j] += proj->vals[j][k]*proj->vals[i][k]; } /* Subtract now all vectors from p_i */ for (j=0; jncols; k++) proj->vals[i][k] -= ip[j]*proj->vals[j][k]; } /* Finally norm vector p_i */ norm = 0.0; for (k=0; kncols; k++) norm += (proj->vals[i][k]*proj->vals[i][k]); norm = sqrt(norm); for (k=0; kncols; k++) proj->vals[i][k] /= norm; } g_free(ip); } gint optimize0 (optimize0_param *op, Tour_PPIndex_f index, void *param) { gfloat index_work = 0.0; /* array_f proj_work, pdata, *proj;*/ array_f proj_work, *proj; int i,j, m, k; proj = &(op->proj_best); arrayf_init_null (&proj_work); arrayf_alloc_zero (&proj_work, proj->nrows, proj->ncols); /* arrayf_init_null (&pdata); arrayf_alloc_zero (&pdata, op->data.nrows, proj->ncols);*/ /* op->temp_start = 1; * make this an interactive parameter */ op->temp_end = 0.001; /* op->cooling = 0.99; * make this an interactive parameter */ /* is equivalent to log(temp_end/temp_start)/log(cooling) projections */ op->heating = 1; op->restart = 1; op->success = 0; op->temp = op->temp_start;/*0.1; 1.0;*/ op->maxproj = op->restart*(1+log(op->temp_end/op->temp_start)/ log(op->cooling)); /* :) */ /*g_printerr("NEW OPTIMIZATION\n"); g_printerr ("index_work %f index_best %f \n",index_work, op->index_best);*/ /* This adds random noise to existing projection and orthonormalize, if the current projection is null */ if (iszero(proj)) { /* sprintf (msg, "zero projection matrix"); print(); */ normal_fill (proj, 1.0, proj); orthonormal (proj); } /*g_printerr("nrows %d ncols %d\n",op->data.nrows, op->data.ncols); g_printerr ("proj: "); for (i=0; incols; i++) g_printerr ("%f ", proj->vals[0][i]); g_printerr ("\n"); for (i=0; incols; i++) g_printerr ("%f ", proj->vals[1][i]); g_printerr ("\n");*/ /* calculate projected data */ /* this is generated outside this function */ /* for (i=0; idata.nrows; i++) { for (j=0; jnrows; j++) { op->pdata.vals[i][j] = 0; for (m=0; mdata.ncols; m++) op->pdata.vals[i][j] += op->data.vals[i][m]*proj->vals[j][m]; } }*/ /* do index calculation, functions return -1 if a problem, which is then passed back through optimize0 to tour1d_run */ if (index (&op->pdata, param, &op->index_best, NULL)) return(-1); /*g_printerr ("index_work %f index_best %f \n",index_work, op->index_best);*/ /* if (index (&op->pdata, param, &index_work)) return(-1);*/ /* fill proj_work */ arrayf_copy (proj, &proj_work); op->success = k = 0; while (op->restart > 0) { /* sprintf (msg, "Restart %i", op->restart); print(); */ while (op->temp > op->temp_end) { /* sprintf (msg, "Iteration %i", k); print(); */ /* add some randomness to current projection */ normal_fill (&proj_work, op->temp, proj); orthonormal (&proj_work); op->temp *= op->cooling; /* calc projected data */ for (i=0; idata.nrows; i++) { for (j=0; jnrows; j++) { op->pdata.vals[i][j] = 0; for (m=0; mdata.ncols; m++) op->pdata.vals[i][j] += op->data.vals[i][m]*proj_work.vals[j][m]; } } /* Calculate pp index for current projection */ if (index (&op->pdata, param, &index_work, NULL)) return(-1); /*g_printerr ("index_work %f temp %f \n",index_work, op->temp); g_printerr ("proj_work: "); for (i=0; incols; i++) g_printerr ("%f ", proj_work.vals[0][i]); g_printerr ("\n "); g_printerr ("index_best %f temp %f \n", op->index_best, op->temp); g_printerr ("proj_best: "); for (i=0; incols; i++) g_printerr ("%f ", op->proj_best.vals[0][i]); g_printerr ("\n"); */ if (index_work > op->index_best) { /* sprintf (msg, "Success %f", index_work); print(); */ op->success++; /*printf ("Success %f\n", index_work); */ arrayf_copy (&proj_work, proj); /*Sigbert's code, I think this should be saving it into the best proj rather than work*/ arrayf_copy (&proj_work, &op->proj_best); op->index_best = index_work; op->temp *= op->heating; } k++; if (k >= op->maxproj) { /* printf("A #iter = %d \n",k); printf ("Best = %f\n", op->index_best); for (i=0; inrows; i++) { for (j=0; jncols; j++) printf ("%+5.3f ", proj->vals[i][j]); printf ("\n"); } printf ("\n");*/ return(k); } } op->temp = op->temp_start; op->restart--; } /* printf("B #iter = %d \n",k); printf ("Best = %f\n", op->index_best); for (i=0; inrows; i++) { for (j=0; jncols; j++) printf ("%+5.3f ", proj->vals[i][j]); printf ("\n"); } printf ("\n"); */ return (k); } /******************************************************************** OPTIMIZATION BY DERIVATIVES ********************************************************************/ void pp_deriv_optimization() { /* int i, j; float tmpf1, tmpf2; float eps = 0.5; */ /* calc index first */ /* calc derivs */ /* if (xg->pp_index_btn == HERMITE_BTN) hermite_deriv1(xg->tform2, X, xg->u[0], xg->u[1], dIhat, xg->nlinkable_in_plot, xg->rows_in_plot, xg->ncols_used, xg->tour_vars, xg->numvars_t, lJ); else if (xg->pp_index_btn == CENTRAL_MASS_BTN) central_mass_deriv(xg->tform2, X, xg->u[0], xg->u[1], dIhat, xg->nlinkable_in_plot, xg->rows_in_plot, xg->ncols_used, xg->numvars_t, xg->tour_vars); */ /* update xg->u1 by the direction vectors */ /* if (derivs_equal_zero(xg)) { stop_tour_proc(xg); write_msg_in_pp_window(); } else { for (i=0; inumvars_t; i++) a[i] = dIhat[0][xg->tour_vars[i]]; tmpf1 = calc_norm(a, xg->numvars_t); tmpf1 *= tmpf1; for (i=0; inumvars_t; i++) a[i] = dIhat[1][xg->tour_vars[i]]; tmpf2 = calc_norm(a, xg->numvars_t); tmpf2 *= tmpf2; tmpf1 = sqrt((double) (tmpf1+tmpf2)); for (j=0; j<2; j++) for (i=0; inumvars_t; i++) dIhat[j][xg->tour_vars[i]] *= (eps/tmpf1); for (i=0; i<2; i++) for (j=0; jnumvars_t; j++) xg->u1[i][xg->tour_vars[j]] = xg->u[i][xg->tour_vars[j]] + dIhat[i][xg->tour_vars[j]]; norm(xg->u1[0], xg->ncols_used); norm(xg->u1[1], xg->ncols_used); for (i=0; i<2; i++) for (j=0; jnumvars_t; j++) xg->tv[i][j] = xg->u1[i][xg->tour_vars[j]]; gram_schmidt(xg->tv[0], xg->tv[1],xg->numvars_t); for (i=0; i<2; i++) for (j=0; jnumvars_t; j++) xg->u1[i][xg->tour_vars[j]] = xg->tv[i][j]; init_basis(xg); }*/ } /*****************************************************/ /* Utility Routines */ /* */ /* Reference : An Introduction to Numerical Analysis */ /* - Kendall E. Atkinson */ /* (p 449 - 450) */ /*****************************************************/ void inverse(gdouble *a, gint n) { gdouble *b,*inv,d; gint *P,i,j; P = (gint *) g_malloc(n*sizeof(gint)); inv = (gdouble *) g_malloc(n*n*sizeof(gdouble)); d = ludcmp(a,n,P); b = (gdouble *) g_malloc(n*sizeof(gdouble)); for(i=0; i=0; i--) { temp=0; for(j=(i+1); jgroup, nr); vectori_alloc_zero(&pp->ngroup, nr); arrayd_alloc_zero(&pp->cov, nd, nd); arrayd_alloc_zero(&pp->tcov, nd, nd); /* temporary usage in lda */ arrayd_alloc_zero(&pp->mean, ncolors, nd); /* means for each group */ vectord_alloc_zero(&pp->ovmean, nc); /* mean for each projection */ vectori_alloc_zero(&pp->index, nr);/* used in gini/entropy */ vectori_alloc_zero(&pp->nright, nr);/* used in gini/entropy */ vectord_alloc_zero(&pp->x, nr); /* used in gini/entropy */ return 0; } gint free_pp (pp_param *pp) { vectori_free(&pp->group); vectori_free(&pp->ngroup); arrayd_free(&pp->cov, 0, 0); arrayd_free(&pp->tcov, 0, 0); arrayd_free(&pp->mean, 0, 0); vectord_free(&pp->ovmean); vectori_free(&pp->index); vectori_free(&pp->nright); vectord_free(&pp->x); return 0; } /******************************************************************** Index : Holes Transformation : - Purpose : Looks for the projection with no data in center. *********************************************************************/ gint holes_raw(array_f *pdata, void *param, gfloat *val, gpointer unused) { pp_param *pp = (pp_param *) param; int i, p, n, k,j; gdouble tmp,x1,x2; gdouble *cov; gdouble acoefs; gdouble tol = 0.0001; p = pdata->ncols; n = pdata->nrows; cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); zero(cov,p*p); for(j=0; jovmean.els[j] = 0.0; for(i=0; iovmean.els[j] += pdata->vals[i][j]; pp->ovmean.els[j] /= ((gdouble)n); } for (j=0; jcov.vals[k][j] = 0.0; for (i=0; icov.vals[k][j] += (((pdata->vals[i][j])-pp->ovmean.els[j])* ((pdata->vals[i][k])-(pp->ovmean.els[k]))); pp->cov.vals[k][j] /= ((double)(n-1)); if (j != k) pp->cov.vals[j][k] = pp->cov.vals[k][j]; } } /* g_printerr("cov %f %f %f %f\n",pp->cov.vals[0][0], pp->cov.vals[0][1],pp->cov.vals[1][0],pp->cov.vals[1][1]);*/ if (p>1) { for (i=0; icov.vals[i][j]; inverse(cov, p); for (i=0; icov.vals[i][j] = cov[i*p+j]; } else { if (pp->cov.vals[0][0] > tol) pp->cov.vals[0][0] = 1./pp->cov.vals[0][0]; else pp->cov.vals[0][0] = 10000.0; } acoefs = 0.0; for (i=0; ivals[i][j]-pp->ovmean.els[j]; for (k=0; kvals[i][k]-pp->ovmean.els[k]; tmp += (x1*x2*pp->cov.vals[j][k]); } } acoefs += exp(-tmp/2.0); } *val = (1.0-acoefs/(gdouble)n)/(gdouble) (1.0-exp(-p/2.0)); g_free(cov); return(0); } /******************************************************************** Index : Central Mass Transformation : - Purpose : Looks for the projection with lots of data in center. *********************************************************************/ gint central_mass_raw(array_f *pdata, void *param, gfloat *val, gpointer unused) { pp_param *pp = (pp_param *) param; int i, p, n,k,j; gdouble tmp,x1,x2; gdouble *cov; gdouble acoefs; gdouble tol = 0.0001; p = pdata->ncols; n = pdata->nrows; cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); zero(cov,p*p); for(j=0; jovmean.els[j] = 0.0; for(i=0; iovmean.els[j] += pdata->vals[i][j]; pp->ovmean.els[j] /= ((gdouble)n); } for (j=0; jcov.vals[k][j] = 0.0; for (i=0; icov.vals[k][j] += (((pdata->vals[i][j])-pp->ovmean.els[j])* ((pdata->vals[i][k])-(pp->ovmean.els[k]))); pp->cov.vals[k][j] /= ((double)(n-1)); if (j != k) pp->cov.vals[j][k] = pp->cov.vals[k][j]; } } if (p>1) { for (i=0; icov.vals[i][j]; inverse(cov, p); for (i=0; icov.vals[i][j] = cov[i*p+j]; } else { if (pp->cov.vals[0][0] > tol) pp->cov.vals[0][0] = 1./pp->cov.vals[0][0]; else pp->cov.vals[0][0] = 10000.0; } acoefs = 0.0; for (i=0; ivals[i][j]-pp->ovmean.els[j]; for (k=0; kvals[i][k]-pp->ovmean.els[k]; tmp += (x1*x2*pp->cov.vals[j][k]); } } acoefs += exp(-tmp/2.0); } *val = (acoefs/n-exp(-p/2.0))/((gdouble) (1-exp(-p/2.0))); g_free(cov); return(0); } /******************************************************************** Index : Discriminant Transformation : - Purpose : Looks for the best projection to discriminate between groups. *********************************************************************/ void zero (gdouble *ptr, gint length) { gint i; for (i=0; inrows; p = pdata->ncols; Pv = (gint *) g_malloc(p*sizeof(gint)); cov = (gdouble *) g_malloc(p*p*sizeof(gdouble)); /* Compute means */ for (k=0; knumgroups; l++) pp->mean.vals[l][k] = 0.0; pp->ovmean.els[k] = 0.0; } for (k=0; kmean.vals[pp->group.els[i]][k] += (gdouble) pdata->vals[i][k]; pp->ovmean.els[k] += (gdouble) pdata->vals[i][k]; } } for (k=0; knumgroups; i++) { pp->mean.vals[i][k] /= (gdouble) pp->ngroup.els[i]; } pp->ovmean.els[k] /= (gdouble) n; } /* Compute W */ for (j=0; jcov.vals[j][k] = 0.0; for (i=0; icov.vals[k][j] += ((gdouble) pdata->vals[i][j]-pp->mean.vals[pp->group.els[i]][j])* ((gdouble) pdata->vals[i][k]-pp->mean.vals[pp->group.els[i]][k]); pp->cov.vals[j][k] = pp->cov.vals[k][j]; } } } if (p>1) { for (i=0; icov.vals[i][j]; det = ludcmp(cov, p, Pv); for (i=0; icov.vals[i][j] = cov[i*p+j]; } else det = fabs((gdouble) pp->cov.vals[0][0]); *val = det; /* Compute B */ /* for (j=0; jcov.vals[j][k] = 0.0; for (j=0; jnumgroups; i++) pp->cov.vals[j][k] += (pp->mean.vals[i][j]-pp->ovmean.els[j])* (pp->mean.vals[i][k]-pp->ovmean.els[k])*(gdouble)(pp->ngroup.els[i]); } } if (p>1) { for (i=0; icov.vals[i][j]; det = ludcmp(cov, p, Pv); for (i=0; icov.vals[i][j] = cov[i*p+j]; } else det = fabs((gdouble) pp->cov.vals[0][0]); *val = det;*/ /* Compute W+B */ for (j=0; jcov.vals[j][k] = 0.0; for (i=0; icov.vals[k][j] += ((gdouble) pdata->vals[i][j]-pp->ovmean.els[j])* ((gdouble) pdata->vals[i][k]-pp->ovmean.els[k]); pp->cov.vals[j][k] = pp->cov.vals[k][j]; } } } if (p>1) { for (i=0; icov.vals[i][j]; det = ludcmp(cov, p, Pv); for (i=0; icov.vals[i][j] = cov[i*p+j]; } else det = fabs((gdouble) pp->cov.vals[0][0]); *val = 1.0-*val/det; /*1-W/(W+B)*/ /* *val = *val/det; B/(W+B) */ g_free(Pv); g_free(cov); return (0); } /******************************************************************** Index : Gini, Entropy, Variance Transformation : - Purpose : Looks for the best split in 1d-projected data. *********************************************************************/ void swap_group(array_f *pdata, gint *group, int i, int j) { int temp1,k; double temp2; temp1 = group[i]; group[i] = group[j]; group[j] = temp1; for(k=0; kncols; k++) { temp2 = pdata->vals[i][k]; pdata->vals[i][k] = pdata->vals[j][k]; pdata->vals[j][k] = temp2; } } void sort_group(array_f *pdata, gint *group, int left, int right) { int i, last; if(left >= right) return; swap_group(pdata, group, left, (left+right)/2); last = left; for(i=left+1; i<=right; i++) if(group[i] < group[left]) swap_group(pdata, group, ++last,i); swap_group(pdata, group, left, last); sort_group(pdata, group, left, last-1); sort_group(pdata, group, last+1,right); } void swap_data(double *x, int *index,int i, int j) { int temp1; double temp2; temp1 = index[i]; index[i] = index[j]; index[j] = temp1; temp2 = x[i]; x[i]= x[j]; x[j] = temp2; } void sort_data(double *x, int *index,int left, int right) { int i, last; if(left >= right) return; swap_data(x,index,left,(left+right)/2); last = left; for(i=left+1; i<=right; i++) if(x[i] < x[left]) swap_data(x,index,++last,i); swap_data(x,index, left, last); sort_data(x,index, left, last-1); sort_data(x,index,last+1,right); } void countgroup(int *group, int *gps, int n) { int temp,i; int groups = *gps; temp = group[0]; groups=1; for(i=1; inumgroups, left, right, l; gfloat dev, prob, maxindex = 0, index; n = pdata->nrows; p = pdata->ncols; /* Sort pdata by group */ right = pdata->nrows-1; left = 0; zero_int(pp->index.els,n); for (i=0; iindex.els[i] = pp->group.els[i]; sort_group(pdata,pp->index.els,left,right); /* data relocation and make index */ zero(pp->x.els,n); /* Calculate Gini index in each coordinate and find minimum */ for (l=0; lx.els[i] = pdata->vals[i][l]; pp->index.els[i] = pp->group.els[i]; } left=0; right=n-1; sort_data(pp->x.els, pp->index.els, left, right) ; /* Calculate gini index */ zero_int(pp->nright.els,g); index = 1; for (i=0; inright.els[i] = 0; index -= (((gdouble)pp->ngroup.els[i])/((gdouble)n))* (((gdouble)pp->ngroup.els[i])/((gdouble)n)); } for (i=0; inright.els[pp->index.els[i]])++; dev=1; for (k=0; knright.els[k])/((gdouble)(i+1)); dev -= prob*prob*((gdouble)(i+1)/(gdouble)n); prob = ((gdouble) (pp->ngroup.els[k]-pp->nright.els[k]))/ ((gdouble)(n-i-1)); dev -= prob*prob*((gdouble)(n-i-1)/(gdouble)n); } if (devnumgroups, left, right,l; gfloat dev, prob, maxindex = 0, index; n = pdata->nrows; p = pdata->ncols; /* Sort pdata by group */ right = pdata->nrows-1; left = 0; zero_int(pp->index.els,n); for (i=0; iindex.els[i] = pp->group.els[i]; sort_group(pdata,pp->index.els,left,right); /* data relocation and make index */ zero(pp->x.els,n); /* Calculate index in each coordinate and find minimum */ for(l=0; lx.els[i] = pdata->vals[i][l]; pp->index.els[i] = pp->group.els[i]; } left=0; right=n-1; sort_data(pp->x.els, pp->index.els,left,right) ; /* Calculate index */ zero_int(pp->nright.els,g); index = 0; for (i=0; inright.els[i] = 0; index -= (((gdouble)pp->ngroup.els[i])/((gdouble)n))* log(((gdouble)pp->ngroup.els[i])/((gdouble)n)); } for (i=0; inright.els[pp->index.els[i]])++; dev=0; for (k=0; knright.els[k])/((double)(i+1)); if (prob > 0) dev -= prob*log(prob)*((gdouble)(i+1)/(gdouble)n); prob = ((double) (pp->ngroup.els[k]-pp->nright.els[k]))/ ((double)(n-i-1)); if (prob > 0) dev -= prob*log(prob)*((gdouble)(n-i-1)/(gdouble)n); } if (dev #include #ifdef USE_STRINGS_H #include #endif #include "vars.h" #include "externs.h" #include "tour.h" /* This function initializes the rotation variables - it should only be called once, when a new tour is started since a new subset of variable might be used, or when there is new data. */ void cpanel_t2d3_init (cpaneld *cpanel, ggobid *gg) { cpanel->t2d3.step = TOURSTEP0; cpanel->t2d3.paused = false; cpanel->t2d3.slidepos = sessionOptions->defaultTourSpeed; cpanel->t2d3.manip_mode = MANIP_OBLIQUE; } void cpanel_tour2d3_set (displayd *display, cpaneld *cpanel, ggobid* gg) /* * To handle the case where there are multiple scatterplots * which may have different tour options and parameters selected */ { GtkWidget *w, *btn; GtkWidget *pnl = mode_panel_get_by_name(GGOBI(getPModeName)(TOUR2D3), gg); GtkAdjustment *adj; /*-- speed --*/ w = widget_find_by_name (pnl, "TOUR2D3:speed_bar"); adj = gtk_range_get_adjustment (GTK_RANGE (w)); gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), cpanel->t2d3.slidepos); /*-- paused --*/ btn = widget_find_by_name (pnl, "TOUR2D3:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (btn), cpanel->t2d3.paused); /*-- manual manip --*/ w = widget_find_by_name (pnl, "TOUR2D3:manip"); if (w) gtk_combo_box_set_active (GTK_COMBO_BOX (w), cpanel->t2d3.manip_mode); } static void speed2d3_set_cb (GtkAdjustment *adj, ggobid *gg) { tour2d3_speed_set(adj->value, gg); } static void tour2d3_pause_cb (GtkToggleButton *button, ggobid *gg) { tour2d3_pause (&gg->current_display->cpanel, button->active, gg); } static void reinit_cb (GtkWidget *w, ggobid *gg) { tour2d3_reinit(gg); } static void scramble_cb (GtkWidget *w, ggobid *gg) { tour2d3_scramble(gg); } static gchar *manip_lbl[] = {"Off", "Oblique", "Vert", "Horiz", "Radial", "Angular"}; static void manip_cb (GtkWidget *w, ggobid *gg) { displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; splotd *sp = gg->current_splot; cpanel->t2d3.manip_mode = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); if (cpanel->t2d3.manip_mode == MANIP_OFF) splot_cursor_unset (sp); else splot_cursor_set (GDK_HAND2, sp); } void cpanel_tour2d3_make (ggobid *gg) { modepaneld *panel; GtkWidget *box, *btn, *sbar, *lbl, *vb; GtkObject *adj; GtkWidget *manip_opt; panel = (modepaneld *) g_malloc(sizeof(modepaneld)); gg->control_panels = g_list_append(gg->control_panels, (gpointer) panel); panel->name = g_strdup(GGOBI(getPModeName)(TOUR2D3)); panel->w = gtk_vbox_new (false, VBOX_SPACING); gtk_container_set_border_width (GTK_CONTAINER (panel->w), 5); /* * speed scrollbar */ /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ adj = gtk_adjustment_new (sessionOptions->defaultTourSpeed, 0.0, MAX_TOUR_SPEED, 1.0, 1.0, 0.0); g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (speed2d3_set_cb), (gpointer) gg); sbar = gtk_hscale_new (GTK_ADJUSTMENT (adj)); gtk_widget_set_name (sbar, "TOUR2D3:speed_bar"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), sbar, "Adjust speed of tour motion", NULL); scale_set_default_values (GTK_SCALE (sbar)); gtk_box_pack_start (GTK_BOX (panel->w), sbar, false, false, 1); /* * Box to hold 'pause' toggle button */ box = gtk_hbox_new (true, 1); btn = gtk_check_button_new_with_mnemonic ("_Pause"); gtk_widget_set_name (btn, "TOUR2D3:pause_button"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Stop tour motion temporarily (keyboard shortcut: w)", NULL); g_signal_connect (G_OBJECT (btn), "toggled", G_CALLBACK (tour2d3_pause_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * Box to hold 'Reinit' toggle and 'Scramble' button */ box = gtk_hbox_new (true, 2); btn = gtk_button_new_with_mnemonic ("_Reinit"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection to first two active variables", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (reinit_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); btn = gtk_button_new_with_mnemonic ("Scr_amble"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Reset projection to random value", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (scramble_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (box), btn, true, true, 1); gtk_box_pack_start (GTK_BOX (panel->w), box, false, false, 1); /* * manipulation option menu and label inside vbox */ vb = gtk_vbox_new (false, 0); gtk_box_pack_start (GTK_BOX (panel->w), vb, false, false, 0); lbl = gtk_label_new_with_mnemonic ("_Manual manipulation:"); gtk_misc_set_alignment (GTK_MISC (lbl), 0, 0.5); gtk_box_pack_start (GTK_BOX (vb), lbl, false, false, 0); manip_opt = gtk_combo_box_new_text (); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), manip_opt); gtk_widget_set_name (manip_opt, "TOUR2D3:manip"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), manip_opt, "Set the manual manipulation method", NULL); gtk_box_pack_end (GTK_BOX (vb), manip_opt, false, false, 0); populate_combo_box (manip_opt, manip_lbl, G_N_ELEMENTS(manip_lbl), G_CALLBACK(manip_cb), gg); gtk_widget_show_all (panel->w); } /*----------------------------------------------------------------------*/ /* I/O events */ /*----------------------------------------------------------------------*/ /*-- called from the Options menu --*/ void tour2d3_io_cb (GtkWidget *w, gpointer *cbd) { /* gchar *lbl = (gchar *) cbd; g_printerr ("cbd: %s\n", lbl); */ } /*--------------------------------------------------------------------*/ /* Handling keyboard and mouse events in the plot window */ /*--------------------------------------------------------------------*/ static gint key_press_cb (GtkWidget *w, GdkEventKey *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); cpaneld *cpanel = &gg->current_display->cpanel; /*-- add a key_press_cb in each mode, and let it begin with these lines --*/ if (splot_event_handled (w, event, cpanel, sp, gg)) return true; /*-- insert mode-specific key presses (if any) here --*/ if (event->keyval == GDK_w || event->keyval == GDK_W) { /*-- turn pause on and off --*/ GtkWidget *pnl = mode_panel_get_by_name(GGOBI(getPModeName)(TOUR2D3), gg); GtkWidget *pause_button = NULL; pause_button = widget_find_by_name (pnl, "TOUR2D3:pause_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pause_button), !cpanel->t2d3.paused); return true; } return false; } static gint motion_notify_cb (GtkWidget *w, GdkEventMotion *event, splotd *sp) { ggobid *gg = GGobiFromSPlot(sp); gboolean button1_p, button2_p; mousepos_get_motion (w, event, &button1_p, &button2_p, sp); /*-- if neither button is pressed, we shouldn't have gotten the event --*/ if (!button1_p && !button2_p) return false; tour2d3_manip(sp->mousepos.x, sp->mousepos.y, sp, gg); return true; } static gint button_press_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { ggobid *gg = GGobiFromWidget(w, true); displayd *dsp = gg->current_display; cpaneld *cpanel = &dsp->cpanel; gboolean button1_p, button2_p; mousepos_get_pressed (w, event, &button1_p, &button2_p, sp); if (cpanel->t2d3.manip_mode != MANIP_OFF) { sp->motion_id = g_signal_connect (G_OBJECT (sp->da), "motion_notify_event", G_CALLBACK(motion_notify_cb), (gpointer) sp); tour2d3_manip_init(sp->mousepos.x, sp->mousepos.y, sp); } return true; } static gint button_release_cb (GtkWidget *w, GdkEventButton *event, splotd *sp) { gboolean retval = true; GdkModifierType state; gdk_window_get_pointer (w->window, &sp->mousepos.x, &sp->mousepos.y, &state); tour2d3_manip_end(sp); gdk_pointer_ungrab (event->time); return retval; } void tour2d3_event_handlers_toggle (splotd *sp, gboolean state) { displayd *display = (displayd *) sp->displayptr; if (state == on) { if(GGOBI_IS_WINDOW_DISPLAY(display) && GGOBI_WINDOW_DISPLAY(display)->useWindow) sp->key_press_id = g_signal_connect (G_OBJECT (GGOBI_WINDOW_DISPLAY(display)->window), "key_press_event", G_CALLBACK(key_press_cb), (gpointer) sp); sp->press_id = g_signal_connect (G_OBJECT (sp->da), "button_press_event", G_CALLBACK(button_press_cb), (gpointer) sp); sp->release_id = g_signal_connect (G_OBJECT (sp->da), "button_release_event", G_CALLBACK(button_release_cb), (gpointer) sp); } else { disconnect_key_press_signal (sp); disconnect_button_press_signal (sp); disconnect_button_release_signal (sp); } } ggobi-2.1.12/src/scale_drag.c0000644000175000017500000000532714651527764011414 /* scale_drag.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include "vars.h" #include "externs.h" /* * scale_style == DRAG and button 1 is pressed; we are panning. * The mouse has moved to sp.mousepos from sp.mousepos_o. * Change shift_wrld appropriately */ void pan_by_drag (splotd * sp, ggobid * gg) { greal dx, dy; greal scale_x, scale_y; greal precis = (greal) PRECISION1; dx = (greal) (sp->mousepos.x - sp->mousepos_o.x); dy = (greal) (sp->mousepos.y - sp->mousepos_o.y); scale_x = (greal) sp->scale.x; scale_y = (greal) sp->scale.y; /* * This section is a bit puzzling, because I don't know what * would change this -- maybe resizing the plot window? */ scale_x /= 2; sp->iscale.x = (greal) sp->max.x * scale_x; scale_y /= 2; sp->iscale.y = -1 * (greal) sp->max.y * scale_y; sp->pmid.x -= (dx * precis / sp->iscale.x); sp->pmid.y -= (dy * precis / sp->iscale.y); } /* * scale_style == DRAG and button 2 (or 3) is pressed; we are zooming. * The mouse has moved to sp->mousepos from sp->mousepos_o and the center * of the figure is at sp->mid. Change sp->scale by the * appropriate amounts. */ void zoom_by_drag (splotd * sp, ggobid * gg) { gfloat *scale_x = &sp->scale.x; gfloat *scale_y = &sp->scale.y; gint npix = 20; /*-- number of pixels from the crosshair required --*/ displayd *dsp = sp->displayptr; cpaneld *cpanel = &dsp->cpanel; icoords mid; fcoords scalefac; mid.x = sp->max.x / 2; mid.y = sp->max.y / 2; scalefac.x = scalefac.y = 1.0; if ((ABS (sp->mousepos.x - mid.x) >= npix) && (ABS (sp->mousepos.y - mid.y) >= npix)) { /*-- making the behavior identical to click zooming --*/ scalefac.x = (gfloat) (sp->mousepos.x - mid.x) / (gfloat) (sp->mousepos_o.x - mid.x); scalefac.y = (gfloat) (sp->mousepos.y - mid.y) / (gfloat) (sp->mousepos_o.y - mid.y); if (cpanel->scale.fixAspect_p) { greal fac = MAX (scalefac.x, scalefac.y); *scale_x = *scale_x * fac; *scale_y = *scale_y * fac; } else { if (*scale_x * scalefac.x >= SCALE_MIN) *scale_x = *scale_x * scalefac.x; if (*scale_y * scalefac.y >= SCALE_MIN) *scale_y = *scale_y * scalefac.y; } } } ggobi-2.1.12/src/impute_ui.c0000644000175000017500000003724414651527764011333 /* impute_ui.c *//*-- should be called missing_ui.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include #include #include "vars.h" #include "externs.h" /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget * w, ggobid * gg) { gtk_widget_hide (gg->impute.window); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget * w, GdkEvent * event, ggobid * gg) { gtk_widget_hide (gg->impute.window); } /* Random */ static void set_random_cb (GtkToggleButton * w, ggobid * gg) { gg->impute.type = IMP_RANDOM; } /* Fixed */ static void set_fixed_cb (GtkToggleButton * w, ggobid * gg) { gg->impute.type = IMP_FIXED; } /* Below */ static void set_fixed_below_cb (GtkToggleButton * w, ggobid * gg) { gg->impute.type = IMP_BELOW; } /* Above */ static void set_fixed_above_cb (GtkToggleButton * w, ggobid * gg) { gg->impute.type = IMP_ABOVE; } /* Mean */ static void set_mean_cb (GtkToggleButton * w, ggobid * gg) { gg->impute.type = IMP_MEAN; } /* Median */ static void set_median_cb (GtkToggleButton * w, ggobid * gg) { gg->impute.type = IMP_MEDIAN; } static void rescale_cb (GtkButton * button, ggobid * gg) { GtkWidget *tv = get_tree_view_from_object (G_OBJECT (gg->impute.window)); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tv), "datad"); limits_set (d, true, true, gg->lims_use_visible); vartable_limits_set (d); vartable_stats_set (d); tform_to_world (d, gg); displays_tailpipe (FULL, gg); } static void group_cb (GtkToggleButton * button, ggobid * gg) { gg->impute.bgroup_p = button->active; } static void show_missings_cb (GtkToggleButton * button, ggobid * gg) { GtkWidget *tv = get_tree_view_from_object (G_OBJECT (gg->impute.window)); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tv), "datad"); d->missings_show_p = button->active; displays_tailpipe (FULL, gg); } static gboolean impute_fixed_cb (ImputeType impute_type, gfloat * val, ggobid * gg) { GtkWidget *w; gchar *val_str; gboolean ok = true; if (impute_type == IMP_ABOVE || impute_type == IMP_BELOW) { if (impute_type == IMP_ABOVE) { w = widget_find_by_name (gg->impute.window, "IMPUTE:entry_above"); val_str = gtk_editable_get_chars (GTK_EDITABLE (w), 0, -1); } else { // if (impute_type == IMP_BELOW) { w = widget_find_by_name (gg->impute.window, "IMPUTE:entry_below"); val_str = gtk_editable_get_chars (GTK_EDITABLE (w), 0, -1); } if (strlen (val_str) == 0) { gchar *message = g_strdup_printf ("You selected '%% over or under' but didn't specify a percentage.\n"); quick_message (message, false); g_free (message); ok = false; return ok; } *val = (gfloat) atof (val_str); g_free (val_str); if (*val < 0 || *val > 100) { gchar *message = g_strdup_printf ("You specified %f%%; please specify a percentage between 0 and 100.\n", *val); quick_message (message, false); g_free (message); ok = false; return ok; } } else if (impute_type == IMP_FIXED) { w = widget_find_by_name (gg->impute.window, "IMPUTE:entry_val"); val_str = gtk_editable_get_chars (GTK_EDITABLE (w), 0, -1); if (strlen (val_str) == 0) { quick_message ("You've selected 'Specify' but haven't specified a value.\n", false); ok = false; return ok; } else { *val = (gfloat) atof (val_str); g_free (val_str); } } return ok; } static void impute_cb (GtkWidget * w, ggobid * gg) { gboolean redraw = true; GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (gg->impute.window)); GGobiData *d = (GGobiData *) g_object_get_data (G_OBJECT (tree_view), "datad"); gint *vars; // = (gint *) g_malloc (d->ncols * sizeof(gint)); gint nvars; gfloat val = 0.0; // compiler pacification vars = get_selections_from_tree_view (tree_view, &nvars); switch (gg->impute.type) { case IMP_RANDOM: impute_random (d, nvars, vars, gg); break; case IMP_FIXED: case IMP_BELOW: case IMP_ABOVE: if (impute_fixed_cb (gg->impute.type, &val, gg)) redraw = impute_fixed (gg->impute.type, val, nvars, vars, d, gg); break; case IMP_MEAN: case IMP_MEDIAN: redraw = impute_mean_or_median (gg->impute.type, nvars, vars, d, gg); break; } if (redraw) { tform_to_world (d, gg); displays_tailpipe (FULL, gg); } g_free (vars); } /*------------------------------------------------------------------*/ void impute_window_open (ggobid * gg) { GtkWidget *frame0, *vb; GtkWidget *btn, *tgl, *notebook; GtkWidget *vbox, *hb; GtkWidget *table, *entry, *radio; gint row = 0; /*-- if used before we have data, bail out --*/ if (gg->d == NULL || g_slist_length (gg->d) == 0) /**/ return; if (gg->impute.window == NULL) { gg->impute.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->impute.window), "Missing Values"); g_signal_connect (G_OBJECT (gg->impute.window), "delete_event", G_CALLBACK (close_wmgr_cb), gg); gtk_container_set_border_width (GTK_CONTAINER (gg->impute.window), 5); vbox = gtk_vbox_new (false, 2); gtk_container_add (GTK_CONTAINER (gg->impute.window), vbox); /*-- Add a toggle button, show missings or not --*/ tgl = gtk_check_button_new_with_mnemonic ("Sh_ow missing values"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tgl), on); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Draw the missing values when plotting displays; if there are multiple datasets, this applies only to the current dataset", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (show_missings_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (vbox), tgl, false, false, 2); /*-- add a button to generate a new datad --*/ btn = gtk_button_new_with_mnemonic ("_Add missings as new dataset"); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (missings_datad_cb), (gpointer) gg); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Generate a new dataset from the 1's and 0's representing missingness", NULL); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 2); /*-- add a frame to contain the "imputation" widgets --*/ frame0 = gtk_frame_new ("Assign or impute values"); gtk_container_set_border_width (GTK_CONTAINER (frame0), 2); gtk_box_pack_start (GTK_BOX (vbox), frame0, true, true, 2); vb = gtk_vbox_new (false, 2); /*-- this has the effect of setting an internal border inside the frame --*/ gtk_container_set_border_width (GTK_CONTAINER (vb), 5); gtk_container_add (GTK_CONTAINER (frame0), vb); /* Create a notebook, set the position of the tabs */ notebook = create_variable_notebook (vb, GTK_SELECTION_MULTIPLE, all_vartypes, all_datatypes, G_CALLBACK (NULL), NULL, gg); row = 0; table = gtk_table_new (6, 2, false); gtk_box_pack_start (GTK_BOX (vb), table, false, false, 2); /* Random */ radio = gtk_radio_button_new_with_mnemonic (NULL, "_Random"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio, "Assign to each missing value one of the existing variable values chosen at random", NULL); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (set_random_cb), (gpointer) gg); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), true); gtk_table_attach (GTK_TABLE (table), radio, 0, 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); tgl = gtk_check_button_new_with_mnemonic ("Condition on symbol and _color"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), tgl, "Condition the random imputation on the symbol and color; these groups can be seen in the case clusters window", NULL); g_signal_connect (G_OBJECT (tgl), "toggled", G_CALLBACK (group_cb), (gpointer) gg); gtk_table_attach (GTK_TABLE (table), tgl, 1, 2, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); row++; /* Mean */ radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), "Variable _mean"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio, "Assign the variable mean to each missing value", NULL); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (set_mean_cb), (gpointer) gg); gtk_table_attach (GTK_TABLE (table), radio, 0, 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); row++; /* Median */ radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), "Variable m_edian"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio, "Assign the variable median to each missing value", NULL); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (set_median_cb), (gpointer) gg); gtk_table_attach (GTK_TABLE (table), radio, 0, 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); row++; /* Fixed */ radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), "_Fixed"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio, "Assign a fixed value to each missing variable value", NULL); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (set_fixed_cb), (gpointer) gg); gtk_table_attach (GTK_TABLE (table), radio, 0, 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); entry = gtk_entry_new (); gtk_widget_set_name (entry, "IMPUTE:entry_val"); gtk_entry_set_text (GTK_ENTRY (entry), "0"); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); row++; /* Pctage below min */ radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), "Percent _below min"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio, "Assign a fixed value which is some percentage below the minimum value for the variable", NULL); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (set_fixed_below_cb), (gpointer) gg); gtk_table_attach (GTK_TABLE (table), radio, 0, 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); entry = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (entry), "10"); gtk_widget_set_name (entry, "IMPUTE:entry_below"); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); row++; /* Pctage above min */ radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), "Percent ab_ove min"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), radio, "Assign a fixed value which is some percentage above the minimum value for the variable", NULL); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (set_fixed_above_cb), (gpointer) gg); gtk_table_attach (GTK_TABLE (table), radio, 0, 1, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); entry = gtk_entry_new (); gtk_entry_set_text (GTK_ENTRY (entry), "10"); gtk_widget_set_name (entry, "IMPUTE:entry_above"); gtk_table_attach (GTK_TABLE (table), entry, 1, 2, row, row + 1, (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), (GtkAttachOptions) (GTK_SHRINK | GTK_FILL | GTK_EXPAND), 1, 1); row++; /*-- hbox to hold a few buttons --*/ hb = gtk_hbox_new (true, 2); gtk_box_pack_start (GTK_BOX (vb), hb, false, false, 2); btn = gtk_button_new_with_mnemonic ("_Impute"); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (impute_cb), (gpointer) gg); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Impute or assign values to missings", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, true, 2); btn = gtk_button_new_with_mnemonic ("Re_scale"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Rescale the data after imputing", NULL); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (rescale_cb), (gpointer) gg); gtk_box_pack_start (GTK_BOX (hb), btn, true, true, 2); /*-- add a close button --*/ hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 1); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Close the window", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, false, 2); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); g_object_set_data (G_OBJECT (gg->impute.window), "notebook", notebook); } gtk_widget_show_all (gg->impute.window); gdk_window_raise (gg->impute.window->window); } ggobi-2.1.12/src/write_csv.c0000644000175000017500000000765714651527764011345 #include #ifdef USE_STRINGS_H #include #endif #include #include "writedata.h" #include "vars.h" #include "vartable.h" #include "externs.h" gboolean write_csv_header (gint *cols, gint ncols, FILE *f, GGobiData *d, ggobid *gg) { gboolean ok = true; gint j, jcol, rval; fprintf (f, "\"\","); for (j=0; jsave.stage == TFORMDATA) ? ggobi_data_get_transformed_col_name(d, jcol) : ggobi_data_get_col_name(d, jcol))); if (rval < 0) { ok = false; break; } if (j < ncols-1) fprintf(f, ","); } fprintf (f, "\n"); return ok; } void write_csv_cell(gint i, gint j, FILE *f, GGobiData *d, ggobid *gg) { vartabled *vt = vartable_element_get (j, d); gchar* value = ggobi_data_get_string_value(d, i, j, gg->save.stage == TFORMDATA); switch (vt->vartype) { case categorical: fprintf(f, "\"%s\"", value); break; default: fprintf(f, "%s", value); } } gboolean write_csv_record (gint i, gint *cols, gint ncols, FILE *f, GGobiData *d, ggobid *gg) { gboolean ok = true; gchar *gstr; gint j, jcol; /*-- row label if present; else index --*/ if (d->rowlab && d->rowlab->data && (gstr = (gchar *) g_array_index (d->rowlab, gchar *, i))) { fprintf(f, "\"%s\",", g_strstrip(gstr)); } else fprintf(f, "\"%d\",", i); /* Source and destination, as strings, if edges are present */ if (gg->save.edges_p && d->edge.n) { fprintf(f, "\"%s\",", g_strstrip(d->edge.sym_endpoints->a)); fprintf(f, "\"%s\",", g_strstrip(d->edge.sym_endpoints->b)); } /* record */ for(j = 0; j < ncols; j++) { jcol = cols[j]; /*-- if missing, figure out what to write --*/ if (ggobi_data_is_missing(d, i, jcol) && gg->save.missing_ind != MISSINGSIMPUTED) { switch (gg->save.missing_ind) { case MISSINGSNA: fprintf (f, "NA"); break; default: fprintf (f, "."); } } else { /*-- if not missing, just write the data --*/ write_csv_cell (i, jcol, f, d, gg); } if (j < ncols-1 ) fprintf(f, ","); } return ok; } gboolean write_csv_records (gint *cols, gint ncols, FILE *f, GGobiData *d, ggobid *gg) { gboolean ok = true; gint i, m; if (gg->save.row_ind == ALLROWS) { for (i = 0; i < d->nrows; i++) { write_csv_record (i, cols, ncols, f, d, gg); fprintf(f, "\n"); } } else { /*-- if displaying visible rows only --*/ for (i=0; inrows_in_plot; i++) { m = d->rows_in_plot.els[i]; write_csv_record (m, cols, ncols, f, d, gg); fprintf(f, "\n"); } } return ok; } gboolean write_csv_file (FILE *f, GGobiData *d, ggobid *gg) { gboolean ok = false; gint j; gint *cols, ncols; ncols = 0; if (gg->save.column_ind == ALLCOLS) { cols = (gint *) g_malloc (d->ncols * sizeof(gint)); for(j = 0; j < d->ncols; j++) { cols[j] = j; ncols++; } } else if (gg->save.column_ind == SELECTEDCOLS) { /*-- work out which columns to save --*/ cols = (gint *) g_malloc (d->ncols * sizeof (gint)); ncols = selected_cols_get (cols, d, gg); if (ncols == 0) // backup source of column selection ncols = plotted_cols_get (cols, d, gg); } if (ncols) { if (write_csv_header (cols, ncols, f, d, gg)) if (write_csv_records (cols, ncols, f, d, gg)) ok = true; g_free (cols); } return ok; } gboolean write_csv (const gchar *filename, ggobid *gg) { FILE *f; gboolean ok = false; GGobiData *d = NULL; gint nd = g_slist_length(gg->d);; /* By default, write only a single datad */ if (nd > 0) { if (nd == 1) d = gg->d->data; else { if (gg->current_display->d != NULL) d = gg->current_display->d; } } if (d) { f = fopen (filename, "w"); if (f) { if (write_csv_file (f, d, gg)) ok = true; fclose(f); } } return ok; } ggobi-2.1.12/src/ggobi-renderer-cairo.c0000644000175000017500000007140214651530615013300 /* Generated by GOB (v2.0.18) (do not edit directly) */ /* End world hunger, donate to the World Food Programme, http://www.wfp.org */ #define GOB_VERSION_MAJOR 2 #define GOB_VERSION_MINOR 0 #define GOB_VERSION_PATCHLEVEL 18 #define selfp (self->_priv) #include /* memset() */ #include "ggobi-renderer-cairo.h" #ifdef G_LIKELY #define ___GOB_LIKELY(expr) G_LIKELY(expr) #define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr) #else /* ! G_LIKELY */ #define ___GOB_LIKELY(expr) (expr) #define ___GOB_UNLIKELY(expr) (expr) #endif /* G_LIKELY */ #line 1 "renderer-cairo.gob" /* only use cairo when GTK+ 2.8.0 or higher installed */ #include #if GTK_CHECK_VERSION(2,8,0) #line 29 "ggobi-renderer-cairo.c" #line 5 "renderer-cairo.gob" #include /* Takes 1/64 degrees to radians and reverses */ #define CAIRO_ANGLE(x) ((360 - (x/64.)) * M_PI / 180) /* millimeters per inch */ #define MM_PER_INCH 25.4 #line 39 "ggobi-renderer-cairo.c" /* self casting macros */ #define SELF(x) GGOBI_RENDERER_CAIRO(x) #define SELF_CONST(x) GGOBI_RENDERER_CAIRO_CONST(x) #define IS_SELF(x) GGOBI_IS_RENDERER_CAIRO(x) #define TYPE_SELF GGOBI_TYPE_RENDERER_CAIRO #define SELF_CLASS(x) GGOBI_RENDERER_CAIRO_CLASS(x) #define SELF_GET_CLASS(x) GGOBI_RENDERER_CAIRO_GET_CLASS(x) /* self typedefs */ typedef GGobiRendererCairo Self; typedef GGobiRendererCairoClass SelfClass; struct _GGobiRendererCairoPrivate { #line 19 "renderer-cairo.gob" cairo_t * cairo; #line 56 "ggobi-renderer-cairo.c" }; /* here are local prototypes */ static void ___object_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); static void ___object_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); #line 1 "renderer-cairo.gob" static void ggobi_renderer_cairo_init (GGobiRendererCairo * o) G_GNUC_UNUSED; #line 63 "ggobi-renderer-cairo.c" #line 1 "renderer-cairo.gob" static void ggobi_renderer_cairo_class_init (GGobiRendererCairoClass * c) G_GNUC_UNUSED; #line 66 "ggobi-renderer-cairo.c" #line 36 "renderer-cairo.gob" static GdkDrawable * ___3_ggobi_renderer_cairo_create_target (GGobiRenderer * self, GdkDrawable * parent) G_GNUC_UNUSED; #line 69 "ggobi-renderer-cairo.c" static cairo_t * ___real_ggobi_renderer_cairo_create_cairo (GGobiRendererCairo * self, GdkDrawable * target); #line 48 "renderer-cairo.gob" static cairo_t * ggobi_renderer_cairo_create_cairo (GGobiRendererCairo * self, GdkDrawable * target) G_GNUC_UNUSED; #line 73 "ggobi-renderer-cairo.c" #line 54 "renderer-cairo.gob" static void ggobi_renderer_cairo_line_type (GGobiRendererCairo * self, GdkGCValues * values) G_GNUC_UNUSED; #line 76 "ggobi-renderer-cairo.c" #line 103 "renderer-cairo.gob" static void ggobi_renderer_cairo_stroke (GGobiRendererCairo * self, GdkGC * gc, gboolean filled) G_GNUC_UNUSED; #line 79 "ggobi-renderer-cairo.c" #line 118 "renderer-cairo.gob" static void ggobi_renderer_cairo_polypath (GGobiRendererCairo * self, guint npoints, GdkPoint * points) G_GNUC_UNUSED; #line 82 "ggobi-renderer-cairo.c" #line 127 "renderer-cairo.gob" static void ___8_ggobi_renderer_cairo_draw_rectangle (GdkDrawable * self, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height) G_GNUC_UNUSED; #line 85 "ggobi-renderer-cairo.c" #line 135 "renderer-cairo.gob" static void ___9_ggobi_renderer_cairo_draw_arc (GdkDrawable * self, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2) G_GNUC_UNUSED; #line 88 "ggobi-renderer-cairo.c" #line 149 "renderer-cairo.gob" static void ___a_ggobi_renderer_cairo_draw_polygon (GdkDrawable * self, GdkGC * gc, gboolean filled, GdkPoint * points, gint npoints) G_GNUC_UNUSED; #line 91 "ggobi-renderer-cairo.c" #line 158 "renderer-cairo.gob" static void ___b_ggobi_renderer_cairo_draw_points (GdkDrawable * self, GdkGC * gc, GdkPoint * points, gint npoints) G_GNUC_UNUSED; #line 94 "ggobi-renderer-cairo.c" #line 168 "renderer-cairo.gob" static void ___c_ggobi_renderer_cairo_draw_segments (GdkDrawable * self, GdkGC * gc, GdkSegment * segs, gint nsegs) G_GNUC_UNUSED; #line 97 "ggobi-renderer-cairo.c" #line 180 "renderer-cairo.gob" static void ___d_ggobi_renderer_cairo_draw_lines (GdkDrawable * self, GdkGC * gc, GdkPoint * points, gint npoints) G_GNUC_UNUSED; #line 100 "ggobi-renderer-cairo.c" #line 186 "renderer-cairo.gob" static void ___e_ggobi_renderer_cairo_draw_trapezoids (GdkDrawable * self, GdkGC * gc, GdkTrapezoid * trapezoids, gint n_trapezoids) G_GNUC_UNUSED; #line 103 "ggobi-renderer-cairo.c" #line 214 "renderer-cairo.gob" static void ___11_ggobi_renderer_cairo_draw_glyphs (GdkDrawable * self, GdkGC * gc, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) G_GNUC_UNUSED; #line 106 "ggobi-renderer-cairo.c" #line 221 "renderer-cairo.gob" static void ___12_ggobi_renderer_cairo_draw_glyphs_transformed (GdkDrawable * self, GdkGC * gc, PangoMatrix * matrix, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) G_GNUC_UNUSED; #line 109 "ggobi-renderer-cairo.c" #line 234 "renderer-cairo.gob" static void ___13_ggobi_renderer_cairo_draw_drawable (GdkDrawable * self, GdkGC * gc, GdkDrawable * src, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) G_GNUC_UNUSED; #line 112 "ggobi-renderer-cairo.c" #line 248 "renderer-cairo.gob" static GdkDrawable * ___14_ggobi_renderer_cairo_get_composite_drawable (GdkDrawable * self, gint x, gint y, gint width, gint height, gint * composite_x_offset, gint * composite_y_offset) G_GNUC_UNUSED; #line 115 "ggobi-renderer-cairo.c" #line 266 "renderer-cairo.gob" static cairo_surface_t * ___15_ggobi_renderer_cairo_ref_cairo_surface (GdkDrawable * self) G_GNUC_UNUSED; #line 118 "ggobi-renderer-cairo.c" enum { PROP_0, PROP_CAIRO }; /* pointer to the class of our parent */ static GGobiRendererClass *parent_class = NULL; /* Short form macros */ #define self_get_cairo ggobi_renderer_cairo_get_cairo #define self_set_cairo ggobi_renderer_cairo_set_cairo #define self_create_cairo ggobi_renderer_cairo_create_cairo #define self_line_type ggobi_renderer_cairo_line_type #define self_stroke ggobi_renderer_cairo_stroke #define self_polypath ggobi_renderer_cairo_polypath GType ggobi_renderer_cairo_get_type (void) { static GType type = 0; if ___GOB_UNLIKELY(type == 0) { static const GTypeInfo info = { sizeof (GGobiRendererCairoClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) ggobi_renderer_cairo_class_init, (GClassFinalizeFunc) NULL, NULL /* class_data */, sizeof (GGobiRendererCairo), 0 /* n_preallocs */, (GInstanceInitFunc) ggobi_renderer_cairo_init, NULL }; type = g_type_register_static (GGOBI_TYPE_RENDERER, "GGobiRendererCairo", &info, (GTypeFlags)0); } return type; } /* a macro for creating a new object of our type */ #define GET_NEW ((GGobiRendererCairo *)g_object_new(ggobi_renderer_cairo_get_type(), NULL)) /* a function for creating a new object of our type */ #include static GGobiRendererCairo * GET_NEW_VARG (const char *first, ...) G_GNUC_UNUSED; static GGobiRendererCairo * GET_NEW_VARG (const char *first, ...) { GGobiRendererCairo *ret; va_list ap; va_start (ap, first); ret = (GGobiRendererCairo *)g_object_new_valist (ggobi_renderer_cairo_get_type (), first, ap); va_end (ap); return ret; } static void ___finalize(GObject *obj_self) { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::finalize" GGobiRendererCairo *self G_GNUC_UNUSED = GGOBI_RENDERER_CAIRO (obj_self); gpointer priv G_GNUC_UNUSED = self->_priv; if(G_OBJECT_CLASS(parent_class)->finalize) \ (* G_OBJECT_CLASS(parent_class)->finalize)(obj_self); #line 19 "renderer-cairo.gob" if(self->_priv->cairo) { cairo_destroy ((gpointer) self->_priv->cairo); self->_priv->cairo = NULL; } #line 188 "ggobi-renderer-cairo.c" } #undef __GOB_FUNCTION__ static void ggobi_renderer_cairo_init (GGobiRendererCairo * o G_GNUC_UNUSED) { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::init" o->_priv = G_TYPE_INSTANCE_GET_PRIVATE(o,GGOBI_TYPE_RENDERER_CAIRO,GGobiRendererCairoPrivate); } #undef __GOB_FUNCTION__ static void ggobi_renderer_cairo_class_init (GGobiRendererCairoClass * c G_GNUC_UNUSED) { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::class_init" GObjectClass *g_object_class G_GNUC_UNUSED = (GObjectClass*) c; GGobiRendererClass *ggobi_renderer_class = (GGobiRendererClass *)c; GdkDrawableClass *gdk_drawable_class = (GdkDrawableClass *)c; g_type_class_add_private(c,sizeof(GGobiRendererCairoPrivate)); parent_class = g_type_class_ref (GGOBI_TYPE_RENDERER); #line 36 "renderer-cairo.gob" ggobi_renderer_class->create_target = ___3_ggobi_renderer_cairo_create_target; #line 48 "renderer-cairo.gob" c->create_cairo = ___real_ggobi_renderer_cairo_create_cairo; #line 127 "renderer-cairo.gob" gdk_drawable_class->draw_rectangle = ___8_ggobi_renderer_cairo_draw_rectangle; #line 135 "renderer-cairo.gob" gdk_drawable_class->draw_arc = ___9_ggobi_renderer_cairo_draw_arc; #line 149 "renderer-cairo.gob" gdk_drawable_class->draw_polygon = ___a_ggobi_renderer_cairo_draw_polygon; #line 158 "renderer-cairo.gob" gdk_drawable_class->draw_points = ___b_ggobi_renderer_cairo_draw_points; #line 168 "renderer-cairo.gob" gdk_drawable_class->draw_segments = ___c_ggobi_renderer_cairo_draw_segments; #line 180 "renderer-cairo.gob" gdk_drawable_class->draw_lines = ___d_ggobi_renderer_cairo_draw_lines; #line 186 "renderer-cairo.gob" gdk_drawable_class->draw_trapezoids = ___e_ggobi_renderer_cairo_draw_trapezoids; #line 229 "ggobi-renderer-cairo.c" gdk_drawable_class->draw_text = NULL; gdk_drawable_class->draw_text_wc = NULL; #line 214 "renderer-cairo.gob" gdk_drawable_class->draw_glyphs = ___11_ggobi_renderer_cairo_draw_glyphs; #line 221 "renderer-cairo.gob" gdk_drawable_class->draw_glyphs_transformed = ___12_ggobi_renderer_cairo_draw_glyphs_transformed; #line 234 "renderer-cairo.gob" gdk_drawable_class->draw_drawable = ___13_ggobi_renderer_cairo_draw_drawable; #line 248 "renderer-cairo.gob" gdk_drawable_class->get_composite_drawable = ___14_ggobi_renderer_cairo_get_composite_drawable; #line 266 "renderer-cairo.gob" gdk_drawable_class->ref_cairo_surface = ___15_ggobi_renderer_cairo_ref_cairo_surface; #line 242 "ggobi-renderer-cairo.c" g_object_class->finalize = ___finalize; g_object_class->get_property = ___object_get_property; g_object_class->set_property = ___object_set_property; { GParamSpec *param_spec; param_spec = g_param_spec_pointer ("cairo" /* name */, "cr" /* nick */, "The cairo context to which this renders" /* blurb */, (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (g_object_class, PROP_CAIRO, param_spec); } } #undef __GOB_FUNCTION__ static void ___object_set_property (GObject *object, guint property_id, const GValue *VAL G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED) #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::set_property" { GGobiRendererCairo *self G_GNUC_UNUSED; self = GGOBI_RENDERER_CAIRO (object); switch (property_id) { case PROP_CAIRO: { #line 25 "renderer-cairo.gob" if (g_value_get_pointer(VAL)) { if (selfp->cairo) cairo_destroy(selfp->cairo); selfp->cairo = cairo_reference(g_value_get_pointer(VAL)); } #line 283 "ggobi-renderer-cairo.c" } break; default: /* Apparently in g++ this is needed, glib is b0rk */ #ifndef __PRETTY_FUNCTION__ # undef G_STRLOC # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } #undef __GOB_FUNCTION__ static void ___object_get_property (GObject *object, guint property_id, GValue *VAL G_GNUC_UNUSED, GParamSpec *pspec G_GNUC_UNUSED) #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::get_property" { GGobiRendererCairo *self G_GNUC_UNUSED; self = GGOBI_RENDERER_CAIRO (object); switch (property_id) { case PROP_CAIRO: { #line 32 "renderer-cairo.gob" g_value_set_pointer(VAL, selfp->cairo); #line 316 "ggobi-renderer-cairo.c" } break; default: /* Apparently in g++ this is needed, glib is b0rk */ #ifndef __PRETTY_FUNCTION__ # undef G_STRLOC # define G_STRLOC __FILE__ ":" G_STRINGIFY (__LINE__) #endif G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } #undef __GOB_FUNCTION__ #line 32 "renderer-cairo.gob" cairo_t * ggobi_renderer_cairo_get_cairo (GGobiRendererCairo * self) { #line 337 "ggobi-renderer-cairo.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::get_cairo" { #line 22 "renderer-cairo.gob" cairo_t* val; g_object_get (G_OBJECT (self), "cairo", &val, NULL); return val; }} #line 343 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #line 25 "renderer-cairo.gob" void ggobi_renderer_cairo_set_cairo (GGobiRendererCairo * self, cairo_t * val) { #line 350 "ggobi-renderer-cairo.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::set_cairo" { #line 22 "renderer-cairo.gob" g_object_set (G_OBJECT (self), "cairo", val, NULL); }} #line 356 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #line 36 "renderer-cairo.gob" static GdkDrawable * ___3_ggobi_renderer_cairo_create_target (GGobiRenderer * self G_GNUC_UNUSED, GdkDrawable * parent) #line 362 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___parent) \ ((GGOBI_RENDERER_CLASS(parent_class)->create_target)? \ (* GGOBI_RENDERER_CLASS(parent_class)->create_target)(___self,___parent): \ ((GdkDrawable * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::create_target" { #line 38 "renderer-cairo.gob" // FIXME: eventually we don't want to use the parent's drawable at all // -- we should override everything with cairo GdkDrawable *target = PARENT_HANDLER(self, parent); /* if we do not have a cairo context yet, try for a glitz (pbuffer) surface, otherwise fallback to image surface */ if (!SELF(self)->_priv->cairo) SELF(self)->_priv->cairo = self_create_cairo(SELF(self), target); return target; }} #line 380 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 48 "renderer-cairo.gob" static cairo_t * ggobi_renderer_cairo_create_cairo (GGobiRendererCairo * self, GdkDrawable * target) { #line 388 "ggobi-renderer-cairo.c" GGobiRendererCairoClass *klass; #line 48 "renderer-cairo.gob" g_return_val_if_fail (self != NULL, (cairo_t * )0); #line 48 "renderer-cairo.gob" g_return_val_if_fail (GGOBI_IS_RENDERER_CAIRO (self), (cairo_t * )0); #line 394 "ggobi-renderer-cairo.c" klass = GGOBI_RENDERER_CAIRO_GET_CLASS(self); if(klass->create_cairo) return (*klass->create_cairo)(self,target); else return (cairo_t * )(0); } #line 48 "renderer-cairo.gob" static cairo_t * ___real_ggobi_renderer_cairo_create_cairo (GGobiRendererCairo * self G_GNUC_UNUSED, GdkDrawable * target) { #line 406 "ggobi-renderer-cairo.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::create_cairo" { #line 50 "renderer-cairo.gob" return gdk_cairo_create(target); }} #line 413 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #line 54 "renderer-cairo.gob" static void ggobi_renderer_cairo_line_type (GGobiRendererCairo * self, GdkGCValues * values) { #line 420 "ggobi-renderer-cairo.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::line_type" #line 54 "renderer-cairo.gob" g_return_if_fail (self != NULL); #line 54 "renderer-cairo.gob" g_return_if_fail (GGOBI_IS_RENDERER_CAIRO (self)); #line 426 "ggobi-renderer-cairo.c" { #line 56 "renderer-cairo.gob" cairo_line_cap_t cap = CAIRO_LINE_CAP_ROUND; cairo_line_join_t join = CAIRO_LINE_JOIN_ROUND; /*static double dashes[8]; gint i;*/ cairo_set_line_width(selfp->cairo, values->line_width+1); switch(values->cap_style) { case GDK_CAP_ROUND: cap = CAIRO_LINE_CAP_ROUND; break; case GDK_CAP_BUTT: case GDK_CAP_NOT_LAST: cap = CAIRO_LINE_CAP_BUTT; break; case GDK_CAP_PROJECTING: cap = CAIRO_LINE_CAP_SQUARE; break; } cairo_set_line_cap(selfp->cairo, cap); switch(values->join_style) { case GDK_JOIN_ROUND: join = CAIRO_LINE_JOIN_ROUND; break; case GDK_JOIN_MITER: join = CAIRO_LINE_JOIN_MITER; //cairo_set_miter_limit(selfp->cairo, gc->lmitre); break; case GDK_JOIN_BEVEL: join = CAIRO_LINE_JOIN_BEVEL; break; } cairo_set_line_join(selfp->cairo, join); // FIXME: Don't know how to get the dashes out of the GdkGC // Perhaps we could extend GdkGC /* for(i = 0; i < 8 && gc->lty & 15; i++) { dashes[i] = gc->lty & 15; gc->lty = gc->lty >> 4; } cairo_set_dash(cr, dashes, i, 0);*/ }} #line 475 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #line 103 "renderer-cairo.gob" static void ggobi_renderer_cairo_stroke (GGobiRendererCairo * self, GdkGC * gc, gboolean filled) { #line 482 "ggobi-renderer-cairo.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::stroke" #line 103 "renderer-cairo.gob" g_return_if_fail (self != NULL); #line 103 "renderer-cairo.gob" g_return_if_fail (GGOBI_IS_RENDERER_CAIRO (self)); #line 488 "ggobi-renderer-cairo.c" { #line 105 "renderer-cairo.gob" GdkColor color; GdkGCValues values; GdkColormap *colors = gdk_gc_get_colormap(gc); gdk_gc_get_values(gc, &values); gdk_colormap_query_color(colors, values.foreground.pixel, &color); //g_debug("color: %d %d %d", color.red, color.green, color.blue); gdk_cairo_set_source_color(selfp->cairo, &color); if (filled) cairo_fill_preserve(selfp->cairo); self_line_type(self, &values); cairo_stroke(selfp->cairo); }} #line 504 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #line 118 "renderer-cairo.gob" static void ggobi_renderer_cairo_polypath (GGobiRendererCairo * self, guint npoints, GdkPoint * points) { #line 511 "ggobi-renderer-cairo.c" #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::polypath" #line 118 "renderer-cairo.gob" g_return_if_fail (self != NULL); #line 118 "renderer-cairo.gob" g_return_if_fail (GGOBI_IS_RENDERER_CAIRO (self)); #line 517 "ggobi-renderer-cairo.c" { #line 120 "renderer-cairo.gob" gint i; cairo_move_to(selfp->cairo, points[0].x, points[0].y); for (i = 1; i < npoints; i++) cairo_line_to(selfp->cairo, points[i].x, points[i].y); }} #line 526 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #line 127 "renderer-cairo.gob" static void ___8_ggobi_renderer_cairo_draw_rectangle (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height) #line 532 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___filled,___x,___y,___width,___height) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_rectangle) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_rectangle)(___self,___gc,___filled,___x,___y,___width,___height); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_rectangle" { #line 130 "renderer-cairo.gob" //g_debug("drawing rect: %d %d %d %d", x, y, width, height); cairo_rectangle(SELF(self)->_priv->cairo, x, y, width, height); self_stroke(SELF(self), gc, filled); }} #line 545 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 135 "renderer-cairo.gob" static void ___9_ggobi_renderer_cairo_draw_arc (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, gboolean filled, gint x, gint y, gint width, gint height, gint angle1, gint angle2) #line 552 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___filled,___x,___y,___width,___height,___angle1,___angle2) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_arc) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_arc)(___self,___gc,___filled,___x,___y,___width,___height,___angle1,___angle2); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_arc" { #line 138 "renderer-cairo.gob" //cairo_move_to(cr, x+r, y); cairo_t *cr = SELF(self)->_priv->cairo; cairo_save(cr); cairo_translate (cr, x + width / 2., y + height / 2.); cairo_scale (cr, (width / 2.), (height / 2.)); //g_debug("drawing arc from: %f to %f", CAIRO_ANGLE(angle2), CAIRO_ANGLE(angle1)); cairo_arc_negative (cr, 0., 0., 1., CAIRO_ANGLE(angle1), CAIRO_ANGLE(angle2)); self_stroke(SELF(self), gc, filled); cairo_restore(cr); }} #line 571 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 149 "renderer-cairo.gob" static void ___a_ggobi_renderer_cairo_draw_polygon (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, gboolean filled, GdkPoint * points, gint npoints) #line 578 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___filled,___points,___npoints) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_polygon) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_polygon)(___self,___gc,___filled,___points,___npoints); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_polygon" { #line 152 "renderer-cairo.gob" //g_debug("POLYGON"); self_polypath(SELF(self), npoints, points); cairo_close_path(SELF(self)->_priv->cairo); self_stroke(SELF(self), gc, filled); }} #line 592 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 158 "renderer-cairo.gob" static void ___b_ggobi_renderer_cairo_draw_points (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkPoint * points, gint npoints) #line 599 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___points,___npoints) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_points) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_points)(___self,___gc,___points,___npoints); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_points" { #line 160 "renderer-cairo.gob" guint i; //g_debug("POINTS"); cairo_t *cr = SELF(self)->_priv->cairo; for (i = 0; i < npoints; i++) cairo_rectangle(cr, points[i].x - 0.5, points[i].y - 0.5, 1., 1.); self_stroke(SELF(self), gc, FALSE); }} #line 615 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 168 "renderer-cairo.gob" static void ___c_ggobi_renderer_cairo_draw_segments (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkSegment * segs, gint nsegs) #line 622 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___segs,___nsegs) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_segments) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_segments)(___self,___gc,___segs,___nsegs); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_segments" { #line 170 "renderer-cairo.gob" guint i; //g_debug("SEGMENTS"); cairo_t *cr = SELF(self)->_priv->cairo; for (i = 0; i < nsegs; i++) { cairo_move_to(cr, segs[i].x1, segs[i].y1); cairo_line_to(cr, segs[i].x2, segs[i].y2); } self_stroke(SELF(self), gc, FALSE); }} #line 640 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 180 "renderer-cairo.gob" static void ___d_ggobi_renderer_cairo_draw_lines (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkPoint * points, gint npoints) #line 647 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___points,___npoints) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_lines) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_lines)(___self,___gc,___points,___npoints); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_lines" { #line 182 "renderer-cairo.gob" self_polypath(SELF(self), npoints, points); self_stroke(SELF(self), gc, FALSE); }} #line 659 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 186 "renderer-cairo.gob" static void ___e_ggobi_renderer_cairo_draw_trapezoids (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkTrapezoid * trapezoids, gint n_trapezoids) #line 666 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___trapezoids,___n_trapezoids) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_trapezoids) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_trapezoids)(___self,___gc,___trapezoids,___n_trapezoids); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_trapezoids" { #line 189 "renderer-cairo.gob" guint i; cairo_t *cr = SELF(self)->_priv->cairo; for (i = 0; i < n_trapezoids; i++) { cairo_move_to(cr, trapezoids[i].x11, trapezoids[i].y1); cairo_line_to(cr, trapezoids[i].x21, trapezoids[i].y1); cairo_line_to(cr, trapezoids[i].x22, trapezoids[i].y2); cairo_line_to(cr, trapezoids[i].x12, trapezoids[i].y2); cairo_line_to(cr, trapezoids[i].x11, trapezoids[i].y1); } self_stroke(SELF(self), gc, FALSE); }} #line 686 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 214 "renderer-cairo.gob" static void ___11_ggobi_renderer_cairo_draw_glyphs (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) #line 695 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___font,___x,___y,___glyphs) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs)(___self,___gc,___font,___x,___y,___glyphs); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_glyphs" { #line 217 "renderer-cairo.gob" cairo_move_to(SELF(self)->_priv->cairo, x, y); pango_cairo_show_glyph_string(SELF(self)->_priv->cairo, font, glyphs); }} #line 707 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 221 "renderer-cairo.gob" static void ___12_ggobi_renderer_cairo_draw_glyphs_transformed (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, PangoMatrix * matrix, PangoFont * font, gint x, gint y, PangoGlyphString * glyphs) #line 714 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___matrix,___font,___x,___y,___glyphs) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs_transformed) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_glyphs_transformed)(___self,___gc,___matrix,___font,___x,___y,___glyphs); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_glyphs_transformed" { #line 224 "renderer-cairo.gob" cairo_t *cr = SELF(self)->_priv->cairo; cairo_matrix_t cr_matrix = { matrix->xx, matrix->xy, matrix->yx, matrix->yy, matrix->x0, matrix->y0 }; cairo_save(cr); cairo_set_matrix(cr, &cr_matrix); GDK_DRAWABLE_GET_CLASS(self)->draw_glyphs(self, gc, font, x, y, glyphs); cairo_restore(cr); }} #line 731 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 234 "renderer-cairo.gob" static void ___13_ggobi_renderer_cairo_draw_drawable (GdkDrawable * self G_GNUC_UNUSED, GdkGC * gc, GdkDrawable * src, gint xsrc, gint ysrc, gint xdest, gint ydest, gint width, gint height) #line 738 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___gc,___src,___xsrc,___ysrc,___xdest,___ydest,___width,___height) \ { if(GDK_DRAWABLE_CLASS(parent_class)->draw_drawable) \ (* GDK_DRAWABLE_CLASS(parent_class)->draw_drawable)(___self,___gc,___src,___xsrc,___ysrc,___xdest,___ydest,___width,___height); } { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::draw_drawable" { #line 237 "renderer-cairo.gob" cairo_t *cr = SELF(self)->_priv->cairo; cairo_surface_t *surf = GDK_DRAWABLE_GET_CLASS(src)->ref_cairo_surface(src); cairo_set_source_surface(cr, surf, xdest - xsrc, ydest - ysrc); cairo_save(cr); cairo_rectangle(cr, xdest, ydest, width, height); cairo_clip(cr); cairo_paint(cr); cairo_restore(cr); }} #line 756 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 248 "renderer-cairo.gob" static GdkDrawable * ___14_ggobi_renderer_cairo_get_composite_drawable (GdkDrawable * self G_GNUC_UNUSED, gint x, gint y, gint width, gint height, gint * composite_x_offset, gint * composite_y_offset) #line 763 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self,___x,___y,___width,___height,___composite_x_offset,___composite_y_offset) \ ((GDK_DRAWABLE_CLASS(parent_class)->get_composite_drawable)? \ (* GDK_DRAWABLE_CLASS(parent_class)->get_composite_drawable)(___self,___x,___y,___width,___height,___composite_x_offset,___composite_y_offset): \ ((GdkDrawable * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::get_composite_drawable" { #line 251 "renderer-cairo.gob" GdkDrawable *parent, *composite; cairo_t *cr; g_object_get(G_OBJECT(self), "parent", &parent, NULL); composite = gdk_pixmap_new(parent, width, height, -1); cr = gdk_cairo_create(composite); cairo_set_source_surface(cr, cairo_get_target(SELF(self)->_priv->cairo), -1*x, -1*y); cairo_paint(cr); cairo_destroy(cr); *composite_x_offset = 0; *composite_y_offset = 0; return composite; }} #line 786 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 266 "renderer-cairo.gob" static cairo_surface_t * ___15_ggobi_renderer_cairo_ref_cairo_surface (GdkDrawable * self G_GNUC_UNUSED) #line 793 "ggobi-renderer-cairo.c" #define PARENT_HANDLER(___self) \ ((GDK_DRAWABLE_CLASS(parent_class)->ref_cairo_surface)? \ (* GDK_DRAWABLE_CLASS(parent_class)->ref_cairo_surface)(___self): \ ((cairo_surface_t * )0)) { #define __GOB_FUNCTION__ "GGobi:Renderer:Cairo::ref_cairo_surface" { #line 268 "renderer-cairo.gob" return cairo_surface_reference(cairo_get_target(SELF(self)->_priv->cairo)); }} #line 805 "ggobi-renderer-cairo.c" #undef __GOB_FUNCTION__ #undef PARENT_HANDLER #line 272 "renderer-cairo.gob" #endif #line 813 "ggobi-renderer-cairo.c" ggobi-2.1.12/src/write_xml.h0000644000175000017500000000454514651527764011350 #ifndef WRITE_XML_H #define WRITE_XML_H #include #include #include "vars.h" #include "externs.h" #include #ifdef __cplusplus extern "C" { #endif /* An instance of this structure is passed to all the routines that are called when writing the XML representation of a ggobid object (its datad elements). Thus it can be used to store additional information that may be needed by the output engine for particular elements and attributes. For example, we might add the description text here. Also, we might add the precision (number of digits after the decimal point) here and look at it in writeFloat(). Or we might have an `inline' field to indicate whether the colormap should be output directly into the file/stream or separately. So basically, this can also hold options. */ typedef struct { gboolean useDefault; gint defaultGlyphSize; gint defaultGlyphType; gchar *defaultGlyphTypeName; gchar *defaultGlyphSizeName; gshort defaultColor; gchar *defaultColorName; } XmlWriteInfo; gboolean write_xml (const gchar *filename, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_stream (FILE *f, ggobid *gg, const gchar *, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_dataset(FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_header (FILE *f, int numDatasets, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_footer(FILE *f, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_description (FILE *f, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_variables (FILE *f, GGobiData *, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_variable (FILE *f, GGobiData *, ggobid *gg, gint i, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_records (FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_record (FILE *, GGobiData *, ggobid *, gint, vartyped *, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_edges(FILE *f, GGobiData *d, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_xml_edge(FILE *f, GGobiData *d, ggobid *gg, gint i, XmlWriteInfo *xmlWriteInfo); gboolean write_dataset_header(FILE *f, GGobiData *, ggobid *gg, XmlWriteInfo *xmlWriteInfo); gboolean write_dataset_footer(FILE *f, ggobid *gg, XmlWriteInfo *xmlWriteInfo); #ifdef __cplusplus } #endif #endif ggobi-2.1.12/src/parcoordsClass.h0000644000175000017500000000541414651527764012314 /* parcoordsClass.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef PARCOORDS_CLASS_H #define PARCOORDS_CLASS_H #include "ggobi.h" #define GGOBI_TYPE_PAR_COORDS_SPLOT (ggobi_par_coords_splot_get_type()) #define GGOBI_PAR_COORDS_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_PAR_COORDS_SPLOT, parcoordsSPlotd)) #define GGOBI_PAR_COORDS_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_PAR_COORDS_SPLOT, GGobiParCoordsSPlotClass)) #define GGOBI_IS_PAR_COORDS_SPLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_PAR_COORDS_SPLOT)) #define GGOBI_IS_PAR_COORDS_SPLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_PAR_COORDS_SPLOT)) #define GGOBI_PAR_COORDS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_PAR_COORDS, GGobiParCoordsClass)) GType ggobi_par_coords_splot_get_type(void); typedef struct { GGobiExtendedSPlotClass parent_class; } GGobiParCoordsSPlotClass; typedef struct { extendedSPlotd extendedSPlot; } parcoordsSPlotd; #define GGOBI_TYPE_PAR_COORDS_DISPLAY (ggobi_par_coords_display_get_type ()) #define GGOBI_PAR_COORDS_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GGOBI_TYPE_PAR_COORDS_DISPLAY, parcoordsDisplayd)) #define GGOBI_PAR_COORDS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GGOBI_TYPE_PAR_COORDS_DISPLAY, GGobiParCoordsDisplayClass)) #define GGOBI_IS_PAR_COORDS_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GGOBI_TYPE_PAR_COORDS_DISPLAY)) #define GGOBI_IS_PAR_COORDS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GGOBI_TYPE_PAR_COORDS_DISPLAY)) #define GGOBI_PAR_COORDS_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GGOBI_TYPE_PAR_COORDS_DISPLAY, GGobiParCoordsDisplayClass)) GType ggobi_par_coords_display_get_type(); displayd *ggobi_par_coords_display_new(gint type, gboolean missing_p, GGobiData *d, ggobid *gg); typedef struct { GGobiExtendedDisplayClass parent_class; } GGobiParCoordsDisplayClass; typedef struct { extendedDisplayd extendedDpy; } parcoordsDisplayd; void parcoordsDisplayClassInit(GGobiParCoordsDisplayClass *klass); void parcoordsSPlotClassInit(GGobiParCoordsSPlotClass *klass); void parcoordsDisplayInit(parcoordsDisplayd *display); splotd *ggobi_parcoords_splot_new(displayd *dpy, ggobid *gg); #endif ggobi-2.1.12/src/GGobiAPI.h0000644000175000017500000007356014651527764010662 /* GGobiAPI.h */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #ifndef GGOBI_API_H #define GGOBI_API_H /** @file @nosubgrouping */ /*(for doxygen)*/ #include #include "ggobi.h" #include "defines.h" #include "display.h" /** This is the publically accessible set of routines that allow a developer to access GGobi functionality from within their own application, facilitating the embedding of GGobi in other software. The routines and data structures allow one to instantiate one or more independent GGobi objects (ggobid) and to query, set and modify the datasets and their variables and values. Within a ggobid object, one can create new plots of different types. One can programmatically control the content and appearance of the these plots, including the color and glyph of individual points. One can programmatically brush regions of a plot. */ #ifdef __cplusplus extern "C" { #endif /* The routines that copy values into an array may not be suitable for large datasets. In these cases, we may want to allow the caller to pass in a pre-allocated space. This is true of R & S, and other applications that manage the memory in different ways than malloc/calloc. */ /** @defgroup Version Version Information @brief Meta information about the GGobi release. */ /** @ingroup Version Retrieve a string describing the ``release'' or distribution date of this version of ggobi. This is useful for determining if certain features are available, bugs have been fixed, etc. @see GGobi_getVersionString() @see GGobi_getVersionNumbers() */ /*extern char const * GGOBI(getVersionDate)(void);*/ /* I think these should be 'const char *' and not 'char * const' - mfl */ extern const char * GGOBI(getVersionDate)(void); /** @ingroup Version Retrieve a string describing the ``release'' or distribution date of this version of ggobi. This is useful for determining if certain features are available, bugs have been fixed, etc. */ /*extern char const * GGobi_getVersionString();*/ extern const char * GGobi_getVersionString(); /** @ingroup Version Returns a triplet of integers giving the major, minor and patch level numbers for this particular distribution of GGobi. These can be used to determine the characteristics of this version of the GGobi software. */ /*extern int const * GGobi_getVersionNumbers();*/ extern const int * GGobi_getVersionNumbers(); /** @defgroup GGobi Meta-information for a GGobi Instance @brief Readable access for meta information about a GGobi instance. */ /** @ingroup GGobi Returns the name of the data source (i.e. file, URL, ...) associated with the (first) dataset in the specified GGobi instance. Note that the returned value is not a copy of the value and is used by ggobi. If you alter it, it will be altered in the GGobi instance also. */ const gchar *GGobi_getFileName(ggobid *gg); /** @ingroup GGobi Read the data from the specified file.. To force a particular data mode (e.g. XML, etc.) rather than leaving it to the auto-detection, use setDataMode() before calling this routine.. */ const gchar *GGobi_setFileName(const gchar *fileName, DataMode data_mode, ggobid *gg); /** @ingroup GGobi Returns mode of input data. */ extern DataMode GGobi_getDataMode(ggobid *gg); /* I don't think this is defined anymore - mfl */ /*extern const gchar * const GGobi_getDataModeDescription(DataMode mode);*/ /** @ingroup GGobi */ extern DataMode GGobi_setDataMode(DataMode newMode, ggobid *gg); /** @ingroup GGobi * data, but also row and column labels, lines, colors, blahblah * how to do that from R? Easier once we have xml i/o. * R and S would really like to provide a single vector/array * of doubles, arranged by column. Hence the double* for now. * A double array (double **) would be useful also. */ extern void GGobi_setData(gdouble *values, gchar **rownames, gchar **colnames, gint nr, gint nc, GGobiData *d, gboolean initPlot, ggobid *gg, gchar **ids, gboolean duplicate, InputDescription *); extern void GGobi_setDataName(const char * const name, GGobiData *d); /** @ingroup GGobi Whether to get the transformed names or the regular ones. */ extern gchar **GGobi_getVariableNames(gboolean transformed, GGobiData *, ggobid *); /** @ingroup GGobi Set the name of the jvar'th variable, either the regular name or that of the variable's tranformed counterpart. */ extern void GGobi_setVariableName(gint jvar, gchar *name, gboolean transformed, GGobiData *, ggobid *gg); /** @ingroup GGobi This provides a way to initialize and run GGobi as it would be in the stand-alone application, but controlling whether the standard GGobi event loop is run or whether control is returned to the caller after the usual GGobi initialization is complete. This is used to when embedding GGobi in other applications that want control when and how GGobi events are processed. */ extern gint GGobi_main(gint argc, gchar *argv[], gboolean processEvents); /** @ingroup GGobi Maps the name of a view type to its symbolic constant. */ extern gint GGobi_getViewTypeIndex(gchar *viewType); /** @ingroup GGobi Converts a symbolic constant to the name of a view type. See getCurrentDisplay. */ extern const gchar *GGobi_getViewTypeName(displayd *dpy); /** @ingroup GGobi Returns a description of the type of the currently active display window. */ extern const gchar *GGobi_getCurrentDisplayType(ggobid *gg); /** @ingroup GGobi Sets the value of the argument to the number of view types. See ViewTypes[] and ViewTypeIndices[] in defines.h */ extern const gchar * const *GGobi_getViewTypes(int *n); /** Get the symblic constants associated identifying each plot type. The value of the argument is set to the length of the array. See getViewTypes. ViewTypes[] and ViewTypeIndices[] in defines.h */ extern const gint *GGobi_getViewTypeIndices(int *n); /** Returns a pointer to the raw data. This is not a copy, but the actual data used by the internals of GGobi. */ extern const gfloat** GGobi_getRawData(GGobiData *, ggobid *); /** Returns a pointer to the (second) transformation of the raw data. This is not a copy, but the actual data used by the internals of GGobi. */ extern const gfloat** GGobi_getTFormData(GGobiData *, ggobid *); /** Closes the currently active display, unless that is the only one available. We may provide access to the force argument of display_free, but this needs a little more finessing. */ extern void GGobi_destroyCurrentDisplay(); /** Returns a reference to the names of the observations used by GGobi to identify the rows in the data. */ extern const gchar ** GGobi_getCaseNames(); /** */ extern void GGobi_setCaseName(gint pt, const gchar *lbl, GGobiData *d, ggobid *gg); /** @defgroup Displays Top-level Displays @brief This set of routines relate to creating new top-level display windows within a GGobi instance, each display containing one or more plots. */ /** @ingroup Displays Create a new display containing a single scatterplot of (X, Y) of the variables identified by index in the specified dataset in the given GGobi instance. @param ix the index of the variable in the dataset to use as the X variable. @param iy the index of the variable in the dataset to use as the X variable. @param data reference to the dataset in which to find/resolve the variables. @param gg the GGobi instance in which to find the dataset and to which the display will belong. @return a new top-level display object. */ extern displayd *GGobi_newScatterplot(gint ix, gint iy, gboolean use_window, GGobiData *data, ggobid *gg); /** @ingroup Displays Create a top-level display containing a matrix of scatterplots for each of the different pairs of variables identified by the indices in rows and columns within the specified dataset within the GGobi instance. @param rows @param columns @param nr @param nc */ extern displayd *GGobi_newScatmat(gint *rows, gint *columns, gint nr, gint nc, gboolean use_window, GGobiData *, ggobid *gg); /** @ingroup Displays Create a new top-level display containing parallel coordinate plots for the different variables identified in the dataset within the GGobi instance by index (rather than name). The order of the plots is determined by the order in which the variables are given in the array. */ extern displayd *GGobi_newParCoords(gint *vars, gint num, gboolean use_window, GGobiData *, ggobid *gg); /** @ingroup Displays Create a top-level display containing a time series plot for each of the variables identified by index via the argument vars in the specified dataset within the GGobi instance. */ extern displayd *GGobi_newTimeSeries(gint *yvars, gint numVars, gboolean use_window, GGobiData *d, ggobid *gg); /** @ingroup Displays */ extern displayd *createPlot(gint type, gchar **varnames); /** @ingroup Displays Create a top-level display for a matrix of X-Y/scatter plots. See GGobi_newScatmat() */ gint *createScatmatWindow(gint nrows, gint ncols, displayd *display, ggobid *gg, gboolean useWindow); /** @defgroup DisplayAccess Accessors for Top-level Display Windows @brief Accessor routines for managing the top-level plot container windows. */ /* @{ */ /** @ingroup DisplayAccess */ extern displayd *GGobi_getDisplay(gint which, ggobid *gg); /** @ingroup DisplayAccess */ extern DisplayOptions *GGobi_getDefaultDisplayOptions(); /** @ingroup DisplayAccess */ extern DisplayOptions *GGobi_getDisplayOptions(gint displayNum, ggobid *gg); /** @ingroup DisplayAccess */ extern displayd *GGobi_setCurrentDisplay(gint which, ggobid *gg); /** @ingroup DisplayAccess */ extern displayd *GGobi_getCurrentDisplay(ggobid *gg); extern gint GGobi_getCurrentDisplayIndex(ggobid *gg); /* @} */ /** */ extern void GGobi_setPlotRange(double *x, double *y, int plotNum, displayd *display, gboolean pixels, ggobid *gg); /*-- point glyph types and sizes --*/ /** @defgroup Glyphs Glyphs @brief Accessors for each observations glyph, including type, color and size. */ /** @ingroup Glyphs Retrieve the list of the internal codes used for representing the glyph types that GGobi understands. @return an array of integers giving the enumerated values for the different glyph types. The number of elements in the array is contained in the value of the argument (n). */ extern gint *GGobi_getGlyphTypes(gint *n); /** Retrieve the list of the symbolic names associated with the glyph types that GGobi understands. The elements returned correspond to the elements returned by GGobi_getGlyphTypes(). @return an array of strings. The number of elements in the array is contained in the value of the argument (n). @ingroup Glyphs */ extern const gchar * const * GGobi_getGlyphTypeNames(gint *n); /*extern const gchar ** const GGobi_getGlyphTypeNames(gint *n);*/ /** Get the symbolic name of the glyph corresponding to the internal constant that represents the glyph type. @return a string giving the human readable name of the glyph type. @ingroup Glyphs */ extern gchar const* GGobi_getGlyphTypeName(gint n); /** Retrieve the current glyph types for one or more observations. This returns the internal representation of the glyph type which can be converted to a symbolic, human-readable name using GGobi_getGlyphTypeName(). @return an array of length `n' whose i-th entry contains the current glyph type for the observation identified by the i-th value in the argument `which' @see GGobi_getGlyphTypeName() @ingroup Glyphs */ extern gint *GGobi_getCaseGlyphTypes(gint *which, gint n, GGobiData *dataset, ggobid *gg); /** Get the glyph type attribute for a single observation @param id the index of the observation of interest @param dataset the dataset within the GGobi instance in which to find the observation. @param gg the GGobi instance in which to find the dataset. @return the internal representation of a glyph, which is a symbolic constant. @see GGobi_getGlyphTypeName() @ingroup Glyphs */ extern gint GGobi_getCaseGlyphType(gint id, GGobiData *dataset, ggobid *gg); /** Get the glyph size attribute for a collection of observations. @param which an array of the indices of the observations of interest. @param n the length of the array `which', and the length of the array that is returned. @param dataset the dataset within the GGobi instance in which to find the observation. @param gg the GGobi instance in which to find the dataset. @return an array giving the size of the glyph for the specified observations. The i-th element corresponds to the observation identified by the i-th element of the array `which'. @see GGobi_getGlyphTypeName() @ingroup Glyphs */ extern gint *GGobi_getCaseGlyphSizes(gint *which, gint n, GGobiData *dataset, ggobid *gg); /** Get the glyph size attribute for a single observation @param id the index of the observation of interest @param dataset the dataset within the GGobi instance in which to find the observation. @param gg the GGobi instance in which to find the dataset. @return the size of the glyph for the given observation @see GGobi_getGlyphTypeName() @see GGobi_getGlyphTypeName() @ingroup Glyphs */ extern gint GGobi_getCaseGlyphSize(gint id, GGobiData *dataset, ggobid *gg); /** @ingroup Glyphs */ extern void GGobi_setCaseGlyph(gint pt, gint type, gint size, GGobiData *d, ggobid *gg); /** @ingroup Glyphs */ extern void GGobi_setCaseGlyphs(gint *pts, gint n, gint type, gint size, GGobiData *d, ggobid *gg); /* point colors */ /** Get the color attribute of a single observation. @param pt the index of the observation of interest. @param dataset the dataset in which to resolve the observation @param gg the ggobi instance in which to find the dataset. @ingroup Glyphs */ extern gint GGobi_getCaseColor(gint pt, GGobiData *dataset, ggobid *gg); /** Query the color attribute of a collection of points. @param pts an array giving the indices of the different observations whose color attribute is to be queried. @param howMany the number of entries in the `pts' array. @param dataset the dataset in which to resolve the observation @param gg the ggobi instance in which to find the dataset. @return an array of the indices into the colormap of the points. The length of this array is `howMany' and the i-th element corresponds to observation identified by the i-th element of `pts'. @see GGobi_getCaseColor() @see GGobi_setCaseColor() @see GGobi_setCaseColors() @ingroup Glyphs */ extern gint * GGobi_getCaseColors(gint *pts, gint howMany, GGobiData *dataset, ggobid *gg); /** Set the color (for each plot) for a single observation. @param pt the index of the record/observation whose color is to be set. @param colorIndex the index of the color in the current colormap to which the observations color is to be set. @param dataset the dataset in which to resolve the observation @param gg the ggobi instance in which to find the dataset. @see GGobi_getCaseColor() @see GGobi_setCaseColors() @ingroup Glyphs */ extern void GGobi_setCaseColor(gint pt, gint colorIndex, GGobiData *dataset, ggobid *gg); /** Set the color (for each plot) for a collection of observations to the same value. @param pt an array of indices of the records/observations whose color attribute are to be set. @param n the number of elements in the `pts' array. @param colorIndex the index of the color in the current colormap to which the observations color is to be set. @param dataset the dataset in which to resolve the observation @param gg the ggobi instance in which to find the dataset. @see GGobi_setCaseColor() @see GGobi_getCaseColor() @ingroup Glyphs */ extern void GGobi_setCaseColors(gint *pts, gint n, gint color, GGobiData *dataset, ggobid *gg); /* point hidden state */ /** */ extern gboolean GGobi_getCaseHidden(gint pt, GGobiData *, ggobid *gg); /** */ extern gboolean * GGobi_getCaseHiddens(gint *pts, gint howMany, GGobiData *, ggobid *gg); /** Specify whether an individual record within the dataset is to be considered hidden or not. */ extern void GGobi_setCaseHidden(gint pt, gboolean hidden_p, GGobiData *, ggobid *gg); /** Control whether specific observations in a dataset are considered hidden or not for the purpose of displaying them. */ extern void GGobi_setCaseHiddens(gint *pts, gint howMany, gboolean hidden_p, GGobiData *, ggobid *gg); /** @defgroup Plots Plot Management @brief Manage individual plots within one or more top-level displays. */ /** @ingroup Plots Get the index of the currently active plot within the specified GGobi instance. This can be used in conjunction with @link GGobi_getCurrentDisplay() to get the currently active plot. @see GGobi_getCurrentDisplay() */ extern gint GGobi_getCurrentPlotIndex(ggobid *gg); /** @ingroup Plots Get the `which'-th plot within the top-level display. @param display @param which the index of the plot of interest. */ extern splotd *GGobi_getPlot(displayd *display, gint which); /** @ingroup Plots Retrieve the plot within a top-level display, identifying the plot of interest by number. */ extern splotd *GGobi_getSPlot(gint which, displayd *display); /** @defgroup Brush Brush Region Management @brief Programmatically query and set the location and size of the brushing region for a ggobi instance. @note The dimenions perhaps should be specified in natural coordinates. But For now, these are specified as pixels! */ /** @ingroup Brush Relocate the top-left corner of the brushing region (rectangle) to the specified pixel. */ extern void GGobi_moveBrush(gint ulx, gint uly, ggobid *gg); /** @ingroup Brush Resize the brushing region (rectangle) for the given plot to have the specified width and height given in pixels. @note Is the plot necessary? or does the setting apply to all plots? */ extern void GGobi_sizeBrush(gint width, gint height, splotd *, ggobid *gg); /** @ingroup Brush Query the size and type of the glyph being used for the brushing area. */ extern void GGobi_getBrushGlyph(gint *type, gint *size, ggobid *gg); /** @ingroup Brush Set the glyph for the brushing region, providing the glyph type and size. */ extern gboolean GGobi_setBrushGlyph(gint type, gint size, ggobid *gg); /** @ingroup Brush Query the current size (width and height) of the brushing region. */ extern void GGobi_getBrushSize(gint *w, gint *h, ggobid *gg); /** @ingroup Brush Set the size (width and height) of the brushing region. */ extern void GGobi_setBrushSize(gint w, gint h, ggobid *gg); /** @ingroup Brush Query the current location (horizontal and vertical coordinates) of the brushing region. */ extern void GGobi_getBrushLocation(gint *x, gint *y, ggobid *gg); /** Within the plots of a ggobi instance, specify the location of the top-left corner of the brush region by giving pixel locations. @note This will be enhanced/changed to allow specification in natural coordinates. */ extern void GGobi_setBrushLocation(gint x, gint y, ggobid *gg); /** @ingroup Brush Get the current color (index in the colormap) of the brushing region. */ extern gint GGobi_getBrushColor(ggobid *gg); /** @ingroup Brush Set the current color (specifying the index in the colormap) of the brushing region. */ extern int GGobi_setBrushColor(gint cid, ggobid *gg); /** @defgroup Color Color Management @brief Interact with the colormap. */ /** @ingroup Color Specify a colormap of Red Green Blue triplets @param vals @param nr @param gg */ gboolean GGobi_setColorMap(gdouble *vals, gint nr, ggobid *gg); /** @ingroup Color This forces the colormap values stored in the GGobi instance to be sent to the desktop server and explicitly allocated as entries in the colormap. @param gg the GGobi instance in which the potential colormap entries are to be found. */ gboolean GGobi_registerColorMap(ggobid *gg); /** @ingroup Color Get the human readable name associated with a specific color in a GGobi instance's colormap. @param cid @param inDefault @param gg */ /*extern const gchar const * GGobi_getColorName(gint cid, ggobid *gg, gboolean inDefault);*/ extern const gchar * /*const*/ GGobi_getColorName(gint cid, ggobid *gg, gboolean inDefault); /** Close down and destroy a GGobi instance, removing all its display windows and discarding its data. If closeWindow is true, the control panel is also eliminated. Otherwise, the GGobi instance can be re-used and a new dataset(s) loaded. */ extern gboolean GGobi_close(ggobid *gg, gboolean closeWindow); /** Return the names (and number) of the user operation modes. These include actions such as brushing, identify, etc. @param n a pointer to an integer which, on return, contains the number of entries in the array that is returned. @return an (immutable) array of (immutable) strings containing the descriptions of the mode names. The number of elements in the array is returned as the value of the argument. */ extern const gchar * const* GGobi_getPModeNames(int *n); extern const gchar * const* GGobi_getIModeNames(int *n); /* Attempting to imitate the style of getPModeName to get the string associated with the keyboard */ extern const gchar * const* GGobi_getPModeKeys(int *n); extern const gchar *GGobi_getPModeKey(gint which); /** Get the symbolic constant associated with the user-interaction operation mode given by name. The possible names are available from ggobi_getOpModeNames */ extern gint GGobi_getPModeId(const gchar *name); extern gint GGobi_getIModeId(const gchar *name); /** Set the operation mode (e.g. brush, identify, ...) for this GGobi instance. @param name one of the entries. */ extern gint GGobi_setPMode(const gchar *name, ggobid *gg); extern gint GGobi_setIMode(const gchar *name, ggobid *gg); /** Get the human-readable name of the user interaction mode associated with the internal symbolic identifier. @see GGobi_getModeId() */ extern const gchar *GGobi_getPModeName(gint which); extern const gchar *GGobi_getIModeName(gint which); /** As above, except it gives the name as it is displayed on the screen */ const gchar *GGobi_getIModeScreenName(int which, displayd *display); const gchar *GGobi_getPModeScreenName(int which, displayd *display); /** ? */ extern int GGobi_full_viewmode_set(ProjectionMode, InteractionMode, ggobid *gg); /** Lower or raise a top-level display window associated with a ggobi instance, identifying the window of interest by number. */ extern gboolean GGobi_raiseWindow(gint which, gboolean raiseOrIcon, gboolean up, ggobid *gg); /** Get the description string associated with the specific ggobid instance. This is usually related to the source of the data or how the ggobid was created by a host application. */ extern gchar *GGobi_getDescription(ggobid *gg); extern void GGobi_splot_set_current_full(displayd *display, splotd *sp, ggobid *gg); /** Find the index of the dataset in the particular ggobid instance by matching the name of the dataset to the given name. */ extern int GGobi_datasetIndex(const char *name, const ggobid * const gg); /** Get a particular ggobid instance from the global collection of ggobids in this session, identifying the ggobid of interest by index. */ extern ggobid * GGobi_ggobi_get(gint); /** Return the total number of ggobi instances that are currently in existence in this session. @see GGobi_ggobi_get() */ extern int GGobi_getNumGGobis(); /** @defgroup Data Dataset Accessors @brief Get dataset references and information about the contents of the dataset. */ /** @ingroup Data Get the dataset within the GGobi instance using the index to identify the dataset. @return a reference to the datad object that is accessed by the ggobid instance. This is not a copy. @see GGobi_data_get_by_name() */ extern GGobiData *GGobi_data_get(int which, const ggobid * const gg); /** @ingroup Data Get the dataset within the GGobi instance using the name of the dataset to identify it. @return a reference to the datad object that is accessed by the ggobid instance. This is not a copy. */ extern GGobiData *GGobi_data_get_by_name(const gchar * const name, const ggobid * const gg); /** @ingroup Data Determine the number of variables in the dataset. */ gint GGobi_ncols(GGobiData *d); /** @ingroup Data Determine the number of records in the dataset. */ gint GGobi_nrecords(GGobiData *dg); /** @ingroup Data */ extern int GGobi_getVariableIndex(const gchar *name, GGobiData *, ggobid *gg); /** @ingroup Data */ extern int GGobi_removeVariableByIndex(gint which, GGobiData *, ggobid *gg); /** @ingroup Data */ extern gboolean GGobi_setVariableValues(gint whichVar, gdouble *vals, gint num, gboolean update, GGobiData *d, ggobid *gg); /* Need len just in case there is no data in the instance */ /** @ingroup Data Add a variable to the specified dataset, and optionally update the different displays, plots and control panel. The ability to delay the update allows add several variables and wait until the last one to update, rather than updating after each addition. @param vals the values for the new variable @param len the number of records or values for this variable. This should be the same as the number of records for the other variables in the dataset. This is a necessary argument in the case where the dataset is currently empty and this is the first variable to be added. @param name the name to use for the variable in the control panel, plots, etc. and when referring to it in other calls to manipulate the GGobi instance. @param update a logical value indicating whether to update the control panel and any other plots. @param d the dataset into which the variable is to be added. @param gg the GGobi instance in which the dataset to be augmented can be found. */ extern int GGobi_addVariable(gdouble *vals, gint len, gchar *name, gboolean update, GGobiData *d, ggobid *gg); extern int GGobi_addCategoricalVariable(gdouble *vals, gint len, gchar *name, gchar **levels, gint *values, gint *counts, gint numLevels, gboolean update, GGobiData *d, ggobid *gg); /** @ingroup Data Recompute the derived transformations for the specified dataset, updating plots if necessary. This is used to force changes in the raw data to be reflected in the different plots. */ extern void GGobi_update_data(GGobiData *, ggobid *gg); /* @} */ /** Get a list of the human readable names of the different input modes for data sources. These include ASCII, XML, database, URL, etc. Caller is responsible for freeing the array, but not its elements! */ const gchar ** GGobi_getDataModeNames(int *n); /** @defgroup EventHandlers Event handlers @brief Customizable Event Handlers for numbered key presses and record identify mode. */ /* @{ */ /** @ingroup EventHandlers register a handler routine which is to be called when one of the number keys is pressed. */ extern KeyEventHandler *GGobi_registerNumberedKeyEventHandler(KeyEventHandlerFunc routine, void *userData, char *description, ReleaseData *data, ggobid *gg, ProgrammingLanguage lang); /** @ingroup EventHandlers Remove a number key handler routine. */ extern KeyEventHandler *GGobi_removeNumberedKeyEventHandler(ggobid *gg); /** @ingroup EventHandlers Register a handler function which is to be invoked while GGobi is in "identify" mode and the pointer (mouse) is close to a point. @param proc a C routine which is to be invoked when a GGobi identify event occurs. @param data arbitrary object/value that is passed to the routine `proc' when it is called. This allows one to parameterize the routine to behave differently for different calls. @param gg the ggobi instance in which the identify events are to be handled. */ extern void GGobi_setIdentifyHandler(IdentifyProc proc, void *data, ggobid *gg); /* @} */ /** @defgroup Edges Edge management. @brief Routines to set and query the connections or edges between records. */ #ifdef OBSOLETE_EDGE_CODE /** @ingroup Edges Query whether the observations/records identified by number in the given dataset are connected by an edge. */ extern gboolean GGobi_isConnectedEdge(gint a, gint b, GGobiData *d, ggobid *gg); /** @ingroup Edges */ extern void GGobi_setObservationEdge(gint x, gint y, GGobiData *, ggobid *, gboolean update); #endif /** @ingroup Edges Determine whether we the default option is to show lines connecting points on a plot. @note This probably needs a ggobid or displayd argument. */ extern gboolean GGobi_getShowLines(); /** @ingroup Edges */ extern gboolean GGobi_setShowLines(displayd *dsp, gboolean val); /** @} */ /** @group Plugins */ extern GtkWidget *GGobi_addDisplayMenuItem(const char *label, ggobid *gg); /** @group Creation */ ggobid* ggobi_alloc(ggobid *tmp); /** */ ggobid *create_ggobi(InputDescription *desc); /** */ void GGobi_setSessionOptions(GGobiOptions *opts); /** */ const gchar *GGobi_getLevelName(vartabled *vt, double value); colorschemed *alloc_colorscheme(); /** Compute and update the bi-directional link information for the collection of edges. This simply fixes up the internal data structure in `edge' given the basic edge connections by pairs of records. */ void GGobi_cleanUpEdgeRelationships(struct _EdgeData *edge, int startPosition); typedef int (*MissingValue_p)(double); MissingValue_p GGobi_setMissingValueIdentifier(MissingValue_p f); extern MissingValue_p GGobiMissingValue; #ifdef __cplusplus } #endif #endif /* End of conditional inclusion of entire file.*/ ggobi-2.1.12/src/schemes.c0000644000175000017500000000050114651527764010744 /* schemes.c */ #include #include #include #include "vars.h" #include "externs.h" /** Initialize basic colors for this ggobid. */ void svis_init (ggobid * gg) { gg->svis.window = NULL; gg->svis.npct = 0; gg->svis.pix = NULL; gg->svis.scheme = NULL; gg->svis.GC = NULL; } ggobi-2.1.12/src/writedata_ui.c0000644000175000017500000002440614651527764012010 /* writedata_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #include "vars.h" #include "externs.h" #include "writedata.h" static gchar *format_lbl[] = {"XML", "CSV"}; void format_set (gint fmt, ggobid *gg) { GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (gg->save.tree_view)); gg->save.format = fmt; if (fmt == 0) // XML gtk_tree_selection_set_mode (sel, GTK_SELECTION_MULTIPLE); else // CSV gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE); } static void format_set_cb (GtkWidget *w, ggobid *gg) { format_set (gtk_combo_box_get_active(GTK_COMBO_BOX(w)), gg); } static gchar *stage_lbl[] = {"Raw data", "Transformed data"}; void stage_set (gint stage, ggobid *gg) { gg->save.stage = stage; } static void stage_set_cb (GtkWidget *w, ggobid *gg) { stage_set (gtk_combo_box_get_active(GTK_COMBO_BOX(w)), gg); } /* static gchar *jitter_lbl[] = {"Don't add jitter", "Add jitter"}; void jitterp_set (gboolean jitterp, ggobid *gg) { gg->save.jitter_p = jitterp; } static void jitterp_set_cb (GtkWidget *w, gpointer cbd) { ggobid *gg = GGobiFromWidget (w, true); jitterp_set ((gboolean ) GPOINTER_TO_INT (cbd), gg); } */ static gchar *rowdata_lbl[] = {"All cases", "Displayed cases", /*"Labeled cases"*/}; void rowind_set (gint ind, ggobid *gg) { gg->save.row_ind = ind; } static void rowind_set_cb (GtkWidget *w, ggobid *gg) { rowind_set (gtk_combo_box_get_active(GTK_COMBO_BOX(w)), gg); } static gchar *columndata_lbl[] = {"All variables", "Selected variables"}; void columnind_set (gint ind, ggobid *gg) { gg->save.column_ind = ind; } static void columnind_set_cb (GtkWidget *w, ggobid *gg) { columnind_set (gtk_combo_box_get_active(GTK_COMBO_BOX(w)), gg); } static gchar *missing_lbl[] = {"Missings as 'na'", "Missings as '.'", "Imputed values"}; void missingind_set (gint ind, ggobid *gg) { gg->save.missing_ind = ind; } static void missingind_set_cb (GtkWidget *w, ggobid *gg) { missingind_set (gtk_combo_box_get_active(GTK_COMBO_BOX(w)), gg); } static gchar *edges_lbl[] = {"Don't save edges", "Save edges"}; void edgesp_set (gboolean edgesp, ggobid *gg) { gg->save.edges_p = edgesp; } static void edgesp_set_cb (GtkWidget *w, ggobid *gg) { edgesp_set ((gboolean ) gtk_combo_box_get_active(GTK_COMBO_BOX(w)), gg); } /*-- called when closed from the button -- what button? --*/ /* static void close_cb (GtkWidget *w) { gtk_widget_destroy (w); window = NULL; } */ /*-- called when closed from the window manager --*/ static void delete_cb (GtkWidget *w, GdkEvent *event, ggobid *gg) { gtk_widget_destroy (w); } void writeall_window_open (ggobid *gg) { GtkWidget *window, *vbox, *table, *opt, *btn, *lbl; gint j; GtkWidget *swin, *tree_view; GtkListStore *model; static gchar *tree_view_titles[1] = {"data"}; GGobiData *d; GSList *l; GtkTreeIter iter; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_cb), (gpointer) gg); gtk_window_set_title (GTK_WINDOW (window), "Write GGobi Data File"); gtk_container_set_border_width (GTK_CONTAINER (window), 10); vbox = gtk_vbox_new (false, VBOX_SPACING); gtk_container_add (GTK_CONTAINER (window), vbox); table = gtk_table_new (7, 2, false); gtk_box_pack_start (GTK_BOX (vbox), table, true, true, 3); /*-- Format --*/ j = 0; opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Save the data in XML or CSV", NULL); populate_combo_box (opt, format_lbl, G_N_ELEMENTS(format_lbl), G_CALLBACK(format_set_cb), gg); gtk_combo_box_set_active (GTK_COMBO_BOX (opt), XMLDATA); /*-- initialize variable to correspond to option menu --*/ gg->save.format = XMLDATA; lbl = gtk_label_new_with_mnemonic ("_Format:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); /*-- Data objects --*/ j++; swin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); // No support for adding datad yet -- just reopen the window. model = gtk_list_store_new(1, G_TYPE_STRING); gg->save.tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); tree_view = gg->save.tree_view; // For now: multiple selection for xml, single for csv populate_tree_view(tree_view, tree_view_titles, 1, false, GTK_SELECTION_MULTIPLE, NULL, gg); /*-- All datad's are included. */ for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, d->name, -1); } gtk_tree_selection_select_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view))); gtk_container_add (GTK_CONTAINER (swin), tree_view); lbl = gtk_label_new_with_mnemonic ("_Data:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), swin); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), swin, 1, 2, j, j+1, GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL, 5, 0); /*-- Stage --*/ j++; opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Save raw or transformed data", NULL); populate_combo_box (opt, stage_lbl, G_N_ELEMENTS(stage_lbl), G_CALLBACK(stage_set_cb), gg); gg->save.stage = TFORMDATA; gtk_combo_box_set_active (GTK_COMBO_BOX (opt), gg->save.stage); lbl = gtk_label_new_with_mnemonic ("_Stage:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); /*-- Jitter? --*/ /* j++; opt = gtk_option_menu_new (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Include any added jitter?", NULL); populate_option_menu (opt, jitter_lbl, sizeof (jitter_lbl) / sizeof (gchar *), jitterp_set_cb, "GGobi", gg); gtk_option_menu_set_history (GTK_OPTION_MENU (opt), true); gtk_table_attach (GTK_TABLE (table), gtk_label_new ("Jitter?:"), 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); */ /*-- Which rows --*/ j++; opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Specify which rows should be written out", NULL); populate_combo_box (opt, rowdata_lbl, G_N_ELEMENTS(rowdata_lbl), G_CALLBACK(rowind_set_cb), gg); gg->save.row_ind = ALLROWS; gtk_combo_box_set_active (GTK_COMBO_BOX (opt), gg->save.row_ind); lbl = gtk_label_new_with_mnemonic ("_Cases:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); /*-- Which columns --*/ j++; opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Specify which variables should be written out", NULL); populate_combo_box (opt, columndata_lbl, G_N_ELEMENTS(columndata_lbl), G_CALLBACK(columnind_set_cb), gg); gg->save.column_ind = ALLCOLS; gtk_combo_box_set_active (GTK_COMBO_BOX (opt), gg->save.column_ind); lbl = gtk_label_new_with_mnemonic ("_Variables:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); /*-- Format for missings --*/ j++; opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Specify how to write out missing data", NULL); populate_combo_box (opt, missing_lbl, G_N_ELEMENTS(missing_lbl), G_CALLBACK(missingind_set_cb), gg); gg->save.missing_ind = MISSINGSNA; gtk_combo_box_set_active (GTK_COMBO_BOX (opt), gg->save.missing_ind); lbl = gtk_label_new_with_mnemonic ("Format for _missings:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); /*-- edges? --*/ j++; opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Include line segments?", NULL); populate_combo_box (opt, edges_lbl, G_N_ELEMENTS(edges_lbl), G_CALLBACK(edgesp_set_cb), gg); /*-- initialize variable corresponding to option menu --*/ /* * This is pretty simple-minded: if any edgesets are present, * let the default be to save edges. Otherwise not. */ gg->save.edges_p = (edgesets_count(gg) > 0); gtk_combo_box_set_active (GTK_COMBO_BOX (opt), gg->save.edges_p); lbl = gtk_label_new_with_mnemonic ("_Edges?:"); gtk_label_set_mnemonic_widget(GTK_LABEL(lbl), opt); gtk_table_attach (GTK_TABLE (table), lbl, 0, 1, j, j+1, GTK_FILL, GTK_FILL, 5, 0); gtk_table_attach (GTK_TABLE (table), opt, 1, 2, j, j+1, GTK_FILL, GTK_FILL, 5, 0); /* * Add a button to open a file selection box; see filename_get_w in io.c */ btn = gtk_button_new_from_stock (GTK_STOCK_SAVE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Open file selection widget", NULL); gtk_box_pack_start (GTK_BOX (vbox), btn, false, false, 3); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (filename_get_w), gg); gtk_widget_show_all (window); } ggobi-2.1.12/src/wvis_ui.c0000644000175000017500000005545614651527764011025 /* wvis_ui.c */ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ /* * Something here should respond to a variable transformation event, * I think. We don't yet have such an event, so I won't spend the * time now to work out what the response should be. dfs 9/10/2002 */ #include #include #include #include "vars.h" #include "externs.h" #include "colorscheme.h" static gint xmargin = 20; static gint ymargin = 20; static void bin_counts_reset (gint jvar, GGobiData *d, ggobid *gg); static void selection_made_cb (GtkTreeSelection *tree_sel, ggobid *gg); /*----------------------------------------------------------------*/ /* Notebook containing the variable list for each datad */ /*----------------------------------------------------------------*/ /* * Apparently I have to override these functions from utils_ui.c * so that I can add a signal appropriately to the new page in * the notebook. * Only one line is different: GtkSignalFunc func = selection_made_cb; */ static void wvis_variable_notebook_adddata_cb (ggobid *gg, GGobiData *d, void *notebook) { GtkWidget *swin = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0); if (swin) { GtkWidget *tree_view; GtkSelectionMode mode = GTK_SELECTION_SINGLE; GCallback func = G_CALLBACK(selection_made_cb); tree_view = GTK_BIN (swin)->child; if (tree_view) { GtkTreeSelection *tree_sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); mode = gtk_tree_selection_get_mode(tree_sel); /* um is something supposed to happen here? mfl */ /* * should also be possible to retrieve the signal function that * responds to "select_row" signal */ } variable_notebook_subwindow_add (d, func, NULL, GTK_WIDGET(notebook), all_vartypes, all_datatypes, gg); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), g_slist_length (gg->d) > 1); } } CHECK_EVENT_SIGNATURE(wvis_variable_notebook_adddata_cb, datad_added_f) CHECK_EVENT_SIGNATURE(variable_notebook_list_changed_cb, variable_list_changed_f) GtkWidget * wvis_create_variable_notebook (GtkWidget *box, GtkSelectionMode mode, GtkSignalFunc func, ggobid *gg) { GtkWidget *notebook; gint nd = g_slist_length (gg->d); GSList *l; GGobiData *d; /* Create a notebook, set the position of the tabs */ notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), nd > 1); gtk_box_pack_start (GTK_BOX (box), notebook, true, true, 2); g_object_set_data(G_OBJECT(notebook), "SELECTION", (gpointer) mode); g_object_set_data(G_OBJECT(notebook), "selection-func", func); g_object_set_data(G_OBJECT(notebook), "selection-func-data", NULL); g_object_set_data(G_OBJECT(notebook), "vartype", (gpointer) all_vartypes); g_object_set_data(G_OBJECT(notebook), "datatype", (gpointer) all_datatypes); for (l = gg->d; l; l = l->next) { d = (GGobiData *) l->data; if (g_slist_length (d->vartable)) { variable_notebook_subwindow_add (d, func, NULL, notebook, all_vartypes, all_datatypes, gg); } } /*-- listen for variable_added and _list_changed events on main_window --*/ /*-- ... list_changed would be adequate --*/ g_signal_connect (G_OBJECT (gg), "variable_added", G_CALLBACK (variable_notebook_varchange_cb), GTK_OBJECT (notebook)); g_signal_connect (G_OBJECT (gg), "variable_list_changed", G_CALLBACK (variable_notebook_list_changed_cb), GTK_OBJECT (notebook)); /*-- listen for variable_added events on main_window --*/ g_signal_connect (G_OBJECT (gg), "datad_added", G_CALLBACK (wvis_variable_notebook_adddata_cb), GTK_OBJECT (notebook)); return notebook; } /*-------------------------------------------------------------------------*/ static void bin_counts_reset (gint jvar, GGobiData *d, ggobid *gg) { gint i, k, m; gfloat val; vartabled *vt; gfloat min, max; colorschemed *scheme = gg->activeColorScheme; if (jvar == -1) return; vt = vartable_element_get (jvar, d); min = vt->lim_tform.min; max = vt->lim_tform.max; for (k=0; kwvis.npct; k++) gg->wvis.n[k] = 0; for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; for (k=0; kn; k++) { val = min + gg->wvis.pct[k] * (max - min); if (d->tform.vals[i][jvar] <= val) { gg->wvis.n[k]++; break; } } } } static void record_colors_reset (gint selected_var, GGobiData *d, ggobid *gg) { gint i, k, m; gint nd = g_slist_length(gg->d); vartabled *vt; gfloat min, max, val; colorschemed *scheme = gg->activeColorScheme; if (selected_var < 0) return; vt = vartable_element_get (selected_var, d); min = vt->lim_tform.min; max = vt->lim_tform.max; for (m=0; mnrows_in_plot; m++) { i = d->rows_in_plot.els[m]; for (k=0; kn; k++) { val = min + gg->wvis.pct[k] * (max - min); if (d->tform.vals[i][selected_var] <= val) { d->color.els[i] = d->color_now.els[i] = k; break; } } if (nd > 1 && !gg->linkby_cv) symbol_link_by_id (true, i, d, gg); /*-- true = force persistent --*/ } } /*-- called when closed from the close button --*/ static void close_btn_cb (GtkWidget *w, ggobid *gg) { gtk_widget_hide (gg->wvis.window); } /*-- called when closed from the window manager --*/ static void close_wmgr_cb (GtkWidget *w, GdkEventButton *event, ggobid *gg) { gtk_widget_hide (gg->wvis.window); } /* * Use the horizontal position of the mouse to move the nearest * boundary */ static gint motion_notify_cb (GtkWidget *w, GdkEventMotion *event, ggobid *gg) { GdkModifierType state; icoords pos; gboolean rval = false; gfloat val; GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (w)); GGobiData *d = NULL; gint selected_var = -1; icoords *mousepos = &gg->wvis.mousepos; gint color = gg->wvis.nearest_color; if(tree_view) { d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); selected_var = get_one_selection_from_tree_view (tree_view, d); } gdk_window_get_pointer (w->window, &pos.x, &pos.y, &state); if (pos.x != mousepos->x) { val = (gfloat) (pos.x - xmargin) / (gfloat) (w->allocation.width - 2*xmargin); /*-- don't allow it to cross its neighbors' boundaries --*/ if ((color == 0 && val <= gg->wvis.pct[color+1] && val >= 0) || (color == gg->wvis.npct-1 && val >= gg->wvis.pct[color+1]) || (val >= gg->wvis.pct[color-1] && val <= gg->wvis.pct[color+1])) { gg->wvis.pct[color] = val; if (selected_var != -1 && selected_var < d->ncols) bin_counts_reset (selected_var, d, gg); g_signal_emit_by_name(G_OBJECT (w), "expose_event", (gpointer) gg, (gpointer) &rval); if (gg->wvis.update_method == WVIS_UPDATE_CONTINUOUSLY) { record_colors_reset (selected_var, d, gg); clusters_set (d, gg); displays_plot (NULL, FULL, gg); } } } mousepos->x = pos.x; return true; } /*-- when the button is pressed, listen for motion notify events --*/ static gint button_press_cb (GtkWidget *w, GdkEventButton *event, ggobid *gg) { GdkModifierType state; icoords pos; gint k, x, y, nearest = -1, d; gint dist = w->allocation.width*w->allocation.width + w->allocation.height*w->allocation.height; colorschemed *scheme = gg->activeColorScheme; gfloat *pct = gg->wvis.pct; gint *nearest_color = &gg->wvis.nearest_color; gint hgt; hgt = (w->allocation.height - 2*ymargin) / (scheme->n - 1); gdk_window_get_pointer (w->window, &pos.x, &pos.y, &state); /*-- find nearest slider --*/ y = ymargin + 10; for (k=0; kn - 1; k++) { x = xmargin + pct[k] * (w->allocation.width - 2*xmargin); d = (pos.x-x)*(pos.x-x) + (pos.y-y)*(pos.y-y); if (d < 100 && d < dist) { nearest = k; dist = d; } y += hgt; } *nearest_color = nearest; if (*nearest_color != -1) { gg->wvis.motion_notify_id = g_signal_connect (G_OBJECT (w), "motion_notify_event", G_CALLBACK(motion_notify_cb), (gpointer) gg); } return true; } static gint button_release_cb (GtkWidget *w, GdkEventButton *event, ggobid *gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (w)); GGobiData *d = NULL; gint selected_var = -1; if(tree_view) { d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); selected_var = get_one_selection_from_tree_view (tree_view, d); } if (gg->wvis.motion_notify_id) { g_signal_handler_disconnect (G_OBJECT (w), gg->wvis.motion_notify_id); gg->wvis.motion_notify_id = 0; } if (selected_var >= 0 && selected_var <= d->ncols) { record_colors_reset (selected_var, d, gg); clusters_set (d, gg); displays_plot (NULL, FULL, gg); } return true; } static gint da_configure_cb (GtkWidget *w, GdkEventConfigure *event, ggobid *gg) { /*-- Create new backing pixmaps of the appropriate size --*/ if (gg->wvis.pix != NULL) gdk_pixmap_unref (gg->wvis.pix); gg->wvis.pix = gdk_pixmap_new (w->window, w->allocation.width, w->allocation.height, -1); gtk_widget_queue_draw (w); return false; } /* * Set the bin boundaries (the values of wvis.pct[]) in one * of two ways: simply dividing the range of the data into * scheme->n equal-sized pieces, or attempting to set the regions * such that they contain equal numbers of points. */ static void bin_boundaries_set (gint selected_var, GGobiData *d, ggobid *gg) { gint k; if (gg->wvis.binning_method == WVIS_EQUAL_WIDTH_BINS || selected_var == -1) { /* * These numbers are the upper boundaries of each interval. * By default, they start at .1 and end at 1.0. */ for (k=0; kwvis.npct; k++) { gg->wvis.pct[k] = (gfloat) (k+1) / (gfloat) gg->wvis.npct; gg->wvis.n[k] = 0; } } else if (gg->wvis.binning_method == WVIS_EQUAL_COUNT_BINS) { gint i, m; gfloat min, max, range, midpt; vartabled *vt = vartable_element_get (selected_var, d); gint ngroups = gg->wvis.npct; gint groupsize = (gint) (d->nrows_in_plot / ngroups); paird *pairs = (paird *) g_malloc (d->nrows_in_plot * sizeof (paird)); guint varno = g_slist_index (d->vartable, vt); min = vt->lim_tform.min; max = vt->lim_tform.max; range = max - min; /*-- sort the selected variable --*/ for (i=0; inrows_in_plot; i++) { pairs[i].f = d->tform.vals[d->rows_in_plot.els[i]][varno]; pairs[i].indx = d->rows_in_plot.els[i]; } qsort ((gchar *) pairs, d->nrows_in_plot, sizeof (paird), pcompare); /* * determine the boundaries that will result in equal-sized * groups (as well as the data permits) * * This seems to do the right thing except in one case: the * variable is categorical with the number of categories less * than the number of groups, and the categories are not of * equal size. It does something legal, but not ideal, since * the number of groups it identifies may be too small. */ /*-- initialize the boundaries --*/ for (k=0; kwvis.pct[k] = 1.0; i = 0; for (k=0; knrows_in_plot-1) break; } midpt = (i == d->nrows_in_plot - 1) ? max : pairs[i].f + (pairs[i+1].f - pairs[i].f) / 2 ; gg->wvis.pct[k] = (midpt - min) / range; if (i == d->nrows_in_plot-1) break; } g_free (pairs); } } static void binning_method_cb (GtkWidget *w, ggobid *gg) { gboolean rval = false; gg->wvis.binning_method = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); gg->wvis.npct = 0; /*-- force bin_boundaries_set to be called --*/ g_signal_emit_by_name(G_OBJECT (gg->wvis.da), "expose_event", (gpointer) gg, (gpointer) &rval); } static void update_method_cb (GtkWidget *w, ggobid *gg) { gg->wvis.update_method = gtk_combo_box_get_active(GTK_COMBO_BOX(w)); } static void alloc_pct (ggobid *gg) { colorschemed *scheme = gg->activeColorScheme; if (gg->wvis.npct != scheme->n) { gg->wvis.npct = scheme->n; gg->wvis.pct = (gfloat *) g_realloc (gg->wvis.pct, gg->wvis.npct * sizeof (gfloat)); gg->wvis.n = (gint *) g_realloc (gg->wvis.n, gg->wvis.npct * sizeof (gint)); } } static void da_expose_cb (GtkWidget *w, GdkEventExpose *event, ggobid *gg) { gint height = w->allocation.height - 2*ymargin; gint x0, x1, k, hgt; gint x = xmargin; gint y = ymargin; gfloat diff; vartabled *vt; colorschemed *scheme = gg->activeColorScheme; GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (w)); GGobiData *d = NULL; gint selected_var = -1; GtkWidget *da = gg->wvis.da; GdkPixmap *pix = gg->wvis.pix; if(tree_view) { d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); selected_var = get_one_selection_from_tree_view (tree_view, d); if (selected_var == -1) { selected_var = 0; select_tree_view_row (tree_view, selected_var); } } if (gg->wvis.GC == NULL) gg->wvis.GC = gdk_gc_new (w->window); hgt = height / (scheme->n - 1); if (gg->wvis.npct != scheme->n) { gg->wvis.npct = scheme->n; gg->wvis.pct = (gfloat *) g_realloc (gg->wvis.pct, gg->wvis.npct * sizeof (gfloat)); gg->wvis.n = (gint *) g_realloc (gg->wvis.n, gg->wvis.npct * sizeof (gint)); bin_boundaries_set (selected_var, d, gg); bin_counts_reset (selected_var, d, gg); } /*-- clear the pixmap --*/ gdk_gc_set_foreground (gg->wvis.GC, &scheme->rgb_bg); gdk_draw_rectangle (pix, gg->wvis.GC, TRUE, 0, 0, w->allocation.width, w->allocation.height); /*-- draw the color bars --*/ x0 = xmargin; for (k=0; kn; k++) { x1 = xmargin + gg->wvis.pct[k] * (w->allocation.width - 2*xmargin); gdk_gc_set_foreground (gg->wvis.GC, &scheme->rgb[k]); gdk_draw_rectangle (pix, gg->wvis.GC, TRUE, x0, ymargin, x1 - x0, height); x0 = x1; } /*-- draw the horizontal lines --*/ x0 = xmargin; y = ymargin + 10; x1 = xmargin + (w->allocation.width - 2*xmargin) - 1; gdk_gc_set_foreground (gg->wvis.GC, &gg->mediumgray); for (k=0; kn-1; k++) { gdk_draw_line (pix, gg->wvis.GC, x0, y, x1, y); y += hgt; } /*-- draw rectangles, 20 x 10 --*/ y = ymargin + 10; for (k=0; kn-1; k++) { x = xmargin + gg->wvis.pct[k] * (w->allocation.width - 2*xmargin); draw_3drectangle (w, pix, x, y, 20, 10, gg); y += hgt; } /*-- add the variable limits in the top margin --*/ if (d && selected_var != -1) { gfloat min, max; gfloat val; gchar *str; PangoRectangle rect; PangoLayout *layout = gtk_widget_create_pango_layout(da, NULL); vt = vartable_element_get (selected_var, d); if (vt) { min = vt->lim_tform.min; max = vt->lim_tform.max; gdk_gc_set_foreground (gg->wvis.GC, &scheme->rgb_accent); y = ymargin; for (k=0; kn-1; k++) { val = min + gg->wvis.pct[k] * (max - min); str = g_strdup_printf ("%3.3g", val); layout_text(layout, str, &rect); x = xmargin + gg->wvis.pct[k] * (w->allocation.width - 2*xmargin); gdk_draw_layout(pix, gg->wvis.GC, x - rect.width/2, y - 2 - rect.height, layout); g_free (str); } /*-- ... and the counts in the bottom margin --*/ for (k=0; kn; k++) { val = min + gg->wvis.pct[k] * (max - min); str = g_strdup_printf ("%d", gg->wvis.n[k]); layout_text(layout, str, &rect); x = xmargin + gg->wvis.pct[k] * (w->allocation.width - 2*xmargin); diff = (k == 0) ? gg->wvis.pct[k] : gg->wvis.pct[k]-gg->wvis.pct[k-1]; x -= diff/2 * (w->allocation.width - 2*xmargin); gdk_draw_layout(pix, gg->wvis.GC, x - rect.width/2, (w->allocation.height - ymargin) + 2, layout); g_free (str); } } g_object_unref(G_OBJECT(layout)); } gdk_draw_pixmap (w->window, gg->wvis.GC, pix, 0, 0, 0, 0, w->allocation.width, w->allocation.height); } void selection_made_cb (GtkTreeSelection *tree_sel, ggobid *gg) { gboolean rval = false; GtkTreeView *tree_view = gtk_tree_selection_get_tree_view(tree_sel); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); GtkWidget *btn; gint row; row = tree_selection_get_selected_row(tree_sel); if (row == -1) return; bin_boundaries_set (row, d, gg); /*-- in case the method changed --*/ bin_counts_reset (row, d, gg); g_signal_emit_by_name(G_OBJECT (gg->wvis.da), "expose_event", (gpointer) gg, (gpointer) &rval); /*-- get the apply button, make it sensitive --*/ btn = widget_find_by_name (gg->wvis.window, "WVIS:apply"); if (btn) gtk_widget_set_sensitive (btn, true); } static void scale_apply_cb (GtkWidget *w, ggobid* gg) { GtkWidget *tree_view = get_tree_view_from_object (G_OBJECT (w)); GGobiData *d = (GGobiData *) g_object_get_data(G_OBJECT (tree_view), "datad"); gint selected_var = get_one_selection_from_tree_view (tree_view, d); colorschemed *scheme = gg->activeColorScheme; if (d && selected_var != -1) { gboolean rval = false; record_colors_reset (selected_var, d, gg); clusters_set (d, gg); /*-- before calling displays_plot, reset brushing color if needed --*/ if (gg->color_id >= scheme->n) gg->color_id = scheme->n - 1; displays_plot (NULL, FULL, gg); bin_counts_reset (selected_var, d, gg); g_signal_emit_by_name(G_OBJECT (gg->wvis.da), "expose_event", (gpointer) gg, (gpointer) &rval); symbol_window_redraw (gg); cluster_table_update (d, gg); } } void wvis_window_open (ggobid *gg) { GtkWidget *vbox, *hb; GtkWidget *notebook = NULL; GtkWidget *btn, *opt; static gchar *const binning_method_lbl[] = { "Constant bin width", "Constant bin count (approx)"}; static gchar *const update_method_lbl[] = { "Update on mouse release", "Update continuously"}; alloc_pct (gg); if (gg->wvis.window == NULL) { gg->wvis.window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gg->wvis.window), "Automatic Brushing by Variable"); g_signal_connect (G_OBJECT (gg->wvis.window), "delete_event", G_CALLBACK (close_wmgr_cb), gg); vbox = gtk_vbox_new (false, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_box_set_spacing (GTK_BOX(vbox), 5); gtk_container_add (GTK_CONTAINER (gg->wvis.window), vbox); /* Create a notebook, set the position of the tabs */ notebook = wvis_create_variable_notebook (vbox, GTK_SELECTION_SINGLE, G_CALLBACK(selection_made_cb), gg); gtk_widget_set_sensitive(notebook, true); /*-- now we get fancy: draw the scale, with glyphs and colors --*/ gg->wvis.da = gtk_drawing_area_new (); gtk_widget_set_double_buffered(gg->wvis.da, false); gtk_widget_set_size_request (GTK_WIDGET (gg->wvis.da), 400, 200); g_object_set_data(G_OBJECT (gg->wvis.da), "notebook", notebook); gtk_box_pack_start (GTK_BOX (vbox), gg->wvis.da, false, false, 0); g_signal_connect (G_OBJECT (gg->wvis.da), "configure_event", G_CALLBACK(da_configure_cb), (gpointer) gg); g_signal_connect (G_OBJECT (gg->wvis.da), "expose_event", G_CALLBACK(da_expose_cb), (gpointer) gg); g_signal_connect (G_OBJECT (gg->wvis.da), "button_press_event", G_CALLBACK(button_press_cb), (gpointer) gg); g_signal_connect (G_OBJECT (gg->wvis.da), "button_release_event", G_CALLBACK(button_release_cb), (gpointer) gg); gtk_widget_set_events (gg->wvis.da, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); /*-- hbox to hold the options --*/ hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 0); /*-- option menu for choosing the method of binning --*/ opt = gtk_combo_box_new_text (); gtk_widget_set_name (opt, "WVIS:binning_method"); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "Select a binning method", NULL); gtk_box_pack_start (GTK_BOX (hb), opt, false, false, 0); populate_combo_box (opt, (gchar**) binning_method_lbl, G_N_ELEMENTS(binning_method_lbl), G_CALLBACK(binning_method_cb), gg); /*-- option menu for choosing the method of updating --*/ /* This should be a checkbox, I think ... */ opt = gtk_combo_box_new_text (); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), opt, "How to update the displays in response to movements of the sliders", NULL); gtk_box_pack_start (GTK_BOX (hb), opt, true, true, 0); populate_combo_box (opt, (gchar**) update_method_lbl, G_N_ELEMENTS(update_method_lbl), G_CALLBACK(update_method_cb), gg); /*-- hbox for buttons --*/ gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new(), false, true, 2); hb = gtk_hbox_new (false, 2); gtk_box_pack_start (GTK_BOX (vbox), hb, false, false, 0); /* Apply button */ btn = gtk_button_new_from_stock (GTK_STOCK_APPLY); g_object_set_data(G_OBJECT (btn), "notebook", notebook); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Apply the color scale, using the values of the variable selected in the list above", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, true, 1); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (scale_apply_cb), gg); gtk_widget_set_name (btn, "WVIS:apply"); btn = gtk_button_new_from_stock (GTK_STOCK_CLOSE); gtk_tooltips_set_tip (GTK_TOOLTIPS (gg->tips), btn, "Close the window", NULL); gtk_box_pack_start (GTK_BOX (hb), btn, true, false, 2); g_signal_connect (G_OBJECT (btn), "clicked", G_CALLBACK (close_btn_cb), gg); } gtk_widget_show_all (gg->wvis.window); gdk_window_raise (gg->wvis.window->window); } ggobi-2.1.12/src/ggobi-intl.h0000644000175000017500000000130514651527764011360 #ifndef __GGOBI_INTL_H__ #define __GGOBI_INTL_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ #ifdef ENABLE_NLS #include #define _(String) dgettext(PACKAGE, String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define N_(String) (String) #define textdomain(String) (String) #define gettext(String) (String) #define dgettext(Domain,String) (String) #define dcgettext(Domain,String,Type) (String) #define bindtextdomain(Domain,Directory) (Domain) #define bind_textdomain_codeset(Domain,Codeset) (Codeset) #endif /* ENABLE_NLS */ #endif /* __GGOBI_INTL_H__ */ ggobi-2.1.12/src/.renderer-cairo.gob.stamp0000644000175000017500000000000014651530127013721 ggobi-2.1.12/src/color.c0000644000175000017500000003125714651527764010447 /*-- color.c --*/ /* * ggobi * Copyright (C) AT&T, Duncan Temple Lang, Dianne Cook 1999-2005 * * ggobi is free software; you may use, redistribute, and/or modify it * under the terms of the Eclipse Public License, which is distributed * with the source code and displayed on the ggobi web site, * www.ggobi.org. For more information, contact the authors: * * Deborah F. Swayne dfs@research.att.com * Di Cook dicook@iastate.edu * Duncan Temple Lang duncan@wald.ucdavis.edu * Andreas Buja andreas.buja@wharton.upenn.edu */ #include #ifdef USE_STRINGS_H #include #endif #include #include "vars.h" #include "externs.h" #include "colorscheme.h" void colorscheme_init (colorschemed * scheme) { gint i; gboolean writeable = false, best_match = true, *success; if (!scheme || scheme->n <= 0) { g_printerr ("unable to init colorscheme: ncolors=%d\n", scheme->n); return; } success = (gboolean *) g_malloc (scheme->n * sizeof (gboolean)); scheme->rgb = (GdkColor *) g_realloc (scheme->rgb, scheme->n * sizeof (GdkColor)); /* this may have already been done; is there harm in doing it again? */ for (i = 0; i < scheme->n; i++) { scheme->rgb[i].red = (guint16) (scheme->data[i][0] * 65535.0); scheme->rgb[i].green = (guint16) (scheme->data[i][1] * 65535.0); scheme->rgb[i].blue = (guint16) (scheme->data[i][2] * 65535.0); } gdk_colormap_alloc_colors (gdk_colormap_get_system (), scheme->rgb, scheme->n, writeable, best_match, success); /* * Success[i] should always be true, since I'm allowing best_match, * but this can't hurt. */ for (i = 0; i < scheme->n; i++) { if (!success[i]) { scheme->rgb[i].red = (guint16) 65535; scheme->rgb[i].green = (guint16) 65535; scheme->rgb[i].blue = (guint16) 65535; if (gdk_colormap_alloc_color (gdk_colormap_get_system (), &scheme->rgb[i], writeable, best_match) == false) { g_printerr ("Unable to allocate colors, not even white!\n"); exit (0); } } } /* * background color */ scheme->rgb_bg.red = (guint16) (scheme->bg[0] * 65535.0); scheme->rgb_bg.green = (guint16) (scheme->bg[1] * 65535.0); scheme->rgb_bg.blue = (guint16) (scheme->bg[2] * 65535.0); if (!gdk_colormap_alloc_color (gdk_colormap_get_system (), &scheme->rgb_bg, writeable, best_match)) g_printerr ("failure allocating background color\n"); /* * color for showing hidden points and edges to preserve context * in a few situations: when doing "un-hide" brushing and when showing * neighbors in the GraphAction plugin */ { gfloat red, green, blue; if (scheme->bg[0] + scheme->bg[1] + scheme->bg[2] > 1.5) { red = MAX (0.0, scheme->bg[0] - .3); green = MAX (0.0, scheme->bg[1] - .3); blue = MAX (0.0, scheme->bg[2] - .3); } else { red = MIN (1.0, scheme->bg[0] + .3); green = MIN (1.0, scheme->bg[1] + .3); blue = MIN (1.0, scheme->bg[2] + .3); } scheme->rgb_hidden.red = (guint16) (red * 65535.0); scheme->rgb_hidden.green = (guint16) (green * 65535.0); scheme->rgb_hidden.blue = (guint16) (blue * 65535.0); if (!gdk_colormap_alloc_color (gdk_colormap_get_system (), &scheme->rgb_hidden, writeable, best_match)) g_printerr ("failure allocating hidden color\n"); } /* * accent color: that is, the color that's used for * axes and labels, and not for brushing. */ scheme->rgb_accent.red = (guint16) (scheme->accent[0] * 65535.0); scheme->rgb_accent.green = (guint16) (scheme->accent[1] * 65535.0); scheme->rgb_accent.blue = (guint16) (scheme->accent[2] * 65535.0); if (!gdk_colormap_alloc_color (gdk_colormap_get_system (), &scheme->rgb_accent, writeable, best_match)) g_printerr ("failure allocating background color\n"); g_free (success); } /*-- If gg->colorSchemes == NULL, then provide one and make it active --*/ colorschemed * default_scheme_init () { gint i, k; /* * This section may be useful for debugging in case of * difficulties reading the colorscheme xml file. */ #ifdef SPECTRUM7 static gfloat data[7][3] = { {0.890, 0.196, 0.122}, {1.000, 0.549, 0.000}, {0.988, 0.839, 0.051}, {0.988, 0.988, 0.000}, {0.604, 0.824, 0.294}, {0.235, 0.690, 0.616}, {0.149, 0.482, 0.671} }; static gchar *colorNames[7] = { "Red", "Orange", "Gold", "Yellow", "Green Yellow", "Teal", "Blue" }; static gfloat bg[] = { 0.000, 0.000, 0.000 }; static gfloat accent[] = { 1.000, 1.000, 1.000 }; colorschemed *scheme = (colorschemed *) g_malloc (sizeof (colorschemed)); scheme->name = g_strdup ("Spectrum 7"); scheme->description = g_strdup ("From Cindy Brewer, a spectrum"); scheme->type = spectral; scheme->system = rgb; scheme->n = 7; scheme->rgb = NULL; scheme->criticalvalue = 0; /*-- unused --*/ #endif static gfloat data[][3] = { {1.0000, 1.0000, 0.2000}, {0.8941, 0.1020, 0.1098}, {0.2157, 0.4941, 0.7216}, {0.3020, 0.6863, 0.2902}, {1.0000, 0.4980, 0.0000}, {0.6510, 0.3373, 0.1569}, {0.9686, 0.5059, 0.7490}, {0.4980, 0.4980, 0.4980}, {0.5961, 0.3059, 0.6392} }; static gchar *colorNames[] = { "Yellow", "Orange", "Blue", "Green", "Orange", "Brown", "Pink", "Gray", "Purple" }; static gfloat bg[] = { 0.000, 0.000, 0.000 }; static gfloat accent[] = { 1.000, 1.000, 1.000 }; colorschemed *scheme = (colorschemed *) g_malloc (sizeof (colorschemed)); scheme->name = g_strdup ("Set1 9"); scheme->description = g_strdup ("From Cindy Brewer, one of the schemes in the ColorBrewer software"); scheme->type = qualitative; scheme->system = rgb; scheme->n = sizeof (data) / sizeof (data[0]); scheme->rgb = NULL; scheme->criticalvalue = 0; /*-- unused --*/ /*-- fill in the color names --*/ scheme->colorNames = g_array_new (false, false, sizeof (gchar *)); for (i = 0; i < scheme->n; i++) g_array_append_val (scheme->colorNames, colorNames[i]); /*-- allocate and populate data, bg, and accent --*/ scheme->data = (gfloat **) g_malloc (scheme->n * sizeof (gfloat *)); for (k = 0; k < scheme->n; k++) { scheme->data[k] = (gfloat *) g_malloc (3 * sizeof (gfloat)); for (i = 0; i < 3; i++) scheme->data[k][i] = data[k][i]; } scheme->bg = (gfloat *) g_malloc (3 * sizeof (gfloat)); for (i = 0; i < 3; i++) scheme->bg[i] = bg[i]; scheme->accent = (gfloat *) g_malloc (3 * sizeof (gfloat)); for (i = 0; i < 3; i++) scheme->accent[i] = accent[i]; colorscheme_init (scheme); return scheme; } /* API */ static guint m[MAXNCOLORS][3]; guint ** getColorTable (ggobid * gg) { gint k; colorschemed *scheme = gg->activeColorScheme; for (k = 0; k < MAXNCOLORS; k++) { m[k][0] = scheme->rgb[k].red; m[k][1] = scheme->rgb[k].green; m[k][2] = scheme->rgb[k].blue; } return (guint **) m; } /*-- initialize the tour manip colors and the shades of gray --*/ void special_colors_init (ggobid * gg) { GdkColormap *cmap = gdk_colormap_get_system (); gboolean writeable = false, best_match = true; /* * colors that show up in the variable circle panel */ gg->vcirc_manip_color.red = (guint16) 65535; gg->vcirc_manip_color.green = (guint16) 0; gg->vcirc_manip_color.blue = (guint16) 65535; if (!gdk_colormap_alloc_color (cmap, &gg->vcirc_manip_color, writeable, best_match)) g_printerr ("trouble allocating vcirc_manip_color\n"); gg->vcirc_freeze_color.red = (guint16) 0; gg->vcirc_freeze_color.green = (guint16) 64435; gg->vcirc_freeze_color.blue = (guint16) 0; if (!gdk_colormap_alloc_color (cmap, &gg->vcirc_freeze_color, writeable, best_match)) g_printerr ("trouble allocating vcirc_freeze_color\n"); gg->darkgray.red = gg->darkgray.blue = gg->darkgray.green = (guint16) (.3 * 65535.0); if (!gdk_colormap_alloc_color (cmap, &gg->darkgray, writeable, best_match)) g_printerr ("trouble allocating dark gray\n"); gg->mediumgray.red = gg->mediumgray.blue = gg->mediumgray.green = (guint16) (.5 * 65535.0); if (!gdk_colormap_alloc_color (cmap, &gg->mediumgray, writeable, best_match)) g_printerr ("trouble allocating medium gray\n"); gg->lightgray.red = gg->lightgray.blue = gg->lightgray.green = (guint16) (.7 * 65535.0); if (!gdk_colormap_alloc_color (cmap, &gg->lightgray, writeable, best_match)) g_printerr ("trouble allocating light gray\n"); } void init_plot_GC (GdkWindow * w, ggobid * gg) { colorschemed *scheme = gg->activeColorScheme; gg->plot_GC = gdk_gc_new (w); gdk_gc_set_foreground (gg->plot_GC, &scheme->rgb_accent); gdk_gc_set_background (gg->plot_GC, &scheme->rgb_bg); /* line_width, GdkLineStyle, GdkCapStyle, GdkJoinStyle */ gdk_gc_set_line_attributes (gg->plot_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); } void init_var_GCs (GtkWidget * w, ggobid * gg) { GdkWindow *window = w->window; GtkStyle *style = gtk_widget_get_style (w); GdkColor white, black, bg, *bblack; gdk_color_white (gdk_colormap_get_system (), &white); gdk_color_black (gdk_colormap_get_system (), &black); /* if(!sessionOptions->info->bgColor) { gdk_color_black (gdk_colormap_get_system (), &black); bblack = &black; } else bblack = sessionOptions->info->bgColor; */ gdk_color_black (gdk_colormap_get_system (), &black); bblack = &black; /* * the unselected variable GCs: thin lines */ gg->unselvarbg_GC = gdk_gc_new (window); bg = style->bg[GTK_STATE_NORMAL]; gdk_gc_set_foreground (gg->unselvarbg_GC, &bg); gg->unselvarfg_GC = gdk_gc_new (window); gdk_gc_set_line_attributes (gg->unselvarfg_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground (gg->unselvarfg_GC, bblack); /* * the selected variable GC: thick lines */ gg->selvarfg_GC = gdk_gc_new (window); gdk_gc_set_line_attributes (gg->selvarfg_GC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground (gg->selvarfg_GC, &black); gg->selvarbg_GC = gdk_gc_new (window); gdk_gc_set_foreground (gg->selvarbg_GC, &white); /* * the manip variable GCs: thin purple lines */ gg->manipvarfg_GC = gdk_gc_new (window); gdk_gc_set_line_attributes (gg->manipvarfg_GC, 0, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND); gdk_gc_set_foreground (gg->manipvarfg_GC, &gg->vcirc_manip_color); } gushort /*-- returns the maximum color id --*/ datad_colors_used_get (gint * ncolors_used, gushort * colors_used, GGobiData * d, ggobid * gg) { gboolean new_color; gint i, k, m, n; gushort colorid, maxcolorid = 0; gushort *tmp; if (d == NULL || d->nrows == 0) /**/ return -1; g_assert (d->color.nels == d->nrows); n = 0; /*-- *ncolors_used --*/ /* * Loop once through d->color[], collecting the colors currently * in use into the colors_used[] vector. */ for (i = 0; i < d->nrows_in_plot; i++) { m = d->rows_in_plot.els[i]; if (d->hidden_now.els[m]) { /*-- if it's hidden, we don't care --*/ new_color = false; } else { new_color = true; for (k = 0; k < n; k++) { if (colors_used[k] == d->color_now.els[m]) { new_color = false; break; } } } if (new_color) { colorid = d->color_now.els[m]; colors_used[n] = colorid; maxcolorid = MAX (colorid, maxcolorid); (n)++; } } /* Reorder the values in colors_used so that they are along * the order used in the color scheme. Hey, that's simply * a matter of putting them in numerical order. ... reverse * numerical order works better. */ qsort ((void *) colors_used, n, sizeof (gushort), scompare); tmp = (gushort *) g_malloc(n * sizeof(gushort)); for (i=0; icolor_id) { colors_used[k] = colors_used[n - 1]; colors_used[n - 1] = gg->color_id; break; } } /* insurance -- eg if using mono drawing on a color screen */ if (n == 0) { n = 1; colors_used[0] = d->color_now.els[0]; } *ncolors_used = n; return (maxcolorid); } ggobi-2.1.12/Makefile.in0000644000175000017500000010711114651530034010414 # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 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@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(dist_datafiles_DATA) \ $(dist_desktop_DATA) $(dist_icons_DATA) $(dist_share_DATA) \ $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = ggobi.pc ggobi-system.pc 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 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(datafilesdir)" \ "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(iconsdir)" \ "$(DESTDIR)$(sharedir)" "$(DESTDIR)$(ggobiconfdir)" \ "$(DESTDIR)$(pkgconfigdir)" DATA = $(dist_datafiles_DATA) $(dist_desktop_DATA) $(dist_icons_DATA) \ $(dist_share_DATA) $(ggobiconf_DATA) $(pkgconfig_DATA) 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) # 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)/ggobi-system.pc.in \ $(srcdir)/ggobi.pc.in $(top_srcdir)/config/compile \ $(top_srcdir)/config/config.guess \ $(top_srcdir)/config/config.rpath \ $(top_srcdir)/config/config.sub \ $(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \ $(top_srcdir)/config/missing \ $(top_srcdir)/config/mkinstalldirs ABOUT-NLS AUTHORS COPYING \ ChangeLog INSTALL NEWS README config/compile \ config/config.guess config/config.rpath config/config.sub \ config/install-sh config/ltmain.sh config/missing \ config/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip # 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 -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIBTEX = @BIBTEX@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GGOBI_RELEASE_DATE = @GGOBI_RELEASE_DATE@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOB2 = @GOB2@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MICRO_VERSION = @MICRO_VERSION@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PDFLATEX = @PDFLATEX@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PLUGIN_DIRS = @PLUGIN_DIRS@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SRC_DEBUG = @SRC_DEBUG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localedir_c = @localedir_c@ localedir_c_make = @localedir_c_make@ 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@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src plugins po doc EXTRA_DIST = bootstrap CPLicense.txt datafilesdir = $(pkgdatadir)/data dist_datafiles_DATA = \ data/places.xml \ data/sleep.csv \ data/tmin.xml \ data/Shipman.csv \ data/laser.csv \ data/prim7.xml \ data/sleep.xml \ data/tmin1.csv \ data/Shipman.xml \ data/laser.xml \ data/ratcns.csv \ data/snetwork.xml \ data/tmin1.xml \ data/adhoc.xml \ data/morsecodes.xml \ data/ratcns.xml \ data/stdColorMap.xml \ data/tmin2.xml \ data/algal-bloom.xml \ data/olive.csv \ data/river.xml \ data/tao-nomiss.xml \ data/tmin3.xml \ data/buckyball.xml \ data/olive.xml \ data/roos.csv \ data/tao.csv \ data/tmin4.xml \ data/cube6.xml \ data/perm4.xml \ data/roos.xml \ data/tao.xml \ data/eies.xml \ data/perm5.xml \ data/sarsHK.xml \ data/tips.csv \ data/flea.csv \ data/pigs.xml \ data/sat.csv \ data/tips.xml \ data/flea.xml \ data/places.csv \ data/sat.xml \ data/tmin.csv desktopdir = $(datadir)/applications dist_desktop_DATA = xdg/ggobi.desktop iconsdir = $(datadir)/pixmaps dist_icons_DATA = xdg/ggobi.png sharedir = $(pkgdatadir)/share dist_share_DATA = share/colorschemes.xml pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = ggobi-system.pc ggobiconfdir = $(sysconfdir)/xdg/ggobi ggobiconf_DATA = ggobirc DISTCHECK_CONFIGURE_FLAGS = --with-all-plugins all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(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: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): ggobi.pc: $(top_builddir)/config.status $(srcdir)/ggobi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ ggobi-system.pc: $(top_builddir)/config.status $(srcdir)/ggobi-system.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-dist_datafilesDATA: $(dist_datafiles_DATA) @$(NORMAL_INSTALL) @list='$(dist_datafiles_DATA)'; test -n "$(datafilesdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(datafilesdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(datafilesdir)" || 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)$(datafilesdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(datafilesdir)" || exit $$?; \ done uninstall-dist_datafilesDATA: @$(NORMAL_UNINSTALL) @list='$(dist_datafiles_DATA)'; test -n "$(datafilesdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(datafilesdir)'; $(am__uninstall_files_from_dir) install-dist_desktopDATA: $(dist_desktop_DATA) @$(NORMAL_INSTALL) @list='$(dist_desktop_DATA)'; test -n "$(desktopdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(desktopdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(desktopdir)" || 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)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-dist_desktopDATA: @$(NORMAL_UNINSTALL) @list='$(dist_desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(desktopdir)'; $(am__uninstall_files_from_dir) install-dist_iconsDATA: $(dist_icons_DATA) @$(NORMAL_INSTALL) @list='$(dist_icons_DATA)'; test -n "$(iconsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(iconsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(iconsdir)" || 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)$(iconsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(iconsdir)" || exit $$?; \ done uninstall-dist_iconsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_icons_DATA)'; test -n "$(iconsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(iconsdir)'; $(am__uninstall_files_from_dir) install-dist_shareDATA: $(dist_share_DATA) @$(NORMAL_INSTALL) @list='$(dist_share_DATA)'; test -n "$(sharedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sharedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sharedir)" || 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)$(sharedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(sharedir)" || exit $$?; \ done uninstall-dist_shareDATA: @$(NORMAL_UNINSTALL) @list='$(dist_share_DATA)'; test -n "$(sharedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(sharedir)'; $(am__uninstall_files_from_dir) install-ggobiconfDATA: $(ggobiconf_DATA) @$(NORMAL_INSTALL) @list='$(ggobiconf_DATA)'; test -n "$(ggobiconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(ggobiconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(ggobiconfdir)" || 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)$(ggobiconfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(ggobiconfdir)" || exit $$?; \ done uninstall-ggobiconfDATA: @$(NORMAL_UNINSTALL) @list='$(ggobiconf_DATA)'; test -n "$(ggobiconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(ggobiconfdir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || 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)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # 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) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -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 $(GZIP_ENV) -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 $(GZIP_ENV) -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 \ $(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 $(DATA) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(datafilesdir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(iconsdir)" "$(DESTDIR)$(sharedir)" "$(DESTDIR)$(ggobiconfdir)" "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_datafilesDATA install-dist_desktopDATA \ install-dist_iconsDATA install-dist_shareDATA \ install-ggobiconfDATA install-pkgconfigDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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 mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-dist_datafilesDATA uninstall-dist_desktopDATA \ uninstall-dist_iconsDATA uninstall-dist_shareDATA \ uninstall-ggobiconfDATA uninstall-local \ uninstall-pkgconfigDATA .MAKE: $(am__recursive_targets) install-am install-data-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip dist-zstd distcheck distclean \ distclean-generic distclean-libtool distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-hook install-dist_datafilesDATA \ install-dist_desktopDATA install-dist_iconsDATA \ install-dist_shareDATA install-dvi install-dvi-am install-exec \ install-exec-am install-ggobiconfDATA install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-dist_datafilesDATA \ uninstall-dist_desktopDATA uninstall-dist_iconsDATA \ uninstall-dist_shareDATA uninstall-ggobiconfDATA \ uninstall-local uninstall-pkgconfigDATA .PRECIOUS: Makefile install-data-hook: cd $(DESTDIR)$(pkgconfigdir) && test -f ggobi-system.pc && \ mv ggobi-system.pc ggobi.pc uninstall-local: rm -f $(DESTDIR)$(pkgconfigdir)/ggobi.pc # We add symlinks for developer convenience all-local: ggobi ggobirc ggobi: ln -s src/ggobi ggobi # Use this rule to build your ggobirc (for loading plugins) ggobirc: echo "" > $@ echo "" >> $@ for i in $(PLUGIN_DIRS) ; do \ echo "" >> $@ ; \ cat plugins/$$i/plugin.xml >> $@ ; \ done echo "" >> $@ echo "" >> $@ win32-installer: ggobirc makensis //DVERSION="@VERSION@" win32/ggobi.nsi # 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: ggobi-2.1.12/configure0000755000175000017500000230557414651530034010275 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for ggobi 2.1.12. # # 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 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: ggobi-help@lists.ggobi.org about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated SHELL=${CONFIG_SHELL-/bin/sh} 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='ggobi' PACKAGE_TARNAME='ggobi' PACKAGE_VERSION='2.1.12' PACKAGE_STRING='ggobi 2.1.12' PACKAGE_BUGREPORT='ggobi-help@lists.ggobi.org' PACKAGE_URL='' ac_unique_file="src/transform_ui.c" gt_needs= enable_option_checking=no # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS OS_WIN32_FALSE OS_WIN32_TRUE BIBTEX PDFLATEX LIBXML_LIBS LIBXML_CFLAGS GMODULE_LIBS GMODULE_CFLAGS GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG GOB2 SRC_DEBUG LIBOBJS INCINTL LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR FILECMD NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP LIBTOOL OBJDUMP DLLTOOL AS LN_S PLUGIN_DIRS subdirs MICRO_VERSION MINOR_VERSION MAJOR_VERSION GGOBI_RELEASE_DATE MKINSTALLDIRS localedir_c_make localedir_c POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS CPP host_os host_vendor host_cpu host build_os build_vendor build_cpu build 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 XGETTEXT_EXTRA_OPTIONS MSGMERGE_FOR_MSGFMT_OPTION MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS SED 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 ac_aux_dir 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_nls enable_dependency_tracking with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_debug with_all_plugins with_dataviewer with_describedisplay with_graphlayout with_ggvis with_graphaction with_varcloud with_plugins enable_static enable_shared with_pic enable_fast_install with_aix_soname with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP LT_SYS_LIBRARY_PATH PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS GMODULE_CFLAGS GMODULE_LIBS LIBXML_CFLAGS LIBXML_LIBS' ac_subdirs_all='plugins/DataViewer plugins/VarCloud plugins/ggvis plugins/GraphAction plugins/GraphLayout plugins/DescribeDisplay' # 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 ggobi 2.1.12 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/ggobi] --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 ggobi 2.1.12:";; 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") --disable-nls do not use Native Language Support --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-rpath do not hardcode runtime library paths --enable-debug Compile with debugging symbols --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --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-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-all-plugins Enable all (supported) plugins --with-dataviewer Enable plugin for viewing data in a datagrid. --with-describedisplay Convert GGobi plots to R plots. --with-graphlayout Enable GraphLayout plugin --with-ggvis Enable ggvis plugin --with-graphaction Enable graph operations plugin --with-varcloud Enable variogram cloud plugin --with-plugins With plugins in a quoted, space-separated list --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). 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 LT_SYS_LIBRARY_PATH User-defined run-time library search path. 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 GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GMODULE_CFLAGS C compiler flags for GMODULE, overriding pkg-config GMODULE_LIBS linker flags for GMODULE, overriding pkg-config LIBXML_CFLAGS C compiler flags for LIBXML, overriding pkg-config LIBXML_LIBS linker flags for LIBXML, 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 . _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 ggobi configure 2.1.12 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_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_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_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_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_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_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_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by ggobi $as_me 2.1.12, 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 gt_needs="$gt_needs " # 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" # Auxiliary files required by this configure script. ac_aux_files="ltmain.sh config.guess config.sub compile config.rpath missing install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/config" # 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 # Tell autoconf where our sources are # Setup the header where our checks will be made available to the source ac_config_headers="$ac_config_headers src/config.h" # We will store build scripts in the 'config' directory, since it is cleaner # Initialize automake am__api_version='1.16' # 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 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). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was 's,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`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 # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { 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; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='ggobi' VERSION='2.1.12' 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 # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Figure out where we are installing immediately if test "${prefix}" = "NONE"; then prefix=$ac_default_prefix fi # Remember where our GGobi data is installed GGOBI_DATADIR_TMP=`eval echo ${datadir}` GGOBI_DATADIR=`eval echo "${GGOBI_DATADIR_TMP}"` printf "%s\n" "#define GGOBI_DATADIR \"$GGOBI_DATADIR\"" >>confdefs.h # Initialize gettext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in #( *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_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" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "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_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { 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; } GETTEXT_MACRO_VERSION=0.20 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 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. ;; *) gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$gt_saved_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 echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 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="$gt_saved_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 case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 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. ;; *) gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$gt_saved_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 echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 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="$gt_saved_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 case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 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. ;; *) gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$gt_saved_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 echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$gt_saved_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 LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt' else if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet' else MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet' fi fi test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" 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_saved_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_saved_prefix" 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 thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi ;; 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 # 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 # 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 # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 if test -n "$LD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld" >&5 printf %s "checking for ld... " >&6; } elif test "$GCC" = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } 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 -n "$LD"; then # Let the user override the test with a path. : else if test ${acl_cv_path_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) acl_cv_path_LD= # Final result of this test ac_prog=ld # Program to search in $PATH if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. case $host in *-*-mingw* | windows*) # gcc leaves a trailing carriage return which upsets mingw acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) acl_output=`($CC -print-prog-name=ld) 2>&5` ;; esac case $acl_output in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` done # Got the pathname. No search in PATH is needed. acl_cv_path_LD="$acl_output" ac_prog= ;; "") # If it fails, then pretend we aren't using GCC. ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac fi if test -n "$ac_prog"; then # Search for $ac_prog in $PATH. acl_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_saved_IFS" 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 variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 conftest.$ac_ext /* end confdefs.h. */ #if defined __powerpc64__ || defined __LP64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : # The compiler produces 64-bit code. Add option '-b64' so that the # linker groks 64-bit object files. case "$acl_cv_path_LD " in *" -b64 "*) ;; *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; sparc64-*-netbsd*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __sparcv9 || defined __arch64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) # The compiler produces 32-bit code. Add option '-m elf32_sparc' # so that the linker groks 32-bit object files. case "$acl_cv_path_LD " in *" -m elf32_sparc "*) ;; *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;; esac ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac ;; esac fi LD="$acl_cv_path_LD" fi 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; } as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 fi { 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 lds 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" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5 printf %s "checking 32-bit host C ABI... " >&6; } if test ${gl_cv_host_cpu_c_abi_32bit+y} then : printf %s "(cached) " >&6 else case e in #( e) case "$host_cpu" in # CPUs that only support a 32-bit ABI. arc \ | bfin \ | cris* \ | csky \ | epiphany \ | ft32 \ | h8300 \ | m68k \ | microblaze | microblazeel \ | nds32 | nds32le | nds32be \ | nios2 | nios2eb | nios2el \ | or1k* \ | or32 \ | sh | sh1234 | sh1234elb \ | tic6x \ | xtensa* ) gl_cv_host_cpu_c_abi_32bit=yes ;; # CPUs that only support a 64-bit ABI. alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \ | mmix ) gl_cv_host_cpu_c_abi_32bit=no ;; *) if test -n "$gl_cv_host_cpu_c_abi"; then case "$gl_cv_host_cpu_c_abi" in i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc) gl_cv_host_cpu_c_abi_32bit=yes ;; x86_64 | alpha | arm64 | aarch64c | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 ) gl_cv_host_cpu_c_abi_32bit=no ;; *) gl_cv_host_cpu_c_abi_32bit=unknown ;; esac else gl_cv_host_cpu_c_abi_32bit=unknown fi if test $gl_cv_host_cpu_c_abi_32bit = unknown; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int test_pointer_size[sizeof (void *) - 5]; _ACEOF if ac_fn_c_try_compile "$LINENO" then : gl_cv_host_cpu_c_abi_32bit=no else case e in #( e) gl_cv_host_cpu_c_abi_32bit=yes ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5 printf "%s\n" "$gl_cv_host_cpu_c_abi_32bit" >&6; } HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit" 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 for ELF binary format" >&5 printf %s "checking for ELF binary format... " >&6; } if test ${gl_cv_elf+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __ELF__ || (defined __linux__ && defined __EDG__) Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "Extensible Linking Format" >/dev/null 2>&1 then : gl_cv_elf=yes else case e in #( e) gl_cv_elf=no ;; esac fi rm -rf conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5 printf "%s\n" "$gl_cv_elf" >&6; } if test $gl_cv_elf = yes; then # Extract the ELF class of a file (5th byte) in decimal. # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header if od -A x < /dev/null >/dev/null 2>/dev/null; then # Use POSIX od. func_elfclass () { od -A n -t d1 -j 4 -N 1 } else # Use BSD hexdump. func_elfclass () { dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "' echo } fi # Use 'expr', not 'test', to compare the values of func_elfclass, because on # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002, # not 1 or 2. case $HOST_CPU_C_ABI_32BIT in yes) # 32-bit ABI. acl_is_expected_elfclass () { expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null } ;; no) # 64-bit ABI. acl_is_expected_elfclass () { expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null } ;; *) # Unknown. acl_is_expected_elfclass () { : } ;; esac else acl_is_expected_elfclass () { : } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5 printf %s "checking for the common suffixes of directories in the library search path... " >&6; } if test ${acl_cv_libdirstems+y} then : printf %s "(cached) " >&6 else case e in #( e) acl_libdirstem=lib acl_libdirstem2= acl_libdirstem3= case "$host_os" in solaris*) if test $HOST_CPU_C_ABI_32BIT = no; then acl_libdirstem2=lib/64 case "$host_cpu" in sparc*) acl_libdirstem3=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem3=lib/amd64 ;; esac fi ;; netbsd*) if test $HOST_CPU_C_ABI_32BIT != no; then case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparc ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test $HOST_CPU_C_ABI_32BIT != no; then # 32-bit or unknown ABI. if test -d /usr/lib32; then acl_libdirstem2=lib32 fi fi if test $HOST_CPU_C_ABI_32BIT != yes; then # 64-bit or unknown ABI. if test -d /usr/lib64; then acl_libdirstem3=lib64 fi fi if test -n "$searchpath"; then acl_saved_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;; */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib32 ) acl_libdirstem2=lib32 ;; */lib64 ) acl_libdirstem3=lib64 ;; esac ;; esac fi done IFS="$acl_saved_IFS" if test $HOST_CPU_C_ABI_32BIT = yes; then # 32-bit ABI. acl_libdirstem3= fi if test $HOST_CPU_C_ABI_32BIT = no; then # 64-bit ABI. acl_libdirstem2= fi fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem" acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5 printf "%s\n" "$acl_cv_libdirstems" >&6; } acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'` acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'` acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'` use_additional=yes acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" additional_libdir2="$withval/$acl_libdirstem2" additional_libdir3="$withval/$acl_libdirstem3" fi fi fi if test "X$additional_libdir2" = "X$additional_libdir"; then additional_libdir2= fi if test "X$additional_libdir3" = "X$additional_libdir"; then additional_libdir3= fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= 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= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do if test "X$found_dir" = "X"; then eval dir=\$$additional_libdir_variable if test -n "$dir"; then if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi fi done fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" 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/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; 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 "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_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_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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 "$acl_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 */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem3 | */$acl_libdirstem3/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi 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* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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 saved_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$saved_libdir" for dep in $dependency_libs; do case "$dep" in -L*) dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then haveit= if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" if test "X$x" = "X-L$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$dependency_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" if test "X$x" = "X-L$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$dependency_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*) dep=`echo "X$dep" | sed -e 's/^X-l//'` if test "X$dep" != Xc \ || case $host_os in linux* | gnu* | k*bsd*-gnu) false ;; *) true ;; esac; then names_next_round="$names_next_round $dep" fi ;; *.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 "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_saved_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_saved_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_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 gl_sed_double_backslashes='s/\\/\\\\/g' gl_sed_escape_doublequotes='s/"/\\"/g' gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g" gl_sed_escape_for_make_2='s,\$,\\$$,g' case `echo r | tr -d '\r'` in '') gl_tr_cr='\015' ;; *) gl_tr_cr='\r' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 printf %s "checking for CFPreferencesCopyAppValue... " >&6; } if test ${gt_cv_func_CFPreferencesCopyAppValue+y} then : printf %s "(cached) " >&6 else case e in #( e) gt_saved_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gt_cv_func_CFPreferencesCopyAppValue=yes else case e in #( e) gt_cv_func_CFPreferencesCopyAppValue=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_saved_LIBS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 printf "%s\n" "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then printf "%s\n" "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyPreferredLanguages" >&5 printf %s "checking for CFLocaleCopyPreferredLanguages... " >&6; } if test ${gt_cv_func_CFLocaleCopyPreferredLanguages+y} then : printf %s "(cached) " >&6 else case e in #( e) gt_saved_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { CFLocaleCopyPreferredLanguages(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : gt_cv_func_CFLocaleCopyPreferredLanguages=yes else case e in #( e) gt_cv_func_CFLocaleCopyPreferredLanguages=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_saved_LIBS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyPreferredLanguages" >&5 printf "%s\n" "$gt_cv_func_CFLocaleCopyPreferredLanguages" >&6; } if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then printf "%s\n" "#define HAVE_CFLOCALECOPYPREFERREDLANGUAGES 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { 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 eval test \${$gt_func_gnugettext_libc+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main (void) { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$gt_func_gnugettext_libc=yes" else case e in #( e) eval "$gt_func_gnugettext_libc=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$gt_func_gnugettext_libc { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then gl_saved_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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 gl_saved_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="$gl_saved_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" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 printf %s "checking for working iconv... " >&6; } if test ${am_cv_func_iconv_works+y} then : printf %s "(cached) " >&6 else case e in #( e) gl_saved_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do if test "$cross_compiling" = yes then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif int main (void) { int result = 0; /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from successful returns. This is even documented in */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ { /* Try standardized names. */ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP"); /* Try IRIX, OSF/1 names. */ iconv_t cd2 = iconv_open ("UTF-8", "eucJP"); /* Try AIX names. */ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP"); /* Try HP-UX names. */ iconv_t cd4 = iconv_open ("utf8", "eucJP"); if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1) && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1)) result |= 16; if (cd1 != (iconv_t)(-1)) iconv_close (cd1); if (cd2 != (iconv_t)(-1)) iconv_close (cd2); if (cd3 != (iconv_t)(-1)) iconv_close (cd3); if (cd4 != (iconv_t)(-1)) iconv_close (cd4); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi test "$am_cv_func_iconv_works" = no || break done LIBS="$gl_saved_LIBS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 printf "%s\n" "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_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="$gl_saved_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" additional_libdir2="$withval/$acl_libdirstem2" additional_libdir3="$withval/$acl_libdirstem3" fi fi fi if test "X$additional_libdir2" = "X$additional_libdir"; then additional_libdir2= fi if test "X$additional_libdir3" = "X$additional_libdir"; then additional_libdir3= fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= 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= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do if test "X$found_dir" = "X"; then eval dir=\$$additional_libdir_variable if test -n "$dir"; then if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi fi done fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" 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/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; 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 "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_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_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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 "$acl_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 */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem3 | */$acl_libdirstem3/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi 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* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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 saved_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$saved_libdir" for dep in $dependency_libs; do case "$dep" in -L*) dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then haveit= if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" if test "X$x" = "X-L$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$dependency_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" if test "X$x" = "X-L$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$dependency_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*) dep=`echo "X$dep" | sed -e 's/^X-l//'` if test "X$dep" != Xc \ || case $host_os in linux* | gnu* | k*bsd*-gnu) false ;; *) true ;; esac; then names_next_round="$names_next_round $dep" fi ;; *.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 "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_saved_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_saved_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_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 eval test \${$gt_func_gnugettext_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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main (void) { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$gt_func_gnugettext_libintl=yes" else case e in #( e) eval "$gt_func_gnugettext_libintl=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext gt_LIBINTL_EXTRA="$INTL_MACOSX_LIBS" case "$host_os" in aix*) gt_LIBINTL_EXTRA="-lpthread" ;; esac if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } \ && { test -n "$LIBICONV" || test -n "$gt_LIBINTL_EXTRA"; }; then LIBS="$LIBS $LIBICONV $gt_LIBINTL_EXTRA" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main (void) { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : LIBINTL="$LIBINTL $LIBICONV $gt_LIBINTL_EXTRA" LTLIBINTL="$LTLIBINTL $LTLIBICONV $gt_LIBINTL_EXTRA" eval "$gt_func_gnugettext_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 eval ac_res=\$$gt_func_gnugettext_libintl { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools \ && test "$PACKAGE" != libintl; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi 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 { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "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 { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "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_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_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 INTLLIBS="$LIBINTL" gt_save_prefix="${prefix}" gt_save_datarootdir="${datarootdir}" gt_save_localedir="${localedir}" if test "X$prefix" = "XNONE"; then prefix="$ac_default_prefix" fi eval datarootdir="$datarootdir" eval localedir="$localedir" gl_final_localedir="$localedir" case "$build_os" in cygwin*) case "$host_os" in mingw* | windows*) gl_final_localedir=`cygpath -w "$gl_final_localedir"` ;; esac ;; esac localedir_c=`printf '%s\n' "$gl_final_localedir" | sed -e "$gl_sed_double_backslashes" -e "$gl_sed_escape_doublequotes" | tr -d "$gl_tr_cr"` localedir_c='"'"$localedir_c"'"' localedir_c_make=`printf '%s\n' "$localedir_c" | sed -e "$gl_sed_escape_for_make_1" -e "$gl_sed_escape_for_make_2" | tr -d "$gl_tr_cr"` if test "$localedir_c_make" = '\"'"${gl_final_localedir}"'\"'; then localedir_c_make='\"$(localedir)\"' fi localedir="${gt_save_localedir}" datarootdir="${gt_save_datarootdir}" prefix="${gt_save_prefix}" GGOBI_LOCALEDIR="${GGOBI_DATADIR}/locale" printf "%s\n" "#define GGOBI_LOCALEDIR \"$GGOBI_LOCALEDIR\"" >>confdefs.h # gettext needs MKINSTALLDIRS, but for some reason isn't getting it MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" MAJOR_VERSION=2 MINOR_VERSION=1 MICRO_VERSION=12 GGOBI_RELEASE_DATE="March 16 2015" printf "%s\n" "#define GGOBI_RELEASE_DATE \"${GGOBI_RELEASE_DATE}\"" >>confdefs.h printf "%s\n" "#define MAJOR_VERSION $MAJOR_VERSION" >>confdefs.h printf "%s\n" "#define MINOR_VERSION $MINOR_VERSION" >>confdefs.h printf "%s\n" "#define MICRO_VERSION $MICRO_VERSION" >>confdefs.h # Configure options (debug? local? any plugins?) # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; fi PLUGIN_DIRS="" # Check whether --with-all-plugins was given. if test ${with_all_plugins+y} then : withval=$with_all_plugins; fi #AC_ARG_WITH(mysql, # --with-mysql Enable plugin for reading data from MySQL databases, # MYSQL_PLUGIN=1; PLUGIN_DIRS="MySQL") #AC_ARG_WITH(postgres, # --with-postgres Enable plugin reading data from Postgres databases., # POSTGRES_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} Postgres") # Check whether --with-dataviewer was given. if test ${with_dataviewer+y} then : withval=$with_dataviewer; DATAVIEWER_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} DataViewer" fi # Check whether --with-describedisplay was given. if test ${with_describedisplay+y} then : withval=$with_describedisplay; DESCRIBEDISPLAY_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} DescribeDisplay" fi # Check whether --with-graphlayout was given. if test ${with_graphlayout+y} then : withval=$with_graphlayout; echo "With graphlayout"; GRAPHLAYOUT_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} GraphLayout" fi # Check whether --with-ggvis was given. if test ${with_ggvis+y} then : withval=$with_ggvis; GGVIS_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} ggvis" fi # Check whether --with-graphaction was given. if test ${with_graphaction+y} then : withval=$with_graphaction; GRAPHACTION_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} GraphAction" fi # Check whether --with-varcloud was given. if test ${with_varcloud+y} then : withval=$with_varcloud; VARCLOUD_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} VarCloud" fi # Check whether --with-plugins was given. if test ${with_plugins+y} then : withval=$with_plugins; fi if test "$with_plugins" != "" && test "$with_plugins" != "yes" && test "$with_plugins" != "y" && test "$with_plugins" != "no" && test "$with_plugins" != "n" ; then PLUGIN_DIRS=$with_plugins fi if test -n "${with_all_plugins}" && test "${with_all_plugins}" != "no" ; then PLUGIN_DIRS="DataViewer DescribeDisplay GraphLayout GraphAction VarCloud ggvis" fi # This is obviously ugly, but AC_CONFIG_SUBDIRS *requires* a literal for p in ${PLUGIN_DIRS} ; do if test "${p}" = "DataViewer"; then subdirs="$subdirs plugins/DataViewer" fi if test "${p}" = "VarCloud"; then subdirs="$subdirs plugins/VarCloud" fi if test "${p}" = "ggvis"; then subdirs="$subdirs plugins/ggvis" fi if test "${p}" = "GraphAction"; then subdirs="$subdirs plugins/GraphAction" fi if test "${p}" = "GraphLayout"; then subdirs="$subdirs plugins/GraphLayout" fi if test "${p}" = "DescribeDisplay"; then subdirs="$subdirs plugins/DescribeDisplay" fi done # Make sure we a C compiler and symbolic link capability 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 thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi ;; 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 whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; 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, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi # Set up libtool to create only dynamic libraries # and to support DLLs on Windows. # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) enable_static=no ;; esac fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; 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_AS+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AS"; then ac_cv_prog_AS="$AS" # 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_AS="${ac_tool_prefix}as" 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 AS=$ac_cv_prog_AS if test -n "$AS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 printf "%s\n" "$AS" >&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_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; 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_AS+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # 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_AS="as" 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_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 printf "%s\n" "$ac_ct_AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" 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 AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; 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_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_DLLTOOL="${ac_tool_prefix}dlltool" 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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&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_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; 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_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_DLLTOOL="dlltool" 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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" 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 DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; 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_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_OBJDUMP="${ac_tool_prefix}objdump" 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 OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&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_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; 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_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_OBJDUMP="objdump" 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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" 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 OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=yes case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.5.0.14-9a4a-dirty' macro_revision='2.5.0.14' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 printf "%s\n" "printf" >&6; } ;; print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 printf "%s\n" "print -r" >&6; } ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 printf "%s\n" "cat" >&6; } ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in #( *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_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" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "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_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { 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" { 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 fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else case e in #( e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_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 fgrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in #( *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "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_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else case e in #( e) with_gnu_ld=no ;; esac fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw* | *-*-windows*) # 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. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname 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 yes = "$with_gnu_ld"; 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 ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &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 ${lt_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 lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" 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_DUMPBIN+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # 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_DUMPBIN="$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 DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" 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_DUMPBIN+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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_DUMPBIN="$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_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" 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 DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else case e in #( e) i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | windows* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else case e in #( e) case $host in *-*-mingw* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 printf %s "checking how to convert $build file names to toolchain format... " >&6; } if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 else case e in #( e) #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* | *-*-windows* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ld_reload_flag='-r' ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac # Extract the first word of "file", so it can be a program name with args. set dummy file; 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_FILECMD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # 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_FILECMD="file" 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_prog_FILECMD" && ac_cv_prog_FILECMD=":" fi ;; esac fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 printf "%s\n" "$FILECMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; 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_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_OBJDUMP="${ac_tool_prefix}objdump" 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 OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&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_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; 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_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_OBJDUMP="objdump" 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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" 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 OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | windows* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | windows* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; 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_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_DLLTOOL="${ac_tool_prefix}dlltool" 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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&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_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; 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_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_DLLTOOL="dlltool" 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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" 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 DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar 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_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # 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_AR="$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 AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar 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_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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_AR="$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_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" 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 AR=$ac_ct_AR fi fi : ${AR=ar} # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because that's what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a 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: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi 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 test -z "$STRIP" && STRIP=: 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 test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 printf %s "checking command to parse $NM output from $compiler object... " >&6; } if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else case e in #( e) # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | windows* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BCDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw* | windows*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ;; esac fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test ${with_sysroot+y} then : withval=$with_sysroot; else case e in #( e) with_sysroot=no ;; esac fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then # Trim trailing / since we'll always append absolute paths and we want # to avoid //, if only for less confusing output for the user. lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 printf "%s\n" "${lt_sysroot:-no}" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else case e in #( e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_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 do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in dd do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else case e in #( e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test ${enable_libtool_lock+y} then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*|x86_64-gnu*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*|x86_64-gnu*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 else case e in #( e) 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes else case e in #( e) lt_cv_cc_needs_belf=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; 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_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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_MANIFEST_TOOL="${ac_tool_prefix}mt" 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 MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 printf "%s\n" "$MANIFEST_TOOL" >&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_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; 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_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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_MANIFEST_TOOL="mt" 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_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" 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 MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_manifest_tool+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_path_manifest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_manifest_tool=yes fi rm -f conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_manifest_tool" >&5 printf "%s\n" "$lt_cv_path_manifest_tool" >&6; } if test yes != "$lt_cv_path_manifest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; 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_DSYMUTIL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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_DSYMUTIL="${ac_tool_prefix}dsymutil" 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 DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 printf "%s\n" "$DSYMUTIL" >&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_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; 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_DSYMUTIL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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_DSYMUTIL="dsymutil" 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_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" 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 DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; 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_NMEDIT+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # 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_NMEDIT="${ac_tool_prefix}nmedit" 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 NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 printf "%s\n" "$NMEDIT" >&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_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; 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_NMEDIT+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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_NMEDIT="nmedit" 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_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 printf "%s\n" "$ac_ct_NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" 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 NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; 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_LIPO+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # 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_LIPO="${ac_tool_prefix}lipo" 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 LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 printf "%s\n" "$LIPO" >&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_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; 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_LIPO+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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_LIPO="lipo" 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_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" 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 LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; 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_OTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # 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_OTOOL="${ac_tool_prefix}otool" 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 OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 printf "%s\n" "$OTOOL" >&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_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; 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_OTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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_OTOOL="otool" 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_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 printf "%s\n" "$ac_ct_OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" 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 OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; 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_OTOOL64+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # 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_OTOOL64="${ac_tool_prefix}otool64" 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 OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 printf "%s\n" "$OTOOL64" >&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_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; 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_OTOOL64+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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_OTOOL64="otool64" 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_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 printf "%s\n" "$ac_ct_OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" 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 OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes else case e in #( e) lt_cv_ld_exported_symbols_list=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 $AR $AR_FLAGS libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[012],*|,*powerpc*-darwin[5-8]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } 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 ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes then : printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi # Set options # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) enable_shared=yes ;; esac fi # Check whether --with-pic was given. if test ${with_pic+y} then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) pic_mode=default ;; esac fi # Check whether --enable-fast-install was given. if test ${enable_fast_install+y} then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) enable_fast_install=yes ;; esac fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test ${with_aix_soname+y} then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else case e in #( e) if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_with_aix_soname=aix ;; esac fi with_aix_soname=$lt_cv_with_aix_soname ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else case e in #( e) rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else case e in #( e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else case e in #( e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; *flang) # Flang compiler. lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+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 if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+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 if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -Fe $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -Fe $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi 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 export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # 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*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else case e in #( e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes else case e in #( e) lt_cv_irix_exported_symbol=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 else case e in #( e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # -rpath works at least for libraries that are not overridden by # libraries installed in system locations. hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir ;; esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | windows* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (void); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else case e in #( e) ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else case e in #( e) lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; esac fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 shl_load (void); int main (void) { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes else case e in #( e) ac_cv_lib_dld_shl_load=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_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else case e in #( e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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 dlopen (void); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else case e in #( e) ac_cv_lib_dl_dlopen=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_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $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 dlopen (void); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes else case e in #( e) ac_cv_lib_svld_dlopen=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_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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 dld_link (void); int main (void) { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes else case e in #( e) ac_cv_lib_dld_dld_link=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_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 else case e in #( e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 printf %s "checking whether a statically linked program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 else case e in #( e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 printf %s "checking whether stripping libraries is possible... " >&6; } if test -z "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { 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; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi fi # Report what library types will actually be built { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$enable_static" >&6; } 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 CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: # Configure for building against local libintl # Check for questionable functions (kind of paranoid) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 printf %s "checking for GNU libc compatible malloc... " >&6; } if test ${ac_cv_func_malloc_0_nonnull+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. *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ | hpux* | solaris* | cygwin* | mingw* | windows* | msys* ) ac_cv_func_malloc_0_nonnull=yes ;; # If we don't know, assume the worst. *) ac_cv_func_malloc_0_nonnull=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { void *p = malloc (0); int result = !p; free (p); return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_malloc_0_nonnull=yes else case e in #( e) ac_cv_func_malloc_0_nonnull=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_malloc_0_nonnull" >&5 printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes then : printf "%s\n" "#define HAVE_MALLOC 1" >>confdefs.h else case e in #( e) printf "%s\n" "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac printf "%s\n" "#define malloc rpl_malloc" >>confdefs.h ;; esac fi ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" if test "x$ac_cv_func_pow" = xyes then : printf "%s\n" "#define HAVE_POW 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "sqrt" "ac_cv_func_sqrt" if test "x$ac_cv_func_sqrt" = xyes then : printf "%s\n" "#define HAVE_SQRT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strchr" "ac_cv_func_strchr" if test "x$ac_cv_func_strchr" = xyes then : printf "%s\n" "#define HAVE_STRCHR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strrchr" "ac_cv_func_strrchr" if test "x$ac_cv_func_strrchr" = xyes then : printf "%s\n" "#define HAVE_STRRCHR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strstr" "ac_cv_func_strstr" if test "x$ac_cv_func_strstr" = xyes then : printf "%s\n" "#define HAVE_STRSTR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset" if test "x$ac_cv_func_memset" = xyes then : printf "%s\n" "#define HAVE_MEMSET 1" >>confdefs.h fi # Check for some non-standard header files # 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 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" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" if test "x$ac_cv_header_strings_h" = xyes then : printf "%s\n" "#define HAVE_STRINGS_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 # Make sure our compiler doesn't suck { 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 ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes then : printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99 or later" >&5 printf %s "checking for stdbool.h that conforms to C99 or later... " >&6; } if test ${ac_cv_header_stdbool_h+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* "true" and "false" should be usable in #if expressions and integer constant expressions, and "bool" should be a valid type name. Although C99 requires bool, true, and false to be macros, C23 and C++11 overrule that, so do not test for that. Although C99 requires __bool_true_false_are_defined and _Bool, C23 says they are obsolescent, so do not require them. */ #if !true #error "'true' is not true" #endif #if true != 1 #error "'true' is not equal to 1" #endif char b[true == 1 ? 1 : -1]; char c[true]; #if false #error "'false' is not false" #endif #if false != 0 #error "'false' is not equal to 0" #endif char d[false == 0 ? 1 : -1]; enum { e = false, f = true, g = false * true, h = true * 256 }; char i[(bool) 0.5 == true ? 1 : -1]; char j[(bool) 0.0 == false ? 1 : -1]; char k[sizeof (bool) > 0 ? 1 : -1]; struct sb { bool s: 1; bool t; } s; char l[sizeof s.t > 0 ? 1 : -1]; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ bool m[h]; char n[sizeof m == h * sizeof m[0] ? 1 : -1]; char o[-1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html */ bool p = true; bool *pp = &p; int main (void) { bool ps = &s; *pp |= p; *pp |= ! p; /* Refer to every declared value, so they cannot be discarded as unused. */ return (!b + !c + !d + !e + !f + !g + !h + !i + !j + !k + !l + !m + !n + !o + !p + !pp + !ps); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_header_stdbool_h=yes else case e in #( e) ac_cv_header_stdbool_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: $ac_cv_header_stdbool_h" >&5 printf "%s\n" "$ac_cv_header_stdbool_h" >&6; } if test $ac_cv_header_stdbool_h = yes; then printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h fi # Debug? if test -n "${enable_debug}" && ! test "${enable_debug}" = "no" ; then SRC_DEBUG="-g -Wall" fi # Find GOB2 (don't fail if not found, not necessary for distributed builds) # Extract the first word of "gob2", so it can be a program name with args. set dummy gob2; 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_GOB2+y} then : printf %s "(cached) " >&6 else case e in #( e) case $GOB2 in [\\/]* | ?:[\\/]*) ac_cv_path_GOB2="$GOB2" # 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_GOB2="$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 GOB2=$ac_cv_path_GOB2 if test -n "$GOB2"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GOB2" >&5 printf "%s\n" "$GOB2" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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.20 { 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 # FIND GTK2 echo "Looking for gtk2" pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gtk+-2.0 >= 2.6.0" >&5 printf %s "checking for gtk+-2.0 >= 2.6.0... " >&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+-2.0 >= 2.6.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0") 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+-2.0 >= 2.6.0" 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+-2.0 >= 2.6.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.6.0") 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+-2.0 >= 2.6.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 GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.6.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.6.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtk+-2.0 >= 2.6.0) were not met: $GTK_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 GTK_CFLAGS and GTK_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 GTK_CFLAGS and GTK_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 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; } fi echo "Setting gtk flags: cflags=$GTK_CFLAGS, libs=$GTK_LIBS" pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gmodule-2.0" >&5 printf %s "checking for gmodule-2.0... " >&6; } if test -n "$GMODULE_CFLAGS"; then pkg_cv_GMODULE_CFLAGS="$GMODULE_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 \"gmodule-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GMODULE_CFLAGS=`$PKG_CONFIG --cflags "gmodule-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GMODULE_LIBS"; then pkg_cv_GMODULE_LIBS="$GMODULE_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 \"gmodule-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gmodule-2.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GMODULE_LIBS=`$PKG_CONFIG --libs "gmodule-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 GMODULE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gmodule-2.0" 2>&1` else GMODULE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gmodule-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GMODULE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gmodule-2.0) were not met: $GMODULE_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 GMODULE_CFLAGS and GMODULE_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 GMODULE_CFLAGS and GMODULE_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 GMODULE_CFLAGS=$pkg_cv_GMODULE_CFLAGS GMODULE_LIBS=$pkg_cv_GMODULE_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml-2.0" >&5 printf %s "checking for libxml-2.0... " >&6; } if test -n "$LIBXML_CFLAGS"; then pkg_cv_LIBXML_CFLAGS="$LIBXML_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 \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBXML_LIBS"; then pkg_cv_LIBXML_LIBS="$LIBXML_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 \"libxml-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libxml-2.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBXML_LIBS=`$PKG_CONFIG --libs "libxml-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 LIBXML_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libxml-2.0" 2>&1` else LIBXML_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libxml-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBXML_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libxml-2.0) were not met: $LIBXML_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 LIBXML_CFLAGS and LIBXML_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 LIBXML_CFLAGS and LIBXML_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 LIBXML_CFLAGS=$pkg_cv_LIBXML_CFLAGS LIBXML_LIBS=$pkg_cv_LIBXML_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi # Find pdflatex and bibtex for building the manual for ac_prog in ${PDFLATEX} pdflatex 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_path_PDFLATEX+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PDFLATEX in [\\/]* | ?:[\\/]*) ac_cv_path_PDFLATEX="$PDFLATEX" # 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_PDFLATEX="$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 PDFLATEX=$ac_cv_path_PDFLATEX if test -n "$PDFLATEX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5 printf "%s\n" "$PDFLATEX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PDFLATEX" && break done test -n "$PDFLATEX" || PDFLATEX="false" for ac_prog in ${BIBTEX} bibtex 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_path_BIBTEX+y} then : printf %s "(cached) " >&6 else case e in #( e) case $BIBTEX in [\\/]* | ?:[\\/]*) ac_cv_path_BIBTEX="$BIBTEX" # 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_BIBTEX="$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 BIBTEX=$ac_cv_path_BIBTEX if test -n "$BIBTEX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BIBTEX" >&5 printf "%s\n" "$BIBTEX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$BIBTEX" && break done test -n "$BIBTEX" || BIBTEX="false" # Are we on Windows? { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for native Win32" >&5 printf %s "checking for native Win32... " >&6; } case "$host" in *-*-mingw*) os_win32=yes ;; *) os_win32=no ;; esac echo "${os_win32}" if test "$os_win32" = "yes"; then OS_WIN32_TRUE= OS_WIN32_FALSE='#' else OS_WIN32_TRUE='#' OS_WIN32_FALSE= fi ac_config_files="$ac_config_files Makefile src/Makefile plugins/Makefile ggobi.pc ggobi-system.pc po/Makefile.in doc/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { 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; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then as_fn_error $? "conditional \"OS_WIN32\" 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 ggobi $as_me 2.1.12, 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 ." _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="\\ ggobi config.status 2.1.12 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 # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. OBSOLETE_ALL_LINGUAS="$ALL_LINGUAS" # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _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 "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;; "ggobi.pc") CONFIG_FILES="$CONFIG_FILES ggobi.pc" ;; "ggobi-system.pc") CONFIG_FILES="$CONFIG_FILES ggobi-system.pc" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers 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 "po-directories":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 # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. 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" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/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" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. 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" | "$presentlang"_* | "$presentlang".* | "$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 ;; "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 } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 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. # GNU Libtool is free software; you can 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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 . # The names of the tagged configurations supported by this script. available_tags='' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Whether or not to build static libraries. build_old_libs=$enable_static # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # A file(cmd) program that detects file types. FILECMD=$lt_FILECMD # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive (by configure). lt_ar_flags=$lt_ar_flags # Flags to create an archive. AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e. impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; 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 # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -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=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 printf "%s\n" "$ac_msg" >&6 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 cd "$ac_dir" # 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 ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "*******************************" echo "" echo "GGobi" echo " Plugins: ${PLUGIN_DIRS}" echo " Installation directory: $prefix" echo "" echo "*******************************" ggobi-2.1.12/xdg/0000755000175000017500000000000014651542215007214 5ggobi-2.1.12/xdg/ggobi.desktop0000644000175000017500000000044514651527764011635 [Desktop Entry] Version=1.0 Type=Application Name=GGobi GenericName=Data Analysis Tool Comment=Multivariate interactive graphics for exploratory data analysis TryExec=ggobi Exec=ggobi Icon=ggobi.png Categories=Graphics;2DGraphics MimeType=text/comma-separated-values;text/csv;application/csv; ggobi-2.1.12/xdg/ggobi.png0000644000175000017500000000164414651527764010752 PNG  IHDR@@iqbKGDԂ pHYsHHFk> vpAg@@`/IDATxZa Fxn qVKB?̶/mjr$Gو `:5"<>~v%5ӣcR:0EF䤀(bed'Zg)8FrSWgs3_pC2:7 +ZsG߅LNՎY%V[|1$ CyOIr}vžb戭 A graph of the first 249 SARS infections in Hong Kong. The data is taken from the New York Times on April 1. China Hong Kong VietNam Singapore Canada United States Ireland Germany Thailand China Hong Kong VietNam Singapore Canada United States Ireland Germany Thailand 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 4 2 4 2 4 2 7 2 5 2 5 2 6 2 6 2 6 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 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 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 6 6 8 6 8 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 9 ggobi-2.1.12/data/olive.xml0000644000175000017500000014337514651527764011154 This is XML created by GGobi South Sardinia North North-Apulia Calabria South-Apulia Sicily Inland-Sardinia Coast-Sardinia East-Liguria West-Liguria Umbria 1 1 1075 75 226 7823 672 36 60 29 1 1 1088 73 224 7709 781 31 61 29 1 1 911 54 246 8113 549 31 63 29 1 1 966 57 240 7952 619 50 78 35 1 1 1051 67 259 7771 672 50 80 46 1 1 911 49 268 7924 678 51 70 44 1 1 922 66 264 7990 618 49 56 29 1 1 1100 61 235 7728 734 39 64 35 1 1 1082 60 239 7745 709 46 83 33 1 1 1037 55 213 7944 633 26 52 30 1 1 1051 35 219 7978 605 21 65 24 1 1 1036 59 235 7868 661 30 62 44 1 1 1074 70 214 7728 747 50 79 33 1 1 875 52 243 8018 655 41 79 32 1 1 952 49 254 7795 780 50 75 41 1 1 1155 98 201 7606 816 32 60 29 1 1 943 94 183 7840 788 42 75 31 1 1 1278 69 205 7344 957 45 70 28 1 1 961 70 195 7958 742 46 75 30 1 1 952 77 258 7820 736 43 78 33 1 1 1074 67 236 7692 716 56 83 45 1 1 995 46 288 7806 679 56 86 40 1 1 1056 53 247 7703 700 54 89 51 1 1 1065 39 234 7876 703 42 74 26 1 1 1065 45 245 7779 696 47 82 38 1 2 1315 139 230 7299 832 42 60 32 1 2 1321 136 217 7174 950 43 63 30 1 2 1359 115 246 7234 874 45 63 18 1 2 1378 111 272 7127 940 46 64 23 1 2 1295 109 245 7253 903 43 62 38 1 2 1275 121 215 7285 892 40 68 41 1 2 1336 120 318 7083 915 50 70 38 1 2 1309 122 241 7257 870 46 72 35 1 2 1340 114 189 7337 820 48 72 21 1 2 1299 116 253 7309 823 40 69 27 1 2 1221 107 221 7441 798 54 70 28 1 2 1245 72 283 7395 829 44 67 28 1 2 1285 129 244 7323 819 57 65 36 1 2 1248 107 313 7299 840 46 66 33 1 2 1356 106 236 7209 866 48 75 36 1 2 1260 102 228 7354 870 49 64 28 1 2 1261 121 312 7238 877 47 65 25 1 2 1304 124 279 7160 928 48 61 37 1 2 1344 117 287 7129 897 51 65 41 1 2 1323 96 300 7351 757 47 54 26 1 2 1292 117 215 7351 839 48 61 32 1 2 1254 118 244 7394 786 46 71 24 1 2 1312 131 259 7167 939 41 69 20 1 2 1213 109 301 7261 925 47 65 31 1 2 1359 98 351 7262 780 41 56 16 1 2 1266 97 263 7435 743 45 69 29 1 2 1298 99 311 7311 787 45 67 23 1 2 1272 116 279 7258 872 43 72 27 1 2 1278 87 332 7379 771 44 53 24 1 2 1184 112 311 7391 819 48 57 28 1 2 1382 110 268 7241 828 39 60 30 1 2 1183 146 292 7580 618 38 51 23 1 2 1261 153 219 7355 818 52 70 26 1 2 1198 136 239 7639 633 27 55 19 1 2 1225 134 232 7658 616 36 49 26 1 2 1339 166 208 7190 923 40 69 25 1 2 1132 157 240 7641 638 45 60 31 1 2 1381 183 245 7385 609 47 70 25 1 2 1409 128 257 7257 759 43 57 16 1 2 1306 127 250 7254 869 47 68 24 1 2 1372 120 250 7355 702 44 68 28 1 2 1336 113 242 7293 855 38 60 18 1 2 1401 151 238 7164 857 45 72 36 1 2 1390 119 234 7236 823 40 62 41 1 2 1432 152 281 7029 949 39 55 25 1 2 1412 124 298 7182 790 45 68 28 1 2 1366 147 291 7197 783 51 70 34 1 2 1383 118 273 7282 738 45 68 29 1 2 1283 102 263 7400 763 54 65 28 1 2 1296 136 260 7380 780 48 51 18 1 2 1287 108 287 7343 826 44 44 23 1 2 1351 159 296 7229 810 36 60 22 1 2 1241 97 268 7499 709 52 69 36 1 2 1267 101 300 7230 898 74 65 34 1 2 1235 138 252 7322 861 54 66 36 1 2 1255 103 223 7395 848 47 56 30 1 3 1454 183 196 7057 1014 27 46 19 1 3 1347 194 197 7277 895 25 46 15 1 3 1364 204 225 6929 1084 21 50 14 1 3 1410 199 216 7130 955 21 48 19 1 3 1384 178 208 7105 999 29 67 26 1 3 1412 185 217 6842 1203 34 72 32 1 3 1410 232 280 6715 1233 32 60 24 1 3 1509 209 257 6647 1240 42 62 30 1 3 1317 197 256 7036 1067 40 60 22 1 3 1286 192 203 7132 1053 38 65 28 1 3 1273 191 202 6862 1303 43 70 28 1 3 1463 183 183 6747 1307 36 60 24 1 3 1399 187 191 6861 1233 38 60 17 1 3 1413 193 208 6875 1202 30 60 18 1 3 1369 206 203 6953 1168 35 50 16 1 3 1488 172 170 6920 1144 37 54 14 1 3 1323 160 205 6911 1298 24 50 17 1 3 1311 166 170 6902 1312 41 69 28 1 3 1286 163 183 7040 1230 29 57 12 1 3 1380 173 188 7038 1139 31 44 14 1 3 1394 164 223 7086 1042 24 43 23 1 3 1324 174 198 6863 1289 36 70 21 1 3 1290 157 192 7000 1263 26 51 19 1 3 1361 163 196 6888 1273 37 58 24 1 3 1387 182 242 6913 1101 44 68 30 1 3 1369 180 181 7000 1130 39 45 24 1 3 1303 165 175 7025 1243 31 41 16 1 3 1346 160 169 7072 1151 39 48 15 1 3 1369 171 184 6937 1246 30 48 15 1 3 1305 172 169 7004 1260 28 50 11 1 3 1351 179 186 6935 1243 36 50 19 1 3 1283 151 182 7000 1271 40 52 21 1 3 1449 175 198 6883 1162 40 70 22 1 3 1310 180 183 7054 1202 26 32 12 1 3 1360 163 176 6901 1280 28 65 27 1 3 1300 187 196 6920 1253 41 76 25 1 3 1368 171 218 7010 1057 41 54 26 1 3 1207 151 156 7159 1234 27 51 14 1 3 1348 154 183 6917 1277 48 56 16 1 3 1334 186 229 7261 827 34 56 20 1 3 1301 156 207 7003 1229 41 48 14 1 3 1226 181 213 6961 1230 47 74 26 1 3 1201 168 190 7100 1216 43 64 16 1 3 1297 153 177 7004 1260 35 60 16 1 3 1248 163 158 7103 1222 31 60 14 1 3 1335 159 197 6974 1220 36 60 17 1 3 1219 167 171 7087 1254 35 50 16 1 3 1318 179 177 7030 1194 35 42 25 1 3 1264 167 166 7130 1187 22 52 12 1 3 1201 175 201 7129 1193 36 49 15 1 3 1252 180 181 7055 1214 31 59 38 1 3 1273 182 209 6965 1191 43 74 23 1 3 1351 179 170 7034 1154 35 66 10 1 3 1336 155 212 7103 1086 33 55 20 1 3 1499 201 182 6803 1204 30 56 24 1 3 1425 198 193 7032 1041 31 52 17 1 3 1358 204 227 6962 1109 41 65 34 1 3 1346 181 257 7147 933 40 60 36 1 3 1392 186 256 6732 1278 53 64 29 1 3 1311 166 222 7006 1147 41 80 27 1 3 1314 171 229 6923 1198 47 76 42 1 3 1409 200 207 6842 1224 31 60 27 1 3 1342 174 221 6993 1147 36 64 23 1 3 1387 182 206 7100 1020 34 54 17 1 3 1413 202 205 6920 1165 36 46 13 1 3 1430 209 225 6800 1200 32 59 27 1 3 1336 185 223 6956 1155 56 73 16 1 3 1372 200 200 6916 1189 33 50 22 1 3 1330 157 228 7055 1108 42 55 25 1 3 1412 207 208 6822 1239 36 51 28 1 3 1321 209 217 6948 1178 42 62 23 1 3 1401 200 217 6980 1073 40 68 21 1 3 1401 214 217 6734 1293 44 69 27 1 3 1457 168 242 6724 1266 54 59 30 1 3 1451 199 221 6835 1177 37 51 29 1 3 1438 206 248 6806 1183 34 57 28 1 3 1462 204 237 6644 1309 42 54 28 1 3 1529 215 203 6602 1310 45 69 27 1 3 1510 189 245 6752 1188 36 52 28 1 3 1437 222 184 6803 1240 43 56 16 1 3 1327 129 247 7024 1157 38 56 22 1 3 1438 172 252 6630 1380 40 64 24 1 3 1447 176 189 6849 1180 42 64 26 1 3 1355 144 214 6972 1198 33 60 24 1 3 1369 156 241 6890 1209 42 63 30 1 3 1471 188 276 6697 1269 34 51 16 1 3 1456 179 240 6738 1267 41 65 14 1 3 1314 140 207 7020 1220 28 59 12 1 3 1408 176 192 6909 1195 45 50 25 1 3 1397 172 191 7107 1018 36 50 29 1 3 1413 191 186 6937 1180 31 46 13 1 3 1539 194 213 6764 1178 38 58 16 1 3 1304 159 234 7019 1174 38 53 19 1 3 1341 160 231 7033 1069 40 67 33 1 3 1508 208 249 6641 1311 25 43 20 1 3 1515 226 257 6595 1287 41 63 16 1 3 1262 165 235 7120 1113 32 51 21 1 3 1307 197 238 7003 1144 37 50 24 1 3 1294 159 253 7009 1190 30 52 13 1 3 1460 187 215 6843 1172 35 56 32 1 3 1476 187 203 6837 1197 36 48 22 1 3 1482 178 197 6814 1201 40 64 24 1 3 1388 176 185 7008 1111 48 53 31 1 3 1367 172 235 7066 1054 35 45 26 1 3 1272 207 205 7152 1098 37 52 22 1 3 1323 157 234 7132 1022 38 58 31 1 3 1206 218 242 7193 1002 37 54 25 1 3 1383 157 217 7018 1090 40 60 37 1 3 1521 190 238 6956 986 36 50 23 1 3 1350 168 227 6986 1165 29 58 17 1 3 1422 181 218 6813 1230 30 59 21 1 3 1298 166 224 6986 1162 34 65 31 1 3 1447 236 245 6607 1336 33 51 21 1 3 1347 197 211 6795 1300 32 59 34 1 3 1339 170 253 6989 1110 29 63 23 1 3 1388 183 216 6867 1208 28 61 21 1 3 1527 260 232 6488 1370 31 45 20 1 3 1495 237 236 6571 1318 32 58 26 1 3 1487 246 251 6504 1390 29 53 19 1 3 1399 180 232 6855 1190 32 66 22 1 3 1489 215 242 6777 1145 30 60 22 1 3 1339 166 226 6928 1198 30 60 23 1 3 1482 246 238 6444 1462 27 50 20 1 3 1434 172 255 6646 1354 27 59 25 1 3 1347 156 214 6850 1313 25 48 19 1 3 1340 158 233 6848 1272 32 63 25 1 3 1453 180 244 6752 1238 34 54 23 1 3 1306 149 226 7082 1097 33 61 24 1 3 1349 161 217 6997 1138 31 62 23 1 3 1254 151 205 7319 947 28 54 23 1 3 1168 144 220 7230 1109 31 52 28 1 3 1346 167 224 6959 1111 30 49 23 1 3 1390 184 212 6898 1189 29 44 19 1 3 1283 149 224 7077 1104 30 57 32 1 3 1214 137 232 7269 1005 32 55 23 1 3 1491 227 205 6941 988 33 68 34 1 3 1479 218 207 7039 887 36 65 36 1 3 1445 174 228 6875 1123 29 69 31 1 3 1439 183 218 6775 1226 32 66 29 1 3 1387 154 204 6991 1090 34 74 32 1 3 1426 169 192 7025 1043 31 64 27 1 3 1451 200 208 6980 1006 30 62 31 1 3 1493 204 188 6913 1044 32 61 35 1 3 1419 192 207 6996 1014 36 70 36 1 3 1342 177 199 7172 952 34 65 33 1 3 1349 152 236 7145 949 35 75 29 1 3 1440 196 208 6938 1070 32 61 26 1 3 1460 215 197 6918 1081 28 55 23 1 3 1249 133 205 7417 827 33 72 33 1 3 1348 159 238 7017 1081 31 67 25 1 3 1341 155 244 6958 1144 32 68 26 1 3 1398 149 204 7182 907 29 76 30 1 3 1454 200 199 6910 1090 30 62 25 1 3 1334 153 219 6928 1214 33 66 24 1 3 1438 204 189 7107 910 33 63 27 1 3 1303 138 212 7170 1016 34 69 25 1 3 1323 147 210 7108 1070 33 61 20 1 3 1417 169 207 6875 1184 34 57 27 1 3 1360 167 225 6883 1220 31 55 27 1 3 1420 179 214 6923 1121 33 56 27 1 3 1472 218 214 6724 1238 29 53 23 1 3 1368 174 205 7042 1066 31 57 26 1 3 1367 173 228 6948 1141 32 53 24 1 3 1403 173 209 6843 1210 33 63 33 1 3 1413 197 206 6737 1387 34 60 31 1 3 1201 138 207 7011 1269 37 64 35 1 3 1359 180 207 6895 1203 33 61 30 1 3 1518 198 225 6681 1243 29 57 24 1 3 1434 185 189 6771 1269 30 62 25 1 3 1367 162 179 6772 1368 33 64 27 1 3 1461 181 197 6783 1246 26 57 23 1 3 1368 161 198 7030 1095 33 59 31 1 3 1419 159 215 6862 1193 35 60 31 1 3 1514 162 298 6725 1119 45 93 30 1 3 1328 171 253 6987 1030 38 83 39 1 3 1469 160 337 6675 1127 44 94 36 1 4 1222 133 227 7425 824 36 69 35 1 4 1639 172 331 6510 1124 46 91 32 1 4 1345 133 272 6801 1194 48 83 37 1 4 1339 170 275 6838 1060 46 88 43 1 4 1194 135 263 7277 889 44 95 41 1 4 1112 68 375 7770 448 52 69 45 1 4 1222 70 329 7605 566 48 67 43 1 4 1136 72 341 7616 661 49 65 32 1 4 926 41 277 7815 784 45 65 25 1 4 1105 69 373 7714 532 51 68 37 1 4 1109 79 305 7576 763 45 64 36 1 4 1284 93 265 7235 893 43 77 46 1 4 1120 69 277 7416 946 42 59 36 1 4 916 52 281 7870 694 42 64 58 1 4 905 49 288 7747 812 49 71 56 1 4 1206 55 287 7329 935 44 74 42 1 4 1457 182 267 7020 863 41 84 37 1 4 1327 140 193 7328 823 36 87 35 1 4 1303 100 251 7045 1049 40 86 40 1 4 1444 175 259 6876 1027 34 78 32 1 4 1505 243 226 6962 858 30 72 27 1 4 1429 162 223 6917 1041 37 77 40 1 4 1491 162 211 6994 928 37 97 38 1 4 1393 128 211 7189 870 38 93 40 1 4 1404 134 210 7110 923 40 101 43 1 4 1222 130 214 7374 856 38 89 45 1 4 1153 74 316 7593 705 42 64 32 1 4 1169 76 307 7553 728 43 69 32 1 4 1369 104 237 7375 775 39 70 15 1 4 993 58 267 7743 773 41 62 44 1 4 980 53 254 7719 815 44 69 47 1 4 967 55 273 7692 833 45 63 47 1 4 1128 73 354 7527 728 44 76 38 1 4 1188 85 273 7445 814 44 73 42 1 4 1257 95 247 7405 812 43 70 35 1 4 1262 88 301 7471 704 43 71 31 1 3 1283 153 196 7107 1115 37 60 28 1 3 1263 155 199 7140 1148 31 42 18 1 3 1369 158 215 7160 958 38 69 32 1 3 1353 172 175 6965 1212 28 75 19 1 3 1187 139 185 7427 952 29 56 22 1 3 1732 231 156 6437 1313 45 62 23 1 3 1620 255 166 6628 1212 29 62 27 1 3 1543 172 193 6740 1157 52 87 34 1 3 1498 170 195 6804 1206 35 66 23 1 3 1399 169 171 7011 1100 36 72 16 1 3 1293 156 191 7101 1111 32 60 31 1 3 1420 175 152 7004 1149 27 50 20 1 3 1721 238 255 6300 1350 35 70 28 1 3 1742 221 156 6415 1315 43 82 23 1 3 1391 187 189 6975 1062 52 70 45 1 3 1517 206 249 6680 1205 33 80 27 1 3 1269 157 193 7140 1148 31 40 18 1 3 1577 204 208 6732 1183 20 52 20 1 3 1590 241 195 6705 1149 27 68 21 1 3 1621 280 197 6608 1179 28 58 27 1 3 1753 275 236 6367 1214 23 61 27 1 3 1679 260 177 6568 1191 30 59 33 1 3 1419 203 176 6973 1083 38 78 27 1 3 1693 236 174 6499 1204 51 102 37 1 3 1692 270 234 6499 1196 31 59 15 1 3 1638 252 215 6570 1199 39 53 29 1 3 1497 247 219 6621 1270 36 73 32 1 3 1442 222 194 6677 1314 36 72 38 1 3 1680 270 170 6440 1310 31 62 28 1 3 1463 164 185 6909 1154 49 58 17 2 5 1129 120 222 7272 1112 43 98 2 2 5 1042 135 210 7376 1116 35 90 3 2 5 1103 96 210 7380 1085 32 94 3 2 5 1118 97 221 7279 1154 35 94 2 2 5 1052 95 215 7388 1126 31 92 1 2 5 1116 102 231 7290 1168 26 66 1 2 5 1108 132 231 7319 1101 20 66 2 2 5 1129 108 212 7386 1074 28 62 3 2 5 1085 91 223 7384 1126 28 62 3 2 5 1104 103 233 7322 1147 27 61 2 2 5 1098 88 212 7338 1140 28 67 1 2 6 1135 98 251 7120 1314 20 61 2 2 6 1158 108 245 7065 1326 22 75 1 2 6 1133 110 241 7080 1342 21 68 3 2 6 1095 125 250 7120 1305 21 83 1 2 6 1201 87 238 6990 1383 25 75 3 2 6 1213 112 245 7007 1335 22 65 3 2 5 1108 92 231 7367 1110 29 62 3 2 5 1075 103 207 7413 1096 32 68 2 2 5 1059 96 228 7386 1128 25 72 2 2 5 1176 92 207 7347 1057 35 82 1 2 5 1159 98 213 7320 1108 38 64 1 2 5 1132 80 201 7398 1095 27 67 2 2 5 1107 75 220 7399 1096 29 90 1 2 5 1092 104 234 7355 1126 28 58 2 2 5 1119 81 219 7409 1057 33 81 2 2 5 1106 93 212 7381 1104 35 68 1 2 5 1047 101 238 7385 1120 28 89 1 2 5 1165 99 214 7331 1101 22 67 3 2 5 1158 84 201 7327 1123 29 77 2 2 5 1095 88 203 7415 1093 37 78 1 2 5 1176 75 205 7396 1107 33 74 2 2 5 1103 109 220 7335 1140 28 59 2 2 5 1112 92 209 7356 1125 32 73 2 2 5 1091 93 222 7377 1113 20 53 2 2 5 1080 98 219 7371 1125 33 78 1 2 5 1051 108 227 7403 1114 30 66 3 2 5 1096 84 211 7415 1091 30 71 2 2 5 1142 97 225 7341 1101 28 65 1 2 5 1047 96 236 7399 1107 32 80 3 2 5 1114 86 210 7359 1116 31 83 2 2 5 1140 93 241 7324 1098 23 74 1 2 5 1075 91 200 7410 1107 36 80 1 2 5 1092 106 219 7427 1125 33 77 1 2 5 1076 95 204 7408 1130 27 79 2 2 5 1178 89 201 7381 1099 34 87 2 2 5 1095 104 223 7367 1111 43 56 2 2 6 1166 97 272 6971 1390 20 83 3 2 6 1154 119 257 7130 1253 22 61 1 2 6 1177 111 241 6882 1470 22 95 2 2 6 1160 96 240 7043 1357 24 79 2 2 6 1122 104 241 7145 1313 15 58 1 2 6 1132 99 257 7065 1362 24 90 3 2 6 1096 100 260 7162 1282 25 74 2 2 6 1131 87 233 7144 1307 25 72 3 2 6 1184 105 258 7020 1340 26 66 2 2 6 1135 94 235 7123 1320 24 67 2 2 6 1084 96 240 7164 1330 28 57 1 2 6 1086 127 252 7159 1285 28 62 2 2 6 1140 95 258 7085 1347 23 71 3 2 6 1138 101 254 7103 1310 25 68 1 2 6 1159 110 261 7068 1297 27 77 2 2 5 1051 78 211 7421 1146 30 82 2 2 5 1048 79 213 7439 1130 28 61 2 2 5 1061 86 220 7421 1102 29 79 3 2 5 1105 88 210 7353 1142 28 72 1 2 5 1145 35 237 7208 1118 20 46 2 2 5 1049 96 219 7303 1168 22 47 2 2 5 1105 120 218 7302 1158 23 45 3 2 5 1030 84 214 7403 1177 21 70 1 2 5 1070 98 215 7280 1240 28 68 3 2 5 1103 81 208 7310 1177 30 90 3 2 5 1040 101 205 7368 1176 25 85 3 2 5 1100 95 210 7320 1113 22 72 3 2 5 1118 85 199 7415 1060 36 86 3 2 5 1065 98 230 7345 1163 24 74 1 2 5 1131 78 221 7358 1120 22 69 2 2 5 1080 120 218 7296 1145 35 105 2 2 5 1075 86 231 7403 1109 22 73 3 2 5 1040 103 228 7364 1173 25 66 2 2 5 1128 82 203 7320 1148 30 88 1 2 5 1060 111 231 7363 1149 20 65 1 2 5 1103 78 220 7365 1149 20 65 2 2 5 1110 91 201 7318 1185 24 74 2 2 5 1091 108 218 7383 1183 28 88 3 2 5 1094 96 220 7341 1127 26 96 2 2 6 1131 87 208 7170 1308 28 57 2 2 6 1175 108 214 7076 1307 33 85 2 2 6 1076 77 202 7243 1305 29 67 1 2 6 1120 90 240 7068 1383 23 75 1 2 6 1152 111 238 7080 1372 25 81 2 2 6 1141 95 250 7035 1388 22 68 2 2 6 1098 103 267 7135 1301 24 76 2 2 6 1126 100 236 7062 1380 26 69 1 2 6 1087 89 243 7200 1302 18 60 1 2 6 1115 96 236 7085 1372 20 75 2 2 6 1178 92 241 7006 1376 22 84 1 2 6 1162 106 242 7025 1368 25 71 2 3 9 1085 70 180 7955 605 20 50 1 3 9 1085 70 185 7955 600 25 55 1 3 9 1090 60 190 7950 600 28 47 2 3 9 1080 65 189 7960 602 35 20 1 3 9 1090 60 195 7955 600 28 42 2 3 9 1105 55 200 7900 600 37 55 2 3 9 1060 75 175 7975 610 20 55 2 3 9 1050 70 170 7977 605 28 65 1 3 9 1100 55 198 7905 600 35 50 3 3 9 1065 65 178 7965 605 22 65 2 3 9 1085 60 188 7955 602 30 50 2 3 9 1080 65 180 7960 605 25 55 1 3 9 1085 60 190 7955 602 30 53 1 3 9 1075 68 195 7960 602 20 40 3 3 9 1090 58 192 7950 600 35 40 3 3 9 1095 60 198 7945 600 38 34 2 3 9 1090 58 195 7950 600 30 42 2 3 9 1095 58 198 7950 602 35 32 1 3 9 1090 58 195 7940 600 35 42 2 3 9 1095 58 198 7945 600 35 34 1 3 9 1095 55 200 7940 600 35 45 3 3 9 1080 70 188 7965 608 28 36 3 3 9 1090 60 195 7950 600 32 38 2 3 9 1105 55 200 7900 595 39 56 1 3 9 1110 50 205 7900 595 40 52 1 3 9 1075 70 198 7978 608 28 33 2 3 9 1075 65 185 7980 608 35 42 3 3 9 1065 75 180 7975 610 25 50 3 3 9 1070 75 188 7980 602 22 45 2 3 9 1070 75 188 7980 602 22 45 1 3 9 1100 70 200 7910 610 39 44 1 3 9 1075 70 185 7960 610 22 58 2 3 9 1050 78 175 7990 610 18 59 3 3 9 1090 60 198 7945 600 32 35 2 3 9 1050 78 188 7990 608 28 23 3 3 9 1075 70 190 7975 605 28 27 3 3 9 1098 54 202 7945 595 42 32 2 3 9 1105 15 198 8005 575 52 20 2 3 9 1110 75 220 7915 510 55 65 2 3 9 1058 50 178 7988 626 40 55 3 3 9 1115 30 225 7955 600 55 15 2 3 9 1105 30 198 7995 570 52 20 3 3 9 1072 49 178 7980 615 48 48 2 3 9 1110 15 210 7990 570 50 20 2 3 9 1110 80 215 7910 525 50 60 1 3 9 1055 60 175 7985 620 45 50 1 3 9 1100 80 215 7930 535 45 60 2 3 9 1105 55 205 7965 600 25 20 2 3 9 1095 50 210 7948 600 25 35 2 3 9 1110 50 220 7950 600 52 10 2 3 9 1092 37 210 7955 600 40 40 3 3 7 1290 60 260 7550 670 70 100 2 3 7 1170 80 230 7690 720 40 70 1 3 7 1100 90 250 7680 760 30 80 2 3 7 1120 70 240 7720 730 40 80 2 3 7 1160 70 250 7650 750 30 90 1 3 7 1200 50 210 7770 690 20 50 3 3 7 1140 50 200 7990 580 10 20 1 3 7 1220 80 240 7610 760 30 60 2 3 7 1180 90 250 7520 800 50 100 2 3 7 1210 70 250 7560 780 40 90 2 3 7 1220 80 220 7540 770 60 100 2 3 7 1180 100 190 7520 820 50 100 1 3 7 1160 90 220 7580 790 40 90 1 3 7 1130 100 240 7620 780 30 90 1 3 7 1080 100 260 7710 750 20 70 2 3 7 1090 90 280 7730 720 50 100 1 3 7 1020 100 270 7770 710 40 90 1 3 7 1090 90 250 7680 760 60 80 1 3 7 1120 100 260 7720 680 30 80 2 3 7 1080 80 240 7830 670 30 70 2 3 7 1160 70 230 7860 640 10 20 1 3 7 1100 80 240 7820 670 20 70 2 3 7 1050 100 250 7930 630 10 30 3 3 7 1090 90 270 7780 690 30 50 3 3 7 1120 80 260 7750 680 30 80 3 3 7 1120 100 250 7680 730 40 70 2 3 7 1190 90 230 7670 710 30 80 2 3 7 1170 110 250 7620 740 20 90 1 3 7 1120 100 230 7720 730 20 70 1 3 7 1190 80 270 7690 720 10 40 2 3 7 1400 90 270 7420 800 0 20 2 3 7 1350 80 250 7520 760 10 30 1 3 7 1090 60 220 7890 670 10 60 2 3 7 1150 90 230 7790 650 30 60 1 3 7 1240 90 220 7820 590 10 30 1 3 7 1220 100 240 7890 530 0 10 2 3 7 1180 80 250 7870 580 10 30 2 3 7 1170 110 240 7730 630 30 90 1 3 7 1170 100 280 7710 640 20 70 3 3 7 1180 80 220 7790 680 10 40 1 3 7 1200 90 240 7820 590 10 50 2 3 7 1140 90 240 7880 570 20 60 3 3 7 1160 70 210 7870 580 30 80 3 3 7 1130 80 250 7780 650 40 60 3 3 7 1150 80 240 7800 630 30 70 2 3 7 1110 70 240 7820 670 20 70 3 3 7 1150 70 220 7850 620 20 40 2 3 7 1180 80 240 7760 670 20 50 2 3 7 1020 80 250 7920 680 10 30 3 3 7 610 80 230 8410 650 0 20 3 3 8 1190 150 290 7340 1020 0 10 2 3 8 1110 130 210 7550 1000 0 0 1 3 8 1020 100 220 7530 1030 0 0 3 3 8 1070 120 210 7600 990 0 10 3 3 8 1010 90 350 7480 1050 10 10 1 3 8 1060 140 240 7680 830 10 40 2 3 8 1060 140 270 7620 880 10 20 1 3 8 1030 100 230 7740 900 0 0 2 3 8 1120 130 250 7530 970 0 0 3 3 8 1030 110 220 7760 980 0 0 2 3 8 1070 100 230 7600 990 10 0 1 3 8 1140 180 220 7610 850 10 10 2 3 8 1090 180 230 7590 860 10 40 2 3 8 980 110 300 7720 910 10 0 3 3 8 980 90 330 7540 1040 0 0 2 3 8 960 90 200 7810 940 0 0 2 3 8 990 90 210 7780 930 0 0 2 3 8 1060 120 210 7600 1010 0 0 1 3 8 1240 150 250 7610 730 10 10 1 3 8 1060 90 310 7850 690 0 0 2 3 8 1020 100 290 7620 960 0 10 2 3 8 970 90 220 7700 1020 0 0 3 3 8 1180 130 220 7450 1010 0 10 2 3 8 1060 140 240 7690 850 10 10 1 3 8 990 100 250 7630 1030 0 0 3 3 8 1010 90 350 7630 940 10 0 3 3 8 1040 90 250 7780 820 10 10 1 3 8 1040 90 250 7810 810 10 10 2 3 8 1020 90 350 7620 920 10 0 3 3 8 1020 90 260 7620 1010 0 0 3 3 8 1010 90 350 7610 930 10 0 3 3 8 920 110 340 7720 910 0 0 3 3 8 1030 100 250 7710 900 0 10 2 3 8 960 90 300 7820 830 0 0 3 3 8 1030 110 210 7810 840 0 0 1 3 8 1010 100 240 7710 910 10 20 2 3 8 1020 90 240 7800 850 0 0 2 3 8 1120 90 300 7650 830 0 10 1 3 8 1090 90 290 7710 800 10 0 2 3 8 1100 120 280 7630 770 10 10 2 3 8 1090 80 240 7820 760 10 0 2 3 8 1150 90 250 7720 810 0 10 3 3 8 1110 90 230 7810 750 0 10 2 3 8 1010 110 210 7720 950 0 0 1 3 8 1070 100 220 7730 870 10 10 2 3 8 1280 110 290 7490 790 10 10 2 3 8 1060 100 270 7740 810 10 10 3 3 8 1010 90 210 7720 970 0 0 2 3 8 990 120 250 7750 870 10 10 2 3 8 960 80 240 7950 740 10 20 2 ggobi-2.1.12/data/perm5.xml0000644000175000017500000004406114651527764011056 1 0.5 -1.494 -1.41 0.999315 0.526168 0.032 -0.844 0.997261 0.552264 0.251 -0.219 0.993844 0.578217 -2.265 -2.412 0.989074 0.603956 0.051 0.5 0.982963 0.62941 0.624 0.335 0.975528 0.654508 -0.572 -0.384 0.96679 0.679184 -0.655 -0.16 0.956773 0.703368 -1.391 1.192 0.945503 0.726995 -0.252 1.026 0.933013 0.75 -0.924 0.061 0.919335 0.772319 -1.82 -0.556 0.904508 0.793893 0.398 -0.05 0.888573 0.81466 0.812 0.364 0.871572 0.834565 0.364 -1.092 0.853553 0.853553 1.851 0.315 0.834565 0.871572 0.565 -1.033 0.81466 0.888573 0.495 1.024 0.793893 0.904508 -0.147 0.401 0.772319 0.919335 1.392 -0.814 0.75 0.933013 0.31 0.145 0.726995 0.945503 2.09 -0.071 0.703368 0.956773 0.257 0.796 0.679184 0.96679 0.692 0.054 0.654508 0.975528 -2.11 0.599 0.62941 0.982963 1.531 -0.434 0.603956 0.989074 -0.426 1.555 0.578217 0.993844 0.352 1.34 0.552264 0.997261 0.384 -0.543 0.526168 0.999315 1.058 0.005 0.5 1 0.085 0.304 0.473832 0.999315 -1.185 -1.708 0.447736 0.997261 0.443 -0.254 0.421783 0.993844 -0.572 -0.597 0.396044 0.989074 -1.151 1.449 0.37059 0.982963 1.105 0.276 0.345491 0.975528 -0.553 -1.236 0.320816 0.96679 -0.702 -0.51 0.296632 0.956773 -0.811 0.769 0.273005 0.945503 -0.221 -0.12 0.25 0.933013 0.005 0.1 0.22768 0.919335 0.515 0.406 0.206107 0.904508 -0.228 -0.195 0.18534 0.888573 1.677 0.822 0.165435 0.871572 -0.588 -2.048 0.146447 0.853553 -0.409 0.551 0.128428 0.834565 0.146 -1.457 0.111427 0.81466 0.384 -1.149 0.095492 0.793893 -1.152 0.403 0.080665 0.772319 -0.033 -1.04 0.066987 0.75 -1.22 0.236 0.054497 0.726995 -2.057 1.64 0.043227 0.703368 1.803 -0.151 0.03321 0.679184 -0.815 -0.539 0.024472 0.654508 2.472 0.025 0.017037 0.62941 -1.166 0.023 0.010926 0.603956 0.491 -0.506 0.006156 0.578217 0.432 1.146 0.002739 0.552264 -1.248 -0.169 0.000685 0.526168 -0.383 1.495 0 0.5 -0.84 -0.214 0.000685 0.473832 0.52 0.679 0.002739 0.447736 -1.143 -1.11 0.006156 0.421783 0.294 0.068 0.010926 0.396044 -0.478 0.059 0.017037 0.37059 -0.232 -0.475 0.024472 0.345491 -2.039 -0.545 0.03321 0.320816 0.682 0.96 0.043227 0.296632 0.542 -1.114 0.054497 0.273005 -0.109 0.855 0.066987 0.25 0.312 -1.406 0.080665 0.22768 -0.17 0.214 0.095491 0.206107 1.603 -0.137 0.111427 0.18534 -2.228 0.698 0.128428 0.165435 0.412 0.095 0.146447 0.146447 1.218 -0.058 0.165435 0.128428 -1.188 -1.625 0.18534 0.111427 1.453 0.788 0.206107 0.095492 1.846 1.437 0.22768 0.080665 0.144 -1.056 0.25 0.066987 1.192 1.2 0.273005 0.054497 0.166 -0.149 0.296632 0.043227 1.795 0.395 0.320816 0.03321 -1.606 1.415 0.345491 0.024472 1.24 0.043 0.37059 0.017037 0.588 1.673 0.396044 0.010926 -2.173 -0.866 0.421783 0.006156 0.155 -0.95 0.447736 0.002739 0.472 0.731 0.473832 0.000685 0.43 -1.088 0.5 0 0.38 0.559 0.526168 0.000685 1.712 -1.755 0.552264 0.002739 0.749 -1.048 0.578217 0.006156 -1.108 -0.177 0.603956 0.010926 -1.991 0.544 0.629409 0.017037 0.626 1.166 0.654508 0.024472 0.603 -1.002 0.679184 0.03321 0.803 2.072 0.703368 0.043227 -1.838 0.469 0.726995 0.054497 -0.082 -0.808 0.75 0.066987 -0.066 1.663 0.772319 0.080665 -0.759 0.001 0.793893 0.095491 1.668 -0.166 0.81466 0.111427 -0.605 0.643 0.834565 0.128428 0.233 -1.261 0.853553 0.146447 -1.43 1.011 0.871572 0.165435 -0.522 -1.515 0.888573 0.18534 -0.156 -0.505 0.904508 0.206107 -1.365 -0.804 0.919335 0.22768 -0.004 1.047 0.933013 0.25 0.451 -0.358 0.945503 0.273005 -0.808 -1.064 0.956773 0.296632 -0.722 -0.467 0.96679 0.320816 -0.183 0.916 0.975528 0.345491 -0.586 -0.897 0.982963 0.37059 0.811 -1.554 0.989074 0.396044 1.807 0.437 0.993844 0.421783 -1.604 0.106 0.997261 0.447736 -1.118 -0.017 0.999315 0.473832 -0.263 -0.171 ggobi-2.1.12/data/tmin1.csv0000644000175000017500000000046314651527764011047 "","nseconds","whatever","fraudp","bizres","name" "1",42,4870,"low ","biz ","AB C" "2",42,4880,"low ","res ","DEF" "3",7,4890,"medium ","unknown ","GHI" "4",12,5000,"high ","res ","J" "5",18,5100,"high ","unknown ","KLM" "6",12,5000,"high ","res ","NOP QRST" "7",18,5200,"high ","unknown ","Happy Birthday" ggobi-2.1.12/data/pigs.xml0000644000175000017500000002121014651527764010757 United Kingdom Pig Production, from the book 'Data' by Andrews and Herzberg, and found on StatLib: http://lib.stat.cmu.edu/datasets/Andrews/T62.1 The time variables have been restructured. GILTS: number of sows giving birth for the first time PROFIT: ratio of price to an index of feed price S/HERDSZ: ratio of the number of breeding pigs slaughtered to the total breeding herd size PRODUCTION: number of pigs slaughtered that were reared for meat HERDSZ: breeding herd size 1.000 1967.000 1.000 1.000 0.000 0.000 105.000 8.075 10.800 2645.000 703.000 2.000 1967.000 2.000 0.000 1.000 0.000 119.000 7.819 9.160 2540.000 722.000 3.000 1967.000 3.000 0.000 0.000 1.000 119.000 7.366 9.380 2565.000 738.000 4.000 1967.000 4.000 0.000 0.000 0.000 109.000 8.113 10.390 2776.000 747.000 5.000 1968.000 1.000 1.000 0.000 0.000 117.000 7.380 9.440 2725.000 755.000 6.000 1968.000 2.000 0.000 1.000 0.000 135.000 7.134 8.690 2623.000 780.000 7.000 1968.000 3.000 0.000 0.000 1.000 126.000 7.222 9.600 2722.000 806.000 8.000 1968.000 4.000 0.000 0.000 0.000 112.000 7.768 11.280 3004.000 807.000 9.000 1969.000 1.000 1.000 0.000 0.000 116.000 7.386 11.200 2952.000 805.000 10.000 1969.000 2.000 0.000 1.000 0.000 122.000 6.965 9.940 2968.000 801.000 11.000 1969.000 3.000 0.000 0.000 1.000 115.000 6.478 11.210 2961.000 821.000 12.000 1969.000 4.000 0.000 0.000 0.000 115.000 8.105 11.690 3243.000 809.000 13.000 1970.000 1.000 1.000 0.000 0.000 122.000 8.060 9.670 3027.000 797.000 14.000 1970.000 2.000 0.000 1.000 0.000 138.000 7.684 7.870 2902.000 831.000 15.000 1970.000 3.000 0.000 0.000 1.000 135.000 7.580 8.150 3057.000 867.000 16.000 1970.000 4.000 0.000 0.000 0.000 125.000 7.093 8.830 3331.000 862.000 17.000 1971.000 1.000 1.000 0.000 0.000 115.000 6.129 10.510 3266.000 871.000 18.000 1971.000 2.000 0.000 1.000 0.000 108.000 6.026 9.030 3290.000 864.000 19.000 1971.000 3.000 0.000 0.000 1.000 100.000 6.679 9.930 3223.000 854.000 20.000 1971.000 4.000 0.000 0.000 0.000 96.000 7.414 10.270 3501.000 846.000 21.000 1972.000 1.000 1.000 0.000 0.000 107.000 7.112 9.560 3402.000 854.000 22.000 1972.000 2.000 0.000 1.000 0.000 115.000 7.762 8.740 3278.000 851.000 23.000 1972.000 3.000 0.000 0.000 1.000 123.000 7.645 10.320 3258.000 876.000 24.000 1972.000 4.000 0.000 0.000 0.000 122.000 8.639 10.310 3400.000 876.000 25.000 1973.000 1.000 1.000 0.000 0.000 128.000 7.667 9.970 3303.000 888.000 26.000 1973.000 2.000 0.000 1.000 0.000 136.000 8.080 8.990 3228.000 903.000 27.000 1973.000 3.000 0.000 0.000 1.000 140.000 6.678 12.220 3269.000 922.000 28.000 1973.000 4.000 0.000 0.000 0.000 122.000 6.739 12.900 3396.000 902.000 29.000 1974.000 1.000 1.000 0.000 0.000 102.000 5.569 14.000 3396.000 820.000 30.000 1974.000 2.000 0.000 1.000 0.000 103.000 5.049 12.770 3386.000 819.000 31.000 1974.000 3.000 0.000 0.000 1.000 89.000 5.642 12.610 3385.000 797.000 32.000 1974.000 4.000 0.000 0.000 0.000 77.000 6.808 12.160 3262.000 751.000 33.000 1975.000 1.000 1.000 0.000 0.000 89.000 6.636 11.160 3113.000 743.000 34.000 1975.000 2.000 0.000 1.000 0.000 94.000 8.241 8.900 2851.000 744.000 35.000 1975.000 3.000 0.000 0.000 1.000 104.000 7.968 10.240 2752.000 747.000 36.000 1975.000 4.000 0.000 0.000 0.000 108.000 8.044 10.290 2919.000 764.000 37.000 1976.000 1.000 1.000 0.000 0.000 119.000 7.791 10.030 2842.000 759.000 38.000 1976.000 2.000 0.000 1.000 0.000 126.000 7.024 9.050 2834.000 807.000 39.000 1976.000 3.000 0.000 0.000 1.000 119.000 6.102 12.000 2957.000 798.000 40.000 1976.000 4.000 0.000 0.000 0.000 103.000 6.053 12.700 3305.000 811.000 41.000 1977.000 1.000 1.000 0.000 0.000 96.000 5.941 12.950 3256.000 752.000 42.000 1977.000 2.000 0.000 1.000 0.000 95.000 5.386 11.690 3151.000 761.000 43.000 1977.000 3.000 0.000 0.000 1.000 80.000 5.811 12.650 3141.000 719.000 44.000 1977.000 4.000 0.000 0.000 0.000 88.000 6.716 12.210 3266.000 741.000 45.000 1978.000 1.000 1.000 0.000 0.000 93.000 6.923 10.680 3061.000 745.000 46.000 1978.000 2.000 0.000 1.000 0.000 105.000 6.939 10.470 3018.000 764.000 47.000 1978.000 3.000 0.000 0.000 1.000 107.000 6.705 11.050 3085.000 764.000 48.000 1978.000 4.000 0.000 0.000 0.000 100.000 6.914 10.310 3242.000 786.000 ggobi-2.1.12/data/perm4.xml0000644000175000017500000000606214651527764011054 1.000000 0.500000 1 0.982963 0.629410 2 0.933013 0.750000 3 0.853553 0.853553 4 0.750000 0.933013 5 0.629410 0.982963 6 0.500000 1.000000 7 0.370590 0.982963 8 0.250000 0.933013 9 0.146447 0.853553 10 0.066987 0.750000 11 0.017037 0.629410 12 0.000000 0.500000 12 0.017037 0.370590 13 0.066987 0.250000 14 0.146447 0.146447 15 0.250000 0.066987 17 0.370590 0.017037 18 0.500000 0.000000 19 0.629409 0.017037 20 0.750000 0.066987 21 0.853553 0.146447 22 0.933013 0.250000 23 0.982963 0.370590 24 ggobi-2.1.12/data/roos.csv0000644000175000017500000003165014651527764011003 "","ANIMAL","SEX","SPECIES","BASILAR","OCCIPITONASAL","PALATILAR","PALATEWIDTH","NASALLENGTH","NASALWIDTH","SQUAMOSAL","INTERLAC","ZYGOMATIC","POSTORBITAL","ROSTRAL","SOPD","CREST","INCFOR","MANDLENGTH","MANDWIDTH","MANDDEPTH","RAMUS" "1",1,1,0,1312,1445,882,NA,609,241,180,394,782,249,227,531,153,88,1086,131,179,591 "2",2,1,0,1439,1503,985,230,629,222,150,416,824,233,248,632,141,100,1158,148,181,643 "3",3,1,0,1378,1464,934,NA,620,233,135,403,778,244,240,575,144,107,1131,116,169,610 "4",4,1,0,1315,1367,895,230,564,207,158,394,801,224,242,568,116,79,1090,132,189,594 "5",5,1,0,1413,1500,969,NA,645,247,161,426,823,241,252,607,120,99,1175,131,197,654 "6",6,1,0,1090,1195,740,NA,493,189,122,350,673,234,185,462,188,90,901,101,138,476 "7",7,1,0,1294,1421,872,239,606,226,155,396,780,237,238,577,149,101,1084,124,168,578 "8",8,1,0,1377,1504,954,248,660,240,159,417,812,240,245,614,128,91,1149,129,175,628 "9",9,1,0,1296,1439,878,208,630,215,NA,387,759,248,219,584,151,117,1069,121,159,578 "10",10,1,0,1470,1563,987,236,672,231,185,429,856,227,268,659,103,94,1240,132,196,683 "11",11,1,0,1612,1699,1119,281,778,263,185,441,921,251,284,699,86,79,1345,148,232,772 "12",12,1,0,1388,1500,936,227,616,220,150,412,805,236,249,628,107,85,1179,132,180,652 "13",13,1,0,1575,1655,1100,295,727,271,178,461,905,251,281,692,82,125,1309,145,210,712 "14",14,1,0,1717,1821,1184,307,810,284,185,490,960,258,288,764,104,81,1443,157,222,731 "15",15,1,0,1587,1711,1115,293,778,279,184,461,910,234,282,673,81,75,1339,135,207,692 "16",16,1,0,1604,1770,1132,268,823,272,173,474,880,249,258,702,57,109,1361,140,208,713 "17",17,1,0,1630,1703,1122,294,755,268,190,467,902,261,314,710,81,104,1377,137,206,754 "18",18,1,0,1490,1599,1007,289,710,278,179,483,897,250,299,674,115,107,1253,142,194,688 "19",19,1,0,1552,1540,1031,234,701,238,192,447,852,246,287,691,82,89,1293,137,213,722 "20",20,1,0,1595,1709,1092,267,803,255,204,455,904,243,306,695,83,130,NA,138,183,701 "21",21,1,0,1840,1907,1279,297,855,308,225,536,984,277,350,780,84,116,1539,163,238,795 "22",22,1,0,1740,1817,1225,291,838,281,185,493,977,273,265,736,121,83,NA,159,227,770 "23",23,1,0,1846,1893,1300,NA,830,288,213,527,1013,252,330,784,21,89,1530,152,232,829 "24",24,1,0,1702,1860,1270,332,864,306,221,513,947,239,315,765,39,137,1526,138,218,776 "25",25,1,0,1768,1890,1173,NA,837,285,252,512,968,233,347,798,41,100,1547,140,243,842 "26",1,2,0,1112,1225,755,NA,525,175,141,354,702,221,201,497,203,82,933,106,154,533 "27",2,2,0,1262,1367,855,211,575,200,145,386,760,226,220,569,164,72,1059,113,164,578 "28",3,2,0,1423,1490,971,229,626,226,159,441,839,256,234,613,148,106,1197,129,173,651 "29",4,2,0,1373,1494,952,247,664,238,171,428,828,249,228,605,147,99,1131,126,167,621 "30",5,2,0,1414,1517,971,256,659,229,197,433,853,233,264,664,131,94,1215,139,200,660 "31",6,2,0,1415,1523,973,257,671,247,181,443,859,240,288,665,125,104,1202,147,192,676 "32",7,2,0,1374,1463,927,241,629,205,169,393,833,235,247,615,129,100,1176,128,171,638 "33",8,2,0,1427,1487,978,221,646,210,173,402,823,238,242,589,125,99,1198,128,169,649 "34",9,2,0,1382,1494,942,229,674,221,170,407,803,210,222,599,101,106,1151,122,176,629 "35",10,2,0,1440,1557,985,233,687,225,175,413,832,229,265,646,121,88,1214,130,195,668 "36",11,2,0,1575,1667,1105,285,756,249,185,467,903,233,301,722,104,117,1324,147,198,731 "37",12,2,0,1462,1516,1016,255,687,223,190,432,873,222,286,663,135,105,1258,131,205,688 "38",13,2,0,1559,1650,1087,282,734,245,182,462,920,248,258,699,103,70,1355,149,193,724 "39",14,2,0,1507,1590,1043,NA,700,255,175,446,NA,236,264,644,112,91,1257,139,215,681 "40",15,2,0,1546,1621,1072,275,729,238,180,445,914,251,272,672,80,93,1344,137,204,735 "41",16,2,0,1512,1567,1052,287,695,251,183,439,885,235,271,646,82,67,1297,135,203,709 "42",17,2,0,1400,1501,1041,267,731,242,167,440,878,234,259,688,123,130,1265,137,175,684 "43",18,2,0,1464,1573,1037,286,717,258,182,450,848,205,262,625,70,118,1235,124,180,659 "44",19,2,0,1491,1578,1028,259,682,253,177,455,875,244,288,647,114,111,1290,148,194,706 "45",20,2,0,1530,1576,1037,276,704,241,191,449,910,243,271,NA,193,101,1321,143,218,741 "46",21,2,0,1570,1618,1064,294,725,261,160,455,894,212,302,684,74,103,1355,141,206,706 "47",22,2,0,1607,1647,1118,276,741,261,184,475,911,222,306,699,95,97,1370,139,218,733 "48",23,2,0,1558,1646,1087,NA,740,232,177,478,908,205,320,704,28,93,1394,131,182,733 "49",24,2,0,1589,1750,1128,311,811,289,187,479,911,238,326,716,122,90,1366,129,174,715 "50",25,2,0,1548,1663,1079,265,784,251,206,457,907,244,282,687,100,119,1314,126,198,706 "51",1,1,1,NA,1493,980,NA,635,236,161,394,798,242,269,589,135,85,1160,125,170,659 "52",2,1,1,1299,1345,895,219,565,204,163,385,764,235,215,542,153,93,1054,118,156,556 "53",3,1,1,1337,1395,910,234,562,216,145,404,794,272,236,577,154,102,1094,122,158,625 "54",4,1,1,1372,1456,920,NA,580,225,156,420,814,230,250,589,124,88,1110,136,179,636 "55",5,1,1,1336,1441,903,185,596,220,151,414,788,245,240,574,156,95,1083,133,178,623 "56",6,1,1,1301,1387,888,225,579,219,157,411,787,231,229,582,113,78,1115,123,164,616 "57",7,1,1,1360,1467,915,NA,636,201,158,406,813,226,261,570,138,76,1102,123,171,603 "58",8,1,1,1276,1351,824,NA,559,213,134,408,766,212,235,533,129,91,NA,112,159,608 "59",9,1,1,1351,NA,921,NA,615,228,180,424,833,231,275,640,136,100,1117,135,194,654 "60",10,1,1,1613,1726,1136,269,740,234,180,496,883,246,302,NA,75,103,1365,148,184,745 "61",11,1,1,1542,1628,1020,213,677,237,187,455,885,242,247,NA,94,100,1249,148,190,709 "62",12,1,1,1440,1580,972,248,675,217,158,399,815,227,234,647,129,84,1213,131,186,634 "63",13,1,1,1474,1555,989,239,629,211,170,433,888,251,253,662,134,91,1225,144,205,716 "64",14,1,1,1503,1603,1031,259,692,238,152,454,825,220,268,638,83,95,1264,141,203,712 "65",15,1,1,1597,1653,1060,NA,710,221,178,470,908,243,294,NA,104,107,NA,146,194,761 "66",16,1,1,1671,1689,1130,248,730,281,191,495,892,236,306,NA,62,78,1357,138,208,770 "67",17,1,1,1673,1720,1140,NA,763,292,299,497,946,270,318,709,107,120,1361,153,196,755 "68",18,1,1,1458,1588,969,NA,686,251,183,435,836,239,243,624,115,105,1181,128,192,676 "69",19,1,1,1568,1689,1086,290,717,231,183,450,900,252,318,694,18,98,1337,140,194,759 "70",20,1,1,1650,1707,1173,319,737,275,200,523,943,268,NA,744,72,90,1395,146,184,768 "71",21,1,1,1774,1838,1210,281,816,275,198,547,994,275,368,753,56,80,1482,146,227,794 "72",22,1,1,1893,1945,1315,267,893,260,213,499,994,234,345,754,13,92,1568,163,216,824 "73",23,1,1,1765,1781,1240,295,766,261,192,476,978,220,313,726,38,95,1503,159,211,775 "74",1,2,1,1030,1121,665,174,454,141,124,303,640,202,NA,435,216,96,856,101,132,473 "75",2,2,1,1389,1486,931,245,625,203,152,411,801,245,242,587,125,114,1164,123,166,645 "76",3,2,1,1263,1372,857,225,587,203,146,400,782,232,237,554,170,113,1055,120,166,580 "77",4,2,1,1067,1167,702,NA,474,151,121,320,683,215,193,475,209,76,894,103,134,511 "78",5,2,1,1379,1500,947,NA,676,222,160,427,801,236,248,607,129,107,1125,130,171,631 "79",6,2,1,1335,1407,900,NA,586,189,136,397,899,233,NA,603,159,72,1132,129,197,619 "80",7,2,1,1282,NA,835,172,NA,186,165,385,785,233,235,NA,157,60,1070,132,182,612 "81",8,2,1,1413,1490,962,244,630,235,170,430,834,240,271,626,88,96,1198,132,191,665 "82",9,2,1,1470,1583,1000,211,690,242,166,451,855,249,271,634,129,80,1209,138,210,708 "83",10,2,1,1377,1479,923,NA,630,239,162,452,874,283,256,NA,148,95,1136,129,190,679 "84",11,2,1,1464,1539,971,246,663,196,165,411,821,236,237,645,138,83,1219,143,188,702 "85",12,2,1,1452,1592,973,236,694,236,176,461,855,261,240,656,140,87,1210,143,194,695 "86",13,2,1,1444,1552,972,217,667,261,156,467,869,262,251,650,176,105,1194,138,197,704 "87",14,2,1,1487,1586,1002,242,681,240,171,439,822,245,290,656,112,108,1237,127,187,679 "88",15,2,1,1515,1617,1036,NA,712,217,153,440,854,245,271,641,101,90,1245,132,196,729 "89",16,2,1,1536,1620,1070,255,716,242,165,455,894,222,326,625,87,85,1287,135,196,692 "90",17,2,1,1499,1606,1028,275,699,254,177,439,835,254,264,650,112,91,1243,125,200,668 "91",18,2,1,1505,1569,1042,220,703,207,164,433,843,230,266,629,127,88,1228,136,194,709 "92",19,2,1,1519,1594,1066,259,704,238,184,430,865,238,273,645,70,121,1275,131,192,689 "93",20,2,1,1566,1606,1046,227,669,238,198,450,882,268,267,656,135,114,1296,142,219,699 "94",21,2,1,1509,1601,1023,256,693,228,183,434,828,240,256,638,120,107,1248,129,198,692 "95",22,2,1,1553,1607,1059,235,675,259,203,484,882,239,294,698,140,117,1314,135,212,722 "96",23,2,1,1660,1701,1171,300,769,253,188,482,960,247,320,695,86,126,1430,154,205,770 "97",24,2,1,1719,1757,1190,275,800,245,194,492,939,270,333,705,65,97,1450,154,240,813 "98",25,2,1,1688,1720,1188,285,798,235,183,459,893,247,312,NA,73,95,1415,138,220,760 "99",1,1,2,1382,1493,928,230,573,231,169,427,861,261,250,618,151,98,1162,133,186,640 "100",2,1,2,1438,1481,976,250,566,218,173,428,912,249,261,619,172,86,1220,147,193,655 "101",3,1,2,1304,1408,959,261,525,200,176,413,889,253,250,NA,138,96,1187,151,196,700 "102",4,1,2,1391,1430,950,256,551,202,176,421,886,260,252,646,140,106,1187,146,202,688 "103",5,1,2,1716,1688,1158,249,698,247,192,471,972,290,300,687,189,88,1450,160,236,799 "104",6,1,2,1530,1578,1046,259,638,208,185,452,929,243,265,667,134,104,1315,144,201,750 "105",7,1,2,1625,1630,1132,274,658,234,193,470,939,240,283,685,144,102,NA,151,200,734 "106",8,1,2,1559,1567,1069,243,630,216,196,461,955,230,280,678,110,95,NA,156,212,760 "107",9,1,2,1578,1566,1094,263,628,237,203,472,953,254,294,687,172,93,NA,146,207,772 "108",10,1,2,1562,1580,1076,295,638,240,177,455,925,243,272,675,118,80,1320,154,217,753 "109",11,1,2,1656,1640,1146,280,624,226,194,500,969,235,314,738,114,92,1422,166,227,805 "110",12,1,2,1477,1486,1001,244,590,206,155,402,867,242,268,639,160,88,1245,147,185,672 "111",13,1,2,1568,1601,1095,262,628,250,205,504,932,265,290,719,115,96,1367,159,223,777 "112",14,1,2,1656,1646,1142,297,656,232,198,471,947,217,309,721,104,75,NA,149,207,778 "113",15,1,2,1619,1678,1106,256,719,253,193,473,946,242,276,689,119,94,1369,159,215,765 "114",16,1,2,1687,1692,1153,260,687,263,204,491,986,240,288,735,111,104,1412,157,227,823 "115",17,1,2,1748,1731,1212,282,700,262,243,494,1000,236,340,735,129,98,NA,166,239,859 "116",18,1,2,1783,1788,1243,303,746,275,239,503,972,207,330,764,80,105,NA,159,226,841 "117",19,1,2,1745,1738,1235,304,715,246,237,513,1070,258,328,744,149,96,1502,167,239,853 "118",20,1,2,1680,1668,1151,293,685,255,224,479,1032,213,337,728,78,76,1466,158,214,835 "119",21,1,2,1653,1701,1151,299,734,239,215,490,1004,239,319,742,126,94,1408,169,209,836 "120",22,1,2,1732,1702,1200,328,708,255,230,496,990,233,312,703,106,87,1474,158,239,822 "121",23,1,2,1729,1694,1199,303,691,259,229,494,1015,222,322,737,125,117,NA,161,222,799 "122",24,1,2,1711,1695,1191,291,699,233,221,461,989,210,308,751,60,73,1452,154,215,815 "123",25,1,2,1834,1823,1247,320,737,278,280,535,1090,262,371,770,151,100,1555,156,271,880 "124",1,2,2,1271,1334,859,211,503,171,152,381,824,240,216,563,199,70,1078,130,181,634 "125",2,2,2,1329,1375,885,229,549,197,172,396,838,214,239,587,153,79,1103,133,182,666 "126",3,2,2,1248,1286,827,236,494,196,154,380,804,230,227,574,169,72,1046,131,170,616 "127",4,2,2,1271,1355,855,212,522,190,138,374,799,247,215,585,167,90,1058,132,179,629 "128",5,2,2,1317,1311,891,198,497,167,152,390,807,226,237,609,155,93,1073,130,178,648 "129",6,2,2,1356,1387,926,214,554,195,160,392,837,220,245,611,181,85,1140,135,188,657 "130",7,2,2,1250,1327,859,249,532,232,176,421,830,274,266,NA,214,80,1067,127,176,639 "131",8,2,2,1048,1145,693,NA,434,167,131,337,725,217,173,481,198,61,880,108,152,511 "132",9,2,2,1363,1430,926,227,578,217,167,408,844,234,249,603,153,73,1163,129,194,654 "133",10,2,2,1389,1415,944,230,574,212,172,405,822,241,241,612,170,73,1163,139,191,641 "134",11,2,2,1370,1424,934,248,571,205,171,408,859,246,235,623,154,98,1152,143,194,689 "135",12,2,2,1405,1426,956,212,571,199,182,407,868,235,250,NA,167,107,1176,134,194,683 "136",13,2,2,1428,1430,977,252,570,214,162,437,880,248,263,620,170,83,1179,140,189,650 "137",14,2,2,1456,1489,992,245,602,219,188,427,878,235,253,657,118,78,NA,141,193,717 "138",15,2,2,1395,1426,942,240,571,222,182,430,853,228,259,650,138,79,1199,148,202,700 "139",16,2,2,1385,1399,945,215,553,191,156,386,827,217,247,585,137,98,1156,134,190,642 "140",17,2,2,1441,1449,984,NA,568,221,166,435,879,231,257,635,160,82,1233,142,185,700 "141",18,2,2,1464,1496,1008,226,636,230,183,436,897,234,264,646,172,78,1263,150,216,715 "142",19,2,2,1486,1483,1019,287,603,213,180,442,927,230,274,649,139,97,1291,157,217,737 "143",20,2,2,1499,1511,NA,255,699,212,190,435,936,256,278,642,200,118,1291,150,200,740 "144",21,2,2,1485,1500,1016,277,552,205,203,454,919,225,278,676,122,74,1260,148,194,751 "145",22,2,2,1468,1536,996,264,667,222,190,431,951,217,305,650,178,82,1287,141,199,736 "146",23,2,2,1510,1546,1043,264,656,218,197,423,891,190,270,651,78,87,1337,158,210,747 "147",24,2,2,1526,1512,1052,281,625,250,201,470,934,236,289,680,145,106,1334,153,211,739 "148",25,2,2,1570,1583,987,285,646,244,198,482,984,253,291,699,188,103,1354,153,223,807 "149",100,1,0,1899,1925,1327,306,905,310,265,560,1067,NA,NA,770,46,108,1648,174,257,880 "150",200,1,2,1848,NA,1276,NA,751,287,257,NA,1045,266,NA,NA,NA,128,1583,NA,NA,843 "151",300,2,2,1115,NA,748,182,NA,NA,178,311,756,226,NA,NA,NA,48,1009,NA,204,593 ggobi-2.1.12/data/tmin3.xml0000644000175000017500000000411614651527764011055 This is a simple example for testing automatically computed levels for a categorical variable using the levels="auto" attribute for a categoricalvariable element. It also uses the string element to identify these values. low medium high biz res unknown 010 00 AB C 1 2001 DEF 2 3012 GHI 3 4021 J 4 5022 KLM 5 6021 NOP QRST 6 7022Happy Birthday 1.0 2.0 2.0 1.0 2.0 2.0 ggobi-2.1.12/data/sat.csv0000644000175000017500000000716714651527764010616 "","STATE","SAT","EXPEND","PERPUPIL","ENROLL","TEACHERS","RATIO","SALARY","ATTEND","COMPUTER" "1",1,1022,2188020,3197,724751,38845,18.7000007629395,25190,684453,28353 "2",2,923,739020,7716,106481,6272,17,41754,95776,8806 "3",3,853,2143148,3902,574890,31617,18.2000007629395,28499,549219,31676 "4",4,986,1319370,3272,436387,27730,15.6999998092651,21395,403106,17734 "5",5,906,19370242,4121,4618120,203342,22.7000007629395,34684,4699865,186468 "6",6,966,2266667,4408,560081,31398,17.7999992370605,29558,514232,32212 "7",7,908,2984542,6857,460637,35502,13,37343,435227,21188 "8",8,903,479327,5422,96678,5898,16.3999996185303,31585,88397,3328 "9",9,846,584035,7850,84792,5936,14.3000001907349,36290,74398,3695 "10",10,887,7245515,4563,1720930,100370,17.1000003814697,26974,1587882,86267 "11",11,847,4006069,3852,1107994,59916,18.5,26920,1039977,45715 "12",12,888,643319,4121,167488,8737,19.2000007629395,30778,156114,4621 "13",13,965,571159,2838,214615,10425,20.6000003814697,22734,201219,8442 "14",14,982,7655153,4906,1794916,105097,17.1000003814697,31145,1560461,66679 "15",15,871,3779468,4284,960994,54029,17.7999992370605,29331,882175,45439 "16",16,1084,1925623,4285,478200,30327,15.8000001907349,25778,449418,25340 "17",17,1040,1712260,4443,426596,28122,15.1999998092651,27360,385364,21653 "18",18,996,1918741,3347,637627,35788,17.7999992370605,24930,573221,27125 "19",19,986,2468307,3317,786683,43203,18.2000007629395,22470,744142,27301 "20",20,987,921931,4744,212902,14593,14.6000003814697,24938,194350,9126 "21",21,914,3505018,5758,688947,40899,16.7999992370605,33895,608699,33574 "22",22,905,4522119,5979,823428,60068,13.6999998092651,32221,756285,40731 "23",23,972,7493266,5116,1582785,79847,19.7999992370605,34823,1464766,69821 "24",24,1066,3282296,4755,726950,42750,17,30660,690266,59184 "25",25,988,1372290,2874,503326,27283,18.3999996185303,22578,477439,10890 "26",26,989,3096666,4263,806639,50693,15.8999996185303,26006,726451,35121 "27",27,992,592454,4293,152191,9626,15.8000001907349,24421,138016,9004 "28",28,1030,1105009,4360,269434,18003,15,23845,253426,12785 "29",29,926,615161,3791,176474,8699,20.2999992370605,28840,162256,8446 "30",30,932,733230,4807,169413,10442,16.2000007629395,26702,152536,4484 "31",31,894,7309147,7549,1080871,79698,13.6000003814697,33037,968176,52330 "32",32,1015,975552,3437,292425,15770,18.5,23897,280921,19192 "33",33,890,17127584,7663,2573715,172807,14.8999996185303,36654,2234976,139032 "34",34,836,3892971,3874,1083156,61933,17.5,25738,1004837,64245 "35",35,1067,431814,3952,118809,7731,15.3999996185303,22249,109271,5537 "36",36,948,7425194,4649,1778544,101021,17.6000003814697,29671,1597117,72839 "37",37,1001,1822743,3379,580426,35116,16.5,22370,542693,25762 "38",38,927,2123241,5182,461752,25147,18.3999996185303,29390,409717,23961 "39",39,886,8597355,5609,1659714,104379,15.8999996185303,31248,1532806,6994 "40",40,895,736942,5976,133585,9216,14.5,34233,123321,4903 "41",41,838,2118732,3736,615774,35877,17.2000007629395,25623,567133,30784 "42",42,1041,427522,3581,126910,8260,15.3999996185303,20530,119400,9378 "43",43,1009,2668341,3491,821580,42657,19.2999992370605,25619,764354,29817 "44",44,877,11761447,3877,3283707,196616,16.7000007629395,26527,3033684,152835 "45",45,1036,1040104,2579,43119,17602,24.5,22852,403294,18776 "46",46,905,485226,5481,93381,6852,13.6000003814697,27092,88532,3147 "47",47,902,4151050,4539,982393,60883,16.1000003814697,28967,914445,52214 "48",48,939,3204265,4352,790918,38780,20.3999996185303,29199,736345,41840 "49",49,939,1202486,3883,335912,22177,15.1000003814697,21904,309691,17170 "50",50,1013,3688311,5266,774857,48541,16,30779,700389,39970 "51",51,978,491930,5375,97793,6693,14.6000003814697,27685,91515,7566 ggobi-2.1.12/data/eies.xml0000644000175000017500000001374314651527764010756 This is a subset of the "EIES data" found here: http://www.heinz.cmu.edu/project/INSNA/data_inf.html restructured for ggobi. The first dataset is the attributes of 32 people. These variables are described in the Soc.Meth (1990) paper. (So says the original documentation -- I don't know what paper that is, or who the author is.) I'm using only two variables: number of citations and the discipline. The people whose discipline is 4 either have have discipline label, or their label is communications or psychology. To these I've added a position worked out so as to spread the data in some reasonable fashion. (No layout software was used.) The relations included in the original dataset are these: acquaintanceship measured at 2 points in time, and total number of messages sent. 4 - Close personal friend 3 - Friend 2 - Person I've met 1 - Person I've heared of, but not met 0 - Unknown name or no reply In order to have a manageable number of links, I've only included a link where the relationship in each direction at time T1 is 3 or 4, and I've generated two variables from that: a's relationship to b, and b's relationship to a. sociology anthropology math or stat other 37.3016 3.01215 19 1 46.7853 3.93015 3 2 171.074 2.383 170 4 21.8777 0.678101 23 1 -24.0256 2.27322 16 4 -36.2225 2.57315 6 4 -16.4978 1.31467 1 4 -19.1074 0.70932 9 2 -26.355 3.29065 6 2 175.375 1.40247 40 1 49.4986 4.03653 15 1 189.766 0.930237 54 1 -22.2357 1.69516 4 2 138.794 2.46347 46 1 154.934 3.19507 17 1 84.642 2.84387 32 3 125.881 3.41461 23 4 0 3.01947 1 1 22.5989 1.09512 34 1 148.122 0.597626 64 1 90.271 3.87201 11 3 13.6288 1.95856 11 1 160.672 1.98053 31 1 109.747 1.32932 18 1 194.384 3.31216 4 1 5.02197 2.63898 0 1 -26.1786 2.03171 4 3 -23.0606 1.15125 56 1 85 1.89273 12 1 26.5417 4.24142 2 2 21.1618 3.31216 0 4 10.0439 3.91211 1 2 4 4 3 4 3 4 4 4 4 4 3 3 3 3 3 4 4 4 4 3 4 4 4 4 4 4 3 3 3 3 4 4 3 3 3 3 4 4 4 4 3 3 4 3 3 3 3 3 4 3 3 3 3 3 4 3 4 4 3 3 3 3 3 3 4 3 3 3 4 3 3 3 3 4 3 3 3 3 4 4 4 4 3 4 4 3 ggobi-2.1.12/data/tao.csv0000644000175000017500000020372414651527764010607 "","Year","Latitude","Longitude","Sea.Surface.Temp","Air.Temp","Humidity","UWind","VWind" "1",1997,0,-110,27.5900001525879,27.1499996185303,79.5999984741211,-6.40000009536743,5.40000009536743 "2",1997,0,-110,27.5499992370605,27.0200004577637,75.8000030517578,-5.30000019073486,5.30000019073486 "3",1997,0,-110,27.5699996948242,27,76.5,-5.09999990463257,4.5 "4",1997,0,-110,27.6200008392334,26.9300003051758,76.1999969482422,-4.90000009536743,2.5 "5",1997,0,-110,27.6499996185303,26.8400001525879,76.4000015258789,-3.5,4.09999990463257 "6",1997,0,-110,27.8299999237061,26.9400005340576,76.6999969482422,-4.40000009536743,1.60000002384186 "7",1997,0,-110,28.0100002288818,27.0400009155273,76.5,-2,3.5 "8",1997,0,-110,28.0400009155273,27.1100006103516,78.3000030517578,-3.70000004768372,4.5 "9",1997,0,-110,28.0200004577637,27.2099990844727,78.5999984741211,-4.19999980926514,5 "10",1997,0,-110,28.0499992370605,27.25,76.9000015258789,-3.59999990463257,3.5 "11",1997,0,-110,28.0699996948242,27.2299995422363,77.5999984741211,-3.70000004768372,2.90000009536743 "12",1997,0,-110,28.0900001525879,27.3199996948242,77.5,-4.80000019073486,1.79999995231628 "13",1997,0,-110,28.2000007629395,27.3099994659424,80.0999984741211,-3.5,1.89999997615814 "14",1997,0,-110,28.25,26.4400005340576,85.1999969482422,-1,1.79999995231628 "15",1997,0,-110,28.4200000762939,26.7800006866455,79.8000030517578,-1.5,0.899999976158142 "16",1997,0,-110,28.5799999237061,27.4200000762939,76.3000030517578,-2.59999990463257,0.699999988079071 "17",1997,0,-110,28.5200004577637,27.5,81.8000030517578,-4.40000009536743,2.90000009536743 "18",1997,0,-110,28.3500003814697,27.0900001525879,84.5999984741211,-5.80000019073486,3.29999995231628 "19",1997,0,-110,28.2800006866455,27.2900009155273,81.3000030517578,-7.30000019073486,3.79999995231628 "20",1997,0,-110,28.1800003051758,27.0900001525879,84.6999969482422,-6.30000019073486,4.69999980926514 "21",1997,0,-110,28.0599994659424,27.0599994659424,83.9000015258789,-4.80000019073486,6.80000019073486 "22",1997,0,-110,28.0400009155273,27.2800006866455,79.1999969482422,-3.20000004768372,6.69999980926514 "23",1997,0,-110,28.0900001525879,27.2999992370605,77.5,-2.20000004768372,3.5 "24",1997,0,-110,28.1200008392334,27.5100002288818,80.4000015258789,-4.90000009536743,1.89999997615814 "25",1997,0,-110,28.1299991607666,27.5400009155273,82.5,-5.69999980926514,1.5 "26",1997,0,-110,28.1100006103516,27.6200008392334,81.5,-5.30000019073486,2.90000009536743 "27",1997,0,-110,28.1499996185303,27.5100002288818,81,-4.40000009536743,4 "28",1997,0,-110,28.1900005340576,27.6000003814697,80.6999969482422,-5.09999990463257,4.19999980926514 "29",1997,0,-110,28.1700000762939,27.6399993896484,81,-6.59999990463257,2.40000009536743 "30",1997,0,-110,28.2099990844727,27.5599994659424,77,-4.59999990463257,4.19999980926514 "31",1997,0,-110,28.2099990844727,27.5200004577637,76.5,-2.90000009536743,4.30000019073486 "32",1997,0,-110,28.25,26.8099994659424,84.6999969482422,-3,2.59999990463257 "33",1997,0,-110,28.2600002288818,27.0400009155273,86.6999969482422,-5,1.79999995231628 "34",1997,0,-110,28.2299995422363,27.1800003051758,87.1999969482422,-6.30000019073486,2.40000009536743 "35",1997,0,-110,28.3199996948242,27.8400001525879,82.5999984741211,-6.5,4.30000019073486 "36",1997,0,-110,28.0200004577637,25.7600002288818,91.0999984741211,-1.39999997615814,2.90000009536743 "37",1997,0,-110,28.0300006866455,26.3799991607666,86.5999984741211,0,2.29999995231628 "38",1997,0,-110,28.1499996185303,27,87,-1.29999995231628,2.79999995231628 "39",1997,0,-110,28.5200004577637,26.8799991607666,89.3000030517578,-4.09999990463257,3.59999990463257 "40",1997,0,-110,28.4799995422363,26.2900009155273,88.9000015258789,-1.79999995231628,-1.29999995231628 "41",1997,0,-110,28.5599994659424,27.1700000762939,83.8000030517578,-3.59999990463257,3 "42",1997,0,-110,28.5900001525879,27.5,84.5999984741211,-3.90000009536743,4.09999990463257 "43",1997,0,-110,28.4599990844727,26.2199993133545,89.3000030517578,1.20000004768372,3.59999990463257 "44",1997,0,-110,28.4200000762939,27.7800006866455,78.9000015258789,-4,4.69999980926514 "45",1997,0,-110,28.5499992370605,27.6499996185303,78.5,-3.59999990463257,3.20000004768372 "46",1997,0,-110,28.5200004577637,26.5799999237061,85.5999984741211,-2,3.79999995231628 "47",1997,0,-110,28.5100002288818,27.2199993133545,82.0999984741211,-2.40000009536743,3.5 "48",1997,0,-110,28.7199993133545,27.2000007629395,81,-0.899999976158142,0.100000001490116 "49",1997,0,-110,28.9799995422363,27.6800003051758,82.8000030517578,-3.79999995231628,2.20000004768372 "50",1997,0,-110,28.5699996948242,26.5900001525879,89.4000015258789,-4.59999990463257,2.90000009536743 "51",1997,0,-110,28.5,27.2700004577637,87.1999969482422,-5.59999990463257,1.20000004768372 "52",1997,0,-110,28.5300006866455,26.5200004577637,90.3000030517578,-3.59999990463257,-1.10000002384186 "53",1997,0,-110,28.7299995422363,27.6399993896484,87,-2.09999990463257,2.29999995231628 "54",1997,0,-110,29.0200004577637,27.7800006866455,83.4000015258789,-4.09999990463257,-0.100000001490116 "55",1997,0,-110,28.9400005340576,27.2399997711182,86.5,-4.80000019073486,0.899999976158142 "56",1997,0,-110,28.8600006103516,27.3999996185303,86.9000015258789,-6.30000019073486,0.699999988079071 "57",1997,0,-110,28.7800006866455,26.7700004577637,89.8000030517578,-5,0.100000001490116 "58",1997,0,-110,28.8299999237061,27.1499996185303,86.3000030517578,-1.39999997615814,0.5 "59",1997,0,-110,29.0799999237061,27.3099994659424,86.8000030517578,0.200000002980232,1.60000002384186 "60",1997,0,-110,28.9099998474121,27.4899997711182,86.0999984741211,-5.59999990463257,1.5 "61",1997,0,-110,28.7399997711182,27.3099994659424,88.9000015258789,-6.40000009536743,-0.899999976158142 "62",1997,0,-110,28.6499996185303,27.7399997711182,89.3000030517578,-7.19999980926514,-4 "63",1997,0,-110,28.5699996948242,27.6000003814697,90.4000015258789,-7.90000009536743,-2.29999995231628 "64",1997,0,-110,28.5100002288818,28.3700008392334,88,-5.40000009536743,-6.19999980926514 "65",1997,0,-110,28.5900001525879,28.2800006866455,88.0999984741211,0.100000001490116,-4.40000009536743 "66",1997,0,-110,28.4799995422363,26.4200000762939,90.1999969482422,0.800000011920929,2.20000004768372 "67",1997,0,-110,28.6299991607666,27.6299991607666,81.9000015258789,0.100000001490116,2.40000009536743 "68",1997,0,-110,29,28.1000003814697,82.3000030517578,-0.400000005960464,0.899999976158142 "69",1997,0,-110,29.0900001525879,27.2800006866455,87.0999984741211,-2.40000009536743,-1 "70",1997,0,-110,28.7800006866455,27.4200000762939,88.1999969482422,-1.89999997615814,-1.39999997615814 "71",1997,0,-110,28.7600002288818,27.3299999237061,89.5999984741211,-3.09999990463257,-0.400000005960464 "72",1997,0,-110,28.7800006866455,26.9099998474121,88.5,-2.90000009536743,1.60000002384186 "73",1997,0,-110,29.0300006866455,28.0799999237061,86.8000030517578,-3.90000009536743,-1.70000004768372 "74",1997,0,-110,28.7800006866455,26.9799995422363,91.3000030517578,-3.90000009536743,-3.70000004768372 "75",1997,0,-110,28.7600002288818,27.6399993896484,85.8000030517578,-2.40000009536743,-2.40000009536743 "76",1997,0,-110,28.7299995422363,27.1299991607666,89.5999984741211,-1.89999997615814,-0.800000011920929 "77",1997,0,-110,28.6599998474121,26.8299999237061,92.0999984741211,-1.5,3.90000009536743 "78",1997,0,-110,28.7000007629395,27.0599994659424,89.9000015258789,1.79999995231628,0.800000011920929 "79",1997,0,-110,28.8299999237061,27.6800003051758,86,0.800000011920929,-0.699999988079071 "80",1997,0,-110,28.8899993896484,27.8700008392334,86.6999969482422,-3.59999990463257,-0.800000011920929 "81",1997,0,-110,28.8199996948242,27.8400001525879,86.6999969482422,-3.70000004768372,-0.400000005960464 "82",1997,0,-110,28.8999996185303,26.8999996185303,90.9000015258789,-2.79999995231628,-1.70000004768372 "83",1997,0,-110,29.0400009155273,27.5499992370605,89,-4.09999990463257,-1.60000002384186 "84",1997,0,-110,29.0599994659424,27.5200004577637,88,-1.29999995231628,-0.699999988079071 "85",1997,0,-110,29,27.2800006866455,90.0999984741211,-3.09999990463257,0.5 "86",1997,0,-110,29.0400009155273,27.8099994659424,87.5999984741211,-2.79999995231628,-1.5 "87",1997,0,-110,29.2199993133545,28.3999996185303,85.3000030517578,-2.90000009536743,-1.70000004768372 "88",1997,0,-110,29.3299999237061,27.6700000762939,89.6999969482422,-0.899999976158142,2.09999990463257 "89",1997,0,-110,29.2900009155273,27.9500007629395,88.1999969482422,-0.300000011920929,0.300000011920929 "90",1997,0,-110,29.4099998474121,27.7800006866455,89.9000015258789,-2.5,-1.5 "91",1997,0,-110,29.3299999237061,28.2999992370605,89.0999984741211,-3.09999990463257,-1.20000004768372 "92",1997,0,-110,29.5499992370605,28.3299999237061,87.5999984741211,-3.29999995231628,-1.29999995231628 "93",1997,0,-95,26.7900009155273,26.3899993896484,79.4000015258789,-4.5,4.90000009536743 "94",1997,0,-95,26.6800003051758,26.1900005340576,77.6999969482422,-3.59999990463257,6 "95",1997,0,-95,26.6200008392334,26.1499996185303,78.4000015258789,-2.59999990463257,6.09999990463257 "96",1997,0,-95,26.5900001525879,26.3899993896484,80.5,-2.40000009536743,5 "97",1997,0,-95,26.6399993896484,26.2700004577637,81.9000015258789,-2.90000009536743,6.90000009536743 "98",1997,0,-95,26.6900005340576,26.3500003814697,78.4000015258789,-2.29999995231628,6.40000009536743 "99",1997,0,-95,26.8500003814697,26.1499996185303,75.9000015258789,-1.20000004768372,4.5 "100",1997,0,-95,26.9099998474121,25.8299999237061,78.4000015258789,0.899999976158142,4 "101",1997,0,-95,27.0300006866455,26.2700004577637,73.8000030517578,0.200000002980232,5.09999990463257 "102",1997,0,-95,27.2399997711182,26.3099994659424,73.5,-1.10000002384186,3.90000009536743 "103",1997,0,-95,27.4599990844727,26.5900001525879,75.5999984741211,-0.600000023841858,3.40000009536743 "104",1997,0,-95,27.4899997711182,26.8700008392334,78.6999969482422,-1.89999997615814,5.40000009536743 "105",1997,0,-95,27.3999996185303,26.6299991607666,81.5999984741211,-2.79999995231628,5.30000019073486 "106",1997,0,-95,27.6200008392334,26.6700000762939,79.4000015258789,-3,5.30000019073486 "107",1997,0,-95,27.7299995422363,26.7900009155273,78,-3.59999990463257,6 "108",1997,0,-95,27.6900005340576,NA,79.8000030517578,-0.600000023841858,4.19999980926514 "109",1997,0,-95,27.6299991607666,NA,74.5,-3.90000009536743,5.80000019073486 "110",1997,0,-95,27.5100002288818,NA,76.3000030517578,-2.79999995231628,5.30000019073486 "111",1997,0,-95,27.5400009155273,NA,81.5999984741211,-2.29999995231628,5.59999990463257 "112",1997,0,-95,27.4699993133545,NA,81.9000015258789,-4.59999990463257,6.09999990463257 "113",1997,0,-95,27.4400005340576,NA,74.1999969482422,-4.40000009536743,6.5 "114",1997,0,-95,27.4500007629395,NA,72.0999984741211,-2.59999990463257,6.09999990463257 "115",1997,0,-95,27.5200004577637,NA,72.4000015258789,-0.100000001490116,4.90000009536743 "116",1997,0,-95,27.4899997711182,NA,81.5999984741211,1.29999995231628,2.70000004768372 "117",1997,0,-95,27.6000003814697,NA,74.5,-1,5.5 "118",1997,0,-95,27.5900001525879,NA,73.8000030517578,-0.699999988079071,6.19999980926514 "119",1997,0,-95,27.5599994659424,NA,75.5999984741211,-1.60000002384186,6.09999990463257 "120",1997,0,-95,27.5300006866455,NA,75.9000015258789,-2.20000004768372,7.19999980926514 "121",1997,0,-95,27.5499992370605,NA,76.5999984741211,-2.70000004768372,6.5 "122",1997,0,-95,27.6000003814697,NA,80.1999969482422,0.100000001490116,6.09999990463257 "123",1997,0,-95,27.6000003814697,NA,81.9000015258789,-1.20000004768372,4.90000009536743 "124",1997,0,-95,27.6100006103516,NA,83,-2.90000009536743,4.30000019073486 "125",1997,0,-95,27.7000007629395,NA,80.9000015258789,-5.30000019073486,4.59999990463257 "126",1997,0,-95,27.75,NA,78.4000015258789,-4.40000009536743,5.09999990463257 "127",1997,0,-95,27.8099994659424,NA,83,-4.69999980926514,2.70000004768372 "128",1997,0,-95,27.8700008392334,NA,84.4000015258789,-4.5,2.40000009536743 "129",1997,0,-95,27.9699993133545,NA,84,-4.09999990463257,2.79999995231628 "130",1997,0,-95,28.0300006866455,NA,83.3000030517578,-2.90000009536743,3.5 "131",1997,0,-95,27.9699993133545,NA,83,-3.5,4.40000009536743 "132",1997,0,-95,28.1399993896484,NA,82.3000030517578,-4.09999990463257,4.69999980926514 "133",1997,0,-95,28.0200004577637,NA,85.0999984741211,-1.5,1.39999997615814 "134",1997,0,-95,27.9300003051758,NA,79.4000015258789,-3.40000009536743,4.19999980926514 "135",1997,0,-95,28,NA,79.8000030517578,-3,4.09999990463257 "136",1997,0,-95,28.0100002288818,NA,84.4000015258789,-2.09999990463257,4.40000009536743 "137",1997,0,-95,27.9099998474121,NA,87.5,0.200000002980232,1.29999995231628 "138",1997,0,-95,27.8899993896484,NA,83.3000030517578,-0.100000001490116,2.20000004768372 "139",1997,0,-95,28.1499996185303,NA,82.3000030517578,-2,2.79999995231628 "140",1997,0,-95,28.4699993133545,NA,81.5999984741211,-2.29999995231628,1.29999995231628 "141",1997,0,-95,28.6100006103516,NA,79.0999984741211,-4,0.899999976158142 "142",1997,0,-95,28.7399997711182,NA,78.6999969482422,-4.59999990463257,-0.800000011920929 "143",1997,0,-95,28.7399997711182,NA,80.5,-4.69999980926514,1.20000004768372 "144",1997,0,-95,28.8299999237061,NA,80.5,-4,1.10000002384186 "145",1997,0,-95,28.7900009155273,NA,85.0999984741211,-4.90000009536743,0.100000001490116 "146",1997,0,-95,28.3299999237061,NA,88.9000015258789,-1.60000002384186,1 "147",1997,0,-95,28.2099990844727,NA,84.6999969482422,2.09999990463257,-0.600000023841858 "148",1997,0,-95,28.4099998474121,NA,79.4000015258789,-2.29999995231628,1.5 "149",1997,0,-95,28.7399997711182,NA,73.8000030517578,-1.5,0.200000002980232 "150",1997,0,-95,28.9300003051758,NA,82.3000030517578,0.600000023841858,2.59999990463257 "151",1997,0,-95,28.5499992370605,NA,84.4000015258789,1.60000002384186,-1 "152",1997,0,-95,28.75,NA,84,0.200000002980232,2.70000004768372 "153",1997,0,-95,28.75,NA,81.9000015258789,-3.40000009536743,2.09999990463257 "154",1997,0,-95,28.9500007629395,NA,80.5,-5.19999980926514,-3.40000009536743 "155",1997,0,-95,28.8299999237061,NA,79.0999984741211,-5.30000019073486,-4.40000009536743 "156",1997,0,-95,28.7199993133545,NA,80.1999969482422,-5.19999980926514,-3.40000009536743 "157",1997,0,-95,28.5400009155273,NA,82.5999984741211,-2.70000004768372,-1.60000002384186 "158",1997,0,-95,28.25,NA,84.6999969482422,1.89999997615814,1.79999995231628 "159",1997,0,-95,28.3600006103516,NA,86.0999984741211,4.30000019073486,1.10000002384186 "160",1997,0,-95,28.2099990844727,NA,85.8000030517578,2.70000004768372,1.60000002384186 "161",1997,0,-95,28.1399993896484,NA,86.5,-1.89999997615814,-2.20000004768372 "162",1997,0,-95,28.6100006103516,NA,80.5,-2.90000009536743,-1.79999995231628 "163",1997,0,-95,28.9200000762939,NA,80.9000015258789,-3,-0.600000023841858 "164",1997,0,-95,28.9099998474121,NA,80.5,-2.20000004768372,-2.90000009536743 "165",1997,0,-95,29.2299995422363,NA,78.4000015258789,0.100000001490116,-2.5 "166",1997,0,-95,29.3500003814697,NA,79.0999984741211,-2.70000004768372,-1.79999995231628 "167",1997,0,-95,29.3899993896484,NA,77.3000030517578,-3.20000004768372,-4.40000009536743 "168",1997,0,-95,29.2399997711182,NA,80.5,-2.90000009536743,-3.40000009536743 "169",1997,0,-95,29.1399993896484,NA,79.4000015258789,-1.5,0 "170",1997,0,-95,29.1399993896484,NA,82.3000030517578,-1.29999995231628,-4.09999990463257 "171",1997,0,-95,29,NA,75.5999984741211,-0.699999988079071,-2.79999995231628 "172",1997,0,-95,29.3799991607666,NA,77,-2.29999995231628,-1.29999995231628 "173",1997,0,-95,29.5699996948242,NA,79.0999984741211,-2,1.70000004768372 "174",1997,0,-95,29.6499996185303,NA,77,-2,0.800000011920929 "175",1997,0,-95,29.8899993896484,NA,74.5,-3,-0.200000002980232 "176",1997,0,-95,30.1700000762939,NA,77.6999969482422,-1.39999997615814,0.699999988079071 "177",1997,0,-95,29.9500007629395,NA,78,0.899999976158142,-4 "178",1997,0,-95,29.6299991607666,NA,76.3000030517578,-0.400000005960464,-3.90000009536743 "179",1997,0,-95,29.5599994659424,NA,79.0999984741211,-2.29999995231628,0.400000005960464 "180",1997,0,-95,29.4400005340576,NA,83,-0.200000002980232,2 "181",1997,0,-95,29.4799995422363,NA,84,1.89999997615814,-1.20000004768372 "182",1997,0,-95,29.4300003051758,NA,81.1999969482422,-0.400000005960464,0.5 "183",1997,0,-95,29.3799991607666,NA,79.8000030517578,-3.90000009536743,2.59999990463257 "184",1997,0,-95,29.2099990844727,NA,79.4000015258789,-4.09999990463257,-1.10000002384186 "185",1997,-5,-95,26.6000003814697,25.4699993133545,82.3000030517578,-6.80000019073486,5.09999990463257 "186",1997,-5,-95,26.6499996185303,25.6299991607666,79.9000015258789,-5.80000019073486,5.19999980926514 "187",1997,-5,-95,26.6700000762939,25.2000007629395,85.6999969482422,-5.19999980926514,5.30000019073486 "188",1997,-5,-95,26.5900001525879,25.4699993133545,85.1999969482422,-5.40000009536743,4.09999990463257 "189",1997,-5,-95,26.4799995422363,25.8199996948242,81.9000015258789,-5.09999990463257,5 "190",1997,-5,-95,26.5499992370605,25.7800006866455,79,-3.40000009536743,4.40000009536743 "191",1997,-5,-95,26.6399993896484,25.7399997711182,77.4000015258789,-3.20000004768372,4.19999980926514 "192",1997,-5,-95,26.8299999237061,25.7399997711182,76.0999984741211,-1.10000002384186,3.70000004768372 "193",1997,-5,-95,26.8299999237061,25.8600006103516,78.1999969482422,-3.09999990463257,3.59999990463257 "194",1997,-5,-95,26.7800006866455,25.8600006103516,81.5,-4.90000009536743,3.59999990463257 "195",1997,-5,-95,26.8199996948242,26.0100002288818,81.0999984741211,-4.80000019073486,4 "196",1997,-5,-95,26.8199996948242,25.9699993133545,82.8000030517578,-5.5,4.69999980926514 "197",1997,-5,-95,26.7999992370605,26.1299991607666,84,-5.5,6.09999990463257 "198",1997,-5,-95,26.7800006866455,25.7800006866455,84,-6.5,3.70000004768372 "199",1997,-5,-95,26.7700004577637,26.0900001525879,80.6999969482422,-6.30000019073486,4.59999990463257 "200",1997,-5,-95,26.8099994659424,25.9699993133545,79,-4.59999990463257,4 "201",1997,-5,-95,26.8899993896484,26.0499992370605,79.4000015258789,-6,3.20000004768372 "202",1997,-5,-95,26.9099998474121,26.1299991607666,79.9000015258789,-5.80000019073486,4 "203",1997,-5,-95,26.8999996185303,26.3199996948242,82.8000030517578,-5.5,5.90000009536743 "204",1997,-5,-95,26.8899993896484,26.0499992370605,81.0999984741211,-6.5,4.90000009536743 "205",1997,-5,-95,26.8999996185303,25.8199996948242,80.6999969482422,-5.40000009536743,4.09999990463257 "206",1997,-5,-95,26.9300003051758,26.2000007629395,78.1999969482422,-5.30000019073486,2.70000004768372 "207",1997,-5,-95,27.0499992370605,26.4400005340576,79,-3,4.40000009536743 "208",1997,-5,-95,27.1100006103516,26.3600006103516,81.0999984741211,-3.59999990463257,4 "209",1997,-5,-95,27.1100006103516,26.1299991607666,79.9000015258789,-4.09999990463257,3.90000009536743 "210",1997,-5,-95,27.1200008392334,26.2800006866455,79.4000015258789,-4,4.5 "211",1997,-5,-95,27.1100006103516,26.4400005340576,77.8000030517578,-5.19999980926514,4.09999990463257 "212",1997,-5,-95,27.1399993896484,26.4699993133545,72.8000030517578,-5.09999990463257,3.70000004768372 "213",1997,-5,-95,27.1599998474121,26.4699993133545,77,-5.69999980926514,3.5 "214",1997,-5,-95,27.1900005340576,26.5100002288818,79,-5.19999980926514,4.09999990463257 "215",1997,-5,-95,27.2299995422363,26.6700000762939,83.1999969482422,-5.09999990463257,4.69999980926514 "216",1997,-5,-95,27.2800006866455,26.6700000762939,84,-6.09999990463257,4.59999990463257 "217",1997,-5,-95,27.3299999237061,26.6700000762939,81.9000015258789,-6,4.19999980926514 "218",1997,-5,-95,27.3999996185303,26.6700000762939,80.6999969482422,-6,2.79999995231628 "219",1997,-5,-95,27.5300006866455,26.9799995422363,78.5999984741211,-5.09999990463257,3.70000004768372 "220",1997,-5,-95,27.5699996948242,26.9799995422363,82.3000030517578,-5.30000019073486,4.69999980926514 "221",1997,-5,-95,27.5900001525879,26.8600006103516,82.8000030517578,-4.19999980926514,5.5 "222",1997,-5,-95,27.6100006103516,27.0499992370605,84,-4.09999990463257,5.09999990463257 "223",1997,-5,-95,27.5699996948242,27.0499992370605,85.6999969482422,-4.90000009536743,4.80000019073486 "224",1997,-5,-95,27.5599994659424,27.1299991607666,86.9000015258789,-5.5,3.70000004768372 "225",1997,-5,-95,27.5599994659424,27.0900001525879,83.5999984741211,-5,5.19999980926514 "226",1997,-5,-95,27.6000003814697,26.8600006103516,84,-5.19999980926514,4.09999990463257 "227",1997,-5,-95,27.6100006103516,26.8600006103516,85.1999969482422,-4.69999980926514,3.79999995231628 "228",1997,-5,-95,27.5599994659424,27.0100002288818,83.1999969482422,-5.5,5.09999990463257 "229",1997,-5,-95,27.5699996948242,26.9799995422363,82.3000030517578,-4.90000009536743,6 "230",1997,-5,-95,27.6000003814697,26.9400005340576,78.5999984741211,-5,5.19999980926514 "231",1997,-5,-95,27.6200008392334,26.8600006103516,85.1999969482422,-4.40000009536743,5.5 "232",1997,-5,-95,27.6100006103516,26.9799995422363,84.8000030517578,-3.5,5.80000019073486 "233",1997,-5,-95,27.5900001525879,26.7099990844727,86.5,-4.90000009536743,5 "234",1997,-5,-95,27.6599998474121,26.7399997711182,90.5999984741211,-4.69999980926514,2.59999990463257 "235",1997,-5,-95,27.6800003051758,27.1700000762939,88.0999984741211,-6.59999990463257,3.09999990463257 "236",1997,-5,-95,27.6399993896484,26.9400005340576,87.6999969482422,-7.90000009536743,4.5 "237",1997,-5,-95,27.6000003814697,27.2099990844727,81.5,-6.90000009536743,3.70000004768372 "238",1997,-5,-95,27.6299991607666,27.1299991607666,79.4000015258789,-4.69999980926514,4.80000019073486 "239",1997,-5,-95,27.6599998474121,27.0499992370605,81.9000015258789,-4.30000019073486,3.70000004768372 "240",1997,-5,-95,27.6499996185303,27.1299991607666,86.9000015258789,-5.5,3.90000009536743 "241",1997,-5,-95,27.5900001525879,27.2800006866455,86.9000015258789,-5.90000009536743,4.80000019073486 "242",1997,-5,-95,27.6000003814697,27.0900001525879,84.8000030517578,-5.19999980926514,5.30000019073486 "243",1997,-5,-95,27.6000003814697,27.0499992370605,77,-4.30000019073486,5.09999990463257 "244",1997,-5,-95,27.5499992370605,27.0499992370605,79,-5.30000019073486,3.5 "245",1997,-5,-95,27.5499992370605,26.8600006103516,87.3000030517578,-6.09999990463257,3.79999995231628 "246",1997,-5,-95,27.6599998474121,26.8999996185303,91.9000015258789,-6.30000019073486,2.40000009536743 "247",1997,-5,-95,27.7099990844727,27.3999996185303,91,-6.09999990463257,3.59999990463257 "248",1997,-5,-95,27.7999992370605,27.3999996185303,88.0999984741211,-7.09999990463257,3.70000004768372 "249",1997,-5,-95,27.9099998474121,27.3600006103516,82.8000030517578,-5.19999980926514,4.5 "250",1997,-5,-95,28.1100006103516,27.3199996948242,81.9000015258789,-2.59999990463257,4.30000019073486 "251",1997,-5,-95,28.2099990844727,27.6700000762939,83.5999984741211,-2.59999990463257,4.30000019073486 "252",1997,-5,-95,28.2800006866455,27.6299991607666,83.5999984741211,-3.70000004768372,3.70000004768372 "253",1997,-5,-95,28.3199996948242,27.4799995422363,86.9000015258789,-4.90000009536743,2.79999995231628 "254",1997,-5,-95,28.3500003814697,27.4799995422363,88.5999984741211,-5.69999980926514,3.5 "255",1997,-5,-95,28.3899993896484,27.6299991607666,90.1999969482422,-6.69999980926514,3.5 "256",1997,-5,-95,28.3600006103516,27.1299991607666,90.5999984741211,-4.5,4.59999990463257 "257",1997,-5,-95,28.2299995422363,26.7399997711182,91,-3.09999990463257,5 "258",1997,-5,-95,28.2600002288818,27.6299991607666,83.1999969482422,-5.19999980926514,4.09999990463257 "259",1997,-5,-95,28.3099994659424,27.3600006103516,85.6999969482422,-3.70000004768372,2.59999990463257 "260",1997,-5,-95,28.4300003051758,27.75,88.0999984741211,-4,2.90000009536743 "261",1997,-5,-95,28.6000003814697,27.6700000762939,89,-0.800000011920929,3.09999990463257 "262",1997,-5,-95,28.6299991607666,27.0900001525879,92.6999969482422,-3.29999995231628,1.39999997615814 "263",1997,-5,-95,28.0499992370605,25.6599998474121,94.8000030517578,-1,0.800000011920929 "264",1997,-5,-95,28.3299999237061,27.2099990844727,88.0999984741211,-4.59999990463257,4 "265",1997,-5,-95,28.4699993133545,27.4799995422363,83.5999984741211,-4.19999980926514,5.69999980926514 "266",1997,-5,-95,28.3500003814697,26.8999996185303,89.4000015258789,-4.40000009536743,5.19999980926514 "267",1997,-5,-95,28.2399997711182,27.2800006866455,90.5999984741211,-3.5,6 "268",1997,-5,-95,28.1599998474121,27.2800006866455,91.9000015258789,-4.5,6.19999980926514 "269",1997,-5,-95,27.9500007629395,26.5499992370605,94.8000030517578,-1.70000004768372,5 "270",1997,-5,-95,28.1100006103516,26.7099990844727,90.5999984741211,-0.5,3.40000009536743 "271",1997,-5,-95,28.2600002288818,27.7900009155273,88.0999984741211,-2.59999990463257,5.30000019073486 "272",1997,-5,-95,28.3199996948242,27.5599994659424,92.6999969482422,-3.59999990463257,3 "273",1997,-5,-95,28.3999996185303,27.5900001525879,92.6999969482422,-3.5,1.39999997615814 "274",1997,-5,-95,28.6100006103516,27.7900009155273,89,-3.79999995231628,1.79999995231628 "275",1997,-5,-95,28.5799999237061,28.1700000762939,87.3000030517578,-4.30000019073486,5.69999980926514 "276",1997,-5,-95,28.9400005340576,28.1000003814697,90.1999969482422,-4.5,4.59999990463257 "277",1997,-2,-110,27.5499992370605,27.1900005340576,75.5,-6.80000019073486,4.59999990463257 "278",1997,-2,-110,27.5300006866455,26.8700008392334,75.0999984741211,-5.19999980926514,4.90000009536743 "279",1997,-2,-110,27.5100002288818,26.9899997711182,73.5999984741211,-5.69999980926514,4.19999980926514 "280",1997,-2,-110,27.5699996948242,26.9899997711182,73.5999984741211,-4.69999980926514,1.79999995231628 "281",1997,-2,-110,27.6399993896484,26.9500007629395,75.0999984741211,-3.59999990463257,3.70000004768372 "282",1997,-2,-110,27.6599998474121,26.9899997711182,74,-4.40000009536743,2.40000009536743 "283",1997,-2,-110,27.7800006866455,26.9899997711182,74.4000015258789,-1.79999995231628,3.29999995231628 "284",1997,-2,-110,27.75,27.1100006103516,75.9000015258789,-3.70000004768372,4.30000019073486 "285",1997,-2,-110,27.7099990844727,26.8700008392334,75.5,-4.30000019073486,4.40000009536743 "286",1997,-2,-110,27.8199996948242,27.1499996185303,74.6999969482422,-3.5,3.09999990463257 "287",1997,-2,-110,28,27.2299995422363,76.6999969482422,-4.5,3 "288",1997,-2,-110,28.0699996948242,27.2700004577637,79,-4.80000019073486,2.59999990463257 "289",1997,-2,-110,28.0699996948242,26.9099998474121,82.9000015258789,-3.79999995231628,3.5 "290",1997,-2,-110,27.9599990844727,25.8899993896484,86.4000015258789,-2.59999990463257,3.40000009536743 "291",1997,-2,-110,28.0100002288818,26.8299999237061,82.5,-4.19999980926514,1.5 "292",1997,-2,-110,28.2399997711182,27.1499996185303,82.9000015258789,-4.40000009536743,2.79999995231628 "293",1997,-2,-110,28.2600002288818,26.7600002288818,83.6999969482422,-5.90000009536743,4.40000009536743 "294",1997,-2,-110,28.1800003051758,27.2700004577637,77.8000030517578,-6.09999990463257,5.5 "295",1997,-2,-110,28.1200008392334,27.3099994659424,77.0999984741211,-7.40000009536743,4.59999990463257 "296",1997,-2,-110,28.0499992370605,27.3500003814697,77.0999984741211,-6.5,6.5 "297",1997,-2,-110,27.9899997711182,27.1100006103516,78.5999984741211,-5.19999980926514,7.30000019073486 "298",1997,-2,-110,27.9300003051758,26.9899997711182,74.4000015258789,-3.20000004768372,5.90000009536743 "299",1997,-2,-110,28,27.3099994659424,74.6999969482422,-2.29999995231628,2.90000009536743 "300",1997,-2,-110,28.0300006866455,27.7000007629395,78.1999969482422,-5.09999990463257,2.90000009536743 "301",1997,-2,-110,28.0499992370605,27.8600006103516,80.1999969482422,-5.80000019073486,1.5 "302",1997,-2,-110,28.0699996948242,27.5100002288818,79.4000015258789,-5.40000009536743,4.59999990463257 "303",1997,-2,-110,28.0799999237061,27.6299991607666,77.8000030517578,-4.5,4.40000009536743 "304",1997,-2,-110,28.0799999237061,27.5900001525879,77.0999984741211,-5.30000019073486,4.30000019073486 "305",1997,-2,-110,28.0699996948242,27.5499992370605,77.5,-6.90000009536743,4.40000009536743 "306",1997,-2,-110,28.0900001525879,27.7399997711182,71.5999984741211,-5.40000009536743,3.90000009536743 "307",1997,-2,-110,28.1299991607666,27.3500003814697,74.6999969482422,-3.59999990463257,4.69999980926514 "308",1997,-2,-110,28.1000003814697,27.4699993133545,81.3000030517578,-4.80000019073486,5.09999990463257 "309",1997,-2,-110,28.0699996948242,27.4300003051758,83.6999969482422,-5.90000009536743,4.40000009536743 "310",1997,-2,-110,28.1000003814697,27.8199996948242,82.9000015258789,-6.80000019073486,4.59999990463257 "311",1997,-2,-110,28.1000003814697,27.7399997711182,78.5999984741211,-6,5 "312",1997,-2,-110,28.0799999237061,27.0699996948242,83.6999969482422,-1.70000004768372,6.09999990463257 "313",1997,-2,-110,28.0499992370605,26.1200008392334,85.5999984741211,0.699999988079071,3 "314",1997,-2,-110,28.1200008392334,26.6800003051758,86.8000030517578,-4,5 "315",1997,-2,-110,28.1700000762939,27.7000007629395,81.6999969482422,-4.80000019073486,5.09999990463257 "316",1997,-2,-110,28.2800006866455,27.3099994659424,81.6999969482422,-5.19999980926514,3.70000004768372 "317",1997,-2,-110,28.2600002288818,27.0300006866455,82.9000015258789,-4.19999980926514,4.59999990463257 "318",1997,-2,-110,28.3600006103516,27.8199996948242,79.4000015258789,-3.20000004768372,5.90000009536743 "319",1997,-2,-110,28.3700008392334,27.8199996948242,76.3000030517578,-2.40000009536743,5.80000019073486 "320",1997,-2,-110,28.3400001525879,27.6700000762939,75.9000015258789,-4.69999980926514,4.5 "321",1997,-2,-110,28.3700008392334,27.7800006866455,78.5999984741211,-3.79999995231628,3.70000004768372 "322",1997,-2,-110,28.2999992370605,26.3600006103516,85.1999969482422,-1.5,3.90000009536743 "323",1997,-2,-110,28.2900009155273,27.5100002288818,82.0999984741211,-3.29999995231628,4.09999990463257 "324",1997,-2,-110,28.3500003814697,27.2700004577637,84.4000015258789,-3.59999990463257,4.90000009536743 "325",1997,-2,-110,28.3099994659424,27.8199996948242,80.1999969482422,-4.5,6.59999990463257 "326",1997,-2,-110,28.2999992370605,27.6299991607666,82.0999984741211,-4.90000009536743,5.30000019073486 "327",1997,-2,-110,28.2700004577637,27.5100002288818,84,-5.59999990463257,4.59999990463257 "328",1997,-2,-110,28.25,27.2700004577637,87.5,-5.59999990463257,3.59999990463257 "329",1997,-2,-110,28.2399997711182,27.1499996185303,87.5,-4.5,1.10000002384186 "330",1997,-2,-110,28.2999992370605,26.7900009155273,87.5,-5.90000009536743,2 "331",1997,-2,-110,28.3400001525879,27.5900001525879,83.6999969482422,-4.59999990463257,2.40000009536743 "332",1997,-2,-110,28.3799991607666,28.1399993896484,80.9000015258789,-6.59999990463257,2.70000004768372 "333",1997,-2,-110,28.4300003051758,27.9799995422363,81.3000030517578,-6,5 "334",1997,-2,-110,28.4099998474121,26.8299999237061,87.0999984741211,-4.90000009536743,3.29999995231628 "335",1997,-2,-110,28.5100002288818,27.2299995422363,84.4000015258789,-3,2.59999990463257 "336",1997,-2,-110,28.5599994659424,27.8999996185303,82.5,-6.5,4.09999990463257 "337",1997,-2,-110,28.4500007629395,27.7800006866455,81.6999969482422,-7.59999990463257,2.59999990463257 "338",1997,-2,-110,28.4300003051758,27.7399997711182,86.8000030517578,-7.5,0.800000011920929 "339",1997,-2,-110,28.4699993133545,27.9400005340576,86.8000030517578,-8.10000038146973,1.89999997615814 "340",1997,-2,-110,28.5200004577637,27.8999996185303,86.8000030517578,-7.59999990463257,-1.5 "341",1997,-2,-110,28.4500007629395,26.5200004577637,89.5,-2.59999990463257,0.600000023841858 "342",1997,-2,-110,28.4799995422363,27.0300006866455,84.4000015258789,-1.29999995231628,1.20000004768372 "343",1997,-2,-110,28.4400005340576,27.8199996948242,80.1999969482422,-1.10000002384186,2.79999995231628 "344",1997,-2,-110,28.6100006103516,27.7800006866455,83.6999969482422,-3.29999995231628,2.20000004768372 "345",1997,-2,-110,28.6700000762939,28.0599994659424,80.9000015258789,-4.80000019073486,4.69999980926514 "346",1997,-2,-110,28.7900009155273,27.5499992370605,85.1999969482422,-4.30000019073486,0.899999976158142 "347",1997,-2,-110,28.8099994659424,27.6700000762939,83.3000030517578,-3.20000004768372,1.60000002384186 "348",1997,-2,-110,28.5699996948242,26.7600002288818,83.6999969482422,-3.5,-0.100000001490116 "349",1997,-2,-110,28.8099994659424,27.7000007629395,84.4000015258789,-3.70000004768372,0.800000011920929 "350",1997,-2,-110,28.7700004577637,27.8199996948242,83.6999969482422,-4.69999980926514,2.20000004768372 "351",1997,-2,-110,28.8700008392334,26.3600006103516,89.9000015258789,-2,1.39999997615814 "352",1997,-2,-110,28.8899993896484,27.0699996948242,86.8000030517578,-3,4.80000019073486 "353",1997,-2,-110,28.9300003051758,27.7000007629395,82.5,-2.09999990463257,6.09999990463257 "354",1997,-2,-110,28.9500007629395,27.2700004577637,86.4000015258789,-1.79999995231628,1.60000002384186 "355",1997,-2,-110,29.1200008392334,27.4300003051758,85.5999984741211,0.400000005960464,-0.899999976158142 "356",1997,-2,-110,29.1000003814697,27.5100002288818,81.3000030517578,-2.59999990463257,-0.899999976158142 "357",1997,-2,-110,29.1299991607666,27.7800006866455,81.3000030517578,-3.5,2.29999995231628 "358",1997,-2,-110,29.2800006866455,28.5,79.8000030517578,-4.90000009536743,0.800000011920929 "359",1997,-2,-110,29.0100002288818,27.5900001525879,86.8000030517578,-6.80000019073486,3.70000004768372 "360",1997,-2,-110,28.7700004577637,26.7900009155273,89.0999984741211,-4.30000019073486,0.699999988079071 "361",1997,-2,-110,28.7099990844727,27.1100006103516,84.8000030517578,-3.09999990463257,0.899999976158142 "362",1997,-2,-110,29.0300006866455,27.7800006866455,83.6999969482422,-3.79999995231628,0.400000005960464 "363",1997,-2,-110,28.9899997711182,27.4300003051758,86.4000015258789,-1.29999995231628,3 "364",1997,-2,-110,28.9200000762939,27.4699993133545,86,-1.39999997615814,3.40000009536743 "365",1997,-2,-110,28.9099998474121,27.1900005340576,89.5,-4,3.79999995231628 "366",1997,-2,-110,28.8799991607666,27.0699996948242,89.5,-3.5,1 "367",1997,-2,-110,29.0799999237061,28.1800003051758,85.5999984741211,-3.20000004768372,0.5 "368",1997,-2,-110,29.3199996948242,27.8999996185303,87.0999984741211,-5,2.5 "369",1993,0,-110,23.5900001525879,23.1000003814697,81.1999969482422,-2.20000004768372,3.40000009536743 "370",1993,0,-110,23.5699996948242,23.1499996185303,81.6999969482422,-2.5,4.59999990463257 "371",1993,0,-110,23.6700000762939,23.1499996185303,82,-5.80000019073486,4 "372",1993,0,-110,23.4300003051758,23.2000007629395,80.8000030517578,-6.69999980926514,2.79999995231628 "373",1993,0,-110,23.4200000762939,23.1299991607666,83.5,-5.69999980926514,3.09999990463257 "374",1993,0,-110,23.4300003051758,22.9899997711182,81.5999984741211,-5.59999990463257,4.19999980926514 "375",1993,0,-110,23.4899997711182,22.8999996185303,80.6999969482422,-5.30000019073486,4.09999990463257 "376",1993,0,-110,23.4899997711182,22.8299999237061,81.5,-6.19999980926514,2.5 "377",1993,0,-110,23.2399997711182,22.6599998474121,85.9000015258789,-5.30000019073486,3.70000004768372 "378",1993,0,-110,22.75,22.3799991607666,88.5999984741211,-3.59999990463257,4.80000019073486 "379",1993,0,-110,22.3299999237061,22.2099990844727,88.6999969482422,-2.20000004768372,4.59999990463257 "380",1993,0,-110,22.2800006866455,22.0900001525879,87.5,-2.79999995231628,2.5 "381",1993,0,-110,22.2299995422363,22.2199993133545,87.5,-2.40000009536743,3.40000009536743 "382",1993,0,-110,22.2399997711182,22.1100006103516,88.3000030517578,-2.79999995231628,2.59999990463257 "383",1993,0,-110,22.4599990844727,22.3199996948242,84.1999969482422,-5.19999980926514,2.40000009536743 "384",1993,0,-110,22.4899997711182,22.1800003051758,85.5,-4.40000009536743,2.29999995231628 "385",1993,0,-110,22.5100002288818,22.4699993133545,85.3000030517578,-4.09999990463257,3.59999990463257 "386",1993,0,-110,22.5200004577637,22.2399997711182,85.5999984741211,-4.30000019073486,2.40000009536743 "387",1993,0,-110,22.4899997711182,22.2700004577637,86.1999969482422,-4.19999980926514,2.70000004768372 "388",1993,0,-110,22.3799991607666,22.0599994659424,87.1999969482422,-4.59999990463257,2.29999995231628 "389",1993,0,-110,22.3899993896484,22.0900001525879,87.5,-5,2.29999995231628 "390",1993,0,-110,22.8199996948242,22.3700008392334,86,-4.59999990463257,2.70000004768372 "391",1993,0,-110,23.4099998474121,22.7000007629395,81.0999984741211,-5.90000009536743,1.79999995231628 "392",1993,0,-110,23.9300003051758,22.7299995422363,79.9000015258789,-4.80000019073486,2.70000004768372 "393",1993,0,-110,24.6700000762939,22.9400005340576,80.3000030517578,-5.09999990463257,4.90000009536743 "394",1993,0,-110,23.9699993133545,22.9200000762939,81.5999984741211,-4.40000009536743,2.5 "395",1993,0,-110,23.1000003814697,23.0200004577637,84.4000015258789,-2.79999995231628,4 "396",1993,0,-110,23.4799995422363,22.7299995422363,86.6999969482422,-3.29999995231628,4 "397",1993,0,-110,24.2000007629395,22.9799995422363,82.9000015258789,-7.19999980926514,3.70000004768372 "398",1993,0,-110,23.8199996948242,22.7099990844727,82.8000030517578,-7,3.09999990463257 "399",1993,0,-110,23,22.8299999237061,79.9000015258789,-4.40000009536743,2.40000009536743 "400",1993,0,-110,22.9099998474121,22.8299999237061,83.4000015258789,-1.5,5.30000019073486 "401",1993,0,-110,22.7999992370605,22.5200004577637,88.6999969482422,-2.29999995231628,3.29999995231628 "402",1993,0,-110,22.8199996948242,22.4599990844727,89.0999984741211,-4.5,2.79999995231628 "403",1993,0,-110,22.75,22.5300006866455,88.3000030517578,-4,1.79999995231628 "404",1993,0,-110,22.7099990844727,22.5900001525879,91.9000015258789,-4.59999990463257,2.20000004768372 "405",1993,0,-110,22.8500003814697,22.6599998474121,90.3000030517578,-3.79999995231628,2.29999995231628 "406",1993,0,-110,22.8400001525879,22.7299995422363,89.3000030517578,-3.40000009536743,2.90000009536743 "407",1993,0,-110,22.8899993896484,22.9400005340576,90.1999969482422,-2.79999995231628,3.40000009536743 "408",1993,0,-110,22.7600002288818,22.6900005340576,89.4000015258789,-4.30000019073486,1.89999997615814 "409",1993,0,-110,23.0100002288818,22.9300003051758,88.8000030517578,-3.5,2.09999990463257 "410",1993,0,-110,23.2000007629395,22.9799995422363,87.5,-3.40000009536743,3.40000009536743 "411",1993,0,-110,23.3600006103516,23.2999992370605,85.4000015258789,-3.40000009536743,4.80000019073486 "412",1993,0,-110,23.3199996948242,23.1700000762939,85.9000015258789,-3.90000009536743,4.09999990463257 "413",1993,0,-110,23.3700008392334,23.2199993133545,84.5,-4.30000019073486,3 "414",1993,0,-110,23.3899993896484,23.0599994659424,82.6999969482422,-5.19999980926514,1.5 "415",1993,0,-110,23.3299999237061,22.9500007629395,81.4000015258789,-4.09999990463257,2.79999995231628 "416",1993,0,-110,23.2900009155273,22.9899997711182,86.0999984741211,-4.09999990463257,3 "417",1993,0,-110,23.2399997711182,22.9899997711182,86.6999969482422,-4.90000009536743,2.40000009536743 "418",1993,0,-110,23.1800003051758,22.8799991607666,87.5,-3.59999990463257,2.40000009536743 "419",1993,0,-110,22.9300003051758,22.8400001525879,86.4000015258789,-2.29999995231628,3.29999995231628 "420",1993,0,-110,23.5,23.1399993896484,86.8000030517578,-4.40000009536743,3.09999990463257 "421",1993,0,-110,23.7800006866455,23.4899997711182,88.4000015258789,-4.40000009536743,3.79999995231628 "422",1993,0,-110,24.1000003814697,23.6800003051758,85.6999969482422,-5.5,2.70000004768372 "423",1993,0,-110,23.9799995422363,23.4300003051758,85.5999984741211,-3.79999995231628,4.09999990463257 "424",1993,0,-110,23.6000003814697,23.0300006866455,86.4000015258789,-2,4.90000009536743 "425",1993,0,-110,23.3700008392334,23.1700000762939,87.9000015258789,-3.20000004768372,4.09999990463257 "426",1993,0,-110,23.4300003051758,23.1299991607666,88.5999984741211,-3,3.29999995231628 "427",1993,0,-110,23.3999996185303,23.1399993896484,89.3000030517578,-2.09999990463257,1.89999997615814 "428",1993,0,-110,23.4400005340576,22.9699993133545,90.4000015258789,-1.70000004768372,2.20000004768372 "429",1993,0,-110,23.3999996185303,23.2299995422363,90.0999984741211,-3.40000009536743,3.5 "430",1993,0,-110,23.3700008392334,23.2099990844727,89.9000015258789,-4.30000019073486,2.59999990463257 "431",1993,0,-110,23.4500007629395,23.1599998474121,90,-4.09999990463257,1.10000002384186 "432",1993,0,-110,23.7099990844727,23.1399993896484,87.6999969482422,-3,1.60000002384186 "433",1993,0,-110,24.2900009155273,23.3899993896484,85.8000030517578,-3,2.90000009536743 "434",1993,0,-110,24.0799999237061,23.5300006866455,87.8000030517578,-3.40000009536743,2 "435",1993,0,-110,24.25,23.7099990844727,87.1999969482422,-3.20000004768372,3.09999990463257 "436",1993,0,-110,24.1900005340576,23.8199996948242,87.0999984741211,-4.19999980926514,3.5 "437",1993,0,-110,24.1900005340576,23.8500003814697,86.1999969482422,-4.19999980926514,1.29999995231628 "438",1993,0,-110,24.1399993896484,23.7999992370605,85.9000015258789,-3.20000004768372,2.59999990463257 "439",1993,0,-110,23.8999996185303,23.6499996185303,87.1999969482422,-3.5,2.79999995231628 "440",1993,0,-110,23.8799991607666,23.5799999237061,88.5,-4.30000019073486,2.20000004768372 "441",1993,0,-110,23.9599990844727,23.4699993133545,88.5999984741211,-3.90000009536743,0.699999988079071 "442",1993,0,-110,24.0100002288818,23.7700004577637,89.0999984741211,-3.5,3.09999990463257 "443",1993,0,-110,23.8899993896484,23.5900001525879,89.5,-4.30000019073486,2.09999990463257 "444",1993,0,-110,24,23.6499996185303,87.8000030517578,-4.09999990463257,0.600000023841858 "445",1993,0,-110,24,23.5699996948242,85.0999984741211,-3.79999995231628,3 "446",1993,0,-110,23.9699993133545,23.5200004577637,86.5999984741211,-2.90000009536743,2.90000009536743 "447",1993,0,-110,24.0300006866455,23.7700004577637,87.3000030517578,-3,2 "448",1993,0,-110,23.9300003051758,23.4699993133545,87.5,-3.70000004768372,1 "449",1993,0,-110,23.9300003051758,23.4500007629395,86.4000015258789,-4.19999980926514,1.29999995231628 "450",1993,0,-110,23.9400005340576,23.5699996948242,89.0999984741211,-3.09999990463257,2.09999990463257 "451",1993,0,-110,23.9799995422363,23.75,89.3000030517578,-4.40000009536743,2.09999990463257 "452",1993,0,-110,24.1599998474121,23.6700000762939,90.4000015258789,-3.5,1.20000004768372 "453",1993,0,-110,23.75,23.5799999237061,91.0999984741211,-5.5,2.09999990463257 "454",1993,0,-110,23.4200000762939,23.5,91.8000030517578,-4.19999980926514,1.79999995231628 "455",1993,0,-110,23.4799995422363,23.5300006866455,91.9000015258789,-3.59999990463257,1.39999997615814 "456",1993,0,-110,23.6900005340576,23.5400009155273,92.1999969482422,-2.5,0.899999976158142 "457",1993,0,-110,23.6700000762939,23.4300003051758,89.9000015258789,-2.70000004768372,1.10000002384186 "458",1993,0,-110,24.3199996948242,23.8899993896484,88.5999984741211,-2.09999990463257,0.400000005960464 "459",1993,0,-110,24.0900001525879,23.7900009155273,91.5999984741211,-2.29999995231628,1.5 "460",1993,0,-110,24.1499996185303,NA,NA,-3,1.89999997615814 "461",1993,0,-95,24.9899997711182,23.1900005340576,NA,-5.30000019073486,1.79999995231628 "462",1993,0,-95,25.0499992370605,23.5,NA,-4.69999980926514,3.09999990463257 "463",1993,0,-95,NA,NA,NA,-5.59999990463257,3.09999990463257 "464",1993,0,-95,24.9300003051758,22.8700008392334,NA,-7.09999990463257,2.5 "465",1993,0,-95,24.7800006866455,22.3999996185303,NA,-7.30000019073486,0.300000011920929 "466",1993,0,-95,24.4799995422363,22.7199993133545,NA,-6.5,0 "467",1993,0,-95,23.9599990844727,22.5599994659424,NA,-5.30000019073486,3.59999990463257 "468",1993,0,-95,23.3199996948242,22.6399993896484,NA,-4,5.5 "469",1993,0,-95,22.4599990844727,22.25,NA,-2.20000004768372,6.30000019073486 "470",1993,0,-95,21.9400005340576,21.9699993133545,NA,-0.800000011920929,4.80000019073486 "471",1993,0,-95,21.9699993133545,21.8099994659424,NA,-2.20000004768372,4.30000019073486 "472",1993,0,-95,21.6000003814697,21.4200000762939,NA,-2.79999995231628,4.09999990463257 "473",1993,0,-95,21.8600006103516,21.8899993896484,NA,-3,3.90000009536743 "474",1993,0,-95,21.8600006103516,21.8500003814697,NA,-3.20000004768372,3.59999990463257 "475",1993,0,-95,21.8700008392334,21.8899993896484,NA,-3,3.09999990463257 "476",1993,0,-95,21.9599990844727,21.8500003814697,NA,-4,2.79999995231628 "477",1993,0,-95,22.6399993896484,22.0900001525879,NA,-6.30000019073486,0.800000011920929 "478",1993,0,-95,22.8999996185303,22.4400005340576,NA,-5.40000009536743,0.100000001490116 "479",1993,0,-95,23.0799999237061,22.5200004577637,NA,-6.40000009536743,-0.400000005960464 "480",1993,0,-95,23.2399997711182,22.2900009155273,NA,-6.59999990463257,1.39999997615814 "481",1993,0,-95,NA,NA,NA,-6.30000019073486,0.5 "482",1993,0,-95,23.5200004577637,22.1299991607666,NA,-5.30000019073486,0.699999988079071 "483",1993,0,-95,23.3700008392334,22.2900009155273,NA,-4.80000019073486,1.89999997615814 "484",1993,0,-95,22.9500007629395,22.1700000762939,NA,-5.40000009536743,3.20000004768372 "485",1993,0,-95,22.5200004577637,21.8899993896484,NA,-5,2.29999995231628 "486",1993,0,-95,22.3199996948242,21.7299995422363,NA,-4.40000009536743,2 "487",1993,0,-95,22.2800006866455,21.6599998474121,NA,-3.70000004768372,1.89999997615814 "488",1993,0,-95,21.7999992370605,21.7299995422363,NA,-1.79999995231628,2.70000004768372 "489",1993,0,-95,21.8500003814697,21.8899993896484,NA,-0.5,3.59999990463257 "490",1993,0,-95,21.7800006866455,22.0100002288818,NA,-0.300000011920929,3.09999990463257 "491",1993,0,-95,21.8999996185303,22.2099990844727,NA,-1.5,4.09999990463257 "492",1993,0,-95,22.9699993133545,22.5599994659424,NA,-6.19999980926514,1.89999997615814 "493",1993,0,-95,23.1800003051758,22.7199993133545,NA,-6.69999980926514,3.20000004768372 "494",1993,0,-95,22.7199993133545,22.4400005340576,NA,-5,3.59999990463257 "495",1993,0,-95,22.5100002288818,22.25,NA,-5.09999990463257,3 "496",1993,0,-95,22.3999996185303,22.25,NA,-3.20000004768372,5.59999990463257 "497",1993,0,-95,22.1900005340576,22.3199996948242,NA,-1.5,4.90000009536743 "498",1993,0,-95,22.0300006866455,22.25,NA,-3.20000004768372,4.90000009536743 "499",1993,0,-95,21.8999996185303,22.0900001525879,NA,-1.5,3.29999995231628 "500",1993,0,-95,21.9899997711182,22.1700000762939,NA,-1.5,-2.59999990463257 "501",1993,0,-95,22.2600002288818,22.2900009155273,NA,-2,-3.29999995231628 "502",1993,0,-95,22.3500003814697,22.5599994659424,NA,-3.59999990463257,-3.20000004768372 "503",1993,0,-95,22.4799995422363,22.5200004577637,NA,-4,-0.100000001490116 "504",1993,0,-95,22.5499992370605,22.6000003814697,NA,-2.70000004768372,-2.40000009536743 "505",1993,0,-95,22.4400005340576,22.6399993896484,NA,-3.29999995231628,-1.70000004768372 "506",1993,0,-95,22.3600006103516,22.4400005340576,NA,1.60000002384186,3.79999995231628 "507",1993,0,-95,22.5499992370605,22.6000003814697,NA,2.29999995231628,3.5 "508",1993,0,-95,22.7299995422363,22.8400001525879,NA,3,2.20000004768372 "509",1993,0,-95,22.8500003814697,22.8400001525879,NA,3.29999995231628,0.200000002980232 "510",1993,0,-95,23.1100006103516,23.0300006866455,NA,2.90000009536743,-0.100000001490116 "511",1993,0,-95,23.3299999237061,23.2700004577637,NA,0.600000023841858,-4.30000019073486 "512",1993,0,-95,23.3600006103516,23.4200000762939,NA,-2.5,0.699999988079071 "513",1993,0,-95,23.4300003051758,23.3899993896484,NA,-4.19999980926514,3.20000004768372 "514",1993,0,-95,23.2800006866455,23.3500003814697,NA,-2,4.09999990463257 "515",1993,0,-95,22.9899997711182,23.2299995422363,NA,-0.800000011920929,4 "516",1993,0,-95,23.1599998474121,23.2700004577637,NA,-0.800000011920929,3.29999995231628 "517",1993,0,-95,23.8099994659424,23.5400009155273,NA,-2.29999995231628,2.90000009536743 "518",1993,0,-95,23.7999992370605,23.5400009155273,NA,-2.5,3.29999995231628 "519",1993,0,-95,23.7299995422363,23.7000007629395,NA,-2,2.5 "520",1993,0,-95,23.6700000762939,23.5799999237061,NA,-4.09999990463257,1.79999995231628 "521",1993,0,-95,23.7700004577637,23.5799999237061,NA,-4.90000009536743,1.70000004768372 "522",1993,0,-95,23.6000003814697,23.4599990844727,NA,-4.90000009536743,-0.200000002980232 "523",1993,0,-95,24.2000007629395,23.7000007629395,NA,-5,-0.300000011920929 "524",1993,0,-95,24.0699996948242,23.8600006103516,NA,-4.40000009536743,1.20000004768372 "525",1993,0,-95,24.0200004577637,23.8199996948242,NA,-4.90000009536743,1 "526",1993,0,-95,24.6499996185303,24.2099990844727,NA,-5.90000009536743,0.800000011920929 "527",1993,0,-95,24.4200000762939,24.0100002288818,NA,-5.80000019073486,1.70000004768372 "528",1993,0,-95,23.9200000762939,23.8999996185303,NA,-3.70000004768372,1.79999995231628 "529",1993,0,-95,23.5599994659424,23.6599998474121,NA,-2.90000009536743,3.20000004768372 "530",1993,0,-95,23.6599998474121,23.7399997711182,NA,-1.89999997615814,3.5 "531",1993,0,-95,23.6299991607666,23.6599998474121,NA,-2.40000009536743,3.09999990463257 "532",1993,0,-95,23.5200004577637,23.5400009155273,NA,-2.90000009536743,3.09999990463257 "533",1993,0,-95,23.6000003814697,23.5400009155273,NA,-2.59999990463257,2.59999990463257 "534",1993,0,-95,23.3999996185303,23.5400009155273,NA,-3,3.29999995231628 "535",1993,0,-95,23.4599990844727,23.3099994659424,NA,-3.09999990463257,1.5 "536",1993,0,-95,23.5499992370605,23.3899993896484,NA,-2.20000004768372,-0.800000011920929 "537",1993,0,-95,24.0100002288818,23.7399997711182,NA,-3.29999995231628,-1.20000004768372 "538",1993,0,-95,23.9400005340576,23.8999996185303,NA,-3.5,-1.10000002384186 "539",1993,0,-95,24.2800006866455,24.0100002288818,NA,-1.79999995231628,-1.29999995231628 "540",1993,0,-95,24.5599994659424,24.1700000762939,NA,-1.70000004768372,-1.39999997615814 "541",1993,0,-95,24.7399997711182,24.0499992370605,NA,-1.79999995231628,-1.60000002384186 "542",1993,0,-95,25.0699996948242,24.6399993896484,NA,-2.70000004768372,-2.40000009536743 "543",1993,0,-95,25.6599998474121,24.9599990844727,NA,-6,-1.79999995231628 "544",1993,0,-95,26,24.9200000762939,NA,-6.90000009536743,-0.699999988079071 "545",1993,0,-95,25.7900009155273,24.6000003814697,NA,-6.59999990463257,-1.39999997615814 "546",1993,0,-95,26.3799991607666,24.8400001525879,NA,-6.19999980926514,-1.60000002384186 "547",1993,0,-95,25.9400005340576,24.8799991607666,NA,-5.69999980926514,0.800000011920929 "548",1993,0,-95,25.0200004577637,24.3700008392334,NA,-2.40000009536743,1.10000002384186 "549",1993,0,-95,24.6100006103516,24.5200004577637,NA,-1.70000004768372,1.29999995231628 "550",1993,0,-95,24.7900009155273,24.7600002288818,NA,-2,2 "551",1993,0,-95,24.7800006866455,24.7600002288818,NA,-1.79999995231628,2.29999995231628 "552",1993,0,-95,24.7900009155273,24.4899997711182,NA,-1.39999997615814,3.40000009536743 "553",1993,-2,-95,22.6599998474121,22.4300003051758,85,-2.59999990463257,3.5 "554",1993,-2,-95,22.6100006103516,22.4699993133545,88.5999984741211,-2.90000009536743,4.19999980926514 "555",1993,-2,-95,22.5400009155273,22.1900005340576,90.4000015258789,-3.59999990463257,4.30000019073486 "556",1993,-2,-95,22.6499996185303,22.3500003814697,88.5999984741211,-5.5,4.30000019073486 "557",1993,-2,-95,22.5400009155273,22.3899993896484,85.1999969482422,-4.5,4.59999990463257 "558",1993,-2,-95,22.4799995422363,22.5100002288818,84.8000030517578,-3.20000004768372,4.80000019073486 "559",1993,-2,-95,22.4599990844727,22.5499992370605,86.3000030517578,-3.20000004768372,4.5 "560",1993,-2,-95,22.4300003051758,22.6299991607666,85.3000030517578,-3.79999995231628,4.90000009536743 "561",1993,-2,-95,22.4400005340576,22.5900001525879,88,-3.70000004768372,5 "562",1993,-2,-95,22.5300006866455,22.5100002288818,88,-3.90000009536743,4.80000019073486 "563",1993,-2,-95,22.6399993896484,22.3099994659424,87.6999969482422,-3.09999990463257,4.69999980926514 "564",1993,-2,-95,22.6100006103516,22.5100002288818,85.1999969482422,-2.70000004768372,5.09999990463257 "565",1993,-2,-95,22.5900001525879,22.5100002288818,81.4000015258789,-2.79999995231628,5.09999990463257 "566",1993,-2,-95,22.75,22.75,79.8000030517578,-3.79999995231628,5.19999980926514 "567",1993,-2,-95,22.6299991607666,22.8299999237061,81.5999984741211,-3.20000004768372,4.5 "568",1993,-2,-95,22.5,22.7099990844727,84.3000030517578,-4.90000009536743,3.40000009536743 "569",1993,-2,-95,22.3899993896484,22.7900009155273,87.1999969482422,-4.5,3.20000004768372 "570",1993,-2,-95,22.3400001525879,22.5100002288818,88.6999969482422,-3.20000004768372,3.09999990463257 "571",1993,-2,-95,22.3099994659424,22.75,86.9000015258789,-3.09999990463257,4.09999990463257 "572",1993,-2,-95,21.9899997711182,22.4300003051758,85.1999969482422,-3.5,5.19999980926514 "573",1993,-2,-95,21.8400001525879,22.4300003051758,82.5,-2.79999995231628,3.59999990463257 "574",1993,-2,-95,22.0400009155273,22.2299995422363,84.0999984741211,-2.70000004768372,3.29999995231628 "575",1993,-2,-95,22.2000007629395,22.1900005340576,85.8000030517578,-2,2 "576",1993,-2,-95,22.3299999237061,22.3099994659424,86.4000015258789,-2.70000004768372,3.5 "577",1993,-2,-95,22.3099994659424,22.3500003814697,86.5,-2.79999995231628,4 "578",1993,-2,-95,22.3700008392334,22.5100002288818,87.5,-3.90000009536743,2.79999995231628 "579",1993,-2,-95,22.4300003051758,22.7099990844727,85.6999969482422,-2.59999990463257,3.59999990463257 "580",1993,-2,-95,22.6200008392334,22.8600006103516,86.5999984741211,-2.09999990463257,4 "581",1993,-2,-95,22.7000007629395,22.5100002288818,88.5,-0.899999976158142,3.09999990463257 "582",1993,-2,-95,22.8299999237061,22.8600006103516,88.9000015258789,-2.79999995231628,4.09999990463257 "583",1993,-2,-95,22.7700004577637,23.1000003814697,90.0999984741211,-5.09999990463257,3.20000004768372 "584",1993,-2,-95,22.7600002288818,23.1399993896484,90.4000015258789,-4.5,4.80000019073486 "585",1993,-2,-95,22.6900005340576,22.8999996185303,88.5999984741211,-3.90000009536743,4.69999980926514 "586",1993,-2,-95,22.7099990844727,22.8999996185303,83.5999984741211,-3.90000009536743,3.09999990463257 "587",1993,-2,-95,22.8099994659424,22.5100002288818,86.5999984741211,-4.19999980926514,1.60000002384186 "588",1993,-2,-95,22.8299999237061,22.8600006103516,87.9000015258789,-4.80000019073486,4.30000019073486 "589",1993,-2,-95,22.7600002288818,23.0200004577637,89.5999984741211,-4.59999990463257,4.30000019073486 "590",1993,-2,-95,22.6800003051758,22.8299999237061,90.5999984741211,-3.90000009536743,3.5 "591",1993,-2,-95,22.6900005340576,22.9400005340576,90.8000030517578,-3,4 "592",1993,-2,-95,22.8099994659424,22.9400005340576,90.0999984741211,-2.40000009536743,3.59999990463257 "593",1993,-2,-95,22.8899993896484,22.8299999237061,88.0999984741211,-1.79999995231628,3.40000009536743 "594",1993,-2,-95,22.7999992370605,22.9400005340576,88.8000030517578,-1.70000004768372,4 "595",1993,-2,-95,22.9899997711182,23.0200004577637,88.3000030517578,-1,4.90000009536743 "596",1993,-2,-95,23.1399993896484,23.2600002288818,84.5999984741211,-0.300000011920929,4.90000009536743 "597",1993,-2,-95,23.1499996185303,23.0599994659424,80,-1.5,5.59999990463257 "598",1993,-2,-95,23.2000007629395,23.0200004577637,79.9000015258789,-1.39999997615814,4.19999980926514 "599",1993,-2,-95,23.2600002288818,23.2600002288818,86,-1.60000002384186,4.30000019073486 "600",1993,-2,-95,23.3199996948242,23.5,91.0999984741211,-2.29999995231628,3 "601",1993,-2,-95,23.1900005340576,23.4200000762939,88.3000030517578,-3.79999995231628,3.40000009536743 "602",1993,-2,-95,23.2399997711182,23.5699996948242,91.0999984741211,-2.70000004768372,2.79999995231628 "603",1993,-2,-95,23.3899993896484,23.6100006103516,91,-2.29999995231628,3.20000004768372 "604",1993,-2,-95,23.4099998474121,23.6900005340576,89.6999969482422,-2.70000004768372,4.80000019073486 "605",1993,-2,-95,23.4899997711182,23.8500003814697,86.6999969482422,-2.59999990463257,4.30000019073486 "606",1993,-2,-95,23.5799999237061,23.6900005340576,86.6999969482422,-1.5,5.30000019073486 "607",1993,-2,-95,23.6900005340576,23.8099994659424,85.5,-0.899999976158142,5.09999990463257 "608",1993,-2,-95,23.7800006866455,23.8500003814697,85.8000030517578,-1.89999997615814,3.90000009536743 "609",1993,-2,-95,23.8199996948242,23.9300003051758,88.3000030517578,-2.70000004768372,3.29999995231628 "610",1993,-2,-95,23.8400001525879,23.9300003051758,90.5999984741211,-2.79999995231628,2.59999990463257 "611",1993,-2,-95,24.1000003814697,24.1700000762939,90.3000030517578,-2.20000004768372,2.70000004768372 "612",1993,-2,-95,24.1200008392334,24.2000007629395,89.0999984741211,-3,3.70000004768372 "613",1993,-2,-95,24.1200008392334,24.2800006866455,88.9000015258789,-3.5,3.20000004768372 "614",1993,-2,-95,24.1599998474121,24.2800006866455,88.4000015258789,-4.30000019073486,2.59999990463257 "615",1993,-2,-95,24.0799999237061,24.0900001525879,88.5,-2.5,2.40000009536743 "616",1993,-2,-95,24.0300006866455,24.2800006866455,89,-1,2.40000009536743 "617",1993,-2,-95,23.9099998474121,24.1299991607666,90.6999969482422,-1.79999995231628,3.5 "618",1993,-2,-95,23.9599990844727,24.2000007629395,90.9000015258789,-3.20000004768372,3 "619",1993,-2,-95,23.9500007629395,24.2000007629395,91,-3.29999995231628,3.70000004768372 "620",1993,-2,-95,24.0100002288818,24.2399997711182,89.5,-2.5,3.59999990463257 "621",1993,-2,-95,24.0499992370605,24.3999996185303,90,-3.20000004768372,3.40000009536743 "622",1993,-2,-95,24.0699996948242,24.3999996185303,89.8000030517578,-3.79999995231628,4 "623",1993,-2,-95,24.0799999237061,24.4400005340576,88.6999969482422,-4.19999980926514,3.09999990463257 "624",1993,-2,-95,24,24.3999996185303,89,-3.70000004768372,3.5 "625",1993,-2,-95,23.9799995422363,24.3199996948242,88.5,-2.59999990463257,3.5 "626",1993,-2,-95,24.0200004577637,24.3999996185303,88.0999984741211,-1.5,5.40000009536743 "627",1993,-2,-95,24.1499996185303,24.3199996948242,83.0999984741211,-1.89999997615814,4.09999990463257 "628",1993,-2,-95,24.4300003051758,24.0900001525879,81.8000030517578,-1.29999995231628,1.60000002384186 "629",1993,-2,-95,24.6200008392334,24.7999992370605,84.3000030517578,-1.10000002384186,4.09999990463257 "630",1993,-2,-95,24.4300003051758,24.6399993896484,88.5,-0.899999976158142,3.29999995231628 "631",1993,-2,-95,24.7600002288818,24.5599994659424,88.4000015258789,-0.200000002980232,2.79999995231628 "632",1993,-2,-95,24.9300003051758,24.3999996185303,89.1999969482422,0.600000023841858,2.40000009536743 "633",1993,-2,-95,24.9400005340576,24.5200004577637,89.8000030517578,-1.5,3.40000009536743 "634",1993,-2,-95,24.8500003814697,24.4400005340576,91.8000030517578,-4,1.29999995231628 "635",1993,-2,-95,24.7000007629395,24.9099998474121,90.9000015258789,-4.30000019073486,1.60000002384186 "636",1993,-2,-95,24.5400009155273,24.7999992370605,89.8000030517578,-4.40000009536743,1.60000002384186 "637",1993,-2,-95,NA,NA,89.9000015258789,-3.40000009536743,2.40000009536743 "638",1993,-2,-95,24.5900001525879,24.9500007629395,91,-3.59999990463257,2.40000009536743 "639",1993,-2,-95,24.7099990844727,25.0300006866455,89.8000030517578,-3.5,3.20000004768372 "640",1993,-2,-95,25.1100006103516,25.0300006866455,91.3000030517578,-1.29999995231628,0.899999976158142 "641",1993,-2,-95,25.1399993896484,25.0300006866455,89.6999969482422,-1.89999997615814,3.09999990463257 "642",1993,-2,-95,25.2099990844727,24.8700008392334,90.5,-1.20000004768372,3.5 "643",1993,-2,-95,25.4300003051758,24.9899997711182,89.0999984741211,-0.5,3.79999995231628 "644",1993,-2,-95,25.5699996948242,24.6800003051758,87.1999969482422,1.29999995231628,2.29999995231628 "645",1993,-2,-110,24.5400009155273,23.7800006866455,81.0999984741211,-4.80000019073486,2.5 "646",1993,-2,-110,24.2600002288818,23.6599998474121,82.1999969482422,-5,3 "647",1993,-2,-110,23.8299999237061,23.6200008392334,84,-7,1.60000002384186 "648",1993,-2,-110,23.6200008392334,23.5400009155273,84.8000030517578,-7.80000019073486,1.20000004768372 "649",1993,-2,-110,23.4400005340576,23.2600002288818,88.4000015258789,-7.30000019073486,1.20000004768372 "650",1993,-2,-110,23.3299999237061,23.5400009155273,85.0999984741211,-6.19999980926514,2.09999990463257 "651",1993,-2,-110,23.1900005340576,23.3799991607666,85,-6.09999990463257,2.5 "652",1993,-2,-110,23.0699996948242,22.9799995422363,87.5999984741211,-5.30000019073486,0.800000011920929 "653",1993,-2,-110,23.0900001525879,23.2199993133545,89.0999984741211,-5,2.09999990463257 "654",1993,-2,-110,23.1900005340576,23.2600002288818,88.1999969482422,-4.80000019073486,3.5 "655",1993,-2,-110,23.3400001525879,23.2999992370605,85.8000030517578,-4.90000009536743,2.79999995231628 "656",1993,-2,-110,23.3600006103516,23.4200000762939,85,-5.40000009536743,2.20000004768372 "657",1993,-2,-110,23.4099998474121,23.4599990844727,83.1999969482422,-5.59999990463257,2.59999990463257 "658",1993,-2,-110,23.4599990844727,23.3799991607666,83.3000030517578,-6.09999990463257,1.29999995231628 "659",1993,-2,-110,23.4899997711182,23.3400001525879,81.5999984741211,-7.19999980926514,0.899999976158142 "660",1993,-2,-110,23.5,23.2999992370605,82.5,-6.80000019073486,1.89999997615814 "661",1993,-2,-110,23.5400009155273,23.4200000762939,83.9000015258789,-6.80000019073486,2.5 "662",1993,-2,-110,23.6100006103516,23.3799991607666,83.3000030517578,-6.09999990463257,1.60000002384186 "663",1993,-2,-110,23.5599994659424,23.3400001525879,83.3000030517578,-6.09999990463257,1.5 "664",1993,-2,-110,23.4899997711182,23.3799991607666,85.4000015258789,-6.30000019073486,2.20000004768372 "665",1993,-2,-110,23.4500007629395,23.4200000762939,86.0999984741211,-7.09999990463257,2.29999995231628 "666",1993,-2,-110,23.4099998474121,23.3799991607666,85.3000030517578,-6.69999980926514,1.39999997615814 "667",1993,-2,-110,23.2600002288818,23.2999992370605,84.9000015258789,-6.5,1.29999995231628 "668",1993,-2,-110,23.1100006103516,23.1800003051758,85.6999969482422,-5.19999980926514,1.70000004768372 "669",1993,-2,-110,22.9300003051758,22.9799995422363,86.6999969482422,-5.59999990463257,2.29999995231628 "670",1993,-2,-110,22.8099994659424,22.8600006103516,87.4000015258789,-4.19999980926514,1.10000002384186 "671",1993,-2,-110,22.8500003814697,22.9400005340576,89,-3.09999990463257,2.40000009536743 "672",1993,-2,-110,22.8799991607666,23.0200004577637,88.1999969482422,-4.69999980926514,2.70000004768372 "673",1993,-2,-110,22.9300003051758,23.1000003814697,87.5,-6.5,1.60000002384186 "674",1993,-2,-110,22.9500007629395,23.0599994659424,85.1999969482422,-6.69999980926514,1.39999997615814 "675",1993,-2,-110,23.0599994659424,23.1000003814697,85.1999969482422,-4.69999980926514,0.699999988079071 "676",1993,-2,-110,23.25,23.2999992370605,83.1999969482422,-3.40000009536743,3 "677",1993,-2,-110,23.1599998474121,23.3799991607666,85.8000030517578,-4,4.40000009536743 "678",1993,-2,-110,23.1000003814697,23.3400001525879,87.8000030517578,-5.59999990463257,2.5 "679",1993,-2,-110,23.2700004577637,23.3799991607666,86.4000015258789,-5,1.5 "680",1993,-2,-110,23.3799991607666,23.5,85.3000030517578,-6,1.29999995231628 "681",1993,-2,-110,23.5699996948242,23.8199996948242,86.3000030517578,-5.69999980926514,2 "682",1993,-2,-110,23.6599998474121,23.6200008392334,88.0999984741211,-5.30000019073486,3 "683",1993,-2,-110,23.7700004577637,23.8999996185303,89.9000015258789,-5.19999980926514,2.90000009536743 "684",1993,-2,-110,23.8700008392334,23.6599998474121,87.5,-5.90000009536743,2.40000009536743 "685",1993,-2,-110,23.9200000762939,23.8999996185303,85.8000030517578,-5.5,2 "686",1993,-2,-110,23.9599990844727,23.9400005340576,83.9000015258789,-5.09999990463257,4.30000019073486 "687",1993,-2,-110,24.0400009155273,23.8199996948242,82.0999984741211,-5.59999990463257,3.20000004768372 "688",1993,-2,-110,23.9799995422363,23.7399997711182,84,-5.90000009536743,2.79999995231628 "689",1993,-2,-110,24.0100002288818,23.7800006866455,81.3000030517578,-6.80000019073486,2 "690",1993,-2,-110,24.0300006866455,23.7399997711182,80.5,-6.90000009536743,0.200000002980232 "691",1993,-2,-110,23.9500007629395,23.6599998474121,82.5,-6.40000009536743,1.39999997615814 "692",1993,-2,-110,23.8999996185303,23.6200008392334,85,-6.5,1.89999997615814 "693",1993,-2,-110,23.8600006103516,23.7800006866455,88.0999984741211,-6.09999990463257,3 "694",1993,-2,-110,23.8899993896484,23.8600006103516,84.8000030517578,-5.19999980926514,2.5 "695",1993,-2,-110,23.9599990844727,23.7000007629395,85.4000015258789,-4.19999980926514,1.79999995231628 "696",1993,-2,-110,23.9699993133545,23.7800006866455,88.3000030517578,-5.40000009536743,1.39999997615814 "697",1993,-2,-110,23.9699993133545,23.6599998474121,91.9000015258789,-5.19999980926514,1.5 "698",1993,-2,-110,23.9899997711182,23.7399997711182,91.3000030517578,-4.5,0.800000011920929 "699",1993,-2,-110,23.8899993896484,23.8999996185303,87,-4.40000009536743,3 "700",1993,-2,-110,23.8899993896484,23.8600006103516,86.4000015258789,-3.90000009536743,2.90000009536743 "701",1993,-2,-110,23.9500007629395,23.8999996185303,85.8000030517578,-5.80000019073486,2.5 "702",1993,-2,-110,23.9799995422363,23.9400005340576,87.6999969482422,-5.09999990463257,1.5 "703",1993,-2,-110,24,23.9400005340576,87.0999984741211,-4.40000009536743,1.39999997615814 "704",1993,-2,-110,24.0599994659424,23.9799995422363,88.1999969482422,-3.40000009536743,2.29999995231628 "705",1993,-2,-110,24,23.9799995422363,90.4000015258789,-4.69999980926514,2.40000009536743 "706",1993,-2,-110,24.0200004577637,24.1000003814697,90,-6,1.10000002384186 "707",1993,-2,-110,24.0799999237061,24.2600002288818,89.5999984741211,-5.40000009536743,2.40000009536743 "708",1993,-2,-110,24.2099990844727,24.1800003051758,84.6999969482422,-4.40000009536743,2.29999995231628 "709",1993,-2,-110,24.2999992370605,24.3400001525879,81.6999969482422,-4.59999990463257,2.29999995231628 "710",1993,-2,-110,24.2199993133545,24.5400009155273,82.3000030517578,-5,2.40000009536743 "711",1993,-2,-110,24.2299995422363,24.4200000762939,86.5999984741211,-5.09999990463257,3.09999990463257 "712",1993,-2,-110,24.2199993133545,24.3799991607666,84.9000015258789,-5.80000019073486,3.09999990463257 "713",1993,-2,-110,24.4300003051758,24.3400001525879,87.5999984741211,-5,0.400000005960464 "714",1993,-2,-110,24.6000003814697,24.4599990844727,86.0999984741211,-5,1.10000002384186 "715",1993,-2,-110,24.6599998474121,24.1800003051758,88.5,-4.90000009536743,2.20000004768372 "716",1993,-2,-110,24.7600002288818,24.5,87.9000015258789,-5.5,1.70000004768372 "717",1993,-2,-110,24.8999996185303,24.6200008392334,87.9000015258789,-5,0.5 "718",1993,-2,-110,24.8899993896484,24.5799999237061,88.3000030517578,-5.5,2.79999995231628 "719",1993,-2,-110,24.8700008392334,24.7299995422363,87.0999984741211,-6.5,2.59999990463257 "720",1993,-2,-110,24.9699993133545,24.9699993133545,81.6999969482422,-5.59999990463257,1.10000002384186 "721",1993,-2,-110,25.0300006866455,24.6200008392334,80.8000030517578,-5.69999980926514,1 "722",1993,-2,-110,24.9400005340576,24.5799999237061,83.0999984741211,-4.30000019073486,2.5 "723",1993,-2,-110,24.7299995422363,24.3799991607666,85.5,-3.29999995231628,1.79999995231628 "724",1993,-2,-110,24.5499992370605,24.4200000762939,85.5,-5,2.5 "725",1993,-2,-110,24.5499992370605,24.3400001525879,84.9000015258789,-4.80000019073486,0.699999988079071 "726",1993,-2,-110,24.6200008392334,24.4200000762939,89,-4.5,1.20000004768372 "727",1993,-2,-110,24.6900005340576,24.7000007629395,88.0999984741211,-6,2.70000004768372 "728",1993,-2,-110,24.7700004577637,24.7000007629395,90.5999984741211,-4.69999980926514,1.5 "729",1993,-2,-110,24.6399993896484,24.6599998474121,90,-6.30000019073486,1.70000004768372 "730",1993,-2,-110,24.5599994659424,24.6599998474121,88.3000030517578,-6.30000019073486,1 "731",1993,-2,-110,24.6900005340576,24.6599998474121,89.1999969482422,-5.40000009536743,0.5 "732",1993,-2,-110,24.7800006866455,24.6200008392334,90.8000030517578,-4.40000009536743,1.70000004768372 "733",1993,-2,-110,24.8799991607666,24.5,91.0999984741211,-3,0.200000002980232 "734",1993,-2,-110,25.1200008392334,24.8899993896484,89.6999969482422,-4,1.10000002384186 "735",1993,-2,-110,25.1599998474121,24.9300003051758,89.5,-4.30000019073486,2.5 "736",1993,-2,-110,25.1399993896484,24.7700004577637,87.9000015258789,-4.59999990463257,2.29999995231628 ggobi-2.1.12/data/laser.xml0000644000175000017500000001146014651527764011131 This data came from an investigation of an experimental laser at Bellcore. It was a tunable laser, in the sense that both its wavelength and power output were controllable. Rotation helped the experimental physicists to characterize the laser, which turned out not to be a very good one, due to its unstable operating region. The variables are: If Ir power lambda If and Ir are currents applied to the front and rear of the laser. Power and lambda are the output power and wavelength. This data initially came to the statistics research group when Janette Cooper asked Paul Tukey to help her analyze the data she had collected to describe the laser. 12.000 70.000 -38.300 1579.100 13.000 70.000 -38.100 1579.100 15.000 70.000 -36.500 1579.100 19.000 70.000 -35.100 1579.000 20.000 70.000 -35.100 1577.800 20.000 70.000 -35.100 1578.100 26.000 70.000 -34.200 1578.000 30.000 70.000 -32.600 1578.000 13.000 60.000 -40.900 1578.800 14.000 60.000 -39.800 1578.900 19.000 60.000 -37.000 1578.800 21.000 60.000 -36.100 1577.800 24.000 60.000 -35.400 1577.900 40.000 60.000 -35.400 1577.900 15.000 50.000 -45.700 1578.600 20.000 50.000 -40.400 1578.600 21.000 50.000 -37.400 1577.700 25.000 50.000 -36.000 1577.800 30.000 50.000 -34.100 1577.800 40.000 50.000 -31.200 1577.800 50.000 50.000 -29.500 1577.700 22.000 40.000 -40.300 1577.500 24.000 40.000 -39.500 1577.600 31.000 40.000 -36.100 1577.600 48.000 40.000 -30.900 1577.600 55.000 40.000 -29.700 1577.600 56.000 40.000 -29.500 1577.600 57.000 40.000 -29.900 1575.700 57.000 40.000 -29.900 1577.200 60.000 40.000 -29.500 1575.700 60.000 40.000 -29.500 1577.200 27.000 30.000 -46.200 1577.400 32.000 30.000 -41.000 1577.400 37.000 30.000 -38.200 1577.300 41.000 30.000 -36.200 1577.300 46.000 30.000 -33.900 1577.300 47.000 30.000 -34.100 1575.400 49.000 30.000 -34.300 1575.500 52.000 30.000 -35.100 1575.600 54.000 30.000 -35.500 1575.600 56.000 30.000 -36.000 1575.500 59.000 30.000 -36.200 1575.500 60.000 30.000 -35.600 1575.500 60.000 30.000 -35.600 1577.100 61.000 30.000 -34.500 1575.500 61.000 30.000 -34.500 1577.100 64.000 30.000 -33.500 1575.600 64.000 30.000 -33.500 1577.200 68.000 30.000 -31.700 1575.700 68.000 30.000 -31.700 1577.400 70.000 30.000 -31.100 1575.700 70.000 30.000 -31.100 1577.400 52.000 20.000 -44.500 1575.200 53.000 20.000 -42.600 1575.200 54.000 20.000 -38.500 1576.900 55.000 20.000 -36.600 1577.000 56.000 20.000 -35.200 1577.100 58.000 20.000 -33.900 1577.200 64.000 20.000 -31.800 1577.300 67.000 20.000 -31.000 1577.400 70.000 20.000 -30.000 1577.500 74.000 20.000 -29.800 1577.600 78.000 20.000 -29.400 1577.700 85.000 20.000 -28.700 1577.800 ggobi-2.1.12/data/sleep.xml0000644000175000017500000002106114651527764011131 Data from which conclusions were drawn in the article "Sleep in Mammals: Ecological and Constitutional Correlates" by Allison, T. and Cicchetti, D. (1976), _Science_, November 12, vol. 194, pp. 732-734. Includes brain and body weight, life span, gestation time, time sleeping, and predation and danger indices for 62 mammals. Variables below (from left to right) for Mammals Data Set: species of animal body weight in kg brain weight in g slow wave ("nondreaming") sleep (hrs/day) paradoxical ("dreaming") sleep (hrs/day) total sleep (hrs/day) (sum of slow wave and paradoxical sleep) maximum life span (years) gestation time (days) predation index (1-5) 1 = minimum (least likely to be preyed upon) 5 = maximum (most likely to be preyed upon) sleep exposure index (1-5) 1 = least exposed (e.g. animal sleeps in a well-protected den) 5 = most exposed overall danger index (1-5) (based on the above two indices and other information) 1 = least danger (from other animals) 5 = most danger (from other animals) For more details, see Allison, Truett and Cicchetti, Domenic V. (1976), "Sleep in Mammals: Ecological and Constitutional Correlates", _Science_, November 12, vol. 194, pp. 732-734. The above data set can be freely used for non-commercial purposes and can be freely distributed (permission in writing obtained from Dr. Truett Allison). Submitted by Roger Johnson rjohnson@carleton.edu 6654.000 5712.000 missing missing 3.300 38.600 645.000 3.000 5.000 3.000 1.000 6.600 6.300 2.000 8.300 4.500 42.000 3.000 1.000 3.000 3.385 44.500 missing missing 12.500 14.000 60.000 1.000 1.000 1.000 0.920 5.700 missing missing 16.500 missing 25.000 5.000 2.000 3.000 2547.000 4603.000 2.100 1.800 3.900 69.000 624.000 3.000 5.000 4.000 10.550 179.500 9.100 0.700 9.800 27.000 180.000 4.000 4.000 4.000 0.023 0.300 15.800 3.900 19.700 19.000 35.000 1.000 1.000 1.000 160.000 169.000 5.200 1.000 6.200 30.400 392.000 4.000 5.000 4.000 3.300 25.600 10.900 3.600 14.500 28.000 63.000 1.000 2.000 1.000 52.160 440.000 8.300 1.400 9.700 50.000 230.000 1.000 1.000 1.000 0.425 6.400 11.000 1.500 12.500 7.000 112.000 5.000 4.000 4.000 465.000 423.000 3.200 0.700 3.900 30.000 281.000 5.000 5.000 5.000 0.550 2.400 7.600 2.700 10.300 missing missing 2.000 1.000 2.000 187.100 419.000 missing missing 3.100 40.000 365.000 5.000 5.000 5.000 0.075 1.200 6.300 2.100 8.400 3.500 42.000 1.000 1.000 1.000 3.000 25.000 8.600 0.000 8.600 50.000 28.000 2.000 2.000 2.000 0.785 3.500 6.600 4.100 10.700 6.000 42.000 2.000 2.000 2.000 0.200 5.000 9.500 1.200 10.700 10.400 120.000 2.000 2.000 2.000 1.410 17.500 4.800 1.300 6.100 34.000 missing 1.000 2.000 1.000 60.000 81.000 12.000 6.100 18.100 7.000 missing 1.000 1.000 1.000 529.000 680.000 missing 0.300 missing 28.000 400.000 5.000 5.000 5.000 27.660 115.000 3.300 0.500 3.800 20.000 148.000 5.000 5.000 5.000 0.120 1.000 11.000 3.400 14.400 3.900 16.000 3.000 1.000 2.000 207.000 406.000 missing missing 12.000 39.300 252.000 1.000 4.000 1.000 85.000 325.000 4.700 1.500 6.200 41.000 310.000 1.000 3.000 1.000 36.330 119.500 missing missing 13.000 16.200 63.000 1.000 1.000 1.000 0.101 4.000 10.400 3.400 13.800 9.000 28.000 5.000 1.000 3.000 1.040 5.500 7.400 0.800 8.200 7.600 68.000 5.000 3.000 4.000 521.000 655.000 2.100 0.800 2.900 46.000 336.000 5.000 5.000 5.000 100.000 157.000 missing missing 10.800 22.400 100.000 1.000 1.000 1.000 35.000 56.000 missing missing missing 16.300 33.000 3.000 5.000 4.000 0.005 0.140 7.700 1.400 9.100 2.600 21.500 5.000 2.000 4.000 0.010 0.250 17.900 2.000 19.900 24.000 50.000 1.000 1.000 1.000 62.000 1320.000 6.100 1.900 8.000 100.000 267.000 1.000 1.000 1.000 0.122 3.000 8.200 2.400 10.600 missing 30.000 2.000 1.000 1.000 1.350 8.100 8.400 2.800 11.200 missing 45.000 3.000 1.000 3.000 0.023 0.400 11.900 1.300 13.200 3.200 19.000 4.000 1.000 3.000 0.048 0.330 10.800 2.000 12.800 2.000 30.000 4.000 1.000 3.000 1.700 6.300 13.800 5.600 19.400 5.000 12.000 2.000 1.000 1.000 3.500 10.800 14.300 3.100 17.400 6.500 120.000 2.000 1.000 1.000 250.000 490.000 missing 1.000 missing 23.600 440.000 5.000 5.000 5.000 0.480 15.500 15.200 1.800 17.000 12.000 140.000 2.000 2.000 2.000 10.000 115.000 10.000 0.900 10.900 20.200 170.000 4.000 4.000 4.000 1.620 11.400 11.900 1.800 13.700 13.000 17.000 2.000 1.000 2.000 192.000 180.000 6.500 1.900 8.400 27.000 115.000 4.000 4.000 4.000 2.500 12.100 7.500 0.900 8.400 18.000 31.000 5.000 5.000 5.000 4.288 39.200 missing missing 12.500 13.700 63.000 2.000 2.000 2.000 0.280 1.900 10.600 2.600 13.200 4.700 21.000 3.000 1.000 3.000 4.235 50.400 7.400 2.400 9.800 9.800 52.000 1.000 1.000 1.000 6.800 179.000 8.400 1.200 9.600 29.000 164.000 2.000 3.000 2.000 0.750 12.300 5.700 0.900 6.600 7.000 225.000 2.000 2.000 2.000 3.600 21.000 4.900 0.500 5.400 6.000 225.000 3.000 2.000 3.000 14.830 98.200 missing missing 2.600 17.000 150.000 5.000 5.000 5.000 55.500 175.000 3.200 0.600 3.800 20.000 151.000 5.000 5.000 5.000 1.400 12.500 missing missing 11.000 12.700 90.000 2.000 2.000 2.000 0.060 1.000 8.100 2.200 10.300 3.500 missing 3.000 1.000 2.000 0.900 2.600 11.000 2.300 13.300 4.500 60.000 2.000 1.000 2.000 2.000 12.300 4.900 0.500 5.400 7.500 200.000 3.000 1.000 3.000 0.104 2.500 13.200 2.600 15.800 2.300 46.000 3.000 2.000 2.000 4.190 58.000 9.700 0.600 10.300 24.000 210.000 4.000 3.000 4.000 3.500 3.900 12.800 6.600 19.400 3.000 14.000 2.000 1.000 1.000 4.050 17.000 missing missing missing 13.000 38.000 3.000 1.000 1.000 ggobi-2.1.12/data/flea.xml0000644000175000017500000001526314651527764010737 This data is from a paper by A. A. Lubischew, "On the Use of Discriminant Functions in Taxonomy", Biometrics, Dec 1962, pp.455-477. There are three species of flea-beetles: Ch. concinna, Ch. heptapotamica, and Ch. heikertingeri, and 6 measurements on each. 1 = width of the first joint of the first tarsus in microns (the sum of measurements for both tarsi). 2 = the same for the second joint. 3 = the maximal width of the head between the external edges of the eyes in 0.01 mm. 4 = the maximal width of the aedeagus in the fore-part in microns. 5 = the front angle of the aedeagus ( 1 unit = 7.5 degrees). 6 = the aedeagus width from the side in microns. width of the first joint of the first tarsus in microns (the sum of measurements for both tarsi). width of first joint Concinna Heptapot. Heikert. 191 131 53 150 15 104 1 185 134 50 147 13 105 1 200 137 52 144 14 102 1 173 127 50 144 16 97 1 171 118 49 153 13 106 1 160 118 47 140 15 99 1 188 134 54 151 14 98 1 186 129 51 143 14 110 1 174 131 52 144 14 116 1 163 115 47 142 15 95 1 190 143 52 141 13 99 1 174 131 50 150 15 105 1 201 130 51 148 13 110 1 190 133 53 154 15 106 1 182 130 51 147 14 105 1 184 131 51 137 14 95 1 177 127 49 134 15 105 1 178 126 53 157 14 116 1 210 140 54 149 13 107 1 182 121 51 147 13 111 1 186 136 56 148 14 111 1 158 141 58 145 8 107 2 146 119 51 140 11 111 2 151 130 51 140 11 113 2 122 113 45 131 10 102 2 138 121 53 139 11 106 2 132 115 49 139 10 98 2 131 127 51 136 12 107 2 135 123 50 129 11 107 2 125 119 51 140 10 110 2 130 120 48 137 9 106 2 130 131 51 141 11 108 2 138 127 52 138 9 101 2 130 116 52 143 9 111 2 143 123 54 142 11 95 2 154 135 56 144 10 123 2 147 132 54 138 10 102 2 141 131 51 140 10 106 2 131 116 47 130 9 102 2 144 121 53 137 11 104 2 137 146 53 137 10 113 2 143 119 53 136 9 105 2 135 127 52 140 10 108 2 186 107 49 120 14 84 3 211 122 49 123 16 95 3 201 114 47 130 14 74 3 242 131 54 131 16 90 3 184 108 43 116 16 75 3 211 118 51 122 15 90 3 217 122 49 127 15 73 3 223 127 51 132 16 84 3 208 125 50 125 14 88 3 199 124 46 119 13 78 3 211 129 49 122 13 83 3 218 126 49 120 15 85 3 203 122 49 119 14 73 3 192 116 49 123 15 90 3 195 123 47 125 15 77 3 211 122 48 125 14 73 3 187 123 47 129 14 75 3 192 109 46 130 13 90 3 223 124 53 129 13 82 3 188 114 48 122 12 74 3 216 120 50 129 15 86 3 185 114 46 124 15 92 3 178 119 47 120 13 78 3 187 111 49 119 16 66 3 187 112 49 119 14 55 3 201 130 54 133 13 84 3 187 120 47 121 15 86 3 210 119 50 128 14 68 3 196 114 51 129 14 86 3 195 110 49 124 13 89 3 187 124 49 129 14 88 3 ggobi-2.1.12/data/morsecodes.xml0000644000175000017500000021051014651527764012163 0.250 0.200 0.000 0.750 0.600 1.000 0.750 0.400 1.000 0.500 0.400 1.000 0.000 0.200 0.000 0.750 0.600 0.000 0.500 0.200 1.000 0.750 0.800 0.000 0.250 0.400 0.000 0.750 0.200 0.000 0.500 0.200 1.000 0.750 0.600 0.000 0.250 0.000 1.000 0.250 0.200 1.000 0.500 0.000 1.000 0.750 0.400 0.000 0.750 0.400 1.000 0.500 0.400 0.000 0.500 0.600 0.000 0.000 0.000 1.000 0.500 0.400 0.000 0.750 0.600 0.000 0.500 0.200 0.000 0.750 0.400 1.000 0.750 0.200 1.000 0.750 0.400 1.000 1.000 0.200 0.000 1.000 0.400 0.000 1.000 0.600 0.000 1.000 0.800 0.000 1.000 1.000 0.000 1.000 0.800 1.000 1.000 0.600 1.000 1.000 0.400 1.000 1.000 0.200 1.000 1.000 0.000 1.000 167 169 159 180 164 163 163 75 165 156 173 139 120 165 164 166 131 148 169 134 166 152 164 162 173 172 167 170 170 166 167 166 172 178 174 167 96 79 163 95 139 105 165 141 117 61 162 163 151 123 130 141 138 168 130 125 141 27 117 83 151 142 148 114 97 18 93 133 157 171 169 96 141 166 115 137 144 162 115 116 95 164 164 144 86 106 134 164 176 162 144 129 101 29 91 148 139 121 143 152 115 122 112 137 158 159 79 141 172 136 100 114 159 151 25 73 162 144 159 132 159 107 125 173 132 144 125 120 144 124 166 163 163 154 155 140 151 161 171 174 180 163 166 172 183 182 171 163 179 182 167 182 178 173 174 179 169 175 80 183 177 172 180 173 177 174 179 174 175 180 179 173 181 184 183 164 95 115 136 183 156 116 170 118 148 102 162 165 157 95 154 108 146 181 130 126 115 134 123 142 161 143 97 129 109 131 129 159 170 172 163 139 137 100 182 156 163 172 135 123 148 143 160 38 99 148 130 176 177 157 162 119 149 131 121 146 152 165 155 172 164 152 141 147 159 163 105 144 114 171 116 163 158 157 158 118 170 156 158 144 165 142 87 173 110 81 149 139 150 153 164 164 146 117 40 126 151 166 170 174 75 165 162 159 163 170 172 158 171 174 154 168 143 170 170 177 154 138 159 155 175 167 181 173 166 173 152 169 166 170 171 167 178 178 177 165 141 115 151 179 118 135 157 171 127 110 162 172 111 27 102 149 176 168 162 157 137 119 109 121 73 82 115 138 154 151 118 112 120 126 156 117 116 25 182 148 123 158 174 127 117 154 156 120 146 128 135 172 171 117 140 115 69 149 139 165 162 154 159 169 150 149 157 171 171 173 61 95 73 167 102 148 118 154 110 117 168 169 153 86 115 112 160 170 131 116 134 104 133 63 144 148 142 141 109 118 103 145 163 174 139 162 164 162 182 162 143 170 168 162 154 168 68 167 164 165 149 180 177 165 180 146 168 159 164 166 176 171 176 179 171 163 175 161 184 120 163 164 144 178 165 160 156 143 172 156 169 68 166 161 173 140 160 174 157 180 161 172 167 167 165 177 174 175 179 173 170 174 163 182 165 151 144 159 173 157 38 158 170 111 120 153 167 166 111 120 151 173 172 162 155 121 118 131 131 137 141 160 166 166 149 150 150 147 143 164 123 86 132 174 95 99 144 170 27 146 86 164 161 111 80 118 164 164 144 139 130 123 98 81 103 91 108 144 145 138 108 137 118 143 166 130 106 159 179 154 148 165 177 102 128 115 165 173 120 80 159 182 180 166 159 140 84 75 43 113 120 141 139 165 122 97 77 113 132 131 141 134 107 169 108 130 142 154 149 135 112 149 140 151 118 159 149 177 117 139 50 154 156 147 155 160 151 161 161 152 153 165 172 177 148 138 164 125 175 146 176 87 138 176 172 160 180 160 173 164 182 149 176 82 153 158 165 169 172 168 178 173 161 131 161 170 174 176 185 169 168 176 173 80 181 177 173 159 168 171 170 177 174 172 164 180 177 176 175 177 174 182 176 174 173 177 173 179 181 173 172 175 166 180 134 130 162 132 183 130 157 110 155 162 117 131 165 157 162 144 166 117 82 175 96 126 155 164 160 168 170 159 131 159 160 166 169 174 179 166 125 144 144 177 126 162 81 175 157 140 116 180 180 155 139 159 139 153 177 96 141 109 130 158 154 157 134 47 93 114 139 164 179 178 152 141 129 125 172 115 119 149 167 137 115 134 146 161 121 130 140 50 158 174 126 141 134 126 139 146 142 147 151 164 156 151 164 166 171 164 27 101 120 180 134 149 139 181 119 69 104 168 172 118 123 84 154 165 182 155 109 134 85 116 146 143 131 116 120 64 117 140 154 167 162 117 29 144 173 123 131 150 173 109 149 133 159 167 131 98 75 156 169 176 164 130 126 85 108 125 101 107 136 155 110 119 107 133 149 173 83 91 124 177 142 121 153 166 121 139 63 164 167 131 81 43 147 172 174 160 158 139 116 108 133 142 134 164 157 111 56 79 139 146 172 151 148 166 174 161 146 164 173 73 165 144 166 165 137 103 113 155 168 173 168 154 146 146 125 133 48 139 160 150 149 128 99 61 73 167 142 139 163 179 143 152 164 152 82 162 148 176 177 141 91 120 160 178 177 170 157 142 143 101 142 48 57 132 164 149 125 128 125 146 170 148 121 163 174 97 165 146 169 115 154 142 171 174 160 108 141 151 173 173 159 134 147 131 107 134 139 57 100 123 107 137 142 160 161 170 114 143 154 175 129 155 117 166 138 159 141 176 175 166 144 139 161 161 179 131 47 151 116 136 164 160 132 100 68 109 127 152 165 169 166 97 152 155 180 109 172 40 170 154 169 109 179 179 166 145 165 161 131 181 159 93 164 120 155 157 150 164 123 68 119 139 160 171 174 167 18 115 140 179 131 164 126 171 151 150 118 171 173 149 138 122 152 161 173 160 114 156 64 110 111 149 149 107 109 119 43 133 163 146 166 93 122 151 173 129 152 151 167 118 149 103 163 170 150 108 97 153 170 172 166 139 151 117 119 56 128 125 137 127 139 43 44 114 149 172 133 112 161 181 159 141 166 178 112 157 145 175 174 150 137 77 165 174 175 169 164 164 140 107 79 99 128 142 152 160 133 44 63 105 178 157 137 171 184 170 147 170 178 120 171 163 161 163 147 118 113 172 176 166 174 179 166 154 133 139 61 125 160 165 171 163 114 63 26 174 171 158 174 183 172 159 174 177 126 171 174 184 182 143 143 132 177 185 180 179 178 171 167 149 146 73 146 161 169 174 146 149 105 26 ggobi-2.1.12/data/olive.csv0000644000175000017500000007511114651527764011137 "","Region","Area","palmitic","palmitoleic","stearic","oleic","linoleic","linolenic","arachidic","eicosenoic" "1","1","North-Apulia",1075,75,226,7823,672,36,60,29 "2","1","North-Apulia",1088,73,224,7709,781,31,61,29 "3","1","North-Apulia",911,54,246,8113,549,31,63,29 "4","1","North-Apulia",966,57,240,7952,619,50,78,35 "5","1","North-Apulia",1051,67,259,7771,672,50,80,46 "6","1","North-Apulia",911,49,268,7924,678,51,70,44 "7","1","North-Apulia",922,66,264,7990,618,49,56,29 "8","1","North-Apulia",1100,61,235,7728,734,39,64,35 "9","1","North-Apulia",1082,60,239,7745,709,46,83,33 "10","1","North-Apulia",1037,55,213,7944,633,26,52,30 "11","1","North-Apulia",1051,35,219,7978,605,21,65,24 "12","1","North-Apulia",1036,59,235,7868,661,30,62,44 "13","1","North-Apulia",1074,70,214,7728,747,50,79,33 "14","1","North-Apulia",875,52,243,8018,655,41,79,32 "15","1","North-Apulia",952,49,254,7795,780,50,75,41 "16","1","North-Apulia",1155,98,201,7606,816,32,60,29 "17","1","North-Apulia",943,94,183,7840,788,42,75,31 "18","1","North-Apulia",1278,69,205,7344,957,45,70,28 "19","1","North-Apulia",961,70,195,7958,742,46,75,30 "20","1","North-Apulia",952,77,258,7820,736,43,78,33 "21","1","North-Apulia",1074,67,236,7692,716,56,83,45 "22","1","North-Apulia",995,46,288,7806,679,56,86,40 "23","1","North-Apulia",1056,53,247,7703,700,54,89,51 "24","1","North-Apulia",1065,39,234,7876,703,42,74,26 "25","1","North-Apulia",1065,45,245,7779,696,47,82,38 "26","1","Calabria",1315,139,230,7299,832,42,60,32 "27","1","Calabria",1321,136,217,7174,950,43,63,30 "28","1","Calabria",1359,115,246,7234,874,45,63,18 "29","1","Calabria",1378,111,272,7127,940,46,64,23 "30","1","Calabria",1295,109,245,7253,903,43,62,38 "31","1","Calabria",1275,121,215,7285,892,40,68,41 "32","1","Calabria",1336,120,318,7083,915,50,70,38 "33","1","Calabria",1309,122,241,7257,870,46,72,35 "34","1","Calabria",1340,114,189,7337,820,48,72,21 "35","1","Calabria",1299,116,253,7309,823,40,69,27 "36","1","Calabria",1221,107,221,7441,798,54,70,28 "37","1","Calabria",1245,72,283,7395,829,44,67,28 "38","1","Calabria",1285,129,244,7323,819,57,65,36 "39","1","Calabria",1248,107,313,7299,840,46,66,33 "40","1","Calabria",1356,106,236,7209,866,48,75,36 "41","1","Calabria",1260,102,228,7354,870,49,64,28 "42","1","Calabria",1261,121,312,7238,877,47,65,25 "43","1","Calabria",1304,124,279,7160,928,48,61,37 "44","1","Calabria",1344,117,287,7129,897,51,65,41 "45","1","Calabria",1323,96,300,7351,757,47,54,26 "46","1","Calabria",1292,117,215,7351,839,48,61,32 "47","1","Calabria",1254,118,244,7394,786,46,71,24 "48","1","Calabria",1312,131,259,7167,939,41,69,20 "49","1","Calabria",1213,109,301,7261,925,47,65,31 "50","1","Calabria",1359,98,351,7262,780,41,56,16 "51","1","Calabria",1266,97,263,7435,743,45,69,29 "52","1","Calabria",1298,99,311,7311,787,45,67,23 "53","1","Calabria",1272,116,279,7258,872,43,72,27 "54","1","Calabria",1278,87,332,7379,771,44,53,24 "55","1","Calabria",1184,112,311,7391,819,48,57,28 "56","1","Calabria",1382,110,268,7241,828,39,60,30 "57","1","Calabria",1183,146,292,7580,618,38,51,23 "58","1","Calabria",1261,153,219,7355,818,52,70,26 "59","1","Calabria",1198,136,239,7639,633,27,55,19 "60","1","Calabria",1225,134,232,7658,616,36,49,26 "61","1","Calabria",1339,166,208,7190,923,40,69,25 "62","1","Calabria",1132,157,240,7641,638,45,60,31 "63","1","Calabria",1381,183,245,7385,609,47,70,25 "64","1","Calabria",1409,128,257,7257,759,43,57,16 "65","1","Calabria",1306,127,250,7254,869,47,68,24 "66","1","Calabria",1372,120,250,7355,702,44,68,28 "67","1","Calabria",1336,113,242,7293,855,38,60,18 "68","1","Calabria",1401,151,238,7164,857,45,72,36 "69","1","Calabria",1390,119,234,7236,823,40,62,41 "70","1","Calabria",1432,152,281,7029,949,39,55,25 "71","1","Calabria",1412,124,298,7182,790,45,68,28 "72","1","Calabria",1366,147,291,7197,783,51,70,34 "73","1","Calabria",1383,118,273,7282,738,45,68,29 "74","1","Calabria",1283,102,263,7400,763,54,65,28 "75","1","Calabria",1296,136,260,7380,780,48,51,18 "76","1","Calabria",1287,108,287,7343,826,44,44,23 "77","1","Calabria",1351,159,296,7229,810,36,60,22 "78","1","Calabria",1241,97,268,7499,709,52,69,36 "79","1","Calabria",1267,101,300,7230,898,74,65,34 "80","1","Calabria",1235,138,252,7322,861,54,66,36 "81","1","Calabria",1255,103,223,7395,848,47,56,30 "82","1","South-Apulia",1454,183,196,7057,1014,27,46,19 "83","1","South-Apulia",1347,194,197,7277,895,25,46,15 "84","1","South-Apulia",1364,204,225,6929,1084,21,50,14 "85","1","South-Apulia",1410,199,216,7130,955,21,48,19 "86","1","South-Apulia",1384,178,208,7105,999,29,67,26 "87","1","South-Apulia",1412,185,217,6842,1203,34,72,32 "88","1","South-Apulia",1410,232,280,6715,1233,32,60,24 "89","1","South-Apulia",1509,209,257,6647,1240,42,62,30 "90","1","South-Apulia",1317,197,256,7036,1067,40,60,22 "91","1","South-Apulia",1286,192,203,7132,1053,38,65,28 "92","1","South-Apulia",1273,191,202,6862,1303,43,70,28 "93","1","South-Apulia",1463,183,183,6747,1307,36,60,24 "94","1","South-Apulia",1399,187,191,6861,1233,38,60,17 "95","1","South-Apulia",1413,193,208,6875,1202,30,60,18 "96","1","South-Apulia",1369,206,203,6953,1168,35,50,16 "97","1","South-Apulia",1488,172,170,6920,1144,37,54,14 "98","1","South-Apulia",1323,160,205,6911,1298,24,50,17 "99","1","South-Apulia",1311,166,170,6902,1312,41,69,28 "100","1","South-Apulia",1286,163,183,7040,1230,29,57,12 "101","1","South-Apulia",1380,173,188,7038,1139,31,44,14 "102","1","South-Apulia",1394,164,223,7086,1042,24,43,23 "103","1","South-Apulia",1324,174,198,6863,1289,36,70,21 "104","1","South-Apulia",1290,157,192,7000,1263,26,51,19 "105","1","South-Apulia",1361,163,196,6888,1273,37,58,24 "106","1","South-Apulia",1387,182,242,6913,1101,44,68,30 "107","1","South-Apulia",1369,180,181,7000,1130,39,45,24 "108","1","South-Apulia",1303,165,175,7025,1243,31,41,16 "109","1","South-Apulia",1346,160,169,7072,1151,39,48,15 "110","1","South-Apulia",1369,171,184,6937,1246,30,48,15 "111","1","South-Apulia",1305,172,169,7004,1260,28,50,11 "112","1","South-Apulia",1351,179,186,6935,1243,36,50,19 "113","1","South-Apulia",1283,151,182,7000,1271,40,52,21 "114","1","South-Apulia",1449,175,198,6883,1162,40,70,22 "115","1","South-Apulia",1310,180,183,7054,1202,26,32,12 "116","1","South-Apulia",1360,163,176,6901,1280,28,65,27 "117","1","South-Apulia",1300,187,196,6920,1253,41,76,25 "118","1","South-Apulia",1368,171,218,7010,1057,41,54,26 "119","1","South-Apulia",1207,151,156,7159,1234,27,51,14 "120","1","South-Apulia",1348,154,183,6917,1277,48,56,16 "121","1","South-Apulia",1334,186,229,7261,827,34,56,20 "122","1","South-Apulia",1301,156,207,7003,1229,41,48,14 "123","1","South-Apulia",1226,181,213,6961,1230,47,74,26 "124","1","South-Apulia",1201,168,190,7100,1216,43,64,16 "125","1","South-Apulia",1297,153,177,7004,1260,35,60,16 "126","1","South-Apulia",1248,163,158,7103,1222,31,60,14 "127","1","South-Apulia",1335,159,197,6974,1220,36,60,17 "128","1","South-Apulia",1219,167,171,7087,1254,35,50,16 "129","1","South-Apulia",1318,179,177,7030,1194,35,42,25 "130","1","South-Apulia",1264,167,166,7130,1187,22,52,12 "131","1","South-Apulia",1201,175,201,7129,1193,36,49,15 "132","1","South-Apulia",1252,180,181,7055,1214,31,59,38 "133","1","South-Apulia",1273,182,209,6965,1191,43,74,23 "134","1","South-Apulia",1351,179,170,7034,1154,35,66,10 "135","1","South-Apulia",1336,155,212,7103,1086,33,55,20 "136","1","South-Apulia",1499,201,182,6803,1204,30,56,24 "137","1","South-Apulia",1425,198,193,7032,1041,31,52,17 "138","1","South-Apulia",1358,204,227,6962,1109,41,65,34 "139","1","South-Apulia",1346,181,257,7147,933,40,60,36 "140","1","South-Apulia",1392,186,256,6732,1278,53,64,29 "141","1","South-Apulia",1311,166,222,7006,1147,41,80,27 "142","1","South-Apulia",1314,171,229,6923,1198,47,76,42 "143","1","South-Apulia",1409,200,207,6842,1224,31,60,27 "144","1","South-Apulia",1342,174,221,6993,1147,36,64,23 "145","1","South-Apulia",1387,182,206,7100,1020,34,54,17 "146","1","South-Apulia",1413,202,205,6920,1165,36,46,13 "147","1","South-Apulia",1430,209,225,6800,1200,32,59,27 "148","1","South-Apulia",1336,185,223,6956,1155,56,73,16 "149","1","South-Apulia",1372,200,200,6916,1189,33,50,22 "150","1","South-Apulia",1330,157,228,7055,1108,42,55,25 "151","1","South-Apulia",1412,207,208,6822,1239,36,51,28 "152","1","South-Apulia",1321,209,217,6948,1178,42,62,23 "153","1","South-Apulia",1401,200,217,6980,1073,40,68,21 "154","1","South-Apulia",1401,214,217,6734,1293,44,69,27 "155","1","South-Apulia",1457,168,242,6724,1266,54,59,30 "156","1","South-Apulia",1451,199,221,6835,1177,37,51,29 "157","1","South-Apulia",1438,206,248,6806,1183,34,57,28 "158","1","South-Apulia",1462,204,237,6644,1309,42,54,28 "159","1","South-Apulia",1529,215,203,6602,1310,45,69,27 "160","1","South-Apulia",1510,189,245,6752,1188,36,52,28 "161","1","South-Apulia",1437,222,184,6803,1240,43,56,16 "162","1","South-Apulia",1327,129,247,7024,1157,38,56,22 "163","1","South-Apulia",1438,172,252,6630,1380,40,64,24 "164","1","South-Apulia",1447,176,189,6849,1180,42,64,26 "165","1","South-Apulia",1355,144,214,6972,1198,33,60,24 "166","1","South-Apulia",1369,156,241,6890,1209,42,63,30 "167","1","South-Apulia",1471,188,276,6697,1269,34,51,16 "168","1","South-Apulia",1456,179,240,6738,1267,41,65,14 "169","1","South-Apulia",1314,140,207,7020,1220,28,59,12 "170","1","South-Apulia",1408,176,192,6909,1195,45,50,25 "171","1","South-Apulia",1397,172,191,7107,1018,36,50,29 "172","1","South-Apulia",1413,191,186,6937,1180,31,46,13 "173","1","South-Apulia",1539,194,213,6764,1178,38,58,16 "174","1","South-Apulia",1304,159,234,7019,1174,38,53,19 "175","1","South-Apulia",1341,160,231,7033,1069,40,67,33 "176","1","South-Apulia",1508,208,249,6641,1311,25,43,20 "177","1","South-Apulia",1515,226,257,6595,1287,41,63,16 "178","1","South-Apulia",1262,165,235,7120,1113,32,51,21 "179","1","South-Apulia",1307,197,238,7003,1144,37,50,24 "180","1","South-Apulia",1294,159,253,7009,1190,30,52,13 "181","1","South-Apulia",1460,187,215,6843,1172,35,56,32 "182","1","South-Apulia",1476,187,203,6837,1197,36,48,22 "183","1","South-Apulia",1482,178,197,6814,1201,40,64,24 "184","1","South-Apulia",1388,176,185,7008,1111,48,53,31 "185","1","South-Apulia",1367,172,235,7066,1054,35,45,26 "186","1","South-Apulia",1272,207,205,7152,1098,37,52,22 "187","1","South-Apulia",1323,157,234,7132,1022,38,58,31 "188","1","South-Apulia",1206,218,242,7193,1002,37,54,25 "189","1","South-Apulia",1383,157,217,7018,1090,40,60,37 "190","1","South-Apulia",1521,190,238,6956,986,36,50,23 "191","1","South-Apulia",1350,168,227,6986,1165,29,58,17 "192","1","South-Apulia",1422,181,218,6813,1230,30,59,21 "193","1","South-Apulia",1298,166,224,6986,1162,34,65,31 "194","1","South-Apulia",1447,236,245,6607,1336,33,51,21 "195","1","South-Apulia",1347,197,211,6795,1300,32,59,34 "196","1","South-Apulia",1339,170,253,6989,1110,29,63,23 "197","1","South-Apulia",1388,183,216,6867,1208,28,61,21 "198","1","South-Apulia",1527,260,232,6488,1370,31,45,20 "199","1","South-Apulia",1495,237,236,6571,1318,32,58,26 "200","1","South-Apulia",1487,246,251,6504,1390,29,53,19 "201","1","South-Apulia",1399,180,232,6855,1190,32,66,22 "202","1","South-Apulia",1489,215,242,6777,1145,30,60,22 "203","1","South-Apulia",1339,166,226,6928,1198,30,60,23 "204","1","South-Apulia",1482,246,238,6444,1462,27,50,20 "205","1","South-Apulia",1434,172,255,6646,1354,27,59,25 "206","1","South-Apulia",1347,156,214,6850,1313,25,48,19 "207","1","South-Apulia",1340,158,233,6848,1272,32,63,25 "208","1","South-Apulia",1453,180,244,6752,1238,34,54,23 "209","1","South-Apulia",1306,149,226,7082,1097,33,61,24 "210","1","South-Apulia",1349,161,217,6997,1138,31,62,23 "211","1","South-Apulia",1254,151,205,7319,947,28,54,23 "212","1","South-Apulia",1168,144,220,7230,1109,31,52,28 "213","1","South-Apulia",1346,167,224,6959,1111,30,49,23 "214","1","South-Apulia",1390,184,212,6898,1189,29,44,19 "215","1","South-Apulia",1283,149,224,7077,1104,30,57,32 "216","1","South-Apulia",1214,137,232,7269,1005,32,55,23 "217","1","South-Apulia",1491,227,205,6941,988,33,68,34 "218","1","South-Apulia",1479,218,207,7039,887,36,65,36 "219","1","South-Apulia",1445,174,228,6875,1123,29,69,31 "220","1","South-Apulia",1439,183,218,6775,1226,32,66,29 "221","1","South-Apulia",1387,154,204,6991,1090,34,74,32 "222","1","South-Apulia",1426,169,192,7025,1043,31,64,27 "223","1","South-Apulia",1451,200,208,6980,1006,30,62,31 "224","1","South-Apulia",1493,204,188,6913,1044,32,61,35 "225","1","South-Apulia",1419,192,207,6996,1014,36,70,36 "226","1","South-Apulia",1342,177,199,7172,952,34,65,33 "227","1","South-Apulia",1349,152,236,7145,949,35,75,29 "228","1","South-Apulia",1440,196,208,6938,1070,32,61,26 "229","1","South-Apulia",1460,215,197,6918,1081,28,55,23 "230","1","South-Apulia",1249,133,205,7417,827,33,72,33 "231","1","South-Apulia",1348,159,238,7017,1081,31,67,25 "232","1","South-Apulia",1341,155,244,6958,1144,32,68,26 "233","1","South-Apulia",1398,149,204,7182,907,29,76,30 "234","1","South-Apulia",1454,200,199,6910,1090,30,62,25 "235","1","South-Apulia",1334,153,219,6928,1214,33,66,24 "236","1","South-Apulia",1438,204,189,7107,910,33,63,27 "237","1","South-Apulia",1303,138,212,7170,1016,34,69,25 "238","1","South-Apulia",1323,147,210,7108,1070,33,61,20 "239","1","South-Apulia",1417,169,207,6875,1184,34,57,27 "240","1","South-Apulia",1360,167,225,6883,1220,31,55,27 "241","1","South-Apulia",1420,179,214,6923,1121,33,56,27 "242","1","South-Apulia",1472,218,214,6724,1238,29,53,23 "243","1","South-Apulia",1368,174,205,7042,1066,31,57,26 "244","1","South-Apulia",1367,173,228,6948,1141,32,53,24 "245","1","South-Apulia",1403,173,209,6843,1210,33,63,33 "246","1","South-Apulia",1413,197,206,6737,1387,34,60,31 "247","1","South-Apulia",1201,138,207,7011,1269,37,64,35 "248","1","South-Apulia",1359,180,207,6895,1203,33,61,30 "249","1","South-Apulia",1518,198,225,6681,1243,29,57,24 "250","1","South-Apulia",1434,185,189,6771,1269,30,62,25 "251","1","South-Apulia",1367,162,179,6772,1368,33,64,27 "252","1","South-Apulia",1461,181,197,6783,1246,26,57,23 "253","1","South-Apulia",1368,161,198,7030,1095,33,59,31 "254","1","South-Apulia",1419,159,215,6862,1193,35,60,31 "255","1","South-Apulia",1514,162,298,6725,1119,45,93,30 "256","1","South-Apulia",1328,171,253,6987,1030,38,83,39 "257","1","South-Apulia",1469,160,337,6675,1127,44,94,36 "258","1","Sicily",1222,133,227,7425,824,36,69,35 "259","1","Sicily",1639,172,331,6510,1124,46,91,32 "260","1","Sicily",1345,133,272,6801,1194,48,83,37 "261","1","Sicily",1339,170,275,6838,1060,46,88,43 "262","1","Sicily",1194,135,263,7277,889,44,95,41 "263","1","Sicily",1112,68,375,7770,448,52,69,45 "264","1","Sicily",1222,70,329,7605,566,48,67,43 "265","1","Sicily",1136,72,341,7616,661,49,65,32 "266","1","Sicily",926,41,277,7815,784,45,65,25 "267","1","Sicily",1105,69,373,7714,532,51,68,37 "268","1","Sicily",1109,79,305,7576,763,45,64,36 "269","1","Sicily",1284,93,265,7235,893,43,77,46 "270","1","Sicily",1120,69,277,7416,946,42,59,36 "271","1","Sicily",916,52,281,7870,694,42,64,58 "272","1","Sicily",905,49,288,7747,812,49,71,56 "273","1","Sicily",1206,55,287,7329,935,44,74,42 "274","1","Sicily",1457,182,267,7020,863,41,84,37 "275","1","Sicily",1327,140,193,7328,823,36,87,35 "276","1","Sicily",1303,100,251,7045,1049,40,86,40 "277","1","Sicily",1444,175,259,6876,1027,34,78,32 "278","1","Sicily",1505,243,226,6962,858,30,72,27 "279","1","Sicily",1429,162,223,6917,1041,37,77,40 "280","1","Sicily",1491,162,211,6994,928,37,97,38 "281","1","Sicily",1393,128,211,7189,870,38,93,40 "282","1","Sicily",1404,134,210,7110,923,40,101,43 "283","1","Sicily",1222,130,214,7374,856,38,89,45 "284","1","Sicily",1153,74,316,7593,705,42,64,32 "285","1","Sicily",1169,76,307,7553,728,43,69,32 "286","1","Sicily",1369,104,237,7375,775,39,70,15 "287","1","Sicily",993,58,267,7743,773,41,62,44 "288","1","Sicily",980,53,254,7719,815,44,69,47 "289","1","Sicily",967,55,273,7692,833,45,63,47 "290","1","Sicily",1128,73,354,7527,728,44,76,38 "291","1","Sicily",1188,85,273,7445,814,44,73,42 "292","1","Sicily",1257,95,247,7405,812,43,70,35 "293","1","Sicily",1262,88,301,7471,704,43,71,31 "294","1","South-Apulia",1283,153,196,7107,1115,37,60,28 "295","1","South-Apulia",1263,155,199,7140,1148,31,42,18 "296","1","South-Apulia",1369,158,215,7160,958,38,69,32 "297","1","South-Apulia",1353,172,175,6965,1212,28,75,19 "298","1","South-Apulia",1187,139,185,7427,952,29,56,22 "299","1","South-Apulia",1732,231,156,6437,1313,45,62,23 "300","1","South-Apulia",1620,255,166,6628,1212,29,62,27 "301","1","South-Apulia",1543,172,193,6740,1157,52,87,34 "302","1","South-Apulia",1498,170,195,6804,1206,35,66,23 "303","1","South-Apulia",1399,169,171,7011,1100,36,72,16 "304","1","South-Apulia",1293,156,191,7101,1111,32,60,31 "305","1","South-Apulia",1420,175,152,7004,1149,27,50,20 "306","1","South-Apulia",1721,238,255,6300,1350,35,70,28 "307","1","South-Apulia",1742,221,156,6415,1315,43,82,23 "308","1","South-Apulia",1391,187,189,6975,1062,52,70,45 "309","1","South-Apulia",1517,206,249,6680,1205,33,80,27 "310","1","South-Apulia",1269,157,193,7140,1148,31,40,18 "311","1","South-Apulia",1577,204,208,6732,1183,20,52,20 "312","1","South-Apulia",1590,241,195,6705,1149,27,68,21 "313","1","South-Apulia",1621,280,197,6608,1179,28,58,27 "314","1","South-Apulia",1753,275,236,6367,1214,23,61,27 "315","1","South-Apulia",1679,260,177,6568,1191,30,59,33 "316","1","South-Apulia",1419,203,176,6973,1083,38,78,27 "317","1","South-Apulia",1693,236,174,6499,1204,51,102,37 "318","1","South-Apulia",1692,270,234,6499,1196,31,59,15 "319","1","South-Apulia",1638,252,215,6570,1199,39,53,29 "320","1","South-Apulia",1497,247,219,6621,1270,36,73,32 "321","1","South-Apulia",1442,222,194,6677,1314,36,72,38 "322","1","South-Apulia",1680,270,170,6440,1310,31,62,28 "323","1","South-Apulia",1463,164,185,6909,1154,49,58,17 "324","2","Inland-Sardinia",1129,120,222,7272,1112,43,98,2 "325","2","Inland-Sardinia",1042,135,210,7376,1116,35,90,3 "326","2","Inland-Sardinia",1103,96,210,7380,1085,32,94,3 "327","2","Inland-Sardinia",1118,97,221,7279,1154,35,94,2 "328","2","Inland-Sardinia",1052,95,215,7388,1126,31,92,1 "329","2","Inland-Sardinia",1116,102,231,7290,1168,26,66,1 "330","2","Inland-Sardinia",1108,132,231,7319,1101,20,66,2 "331","2","Inland-Sardinia",1129,108,212,7386,1074,28,62,3 "332","2","Inland-Sardinia",1085,91,223,7384,1126,28,62,3 "333","2","Inland-Sardinia",1104,103,233,7322,1147,27,61,2 "334","2","Inland-Sardinia",1098,88,212,7338,1140,28,67,1 "335","2","Coast-Sardinia",1135,98,251,7120,1314,20,61,2 "336","2","Coast-Sardinia",1158,108,245,7065,1326,22,75,1 "337","2","Coast-Sardinia",1133,110,241,7080,1342,21,68,3 "338","2","Coast-Sardinia",1095,125,250,7120,1305,21,83,1 "339","2","Coast-Sardinia",1201,87,238,6990,1383,25,75,3 "340","2","Coast-Sardinia",1213,112,245,7007,1335,22,65,3 "341","2","Inland-Sardinia",1108,92,231,7367,1110,29,62,3 "342","2","Inland-Sardinia",1075,103,207,7413,1096,32,68,2 "343","2","Inland-Sardinia",1059,96,228,7386,1128,25,72,2 "344","2","Inland-Sardinia",1176,92,207,7347,1057,35,82,1 "345","2","Inland-Sardinia",1159,98,213,7320,1108,38,64,1 "346","2","Inland-Sardinia",1132,80,201,7398,1095,27,67,2 "347","2","Inland-Sardinia",1107,75,220,7399,1096,29,90,1 "348","2","Inland-Sardinia",1092,104,234,7355,1126,28,58,2 "349","2","Inland-Sardinia",1119,81,219,7409,1057,33,81,2 "350","2","Inland-Sardinia",1106,93,212,7381,1104,35,68,1 "351","2","Inland-Sardinia",1047,101,238,7385,1120,28,89,1 "352","2","Inland-Sardinia",1165,99,214,7331,1101,22,67,3 "353","2","Inland-Sardinia",1158,84,201,7327,1123,29,77,2 "354","2","Inland-Sardinia",1095,88,203,7415,1093,37,78,1 "355","2","Inland-Sardinia",1176,75,205,7396,1107,33,74,2 "356","2","Inland-Sardinia",1103,109,220,7335,1140,28,59,2 "357","2","Inland-Sardinia",1112,92,209,7356,1125,32,73,2 "358","2","Inland-Sardinia",1091,93,222,7377,1113,20,53,2 "359","2","Inland-Sardinia",1080,98,219,7371,1125,33,78,1 "360","2","Inland-Sardinia",1051,108,227,7403,1114,30,66,3 "361","2","Inland-Sardinia",1096,84,211,7415,1091,30,71,2 "362","2","Inland-Sardinia",1142,97,225,7341,1101,28,65,1 "363","2","Inland-Sardinia",1047,96,236,7399,1107,32,80,3 "364","2","Inland-Sardinia",1114,86,210,7359,1116,31,83,2 "365","2","Inland-Sardinia",1140,93,241,7324,1098,23,74,1 "366","2","Inland-Sardinia",1075,91,200,7410,1107,36,80,1 "367","2","Inland-Sardinia",1092,106,219,7427,1125,33,77,1 "368","2","Inland-Sardinia",1076,95,204,7408,1130,27,79,2 "369","2","Inland-Sardinia",1178,89,201,7381,1099,34,87,2 "370","2","Inland-Sardinia",1095,104,223,7367,1111,43,56,2 "371","2","Coast-Sardinia",1166,97,272,6971,1390,20,83,3 "372","2","Coast-Sardinia",1154,119,257,7130,1253,22,61,1 "373","2","Coast-Sardinia",1177,111,241,6882,1470,22,95,2 "374","2","Coast-Sardinia",1160,96,240,7043,1357,24,79,2 "375","2","Coast-Sardinia",1122,104,241,7145,1313,15,58,1 "376","2","Coast-Sardinia",1132,99,257,7065,1362,24,90,3 "377","2","Coast-Sardinia",1096,100,260,7162,1282,25,74,2 "378","2","Coast-Sardinia",1131,87,233,7144,1307,25,72,3 "379","2","Coast-Sardinia",1184,105,258,7020,1340,26,66,2 "380","2","Coast-Sardinia",1135,94,235,7123,1320,24,67,2 "381","2","Coast-Sardinia",1084,96,240,7164,1330,28,57,1 "382","2","Coast-Sardinia",1086,127,252,7159,1285,28,62,2 "383","2","Coast-Sardinia",1140,95,258,7085,1347,23,71,3 "384","2","Coast-Sardinia",1138,101,254,7103,1310,25,68,1 "385","2","Coast-Sardinia",1159,110,261,7068,1297,27,77,2 "386","2","Inland-Sardinia",1051,78,211,7421,1146,30,82,2 "387","2","Inland-Sardinia",1048,79,213,7439,1130,28,61,2 "388","2","Inland-Sardinia",1061,86,220,7421,1102,29,79,3 "389","2","Inland-Sardinia",1105,88,210,7353,1142,28,72,1 "390","2","Inland-Sardinia",1145,35,237,7208,1118,20,46,2 "391","2","Inland-Sardinia",1049,96,219,7303,1168,22,47,2 "392","2","Inland-Sardinia",1105,120,218,7302,1158,23,45,3 "393","2","Inland-Sardinia",1030,84,214,7403,1177,21,70,1 "394","2","Inland-Sardinia",1070,98,215,7280,1240,28,68,3 "395","2","Inland-Sardinia",1103,81,208,7310,1177,30,90,3 "396","2","Inland-Sardinia",1040,101,205,7368,1176,25,85,3 "397","2","Inland-Sardinia",1100,95,210,7320,1113,22,72,3 "398","2","Inland-Sardinia",1118,85,199,7415,1060,36,86,3 "399","2","Inland-Sardinia",1065,98,230,7345,1163,24,74,1 "400","2","Inland-Sardinia",1131,78,221,7358,1120,22,69,2 "401","2","Inland-Sardinia",1080,120,218,7296,1145,35,105,2 "402","2","Inland-Sardinia",1075,86,231,7403,1109,22,73,3 "403","2","Inland-Sardinia",1040,103,228,7364,1173,25,66,2 "404","2","Inland-Sardinia",1128,82,203,7320,1148,30,88,1 "405","2","Inland-Sardinia",1060,111,231,7363,1149,20,65,1 "406","2","Inland-Sardinia",1103,78,220,7365,1149,20,65,2 "407","2","Inland-Sardinia",1110,91,201,7318,1185,24,74,2 "408","2","Inland-Sardinia",1091,108,218,7383,1183,28,88,3 "409","2","Inland-Sardinia",1094,96,220,7341,1127,26,96,2 "410","2","Coast-Sardinia",1131,87,208,7170,1308,28,57,2 "411","2","Coast-Sardinia",1175,108,214,7076,1307,33,85,2 "412","2","Coast-Sardinia",1076,77,202,7243,1305,29,67,1 "413","2","Coast-Sardinia",1120,90,240,7068,1383,23,75,1 "414","2","Coast-Sardinia",1152,111,238,7080,1372,25,81,2 "415","2","Coast-Sardinia",1141,95,250,7035,1388,22,68,2 "416","2","Coast-Sardinia",1098,103,267,7135,1301,24,76,2 "417","2","Coast-Sardinia",1126,100,236,7062,1380,26,69,1 "418","2","Coast-Sardinia",1087,89,243,7200,1302,18,60,1 "419","2","Coast-Sardinia",1115,96,236,7085,1372,20,75,2 "420","2","Coast-Sardinia",1178,92,241,7006,1376,22,84,1 "421","2","Coast-Sardinia",1162,106,242,7025,1368,25,71,2 "422","3","Umbria",1085,70,180,7955,605,20,50,1 "423","3","Umbria",1085,70,185,7955,600,25,55,1 "424","3","Umbria",1090,60,190,7950,600,28,47,2 "425","3","Umbria",1080,65,189,7960,602,35,20,1 "426","3","Umbria",1090,60,195,7955,600,28,42,2 "427","3","Umbria",1105,55,200,7900,600,37,55,2 "428","3","Umbria",1060,75,175,7975,610,20,55,2 "429","3","Umbria",1050,70,170,7977,605,28,65,1 "430","3","Umbria",1100,55,198,7905,600,35,50,3 "431","3","Umbria",1065,65,178,7965,605,22,65,2 "432","3","Umbria",1085,60,188,7955,602,30,50,2 "433","3","Umbria",1080,65,180,7960,605,25,55,1 "434","3","Umbria",1085,60,190,7955,602,30,53,1 "435","3","Umbria",1075,68,195,7960,602,20,40,3 "436","3","Umbria",1090,58,192,7950,600,35,40,3 "437","3","Umbria",1095,60,198,7945,600,38,34,2 "438","3","Umbria",1090,58,195,7950,600,30,42,2 "439","3","Umbria",1095,58,198,7950,602,35,32,1 "440","3","Umbria",1090,58,195,7940,600,35,42,2 "441","3","Umbria",1095,58,198,7945,600,35,34,1 "442","3","Umbria",1095,55,200,7940,600,35,45,3 "443","3","Umbria",1080,70,188,7965,608,28,36,3 "444","3","Umbria",1090,60,195,7950,600,32,38,2 "445","3","Umbria",1105,55,200,7900,595,39,56,1 "446","3","Umbria",1110,50,205,7900,595,40,52,1 "447","3","Umbria",1075,70,198,7978,608,28,33,2 "448","3","Umbria",1075,65,185,7980,608,35,42,3 "449","3","Umbria",1065,75,180,7975,610,25,50,3 "450","3","Umbria",1070,75,188,7980,602,22,45,2 "451","3","Umbria",1070,75,188,7980,602,22,45,1 "452","3","Umbria",1100,70,200,7910,610,39,44,1 "453","3","Umbria",1075,70,185,7960,610,22,58,2 "454","3","Umbria",1050,78,175,7990,610,18,59,3 "455","3","Umbria",1090,60,198,7945,600,32,35,2 "456","3","Umbria",1050,78,188,7990,608,28,23,3 "457","3","Umbria",1075,70,190,7975,605,28,27,3 "458","3","Umbria",1098,54,202,7945,595,42,32,2 "459","3","Umbria",1105,15,198,8005,575,52,20,2 "460","3","Umbria",1110,75,220,7915,510,55,65,2 "461","3","Umbria",1058,50,178,7988,626,40,55,3 "462","3","Umbria",1115,30,225,7955,600,55,15,2 "463","3","Umbria",1105,30,198,7995,570,52,20,3 "464","3","Umbria",1072,49,178,7980,615,48,48,2 "465","3","Umbria",1110,15,210,7990,570,50,20,2 "466","3","Umbria",1110,80,215,7910,525,50,60,1 "467","3","Umbria",1055,60,175,7985,620,45,50,1 "468","3","Umbria",1100,80,215,7930,535,45,60,2 "469","3","Umbria",1105,55,205,7965,600,25,20,2 "470","3","Umbria",1095,50,210,7948,600,25,35,2 "471","3","Umbria",1110,50,220,7950,600,52,10,2 "472","3","Umbria",1092,37,210,7955,600,40,40,3 "473","3","East-Liguria",1290,60,260,7550,670,70,100,2 "474","3","East-Liguria",1170,80,230,7690,720,40,70,1 "475","3","East-Liguria",1100,90,250,7680,760,30,80,2 "476","3","East-Liguria",1120,70,240,7720,730,40,80,2 "477","3","East-Liguria",1160,70,250,7650,750,30,90,1 "478","3","East-Liguria",1200,50,210,7770,690,20,50,3 "479","3","East-Liguria",1140,50,200,7990,580,10,20,1 "480","3","East-Liguria",1220,80,240,7610,760,30,60,2 "481","3","East-Liguria",1180,90,250,7520,800,50,100,2 "482","3","East-Liguria",1210,70,250,7560,780,40,90,2 "483","3","East-Liguria",1220,80,220,7540,770,60,100,2 "484","3","East-Liguria",1180,100,190,7520,820,50,100,1 "485","3","East-Liguria",1160,90,220,7580,790,40,90,1 "486","3","East-Liguria",1130,100,240,7620,780,30,90,1 "487","3","East-Liguria",1080,100,260,7710,750,20,70,2 "488","3","East-Liguria",1090,90,280,7730,720,50,100,1 "489","3","East-Liguria",1020,100,270,7770,710,40,90,1 "490","3","East-Liguria",1090,90,250,7680,760,60,80,1 "491","3","East-Liguria",1120,100,260,7720,680,30,80,2 "492","3","East-Liguria",1080,80,240,7830,670,30,70,2 "493","3","East-Liguria",1160,70,230,7860,640,10,20,1 "494","3","East-Liguria",1100,80,240,7820,670,20,70,2 "495","3","East-Liguria",1050,100,250,7930,630,10,30,3 "496","3","East-Liguria",1090,90,270,7780,690,30,50,3 "497","3","East-Liguria",1120,80,260,7750,680,30,80,3 "498","3","East-Liguria",1120,100,250,7680,730,40,70,2 "499","3","East-Liguria",1190,90,230,7670,710,30,80,2 "500","3","East-Liguria",1170,110,250,7620,740,20,90,1 "501","3","East-Liguria",1120,100,230,7720,730,20,70,1 "502","3","East-Liguria",1190,80,270,7690,720,10,40,2 "503","3","East-Liguria",1400,90,270,7420,800,0,20,2 "504","3","East-Liguria",1350,80,250,7520,760,10,30,1 "505","3","East-Liguria",1090,60,220,7890,670,10,60,2 "506","3","East-Liguria",1150,90,230,7790,650,30,60,1 "507","3","East-Liguria",1240,90,220,7820,590,10,30,1 "508","3","East-Liguria",1220,100,240,7890,530,0,10,2 "509","3","East-Liguria",1180,80,250,7870,580,10,30,2 "510","3","East-Liguria",1170,110,240,7730,630,30,90,1 "511","3","East-Liguria",1170,100,280,7710,640,20,70,3 "512","3","East-Liguria",1180,80,220,7790,680,10,40,1 "513","3","East-Liguria",1200,90,240,7820,590,10,50,2 "514","3","East-Liguria",1140,90,240,7880,570,20,60,3 "515","3","East-Liguria",1160,70,210,7870,580,30,80,3 "516","3","East-Liguria",1130,80,250,7780,650,40,60,3 "517","3","East-Liguria",1150,80,240,7800,630,30,70,2 "518","3","East-Liguria",1110,70,240,7820,670,20,70,3 "519","3","East-Liguria",1150,70,220,7850,620,20,40,2 "520","3","East-Liguria",1180,80,240,7760,670,20,50,2 "521","3","East-Liguria",1020,80,250,7920,680,10,30,3 "522","3","East-Liguria",610,80,230,8410,650,0,20,3 "523","3","West-Liguria",1190,150,290,7340,1020,0,10,2 "524","3","West-Liguria",1110,130,210,7550,1000,0,0,1 "525","3","West-Liguria",1020,100,220,7530,1030,0,0,3 "526","3","West-Liguria",1070,120,210,7600,990,0,10,3 "527","3","West-Liguria",1010,90,350,7480,1050,10,10,1 "528","3","West-Liguria",1060,140,240,7680,830,10,40,2 "529","3","West-Liguria",1060,140,270,7620,880,10,20,1 "530","3","West-Liguria",1030,100,230,7740,900,0,0,2 "531","3","West-Liguria",1120,130,250,7530,970,0,0,3 "532","3","West-Liguria",1030,110,220,7760,980,0,0,2 "533","3","West-Liguria",1070,100,230,7600,990,10,0,1 "534","3","West-Liguria",1140,180,220,7610,850,10,10,2 "535","3","West-Liguria",1090,180,230,7590,860,10,40,2 "536","3","West-Liguria",980,110,300,7720,910,10,0,3 "537","3","West-Liguria",980,90,330,7540,1040,0,0,2 "538","3","West-Liguria",960,90,200,7810,940,0,0,2 "539","3","West-Liguria",990,90,210,7780,930,0,0,2 "540","3","West-Liguria",1060,120,210,7600,1010,0,0,1 "541","3","West-Liguria",1240,150,250,7610,730,10,10,1 "542","3","West-Liguria",1060,90,310,7850,690,0,0,2 "543","3","West-Liguria",1020,100,290,7620,960,0,10,2 "544","3","West-Liguria",970,90,220,7700,1020,0,0,3 "545","3","West-Liguria",1180,130,220,7450,1010,0,10,2 "546","3","West-Liguria",1060,140,240,7690,850,10,10,1 "547","3","West-Liguria",990,100,250,7630,1030,0,0,3 "548","3","West-Liguria",1010,90,350,7630,940,10,0,3 "549","3","West-Liguria",1040,90,250,7780,820,10,10,1 "550","3","West-Liguria",1040,90,250,7810,810,10,10,2 "551","3","West-Liguria",1020,90,350,7620,920,10,0,3 "552","3","West-Liguria",1020,90,260,7620,1010,0,0,3 "553","3","West-Liguria",1010,90,350,7610,930,10,0,3 "554","3","West-Liguria",920,110,340,7720,910,0,0,3 "555","3","West-Liguria",1030,100,250,7710,900,0,10,2 "556","3","West-Liguria",960,90,300,7820,830,0,0,3 "557","3","West-Liguria",1030,110,210,7810,840,0,0,1 "558","3","West-Liguria",1010,100,240,7710,910,10,20,2 "559","3","West-Liguria",1020,90,240,7800,850,0,0,2 "560","3","West-Liguria",1120,90,300,7650,830,0,10,1 "561","3","West-Liguria",1090,90,290,7710,800,10,0,2 "562","3","West-Liguria",1100,120,280,7630,770,10,10,2 "563","3","West-Liguria",1090,80,240,7820,760,10,0,2 "564","3","West-Liguria",1150,90,250,7720,810,0,10,3 "565","3","West-Liguria",1110,90,230,7810,750,0,10,2 "566","3","West-Liguria",1010,110,210,7720,950,0,0,1 "567","3","West-Liguria",1070,100,220,7730,870,10,10,2 "568","3","West-Liguria",1280,110,290,7490,790,10,10,2 "569","3","West-Liguria",1060,100,270,7740,810,10,10,3 "570","3","West-Liguria",1010,90,210,7720,970,0,0,2 "571","3","West-Liguria",990,120,250,7750,870,10,10,2 "572","3","West-Liguria",960,80,240,7950,740,10,20,2 ggobi-2.1.12/data/tmin1.xml0000644000175000017500000000347414651527764011061 This is a simple example for testing automatically computed levels for a categorical variable using the levels="auto" attribute for a categoricalvariable element. It also uses the string element to identify these values. Note that because we want to tag one of the elements of each record, we have to tag them all so that this can be a valid xml file. low medium high biz res unknown 42 4870 00 AB C 42 4880 0 1 DEF 7 4890 1 2 GHI 12 5000 2 1 J 18 5100 2 2 KLM 12 5000 2 1 NOP QRST 18 520022Happy Birthday ggobi-2.1.12/data/river.xml0000644000175000017500000003173614651527764011162 Andreas says: The river data I got from Don Percival, Applied Physics Lab, Seattle, but I wouldn't know whether he is the proper source. What you need to know: the data are monthly average river flow level of Willamette River in Oregon. I don't know anymore the particular years. 1.000 8.954 8.954 2.000 9.494 8.954 3.000 10.194 9.494 4.000 10.957 10.194 5.000 11.078 10.957 6.000 10.982 11.078 7.000 10.490 10.982 8.000 10.275 10.490 9.000 10.166 10.275 10.000 9.235 10.166 11.000 8.565 9.235 12.000 8.511 8.565 13.000 10.121 8.511 14.000 11.185 10.121 15.000 10.935 11.185 16.000 11.180 10.935 17.000 10.957 11.180 18.000 10.568 10.957 19.000 10.140 10.568 20.000 9.995 10.140 21.000 9.142 9.995 22.000 8.612 9.142 23.000 8.389 8.612 24.000 8.388 8.389 25.000 9.975 8.388 26.000 10.268 9.975 27.000 11.051 10.268 28.000 10.517 11.051 29.000 10.969 10.517 30.000 10.431 10.969 31.000 10.410 10.431 32.000 10.080 10.410 33.000 9.589 10.080 34.000 9.409 9.589 35.000 8.587 9.409 36.000 8.532 8.587 37.000 8.401 8.532 38.000 8.295 8.401 39.000 9.696 8.295 40.000 11.410 9.696 41.000 11.216 11.410 42.000 10.417 11.216 43.000 10.047 10.417 44.000 10.374 10.047 45.000 10.134 10.374 46.000 9.142 10.134 47.000 8.697 9.142 48.000 9.047 8.697 49.000 9.874 9.047 50.000 11.420 9.874 51.000 10.782 11.420 52.000 11.207 10.782 53.000 10.273 11.207 54.000 10.290 10.273 55.000 9.499 10.290 56.000 9.645 9.499 57.000 9.204 9.645 58.000 8.791 9.204 59.000 9.013 8.791 60.000 9.221 9.013 61.000 9.586 9.221 62.000 9.804 9.586 63.000 10.516 9.804 64.000 10.024 10.516 65.000 9.966 10.024 66.000 10.754 9.966 67.000 10.245 10.754 68.000 10.096 10.245 69.000 9.381 10.096 70.000 8.837 9.381 71.000 8.880 8.837 72.000 9.706 8.880 73.000 10.474 9.706 74.000 11.503 10.474 75.000 11.589 11.503 76.000 10.626 11.589 77.000 10.658 10.626 78.000 10.540 10.658 79.000 10.286 10.540 80.000 10.007 10.286 81.000 9.297 10.007 82.000 8.781 9.297 83.000 8.835 8.781 84.000 8.912 8.835 85.000 10.184 8.912 86.000 10.641 10.184 87.000 10.033 10.641 88.000 9.880 10.033 89.000 11.278 9.880 90.000 10.429 11.278 91.000 9.787 10.429 92.000 9.458 9.787 93.000 8.811 9.458 94.000 8.651 8.811 95.000 8.802 8.651 96.000 9.164 8.802 97.000 9.395 9.164 98.000 10.460 9.395 99.000 11.100 10.460 100.000 11.167 11.100 101.000 10.491 11.167 102.000 10.091 10.491 103.000 10.024 10.091 104.000 9.525 10.024 105.000 9.023 9.525 106.000 8.733 9.023 107.000 8.824 8.733 108.000 9.072 8.824 109.000 10.437 9.072 110.000 10.387 10.437 111.000 10.852 10.387 112.000 10.913 10.852 113.000 9.936 10.913 114.000 10.263 9.936 115.000 10.024 10.263 116.000 9.451 10.024 117.000 8.810 9.451 118.000 8.616 8.810 119.000 8.892 8.616 120.000 9.706 8.892 121.000 9.598 9.706 122.000 9.705 9.598 123.000 9.638 9.705 124.000 10.682 9.638 125.000 10.659 10.682 126.000 10.701 10.659 127.000 10.417 10.701 128.000 10.200 10.417 ggobi-2.1.12/data/tmin4.xml0000644000175000017500000000434114651527764011056 This is a simple example for testing automatically computed levels for a categorical variable using the levels="auto" attribute for a categoricalvariable element. It also uses the string element to identify these values. And differs from tmin3.xml by having edges that use these identifiers. low medium high biz res unknown 010 00 AB C 1 2001 DEF 2 3012 GHI 3 4021 J 4 5022 KLM 5 6021 NOP QRST 6 7022Happy Birthday 1.0 2.0 2.0 1.0 2.0 2.0 ggobi-2.1.12/data/tips.xml0000644000175000017500000012337114651527764011007 thurs fri sat sun lunch dinner 1 2 3 4 5 6 1 16.99 1.01 F no 6 1 2 2 10.34 1.66 M no 6 1 3 3 21.01 3.50 M no 6 1 3 4 23.68 3.31 M no 6 1 2 5 24.59 3.61 F no 6 1 4 6 25.29 4.71 M no 6 1 4 7 8.77 2.00 M no 6 1 2 8 26.88 3.12 M no 6 1 4 9 15.04 1.96 M no 6 1 2 10 14.78 3.23 M no 6 1 2 11 10.27 1.71 M no 6 1 2 12 35.26 5.00 F no 6 1 4 13 15.42 1.57 M no 6 1 2 14 18.43 3.00 M no 6 1 4 15 14.83 3.02 F no 6 1 2 16 21.58 3.92 M no 6 1 2 17 10.33 1.67 F no 6 1 3 18 16.29 3.71 M no 6 1 3 19 16.97 3.50 F no 6 1 3 20 20.65 3.35 M no 5 1 3 21 17.92 4.08 M no 5 1 2 22 20.29 2.75 F no 5 1 2 23 15.77 2.23 F no 5 1 2 24 39.42 7.58 M no 5 1 4 25 19.82 3.18 M no 5 1 2 26 17.81 2.34 M no 5 1 4 27 13.37 2.00 M no 5 1 2 28 12.69 2.00 M no 5 1 2 29 21.70 4.30 M no 5 1 2 30 19.65 3.00 F no 5 1 2 31 9.55 1.45 M no 5 1 2 32 18.35 2.50 M no 5 1 4 33 15.06 3.00 F no 5 1 2 34 20.69 2.45 F no 5 1 4 35 17.78 3.27 M no 5 1 2 36 24.06 3.60 M no 5 1 3 37 16.31 2.00 M no 5 1 3 38 16.93 3.07 F no 5 1 3 39 18.69 2.31 M no 5 1 3 40 31.27 5.00 M no 5 1 3 41 16.04 2.24 M no 5 1 3 42 17.46 2.54 M no 6 1 2 43 13.94 3.06 M no 6 1 2 44 9.68 1.32 M no 6 1 2 45 30.40 5.60 M no 6 1 4 46 18.29 3.00 M no 6 1 2 47 22.23 5.00 M no 6 1 2 48 32.40 6.00 M no 6 1 4 49 28.55 2.05 M no 6 1 3 50 18.04 3.00 M no 6 1 2 51 12.54 2.50 M no 6 1 2 52 10.29 2.60 F no 6 1 2 53 34.81 5.20 F no 6 1 4 54 9.94 1.56 M no 6 1 2 55 25.56 4.34 M no 6 1 4 56 19.49 3.51 M no 6 1 2 57 38.01 3.00 M yes 5 1 4 58 26.41 1.50 F no 5 1 2 59 11.24 1.76 M yes 5 1 2 60 48.27 6.73 M no 5 1 4 61 20.29 3.21 M yes 5 1 2 62 13.81 2.00 M yes 5 1 2 63 11.02 1.98 M yes 5 1 2 64 18.29 3.76 M yes 5 1 4 65 17.59 2.64 M no 5 1 3 66 20.08 3.15 M no 5 1 3 67 16.45 2.47 F no 5 1 2 68 3.07 1.00 F yes 5 1 1 69 20.23 2.01 M no 5 1 2 70 15.01 2.09 M yes 5 1 2 71 12.02 1.97 M no 5 1 2 72 17.07 3.00 F no 5 1 3 73 26.86 3.14 F yes 5 1 2 74 25.28 5.00 F yes 5 1 2 75 14.73 2.20 F no 5 1 2 76 10.51 1.25 M no 5 1 2 77 17.92 3.08 M yes 5 1 2 78 27.20 4.00 M no 3 0 4 79 22.76 3.00 M no 3 0 2 80 17.29 2.71 M no 3 0 2 81 19.44 3.00 M yes 3 0 2 82 16.66 3.40 M no 3 0 2 83 10.07 1.83 F no 3 0 1 84 32.68 5.00 M yes 3 0 2 85 15.98 2.03 M no 3 0 2 86 34.83 5.17 F no 3 0 4 87 13.03 2.00 M no 3 0 2 88 18.28 4.00 M no 3 0 2 89 24.71 5.85 M no 3 0 2 90 21.16 3.00 M no 3 0 2 91 28.97 3.00 M yes 4 1 2 92 22.49 3.50 M no 4 1 2 93 5.75 1.00 F yes 4 1 2 94 16.32 4.30 F yes 4 1 2 95 22.75 3.25 F no 4 1 2 96 40.17 4.73 M yes 4 1 4 97 27.28 4.00 M yes 4 1 2 98 12.03 1.50 M yes 4 1 2 99 21.01 3.00 M yes 4 1 2 100 12.46 1.50 M no 4 1 2 101 11.35 2.50 F yes 4 1 2 102 15.38 3.00 F yes 4 1 2 103 44.30 2.50 F yes 5 1 3 104 22.42 3.48 F yes 5 1 2 105 20.92 4.08 F no 5 1 2 106 15.36 1.64 M yes 5 1 2 107 20.49 4.06 M yes 5 1 2 108 25.21 4.29 M yes 5 1 2 109 18.24 3.76 M no 5 1 2 110 14.31 4.00 F yes 5 1 2 111 14.00 3.00 M no 5 1 2 112 7.25 1.00 F no 5 1 1 113 38.07 4.00 M no 6 1 3 114 23.95 2.55 M no 6 1 2 115 25.71 4.00 F no 6 1 3 116 17.31 3.500 F no 6 1 2 117 29.93 5.07 M no 6 1 4 118 10.65 1.50 F no 3 0 2 119 12.43 1.80 F no 3 0 2 120 24.08 2.92 F no 3 0 4 121 11.69 2.31 M no 3 0 2 122 13.42 1.68 F no 3 0 2 123 14.26 2.50 M no 3 0 2 124 15.95 2.00 M no 3 0 2 125 12.48 2.52 F no 3 0 2 126 29.80 4.20 F no 3 0 6 127 8.52 1.48 M no 3 0 2 128 14.52 2.00 F no 3 0 2 129 11.38 2.00 F no 3 0 2 130 22.82 2.18 M no 3 0 3 131 19.08 1.50 M no 3 0 2 132 20.27 2.83 F no 3 0 2 133 11.17 1.50 F no 3 0 2 134 12.26 2.00 F no 3 0 2 135 18.26 3.25 F no 3 0 2 136 8.51 1.25 F no 3 0 2 137 10.33 2.00 F no 3 0 2 138 14.15 2.00 F no 3 0 2 139 16.00 2.00 M yes 3 0 2 140 13.16 2.75 F no 3 0 2 141 17.47 3.50 F no 3 0 2 142 34.30 6.70 M no 3 0 6 143 41.19 5.00 M no 3 0 5 144 27.05 5.00 F no 3 0 6 145 16.43 2.30 F no 3 0 2 146 8.35 1.50 F no 3 0 2 147 18.64 1.36 F no 3 0 3 148 11.87 1.63 F no 3 0 2 149 9.78 1.73 M no 3 0 2 150 7.51 2.00 M no 3 0 2 151 14.07 2.50 M no 6 1 2 152 13.13 2.00 M no 6 1 2 153 17.26 2.74 M no 6 1 3 154 24.55 2.00 M no 6 1 4 155 19.77 2.00 M no 6 1 4 156 29.85 5.14 F no 6 1 5 157 48.17 5.00 M no 6 1 6 158 25.00 3.75 F no 6 1 4 159 13.39 2.61 F no 6 1 2 160 16.49 2.00 M no 6 1 4 161 21.50 3.50 M no 6 1 4 162 12.66 2.50 M no 6 1 2 163 16.21 2.00 F no 6 1 3 164 13.81 2.00 M no 6 1 2 165 17.51 3.00 F yes 6 1 2 166 24.52 3.48 M no 6 1 3 167 20.76 2.24 M no 6 1 2 168 31.71 4.50 M no 6 1 4 169 10.59 1.61 F yes 5 1 2 170 10.63 2.00 F yes 5 1 2 171 50.81 10.00 M yes 5 1 3 172 15.81 3.16 M yes 5 1 2 173 7.25 5.15 M yes 6 1 2 174 31.85 3.18 M yes 6 1 2 175 16.82 4.00 M yes 6 1 2 176 32.90 3.11 M yes 6 1 2 177 17.89 2.00 M yes 6 1 2 178 14.48 2.00 M yes 6 1 2 179 9.60 4.00 F yes 6 1 2 180 34.63 3.55 M yes 6 1 2 181 34.65 3.68 M yes 6 1 4 182 23.33 5.65 M yes 6 1 2 183 45.35 3.50 M yes 6 1 3 184 23.17 6.50 M yes 6 1 4 185 40.55 3.00 M yes 6 1 2 186 20.69 5.00 M no 6 1 5 187 20.90 3.50 F yes 6 1 3 188 30.46 2.00 M yes 6 1 5 189 18.15 3.50 F yes 6 1 3 190 23.10 4.00 M yes 6 1 3 191 15.69 1.50 M yes 6 1 2 192 19.81 4.19 F yes 3 0 2 193 28.44 2.56 M yes 3 0 2 194 15.48 2.02 M yes 3 0 2 195 16.58 4.00 M yes 3 0 2 196 7.56 1.44 M no 3 0 2 197 10.34 2.00 M yes 3 0 2 198 43.11 5.00 F yes 3 0 4 199 13.00 2.00 F yes 3 0 2 200 13.51 2.00 M yes 3 0 2 201 18.71 4.00 M yes 3 0 3 202 12.74 2.01 F yes 3 0 2 203 13.00 2.00 F yes 3 0 2 204 16.40 2.50 F yes 3 0 2 205 20.53 4.00 M yes 3 0 4 206 16.47 3.23 F yes 3 0 3 207 26.59 3.41 M yes 5 1 3 208 38.73 3.00 M yes 5 1 4 209 24.27 2.03 M yes 5 1 2 210 12.76 2.23 F yes 5 1 2 211 30.06 2.00 M yes 5 1 3 212 25.89 5.16 M yes 5 1 4 213 48.33 9.00 M no 5 1 4 214 13.27 2.50 F yes 5 1 2 215 28.17 6.50 F yes 5 1 3 216 12.90 1.10 F yes 5 1 2 217 28.15 3.00 M yes 5 1 5 218 11.59 1.50 M yes 5 1 2 219 7.74 1.44 M yes 5 1 2 220 30.14 3.09 F yes 5 1 4 221 12.16 2.20 M yes 4 0 2 222 13.42 3.48 F yes 4 0 2 223 8.58 1.92 M yes 4 0 1 224 15.98 3.00 F no 4 0 3 225 13.42 1.58 M yes 4 0 2 226 16.27 2.50 F yes 4 0 2 227 10.09 2.00 F yes 4 0 2 228 20.45 3.00 M no 5 1 4 229 13.28 2.72 M no 5 1 2 230 22.12 2.88 F yes 5 1 2 231 24.01 2.00 M yes 5 1 4 232 15.69 3.00 M yes 5 1 3 233 11.61 3.39 M no 5 1 2 234 10.77 1.47 M no 5 1 2 235 15.53 3.00 M yes 5 1 2 236 10.07 1.25 M no 5 1 2 237 12.60 1.00 M yes 5 1 2 238 32.83 1.17 M yes 5 1 2 239 35.83 4.67 F no 5 1 3 240 29.03 5.920 M no 5 1 3 241 27.18 2.00 F yes 5 1 2 242 22.67 2.00 M yes 5 1 2 243 17.82 1.75 M no 5 1 2 244 18.78 3.00 F no 3 1 2 ggobi-2.1.12/data/snetwork.xml0000644000175000017500000006420714651527764011706 citizen green card visa full-time part-time 1.000 1.000 2.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 2.000 0.000 2.000 0.000 2.000 0.000 1.000 0.000 0.000 0.000 2.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 2.000 0.000 2.000 0.000 1.000 0.000 2.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 2.000 0.000 2.000 0.000 2.000 0.000 2.000 0.000 2.000 0.000 2.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 2.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 2.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 2.000 0.000 2.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 1.000 0.000 2.000 0.000 1.000 0.000 2.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 1.000 0.000 2.000 0.000 2.000 0.000 0.000 0.000 2.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 2.000 0.000 2.000 0.000 0.000 0.000 1.000 0.000 2.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2.000 0.000 1.000 0.000 0.000 0.000 2.000 0.000 2.000 0.000 2.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 1.000 1.000 0.000 0.000 1.000 0.000 1.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2.000 0.000 2.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 out in 673.600 0.000 2.828 0.900 0.000 -0.046 10.100 1.000 1.004 33.900 0.000 1.530 8.100 0.000 0.908 0.300 0.000 -0.523 2.000 0.000 0.301 2.600 0.000 0.415 13.400 0.000 1.127 1.600 0.000 0.204 9.600 0.000 0.982 9.900 0.000 0.996 7.900 0.000 0.898 0.400 0.000 -0.398 1.000 0.000 0.000 51.000 0.000 1.708 1.400 0.000 0.146 30.400 0.000 1.483 58.100 0.000 1.764 0.500 0.000 -0.301 1651.300 0.000 3.218 1.400 0.000 0.146 3700.200 0.000 3.568 2305.000 0.000 3.363 2410.800 0.000 3.382 2987.900 0.000 3.475 1567.000 0.000 3.195 2879.400 0.000 3.459 6.700 0.000 0.826 91.500 0.000 1.961 20122.199 0.000 4.304 2808.800 0.000 3.449 3899.700 0.000 3.591 11.000 0.000 1.041 344.000 0.000 2.537 62.400 0.000 1.795 36.400 0.000 1.561 5.900 0.000 0.771 6.100 0.000 0.785 72.300 0.000 1.859 1.100 0.000 0.041 0.200 0.000 -0.699 118.800 0.000 2.075 10.200 0.000 1.009 8.300 0.000 0.919 1.000 0.000 0.000 9.400 0.000 0.973 186.200 0.000 2.270 21.000 0.000 1.322 10.000 0.000 1.000 0.600 0.000 -0.222 28.700 0.000 1.458 2.900 0.000 0.462 0.100 0.000 -1.000 13.900 0.000 1.143 5.800 0.000 0.763 0.300 0.000 -0.523 2.000 0.000 0.301 22.400 0.000 1.350 24.300 0.000 1.386 116.600 0.000 2.067 452.700 0.000 2.656 407.600 0.000 2.610 240.000 0.000 2.380 129.800 0.000 2.113 0.900 0.000 -0.046 0.300 0.000 -0.523 323.900 0.000 2.510 730.200 0.000 2.863 237.400 0.000 2.375 96.100 0.000 1.983 212.700 0.000 2.328 16.800 0.000 1.225 19.500 0.000 1.290 23.600 0.000 1.373 39.400 0.000 1.595 111.400 0.000 2.047 1.600 1.000 0.204 17.600 0.000 1.246 92.900 0.000 1.968 1007.700 0.000 3.003 349.100 0.000 2.543 12.700 0.000 1.104 227.200 0.000 2.356 47.000 0.000 1.672 884.100 0.000 2.947 202.000 0.000 2.305 23.800 0.000 1.377 58.300 0.000 1.766 0.600 0.000 -0.222 34.800 0.000 1.542 32.600 0.000 1.513 118.500 0.000 2.074 3.800 0.000 0.580 395.500 0.000 2.597 0.100 0.000 -1.000 3.000 0.000 0.477 0.400 0.000 -0.398 3.200 0.000 0.505 11.000 0.000 1.041 0.900 0.000 -0.046 0.500 0.000 -0.301 0.800 0.000 -0.097 10.700 0.000 1.029 0.200 0.000 -0.699 22.500 0.000 1.352 15.500 0.000 1.190 8.600 0.000 0.934 28.000 0.000 1.447 14.600 1.000 1.164 2.300 0.000 0.362 4.800 0.000 0.681 22.700 0.000 1.356 12.600 0.000 1.100 5.900 0.000 0.771 241.300 1.000 2.383 0.800 0.000 -0.097 63.800 1.000 1.805 22.700 0.000 1.356 13.500 1.000 1.130 24.400 0.000 1.387 96.500 1.000 1.985 28.300 0.000 1.452 8.400 0.000 0.924 54.700 1.000 1.738 81.000 0.000 1.908 216.500 0.000 2.335 12.100 0.000 1.083 311.000 0.000 2.493 248.200 0.000 2.395 2.700 0.000 0.431 178.000 0.000 2.250 80.000 0.000 1.903 2.700 0.000 0.431 261.200 0.000 2.417 191.800 0.000 2.283 4837.900 0.000 3.685 2229.300 0.000 3.348 314.000 0.000 2.497 9.500 0.000 0.978 0.800 0.000 -0.097 48.200 0.000 1.683 8.200 0.000 0.914 13.000 0.000 1.114 30.100 0.000 1.479 8.000 0.000 0.903 61.000 0.000 1.785 59.300 0.000 1.773 106.000 0.000 2.025 0.800 0.000 -0.097 18.600 0.000 1.270 0.500 0.000 -0.301 48.200 0.000 1.683 2.000 0.000 0.301 69.400 0.000 1.841 5.300 0.000 0.724 0.200 0.000 -0.699 0.300 0.000 -0.523 0.200 0.000 -0.699 51.000 0.000 1.708 174.300 0.000 2.241 0.600 0.000 -0.222 1.900 0.000 0.279 24.100 0.000 1.382 2.400 0.000 0.380 46.600 0.000 1.668 28.800 0.000 1.459 28.900 0.000 1.461 3.900 0.000 0.591 19.300 0.000 1.286 1.000 0.000 0.000 3.000 0.000 0.477 225.500 0.000 2.353 73.400 0.000 1.866 38.900 0.000 1.590 40.000 0.000 1.602 145.300 0.000 2.162 213.700 0.000 2.330 266.800 0.000 2.426 16.500 0.000 1.217 1.600 0.000 0.204 20.400 0.000 1.310 102.800 1.000 2.012 212.800 1.000 2.328 78.000 1.000 1.892 122.400 1.000 2.088 86.300 0.000 1.936 32.900 1.000 1.517 78.800 0.000 1.897 122.200 0.000 2.087 154.500 0.000 2.189 11.700 0.000 1.068 19.400 0.000 1.288 0.400 0.000 -0.398 91.200 0.000 1.960 96.400 0.000 1.984 12.600 0.000 1.100 22.000 0.000 1.342 4.000 0.000 0.602 2.800 0.000 0.447 2.000 0.000 0.301 2.400 0.000 0.380 0.800 0.000 -0.097 ggobi-2.1.12/data/tmin.csv0000644000175000017500000000024614651527764010765 "","avgusage","foo","fraudp","bizres" "1",1,2,"low","biz" "2",2,3,"low","res" "3",3,4,"medium","biz" "4",4,5,"medium","res" "5",5,6,"high","biz" "6",6,7,"high","res" ggobi-2.1.12/data/places.csv0000644000175000017500000007606514651527764011301 "","Climate","HousingCost","HlthCare","Crime","Transp","Educ","Arts","Recreat","Econ","CaseNum","Long","Lat","Pop","StNum" "1",521,6200,237,923,4031,2757,996,1405,7633,1,-99.6890029907227,32.5589981079102,110932,44 "2",575,8138,1656,886,4883,2438,5564,2632,4350,2,-81.5179977416992,41.0849990844727,660328,36 "3",468,7339,618,970,2531,2560,237,859,5250,3,-84.1579971313477,31.5750007629395,112402,11 "4",476,7908,1431,610,6883,3399,4655,1617,5864,4,-73.7979965209961,42.7330017089844,835880,35 "5",659,8393,1853,1483,6558,3026,4496,2612,5727,5,-106.650001525879,35.0830001831055,419700,33 "6",520,5819,640,727,2444,2972,334,1018,5254,6,-92.4530029296875,31.3020000457764,135282,19 "7",559,8288,621,514,2881,3144,2333,1117,5097,7,-75.4400024414062,40.6160011291504,635481,39 "8",537,6487,965,706,4975,2945,1487,1280,5795,8,-90.161003112793,38.7939987182617,268229,15 "9",561,6191,432,399,4246,2778,256,1210,4230,9,-78.3949966430664,40.5149993896484,136621,39 "10",609,6546,669,1073,4902,2852,1235,1109,6241,10,-101.848999023438,35.382999420166,173699,44 "11",885,16047,2025,983,3954,2843,5632,3156,6220,11,-117.888999938965,33.7989997863770,1932709,5 "12",195,12175,601,1223,5091,2414,2346,3000,7668,12,-127.202003479004,48.8800010681152,174431,1 "13",530,5704,580,878,2865,2469,430,838,3370,13,-85.6849975585938,40.1669998168945,139336,16 "14",591,5725,820,975,2707,2772,169,613,4262,14,-82.6549987792969,34.5099983215332,133235,41 "15",546,11014,2508,1067,3433,3346,7559,2288,4579,15,-83.75,42.2830009460449,264748,23 "16",560,5530,598,1125,3051,2189,268,1165,4730,16,-85.8270034790039,33.6549987792969,119761,2 "17",396,7877,833,525,3298,2844,1166,2315,5275,17,-88.4670028686523,44.1580009460449,291369,49 "18",694,6722,1204,566,5086,2990,1391,1542,5196,18,-82.556999206543,35.5929985046387,160934,28 "19",601,6691,605,933,1866,2646,3546,1001,5193,19,-83.3830032348633,33.9570007324219,130015,11 "20",696,8316,3195,1308,8409,3057,7559,1362,6315,20,-84.3190002441406,33.7630004882812,2138231,11 "21",615,11074,637,1878,3556,2929,621,2711,8107,21,-74.438003540039,39.367000579834,276385,32 "22",534,6292,1798,872,2523,2915,1047,913,5431,22,-81.9670028686523,33.4700012207031,345918,11 "23",474,10384,1203,821,3943,2208,3857,1800,5097,23,-88.2809982299805,41.8940010070801,315607,15 "24",435,8831,782,1049,3670,3063,5355,1063,7439,24,-97.7419967651367,30.2819995880127,536688,44 "25",560,8068,420,1561,3725,2564,1222,1568,6056,25,-119.022003173828,35.375,403089,5 "26",567,9148,3562,1730,7405,3471,9788,2925,5503,26,-76.6169967651367,39.2879981994629,2199531,21 "27",451,7277,780,651,5613,2934,1995,2148,5172,27,-68.7720031738281,44.8019981384277,83919,22 "28",427,8083,342,1565,3329,2635,4237,1413,6308,28,-91.1849975585938,30.4500007629395,494151,19 "29",527,6342,900,1031,4652,2483,354,1648,4008,29,-85.181999206543,42.3219985961914,141557,23 "30",423,6288,616,1313,2782,2745,1795,1813,6019,30,-94.0120010375977,29.9909992218018,375497,44 "31",586,7866,861,310,2960,2535,1284,1480,3119,31,-80.3150024414062,40.693000793457,204441,39 "32",772,8329,240,825,3776,2778,1302,3200,4247,32,-122.483001708984,48.7630004882812,106701,48 "33",566,6761,570,1190,2989,2545,79,1477,3635,33,-86.4469985961914,42.1049995422363,171276,23 "34",559,14607,2661,857,3511,3653,9304,1918,6016,34,-74.0589981079102,40.890998840332,1292970,32 "35",452,8315,479,810,6285,3008,778,2046,5913,35,-108.504997253418,45.7799987792969,108035,27 "36",584,6458,441,810,2516,2592,679,2106,5801,36,-88.9690017700195,30.3969993591309,182202,26 "37",550,8257,1007,415,4529,3052,1599,1722,5614,37,-75.9130020141602,42.0979995727539,263460,35 "38",612,6811,1692,1123,5177,2851,3958,1234,4843,38,-86.806999206543,33.5120010375977,883946,2 "39",149,8365,804,413,4303,2686,1211,1630,6019,39,-100.777999877930,46.806999206543,79988,29 "40",558,7056,731,657,1746,2873,2152,1990,4829,40,-86.5279998779297,39.1650009155273,98785,16 "41",487,8654,815,673,5889,2854,1470,1605,5863,41,-88.9899978637695,40.4949989318848,119149,15 "42",592,8221,453,880,6575,2391,2385,1672,4633,42,-116.218002319336,43.6129989624023,173036,14 "43",623,11609,5301,1215,6801,3479,21042,3066,6363,43,-71.0579986572266,42.3619995117188,2805911,20 "44",459,11914,962,1088,7108,2587,3663,4012,7127,44,-105.193000793457,40.0909996032715,189625,6 "45",440,8242,333,1093,3805,2712,154,1349,7437,45,-82.5719985961914,27.4950008392334,148442,10 "46",423,8394,438,768,2391,2718,1506,1512,6020,46,-95.5699996948242,29.0429992675781,169587,44 "47",808,9060,310,651,1670,2544,382,1973,5671,47,-122.629997253418,47.5670013427734,147152,48 "48",648,13429,2550,943,3197,3029,8368,1913,7197,48,-73.1269989013672,41.2080001831055,438557,7 "49",516,10041,975,545,4495,2628,514,777,6527,49,-72.9499969482422,41.6730003356934,73762,7 "50",575,8263,916,1336,3810,2729,2001,1217,6900,50,-71.0169982910156,42.0849990844727,182891,20 "51",440,5376,91,974,3119,2413,162,3000,4968,51,-97.4820022583008,25.9190006256104,209727,44 "52",383,8228,640,1016,2530,2973,2002,1413,8040,52,-96.3570022583008,30.6439990997314,93588,44 "53",571,8064,2465,971,5384,3121,8567,2441,5047,53,-78.875,42.8870010375977,1015472,35 "54",637,6179,994,707,1910,2519,131,701,5680,54,-79.4329986572266,36.0970001220703,99319,28 "55",383,9673,1809,494,7146,3323,1741,3357,6726,55,-73.2070007324219,44.4749984741211,115308,47 "56",575,7332,443,650,4279,2754,989,1157,4847,56,-81.3779983520508,40.7980003356934,404421,36 "57",401,9839,345,989,4410,2453,303,1435,6303,57,-106.313003540039,42.8470001220703,71856,51 "58",434,7774,837,714,5270,2619,904,1501,5009,58,-91.6729965209961,41.9749984741211,169775,13 "59",525,8627,672,1022,7447,3147,2203,1700,5485,59,-88.197998046875,40.181999206543,168392,15 "60",569,7402,1463,1495,4207,3164,2993,2561,5153,60,-79.9300003051758,32.7630004882812,430462,41 "61",627,7789,708,721,5470,2894,2605,844,5257,61,-81.6449966430664,38.3680000305176,269595,50 "62",644,7169,999,1273,6099,3031,4313,1236,5671,62,-81.0169982910156,35.1370010375977,971391,28 "63",618,9531,1348,756,6041,3489,1422,1704,6055,63,-78.5070037841797,38.0379981994629,113568,46 "64",576,6189,564,946,3401,2415,2483,1238,4487,64,-85.3099975585938,35.0429992675781,426540,43 "65",514,10913,5766,1034,7742,3486,24846,2856,5205,65,-87.625,41.882999420166,6060387,15 "66",603,8587,243,947,4067,3126,1647,1543,5307,66,-121.837997436523,39.7319984436035,143851,5 "67",584,8143,2138,978,5748,2918,9688,2451,5270,67,-84.5130004882812,39.0999984741211,1401491,36 "68",544,6007,446,736,2226,2654,111,2219,4880,68,-87.4179992675781,36.6940002441406,150220,43 "69",579,9168,3167,1138,7333,2972,12679,3300,4879,69,-81.6999969482422,41.4970016479492,1898825,36 "70",526,8509,721,1086,3389,2754,1749,2375,7699,70,-104.819999694824,38.8330001831055,309424,6 "71",541,7702,1951,1065,3893,2377,2882,1331,5147,71,-92.3300018310547,38.9570007324219,100376,25 "72",526,7519,1421,1524,5859,2908,2489,1484,5279,72,-81.0449981689453,33.9930000305176,410088,41 "73",517,5817,833,820,2995,2665,1861,1214,4812,73,-84.9820022583008,32.4620018005371,239196,11 "74",558,8093,1837,1092,4364,2928,6648,2020,5165,74,-83.0019989013672,39.9620018005371,1243833,36 "75",362,6929,458,1335,3626,2840,1992,2037,6690,75,-97.6210021972656,27.7759990692139,326228,44 "76",591,6054,760,337,3709,3363,373,1036,4741,76,-78.7630004882812,39.6500015258789,107782,21 "77",544,9318,2825,1529,6213,3269,10438,2310,7710,77,-96.811996459961,32.7770004272461,1957378,44 "78",569,14420,2350,548,2715,3029,7415,1572,7060,78,-73.4599990844727,41.3930015563965,170369,7 "79",545,5709,593,379,3161,2943,85,501,4491,79,-79.3880004882812,36.5919990539551,111789,46 "80",440,8083,1113,834,3907,2901,1017,1920,4997,80,-90.5490036010742,41.5060005187988,383958,15 "81",544,7635,2253,1151,4775,2772,6935,1122,4532,81,-84.0029983520508,39.8390007019043,942083,36 "82",561,7203,723,1347,4117,2612,809,3967,6592,82,-81.0230026245117,29.2150001525879,258762,10 "83",480,7395,732,897,3867,2683,298,1222,4274,83,-88.9530029296875,39.8429985046387,131375,15 "84",521,10789,2533,1365,8145,3145,8477,2324,7164,84,-104.987998962402,39.7400016784668,1428836,6 "85",444,8028,1256,1044,5521,2613,1857,1802,5346,85,-93.6179962158203,41.5870018005371,367561,13 "86",536,8525,4142,1587,4808,3064,10389,2483,3904,86,-83.1279983520508,42.4420013427734,4488072,23 "87",336,5708,593,930,2232,2230,117,714,5453,87,-85.3929977416992,31.2229995727539,122453,2 "88",419,7993,640,571,3668,2701,340,1587,3949,88,-90.6750030517578,42.5029983520508,93745,13 "89",193,6040,1159,488,5205,2619,2377,3107,3922,89,-92.1129989624023,46.7830009460449,266650,24 "90",537,6501,444,1096,6539,2630,904,1610,6113,90,-89.9830017089844,38.5120010375977,300148,15 "91",257,7078,798,433,3197,2960,1807,1397,5348,91,-91.4710006713867,44.8660011291504,130932,49 "92",592,7343,528,1323,3705,2479,3800,1101,5080,92,-106.480003356934,31.7549991607666,479899,44 "93",521,6573,596,524,4168,2537,353,1023,4214,93,-85.9010009765625,41.6389999389648,137330,16 "94",467,7078,562,582,3324,3000,1048,1600,4813,94,-76.806999206543,42.0929985046387,97656,35 "95",461,6829,626,845,2312,2764,215,1200,8268,95,-97.875,36.3950004577637,62820,37 "96",605,7715,529,635,5754,2641,2032,1340,4299,96,-80.072998046875,42.1129989624023,279780,39 "97",741,9370,539,874,5293,3118,2631,3400,3045,97,-122.981002807617,43.9519996643066,275226,38 "98",550,6743,783,864,3496,2797,1876,1622,5206,98,-87.5749969482422,37.9700012207031,276252,16 "99",643,9017,900,861,4602,2439,749,2005,4884,99,-71.1009979248047,41.7939987182617,157222,20 "100",148,8168,920,503,6325,2506,2111,1414,5594,100,-96.777000427246,46.8759994506836,137574,29 "101",561,6274,872,1150,4402,3051,844,709,5255,101,-78.8769989013672,35.0550003051758,247160,28 "102",549,6686,594,545,3581,2334,1915,1695,4631,102,-94.150001525879,36.1459999084473,100494,3 "103",507,8252,655,655,2244,2799,270,790,5098,103,-71.7770004272461,42.5550003051758,94018,20 "104",540,7204,724,1671,4912,2511,2163,1355,3724,104,-83.6829986572266,43.0219993591309,450449,23 "105",546,5962,607,516,1454,2427,1021,994,4492,105,-87.6750030517578,34.7999992370605,135065,2 "106",552,6508,818,1334,4963,3109,628,800,4842,106,-79.7679977416992,34.1969985961914,110163,41 "107",490,9951,731,744,2637,2413,1609,4200,6631,107,-105.080001831055,40.4900016784668,149184,6 "108",572,10810,1252,1536,4186,2734,2027,2455,7136,108,-80.1370010375977,26.121000289917,1018200,10 "109",342,9298,546,787,4583,2729,380,4005,7166,109,-81.8730010986328,26.6420001983643,205266,10 "110",602,8842,527,1422,2143,3154,368,2058,7973,110,-80.3270034790039,27.4470005035400,151196,10 "111",482,5784,466,663,3092,2927,145,1736,4849,111,-94.4179992675781,35.3849983215332,162813,3 "112",536,7554,484,544,2886,2809,87,2092,6342,112,-86.6510009765625,30.761999130249,109920,10 "113",509,6733,1060,710,5416,2772,2846,1711,4195,113,-85.1419982910156,41.0719985961914,354156,16 "114",528,7956,1038,1348,4472,2627,6466,2366,6862,114,-97.1129989624023,32.7369995117188,973138,44 "115",559,9291,369,1483,4388,2407,3596,2984,5746,115,-119.782997131348,36.7319984436035,514621,5 "116",526,5382,622,749,2174,2299,153,300,4220,116,-86.0179977416992,34.0180015563965,103057,2 "117",402,7388,1731,1658,3527,3094,3335,1237,5739,117,-82.3300018310547,29.6599998474121,171371,10 "118",727,7767,1437,1213,3423,2809,1756,3000,6026,118,-94.8440017700195,29.3470001220703,195940,44 "119",483,7641,1364,996,5855,2526,4115,1940,3826,119,-87.4189987182617,41.6150016784668,642781,16 "120",476,7120,43,568,2241,2674,603,1883,5166,120,-73.6449966430664,43.310001373291,109649,35 "121",105,7898,1109,401,5587,2721,1921,1304,5646,121,-97.0370025634766,47.9199981689453,66100,29 "122",513,7780,1274,952,3454,2705,3255,1909,4848,122,-85.6699981689453,42.9630012512207,601680,23 "123",410,7143,667,792,3747,2737,401,2176,4697,123,-111.285003662109,47.5019989013672,80696,27 "124",490,8218,706,994,1641,2854,1254,739,5443,124,-104.693000793457,40.4179992675781,123438,6 "125",367,8401,916,583,3793,2622,2547,1925,5650,125,-88.0070037841797,44.5130004882812,175280,49 "126",626,7064,1694,967,4453,3090,4188,1651,5204,126,-80.0130004882812,36.0419998168945,851851,28 "127",655,6336,1260,1185,3950,3236,2569,1410,5012,127,-82.1729965209961,34.8950004577637,569066,41 "128",568,7763,818,627,3431,2990,825,1491,4477,128,-77.7200012207031,39.6450004577637,113086,21 "129",542,8227,1135,892,3338,2747,2316,1604,4618,129,-84.4810028076172,39.4570007324219,258787,36 "130",556,7891,2087,629,6164,3224,3083,1532,5322,130,-76.833999633789,40.2680015563965,555158,39 "131",516,11652,2521,1279,7120,3628,3616,1790,6307,131,-72.6750030517578,41.7669982910156,715923,7 "132",623,6760,1006,765,2703,2726,188,797,4728,132,-81.3369979858398,35.7369995117188,202711,28 "133",717,17021,1298,891,5911,2502,7168,3703,5187,133,-126.056999206543,31.7360000610352,762565,12 "134",427,7094,583,400,1145,1995,725,2700,6662,134,-90.7699966430664,29.6959991455078,176876,19 "135",424,9760,2467,1499,4626,3271,11073,1825,7464,135,-95.0029983520508,29.8339996337891,2735766,44 "136",636,6632,875,665,4001,2525,2195,840,4383,136,-82.5240020751953,38.435001373291,336410,50 "137",600,6283,685,924,2661,2257,1921,1075,6412,137,-86.5869979858398,34.7319984436035,196966,2 "138",557,7012,2243,1000,5804,2690,6348,1906,5082,138,-86.1549987792969,39.7700004577637,1166575,16 "139",434,9429,2437,830,2770,2842,2255,1506,5165,139,-91.5350036621094,41.6619987487793,81717,13 "140",518,6794,679,1021,4800,2654,323,1933,3822,140,-84.4000015258789,42.2470016479492,151495,23 "141",412,7245,1792,1091,4917,3130,3209,1427,5186,141,-90.1949996948242,32.3320007324219,362038,26 "142",457,6626,1181,1211,5611,3048,2162,2884,6139,142,-81.656997680664,30.3299999237061,722252,10 "143",564,6111,740,967,1780,2646,567,1177,6386,143,-77.4300003051758,34.7480010986328,112784,28 "144",466,7447,700,858,3092,2532,1092,1615,4371,144,-89.0260009765625,42.5950012207031,139420,49 "145",601,8810,1759,1434,4982,2574,7420,1001,4889,145,-74.0670013427734,40.7280006408691,556972,32 "146",663,6119,1152,424,2532,2925,1925,2155,4903,146,-82.333999633789,36.5149993896484,433638,43 "147",547,6524,731,353,4343,2691,666,903,4181,147,-78.9199981689453,40.3250007629395,264506,39 "148",479,9327,1058,837,4645,2868,3177,1636,4631,148,-88.0800018310547,41.5270004272461,355042,15 "149",580,5159,500,628,2335,2871,80,801,5324,149,-94.4670028686523,37.0830001831055,127513,25 "150",527,7919,1043,1120,5419,2896,2071,2163,4794,150,-85.5830001831055,42.2900009155273,212378,23 "151",483,7230,609,976,3444,2855,75,1119,5579,151,-87.8669967651367,41.117000579834,102926,15 "152",549,8126,1711,1142,5006,3028,1167,1045,6166,152,-94.625,39.117000579834,519031,17 "153",549,7076,1939,1468,5869,2949,5553,2043,4865,153,-94.5429992675781,39.0429992675781,914427,25 "154",496,8516,1067,911,4473,2918,3844,2224,5176,154,-87.822998046875,42.5849990844727,123137,49 "155",365,6463,398,733,2862,3167,920,931,6331,155,-97.5339965820312,31.1100006103516,214656,44 "156",670,6692,960,622,4273,2761,3309,2514,5537,156,-83.9179992675781,35.9679985046387,565970,43 "157",512,6616,596,413,1817,2904,285,1000,3429,157,-86.1330032348633,40.4869995117188,103715,16 "158",352,8310,686,676,6096,3027,1466,1953,5648,158,-91.2369995117188,43.8190002441406,91056,49 "159",494,7778,655,465,4956,2945,2235,1814,4333,159,-86.8929977416992,40.4199981689453,121702,16 "160",429,8572,548,1030,5268,2305,1772,1734,9702,160,-92.0199966430664,30.2250003814697,190231,19 "161",469,6921,314,1093,3549,2336,1456,1855,5872,161,-93.2170028686523,30.2280006408691,167223,19 "162",514,13282,1237,822,3422,2607,3746,2435,5755,162,-88.6179962158203,39.6360015869141,440372,15 "163",307,6680,323,1373,3412,2998,309,2513,5594,163,-81.8420028686523,28.0319995880127,321652,10 "164",559,8631,1111,413,3908,3097,1015,1147,5120,164,-76.3079986572266,40.0369987487793,362346,39 "165",480,7907,1371,894,5557,2891,4206,1609,4747,165,-84.4290008544922,42.6699981689453,419750,23 "166",424,6152,465,1050,3322,2827,150,702,5264,166,-99.5029983520508,27.5069999694824,99258,44 "167",552,6962,588,1457,2989,2736,2804,1609,5341,167,-106.777999877930,32.3120002746582,96340,33 "168",556,9906,412,1913,5900,2241,1586,3996,6035,168,-115.147003173828,36.1720008850098,463087,34 "169",513,7497,621,1018,2931,2700,3150,1752,4573,169,-95.2379989624023,38.9630012512207,67640,17 "170",548,10414,1202,909,3575,2479,2111,1879,6527,170,-71.4390029907227,43.1759986877441,339090,20 "171",479,5850,477,1156,2366,2375,1280,1757,6105,171,-98.4120025634766,34.6119995117188,112456,37 "172",490,6876,759,764,2941,2694,736,1853,4444,172,-70.2229995727539,44.0970001220703,84690,22 "173",635,8340,1860,1055,4080,2861,3596,1403,6245,173,-84.4970016479492,38.0480003356934,317629,18 "174",522,6986,741,855,4084,2629,1352,1428,4313,174,-84.1050033569336,40.7350006103516,154795,36 "175",398,8256,775,789,5618,2878,4523,1804,4908,175,-96.6849975585938,40.8230018615723,192884,30 "176",497,7270,1861,1328,4186,2581,2180,1462,5273,176,-92.2720031738281,34.7509994506836,474484,3 "177",500,6608,509,976,2680,2816,334,834,6898,177,-94.5579986572266,32.5209999084473,151752,44 "178",579,8309,1105,609,3629,2582,2565,1602,3301,178,-82.1439971923828,41.4150009155273,274909,36 "179",885,13868,5153,1960,4345,3195,23567,3948,5316,179,-118.217002868652,33.9169998168945,7477503,5 "180",616,6812,2111,937,5420,3028,4916,1942,5402,180,-85.7620010375977,38.2470016479492,956756,18 "181",526,9640,1083,819,3820,2479,3057,1129,6651,181,-71.313003540039,42.6370010375977,243142,20 "182",604,6990,900,1608,4158,2545,3402,1702,5923,182,-101.843002319336,33.5830001831055,211651,44 "183",642,6934,732,643,4909,2803,1079,1439,4926,183,-79.1429977416992,37.4150009155273,141289,46 "184",447,6235,593,783,3144,2651,1435,1204,5659,184,-83.6350021362305,32.8419990539551,263591,11 "185",378,9897,2168,779,6084,3047,5123,1944,5448,185,-89.3929977416992,43.0699996948242,323545,49 "186",404,9860,737,633,4595,2728,475,837,7101,186,-71.4619979858398,42.9949989318848,129305,31 "187",558,6881,303,1072,2876,2871,554,1133,4386,187,-82.5169982910156,40.757999420166,131205,36 "188",238,5345,372,836,2117,2644,1231,1059,5739,188,-98.2429962158203,26.257999420166,283229,44 "189",611,9008,256,728,3512,2797,1856,1416,3692,189,-122.866996765137,42.3230018615723,132456,38 "190",582,8721,517,1039,2560,2814,437,3800,7089,190,-80.6689987182617,28.2450008392334,272959,10 "191",514,7015,2043,1488,6247,2804,4486,1994,5160,191,-90.056999206543,35.125,913472,43 "192",634,10267,2314,2459,5202,2879,4837,4300,5840,192,-80.218002319336,25.6459999084473,1625781,10 "193",559,12135,2589,691,4198,3539,8058,1596,6324,193,-74.5029983520508,40.5800018310547,886383,32 "194",593,11652,884,646,4636,3128,730,1682,6307,194,-72.6549987792969,41.5620002746582,81582,7 "195",603,8672,97,1166,5310,2416,438,1502,9980,195,-102.078002929688,31.9950008392334,82636,44 "196",460,10176,3053,826,4945,3044,8766,2902,4982,196,-87.9820022583008,43.0330009460449,1397143,49 "197",293,9559,3934,906,5606,3013,11714,2158,5843,197,-93.1790008544922,44.9650001525879,2137133,24 "198",442,6704,1469,1511,3345,2779,1764,2164,4565,198,-88.0429992675781,30.6879997253418,443536,2 "199",639,8630,347,1154,2000,2616,631,833,5107,199,-121.001998901367,37.6430015563965,265900,5 "200",615,11660,2482,819,2690,2787,7563,3544,6154,200,-74.0749969482422,40.3520011901855,849211,32 "201",455,6190,331,957,3606,2453,1528,1541,5537,201,-92.1169967651367,32.5,139241,19 "202",483,6754,832,815,3509,2388,1374,1112,4892,202,-86.3079986572266,32.3819999694824,272687,2 "203",530,5800,949,783,4325,2965,2498,1428,3980,203,-85.3870010375977,40.1920013427734,128587,16 "204",580,6391,699,1537,3353,2630,529,2666,3708,204,-86.2600021362305,43.2280006408691,157589,23 "205",538,10757,853,452,3320,2728,2122,1523,6962,205,-71.4619979858398,42.7569999694824,142527,31 "206",600,7800,1850,984,5030,2763,4342,1849,5938,206,-86.7639999389648,36.1609992980957,850505,43 "207",656,11138,3919,566,2119,3234,8640,3705,7371,207,-73.375,40.6780014038086,2605813,35 "208",643,8087,519,1012,3219,2439,766,1450,4937,208,-70.9300003051758,41.6370010375977,166699,20 "209",516,10509,1245,903,4900,3128,1360,1217,6470,209,-72.7829971313477,41.6679992675781,142241,7 "210",583,11460,2068,893,5938,3495,7852,1604,5478,210,-72.8509979248047,41.4179992675781,500474,7 "211",583,10218,556,633,4505,3244,1164,2281,6672,211,-72.0950012207031,41.443000793457,250839,7 "212",498,8515,2586,1604,4579,2995,7978,3500,6453,212,-90.063003540039,29.9629993438721,1256256,19 "213",638,13358,7850,2498,8625,2984,56745,3579,5338,213,-73.879997253418,40.8489990234375,8274961,35 "214",601,14220,4106,1461,3514,3362,14224,1818,5690,214,-74.1719970703125,40.7369995117188,1878959,32 "215",554,7686,507,775,5561,2538,966,1873,4463,215,-79.056999206543,43.0970001220703,227354,35 "216",632,8568,1932,997,3215,3014,7087,2964,5866,216,-76.2269973754883,36.8899993896484,1160311,46 "217",648,20151,2530,625,3536,3029,7273,2268,6432,217,-73.3649978637695,41.1230010986328,126692,7 "218",910,13135,2362,1533,6430,2646,6162,2394,5457,218,-122.267997741699,37.8079986572266,1761759,5 "219",333,6750,489,1327,3798,2864,266,3095,7060,219,-82.1350021362305,29.1849994659424,122488,10 "220",603,6689,384,1698,1944,2721,259,900,7565,220,-102.375,31.8579998016357,115374,44 "221",554,7186,1623,1297,4459,2908,4843,1742,8119,221,-97.3040008544922,35.2960014343262,860969,37 "222",726,8263,338,752,4083,2625,708,1451,4912,222,-122.889999389648,47.0449981689453,124264,48 "223",440,7128,2559,1008,5806,3069,3787,1977,5853,223,-96.0080032348633,41.2830009460449,585122,30 "224",509,10173,1574,804,3299,2754,6987,1866,5822,224,-74.4130020141602,41.4529991149902,259603,35 "225",457,8196,765,1671,5887,2976,2681,2881,7413,225,-81.3769989013672,28.5529994964600,700055,10 "226",524,6760,812,568,2273,2491,804,852,6062,226,-87.1129989624023,37.7680015563965,85949,18 "227",890,14000,1106,791,2238,2155,2769,2135,5514,227,-119.203002929688,34.2369995117188,529174,5 "228",536,6373,201,1344,2778,2500,755,2089,6083,228,-85.6969985961914,30.2689990997314,97740,10 "229",617,6657,665,488,4399,2503,91,1148,5187,229,-81.4499969482422,39.4129981994629,157914,36 "230",584,6248,593,591,1750,1701,155,1956,4491,230,-88.5490036010742,30.3680000305176,118015,26 "231",586,9462,1117,744,4738,3058,480,1513,5154,231,-71.3949966430664,41.943000793457,307403,40 "232",536,6479,563,1472,2918,2914,1954,2160,6029,232,-87.4059982299805,30.6609992980957,289782,10 "233",491,8388,1184,921,2967,2452,2294,1688,4073,233,-89.5920028686523,40.693000793457,365864,15 "234",630,8310,5158,1059,5903,3781,17270,1979,5638,234,-75.1630020141602,39.9500007629395,4716818,39 "235",536,8921,1584,1268,4729,2942,4573,2472,6415,235,-112.072998046875,33.4550018310547,1509052,4 "236",463,5674,617,1169,1671,2554,373,793,4247,236,-92.0169982910156,34.2229995727539,90718,3 "237",586,8099,3413,687,5616,3544,11069,2145,5261,237,-80.0080032348633,40.4370002746582,2218870,39 "238",482,7807,694,638,3759,3264,228,1420,5483,238,-73.2529983520508,42.4469985961914,83490,20 "239",483,8100,834,823,5185,2973,2351,3366,6186,239,-70.2300033569336,43.6780014038086,193831,22 "240",768,9912,1590,1504,5947,3343,5160,2532,4535,240,-122.364997863770,45.5470008850098,1105699,38 "241",469,9966,596,475,2321,3026,165,1390,8367,241,-70.8710021972656,43.189998626709,190938,31 "242",488,9981,355,633,4166,2898,785,1670,6746,242,-73.9300003051758,41.7019996643066,245055,35 "243",586,9274,2467,998,5474,3558,6152,2263,5154,243,-71.406997680664,41.8170013427734,618514,40 "244",500,9321,198,485,4546,2618,1985,3300,3459,244,-111.678001403809,40.2719993591309,218106,45 "245",497,6637,468,1181,3501,2653,1307,1619,4646,245,-104.605003356934,38.2400016784668,125972,6 "246",496,8943,931,1055,3558,2732,1171,2016,4415,246,-87.8000030517578,42.7270011901855,173132,49 "247",647,8230,3476,981,6544,3455,5730,1606,6405,247,-78.7649993896484,35.8839988708496,561222,28 "248",614,7614,1154,522,3120,3028,1108,1549,5587,248,-75.9280014038086,40.3279991149902,312509,39 "249",664,8584,274,892,5727,2471,845,2424,4459,249,-122.400001525879,40.5820007324219,115715,5 "250",535,12449,615,1116,6767,2529,2210,2386,5677,250,-119.806999206543,39.5229988098145,193623,34 "251",664,8461,300,779,4714,1728,529,1204,5326,251,-119.194999694824,46.2589988708496,144469,48 "252",585,8343,2448,1076,6680,2940,5697,1943,5870,252,-77.4250030517578,37.3849983215332,761311,46 "253",615,9754,2201,1475,3141,2596,5327,1918,4923,253,-117.337997436523,34.0439987182617,1558182,5 "254",652,7476,1036,784,3872,2723,1263,2036,5287,254,-79.936996459961,37.2729988098145,220393,46 "255",308,9193,2966,437,4399,2134,769,1503,6099,255,-92.4629974365234,44.0229988098145,92006,24 "256",536,8609,1969,894,5165,3582,6956,2659,6304,256,-77.6080017089844,43.1580009460449,971230,35 "257",466,7584,969,1156,2987,2680,1026,933,4592,257,-89.0979995727539,42.2680015563965,279514,15 "258",576,9855,1027,1363,5097,2793,4483,2306,5309,258,-121.489997863770,38.5849990844727,1099814,5 "259",515,7368,1022,1068,3186,2772,1708,2059,3709,259,-84.0179977416992,43.5509986877441,421518,23 "260",195,7235,603,343,4565,2502,1871,1572,5488,260,-94.1620025634766,45.5660018920898,163256,24 "261",475,5589,223,969,2689,2927,879,1265,5991,261,-94.8379974365234,39.7669982910156,87888,25 "262",537,7605,2850,1306,7119,3530,8896,2243,5800,262,-90.193000793457,38.617000579834,1808621,25 "263",716,8378,749,1014,4732,3278,691,1873,3835,263,-123.027999877930,44.9169998168945,249895,38 "264",644,11622,1232,490,3459,2729,3276,2234,6309,264,-70.781997680664,42.5760002136230,258175,20 "265",843,13838,352,1107,4160,2439,1004,3179,5656,265,-121.801002502441,36.6339988708496,290444,5 "266",541,9466,1631,969,6228,2340,5528,3900,4942,266,-111.934997558594,40.8819999694824,910222,45 "267",488,6321,236,1032,2938,2707,1301,1136,7720,267,-100.436996459961,31.4629993438721,84784,44 "268",398,6898,1337,1197,5387,2938,4295,1509,6873,268,-98.495002746582,29.4230003356934,1071954,44 "269",903,14465,2416,1099,5489,2794,8818,3347,5489,269,-117.152999877930,32.7130012512207,1861846,5 "270",910,17158,3726,1619,8299,3371,14226,4600,6063,270,-122.416999816895,37.7750015258789,1488871,5 "271",850,16048,2117,1065,5224,2709,6446,1964,7270,271,-121.883003234863,37.3349990844727,1295071,5 "272",855,15547,532,1026,5662,2719,2684,3300,5821,272,-120.195999145508,34.6710014343262,298694,5 "273",843,14303,1035,964,5010,2611,3748,1703,5335,273,-122.022003173828,36.9720001220703,188141,5 "274",732,12931,1052,912,3313,2722,3457,2255,5703,274,-122.679000854492,38.3380012512207,299681,5 "275",391,9560,801,939,3742,2626,817,2535,7715,275,-82.531997680664,27.3369998931885,202251,10 "276",542,6896,1084,1614,5958,2456,2262,2237,5591,276,-81.093002319336,32.0769996643066,220553,11 "277",575,6697,1219,372,3683,3230,1832,1386,4907,277,-75.7750015258789,41.3269996643066,728796,39 "278",808,10183,2715,1170,6634,2710,9577,4800,5901,278,-122.330001831055,47.5970001220703,1607469,48 "279",570,6697,700,384,2017,3022,52,1100,4055,279,-80.5169982910156,41.2330017089844,128299,39 "280",442,8121,593,450,3458,2557,268,1316,4765,280,-87.7480010986328,43.7599983215332,100935,49 "281",524,5722,394,1035,1922,2652,68,937,6213,281,-96.5759963989258,33.6949996948242,89796,44 "282",508,6534,1445,1197,4401,2858,2826,1389,6585,282,-93.7580032348633,32.4900016784668,333079,19 "283",385,6528,846,759,4316,2673,1393,1359,4648,283,-96.3919982910156,42.492000579834,117457,13 "284",276,7983,1041,556,6271,2651,465,1324,5204,284,-96.702003479004,43.4949989318848,109435,42 "285",545,5938,830,1038,5634,2874,2672,1819,5056,285,-86.2149963378906,41.6689987182617,241617,16 "286",574,6927,497,869,5534,2774,2988,1517,4722,286,-117.404998779297,47.6720008850098,341835,48 "287",524,7882,1877,1225,6172,3078,1983,1536,5384,287,-89.6480026245117,39.7999992370605,187789,15 "288",453,8039,710,1212,6159,3525,3466,1514,5289,288,-72.5879974365234,42.0999984741211,515259,20 "289",544,6343,577,892,3828,2709,1634,1737,5932,289,-93.2900009155273,37.2200012207031,207704,25 "290",648,23640,2610,835,3110,3029,7865,1729,6158,290,-73.5400009155273,41.0530014038086,198854,7 "291",575,8405,612,540,2740,3169,1271,1200,4677,291,-77.8669967651367,40.7919998168945,112760,39 "292",542,6578,505,418,1532,2672,147,1460,3744,292,-80.5970001220703,40.3759994506836,163099,36 "293",625,8474,342,1395,4427,2155,1579,1630,5672,293,-121.285003662109,37.9580001831055,347342,5 "294",548,7670,1040,689,6951,3144,5080,2851,4474,294,-76.1500015258789,43.0519981384277,642971,35 "295",808,7770,539,1162,4730,2546,4297,4000,4887,295,-122.432998657227,47.2369995117188,485643,48 "296",404,8029,370,1161,5530,2790,2181,1936,6021,296,-84.281997680664,30.4449996948242,190220,10 "297",440,7442,1189,1493,5588,3044,5040,2943,7256,297,-82.6640014648438,27.9549999237061,1613603,10 "298",557,5527,453,630,3550,3012,1226,1401,4353,298,-87.4079971313477,39.4669990539551,137247,16 "299",467,5717,343,822,2537,2899,63,669,4772,299,-94.052001953125,33.431999206543,113067,44 "300",518,7767,1738,998,5323,2852,4389,1952,4534,300,-83.5279998779297,41.5909996032715,616864,36 "301",501,7110,1148,999,5348,2795,1632,1141,5464,301,-95.6699981689453,39.0519981384277,154916,17 "302",636,10616,1372,1181,4786,3311,5029,1646,5772,302,-74.7669982910156,40.2249984741211,307863,32 "303",589,8548,1259,1400,4397,2685,4889,3131,6147,303,-110.968002319336,32.2169990539551,531443,4 "304",530,7498,1581,1080,3758,2628,4248,2024,7115,304,-95.902000427246,36.1599998474121,657173,37 "305",470,6464,674,1014,4723,2390,1432,1090,4900,305,-87.5670013427734,33.2050018310547,137541,2 "306",500,7298,672,955,3460,3283,404,631,7327,306,-95.302001953125,32.3450012207031,128366,44 "307",548,6744,391,400,4592,2970,858,1750,5226,307,-75.3410034179688,43.1590003967285,320180,35 "308",821,10503,1079,964,4153,2498,2962,1559,5819,308,-122.194000244141,38.2200012207031,334402,5 "309",768,9015,517,752,3817,2332,1557,1464,4571,309,-122.669998168945,45.625,192227,48 "310",336,7143,260,1092,2407,2696,87,1410,7599,310,-97.004997253418,28.8050003051758,68807,44 "311",615,7295,807,1135,4133,2747,2097,1474,5023,311,-75.0989990234375,39.4379997253418,132866,32 "312",543,7778,210,1132,3094,2128,511,2800,5563,312,-119.219001770020,36.2039985656738,245738,5 "313",412,6106,538,1166,3018,2867,1141,1248,6259,313,-97.1419982910156,31.5470008850098,170755,44 "314",631,13724,4361,1317,8236,3635,21701,1578,6072,314,-77.0329971313477,38.8919982910156,3250822,8 "315",569,10024,1218,789,2434,2995,318,946,5656,315,-73.0479965209961,41.4099998474121,204968,7 "316",347,7881,925,700,3351,2889,3000,1900,4407,316,-92.3970031738281,42.5099983215332,162781,13 "317",308,7642,818,442,3496,2749,761,1654,4300,317,-89.6399993896484,44.9599990844727,111270,49 "318",509,10512,375,1783,5201,3224,2888,3772,7992,318,-80.218002319336,26.6550006866455,576863,10 "319",542,6576,791,308,2450,3002,422,1271,4740,319,-80.7229995727539,40.0699996948242,185566,50 "320",494,7061,806,1164,3933,2981,2987,1508,6036,320,-97.3369979858398,37.6920013427734,411313,17 "321",456,6404,549,1179,2793,2747,599,1126,6805,321,-98.5130004882812,33.9099998474121,121082,44 "322",558,7284,860,464,3097,2906,196,726,3288,322,-77.0029983520508,41.2449989318848,118416,39 "323",597,7927,1445,1115,4532,3112,4545,1923,6174,323,-75.5500030517578,39.7470016479492,523221,9 "324",564,6858,1099,1423,2904,2876,1077,2668,5390,324,-77.9229965209961,34.2369995117188,103471,28 "325",562,8715,1805,680,3643,3299,1784,910,5040,325,-71.7949981689453,42.2719993591309,402918,20 "326",535,6440,317,1106,3731,2491,996,2140,4986,326,-120.513000488281,46.5950012207031,172508,48 "327",540,8371,713,440,2267,2903,1022,842,4946,327,-76.7279968261719,39.9599990844727,381255,39 "328",570,7021,1097,938,3374,2920,2797,1327,3894,328,-80.7289962768555,41.1699981689453,531350,36 "329",608,7875,212,1179,2768,2387,122,918,4694,329,-121.622001647949,39.1279983520508,101979,5 ggobi-2.1.12/data/ratcns.csv0000644000175000017500000003727514651527764011324 "","E11","E13","E15","E18","E21","P0","P7","P14","A","Class1","Class2" "1",1,0.200000002980232,0.310000002384186,0.239999994635582,0.400000005960464,0.270000010728836,0.189999997615814,0.0500000007450581,0,"1","1" "2",1,0.769999980926514,0.209999993443489,0.370000004768372,0.400000005960464,0.439999997615814,0.680000007152557,0.689999997615814,0.469999998807907,"1","1" "3",0.490000009536743,0.629999995231628,1,0.540000021457672,0.289999991655350,0.219999998807907,0.100000001490116,0.100000001490116,0.0799999982118607,"1","1" "4",0.0199999995529652,0.270000010728836,0.819999992847443,0.870000004768372,0.879999995231628,0.790000021457672,0.759999990463257,0.839999973773956,1,"1","1" "5",0.360000014305115,0.620000004768372,0.699999988079071,0.810000002384186,0.97000002861023,0.959999978542328,0.77999997138977,0.77999997138977,1,"1","1" "6",0.0599999986588955,0.170000001788139,0.52999997138977,0.959999978542328,1,0.899999976158142,0.509999990463257,0.419999986886978,0.400000005960464,"1","1" "7",0.0299999993294477,0.370000004768372,0.449999988079071,0.660000026226044,0.660000026226044,0.899999976158142,1,0.52999997138977,0.300000011920929,"1","1" "8",0.0199999995529652,0.119999997317791,0.189999997615814,0.150000005960464,0.159999996423721,0.25,0.239999994635582,0.490000009536743,1,"1","1" "9",0.0399999991059303,0.0299999993294477,0.129999995231628,0.280000001192093,0.379999995231628,0.409999996423721,0.469999998807907,1,0.949999988079071,"1","1" "10",0.0799999982118607,0.259999990463257,0.660000026226044,0.620000004768372,0.819999992847443,0.839999973773956,1,0.9200000166893,0.740000009536743,"1","1" "11",0.150000005960464,0.379999995231628,0.759999990463257,0.77999997138977,1,0.8299999833107,0.879999995231628,0.850000023841858,0.810000002384186,"1","1" "12",0.0199999995529652,0,0.219999998807907,0.569999992847443,0.649999976158142,0.589999973773956,0.629999995231628,1,0.949999988079071,"1","1" "13",0,0,0,0.0299999993294477,0.310000002384186,0.430000007152557,1,0.860000014305115,0.75,"1","1" "14",0,0,0,0,0,0.180000007152557,0.699999988079071,1,0.870000004768372,"1","1" "15",0.0900000035762787,0.289999991655350,0.6700000166893,1,0.839999973773956,0.730000019073486,0.699999988079071,0.610000014305115,0.620000004768372,"1","2" "16",0.0500000007450581,0.119999997317791,0.810000002384186,0.990000009536743,1,0.959999978542328,0.810000002384186,0.689999997615814,0.680000007152557,"1","2" "17",0.0799999982118607,0.0799999982118607,0.300000011920929,0.77999997138977,1,0.889999985694885,0.730000019073486,0.639999985694885,0.579999983310699,"1","2" "18",0.319999992847443,0.589999973773956,1,0.800000011920929,0.569999992847443,0.430000007152557,0.280000001192093,0.239999994635582,0.129999995231628,"1","2" "19",0.0900000035762787,0.259999990463257,0.839999973773956,1,0.52999997138977,0.259999990463257,0.0700000002980232,0.0299999993294477,0,"1","2" "20",0.150000005960464,0.189999997615814,1,0.680000007152557,0.839999973773956,0.8299999833107,0.860000014305115,0.810000002384186,0.819999992847443,"1","2" "21",0,0.00999999977648258,0.25,0.230000004172325,0.46000000834465,0.419999986886978,0.560000002384186,0.709999978542328,1,"1","2" "22",0.0399999991059303,0.100000001490116,0.389999985694885,0.649999976158142,0.77999997138977,0.8299999833107,1,0.9200000166893,0.939999997615814,"1","2" "23",0.9200000166893,1,0.899999976158142,0.800000011920929,0.77999997138977,0.77999997138977,0.699999988079071,0.660000026226044,0.560000002384186,"1","2" "24",0.519999980926514,1,0.819999992847443,0.660000026226044,0.52999997138977,0.569999992847443,0.189999997615814,0.230000004172325,0,"1","2" "25",0.0500000007450581,0.150000005960464,0.730000019073486,0.680000007152557,0.930000007152557,1,0.860000014305115,0.699999988079071,0.479999989271164,"1","2" "26",0.300000011920929,0.409999996423721,0.52999997138977,0.639999985694885,0.680000007152557,0.77999997138977,0.850000023841858,0.97000002861023,1,"2","3" "27",0.00999999977648258,0.0500000007450581,0.589999973773956,0.800000011920929,0.800000011920929,0.879999995231628,0.790000021457672,0.930000007152557,1,"2","3" "28",0.170000001788139,0.159999996423721,0.899999976158142,1,0.9200000166893,0.790000021457672,0.639999985694885,0.839999973773956,0.730000019073486,"2","3" "29",0.00999999977648258,0.189999997615814,0.52999997138977,0.810000002384186,1,0.930000007152557,0.6700000166893,0.52999997138977,0.219999998807907,"2","3" "30",0.0599999986588955,0.0599999986588955,0.540000021457672,0.939999997615814,0.980000019073486,0.939999997615814,0.8299999833107,1,0.870000004768372,"2","3" "31",0,0,0.330000013113022,0.579999983310699,0.569999992847443,0.52999997138977,0.540000021457672,1,0.509999990463257,"2","3" "32",0,0,0,1,0.579999983310699,0.660000026226044,0.660000026226044,0.270000010728836,0.170000001788139,"2","3" "33",0.270000010728836,0.360000014305115,0.740000009536743,0.740000009536743,0.810000002384186,0.790000021457672,0.689999997615814,1,0.569999992847443,"2","3" "34",0.00999999977648258,0.0299999993294477,0.230000004172325,0.5,0.479999989271164,0.579999983310699,0.550000011920929,0.97000002861023,1,"2","3" "35",0,0.319999992847443,0.730000019073486,0.8299999833107,0.810000002384186,0.629999995231628,0.540000021457672,0.649999976158142,1,"2","3" "36",0.129999995231628,0.180000007152557,0.540000021457672,0.850000023841858,1,0.9200000166893,0.689999997615814,0.730000019073486,0.610000014305115,"2","3" "37",0,0,0,0.200000002980232,0.209999993443489,0.25,0.180000007152557,0.449999988079071,1,"2","4" "38",0,0.419999986886978,0.360000014305115,0.860000014305115,0.8299999833107,1,0.75,0.109999999403954,0.25,"2","4" "39",0.0199999995529652,0.0700000002980232,0.400000005960464,0.790000021457672,0.899999976158142,0.77999997138977,0.660000026226044,0.9200000166893,1,"2","4" "40",0,0,0.140000000596046,0.289999991655350,0.899999976158142,1,0.709999978542328,0.379999995231628,0.519999980926514,"2","4" "41",0,0,0.159999996423721,1,0.800000011920929,0.759999990463257,0.730000019073486,0.5,0.610000014305115,"2","4" "42",0,0.140000000596046,0.639999985694885,0.680000007152557,0.910000026226044,1,0.479999989271164,0.0900000035762787,0.180000007152557,"2","4" "43",0,0.119999997317791,0.310000002384186,0.870000004768372,0.9200000166893,0.870000004768372,0.639999985694885,1,0.759999990463257,"2","4" "44",0.200000002980232,0,1,0.870000004768372,0.97000002861023,0.8299999833107,0.5,0.5,0.330000013113022,"2","4" "45",0,0,0.189999997615814,1,0.839999973773956,0.879999995231628,0.870000004768372,0.430000007152557,0.5,"2","4" "46",0,0,0,0,0,0.0599999986588955,0.140000000596046,0.379999995231628,1,"2","4" "47",0.0700000002980232,0,0.490000009536743,0.730000019073486,0.709999978542328,0.680000007152557,0.490000009536743,0.810000002384186,1,"2","4" "48",0,0,0,0.379999995231628,0.680000007152557,1,0.589999973773956,0.209999993443489,0.340000003576279,"2","4" "49",0.6700000166893,0.620000004768372,0.330000013113022,0.759999990463257,0.990000009536743,1,0.5,0.319999992847443,0.219999998807907,"2","4" "50",0,0,0,0.379999995231628,0.879999995231628,1,0.810000002384186,0.689999997615814,0.5,"2","5" "51",0.00999999977648258,0.150000005960464,0.939999997615814,0.600000023841858,0.879999995231628,1,0.589999973773956,0.469999998807907,0.25,"2","5" "52",0.140000000596046,0.689999997615814,1,0.689999997615814,0.889999985694885,0.850000023841858,0.680000007152557,0.610000014305115,0.140000000596046,"2","5" "53",0.230000004172325,0.8299999833107,1,0.860000014305115,0.879999995231628,0.790000021457672,0.620000004768372,0.349999994039536,0.349999994039536,"2","5" "54",0.939999997615814,1,0.189999997615814,0.5,0.310000002384186,0.689999997615814,0.689999997615814,0,0,"2","5" "55",0.469999998807907,0.109999999403954,0.119999997317791,0.889999985694885,1,0.939999997615814,0.740000009536743,0.910000026226044,0.5,"2","5" "56",0.379999995231628,1,0,0,0,0,0,0,0,"2","5" "57",0,0,1,0.270000010728836,0,0.0399999991059303,0,0,0.150000005960464,"2","5" "58",0.0399999991059303,0.0299999993294477,0.259999990463257,0.689999997615814,0.77999997138977,0.800000011920929,0.97000002861023,1,0.52999997138977,"2","5" "59",0.109999999403954,0.180000007152557,0.289999991655350,0.5,1,0.980000019073486,0.370000004768372,0.389999985694885,0.109999999403954,"2","5" "60",0.289999991655350,0.200000002980232,0.0900000035762787,0.200000002980232,0.46000000834465,0.490000009536743,0.639999985694885,1,0.589999973773956,"2","5" "61",0.150000005960464,0.340000003576279,0.560000002384186,0.759999990463257,1,0.990000009536743,0.699999988079071,0.629999995231628,0.300000011920929,"2","6" "62",0,0,0.109999999403954,0.579999983310699,0.730000019073486,0.810000002384186,1,0.9200000166893,0.819999992847443,"2","6" "63",0.150000005960464,0.100000001490116,0.430000007152557,0.810000002384186,1,0.8299999833107,0.790000021457672,0.639999985694885,0.540000021457672,"2","6" "64",0.140000000596046,0.140000000596046,0.519999980926514,0.759999990463257,0.759999990463257,1,0.72000002861023,0.170000001788139,0.0299999993294477,"2","6" "65",0.300000011920929,0.589999973773956,0.140000000596046,0.200000002980232,0.180000007152557,0.239999994635582,0.170000001788139,0.349999994039536,1,"3","7" "66",0.629999995231628,1,0.75,0.360000014305115,0.479999989271164,0.330000013113022,0,0.0500000007450581,0.360000014305115,"3","7" "67",0.660000026226044,1,0.639999985694885,0.949999988079071,1,0.839999973773956,0.589999973773956,0.550000011920929,0.439999997615814,"3","7" "68",0.639999985694885,0.660000026226044,0.270000010728836,0.259999990463257,0.400000005960464,0.759999990463257,0.870000004768372,0.899999976158142,1,"3","7" "69",0,0.300000011920929,1,0.189999997615814,0.0700000002980232,0.0900000035762787,0.0700000002980232,0.0399999991059303,0,"3","7" "70",0.0599999986588955,0.0900000035762787,1,0.409999996423721,0.519999980926514,0.540000021457672,0.569999992847443,0.5,0.589999973773956,"3","7" "71",0.150000005960464,0.419999986886978,1,0.699999988079071,0.819999992847443,0.97000002861023,0.75,0.980000019073486,0.980000019073486,"3","7" "72",0.850000023841858,0.959999978542328,0.959999978542328,0.889999985694885,1,0.910000026226044,0.810000002384186,0.839999973773956,0.949999988079071,"3","7" "73",0.680000007152557,1,0.790000021457672,0.550000011920929,0.430000007152557,0.5,0.589999973773956,0.469999998807907,0.270000010728836,"3","8" "74",0.800000011920929,0.899999976158142,1,0.759999990463257,0.75,0.699999988079071,0.819999992847443,0.899999976158142,0.629999995231628,"3","8" "75",1,0.879999995231628,0.200000002980232,0.270000010728836,0.540000021457672,0.540000021457672,0.389999985694885,0.239999994635582,0.119999997317791,"3","8" "76",0.389999985694885,0.5,0.200000002980232,0.370000004768372,0.579999983310699,0.899999976158142,0.97000002861023,0.189999997615814,1,"3","8" "77",0.00999999977648258,0.0799999982118607,0.100000001490116,0.310000002384186,0.550000011920929,0.680000007152557,0.740000009536743,0.740000009536743,1,"3","8" "78",0.00999999977648258,0.0399999991059303,0.159999996423721,0.209999993443489,0.479999989271164,0.419999986886978,0.689999997615814,0.639999985694885,1,"3","8" "79",0.870000004768372,0.709999978542328,0.680000007152557,0.8299999833107,0.870000004768372,0.75,0.769999980926514,1,1,"3","8" "80",0.550000011920929,1,0.550000011920929,0.5,0.0900000035762787,0,0,0,0,"3","8" "81",0.270000010728836,0.479999989271164,0.330000013113022,0.5,1,0.77999997138977,0.910000026226044,0.759999990463257,0.259999990463257,"3","8" "82",1,0.9200000166893,0.610000014305115,0.75,0.879999995231628,0.860000014305115,0.759999990463257,0.839999973773956,0.889999985694885,"3","8" "83",0.819999992847443,1,0.980000019073486,0.319999992847443,0.319999992847443,0.319999992847443,0.319999992847443,0.280000001192093,0.5,"3","8" "84",0.600000023841858,0.819999992847443,1,0.72000002861023,0.569999992847443,0.560000002384186,0.680000007152557,0.819999992847443,0.819999992847443,"3","8" "85",1,0,0,0,0,0,0,0,0,"3","9" "86",1,0.850000023841858,0.709999978542328,0.709999978542328,0.730000019073486,0.649999976158142,0.639999985694885,0.469999998807907,0.980000019073486,"3","9" "87",0.769999980926514,0.980000019073486,0.910000026226044,0.850000023841858,1,0.97000002861023,0.790000021457672,0.77999997138977,0.810000002384186,"3","9" "88",0.899999976158142,1,0.839999973773956,0.77999997138977,0.540000021457672,0.569999992847443,0.430000007152557,0.400000005960464,0.189999997615814,"3","9" "89",0.6700000166893,0.660000026226044,0.980000019073486,0.949999988079071,1,0.959999978542328,0.790000021457672,0.319999992847443,0.370000004768372,"3","9" "90",0.769999980926514,0.629999995231628,1,0.620000004768372,0.519999980926514,0.610000014305115,0.379999995231628,0.560000002384186,0.589999973773956,"3","9" "91",1,0.689999997615814,0.860000014305115,0.730000019073486,0.560000002384186,0.509999990463257,0.419999986886978,0.310000002384186,0.280000001192093,"3","9" "92",0.879999995231628,0.860000014305115,0.899999976158142,0.939999997615814,1,0.990000009536743,0.699999988079071,0.349999994039536,0.620000004768372,"4","10" "93",0.870000004768372,0.709999978542328,0.550000011920929,0.579999983310699,0.600000023841858,0.709999978542328,0.699999988079071,1,0.600000023841858,"4","10" "94",0.479999989271164,0.419999986886978,0.649999976158142,0.620000004768372,0.680000007152557,0.620000004768372,0.810000002384186,0.939999997615814,1,"4","10" "95",0.620000004768372,0.72000002861023,0.620000004768372,0.490000009536743,0.870000004768372,1,0.360000014305115,0.280000001192093,0.180000007152557,"4","10" "96",1,0.910000026226044,0.97000002861023,0.860000014305115,0.949999988079071,0.769999980926514,0.810000002384186,0.639999985694885,0.629999995231628,"4","11" "97",0.990000009536743,0.990000009536743,1,0.490000009536743,0.519999980926514,0.469999998807907,0.419999986886978,0.230000004172325,0.0199999995529652,"4","11" "98",0.870000004768372,0.939999997615814,0.879999995231628,1,0.930000007152557,0.879999995231628,0.810000002384186,0.680000007152557,0.8299999833107,"4","11" "99",0,0.00999999977648258,0.560000002384186,0.730000019073486,0.990000009536743,0.990000009536743,0.959999978542328,0.860000014305115,1,"4","11" "100",0.230000004172325,0.46000000834465,0.490000009536743,0.349999994039536,0.449999988079071,0.400000005960464,0.419999986886978,0.509999990463257,1,"4","12" "101",0.109999999403954,0.109999999403954,0.200000002980232,0.310000002384186,0.360000014305115,0.589999973773956,0.389999985694885,0.349999994039536,1,"4","12" "102",0.810000002384186,1,0.610000014305115,0.660000026226044,0.550000011920929,0.5,0.340000003576279,0.409999996423721,0.270000010728836,"4","12" "103",0.899999976158142,0.850000023841858,0.860000014305115,0.879999995231628,0.980000019073486,1,0.990000009536743,0.910000026226044,0.72000002861023,"4","12" "104",0.810000002384186,0.72000002861023,0.72000002861023,0.680000007152557,0.850000023841858,1,0.889999985694885,0.850000023841858,0.959999978542328,"4","13" "105",0.910000026226044,0.569999992847443,0.569999992847443,0.469999998807907,0.600000023841858,0.930000007152557,0.709999978542328,0.660000026226044,1,"4","13" "106",0.839999973773956,0.689999997615814,0.75,1,0.769999980926514,0.730000019073486,0.800000011920929,0.639999985694885,0.769999980926514,"4","13" "107",1,0.569999992847443,0.52999997138977,0.759999990463257,0.569999992847443,0.589999973773956,0.75,0.540000021457672,0.699999988079071,"4","13" "108",1,1,0.6700000166893,0.72000002861023,0.870000004768372,0.730000019073486,0.639999985694885,0.409999996423721,0.300000011920929,"4","14" "109",0.509999990463257,0.419999986886978,0.72000002861023,0.75,1,0.709999978542328,0.740000009536743,0.649999976158142,0.349999994039536,"4","14" "110",1,0.97000002861023,0,0,0,0,0,0,0,"4","14" "111",0.340000003576279,0.469999998807907,1,0.860000014305115,0.740000009536743,0.589999973773956,0.310000002384186,0.189999997615814,0.159999996423721,"4","14" "112",0.680000007152557,0.629999995231628,0.699999988079071,0.72000002861023,0.740000009536743,0.680000007152557,0.649999976158142,0.790000021457672,1,"4","14" ggobi-2.1.12/data/stdColorMap.xml0000644000175000017500000000065014651527764012251 1.00 0.00 0.0 1.00 1.0 0.00 0.00 0.00 1.00 0.0 1.0 0.00 1.00 0.00 0.00 0.00 0.75 1.00 1.0 0.0 1.00 0.00 0.80 0.20 0.00 0.98 0.60 0.73 0.33 0.83 ggobi-2.1.12/data/tips.csv0000644000175000017500000003775714651527764011016 "","OBS","TOTBILL","TIP","SEX","SMOKER","DAY","TIME","SIZE" "1",1,16.9899997711182,1.00999999046326,"F","no","sun ","dinner ","2 " "2",2,10.3400001525879,1.6599999666214,"M","no","sun ","dinner ","3 " "3",3,21.0100002288818,3.5,"M","no","sun ","dinner ","3 " "4",4,23.6800003051758,3.30999994277954,"M","no","sun ","dinner ","2 " "5",5,24.5900001525879,3.60999989509583,"F","no","sun ","dinner ","4 " "6",6,25.2900009155273,4.71000003814697,"M","no","sun ","dinner ","4 " "7",7,8.77000045776367,2,"M","no","sun ","dinner ","2 " "8",8,26.8799991607666,3.11999988555908,"M","no","sun ","dinner ","4 " "9",9,15.0399999618530,1.96000003814697,"M","no","sun ","dinner ","2 " "10",10,14.7799997329712,3.23000001907349,"M","no","sun ","dinner ","2 " "11",11,10.2700004577637,1.71000003814697,"M","no","sun ","dinner ","2 " "12",12,35.2599983215332,5,"F","no","sun ","dinner ","4 " "13",13,15.4200000762939,1.57000005245209,"M","no","sun ","dinner ","2 " "14",14,18.4300003051758,3,"M","no","sun ","dinner ","4 " "15",15,14.8299999237061,3.01999998092651,"F","no","sun ","dinner ","2 " "16",16,21.5799999237061,3.92000007629395,"M","no","sun ","dinner ","2 " "17",17,10.3299999237061,1.66999995708466,"F","no","sun ","dinner ","3 " "18",18,16.2900009155273,3.71000003814697,"M","no","sun ","dinner ","3 " "19",19,16.9699993133545,3.5,"F","no","sun ","dinner ","3 " "20",20,20.6499996185303,3.34999990463257,"M","no","sat ","dinner ","3 " "21",21,17.9200000762939,4.07999992370605,"M","no","sat ","dinner ","2 " "22",22,20.2900009155273,2.75,"F","no","sat ","dinner ","2 " "23",23,15.7700004577637,2.23000001907349,"F","no","sat ","dinner ","2 " "24",24,39.4199981689453,7.57999992370605,"M","no","sat ","dinner ","4 " "25",25,19.8199996948242,3.1800000667572,"M","no","sat ","dinner ","2 " "26",26,17.8099994659424,2.33999991416931,"M","no","sat ","dinner ","4 " "27",27,13.3699998855591,2,"M","no","sat ","dinner ","2 " "28",28,12.6899995803833,2,"M","no","sat ","dinner ","2 " "29",29,21.7000007629395,4.30000019073486,"M","no","sat ","dinner ","2 " "30",30,19.6499996185303,3,"F","no","sat ","dinner ","2 " "31",31,9.55000019073486,1.45000004768372,"M","no","sat ","dinner ","2 " "32",32,18.3500003814697,2.5,"M","no","sat ","dinner ","4 " "33",33,15.0600004196167,3,"F","no","sat ","dinner ","2 " "34",34,20.6900005340576,2.45000004768372,"F","no","sat ","dinner ","4 " "35",35,17.7800006866455,3.26999998092651,"M","no","sat ","dinner ","2 " "36",36,24.0599994659424,3.59999990463257,"M","no","sat ","dinner ","3 " "37",37,16.3099994659424,2,"M","no","sat ","dinner ","3 " "38",38,16.9300003051758,3.0699999332428,"F","no","sat ","dinner ","3 " "39",39,18.6900005340576,2.30999994277954,"M","no","sat ","dinner ","3 " "40",40,31.2700004577637,5,"M","no","sat ","dinner ","3 " "41",41,16.0400009155273,2.24000000953674,"M","no","sat ","dinner ","3 " "42",42,17.4599990844727,2.53999996185303,"M","no","sun ","dinner ","2 " "43",43,13.9399995803833,3.05999994277954,"M","no","sun ","dinner ","2 " "44",44,9.68000030517578,1.32000005245209,"M","no","sun ","dinner ","2 " "45",45,30.3999996185303,5.59999990463257,"M","no","sun ","dinner ","4 " "46",46,18.2900009155273,3,"M","no","sun ","dinner ","2 " "47",47,22.2299995422363,5,"M","no","sun ","dinner ","2 " "48",48,32.4000015258789,6,"M","no","sun ","dinner ","4 " "49",49,28.5499992370605,2.04999995231628,"M","no","sun ","dinner ","3 " "50",50,18.0400009155273,3,"M","no","sun ","dinner ","2 " "51",51,12.5399999618530,2.5,"M","no","sun ","dinner ","2 " "52",52,10.2899999618530,2.59999990463257,"F","no","sun ","dinner ","2 " "53",53,34.810001373291,5.19999980926514,"F","no","sun ","dinner ","4 " "54",54,9.9399995803833,1.55999994277954,"M","no","sun ","dinner ","2 " "55",55,25.5599994659424,4.34000015258789,"M","no","sun ","dinner ","4 " "56",56,19.4899997711182,3.50999999046326,"M","no","sun ","dinner ","2 " "57",57,38.0099983215332,3,"M","yes","sat ","dinner ","4 " "58",58,26.4099998474121,1.5,"F","no","sat ","dinner ","2 " "59",59,11.2399997711182,1.75999999046326,"M","yes","sat ","dinner ","2 " "60",60,48.2700004577637,6.73000001907349,"M","no","sat ","dinner ","4 " "61",61,20.2900009155273,3.21000003814697,"M","yes","sat ","dinner ","2 " "62",62,13.8100004196167,2,"M","yes","sat ","dinner ","2 " "63",63,11.0200004577637,1.98000001907349,"M","yes","sat ","dinner ","2 " "64",64,18.2900009155273,3.75999999046326,"M","yes","sat ","dinner ","4 " "65",65,17.5900001525879,2.64000010490417,"M","no","sat ","dinner ","3 " "66",66,20.0799999237061,3.15000009536743,"M","no","sat ","dinner ","3 " "67",67,16.4500007629395,2.47000002861023,"F","no","sat ","dinner ","2 " "68",68,3.0699999332428,1,"F","yes","sat ","dinner ","1 " "69",69,20.2299995422363,2.00999999046326,"M","no","sat ","dinner ","2 " "70",70,15.0100002288818,2.08999991416931,"M","yes","sat ","dinner ","2 " "71",71,12.0200004577637,1.97000002861023,"M","no","sat ","dinner ","2 " "72",72,17.0699996948242,3,"F","no","sat ","dinner ","3 " "73",73,26.8600006103516,3.14000010490417,"F","yes","sat ","dinner ","2 " "74",74,25.2800006866455,5,"F","yes","sat ","dinner ","2 " "75",75,14.7299995422363,2.20000004768372,"F","no","sat ","dinner ","2 " "76",76,10.5100002288818,1.25,"M","no","sat ","dinner ","2 " "77",77,17.9200000762939,3.07999992370605,"M","yes","sat ","dinner ","2 " "78",78,27.2000007629395,4,"M","no","thurs ","lunch ","4 " "79",79,22.7600002288818,3,"M","no","thurs ","lunch ","2 " "80",80,17.2900009155273,2.71000003814697,"M","no","thurs ","lunch ","2 " "81",81,19.4400005340576,3,"M","yes","thurs ","lunch ","2 " "82",82,16.6599998474121,3.40000009536743,"M","no","thurs ","lunch ","2 " "83",83,10.0699996948242,1.83000004291534,"F","no","thurs ","lunch ","1 " "84",84,32.6800003051758,5,"M","yes","thurs ","lunch ","2 " "85",85,15.9799995422363,2.02999997138977,"M","no","thurs ","lunch ","2 " "86",86,34.8300018310547,5.17000007629395,"F","no","thurs ","lunch ","4 " "87",87,13.0299997329712,2,"M","no","thurs ","lunch ","2 " "88",88,18.2800006866455,4,"M","no","thurs ","lunch ","2 " "89",89,24.7099990844727,5.84999990463257,"M","no","thurs ","lunch ","2 " "90",90,21.1599998474121,3,"M","no","thurs ","lunch ","2 " "91",91,28.9699993133545,3,"M","yes","fri ","dinner ","2 " "92",92,22.4899997711182,3.5,"M","no","fri ","dinner ","2 " "93",93,5.75,1,"F","yes","fri ","dinner ","2 " "94",94,16.3199996948242,4.30000019073486,"F","yes","fri ","dinner ","2 " "95",95,22.75,3.25,"F","no","fri ","dinner ","2 " "96",96,40.1699981689453,4.73000001907349,"M","yes","fri ","dinner ","4 " "97",97,27.2800006866455,4,"M","yes","fri ","dinner ","2 " "98",98,12.0299997329712,1.5,"M","yes","fri ","dinner ","2 " "99",99,21.0100002288818,3,"M","yes","fri ","dinner ","2 " "100",100,12.4600000381470,1.5,"M","no","fri ","dinner ","2 " "101",101,11.3500003814697,2.5,"F","yes","fri ","dinner ","2 " "102",102,15.3800001144409,3,"F","yes","fri ","dinner ","2 " "103",103,44.2999992370605,2.5,"F","yes","sat ","dinner ","3 " "104",104,22.4200000762939,3.48000001907349,"F","yes","sat ","dinner ","2 " "105",105,20.9200000762939,4.07999992370605,"F","no","sat ","dinner ","2 " "106",106,15.3599996566772,1.63999998569489,"M","yes","sat ","dinner ","2 " "107",107,20.4899997711182,4.05999994277954,"M","yes","sat ","dinner ","2 " "108",108,25.2099990844727,4.28999996185303,"M","yes","sat ","dinner ","2 " "109",109,18.2399997711182,3.75999999046326,"M","no","sat ","dinner ","2 " "110",110,14.3100004196167,4,"F","yes","sat ","dinner ","2 " "111",111,14,3,"M","no","sat ","dinner ","2 " "112",112,7.25,1,"F","no","sat ","dinner ","1 " "113",113,38.0699996948242,4,"M","no","sun ","dinner ","3 " "114",114,23.9500007629395,2.54999995231628,"M","no","sun ","dinner ","2 " "115",115,25.7099990844727,4,"F","no","sun ","dinner ","3 " "116",116,17.3099994659424,3.5,"F","no","sun ","dinner ","2 " "117",117,29.9300003051758,5.07000017166138,"M","no","sun ","dinner ","4 " "118",118,10.6499996185303,1.5,"F","no","thurs ","lunch ","2 " "119",119,12.4300003051758,1.79999995231628,"F","no","thurs ","lunch ","2 " "120",120,24.0799999237061,2.92000007629395,"F","no","thurs ","lunch ","4 " "121",121,11.6899995803833,2.30999994277954,"M","no","thurs ","lunch ","2 " "122",122,13.4200000762939,1.67999994754791,"F","no","thurs ","lunch ","2 " "123",123,14.2600002288818,2.5,"M","no","thurs ","lunch ","2 " "124",124,15.9499998092651,2,"M","no","thurs ","lunch ","2 " "125",125,12.4799995422363,2.51999998092651,"F","no","thurs ","lunch ","2 " "126",126,29.7999992370605,4.19999980926514,"F","no","thurs ","lunch ","6 " "127",127,8.52000045776367,1.48000001907349,"M","no","thurs ","lunch ","2 " "128",128,14.5200004577637,2,"F","no","thurs ","lunch ","2 " "129",129,11.3800001144409,2,"F","no","thurs ","lunch ","2 " "130",130,22.8199996948242,2.18000006675720,"M","no","thurs ","lunch ","3 " "131",131,19.0799999237061,1.5,"M","no","thurs ","lunch ","2 " "132",132,20.2700004577637,2.82999992370605,"F","no","thurs ","lunch ","2 " "133",133,11.1700000762939,1.5,"F","no","thurs ","lunch ","2 " "134",134,12.2600002288818,2,"F","no","thurs ","lunch ","2 " "135",135,18.2600002288818,3.25,"F","no","thurs ","lunch ","2 " "136",136,8.51000022888184,1.25,"F","no","thurs ","lunch ","2 " "137",137,10.3299999237061,2,"F","no","thurs ","lunch ","2 " "138",138,14.1499996185303,2,"F","no","thurs ","lunch ","2 " "139",139,16,2,"M","yes","thurs ","lunch ","2 " "140",140,13.1599998474121,2.75,"F","no","thurs ","lunch ","2 " "141",141,17.4699993133545,3.5,"F","no","thurs ","lunch ","2 " "142",142,34.2999992370605,6.69999980926514,"M","no","thurs ","lunch ","6 " "143",143,41.189998626709,5,"M","no","thurs ","lunch ","5 " "144",144,27.0499992370605,5,"F","no","thurs ","lunch ","6 " "145",145,16.4300003051758,2.29999995231628,"F","no","thurs ","lunch ","2 " "146",146,8.35000038146973,1.5,"F","no","thurs ","lunch ","2 " "147",147,18.6399993896484,1.36000001430511,"F","no","thurs ","lunch ","3 " "148",148,11.8699998855591,1.62999999523163,"F","no","thurs ","lunch ","2 " "149",149,9.7799997329712,1.73000001907349,"M","no","thurs ","lunch ","2 " "150",150,7.51000022888184,2,"M","no","thurs ","lunch ","2 " "151",151,14.0699996948242,2.5,"M","no","sun ","dinner ","2 " "152",152,13.1300001144409,2,"M","no","sun ","dinner ","2 " "153",153,17.2600002288818,2.74000000953674,"M","no","sun ","dinner ","3 " "154",154,24.5499992370605,2,"M","no","sun ","dinner ","4 " "155",155,19.7700004577637,2,"M","no","sun ","dinner ","4 " "156",156,29.8500003814697,5.1399998664856,"F","no","sun ","dinner ","5 " "157",157,48.1699981689453,5,"M","no","sun ","dinner ","6 " "158",158,25,3.75,"F","no","sun ","dinner ","4 " "159",159,13.3900003433228,2.60999989509583,"F","no","sun ","dinner ","2 " "160",160,16.4899997711182,2,"M","no","sun ","dinner ","4 " "161",161,21.5,3.5,"M","no","sun ","dinner ","4 " "162",162,12.6599998474121,2.5,"M","no","sun ","dinner ","2 " "163",163,16.2099990844727,2,"F","no","sun ","dinner ","3 " "164",164,13.8100004196167,2,"M","no","sun ","dinner ","2 " "165",165,17.5100002288818,3,"F","yes","sun ","dinner ","2 " "166",166,24.5200004577637,3.48000001907349,"M","no","sun ","dinner ","3 " "167",167,20.7600002288818,2.24000000953674,"M","no","sun ","dinner ","2 " "168",168,31.7099990844727,4.5,"M","no","sun ","dinner ","4 " "169",169,10.5900001525879,1.61000001430511,"F","yes","sat ","dinner ","2 " "170",170,10.6300001144409,2,"F","yes","sat ","dinner ","2 " "171",171,50.810001373291,10,"M","yes","sat ","dinner ","3 " "172",172,15.8100004196167,3.16000008583069,"M","yes","sat ","dinner ","2 " "173",173,7.25,5.15000009536743,"M","yes","sun ","dinner ","2 " "174",174,31.8500003814697,3.1800000667572,"M","yes","sun ","dinner ","2 " "175",175,16.8199996948242,4,"M","yes","sun ","dinner ","2 " "176",176,32.9000015258789,3.10999989509583,"M","yes","sun ","dinner ","2 " "177",177,17.8899993896484,2,"M","yes","sun ","dinner ","2 " "178",178,14.4799995422363,2,"M","yes","sun ","dinner ","2 " "179",179,9.60000038146973,4,"F","yes","sun ","dinner ","2 " "180",180,34.6300010681152,3.54999995231628,"M","yes","sun ","dinner ","2 " "181",181,34.6500015258789,3.6800000667572,"M","yes","sun ","dinner ","4 " "182",182,23.3299999237061,5.65000009536743,"M","yes","sun ","dinner ","2 " "183",183,45.3499984741211,3.5,"M","yes","sun ","dinner ","3 " "184",184,23.1700000762939,6.5,"M","yes","sun ","dinner ","4 " "185",185,40.5499992370605,3,"M","yes","sun ","dinner ","2 " "186",186,20.6900005340576,5,"M","no","sun ","dinner ","5 " "187",187,20.8999996185303,3.5,"F","yes","sun ","dinner ","3 " "188",188,30.4599990844727,2,"M","yes","sun ","dinner ","5 " "189",189,18.1499996185303,3.5,"F","yes","sun ","dinner ","3 " "190",190,23.1000003814697,4,"M","yes","sun ","dinner ","3 " "191",191,15.6899995803833,1.5,"M","yes","sun ","dinner ","2 " "192",192,19.8099994659424,4.19000005722046,"F","yes","thurs ","lunch ","2 " "193",193,28.4400005340576,2.55999994277954,"M","yes","thurs ","lunch ","2 " "194",194,15.4799995422363,2.01999998092651,"M","yes","thurs ","lunch ","2 " "195",195,16.5799999237061,4,"M","yes","thurs ","lunch ","2 " "196",196,7.55999994277954,1.44000005722046,"M","no","thurs ","lunch ","2 " "197",197,10.3400001525879,2,"M","yes","thurs ","lunch ","2 " "198",198,43.1100006103516,5,"F","yes","thurs ","lunch ","4 " "199",199,13,2,"F","yes","thurs ","lunch ","2 " "200",200,13.5100002288818,2,"M","yes","thurs ","lunch ","2 " "201",201,18.7099990844727,4,"M","yes","thurs ","lunch ","3 " "202",202,12.7399997711182,2.00999999046326,"F","yes","thurs ","lunch ","2 " "203",203,13,2,"F","yes","thurs ","lunch ","2 " "204",204,16.3999996185303,2.5,"F","yes","thurs ","lunch ","2 " "205",205,20.5300006866455,4,"M","yes","thurs ","lunch ","4 " "206",206,16.4699993133545,3.23000001907349,"F","yes","thurs ","lunch ","3 " "207",207,26.5900001525879,3.41000008583069,"M","yes","sat ","dinner ","3 " "208",208,38.7299995422363,3,"M","yes","sat ","dinner ","4 " "209",209,24.2700004577637,2.02999997138977,"M","yes","sat ","dinner ","2 " "210",210,12.7600002288818,2.23000001907349,"F","yes","sat ","dinner ","2 " "211",211,30.0599994659424,2,"M","yes","sat ","dinner ","3 " "212",212,25.8899993896484,5.15999984741211,"M","yes","sat ","dinner ","4 " "213",213,48.3300018310547,9,"M","no","sat ","dinner ","4 " "214",214,13.2700004577637,2.5,"F","yes","sat ","dinner ","2 " "215",215,28.1700000762939,6.5,"F","yes","sat ","dinner ","3 " "216",216,12.8999996185303,1.10000002384186,"F","yes","sat ","dinner ","2 " "217",217,28.1499996185303,3,"M","yes","sat ","dinner ","5 " "218",218,11.5900001525879,1.5,"M","yes","sat ","dinner ","2 " "219",219,7.73999977111816,1.44000005722046,"M","yes","sat ","dinner ","2 " "220",220,30.1399993896484,3.08999991416931,"F","yes","sat ","dinner ","4 " "221",221,12.1599998474121,2.20000004768372,"M","yes","fri ","lunch ","2 " "222",222,13.4200000762939,3.48000001907349,"F","yes","fri ","lunch ","2 " "223",223,8.57999992370605,1.91999995708466,"M","yes","fri ","lunch ","1 " "224",224,15.9799995422363,3,"F","no","fri ","lunch ","3 " "225",225,13.4200000762939,1.58000004291534,"M","yes","fri ","lunch ","2 " "226",226,16.2700004577637,2.5,"F","yes","fri ","lunch ","2 " "227",227,10.0900001525879,2,"F","yes","fri ","lunch ","2 " "228",228,20.4500007629395,3,"M","no","sat ","dinner ","4 " "229",229,13.2799997329712,2.72000002861023,"M","no","sat ","dinner ","2 " "230",230,22.1200008392334,2.88000011444092,"F","yes","sat ","dinner ","2 " "231",231,24.0100002288818,2,"M","yes","sat ","dinner ","4 " "232",232,15.6899995803833,3,"M","yes","sat ","dinner ","3 " "233",233,11.6099996566772,3.39000010490417,"M","no","sat ","dinner ","2 " "234",234,10.7700004577637,1.47000002861023,"M","no","sat ","dinner ","2 " "235",235,15.5299997329712,3,"M","yes","sat ","dinner ","2 " "236",236,10.0699996948242,1.25,"M","no","sat ","dinner ","2 " "237",237,12.6000003814697,1,"M","yes","sat ","dinner ","2 " "238",238,32.8300018310547,1.16999995708466,"M","yes","sat ","dinner ","2 " "239",239,35.8300018310547,4.67000007629395,"F","no","sat ","dinner ","3 " "240",240,29.0300006866455,5.92000007629395,"M","no","sat ","dinner ","3 " "241",241,27.1800003051758,2,"F","yes","sat ","dinner ","2 " "242",242,22.6700000762939,2,"M","yes","sat ","dinner ","2 " "243",243,17.8199996948242,1.75,"M","no","sat ","dinner ","2 " "244",244,18.7800006866455,3,"F","no","thurs ","dinner ","2 " ggobi-2.1.12/data/cube6.xml0000644000175000017500000003012314651527764011024 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 ggobi-2.1.12/data/tmin2.xml0000644000175000017500000000541614651527764011060 This is a simple example for testing automatically computed levels for a categorical variable using the levels="auto" attribute for a categoricalvariable element. It also uses the string element to identify these values. Note that because we want to tag one of the elements of each record, we have to tag them all so that this can be a valid xml file. Monday Tuesday Wednesday Thursday Friday Saturday Sunday low medium high biz res unknown 0 10 Monday 0 0 AB C 0 1 20 Tuesday 0 1 DEF 1 2 30 Wednesay 1 2 GHI 2 3 40 Thursday 2 1 J 3 4 50 Friday 2 2 KLM 4 5 60 Saturday 2 1 NOP QRST 5 670Sunday22Happy Birthday7 1.0 2.0 2.0 1.0 2.0 2.0 ggobi-2.1.12/data/buckyball.xml0000644000175000017500000002133114651527764011771 -0.108022 2.389616 -2.593673 -1.232478 2.765126 -1.802246 -0.751701 3.377841 -0.613467 0.671924 3.384590 -0.665701 1.066695 2.778224 -1.884692 -2.975723 0.176517 1.933305 -3.453261 -0.435074 0.758800 -3.011595 -1.788106 0.739593 -2.251138 -2.005841 1.932052 -2.225179 -0.792532 2.668610 3.131426 0.187348 1.668036 2.436158 -0.788283 2.480008 2.405963 -2.015362 1.724938 3.061083 -1.789611 0.493145 3.503849 -0.429040 0.482560 -0.131939 1.150449 -3.349970 -1.289658 0.308857 -3.298775 -0.848418 -1.052649 -3.307085 0.583910 -1.046871 -3.365774 1.033339 0.317287 -3.386985 0.731139 -3.472222 0.614752 -0.687668 -3.471748 0.665525 -1.075166 -2.858685 1.890461 0.104362 -2.475031 2.592667 1.217345 -2.857368 1.804314 -2.439934 0.694554 -2.483608 -3.115184 -0.285093 -1.704905 -3.505883 0.324700 -0.481919 -3.068511 1.682535 -0.508266 -2.407917 1.907850 -1.747466 0.791212 2.923079 1.789715 1.444547 3.159690 0.539726 2.671233 1.591056 1.681337 2.605742 2.324577 0.497151 1.558792 1.983222 2.466817 0.651220 -3.018531 -1.845944 1.337684 -2.047819 -2.621833 1.404882 -3.248422 -0.655727 2.558580 -2.412477 -0.718711 2.520522 -1.674419 -1.913518 -2.663924 -1.670388 -1.712625 -1.540988 -2.044622 -2.510036 -0.798963 -3.019611 -1.785560 -1.459231 -3.244257 -0.550463 -2.610975 -2.409814 -0.507085 -0.600661 0.991026 3.343135 -1.009735 -0.397655 3.388172 0.142193 -1.227663 3.347725 0.850951 0.955020 3.301366 1.349409 -0.412905 3.264122 -1.423823 3.147125 0.657111 -2.573165 2.306380 0.706583 -2.523919 1.564246 1.918381 -1.339441 1.943759 2.623628 -0.665066 2.924495 1.838100 3.012250 1.698325 -0.738779 3.458585 0.330149 -0.748281 2.976355 -0.280454 -1.937521 2.248435 0.708226 -2.654087 2.259493 1.927785 -1.914609 ggobi-2.1.12/data/adhoc.xml0000644000175000017500000000235014651527764011077 .25 .75 100 .75 .75 60 .75 .25 120 .25 .25 30 .20 .85 30 .30 .65 30 .70 .80 30 .70 .30 30 .20 .30 30 .30 .20 30 ggobi-2.1.12/data/Shipman.csv0000644000175000017500000010124214651527764011413 "","id","age","month","year","julian.date","place","cause" "1",1,72,"May ",1974,2442178,"Own home","Natural death" "2",2,67,"Jun ",1974,2442221,"Own home","Natural death" "3",3,26,"Jul ",1974,2442252,"Own home","Natural death" "4",4,58,"Aug ",1974,2442262,"Surgery","Natural death" "5",5,77,"Oct ",1974,2442330,"Ambulance","Natural death" "6",6,78,"Nov ",1974,2442362,"Hospital","Natural death" "7",7,18,"Dec ",1974,2442391,"Hospital","Natural death" "8",8,26,"Dec ",1974,2442398,"Hospital","Natural death" "9",9,86,"Dec ",1974,2442411,"Own home","Insufficient evidence for decision" "10",10,73,"Jan ",1975,2442434,"Own home","Suspicion of Unlawful killing" "11",11,62,"Jan ",1975,2442434,"Own home","Suspicion of Unlawful killing" "12",12,84,"Jan ",1975,2442434,"Own home","Suspicion of Unlawful killing" "13",13,70,"Jan ",1975,2442438,"Residential home","Insufficient evidence for decision" "14",14,80,"Feb ",1975,2442459,"Own home","Suspicion of Unlawful killing" "15",15,72,"Mar ",1975,2442483,"Own home","Natural death" "16",16,65,"Mar ",1975,2442483,"Own home","Natural death" "17",17,70,"Mar ",1975,2442489,"Own home","Unlawful killing" "18",18,67,"Mar ",1975,2442483,"Own home","Suspicion of Unlawful killing" "19",19,87,"Apr ",1975,2442504,"Own home","Insufficient evidence for decision" "20",20,77,"Apr ",1975,2442509,"Own home","Natural death" "21",21,67,"Apr ",1975,2442510,"Own home","Insufficient evidence for decision" "22",22,86,"Apr ",1975,2442511,"Own home","Natural death" "23",23,64,"Apr ",1975,2442531,"Own home","Insufficient evidence for decision" "24",24,59,"May ",1975,2442559,"Own home","Natural death" "25",25,54,"Jul ",1975,2442621,"Own home","Natural death" "26",26,86,"Aug ",1975,2442629,"Own home","Natural death" "27",27,75,"Aug ",1975,2442630,"Own home","Suspicion of Unlawful killing" "28",28,88,"Aug ",1975,2442634,"Daughter's home","Natural death" "29",29,70,"Sep ",1975,2442657,"Own home","Natural death" "30",30,38,"Sep ",1975,2442683,"Own home","Natural death" "31",31,81,"Oct ",1977,2443425,"Residential home","Natural death" "32",32,77,"Nov ",1977,2443469,"Own home","Insufficient evidence for decision" "33",33,81,"Dec ",1977,2443493,"Own home","Natural death" "34",34,60,"Jan ",1978,2443518,"Own home","Suspicion of Unlawful killing" "35",35,74,"Feb ",1978,2443564,"Residential home","Natural death" "36",36,87,"Feb ",1978,2443564,"Residential home","Natural death" "37",37,88,"Feb ",1978,2443566,"Residential home","Natural death" "38",38,81,"Jun ",1978,2443667,"Own home","Insufficient evidence for decision" "39",39,73,"Jul ",1978,2443712,"Residential home","Natural death" "40",40,83,"Jul ",1978,2443719,"Own home","Insufficient evidence for decision" "41",41,65,"Aug ",1978,2443723,"Friend's home","Natural death" "42",42,86,"Aug ",1978,2443728,"Own home","Unlawful killing" "43",43,81,"Aug ",1978,2443731,"Residential home","Natural death" "44",44,73,"Aug ",1978,2443751,"Own home","Unlawful killing" "45",45,74,"Sep ",1978,2443758,"Own home","Natural death" "46",46,69,"Sep ",1978,2443758,"Own home","Suspicion of Unlawful killing" "47",47,96,"Sep ",1978,2443769,"Residential home","Natural death" "48",48,75,"Sep ",1978,2443777,"Daughter's home","Suspicion of Unlawful killing" "49",49,86,"Nov ",1978,2443820,"Residential home","Natural death" "50",50,78,"Nov ",1978,2443825,"Own home","Natural death" "51",51,77,"Nov ",1978,2443835,"Own home","Natural death" "52",52,70,"Nov ",1978,2443836,"Own home","Suspicion of Unlawful killing" "53",53,84,"Dec ",1978,2443845,"Residential home","Natural death" "54",54,76,"Dec ",1978,2443848,"Own home","Suspicion of Unlawful killing" "55",55,73,"Dec ",1978,2443850,"Own home","Unlawful killing" "56",56,82,"Dec ",1978,2443852,"Residential home","Natural death" "57",57,89,"Dec ",1978,2443863,"Own home","Natural death" "58",58,88,"Dec ",1978,2443863,"Own home","Unlawful killing" "59",59,79,"Jan ",1979,2443885,"Own home","Insufficient evidence for decision" "60",60,81,"Jan ",1979,2443885,"Own home","Natural death" "61",61,77,"Jan ",1979,2443896,"Own home","Natural death" "62",62,74,"Mar ",1979,2443944,"Own home","Natural death" "63",63,87,"Mar ",1979,2443953,"Residential home","Natural death" "64",64,77,"Apr ",1979,2443978,"Own home","Natural death" "65",65,86,"May ",1979,2443995,"Residential home","Natural death" "66",66,57,"May ",1979,2443996,"Own home","Insufficient evidence for decision" "67",67,89,"May ",1979,2443997,"Own home","Natural death" "68",68,83,"May ",1979,2444004,"Own home","Natural death" "69",69,61,"May ",1979,2444011,"Own home","Natural death" "70",70,92,"May ",1979,2444024,"Residential home","Natural death" "71",71,97,"Jul ",1979,2444060,"Residential home","Natural death" "72",72,88,"Jul ",1979,2444073,"Own home","Suspicion of Unlawful killing" "73",73,84,"Jul ",1979,2444084,"Residential home","Natural death" "74",74,76,"Aug ",1979,2444088,"Own home","Natural death" "75",75,68,"Aug ",1979,2444090,"Own home","Suspicion of Unlawful killing" "76",76,69,"Aug ",1979,2444091,"Own home","Suspicion of Unlawful killing" "77",77,88,"Aug ",1979,2444094,"Residential home","Natural death" "78",78,76,"Aug ",1979,2444096,"Own home","Unlawful killing" "79",79,66,"Aug ",1979,2444099,"Own home","Suspicion of Unlawful killing" "80",80,72,"Aug ",1979,2444104,"Own home","Insufficient evidence for decision" "81",81,78,"Aug ",1979,2444111,"Own home","Natural death" "82",82,83,"Aug ",1979,2444111,"Residential home","Natural death" "83",83,91,"Sep ",1979,2444147,"Residential home","Natural death" "84",84,68,"Oct ",1979,2444156,"Own home","Natural death" "85",85,80,"Nov ",1979,2444189,"Residential home","Suspicion of Unlawful killing" "86",86,77,"Nov ",1979,2444206,"Hospital","Unlawful killing" "87",87,84,"Dec ",1979,2444213,"Residential home","Natural death" "88",88,85,"Dec ",1979,2444231,"Own home","Natural death" "89",89,92,"Jan ",1980,2444242,"Residential home","Suspicion of Unlawful killing" "90",90,83,"Feb ",1980,2444272,"Own home","Natural death" "91",91,79,"Feb ",1980,2444277,"Own home","Natural death" "92",92,81,"Feb ",1980,2444280,"Residential home","Insufficient evidence for decision" "93",93,72,"Feb ",1980,2444282,"Own home","Natural death" "94",94,89,"Mar ",1980,2444313,"Residential home","Natural death" "95",95,66,"Mar ",1980,2444321,"Own home","Natural death" "96",96,91,"Apr ",1980,2444333,"Residential home","Insufficient evidence for decision" "97",97,79,"Apr ",1980,2444336,"Own home","Natural death" "98",98,90,"Apr ",1980,2444342,"Residential home","Natural death" "99",99,83,"May ",1980,2444361,"Residential home","Natural death" "100",100,84,"Jun ",1980,2444414,"Own home","Insufficient evidence for decision" "101",101,77,"Jul ",1980,2444444,"Residential home","Natural death" "102",102,92,"Sep ",1980,2444512,"Own home","Insufficient evidence for decision" "103",103,85,"Oct ",1980,2444543,"Residential home","Natural death" "104",104,78,"Nov ",1980,2444546,"Own home","Natural death" "105",105,88,"Nov ",1980,2444561,"Own home","Insufficient evidence for decision" "106",106,91,"Dec ",1980,2444598,"Own home","Natural death" "107",107,85,"Jan ",1981,2444612,"Own home","Insufficient evidence for decision" "108",108,70,"Jan ",1981,2444623,"Own home","Natural death" "109",109,69,"Mar ",1981,2444666,"Own home","Natural death" "110",110,87,"Mar ",1981,2444669,"Residential home","Natural death" "111",111,84,"Apr ",1981,2444713,"Own home","Unlawful killing" "112",112,86,"Apr ",1981,2444715,"Residential home","Natural death" "113",113,86,"Apr ",1981,2444723,"Residential home","Natural death" "114",114,60,"May ",1981,2444729,"Own home","Insufficient evidence for decision" "115",115,77,"May ",1981,2444737,"Own home","Natural death" "116",116,80,"May ",1981,2444741,"Residential home","Natural death" "117",117,82,"May ",1981,2444752,"Residential home","Natural death" "118",118,67,"Jun ",1981,2444758,"Own home","Natural death" "119",119,59,"Jun ",1981,2444779,"Own home","Natural death" "120",120,93,"Jun ",1981,2444783,"Own home","Suspicion of Unlawful killing" "121",121,83,"Jun ",1981,2444785,"Residential home","Insufficient evidence for decision" "122",122,91,"Jul ",1981,2444791,"Residential home","Insufficient evidence for decision" "123",123,88,"Jul ",1981,2444802,"Residential home","Natural death" "124",124,91,"Jul ",1981,2444804,"Residential home","Natural death" "125",125,84,"Aug ",1981,2444820,"Residential home","Insufficient evidence for decision" "126",126,85,"Aug ",1981,2444842,"Own home","Natural death" "127",127,81,"Aug ",1981,2444843,"Own home","Unlawful killing" "128",128,75,"Sep ",1981,2444856,"Own home","Suspicion of Unlawful killing" "129",129,77,"Sep ",1981,2444876,"Own home","Suspicion of Unlawful killing" "130",130,86,"Oct ",1981,2444884,"Residential home","Suspicion of Unlawful killing" "131",131,86,"Oct ",1981,2444884,"Own home","Insufficient evidence for decision" "132",132,86,"Nov ",1981,2444919,"Residential home","Natural death" "133",133,87,"Jan ",1982,2444979,"Own home","Suspicion of Unlawful killing" "134",134,81,"Jan ",1982,2444991,"Residential home","Natural death" "135",135,88,"Feb ",1982,2445007,"Own home","Natural death" "136",136,84,"Feb ",1982,2445019,"Own home","Natural death" "137",137,75,"Feb ",1982,2445024,"Own home","Suspicion of Unlawful killing" "138",138,70,"Mar ",1982,2445033,"Own home","Insufficient evidence for decision" "139",139,83,"Mar ",1982,2445037,"Residential home","Insufficient evidence for decision" "140",140,76,"Mar ",1982,2445045,"Own home","Natural death" "141",141,81,"Mar ",1982,2445055,"Own home","Natural death" "142",142,80,"Mar ",1982,2445058,"Residential home","Suspicion of Unlawful killing" "143",143,91,"May ",1982,2445091,"Residential home","Natural death" "144",144,94,"Jun ",1982,2445126,"Residential home","Natural death" "145",145,74,"Jun ",1982,2445151,"Own home","Suspicion of Unlawful killing" "146",146,86,"Jul ",1982,2445159,"Residential home","Natural death" "147",147,76,"Jul ",1982,2445159,"Own home","Natural death" "148",148,74,"Aug ",1982,2445193,"Own home","Natural death" "149",149,83,"Sep ",1982,2445223,"Residential home","Natural death" "150",150,57,"Dec ",1982,2445319,"Own home","Natural death" "151",151,90,"Jan ",1983,2445339,"Own home","Unlawful killing" "152",152,87,"Jan ",1983,2445342,"Residential home","Natural death" "153",153,82,"Mar ",1983,2445409,"Residential home","Natural death" "154",154,84,"May ",1983,2445468,"Residential home","Natural death" "155",155,85,"May ",1983,2445470,"Residential home","Natural death" "156",156,72,"May ",1983,2445479,"Own home","Suspicion of Unlawful killing" "157",157,77,"Jun ",1983,2445514,"Own home","Unlawful killing" "158",158,83,"Jul ",1983,2445528,"Residential home","Natural death" "159",159,80,"Jul ",1983,2445529,"Own home","Natural death" "160",160,89,"Sep ",1983,2445607,"Residential home","Natural death" "161",161,93,"Oct ",1983,2445620,"Residential home","Natural death" "162",162,78,"Nov ",1983,2445667,"Own home","Natural death" "163",163,51,"Jan ",1984,2445707,"Own home","Unlawful killing" "164",164,88,"Jan ",1984,2445713,"Residential home","Insufficient evidence for decision" "165",165,69,"Jan ",1984,2445727,"Own home","Insufficient evidence for decision" "166",166,83,"Jan ",1984,2445730,"Own home","Natural death" "167",167,78,"Feb ",1984,2445739,"Own home","Unlawful killing" "168",168,83,"Mar ",1984,2445786,"Own home","Suspicion of Unlawful killing" "169",169,82,"Mar ",1984,2445786,"Residential home","Insufficient evidence for decision" "170",170,97,"Mar ",1984,2445786,"Residential home","Natural death" "171",171,83,"Mar ",1984,2445790,"Daughter's home","Suspicion of Unlawful killing" "172",172,83,"Apr ",1984,2445806,"Own home","Unlawful killing" "173",173,70,"Apr ",1984,2445806,"Own home","Insufficient evidence for decision" "174",174,70,"Apr ",1984,2445815,"Own home","Unlawful killing" "175",175,73,"May ",1984,2445827,"Own home","Insufficient evidence for decision" "176",176,88,"May ",1984,2445827,"Residential home","Natural death" "177",177,84,"May ",1984,2445834,"Residential home","Natural death" "178",178,63,"Jun ",1984,2445855,"Own home","Natural death" "179",179,72,"Jul ",1984,2445904,"Own home","Natural death" "180",180,81,"Aug ",1984,2445915,"Residential home","Natural death" "181",181,77,"Aug ",1984,2445920,"Own home","Natural death" "182",182,75,"Sep ",1984,2445952,"Own home","Natural death" "183",183,76,"Sep ",1984,2445965,"Own home","Unlawful killing" "184",184,80,"Sep ",1984,2445970,"Residential home","Natural death" "185",185,88,"Oct ",1984,2445991,"Own home","Suspicion of Unlawful killing" "186",186,78,"Nov ",1984,2446018,"Own home","Insufficient evidence for decision" "187",187,89,"Nov ",1984,2446020,"Residential home","Natural death" "188",188,70,"Nov ",1984,2446028,"Own home","Suspicion of Unlawful killing" "189",189,87,"Nov ",1984,2446032,"Own home","Unlawful killing" "190",190,80,"Dec ",1984,2446052,"Own home","Unlawful killing" "191",191,76,"Dec ",1984,2446053,"Own home","Unlawful killing" "192",192,72,"Dec ",1984,2446059,"Own home","Unlawful killing" "193",193,77,"Jan ",1985,2446067,"Own home","Suspicion of Unlawful killing" "194",194,88,"Jan ",1985,2446067,"Own home","Suspicion of Unlawful killing" "195",195,41,"Jan ",1985,2446068,"Own home","Unlawful killing" "196",196,66,"Jan ",1985,2446074,"Own home","Natural death" "197",197,60,"Jan ",1985,2446091,"Friend's home","Natural death" "198",198,74,"Feb ",1985,2446098,"Own home","Unlawful killing" "199",199,83,"Feb ",1985,2446098,"Residential home","Natural death" "200",200,92,"Feb ",1985,2446099,"Own home","Natural death" "201",201,84,"Feb ",1985,2446101,"Own home","Unlawful killing" "202",202,91,"Feb ",1985,2446112,"Own home","Insufficient evidence for decision" "203",203,69,"Feb ",1985,2446112,"Own home","Unlawful killing" "204",204,73,"Feb ",1985,2446119,"Own home","Unlawful killing" "205",205,81,"Mar ",1985,2446142,"Residential home","Natural death" "206",206,74,"May ",1985,2446210,"Own home","Suspicion of Unlawful killing" "207",207,70,"Jun ",1985,2446243,"Own home","Unlawful killing" "208",208,84,"Jun ",1985,2446243,"Own home","Unlawful killing" "209",209,84,"Jul ",1985,2446257,"Own home","Insufficient evidence for decision" "210",210,85,"Aug ",1985,2446301,"Own home","Unlawful killing" "211",211,58,"Oct ",1985,2446356,"Own home","Natural death" "212",212,76,"Oct ",1985,2446368,"Own home","Natural death" "213",213,77,"Dec ",1985,2446417,"Own home","Unlawful killing" "214",214,79,"Dec ",1985,2446420,"Own home","Unlawful killing" "215",215,82,"Dec ",1985,2446428,"Residential home","Natural death" "216",216,79,"Dec ",1985,2446431,"Own home","Unlawful killing" "217",217,80,"Jan ",1986,2446435,"Own home","Insufficient evidence for decision" "218",218,81,"Jan ",1986,2446438,"Own home","Unlawful killing" "219",219,86,"Jan ",1986,2446459,"Own home","Natural death" "220",220,78,"Apr ",1986,2446522,"Residential home","Natural death" "221",221,74,"Apr ",1986,2446544,"Residential home","Unlawful killing" "222",222,69,"May ",1986,2446558,"Own home","Natural death" "223",223,63,"May ",1986,2446568,"Own home","Suspicion of Unlawful killing" "224",224,57,"May ",1986,2446578,"Hospital","Natural death" "225",225,81,"Jun ",1986,2446588,"Own home","Unlawful killing" "226",226,63,"Sep ",1986,2446689,"Own home","Unlawful killing" "227",227,73,"Oct ",1986,2446711,"Own home","Unlawful killing" "228",228,59,"Nov ",1986,2446752,"Own home","Unlawful killing" "229",229,81,"Nov ",1986,2446752,"Own home","Suspicion of Unlawful killing" "230",230,75,"Dec ",1986,2446781,"Own home","Unlawful killing" "231",231,82,"Dec ",1986,2446788,"Own home","Unlawful killing" "232",232,66,"Mar ",1987,2446862,"Own home","Insufficient evidence for decision" "233",233,77,"Mar ",1987,2446867,"Residential home","Suspicion of Unlawful killing" "234",234,78,"Mar ",1987,2446882,"Residential home","Natural death" "235",235,76,"Mar ",1987,2446885,"Own home","Unlawful killing" "236",236,85,"Apr ",1987,2446887,"Own home","Unlawful killing" "237",237,81,"Apr ",1987,2446892,"Own home","Natural death" "238",238,86,"Apr ",1987,2446894,"Residential home","Natural death" "239",239,83,"Apr ",1987,2446902,"Own home","Unlawful killing" "240",240,82,"Apr ",1987,2446903,"Residential home","Natural death" "241",241,61,"Apr ",1987,2446903,"Own home","Natural death" "242",242,78,"May ",1987,2446924,"Own home","Unlawful killing" "243",243,76,"Jul ",1987,2447003,"Daughter's home","Insufficient evidence for decision" "244",244,71,"Sep ",1987,2447053,"Own home","Unlawful killing" "245",245,81,"Sep ",1987,2447060,"Residential home","Natural death" "246",246,80,"Dec ",1987,2447151,"Own home","Unlawful killing" "247",247,69,"Dec ",1987,2447159,"Own home","Unlawful killing" "248",248,74,"Dec ",1987,2447160,"Own home","Unlawful killing" "249",249,90,"Jan ",1988,2447166,"Own home","Unlawful killing" "250",250,83,"Jan ",1988,2447176,"Own home","Unlawful killing" "251",251,88,"Feb ",1988,2447197,"Residential home","Insufficient evidence for decision" "252",252,90,"Feb ",1988,2447201,"Own home","Unlawful killing" "253",253,93,"Feb ",1988,2447207,"Own home","Unlawful killing" "254",254,83,"Feb ",1988,2447207,"Own home","Unlawful killing" "255",255,84,"Feb ",1988,2447208,"Own home","Unlawful killing" "256",256,93,"Feb ",1988,2447209,"Residential home","Natural death" "257",257,80,"Sep ",1988,2447423,"Own home","Unlawful killing" "258",258,100,"Oct ",1988,2447440,"Residential home","Natural death" "259",259,69,"Oct ",1988,2447455,"Own home","Unlawful killing" "260",260,69,"Oct ",1988,2447460,"Own home","Natural death" "261",261,85,"Nov ",1988,2447468,"Residential home","Natural death" "262",262,85,"Nov ",1988,2447472,"Own home","Unlawful killing" "263",263,91,"Dec ",1988,2447497,"Residential home","Natural death" "264",264,87,"Dec ",1988,2447513,"Own home","Unlawful killing" "265",265,80,"Dec ",1988,2447515,"Own home","Unlawful killing" "266",266,80,"Jan ",1989,2447558,"Own home","Unlawful killing" "267",267,81,"Mar ",1989,2447594,"Shipman's surgery","Unlawful killing" "268",268,90,"Mar ",1989,2447607,"Residential home","Natural death" "269",269,78,"May ",1989,2447659,"Own home","Unlawful killing" "270",270,86,"May ",1989,2447665,"Residential home","Natural death" "271",271,69,"Jun ",1989,2447683,"Own home","Unlawful killing" "272",272,75,"Jul ",1989,2447714,"Own home","Unlawful killing" "273",273,80,"Aug ",1989,2447753,"Own home","Unlawful killing" "274",274,82,"Sep ",1989,2447792,"Own home","Unlawful killing" "275",275,82,"Sep ",1989,2447796,"Own home","Unlawful killing" "276",276,82,"Oct ",1989,2447815,"Own home","Unlawful killing" "277",277,81,"Oct ",1989,2447816,"Own home","Unlawful killing" "278",278,67,"Oct ",1989,2447818,"Own home","Unlawful killing" "279",279,85,"Nov ",1989,2447837,"Own home","Unlawful killing" "280",280,73,"Nov ",1989,2447846,"Own home","Natural death" "281",281,83,"May ",1990,2448040,"Own home","Natural death" "282",282,69,"Jul ",1990,2448083,"Own home","Natural death" "283",283,56,"Sep ",1990,2448153,"Own home","Unlawful killing" "284",284,84,"Sep ",1990,2448156,"Own home","Natural death" "285",285,68,"Oct ",1990,2448196,"Residential home","Natural death" "286",286,75,"Nov ",1990,2448200,"Residential home","Natural death" "287",287,69,"Dec ",1990,2448256,"Own home","Unlawful killing" "288",288,48,"Feb ",1991,2448309,"Own home","Natural death" "289",289,88,"Mar ",1991,2448318,"Residential home","Natural death" "290",290,73,"Mar ",1991,2448337,"Own home","Insufficient evidence for decision" "291",291,81,"May ",1991,2448380,"Own home","Natural death" "292",292,58,"May ",1991,2448382,"Own home","Natural death" "293",293,79,"Aug ",1991,2448474,"Own home","Natural death" "294",294,94,"Aug ",1991,2448495,"Own home","Natural death" "295",295,33,"Oct ",1991,2448533,"Own home","Natural death" "296",296,77,"Oct ",1991,2448541,"Residential home","Natural death" "297",297,82,"Oct ",1991,2448551,"Residential home","Natural death" "298",298,82,"Oct ",1991,2448557,"Own home","Natural death" "299",299,84,"Nov ",1991,2448578,"Nursing home","Natural death" "300",300,89,"Jan ",1992,2448632,"Residential home","Suspicion of Unlawful killing" "301",301,85,"Apr ",1992,2448741,"Own home","Natural death" "302",302,87,"Jul ",1992,2448806,"Residential home","Natural death" "303",303,79,"Jul ",1992,2448811,"Residential home","Natural death" "304",304,72,"Oct ",1992,2448903,"Own home","Unlawful killing" "305",305,79,"Nov ",1992,2448934,"Own home","Natural death" "306",306,67,"Dec ",1992,2448971,"Own home","Natural death" "307",307,80,"Dec ",1992,2448977,"Residential home","Natural death" "308",308,84,"Feb ",1993,2449031,"Residential home","Natural death" "309",309,83,"Feb ",1993,2449039,"Residential home","Suspicion of Unlawful killing" "310",310,92,"Feb ",1993,2449043,"Own home","Unlawful killing" "311",311,86,"Feb ",1993,2449043,"Own home","Unlawful killing" "312",312,75,"Mar ",1993,2449063,"Residential home","Natural death" "313",313,82,"Mar ",1993,2449069,"Own home","Unlawful killing" "314",314,86,"Apr ",1993,2449086,"Own home","Unlawful killing" "315",315,94,"Apr ",1993,2449094,"Residential home","Natural death" "316",316,74,"Apr ",1993,2449095,"Own home","Unlawful killing" "317",317,84,"Apr ",1993,2449104,"Own home","Unlawful killing" "318",318,74,"Apr ",1993,2449105,"Own home","Unlawful killing" "319",319,90,"Apr ",1993,2449105,"Residential home","Natural death" "320",320,77,"May ",1993,2449110,"Own home","Unlawful killing" "321",321,68,"May ",1993,2449112,"Own home","Unlawful killing" "322",322,84,"May ",1993,2449113,"Own home","Natural death" "323",323,84,"May ",1993,2449120,"Own home","Unlawful killing" "324",324,60,"May ",1993,2449121,"Own home","Unlawful killing" "325",325,74,"Jul ",1993,2449191,"Own home","Unlawful killing" "326",326,77,"Jul ",1993,2449198,"Own home","Natural death" "327",327,77,"Aug ",1993,2449216,"Own home","Unlawful killing" "328",328,69,"Sep ",1993,2449254,"Own home","Natural death" "329",329,65,"Oct ",1993,2449290,"Nursing home","Natural death" "330",330,90,"Nov ",1993,2449293,"Residential home","Natural death" "331",331,78,"Dec ",1993,2449338,"Own home","Unlawful killing" "332",332,54,"Dec ",1993,2449334,"Own home","Unlawful killing" "333",333,73,"Dec ",1993,2449334,"Own home","Suspicion of Unlawful killing" "334",334,78,"Dec ",1993,2449345,"Residential home","Natural death" "335",335,90,"Dec ",1993,2449353,"Own home","Unlawful killing" "336",336,82,"Jan ",1994,2449357,"Shipman's surgery","Unlawful killing" "337",337,53,"Jan ",1994,2449366,"Own home","Unlawful killing" "338",338,73,"Feb ",1994,2449393,"Own home","Unlawful killing" "339",339,84,"May ",1994,2449490,"Own home","Unlawful killing" "340",340,57,"May ",1994,2449498,"Own home","Unlawful killing" "341",341,87,"Jun ",1994,2449519,"Own home","Unlawful killing" "342",342,70,"Jun ",1994,2449521,"Own home","Unlawful killing" "343",343,78,"Jul ",1994,2449561,"Own home","Unlawful killing" "344",344,72,"Sep ",1994,2449604,"Nursing home","Natural death" "345",345,58,"Oct ",1994,2449633,"Hospital","Natural death" "346",346,64,"Nov ",1994,2449661,"Own home","Suspicion of Unlawful killing" "347",347,91,"Nov ",1994,2449667,"Nursing home","Suspicion of Unlawful killing" "348",348,87,"Nov ",1994,2449682,"Own home","Unlawful killing" "349",349,75,"Nov ",1994,2449687,"Own home","Unlawful killing" "350",350,81,"Dec ",1994,2449691,"Nursing home","Natural death" "351",351,90,"Dec ",1994,2449707,"Residential home","Natural death" "352",352,81,"Dec ",1994,2449716,"Own home","Unlawful killing" "353",353,74,"Jan ",1995,2449724,"Daughter's home","Natural death" "354",354,88,"Jan ",1995,2449727,"Own home","Unlawful killing" "355",355,80,"Jan ",1995,2449735,"Nursing home","Natural death" "356",356,80,"Jan ",1995,2449741,"Own home","Natural death" "357",357,70,"Mar ",1995,2449778,"Own home","Unlawful killing" "358",358,88,"Mar ",1995,2449780,"Own home","Unlawful killing" "359",359,81,"Mar ",1995,2449783,"Own home","Conviction" "360",360,71,"Mar ",1995,2449784,"Own home","Unlawful killing" "361",361,88,"Mar ",1995,2449784,"Own home","Unlawful killing" "362",362,53,"Mar ",1995,2449790,"Own home","Unlawful killing" "363",363,84,"Mar ",1995,2449794,"Own home","Insufficient evidence for decision" "364",364,82,"Mar ",1995,2449798,"Own home","Unlawful killing" "365",365,86,"Mar ",1995,2449803,"Own home","Unlawful killing" "366",366,70,"Mar ",1995,2449808,"Own home","Unlawful killing" "367",367,71,"Apr ",1995,2449818,"Own home","Unlawful killing" "368",368,85,"Apr ",1995,2449821,"Own home","Unlawful killing" "369",369,84,"Apr ",1995,2449822,"Own home","Unlawful killing" "370",370,47,"Apr ",1995,2449829,"Hospital","Unlawful killing" "371",371,82,"May ",1995,2449841,"Residential home","Natural death" "372",372,75,"May ",1995,2449842,"Own home","Unlawful killing" "373",373,90,"May ",1995,2449860,"Own home","Suspicion of Unlawful killing" "374",374,85,"Jun ",1995,2449871,"Nursing home","Unlawful killing" "375",375,71,"Jun ",1995,2449880,"Own home","Natural death" "376",376,68,"Jun ",1995,2449882,"Shipman's surgery","Unlawful killing" "377",377,63,"Jun ",1995,2449886,"Own home","Unlawful killing" "378",378,82,"Jun ",1995,2449898,"Own home","Unlawful killing" "379",379,75,"Jul ",1995,2449903,"Hospital","Natural death" "380",380,88,"Jul ",1995,2449911,"Own home","Unlawful killing" "381",381,65,"Jul ",1995,2449930,"Own home","Unlawful killing" "382",382,64,"Aug ",1995,2449953,"Hospital","Natural death" "383",383,84,"Aug ",1995,2449955,"Nursing home","Natural death" "384",384,82,"Aug ",1995,2449959,"Own home","Unlawful killing" "385",385,72,"Sep ",1995,2449975,"Own home","Unlawful killing" "386",386,87,"Sep ",1995,2449987,"Shipman's surgery","Unlawful killing" "387",387,87,"Oct ",1995,2450015,"Own home","Unlawful killing" "388",388,87,"Nov ",1995,2450024,"Residential home","Natural death" "389",389,74,"Nov ",1995,2450030,"Own home","Unlawful killing" "390",390,88,"Nov ",1995,2450044,"Own home","Unlawful killing" "391",391,43,"Nov ",1995,2450047,"Own home","Unlawful killing" "392",392,67,"Dec ",1995,2450066,"Own home","Unlawful killing" "393",393,75,"Dec ",1995,2450066,"Own home","Unlawful killing" "394",394,72,"Dec ",1995,2450069,"Own home","Natural death" "395",395,81,"Jan ",1996,2450085,"Own home","Unlawful killing" "396",396,79,"Jan ",1996,2450094,"Own home","Unlawful killing" "397",397,42,"Jan ",1996,2450102,"Hospital","Natural death" "398",398,76,"Jan ",1996,2450109,"Own home","Natural death" "399",399,84,"Feb ",1996,2450122,"Residential home","Natural death" "400",400,91,"Feb ",1996,2450133,"Residential home","Natural death" "401",401,80,"Feb ",1996,2450135,"Own home","Unlawful killing" "402",402,88,"Feb ",1996,2450141,"Own home","Unlawful killing" "403",403,71,"Mar ",1996,2450155,"Own home","Unlawful killing" "404",404,80,"Apr ",1996,2450186,"Own home","Natural death" "405",405,79,"Apr ",1996,2450192,"Own home","Unlawful killing" "406",406,104,"Apr ",1996,2450192,"Residential home","Natural death" "407",407,85,"Apr ",1996,2450196,"Residential home","Natural death" "408",408,77,"Apr ",1996,2450198,"Own home","Unlawful killing" "409",409,85,"May ",1996,2450211,"Own home","Unlawful killing" "410",410,72,"May ",1996,2450217,"Shipman's surgery","Unlawful killing" "411",411,82,"May ",1996,2450222,"Own home","Suspicion of Unlawful killing" "412",412,54,"May ",1996,2450233,"Own home","Unlawful killing" "413",413,77,"May ",1996,2450234,"Own home","Unlawful killing" "414",414,63,"Jun ",1996,2450241,"Own home","Unlawful killing" "415",415,80,"Jun ",1996,2450243,"Own home","Natural death" "416",416,82,"Jun ",1996,2450245,"Own home","Unlawful killing" "417",417,82,"Jun ",1996,2450252,"Own home","Unlawful killing" "418",418,86,"Jun ",1996,2450260,"Own home","Unlawful killing" "419",419,81,"Jun ",1996,2450260,"Own home","Unlawful killing" "420",420,77,"Jul ",1996,2450267,"Own home","Unlawful killing" "421",421,67,"Jul ",1996,2450276,"Own home","Conviction" "422",422,81,"Jul ",1996,2450281,"Own home","Unlawful killing" "423",423,84,"Jul ",1996,2450284,"Own home","Unlawful killing" "424",424,57,"Jul ",1996,2450287,"Own home","Natural death" "425",425,85,"Jul ",1996,2450289,"Own home","Unlawful killing" "426",426,84,"Jul ",1996,2450294,"Own home","Unlawful killing" "427",427,76,"Aug ",1996,2450326,"Own home","Unlawful killing" "428",428,85,"Sep ",1996,2450339,"Own home","Unlawful killing" "429",429,75,"Sep ",1996,2450347,"Own home","Unlawful killing" "430",430,76,"Oct ",1996,2450380,"Own home","Unlawful killing" "431",431,60,"Nov ",1996,2450400,"Hospital","Natural death" "432",432,95,"Nov ",1996,2450406,"Residential home","Natural death" "433",433,76,"Nov ",1996,2450408,"Own home","Unlawful killing" "434",434,89,"Nov ",1996,2450411,"Own home","Unlawful killing" "435",435,77,"Nov ",1996,2450417,"Hospital","Natural death" "436",436,78,"Dec ",1996,2450422,"Own home","Unlawful killing" "437",437,62,"Dec ",1996,2450434,"Nursing home","Natural death" "438",438,73,"Dec ",1996,2450435,"Own home","Unlawful killing" "439",439,75,"Jan ",1997,2450451,"Residential home","Unlawful killing" "440",440,47,"Jan ",1997,2450452,"Own home","Unlawful killing" "441",441,69,"Jan ",1997,2450457,"Own home","Unlawful killing" "442",442,81,"Jan ",1997,2450458,"Nursing home","Natural death" "443",443,95,"Jan ",1997,2450460,"Residential home","Natural death" "444",444,76,"Jan ",1997,2450469,"Own home","Unlawful killing" "445",445,89,"Jan ",1997,2450476,"Own home","Unlawful killing" "446",446,90,"Feb ",1997,2450483,"Own home","Unlawful killing" "447",447,70,"Feb ",1997,2450484,"Own home","Unlawful killing" "448",448,74,"Feb ",1997,2450503,"Own home","Unlawful killing" "449",449,77,"Feb ",1997,2450508,"Own home","Conviction" "450",450,69,"Mar ",1997,2450528,"Nursing home","Natural death" "451",451,76,"Mar ",1997,2450530,"Own home","Unlawful killing" "452",452,84,"Mar ",1997,2450535,"Own home","Unlawful killing" "453",453,97,"Mar ",1997,2450537,"Residential home","Natural death" "454",454,73,"Apr ",1997,2450550,"Nursing home","Natural death" "455",455,80,"Apr ",1997,2450560,"Own home","Unlawful killing" "456",456,76,"Apr ",1997,2450560,"Own home","Suspicion of Unlawful killing" "457",457,76,"Apr ",1997,2450564,"Own home","Unlawful killing" "458",458,58,"Apr ",1997,2450564,"Own home","Conviction" "459",459,68,"May ",1997,2450571,"Own home","Unlawful killing" "460",460,74,"May ",1997,2450581,"Own home","Unlawful killing" "461",461,79,"May ",1997,2450590,"Own home","Unlawful killing" "462",462,87,"May ",1997,2450594,"Residential home","Natural death" "463",463,63,"May ",1997,2450598,"Shipman's surgery","Conviction" "464",464,69,"Jun ",1997,2450624,"Own home","Unlawful killing" "465",465,51,"Jul ",1997,2450637,"Own home","Unlawful killing" "466",466,76,"Jul ",1997,2450644,"Own home","Conviction" "467",467,69,"Jul ",1997,2450655,"Own home","Unlawful killing" "468",468,86,"Jul ",1997,2450658,"Own home","Unlawful killing" "469",469,72,"Aug ",1997,2450671,"Own home","Unlawful killing" "470",470,82,"Aug ",1997,2450674,"Nursing home","Natural death" "471",471,77,"Aug ",1997,2450688,"Country park footpath","Natural death" "472",472,81,"Sep ",1997,2450693,"Own home","Unlawful killing" "473",473,79,"Sep ",1997,2450714,"Own home","Unlawful killing" "474",474,79,"Sep ",1997,2450718,"Own home","Unlawful killing" "475",475,77,"Sep ",1997,2450721,"Own home","Unlawful killing" "476",476,79,"Nov ",1997,2450763,"Own home","Unlawful killing" "477",477,77,"Nov ",1997,2450764,"Own home","Suspicion of Unlawful killing" "478",478,78,"Nov ",1997,2450767,"Own home","Unlawful killing" "479",479,83,"Nov ",1997,2450774,"Own home","Unlawful killing" "480",480,67,"Nov ",1997,2450777,"Own home","Conviction" "481",481,70,"Dec ",1997,2450791,"Own home","Unlawful killing" "482",482,81,"Dec ",1997,2450792,"Own home","Conviction" "483",483,49,"Dec ",1997,2450793,"Own home","Conviction" "484",484,73,"Dec ",1997,2450801,"Own home","Unlawful killing" "485",485,83,"Dec ",1997,2450807,"Own home","Unlawful killing" "486",486,79,"Jan ",1998,2450836,"Own home","Unlawful killing" "487",487,64,"Jan ",1998,2450840,"Own home","Conviction" "488",488,73,"Feb ",1998,2450847,"Own home","Unlawful killing" "489",489,73,"Feb ",1998,2450847,"Nursing home","Natural death" "490",490,68,"Feb ",1998,2450854,"Own home","Conviction" "491",491,90,"Feb ",1998,2450856,"Nursing home","Natural death" "492",492,83,"Feb ",1998,2450858,"Own home","Unlawful killing" "493",493,74,"Feb ",1998,2450860,"Own home","Unlawful killing" "494",494,57,"Feb ",1998,2450863,"Own home","Conviction" "495",495,82,"Feb ",1998,2450870,"Own home","Natural death" "496",496,75,"Feb ",1998,2450872,"Own home","Unlawful killing" "497",497,75,"Feb ",1998,2450873,"Hospital","Natural death" "498",498,77,"Mar ",1998,2450877,"Own home","Unlawful killing" "499",499,65,"Mar ",1998,2450879,"Own home","Unlawful killing" "500",500,74,"Mar ",1998,2450880,"Own home","Unlawful killing" "501",501,84,"Mar ",1998,2450886,"Own home","Unlawful killing" "502",502,83,"Mar ",1998,2450890,"Own home","Unlawful killing" "503",503,77,"Mar ",1998,2450893,"Own home","Unlawful killing" "504",504,88,"Mar ",1998,2450897,"Own home","Unlawful killing" "505",505,95,"Apr ",1998,2450932,"Residential home","Natural death" "506",506,73,"May ",1998,2450945,"Own home","Conviction" "507",507,73,"Jun ",1998,2450977,"Own home","Conviction" "508",508,81,"Jun ",1998,2450989,"Own home","Conviction" ggobi-2.1.12/data/tmin.xml0000644000175000017500000000164114651527764010772 low medium high biz res 1 2 0 0 2 3 0 1 3 4 1 0 4 5 1 1 5 6 2 0 6 7 2 1 ggobi-2.1.12/data/flea.csv0000644000175000017500000000554214651527764010731 "","tars1","tars2","head","aede1","aede2","aede3","species" "1",191,131,53,150,15,104,"Concinna " "2",185,134,50,147,13,105,"Concinna " "3",200,137,52,144,14,102,"Concinna " "4",173,127,50,144,16,97,"Concinna " "5",171,118,49,153,13,106,"Concinna " "6",160,118,47,140,15,99,"Concinna " "7",188,134,54,151,14,98,"Concinna " "8",186,129,51,143,14,110,"Concinna " "9",174,131,52,144,14,116,"Concinna " "10",163,115,47,142,15,95,"Concinna " "11",190,143,52,141,13,99,"Concinna " "12",174,131,50,150,15,105,"Concinna " "13",201,130,51,148,13,110,"Concinna " "14",190,133,53,154,15,106,"Concinna " "15",182,130,51,147,14,105,"Concinna " "16",184,131,51,137,14,95,"Concinna " "17",177,127,49,134,15,105,"Concinna " "18",178,126,53,157,14,116,"Concinna " "19",210,140,54,149,13,107,"Concinna " "20",182,121,51,147,13,111,"Concinna " "21",186,136,56,148,14,111,"Concinna " "22",158,141,58,145,8,107,"Heptapot. " "23",146,119,51,140,11,111,"Heptapot. " "24",151,130,51,140,11,113,"Heptapot. " "25",122,113,45,131,10,102,"Heptapot. " "26",138,121,53,139,11,106,"Heptapot. " "27",132,115,49,139,10,98,"Heptapot. " "28",131,127,51,136,12,107,"Heptapot. " "29",135,123,50,129,11,107,"Heptapot. " "30",125,119,51,140,10,110,"Heptapot. " "31",130,120,48,137,9,106,"Heptapot. " "32",130,131,51,141,11,108,"Heptapot. " "33",138,127,52,138,9,101,"Heptapot. " "34",130,116,52,143,9,111,"Heptapot. " "35",143,123,54,142,11,95,"Heptapot. " "36",154,135,56,144,10,123,"Heptapot. " "37",147,132,54,138,10,102,"Heptapot. " "38",141,131,51,140,10,106,"Heptapot. " "39",131,116,47,130,9,102,"Heptapot. " "40",144,121,53,137,11,104,"Heptapot. " "41",137,146,53,137,10,113,"Heptapot. " "42",143,119,53,136,9,105,"Heptapot. " "43",135,127,52,140,10,108,"Heptapot. " "44",186,107,49,120,14,84,"Heikert. " "45",211,122,49,123,16,95,"Heikert. " "46",201,114,47,130,14,74,"Heikert. " "47",242,131,54,131,16,90,"Heikert. " "48",184,108,43,116,16,75,"Heikert. " "49",211,118,51,122,15,90,"Heikert. " "50",217,122,49,127,15,73,"Heikert. " "51",223,127,51,132,16,84,"Heikert. " "52",208,125,50,125,14,88,"Heikert. " "53",199,124,46,119,13,78,"Heikert. " "54",211,129,49,122,13,83,"Heikert. " "55",218,126,49,120,15,85,"Heikert. " "56",203,122,49,119,14,73,"Heikert. " "57",192,116,49,123,15,90,"Heikert. " "58",195,123,47,125,15,77,"Heikert. " "59",211,122,48,125,14,73,"Heikert. " "60",187,123,47,129,14,75,"Heikert. " "61",192,109,46,130,13,90,"Heikert. " "62",223,124,53,129,13,82,"Heikert. " "63",188,114,48,122,12,74,"Heikert. " "64",216,120,50,129,15,86,"Heikert. " "65",185,114,46,124,15,92,"Heikert. " "66",178,119,47,120,13,78,"Heikert. " "67",187,111,49,119,16,66,"Heikert. " "68",187,112,49,119,14,55,"Heikert. " "69",201,130,54,133,13,84,"Heikert. " "70",187,120,47,121,15,86,"Heikert. " "71",210,119,50,128,14,68,"Heikert. " "72",196,114,51,129,14,86,"Heikert. " "73",195,110,49,124,13,89,"Heikert. " "74",187,124,49,129,14,88,"Heikert. " ggobi-2.1.12/data/ratcns.xml0000644000175000017500000003453614651527764011326 Columns: # four timepoints: from the original data, with En meaning # embryonic day n, determined by crown-rump length E11 E13 E15 E18 E21 # postnatal timepoints, with Pn = postnatal day n (Adult = P90) P0 P7 P14 Adult Func.Class.1 Func.Class.2 Cluster Rows: Each case is a gene (or gene family?) And each cell is the gene expression level for that gene at time t, averaging a few measured values and normalizing using the maximum expression value for that gene. Functional classes: Functional class 1 is the high-level class: its range is 1:4 Functional class 2 breaks down the high-level classes, so its range is 1:14 Neuro-Glial Markers markers neurotransmitter metabolizing enzymes Neurotransmitter Receptors GABA-A receptors glutamate receptors acetylcholine receptors serotonin receptors Peptide signaling neurotrophins heparin-binding growth factors insulin/IGF Diverse intracellular signalling cell cycle transcription factor novel/EST other Reference (available on the web at pnas.org): Large-scale temporal gene expression mapping of central nervous system development by X. Wen, S. Fuhrman, G. S. Michaels, D. B. Carr, S. Smith, J. L. Barker, R. Somogyi in the Proceedings of the National Academy of Science, Vol 95, pp. 334-339, January 1998 1.000 0.200 0.310 0.240 0.400 0.270 0.190 0.050 0.000 1 1 1.000 0.770 0.210 0.370 0.400 0.440 0.680 0.690 0.470 1 1 0.490 0.630 1.000 0.540 0.290 0.220 0.100 0.100 0.080 1 1 0.020 0.270 0.820 0.870 0.880 0.790 0.760 0.840 1.000 1 1 0.360 0.620 0.700 0.810 0.970 0.960 0.780 0.780 1.000 1 1 0.060 0.170 0.530 0.960 1.000 0.900 0.510 0.420 0.400 1 1 0.030 0.370 0.450 0.660 0.660 0.900 1.000 0.530 0.300 1 1 0.020 0.120 0.190 0.150 0.160 0.250 0.240 0.490 1.000 1 1 0.040 0.030 0.130 0.280 0.380 0.410 0.470 1.000 0.950 1 1 0.080 0.260 0.660 0.620 0.820 0.840 1.000 0.920 0.740 1 1 0.150 0.380 0.760 0.780 1.000 0.830 0.880 0.850 0.810 1 1 0.020 0.000 0.220 0.570 0.650 0.590 0.630 1.000 0.950 1 1 0.000 0.000 0.000 0.030 0.310 0.430 1.000 0.860 0.750 1 1 0.000 0.000 0.000 0.000 0.000 0.180 0.700 1.000 0.870 1 1 0.090 0.290 0.670 1.000 0.840 0.730 0.700 0.610 0.620 1 2 0.050 0.120 0.810 0.990 1.000 0.960 0.810 0.690 0.680 1 2 0.080 0.080 0.300 0.780 1.000 0.890 0.730 0.640 0.580 1 2 0.320 0.590 1.000 0.800 0.570 0.430 0.280 0.240 0.130 1 2 0.090 0.260 0.840 1.000 0.530 0.260 0.070 0.030 0.000 1 2 0.150 0.190 1.000 0.680 0.840 0.830 0.860 0.810 0.820 1 2 0.000 0.010 0.250 0.230 0.460 0.420 0.560 0.710 1.000 1 2 0.040 0.100 0.390 0.650 0.780 0.830 1.000 0.920 0.940 1 2 0.920 1.000 0.900 0.800 0.780 0.780 0.700 0.660 0.560 1 2 0.520 1.000 0.820 0.660 0.530 0.570 0.190 0.230 0.000 1 2 0.050 0.150 0.730 0.680 0.930 1.000 0.860 0.700 0.480 1 2 0.300 0.410 0.530 0.640 0.680 0.780 0.850 0.970 1.000 2 3 0.010 0.050 0.590 0.800 0.800 0.880 0.790 0.930 1.000 2 3 0.170 0.160 0.900 1.000 0.920 0.790 0.640 0.840 0.730 2 3 0.010 0.190 0.530 0.810 1.000 0.930 0.670 0.530 0.220 2 3 0.060 0.060 0.540 0.940 0.980 0.940 0.830 1.000 0.870 2 3 0.000 0.000 0.330 0.580 0.570 0.530 0.540 1.000 0.510 2 3 0.000 0.000 0.000 1.000 0.580 0.660 0.660 0.270 0.170 2 3 0.270 0.360 0.740 0.740 0.810 0.790 0.690 1.000 0.570 2 3 0.010 0.030 0.230 0.500 0.480 0.580 0.550 0.970 1.000 2 3 0.000 0.320 0.730 0.830 0.810 0.630 0.540 0.650 1.000 2 3 0.130 0.180 0.540 0.850 1.000 0.920 0.690 0.730 0.610 2 3 0.000 0.000 0.000 0.200 0.210 0.250 0.180 0.450 1.000 2 4 0.000 0.420 0.360 0.860 0.830 1.000 0.750 0.110 0.250 2 4 0.020 0.070 0.400 0.790 0.900 0.780 0.660 0.920 1.000 2 4 0.000 0.000 0.140 0.290 0.900 1.000 0.710 0.380 0.520 2 4 0.000 0.000 0.160 1.000 0.800 0.760 0.730 0.500 0.610 2 4 0.000 0.140 0.640 0.680 0.910 1.000 0.480 0.090 0.180 2 4 0.000 0.120 0.310 0.870 0.920 0.870 0.640 1.000 0.760 2 4 0.200 0.000 1.000 0.870 0.970 0.830 0.500 0.500 0.330 2 4 0.000 0.000 0.190 1.000 0.840 0.880 0.870 0.430 0.500 2 4 0.000 0.000 0.000 0.000 0.000 0.060 0.140 0.380 1.000 2 4 0.070 0.000 0.490 0.730 0.710 0.680 0.490 0.810 1.000 2 4 0.000 0.000 0.000 0.380 0.680 1.000 0.590 0.210 0.340 2 4 0.670 0.620 0.330 0.760 0.990 1.000 0.500 0.320 0.220 2 4 0.000 0.000 0.000 0.380 0.880 1.000 0.810 0.690 0.500 2 5 0.010 0.150 0.940 0.600 0.880 1.000 0.590 0.470 0.250 2 5 0.140 0.690 1.000 0.690 0.890 0.850 0.680 0.610 0.140 2 5 0.230 0.830 1.000 0.860 0.880 0.790 0.620 0.350 0.350 2 5 0.940 1.000 0.190 0.500 0.310 0.690 0.690 0.000 0.000 2 5 0.470 0.110 0.120 0.890 1.000 0.940 0.740 0.910 0.500 2 5 0.380 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2 5 0.000 0.000 1.000 0.270 0.000 0.040 0.000 0.000 0.150 2 5 0.040 0.030 0.260 0.690 0.780 0.800 0.970 1.000 0.530 2 5 0.110 0.180 0.290 0.500 1.000 0.980 0.370 0.390 0.110 2 5 0.290 0.200 0.090 0.200 0.460 0.490 0.640 1.000 0.590 2 5 0.150 0.340 0.560 0.760 1.000 0.990 0.700 0.630 0.300 2 6 0.000 0.000 0.110 0.580 0.730 0.810 1.000 0.920 0.820 2 6 0.150 0.100 0.430 0.810 1.000 0.830 0.790 0.640 0.540 2 6 0.140 0.140 0.520 0.760 0.760 1.000 0.720 0.170 0.030 2 6 0.300 0.590 0.140 0.200 0.180 0.240 0.170 0.350 1.000 3 7 0.630 1.000 0.750 0.360 0.480 0.330 0.000 0.050 0.360 3 7 0.660 1.000 0.640 0.950 1.000 0.840 0.590 0.550 0.440 3 7 0.640 0.660 0.270 0.260 0.400 0.760 0.870 0.900 1.000 3 7 0.000 0.300 1.000 0.190 0.070 0.090 0.070 0.040 0.000 3 7 0.060 0.090 1.000 0.410 0.520 0.540 0.570 0.500 0.590 3 7 0.150 0.420 1.000 0.700 0.820 0.970 0.750 0.980 0.980 3 7 0.850 0.960 0.960 0.890 1.000 0.910 0.810 0.840 0.950 3 7 0.680 1.000 0.790 0.550 0.430 0.500 0.590 0.470 0.270 3 8 0.800 0.900 1.000 0.760 0.750 0.700 0.820 0.900 0.630 3 8 1.000 0.880 0.200 0.270 0.540 0.540 0.390 0.240 0.120 3 8 0.390 0.500 0.200 0.370 0.580 0.900 0.970 0.190 1.000 3 8 0.010 0.080 0.100 0.310 0.550 0.680 0.740 0.740 1.000 3 8 0.010 0.040 0.160 0.210 0.480 0.420 0.690 0.640 1.000 3 8 0.870 0.710 0.680 0.830 0.870 0.750 0.770 1.000 1.000 3 8 0.550 1.000 0.550 0.500 0.090 0.000 0.000 0.000 0.000 3 8 0.270 0.480 0.330 0.500 1.000 0.780 0.910 0.760 0.260 3 8 1.000 0.920 0.610 0.750 0.880 0.860 0.760 0.840 0.890 3 8 0.820 1.000 0.980 0.320 0.320 0.320 0.320 0.280 0.500 3 8 0.600 0.820 1.000 0.720 0.570 0.560 0.680 0.820 0.820 3 8 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 3 9 1.000 0.850 0.710 0.710 0.730 0.650 0.640 0.470 0.980 3 9 0.770 0.980 0.910 0.850 1.000 0.970 0.790 0.780 0.810 3 9 0.900 1.000 0.840 0.780 0.540 0.570 0.430 0.400 0.190 3 9 0.670 0.660 0.980 0.950 1.000 0.960 0.790 0.320 0.370 3 9 0.770 0.630 1.000 0.620 0.520 0.610 0.380 0.560 0.590 3 9 1.000 0.690 0.860 0.730 0.560 0.510 0.420 0.310 0.280 3 9 0.880 0.860 0.900 0.940 1.000 0.990 0.700 0.350 0.620 4 10 0.870 0.710 0.550 0.580 0.600 0.710 0.700 1.000 0.600 4 10 0.480 0.420 0.650 0.620 0.680 0.620 0.810 0.940 1.000 4 10 0.620 0.720 0.620 0.490 0.870 1.000 0.360 0.280 0.180 4 10 1.000 0.910 0.970 0.860 0.950 0.770 0.810 0.640 0.630 4 11 0.990 0.990 1.000 0.490 0.520 0.470 0.420 0.230 0.020 4 11 0.870 0.940 0.880 1.000 0.930 0.880 0.810 0.680 0.830 4 11 0.000 0.010 0.560 0.730 0.990 0.990 0.960 0.860 1.000 4 11 0.230 0.460 0.490 0.350 0.450 0.400 0.420 0.510 1.000 4 12 0.110 0.110 0.200 0.310 0.360 0.590 0.390 0.350 1.000 4 12 0.810 1.000 0.610 0.660 0.550 0.500 0.340 0.410 0.270 4 12 0.900 0.850 0.860 0.880 0.980 1.000 0.990 0.910 0.720 4 12 0.810 0.720 0.720 0.680 0.850 1.000 0.890 0.850 0.960 4 13 0.910 0.570 0.570 0.470 0.600 0.930 0.710 0.660 1.000 4 13 0.840 0.690 0.750 1.000 0.770 0.730 0.800 0.640 0.770 4 13 1.000 0.570 0.530 0.760 0.570 0.590 0.750 0.540 0.700 4 13 1.000 1.000 0.670 0.720 0.870 0.730 0.640 0.410 0.300 4 14 0.510 0.420 0.720 0.750 1.000 0.710 0.740 0.650 0.350 4 14 1.000 0.970 0.000 0.000 0.000 0.000 0.000 0.000 0.000 4 14 0.340 0.470 1.000 0.860 0.740 0.590 0.310 0.190 0.160 4 14 0.680 0.630 0.700 0.720 0.740 0.680 0.650 0.790 1.000 4 14 ggobi-2.1.12/data/Shipman.xml0000644000175000017500000025110214651527764011421 This data was taken from the web site http://www.the-shipman-inquiry.org.uk, which describes an investigation into the convicted murderer Dr. Harold Shipman. Shipman had lived in Hyde, England, it's been determined that he killed at least 215 of his patients during his 23 years of medical practice. The records are ordered by time. A number of cases (a few hundred?) were excluded from consideration: patients of Shipman's who had remained alive and well for some time after his last visit, for instance, or patients who died in hospital after significant treatment, or those who died abroad or in accidents. So these are all cases where Shipman could not be quickly excluded from consideration. It is reported that one early clue was the clustering of deaths at certain times of day, but the time of death isn't available on the web site. This material is protected by Crown copyright. Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 72519742442178Own homeNatural death 67619742442221Own homeNatural death 26719742442252Own homeNatural death 58819742442262SurgeryNatural death 771019742442330AmbulanceNatural death 781119742442362HospitalNatural death 181219742442391HospitalNatural death 261219742442398HospitalNatural death 861219742442411Own homeInsufficient evidence for decision 73119752442434Own homeSuspicion of Unlawful killing 62119752442434Own homeSuspicion of Unlawful killing 84119752442434Own homeSuspicion of Unlawful killing 70119752442438Residential homeInsufficient evidence for decision 80219752442459Own homeSuspicion of Unlawful killing 72319752442483Own homeNatural death 65319752442483Own homeNatural death 70319752442489Own homeUnlawful killing 67319752442483Own homeSuspicion of Unlawful killing 87419752442504Own homeInsufficient evidence for decision 77419752442509Own homeNatural death 67419752442510Own homeInsufficient evidence for decision 86419752442511Own homeNatural death 64419752442531Own homeInsufficient evidence for decision 59519752442559Own homeNatural death 54719752442621Own homeNatural death 86819752442629Own homeNatural death 75819752442630Own homeSuspicion of Unlawful killing 88819752442634Daughter's homeNatural death 70919752442657Own homeNatural death 38919752442683Own homeNatural death 811019772443425Residential homeNatural death 771119772443469Own homeInsufficient evidence for decision 811219772443493Own homeNatural death 60119782443518Own homeSuspicion of Unlawful killing 74219782443564Residential homeNatural death 87219782443564Residential homeNatural death 88219782443566Residential homeNatural death 81619782443667Own homeInsufficient evidence for decision 73719782443712Residential homeNatural death 83719782443719Own homeInsufficient evidence for decision 65819782443723Friend's homeNatural death 86819782443728Own homeUnlawful killing 81819782443731Residential homeNatural death 73819782443751Own homeUnlawful killing 74919782443758Own homeNatural death 69919782443758Own homeSuspicion of Unlawful killing 96919782443769Residential homeNatural death 75919782443777Daughter's homeSuspicion of Unlawful killing 861119782443820Residential homeNatural death 781119782443825Own homeNatural death 771119782443835Own homeNatural death 701119782443836Own homeSuspicion of Unlawful killing 841219782443845Residential homeNatural death 761219782443848Own homeSuspicion of Unlawful killing 731219782443850Own homeUnlawful killing 821219782443852Residential homeNatural death 891219782443863Own homeNatural death 881219782443863Own homeUnlawful killing 79119792443885Own homeInsufficient evidence for decision 81119792443885Own homeNatural death 77119792443896Own homeNatural death 74319792443944Own homeNatural death 87319792443953Residential homeNatural death 77419792443978Own homeNatural death 86519792443995Residential homeNatural death 57519792443996Own homeInsufficient evidence for decision 89519792443997Own homeNatural death 83519792444004Own homeNatural death 61519792444011Own homeNatural death 92519792444024Residential homeNatural death 97719792444060Residential homeNatural death 88719792444073Own homeSuspicion of Unlawful killing 84719792444084Residential homeNatural death 76819792444088Own homeNatural death 68819792444090Own homeSuspicion of Unlawful killing 69819792444091Own homeSuspicion of Unlawful killing 88819792444094Residential homeNatural death 76819792444096Own homeUnlawful killing 66819792444099Own homeSuspicion of Unlawful killing 72819792444104Own homeInsufficient evidence for decision 78819792444111Own homeNatural death 83819792444111Residential homeNatural death 91919792444147Residential homeNatural death 681019792444156Own homeNatural death 801119792444189Residential homeSuspicion of Unlawful killing 771119792444206HospitalUnlawful killing 841219792444213Residential homeNatural death 851219792444231Own homeNatural death 92119802444242Residential homeSuspicion of Unlawful killing 83219802444272Own homeNatural death 79219802444277Own homeNatural death 81219802444280Residential homeInsufficient evidence for decision 72219802444282Own homeNatural death 89319802444313Residential homeNatural death 66319802444321Own homeNatural death 91419802444333Residential homeInsufficient evidence for decision 79419802444336Own homeNatural death 90419802444342Residential homeNatural death 83519802444361Residential homeNatural death 84619802444414Own homeInsufficient evidence for decision 77719802444444Residential homeNatural death 92919802444512Own homeInsufficient evidence for decision 851019802444543Residential homeNatural death 781119802444546Own homeNatural death 881119802444561Own homeInsufficient evidence for decision 911219802444598Own homeNatural death 85119812444612Own homeInsufficient evidence for decision 70119812444623Own homeNatural death 69319812444666Own homeNatural death 87319812444669Residential homeNatural death 84419812444713Own homeUnlawful killing 86419812444715Residential homeNatural death 86419812444723Residential homeNatural death 60519812444729Own homeInsufficient evidence for decision 77519812444737Own homeNatural death 80519812444741Residential homeNatural death 82519812444752Residential homeNatural death 67619812444758Own homeNatural death 59619812444779Own homeNatural death 93619812444783Own homeSuspicion of Unlawful killing 83619812444785Residential homeInsufficient evidence for decision 91719812444791Residential homeInsufficient evidence for decision 88719812444802Residential homeNatural death 91719812444804Residential homeNatural death 84819812444820Residential homeInsufficient evidence for decision 85819812444842Own homeNatural death 81819812444843Own homeUnlawful killing 75919812444856Own homeSuspicion of Unlawful killing 77919812444876Own homeSuspicion of Unlawful killing 861019812444884Residential homeSuspicion of Unlawful killing 861019812444884Own homeInsufficient evidence for decision 861119812444919Residential homeNatural death 87119822444979Own homeSuspicion of Unlawful killing 81119822444991Residential homeNatural death 88219822445007Own homeNatural death 84219822445019Own homeNatural death 75219822445024Own homeSuspicion of Unlawful killing 70319822445033Own homeInsufficient evidence for decision 83319822445037Residential homeInsufficient evidence for decision 76319822445045Own homeNatural death 81319822445055Own homeNatural death 80319822445058Residential homeSuspicion of Unlawful killing 91519822445091Residential homeNatural death 94619822445126Residential homeNatural death 74619822445151Own homeSuspicion of Unlawful killing 86719822445159Residential homeNatural death 76719822445159Own homeNatural death 74819822445193Own homeNatural death 83919822445223Residential homeNatural death 571219822445319Own homeNatural death 90119832445339Own homeUnlawful killing 87119832445342Residential homeNatural death 82319832445409Residential homeNatural death 84519832445468Residential homeNatural death 85519832445470Residential homeNatural death 72519832445479Own homeSuspicion of Unlawful killing 77619832445514Own homeUnlawful killing 83719832445528Residential homeNatural death 80719832445529Own homeNatural death 89919832445607Residential homeNatural death 931019832445620Residential homeNatural death 781119832445667Own homeNatural death 51119842445707Own homeUnlawful killing 88119842445713Residential homeInsufficient evidence for decision 69119842445727Own homeInsufficient evidence for decision 83119842445730Own homeNatural death 78219842445739Own homeUnlawful killing 83319842445786Own homeSuspicion of Unlawful killing 82319842445786Residential homeInsufficient evidence for decision 97319842445786Residential homeNatural death 83319842445790Daughter's homeSuspicion of Unlawful killing 83419842445806Own homeUnlawful killing 70419842445806Own homeInsufficient evidence for decision 70419842445815Own homeUnlawful killing 73519842445827Own homeInsufficient evidence for decision 88519842445827Residential homeNatural death 84519842445834Residential homeNatural death 63619842445855Own homeNatural death 72719842445904Own homeNatural death 81819842445915Residential homeNatural death 77819842445920Own homeNatural death 75919842445952Own homeNatural death 76919842445965Own homeUnlawful killing 80919842445970Residential homeNatural death 881019842445991Own homeSuspicion of Unlawful killing 781119842446018Own homeInsufficient evidence for decision 891119842446020Residential homeNatural death 701119842446028Own homeSuspicion of Unlawful killing 871119842446032Own homeUnlawful killing 801219842446052Own homeUnlawful killing 761219842446053Own homeUnlawful killing 721219842446059Own homeUnlawful killing 77119852446067Own homeSuspicion of Unlawful killing 88119852446067Own homeSuspicion of Unlawful killing 41119852446068Own homeUnlawful killing 66119852446074Own homeNatural death 60119852446091Friend's homeNatural death 74219852446098Own homeUnlawful killing 83219852446098Residential homeNatural death 92219852446099Own homeNatural death 84219852446101Own homeUnlawful killing 91219852446112Own homeInsufficient evidence for decision 69219852446112Own homeUnlawful killing 73219852446119Own homeUnlawful killing 81319852446142Residential homeNatural death 74519852446210Own homeSuspicion of Unlawful killing 70619852446243Own homeUnlawful killing 84619852446243Own homeUnlawful killing 84719852446257Own homeInsufficient evidence for decision 85819852446301Own homeUnlawful killing 581019852446356Own homeNatural death 761019852446368Own homeNatural death 771219852446417Own homeUnlawful killing 791219852446420Own homeUnlawful killing 821219852446428Residential homeNatural death 791219852446431Own homeUnlawful killing 80119862446435Own homeInsufficient evidence for decision 81119862446438Own homeUnlawful killing 86119862446459Own homeNatural death 78419862446522Residential homeNatural death 74419862446544Residential homeUnlawful killing 69519862446558Own homeNatural death 63519862446568Own homeSuspicion of Unlawful killing 57519862446578HospitalNatural death 81619862446588Own homeUnlawful killing 63919862446689Own homeUnlawful killing 731019862446711Own homeUnlawful killing 591119862446752Own homeUnlawful killing 811119862446752Own homeSuspicion of Unlawful killing 751219862446781Own homeUnlawful killing 821219862446788Own homeUnlawful killing 66319872446862Own homeInsufficient evidence for decision 77319872446867Residential homeSuspicion of Unlawful killing 78319872446882Residential homeNatural death 76319872446885Own homeUnlawful killing 85419872446887Own homeUnlawful killing 81419872446892Own homeNatural death 86419872446894Residential homeNatural death 83419872446902Own homeUnlawful killing 82419872446903Residential homeNatural death 61419872446903Own homeNatural death 78519872446924Own homeUnlawful killing 76719872447003Daughter's homeInsufficient evidence for decision 71919872447053Own homeUnlawful killing 81919872447060Residential homeNatural death 801219872447151Own homeUnlawful killing 691219872447159Own homeUnlawful killing 741219872447160Own homeUnlawful killing 90119882447166Own homeUnlawful killing 83119882447176Own homeUnlawful killing 88219882447197Residential homeInsufficient evidence for decision 90219882447201Own homeUnlawful killing 93219882447207Own homeUnlawful killing 83219882447207Own homeUnlawful killing 84219882447208Own homeUnlawful killing 93219882447209Residential homeNatural death 80919882447423Own homeUnlawful killing 1001019882447440Residential homeNatural death 691019882447455Own homeUnlawful killing 691019882447460Own homeNatural death 851119882447468Residential homeNatural death 851119882447472Own homeUnlawful killing 911219882447497Residential homeNatural death 871219882447513Own homeUnlawful killing 801219882447515Own homeUnlawful killing 80119892447558Own homeUnlawful killing 81319892447594Shipman's surgeryUnlawful killing 90319892447607Residential homeNatural death 78519892447659Own homeUnlawful killing 86519892447665Residential homeNatural death 69619892447683Own homeUnlawful killing 75719892447714Own homeUnlawful killing 80819892447753Own homeUnlawful killing 82919892447792Own homeUnlawful killing 82919892447796Own homeUnlawful killing 821019892447815Own homeUnlawful killing 811019892447816Own homeUnlawful killing 671019892447818Own homeUnlawful killing 851119892447837Own homeUnlawful killing 731119892447846Own homeNatural death 83519902448040Own homeNatural death 69719902448083Own homeNatural death 56919902448153Own homeUnlawful killing 84919902448156Own homeNatural death 681019902448196Residential homeNatural death 751119902448200Residential homeNatural death 691219902448256Own homeUnlawful killing 48219912448309Own homeNatural death 88319912448318Residential homeNatural death 73319912448337Own homeInsufficient evidence for decision 81519912448380Own homeNatural death 58519912448382Own homeNatural death 79819912448474Own homeNatural death 94819912448495Own homeNatural death 331019912448533Own homeNatural death 771019912448541Residential homeNatural death 821019912448551Residential homeNatural death 821019912448557Own homeNatural death 841119912448578Nursing homeNatural death 89119922448632Residential homeSuspicion of Unlawful killing 85419922448741Own homeNatural death 87719922448806Residential homeNatural death 79719922448811Residential homeNatural death 721019922448903Own homeUnlawful killing 791119922448934Own homeNatural death 671219922448971Own homeNatural death 801219922448977Residential homeNatural death 84219932449031Residential homeNatural death 83219932449039Residential homeSuspicion of Unlawful killing 92219932449043Own homeUnlawful killing 86219932449043Own homeUnlawful killing 75319932449063Residential homeNatural death 82319932449069Own homeUnlawful killing 86419932449086Own homeUnlawful killing 94419932449094Residential homeNatural death 74419932449095Own homeUnlawful killing 84419932449104Own homeUnlawful killing 74419932449105Own homeUnlawful killing 90419932449105Residential homeNatural death 77519932449110Own homeUnlawful killing 68519932449112Own homeUnlawful killing 84519932449113Own homeNatural death 84519932449120Own homeUnlawful killing 60519932449121Own homeUnlawful killing 74719932449191Own homeUnlawful killing 77719932449198Own homeNatural death 77819932449216Own homeUnlawful killing 69919932449254Own homeNatural death 651019932449290Nursing homeNatural death 901119932449293Residential homeNatural death 781219932449338Own homeUnlawful killing 541219932449334Own homeUnlawful killing 731219932449334Own homeSuspicion of Unlawful killing 781219932449345Residential homeNatural death 901219932449353Own homeUnlawful killing 82119942449357Shipman's surgeryUnlawful killing 53119942449366Own homeUnlawful killing 73219942449393Own homeUnlawful killing 84519942449490Own homeUnlawful killing 57519942449498Own homeUnlawful killing 87619942449519Own homeUnlawful killing 70619942449521Own homeUnlawful killing 78719942449561Own homeUnlawful killing 72919942449604Nursing homeNatural death 581019942449633HospitalNatural death 641119942449661Own homeSuspicion of Unlawful killing 911119942449667Nursing homeSuspicion of Unlawful killing 871119942449682Own homeUnlawful killing 751119942449687Own homeUnlawful killing 811219942449691Nursing homeNatural death 901219942449707Residential homeNatural death 811219942449716Own homeUnlawful killing 74119952449724Daughter's homeNatural death 88119952449727Own homeUnlawful killing 80119952449735Nursing homeNatural death 80119952449741Own homeNatural death 70319952449778Own homeUnlawful killing 88319952449780Own homeUnlawful killing 81319952449783Own homeConviction 71319952449784Own homeUnlawful killing 88319952449784Own homeUnlawful killing 53319952449790Own homeUnlawful killing 84319952449794Own homeInsufficient evidence for decision 82319952449798Own homeUnlawful killing 86319952449803Own homeUnlawful killing 70319952449808Own homeUnlawful killing 71419952449818Own homeUnlawful killing 85419952449821Own homeUnlawful killing 84419952449822Own homeUnlawful killing 47419952449829HospitalUnlawful killing 82519952449841Residential homeNatural death 75519952449842Own homeUnlawful killing 90519952449860Own homeSuspicion of Unlawful killing 85619952449871Nursing homeUnlawful killing 71619952449880Own homeNatural death 68619952449882Shipman's surgeryUnlawful killing 63619952449886Own homeUnlawful killing 82619952449898Own homeUnlawful killing 75719952449903HospitalNatural death 88719952449911Own homeUnlawful killing 65719952449930Own homeUnlawful killing 64819952449953HospitalNatural death 84819952449955Nursing homeNatural death 82819952449959Own homeUnlawful killing 72919952449975Own homeUnlawful killing 87919952449987Shipman's surgeryUnlawful killing 871019952450015Own homeUnlawful killing 871119952450024Residential homeNatural death 741119952450030Own homeUnlawful killing 881119952450044Own homeUnlawful killing 431119952450047Own homeUnlawful killing 671219952450066Own homeUnlawful killing 751219952450066Own homeUnlawful killing 721219952450069Own homeNatural death 81119962450085Own homeUnlawful killing 79119962450094Own homeUnlawful killing 42119962450102HospitalNatural death 76119962450109Own homeNatural death 84219962450122Residential homeNatural death 91219962450133Residential homeNatural death 80219962450135Own homeUnlawful killing 88219962450141Own homeUnlawful killing 71319962450155Own homeUnlawful killing 80419962450186Own homeNatural death 79419962450192Own homeUnlawful killing 104419962450192Residential homeNatural death 85419962450196Residential homeNatural death 77419962450198Own homeUnlawful killing 85519962450211Own homeUnlawful killing 72519962450217Shipman's surgeryUnlawful killing 82519962450222Own homeSuspicion of Unlawful killing 54519962450233Own homeUnlawful killing 77519962450234Own homeUnlawful killing 63619962450241Own homeUnlawful killing 80619962450243Own homeNatural death 82619962450245Own homeUnlawful killing 82619962450252Own homeUnlawful killing 86619962450260Own homeUnlawful killing 81619962450260Own homeUnlawful killing 77719962450267Own homeUnlawful killing 67719962450276Own homeConviction 81719962450281Own homeUnlawful killing 84719962450284Own homeUnlawful killing 57719962450287Own homeNatural death 85719962450289Own homeUnlawful killing 84719962450294Own homeUnlawful killing 76819962450326Own homeUnlawful killing 85919962450339Own homeUnlawful killing 75919962450347Own homeUnlawful killing 761019962450380Own homeUnlawful killing 601119962450400HospitalNatural death 951119962450406Residential homeNatural death 761119962450408Own homeUnlawful killing 891119962450411Own homeUnlawful killing 771119962450417HospitalNatural death 781219962450422Own homeUnlawful killing 621219962450434Nursing homeNatural death 731219962450435Own homeUnlawful killing 75119972450451Residential homeUnlawful killing 47119972450452Own homeUnlawful killing 69119972450457Own homeUnlawful killing 81119972450458Nursing homeNatural death 95119972450460Residential homeNatural death 76119972450469Own homeUnlawful killing 89119972450476Own homeUnlawful killing 90219972450483Own homeUnlawful killing 70219972450484Own homeUnlawful killing 74219972450503Own homeUnlawful killing 77219972450508Own homeConviction 69319972450528Nursing homeNatural death 76319972450530Own homeUnlawful killing 84319972450535Own homeUnlawful killing 97319972450537Residential homeNatural death 73419972450550Nursing homeNatural death 80419972450560Own homeUnlawful killing 76419972450560Own homeSuspicion of Unlawful killing 76419972450564Own homeUnlawful killing 58419972450564Own homeConviction 68519972450571Own homeUnlawful killing 74519972450581Own homeUnlawful killing 79519972450590Own homeUnlawful killing 87519972450594Residential homeNatural death 63519972450598Shipman's surgeryConviction 69619972450624Own homeUnlawful killing 51719972450637Own homeUnlawful killing 76719972450644Own homeConviction 69719972450655Own homeUnlawful killing 86719972450658Own homeUnlawful killing 72819972450671Own homeUnlawful killing 82819972450674Nursing homeNatural death 77819972450688Country park footpathNatural death 81919972450693Own homeUnlawful killing 79919972450714Own homeUnlawful killing 79919972450718Own homeUnlawful killing 77919972450721Own homeUnlawful killing 791119972450763Own homeUnlawful killing 771119972450764Own homeSuspicion of Unlawful killing 781119972450767Own homeUnlawful killing 831119972450774Own homeUnlawful killing 671119972450777Own homeConviction 701219972450791Own homeUnlawful killing 811219972450792Own homeConviction 491219972450793Own homeConviction 731219972450801Own homeUnlawful killing 831219972450807Own homeUnlawful killing 79119982450836Own homeUnlawful killing 64119982450840Own homeConviction 73219982450847Own homeUnlawful killing 73219982450847Nursing homeNatural death 68219982450854Own homeConviction 90219982450856Nursing homeNatural death 83219982450858Own homeUnlawful killing 74219982450860Own homeUnlawful killing 57219982450863Own homeConviction 82219982450870Own homeNatural death 75219982450872Own homeUnlawful killing 75219982450873HospitalNatural death 77319982450877Own homeUnlawful killing 65319982450879Own homeUnlawful killing 74319982450880Own homeUnlawful killing 84319982450886Own homeUnlawful killing 83319982450890Own homeUnlawful killing 77319982450893Own homeUnlawful killing 88319982450897Own homeUnlawful killing 95419982450932Residential homeNatural death 73519982450945Own homeConviction 73619982450977Own homeConviction 81619982450989Own homeConviction ggobi-2.1.12/data/places.xml0000644000175000017500000015770214651527764011304 The "places data" were distribed to interested ASA members a few years ago so that they could apply contemporary data analytic methods to describe these data and then present results in a poster session at the ASA annual conference. Latitude and longitude have been added by Paul Tukey. ____________________________________________________________________ The first dataset is taken from the Places Rated Almanac, by Richard Boyer and David Savageau, copyrighted and published by Rand McNally. This book order (SBN) number is 0-528-88008-X, and it retails for $14.95 . The data are reproduced on disk by kind permission of the publisher, and with the request that the copyright notice of Rand McNally, and the names of the authors appear in any paper or presentation using these data. The nine rating criteria used by Places Rated Almanac are: Climate and Terrain Housing Health Care and Environment Crime Transportation Education The Arts Recreation Economics For all but two of the above criteria, the higher the score, the better. For Housing and Crime, the lower the score the better. The scores are computed using the following component statistics for each criterion (see the Places Rated Almanac for details): Climate and Terrain: very hot and very cold months, seasonal temperature variation, heating- and cooling-degree days, freezing days, zero-degree days, ninety-degree days. Housing: utility bills, property taxes, mortgage payments. Health Care and Environment: per capita physicians, teaching hospitals, medical schools, cardiac rehabilitation centers, comprehensive cancer treatment centers, hospices, insurance/hospitalization costs index, flouridation of drinking water, air pollution. Crime: violent crime rate, property crime rate. Transportation: daily commute, public transportation, Interstate highways, air service, passenger rail service. Education: pupil/teacher ratio in the public K-12 system, effort index in K-12, accademic options in higher education. The Arts: museums, fine arts and public radio stations, public television stations, universities offering a degree or degrees in the arts, symphony orchestras, theatres, opera companies, dance companies, public libraries. Recreation: good restaurants, public golf courses, certified lanes for tenpin bowling, movie theatres, zoos, aquariums, family theme parks, sanctioned automobile race tracks, pari-mutuel betting attractions, major- and minor- league professional sports teams, NCAA Division I football and basketball teams, miles of ocean or Great Lakes coastline, inland water, national forests, national parks, or national wildlife refuges, Consolidated Metropolitan Statistical Area access. Economics: average household income adjusted for taxes and living costs, income growth, job growth. 521.000 6200.000 237.000 923.000 4031.000 2757.000 996.000 1405.000 7633.000 1.000 -99.689 32.559 110932.000 44.000 575.000 8138.000 1656.000 886.000 4883.000 2438.000 5564.000 2632.000 4350.000 2.000 -81.518 41.085 660328.000 36.000 468.000 7339.000 618.000 970.000 2531.000 2560.000 237.000 859.000 5250.000 3.000 -84.158 31.575 112402.000 11.000 476.000 7908.000 1431.000 610.000 6883.000 3399.000 4655.000 1617.000 5864.000 4.000 -73.798 42.733 835880.000 35.000 659.000 8393.000 1853.000 1483.000 6558.000 3026.000 4496.000 2612.000 5727.000 5.000 -106.650 35.083 419700.000 33.000 520.000 5819.000 640.000 727.000 2444.000 2972.000 334.000 1018.000 5254.000 6.000 -92.453 31.302 135282.000 19.000 559.000 8288.000 621.000 514.000 2881.000 3144.000 2333.000 1117.000 5097.000 7.000 -75.440 40.616 635481.000 39.000 537.000 6487.000 965.000 706.000 4975.000 2945.000 1487.000 1280.000 5795.000 8.000 -90.161 38.794 268229.000 15.000 561.000 6191.000 432.000 399.000 4246.000 2778.000 256.000 1210.000 4230.000 9.000 -78.395 40.515 136621.000 39.000 609.000 6546.000 669.000 1073.000 4902.000 2852.000 1235.000 1109.000 6241.000 10.000 -101.849 35.383 173699.000 44.000 885.000 16047.000 2025.000 983.000 3954.000 2843.000 5632.000 3156.000 6220.000 11.000 -117.889 33.799 1932709.000 5.000 195.000 12175.000 601.000 1223.000 5091.000 2414.000 2346.000 3000.000 7668.000 12.000 -127.202 48.880 174431.000 1.000 530.000 5704.000 580.000 878.000 2865.000 2469.000 430.000 838.000 3370.000 13.000 -85.685 40.167 139336.000 16.000 591.000 5725.000 820.000 975.000 2707.000 2772.000 169.000 613.000 4262.000 14.000 -82.655 34.510 133235.000 41.000 546.000 11014.000 2508.000 1067.000 3433.000 3346.000 7559.000 2288.000 4579.000 15.000 -83.750 42.283 264748.000 23.000 560.000 5530.000 598.000 1125.000 3051.000 2189.000 268.000 1165.000 4730.000 16.000 -85.827 33.655 119761.000 2.000 396.000 7877.000 833.000 525.000 3298.000 2844.000 1166.000 2315.000 5275.000 17.000 -88.467 44.158 291369.000 49.000 694.000 6722.000 1204.000 566.000 5086.000 2990.000 1391.000 1542.000 5196.000 18.000 -82.557 35.593 160934.000 28.000 601.000 6691.000 605.000 933.000 1866.000 2646.000 3546.000 1001.000 5193.000 19.000 -83.383 33.957 130015.000 11.000 696.000 8316.000 3195.000 1308.000 8409.000 3057.000 7559.000 1362.000 6315.000 20.000 -84.319 33.763 2138231.000 11.000 615.000 11074.000 637.000 1878.000 3556.000 2929.000 621.000 2711.000 8107.000 21.000 -74.438 39.367 276385.000 32.000 534.000 6292.000 1798.000 872.000 2523.000 2915.000 1047.000 913.000 5431.000 22.000 -81.967 33.470 345918.000 11.000 474.000 10384.000 1203.000 821.000 3943.000 2208.000 3857.000 1800.000 5097.000 23.000 -88.281 41.894 315607.000 15.000 435.000 8831.000 782.000 1049.000 3670.000 3063.000 5355.000 1063.000 7439.000 24.000 -97.742 30.282 536688.000 44.000 560.000 8068.000 420.000 1561.000 3725.000 2564.000 1222.000 1568.000 6056.000 25.000 -119.022 35.375 403089.000 5.000 567.000 9148.000 3562.000 1730.000 7405.000 3471.000 9788.000 2925.000 5503.000 26.000 -76.617 39.288 2199531.000 21.000 451.000 7277.000 780.000 651.000 5613.000 2934.000 1995.000 2148.000 5172.000 27.000 -68.772 44.802 83919.000 22.000 427.000 8083.000 342.000 1565.000 3329.000 2635.000 4237.000 1413.000 6308.000 28.000 -91.185 30.450 494151.000 19.000 527.000 6342.000 900.000 1031.000 4652.000 2483.000 354.000 1648.000 4008.000 29.000 -85.182 42.322 141557.000 23.000 423.000 6288.000 616.000 1313.000 2782.000 2745.000 1795.000 1813.000 6019.000 30.000 -94.012 29.991 375497.000 44.000 586.000 7866.000 861.000 310.000 2960.000 2535.000 1284.000 1480.000 3119.000 31.000 -80.315 40.693 204441.000 39.000 772.000 8329.000 240.000 825.000 3776.000 2778.000 1302.000 3200.000 4247.000 32.000 -122.483 48.763 106701.000 48.000 566.000 6761.000 570.000 1190.000 2989.000 2545.000 79.000 1477.000 3635.000 33.000 -86.447 42.105 171276.000 23.000 559.000 14607.000 2661.000 857.000 3511.000 3653.000 9304.000 1918.000 6016.000 34.000 -74.059 40.891 1292970.000 32.000 452.000 8315.000 479.000 810.000 6285.000 3008.000 778.000 2046.000 5913.000 35.000 -108.505 45.780 108035.000 27.000 584.000 6458.000 441.000 810.000 2516.000 2592.000 679.000 2106.000 5801.000 36.000 -88.969 30.397 182202.000 26.000 550.000 8257.000 1007.000 415.000 4529.000 3052.000 1599.000 1722.000 5614.000 37.000 -75.913 42.098 263460.000 35.000 612.000 6811.000 1692.000 1123.000 5177.000 2851.000 3958.000 1234.000 4843.000 38.000 -86.807 33.512 883946.000 2.000 149.000 8365.000 804.000 413.000 4303.000 2686.000 1211.000 1630.000 6019.000 39.000 -100.778 46.807 79988.000 29.000 558.000 7056.000 731.000 657.000 1746.000 2873.000 2152.000 1990.000 4829.000 40.000 -86.528 39.165 98785.000 16.000 487.000 8654.000 815.000 673.000 5889.000 2854.000 1470.000 1605.000 5863.000 41.000 -88.990 40.495 119149.000 15.000 592.000 8221.000 453.000 880.000 6575.000 2391.000 2385.000 1672.000 4633.000 42.000 -116.218 43.613 173036.000 14.000 623.000 11609.000 5301.000 1215.000 6801.000 3479.000 21042.000 3066.000 6363.000 43.000 -71.058 42.362 2805911.000 20.000 459.000 11914.000 962.000 1088.000 7108.000 2587.000 3663.000 4012.000 7127.000 44.000 -105.193 40.091 189625.000 6.000 440.000 8242.000 333.000 1093.000 3805.000 2712.000 154.000 1349.000 7437.000 45.000 -82.572 27.495 148442.000 10.000 423.000 8394.000 438.000 768.000 2391.000 2718.000 1506.000 1512.000 6020.000 46.000 -95.570 29.043 169587.000 44.000 808.000 9060.000 310.000 651.000 1670.000 2544.000 382.000 1973.000 5671.000 47.000 -122.630 47.567 147152.000 48.000 648.000 13429.000 2550.000 943.000 3197.000 3029.000 8368.000 1913.000 7197.000 48.000 -73.127 41.208 438557.000 7.000 516.000 10041.000 975.000 545.000 4495.000 2628.000 514.000 777.000 6527.000 49.000 -72.950 41.673 73762.000 7.000 575.000 8263.000 916.000 1336.000 3810.000 2729.000 2001.000 1217.000 6900.000 50.000 -71.017 42.085 182891.000 20.000 440.000 5376.000 91.000 974.000 3119.000 2413.000 162.000 3000.000 4968.000 51.000 -97.482 25.919 209727.000 44.000 383.000 8228.000 640.000 1016.000 2530.000 2973.000 2002.000 1413.000 8040.000 52.000 -96.357 30.644 93588.000 44.000 571.000 8064.000 2465.000 971.000 5384.000 3121.000 8567.000 2441.000 5047.000 53.000 -78.875 42.887 1015472.000 35.000 637.000 6179.000 994.000 707.000 1910.000 2519.000 131.000 701.000 5680.000 54.000 -79.433 36.097 99319.000 28.000 383.000 9673.000 1809.000 494.000 7146.000 3323.000 1741.000 3357.000 6726.000 55.000 -73.207 44.475 115308.000 47.000 575.000 7332.000 443.000 650.000 4279.000 2754.000 989.000 1157.000 4847.000 56.000 -81.378 40.798 404421.000 36.000 401.000 9839.000 345.000 989.000 4410.000 2453.000 303.000 1435.000 6303.000 57.000 -106.313 42.847 71856.000 51.000 434.000 7774.000 837.000 714.000 5270.000 2619.000 904.000 1501.000 5009.000 58.000 -91.673 41.975 169775.000 13.000 525.000 8627.000 672.000 1022.000 7447.000 3147.000 2203.000 1700.000 5485.000 59.000 -88.198 40.182 168392.000 15.000 569.000 7402.000 1463.000 1495.000 4207.000 3164.000 2993.000 2561.000 5153.000 60.000 -79.930 32.763 430462.000 41.000 627.000 7789.000 708.000 721.000 5470.000 2894.000 2605.000 844.000 5257.000 61.000 -81.645 38.368 269595.000 50.000 644.000 7169.000 999.000 1273.000 6099.000 3031.000 4313.000 1236.000 5671.000 62.000 -81.017 35.137 971391.000 28.000 618.000 9531.000 1348.000 756.000 6041.000 3489.000 1422.000 1704.000 6055.000 63.000 -78.507 38.038 113568.000 46.000 576.000 6189.000 564.000 946.000 3401.000 2415.000 2483.000 1238.000 4487.000 64.000 -85.310 35.043 426540.000 43.000 514.000 10913.000 5766.000 1034.000 7742.000 3486.000 24846.000 2856.000 5205.000 65.000 -87.625 41.883 6060387.000 15.000 603.000 8587.000 243.000 947.000 4067.000 3126.000 1647.000 1543.000 5307.000 66.000 -121.838 39.732 143851.000 5.000 584.000 8143.000 2138.000 978.000 5748.000 2918.000 9688.000 2451.000 5270.000 67.000 -84.513 39.100 1401491.000 36.000 544.000 6007.000 446.000 736.000 2226.000 2654.000 111.000 2219.000 4880.000 68.000 -87.418 36.694 150220.000 43.000 579.000 9168.000 3167.000 1138.000 7333.000 2972.000 12679.000 3300.000 4879.000 69.000 -81.700 41.497 1898825.000 36.000 526.000 8509.000 721.000 1086.000 3389.000 2754.000 1749.000 2375.000 7699.000 70.000 -104.820 38.833 309424.000 6.000 541.000 7702.000 1951.000 1065.000 3893.000 2377.000 2882.000 1331.000 5147.000 71.000 -92.330 38.957 100376.000 25.000 526.000 7519.000 1421.000 1524.000 5859.000 2908.000 2489.000 1484.000 5279.000 72.000 -81.045 33.993 410088.000 41.000 517.000 5817.000 833.000 820.000 2995.000 2665.000 1861.000 1214.000 4812.000 73.000 -84.982 32.462 239196.000 11.000 558.000 8093.000 1837.000 1092.000 4364.000 2928.000 6648.000 2020.000 5165.000 74.000 -83.002 39.962 1243833.000 36.000 362.000 6929.000 458.000 1335.000 3626.000 2840.000 1992.000 2037.000 6690.000 75.000 -97.621 27.776 326228.000 44.000 591.000 6054.000 760.000 337.000 3709.000 3363.000 373.000 1036.000 4741.000 76.000 -78.763 39.650 107782.000 21.000 544.000 9318.000 2825.000 1529.000 6213.000 3269.000 10438.000 2310.000 7710.000 77.000 -96.812 32.777 1957378.000 44.000 569.000 14420.000 2350.000 548.000 2715.000 3029.000 7415.000 1572.000 7060.000 78.000 -73.460 41.393 170369.000 7.000 545.000 5709.000 593.000 379.000 3161.000 2943.000 85.000 501.000 4491.000 79.000 -79.388 36.592 111789.000 46.000 440.000 8083.000 1113.000 834.000 3907.000 2901.000 1017.000 1920.000 4997.000 80.000 -90.549 41.506 383958.000 15.000 544.000 7635.000 2253.000 1151.000 4775.000 2772.000 6935.000 1122.000 4532.000 81.000 -84.003 39.839 942083.000 36.000 561.000 7203.000 723.000 1347.000 4117.000 2612.000 809.000 3967.000 6592.000 82.000 -81.023 29.215 258762.000 10.000 480.000 7395.000 732.000 897.000 3867.000 2683.000 298.000 1222.000 4274.000 83.000 -88.953 39.843 131375.000 15.000 521.000 10789.000 2533.000 1365.000 8145.000 3145.000 8477.000 2324.000 7164.000 84.000 -104.988 39.740 1428836.000 6.000 444.000 8028.000 1256.000 1044.000 5521.000 2613.000 1857.000 1802.000 5346.000 85.000 -93.618 41.587 367561.000 13.000 536.000 8525.000 4142.000 1587.000 4808.000 3064.000 10389.000 2483.000 3904.000 86.000 -83.128 42.442 4488072.000 23.000 336.000 5708.000 593.000 930.000 2232.000 2230.000 117.000 714.000 5453.000 87.000 -85.393 31.223 122453.000 2.000 419.000 7993.000 640.000 571.000 3668.000 2701.000 340.000 1587.000 3949.000 88.000 -90.675 42.503 93745.000 13.000 193.000 6040.000 1159.000 488.000 5205.000 2619.000 2377.000 3107.000 3922.000 89.000 -92.113 46.783 266650.000 24.000 537.000 6501.000 444.000 1096.000 6539.000 2630.000 904.000 1610.000 6113.000 90.000 -89.983 38.512 300148.000 15.000 257.000 7078.000 798.000 433.000 3197.000 2960.000 1807.000 1397.000 5348.000 91.000 -91.471 44.866 130932.000 49.000 592.000 7343.000 528.000 1323.000 3705.000 2479.000 3800.000 1101.000 5080.000 92.000 -106.480 31.755 479899.000 44.000 521.000 6573.000 596.000 524.000 4168.000 2537.000 353.000 1023.000 4214.000 93.000 -85.901 41.639 137330.000 16.000 467.000 7078.000 562.000 582.000 3324.000 3000.000 1048.000 1600.000 4813.000 94.000 -76.807 42.093 97656.000 35.000 461.000 6829.000 626.000 845.000 2312.000 2764.000 215.000 1200.000 8268.000 95.000 -97.875 36.395 62820.000 37.000 605.000 7715.000 529.000 635.000 5754.000 2641.000 2032.000 1340.000 4299.000 96.000 -80.073 42.113 279780.000 39.000 741.000 9370.000 539.000 874.000 5293.000 3118.000 2631.000 3400.000 3045.000 97.000 -122.981 43.952 275226.000 38.000 550.000 6743.000 783.000 864.000 3496.000 2797.000 1876.000 1622.000 5206.000 98.000 -87.575 37.970 276252.000 16.000 643.000 9017.000 900.000 861.000 4602.000 2439.000 749.000 2005.000 4884.000 99.000 -71.101 41.794 157222.000 20.000 148.000 8168.000 920.000 503.000 6325.000 2506.000 2111.000 1414.000 5594.000 100.000 -96.777 46.876 137574.000 29.000 561.000 6274.000 872.000 1150.000 4402.000 3051.000 844.000 709.000 5255.000 101.000 -78.877 35.055 247160.000 28.000 549.000 6686.000 594.000 545.000 3581.000 2334.000 1915.000 1695.000 4631.000 102.000 -94.150 36.146 100494.000 3.000 507.000 8252.000 655.000 655.000 2244.000 2799.000 270.000 790.000 5098.000 103.000 -71.777 42.555 94018.000 20.000 540.000 7204.000 724.000 1671.000 4912.000 2511.000 2163.000 1355.000 3724.000 104.000 -83.683 43.022 450449.000 23.000 546.000 5962.000 607.000 516.000 1454.000 2427.000 1021.000 994.000 4492.000 105.000 -87.675 34.800 135065.000 2.000 552.000 6508.000 818.000 1334.000 4963.000 3109.000 628.000 800.000 4842.000 106.000 -79.768 34.197 110163.000 41.000 490.000 9951.000 731.000 744.000 2637.000 2413.000 1609.000 4200.000 6631.000 107.000 -105.080 40.490 149184.000 6.000 572.000 10810.000 1252.000 1536.000 4186.000 2734.000 2027.000 2455.000 7136.000 108.000 -80.137 26.121 1018200.000 10.000 342.000 9298.000 546.000 787.000 4583.000 2729.000 380.000 4005.000 7166.000 109.000 -81.873 26.642 205266.000 10.000 602.000 8842.000 527.000 1422.000 2143.000 3154.000 368.000 2058.000 7973.000 110.000 -80.327 27.447 151196.000 10.000 482.000 5784.000 466.000 663.000 3092.000 2927.000 145.000 1736.000 4849.000 111.000 -94.418 35.385 162813.000 3.000 536.000 7554.000 484.000 544.000 2886.000 2809.000 87.000 2092.000 6342.000 112.000 -86.651 30.762 109920.000 10.000 509.000 6733.000 1060.000 710.000 5416.000 2772.000 2846.000 1711.000 4195.000 113.000 -85.142 41.072 354156.000 16.000 528.000 7956.000 1038.000 1348.000 4472.000 2627.000 6466.000 2366.000 6862.000 114.000 -97.113 32.737 973138.000 44.000 559.000 9291.000 369.000 1483.000 4388.000 2407.000 3596.000 2984.000 5746.000 115.000 -119.783 36.732 514621.000 5.000 526.000 5382.000 622.000 749.000 2174.000 2299.000 153.000 300.000 4220.000 116.000 -86.018 34.018 103057.000 2.000 402.000 7388.000 1731.000 1658.000 3527.000 3094.000 3335.000 1237.000 5739.000 117.000 -82.330 29.660 171371.000 10.000 727.000 7767.000 1437.000 1213.000 3423.000 2809.000 1756.000 3000.000 6026.000 118.000 -94.844 29.347 195940.000 44.000 483.000 7641.000 1364.000 996.000 5855.000 2526.000 4115.000 1940.000 3826.000 119.000 -87.419 41.615 642781.000 16.000 476.000 7120.000 43.000 568.000 2241.000 2674.000 603.000 1883.000 5166.000 120.000 -73.645 43.310 109649.000 35.000 105.000 7898.000 1109.000 401.000 5587.000 2721.000 1921.000 1304.000 5646.000 121.000 -97.037 47.920 66100.000 29.000 513.000 7780.000 1274.000 952.000 3454.000 2705.000 3255.000 1909.000 4848.000 122.000 -85.670 42.963 601680.000 23.000 410.000 7143.000 667.000 792.000 3747.000 2737.000 401.000 2176.000 4697.000 123.000 -111.285 47.502 80696.000 27.000 490.000 8218.000 706.000 994.000 1641.000 2854.000 1254.000 739.000 5443.000 124.000 -104.693 40.418 123438.000 6.000 367.000 8401.000 916.000 583.000 3793.000 2622.000 2547.000 1925.000 5650.000 125.000 -88.007 44.513 175280.000 49.000 626.000 7064.000 1694.000 967.000 4453.000 3090.000 4188.000 1651.000 5204.000 126.000 -80.013 36.042 851851.000 28.000 655.000 6336.000 1260.000 1185.000 3950.000 3236.000 2569.000 1410.000 5012.000 127.000 -82.173 34.895 569066.000 41.000 568.000 7763.000 818.000 627.000 3431.000 2990.000 825.000 1491.000 4477.000 128.000 -77.720 39.645 113086.000 21.000 542.000 8227.000 1135.000 892.000 3338.000 2747.000 2316.000 1604.000 4618.000 129.000 -84.481 39.457 258787.000 36.000 556.000 7891.000 2087.000 629.000 6164.000 3224.000 3083.000 1532.000 5322.000 130.000 -76.834 40.268 555158.000 39.000 516.000 11652.000 2521.000 1279.000 7120.000 3628.000 3616.000 1790.000 6307.000 131.000 -72.675 41.767 715923.000 7.000 623.000 6760.000 1006.000 765.000 2703.000 2726.000 188.000 797.000 4728.000 132.000 -81.337 35.737 202711.000 28.000 717.000 17021.000 1298.000 891.000 5911.000 2502.000 7168.000 3703.000 5187.000 133.000 -126.057 31.736 762565.000 12.000 427.000 7094.000 583.000 400.000 1145.000 1995.000 725.000 2700.000 6662.000 134.000 -90.770 29.696 176876.000 19.000 424.000 9760.000 2467.000 1499.000 4626.000 3271.000 11073.000 1825.000 7464.000 135.000 -95.003 29.834 2735766.000 44.000 636.000 6632.000 875.000 665.000 4001.000 2525.000 2195.000 840.000 4383.000 136.000 -82.524 38.435 336410.000 50.000 600.000 6283.000 685.000 924.000 2661.000 2257.000 1921.000 1075.000 6412.000 137.000 -86.587 34.732 196966.000 2.000 557.000 7012.000 2243.000 1000.000 5804.000 2690.000 6348.000 1906.000 5082.000 138.000 -86.155 39.770 1166575.000 16.000 434.000 9429.000 2437.000 830.000 2770.000 2842.000 2255.000 1506.000 5165.000 139.000 -91.535 41.662 81717.000 13.000 518.000 6794.000 679.000 1021.000 4800.000 2654.000 323.000 1933.000 3822.000 140.000 -84.400 42.247 151495.000 23.000 412.000 7245.000 1792.000 1091.000 4917.000 3130.000 3209.000 1427.000 5186.000 141.000 -90.195 32.332 362038.000 26.000 457.000 6626.000 1181.000 1211.000 5611.000 3048.000 2162.000 2884.000 6139.000 142.000 -81.657 30.330 722252.000 10.000 564.000 6111.000 740.000 967.000 1780.000 2646.000 567.000 1177.000 6386.000 143.000 -77.430 34.748 112784.000 28.000 466.000 7447.000 700.000 858.000 3092.000 2532.000 1092.000 1615.000 4371.000 144.000 -89.026 42.595 139420.000 49.000 601.000 8810.000 1759.000 1434.000 4982.000 2574.000 7420.000 1001.000 4889.000 145.000 -74.067 40.728 556972.000 32.000 663.000 6119.000 1152.000 424.000 2532.000 2925.000 1925.000 2155.000 4903.000 146.000 -82.334 36.515 433638.000 43.000 547.000 6524.000 731.000 353.000 4343.000 2691.000 666.000 903.000 4181.000 147.000 -78.920 40.325 264506.000 39.000 479.000 9327.000 1058.000 837.000 4645.000 2868.000 3177.000 1636.000 4631.000 148.000 -88.080 41.527 355042.000 15.000 580.000 5159.000 500.000 628.000 2335.000 2871.000 80.000 801.000 5324.000 149.000 -94.467 37.083 127513.000 25.000 527.000 7919.000 1043.000 1120.000 5419.000 2896.000 2071.000 2163.000 4794.000 150.000 -85.583 42.290 212378.000 23.000 483.000 7230.000 609.000 976.000 3444.000 2855.000 75.000 1119.000 5579.000 151.000 -87.867 41.117 102926.000 15.000 549.000 8126.000 1711.000 1142.000 5006.000 3028.000 1167.000 1045.000 6166.000 152.000 -94.625 39.117 519031.000 17.000 549.000 7076.000 1939.000 1468.000 5869.000 2949.000 5553.000 2043.000 4865.000 153.000 -94.543 39.043 914427.000 25.000 496.000 8516.000 1067.000 911.000 4473.000 2918.000 3844.000 2224.000 5176.000 154.000 -87.823 42.585 123137.000 49.000 365.000 6463.000 398.000 733.000 2862.000 3167.000 920.000 931.000 6331.000 155.000 -97.534 31.110 214656.000 44.000 670.000 6692.000 960.000 622.000 4273.000 2761.000 3309.000 2514.000 5537.000 156.000 -83.918 35.968 565970.000 43.000 512.000 6616.000 596.000 413.000 1817.000 2904.000 285.000 1000.000 3429.000 157.000 -86.133 40.487 103715.000 16.000 352.000 8310.000 686.000 676.000 6096.000 3027.000 1466.000 1953.000 5648.000 158.000 -91.237 43.819 91056.000 49.000 494.000 7778.000 655.000 465.000 4956.000 2945.000 2235.000 1814.000 4333.000 159.000 -86.893 40.420 121702.000 16.000 429.000 8572.000 548.000 1030.000 5268.000 2305.000 1772.000 1734.000 9702.000 160.000 -92.020 30.225 190231.000 19.000 469.000 6921.000 314.000 1093.000 3549.000 2336.000 1456.000 1855.000 5872.000 161.000 -93.217 30.228 167223.000 19.000 514.000 13282.000 1237.000 822.000 3422.000 2607.000 3746.000 2435.000 5755.000 162.000 -88.618 39.636 440372.000 15.000 307.000 6680.000 323.000 1373.000 3412.000 2998.000 309.000 2513.000 5594.000 163.000 -81.842 28.032 321652.000 10.000 559.000 8631.000 1111.000 413.000 3908.000 3097.000 1015.000 1147.000 5120.000 164.000 -76.308 40.037 362346.000 39.000 480.000 7907.000 1371.000 894.000 5557.000 2891.000 4206.000 1609.000 4747.000 165.000 -84.429 42.670 419750.000 23.000 424.000 6152.000 465.000 1050.000 3322.000 2827.000 150.000 702.000 5264.000 166.000 -99.503 27.507 99258.000 44.000 552.000 6962.000 588.000 1457.000 2989.000 2736.000 2804.000 1609.000 5341.000 167.000 -106.778 32.312 96340.000 33.000 556.000 9906.000 412.000 1913.000 5900.000 2241.000 1586.000 3996.000 6035.000 168.000 -115.147 36.172 463087.000 34.000 513.000 7497.000 621.000 1018.000 2931.000 2700.000 3150.000 1752.000 4573.000 169.000 -95.238 38.963 67640.000 17.000 548.000 10414.000 1202.000 909.000 3575.000 2479.000 2111.000 1879.000 6527.000 170.000 -71.439 43.176 339090.000 20.000 479.000 5850.000 477.000 1156.000 2366.000 2375.000 1280.000 1757.000 6105.000 171.000 -98.412 34.612 112456.000 37.000 490.000 6876.000 759.000 764.000 2941.000 2694.000 736.000 1853.000 4444.000 172.000 -70.223 44.097 84690.000 22.000 635.000 8340.000 1860.000 1055.000 4080.000 2861.000 3596.000 1403.000 6245.000 173.000 -84.497 38.048 317629.000 18.000 522.000 6986.000 741.000 855.000 4084.000 2629.000 1352.000 1428.000 4313.000 174.000 -84.105 40.735 154795.000 36.000 398.000 8256.000 775.000 789.000 5618.000 2878.000 4523.000 1804.000 4908.000 175.000 -96.685 40.823 192884.000 30.000 497.000 7270.000 1861.000 1328.000 4186.000 2581.000 2180.000 1462.000 5273.000 176.000 -92.272 34.751 474484.000 3.000 500.000 6608.000 509.000 976.000 2680.000 2816.000 334.000 834.000 6898.000 177.000 -94.558 32.521 151752.000 44.000 579.000 8309.000 1105.000 609.000 3629.000 2582.000 2565.000 1602.000 3301.000 178.000 -82.144 41.415 274909.000 36.000 885.000 13868.000 5153.000 1960.000 4345.000 3195.000 23567.000 3948.000 5316.000 179.000 -118.217 33.917 7477503.000 5.000 616.000 6812.000 2111.000 937.000 5420.000 3028.000 4916.000 1942.000 5402.000 180.000 -85.762 38.247 956756.000 18.000 526.000 9640.000 1083.000 819.000 3820.000 2479.000 3057.000 1129.000 6651.000 181.000 -71.313 42.637 243142.000 20.000 604.000 6990.000 900.000 1608.000 4158.000 2545.000 3402.000 1702.000 5923.000 182.000 -101.843 33.583 211651.000 44.000 642.000 6934.000 732.000 643.000 4909.000 2803.000 1079.000 1439.000 4926.000 183.000 -79.143 37.415 141289.000 46.000 447.000 6235.000 593.000 783.000 3144.000 2651.000 1435.000 1204.000 5659.000 184.000 -83.635 32.842 263591.000 11.000 378.000 9897.000 2168.000 779.000 6084.000 3047.000 5123.000 1944.000 5448.000 185.000 -89.393 43.070 323545.000 49.000 404.000 9860.000 737.000 633.000 4595.000 2728.000 475.000 837.000 7101.000 186.000 -71.462 42.995 129305.000 31.000 558.000 6881.000 303.000 1072.000 2876.000 2871.000 554.000 1133.000 4386.000 187.000 -82.517 40.758 131205.000 36.000 238.000 5345.000 372.000 836.000 2117.000 2644.000 1231.000 1059.000 5739.000 188.000 -98.243 26.258 283229.000 44.000 611.000 9008.000 256.000 728.000 3512.000 2797.000 1856.000 1416.000 3692.000 189.000 -122.867 42.323 132456.000 38.000 582.000 8721.000 517.000 1039.000 2560.000 2814.000 437.000 3800.000 7089.000 190.000 -80.669 28.245 272959.000 10.000 514.000 7015.000 2043.000 1488.000 6247.000 2804.000 4486.000 1994.000 5160.000 191.000 -90.057 35.125 913472.000 43.000 634.000 10267.000 2314.000 2459.000 5202.000 2879.000 4837.000 4300.000 5840.000 192.000 -80.218 25.646 1625781.000 10.000 559.000 12135.000 2589.000 691.000 4198.000 3539.000 8058.000 1596.000 6324.000 193.000 -74.503 40.580 886383.000 32.000 593.000 11652.000 884.000 646.000 4636.000 3128.000 730.000 1682.000 6307.000 194.000 -72.655 41.562 81582.000 7.000 603.000 8672.000 97.000 1166.000 5310.000 2416.000 438.000 1502.000 9980.000 195.000 -102.078 31.995 82636.000 44.000 460.000 10176.000 3053.000 826.000 4945.000 3044.000 8766.000 2902.000 4982.000 196.000 -87.982 43.033 1397143.000 49.000 293.000 9559.000 3934.000 906.000 5606.000 3013.000 11714.000 2158.000 5843.000 197.000 -93.179 44.965 2137133.000 24.000 442.000 6704.000 1469.000 1511.000 3345.000 2779.000 1764.000 2164.000 4565.000 198.000 -88.043 30.688 443536.000 2.000 639.000 8630.000 347.000 1154.000 2000.000 2616.000 631.000 833.000 5107.000 199.000 -121.002 37.643 265900.000 5.000 615.000 11660.000 2482.000 819.000 2690.000 2787.000 7563.000 3544.000 6154.000 200.000 -74.075 40.352 849211.000 32.000 455.000 6190.000 331.000 957.000 3606.000 2453.000 1528.000 1541.000 5537.000 201.000 -92.117 32.500 139241.000 19.000 483.000 6754.000 832.000 815.000 3509.000 2388.000 1374.000 1112.000 4892.000 202.000 -86.308 32.382 272687.000 2.000 530.000 5800.000 949.000 783.000 4325.000 2965.000 2498.000 1428.000 3980.000 203.000 -85.387 40.192 128587.000 16.000 580.000 6391.000 699.000 1537.000 3353.000 2630.000 529.000 2666.000 3708.000 204.000 -86.260 43.228 157589.000 23.000 538.000 10757.000 853.000 452.000 3320.000 2728.000 2122.000 1523.000 6962.000 205.000 -71.462 42.757 142527.000 31.000 600.000 7800.000 1850.000 984.000 5030.000 2763.000 4342.000 1849.000 5938.000 206.000 -86.764 36.161 850505.000 43.000 656.000 11138.000 3919.000 566.000 2119.000 3234.000 8640.000 3705.000 7371.000 207.000 -73.375 40.678 2605813.000 35.000 643.000 8087.000 519.000 1012.000 3219.000 2439.000 766.000 1450.000 4937.000 208.000 -70.930 41.637 166699.000 20.000 516.000 10509.000 1245.000 903.000 4900.000 3128.000 1360.000 1217.000 6470.000 209.000 -72.783 41.668 142241.000 7.000 583.000 11460.000 2068.000 893.000 5938.000 3495.000 7852.000 1604.000 5478.000 210.000 -72.851 41.418 500474.000 7.000 583.000 10218.000 556.000 633.000 4505.000 3244.000 1164.000 2281.000 6672.000 211.000 -72.095 41.443 250839.000 7.000 498.000 8515.000 2586.000 1604.000 4579.000 2995.000 7978.000 3500.000 6453.000 212.000 -90.063 29.963 1256256.000 19.000 638.000 13358.000 7850.000 2498.000 8625.000 2984.000 56745.000 3579.000 5338.000 213.000 -73.880 40.849 8274961.000 35.000 601.000 14220.000 4106.000 1461.000 3514.000 3362.000 14224.000 1818.000 5690.000 214.000 -74.172 40.737 1878959.000 32.000 554.000 7686.000 507.000 775.000 5561.000 2538.000 966.000 1873.000 4463.000 215.000 -79.057 43.097 227354.000 35.000 632.000 8568.000 1932.000 997.000 3215.000 3014.000 7087.000 2964.000 5866.000 216.000 -76.227 36.890 1160311.000 46.000 648.000 20151.000 2530.000 625.000 3536.000 3029.000 7273.000 2268.000 6432.000 217.000 -73.365 41.123 126692.000 7.000 910.000 13135.000 2362.000 1533.000 6430.000 2646.000 6162.000 2394.000 5457.000 218.000 -122.268 37.808 1761759.000 5.000 333.000 6750.000 489.000 1327.000 3798.000 2864.000 266.000 3095.000 7060.000 219.000 -82.135 29.185 122488.000 10.000 603.000 6689.000 384.000 1698.000 1944.000 2721.000 259.000 900.000 7565.000 220.000 -102.375 31.858 115374.000 44.000 554.000 7186.000 1623.000 1297.000 4459.000 2908.000 4843.000 1742.000 8119.000 221.000 -97.304 35.296 860969.000 37.000 726.000 8263.000 338.000 752.000 4083.000 2625.000 708.000 1451.000 4912.000 222.000 -122.890 47.045 124264.000 48.000 440.000 7128.000 2559.000 1008.000 5806.000 3069.000 3787.000 1977.000 5853.000 223.000 -96.008 41.283 585122.000 30.000 509.000 10173.000 1574.000 804.000 3299.000 2754.000 6987.000 1866.000 5822.000 224.000 -74.413 41.453 259603.000 35.000 457.000 8196.000 765.000 1671.000 5887.000 2976.000 2681.000 2881.000 7413.000 225.000 -81.377 28.553 700055.000 10.000 524.000 6760.000 812.000 568.000 2273.000 2491.000 804.000 852.000 6062.000 226.000 -87.113 37.768 85949.000 18.000 890.000 14000.000 1106.000 791.000 2238.000 2155.000 2769.000 2135.000 5514.000 227.000 -119.203 34.237 529174.000 5.000 536.000 6373.000 201.000 1344.000 2778.000 2500.000 755.000 2089.000 6083.000 228.000 -85.697 30.269 97740.000 10.000 617.000 6657.000 665.000 488.000 4399.000 2503.000 91.000 1148.000 5187.000 229.000 -81.450 39.413 157914.000 36.000 584.000 6248.000 593.000 591.000 1750.000 1701.000 155.000 1956.000 4491.000 230.000 -88.549 30.368 118015.000 26.000 586.000 9462.000 1117.000 744.000 4738.000 3058.000 480.000 1513.000 5154.000 231.000 -71.395 41.943 307403.000 40.000 536.000 6479.000 563.000 1472.000 2918.000 2914.000 1954.000 2160.000 6029.000 232.000 -87.406 30.661 289782.000 10.000 491.000 8388.000 1184.000 921.000 2967.000 2452.000 2294.000 1688.000 4073.000 233.000 -89.592 40.693 365864.000 15.000 630.000 8310.000 5158.000 1059.000 5903.000 3781.000 17270.000 1979.000 5638.000 234.000 -75.163 39.950 4716818.000 39.000 536.000 8921.000 1584.000 1268.000 4729.000 2942.000 4573.000 2472.000 6415.000 235.000 -112.073 33.455 1509052.000 4.000 463.000 5674.000 617.000 1169.000 1671.000 2554.000 373.000 793.000 4247.000 236.000 -92.017 34.223 90718.000 3.000 586.000 8099.000 3413.000 687.000 5616.000 3544.000 11069.000 2145.000 5261.000 237.000 -80.008 40.437 2218870.000 39.000 482.000 7807.000 694.000 638.000 3759.000 3264.000 228.000 1420.000 5483.000 238.000 -73.253 42.447 83490.000 20.000 483.000 8100.000 834.000 823.000 5185.000 2973.000 2351.000 3366.000 6186.000 239.000 -70.230 43.678 193831.000 22.000 768.000 9912.000 1590.000 1504.000 5947.000 3343.000 5160.000 2532.000 4535.000 240.000 -122.365 45.547 1105699.000 38.000 469.000 9966.000 596.000 475.000 2321.000 3026.000 165.000 1390.000 8367.000 241.000 -70.871 43.190 190938.000 31.000 488.000 9981.000 355.000 633.000 4166.000 2898.000 785.000 1670.000 6746.000 242.000 -73.930 41.702 245055.000 35.000 586.000 9274.000 2467.000 998.000 5474.000 3558.000 6152.000 2263.000 5154.000 243.000 -71.407 41.817 618514.000 40.000 500.000 9321.000 198.000 485.000 4546.000 2618.000 1985.000 3300.000 3459.000 244.000 -111.678 40.272 218106.000 45.000 497.000 6637.000 468.000 1181.000 3501.000 2653.000 1307.000 1619.000 4646.000 245.000 -104.605 38.240 125972.000 6.000 496.000 8943.000 931.000 1055.000 3558.000 2732.000 1171.000 2016.000 4415.000 246.000 -87.800 42.727 173132.000 49.000 647.000 8230.000 3476.000 981.000 6544.000 3455.000 5730.000 1606.000 6405.000 247.000 -78.765 35.884 561222.000 28.000 614.000 7614.000 1154.000 522.000 3120.000 3028.000 1108.000 1549.000 5587.000 248.000 -75.928 40.328 312509.000 39.000 664.000 8584.000 274.000 892.000 5727.000 2471.000 845.000 2424.000 4459.000 249.000 -122.400 40.582 115715.000 5.000 535.000 12449.000 615.000 1116.000 6767.000 2529.000 2210.000 2386.000 5677.000 250.000 -119.807 39.523 193623.000 34.000 664.000 8461.000 300.000 779.000 4714.000 1728.000 529.000 1204.000 5326.000 251.000 -119.195 46.259 144469.000 48.000 585.000 8343.000 2448.000 1076.000 6680.000 2940.000 5697.000 1943.000 5870.000 252.000 -77.425 37.385 761311.000 46.000 615.000 9754.000 2201.000 1475.000 3141.000 2596.000 5327.000 1918.000 4923.000 253.000 -117.338 34.044 1558182.000 5.000 652.000 7476.000 1036.000 784.000 3872.000 2723.000 1263.000 2036.000 5287.000 254.000 -79.937 37.273 220393.000 46.000 308.000 9193.000 2966.000 437.000 4399.000 2134.000 769.000 1503.000 6099.000 255.000 -92.463 44.023 92006.000 24.000 536.000 8609.000 1969.000 894.000 5165.000 3582.000 6956.000 2659.000 6304.000 256.000 -77.608 43.158 971230.000 35.000 466.000 7584.000 969.000 1156.000 2987.000 2680.000 1026.000 933.000 4592.000 257.000 -89.098 42.268 279514.000 15.000 576.000 9855.000 1027.000 1363.000 5097.000 2793.000 4483.000 2306.000 5309.000 258.000 -121.490 38.585 1099814.000 5.000 515.000 7368.000 1022.000 1068.000 3186.000 2772.000 1708.000 2059.000 3709.000 259.000 -84.018 43.551 421518.000 23.000 195.000 7235.000 603.000 343.000 4565.000 2502.000 1871.000 1572.000 5488.000 260.000 -94.162 45.566 163256.000 24.000 475.000 5589.000 223.000 969.000 2689.000 2927.000 879.000 1265.000 5991.000 261.000 -94.838 39.767 87888.000 25.000 537.000 7605.000 2850.000 1306.000 7119.000 3530.000 8896.000 2243.000 5800.000 262.000 -90.193 38.617 1808621.000 25.000 716.000 8378.000 749.000 1014.000 4732.000 3278.000 691.000 1873.000 3835.000 263.000 -123.028 44.917 249895.000 38.000 644.000 11622.000 1232.000 490.000 3459.000 2729.000 3276.000 2234.000 6309.000 264.000 -70.782 42.576 258175.000 20.000 843.000 13838.000 352.000 1107.000 4160.000 2439.000 1004.000 3179.000 5656.000 265.000 -121.801 36.634 290444.000 5.000 541.000 9466.000 1631.000 969.000 6228.000 2340.000 5528.000 3900.000 4942.000 266.000 -111.935 40.882 910222.000 45.000 488.000 6321.000 236.000 1032.000 2938.000 2707.000 1301.000 1136.000 7720.000 267.000 -100.437 31.463 84784.000 44.000 398.000 6898.000 1337.000 1197.000 5387.000 2938.000 4295.000 1509.000 6873.000 268.000 -98.495 29.423 1071954.000 44.000 903.000 14465.000 2416.000 1099.000 5489.000 2794.000 8818.000 3347.000 5489.000 269.000 -117.153 32.713 1861846.000 5.000 910.000 17158.000 3726.000 1619.000 8299.000 3371.000 14226.000 4600.000 6063.000 270.000 -122.417 37.775 1488871.000 5.000 850.000 16048.000 2117.000 1065.000 5224.000 2709.000 6446.000 1964.000 7270.000 271.000 -121.883 37.335 1295071.000 5.000 855.000 15547.000 532.000 1026.000 5662.000 2719.000 2684.000 3300.000 5821.000 272.000 -120.196 34.671 298694.000 5.000 843.000 14303.000 1035.000 964.000 5010.000 2611.000 3748.000 1703.000 5335.000 273.000 -122.022 36.972 188141.000 5.000 732.000 12931.000 1052.000 912.000 3313.000 2722.000 3457.000 2255.000 5703.000 274.000 -122.679 38.338 299681.000 5.000 391.000 9560.000 801.000 939.000 3742.000 2626.000 817.000 2535.000 7715.000 275.000 -82.532 27.337 202251.000 10.000 542.000 6896.000 1084.000 1614.000 5958.000 2456.000 2262.000 2237.000 5591.000 276.000 -81.093 32.077 220553.000 11.000 575.000 6697.000 1219.000 372.000 3683.000 3230.000 1832.000 1386.000 4907.000 277.000 -75.775 41.327 728796.000 39.000 808.000 10183.000 2715.000 1170.000 6634.000 2710.000 9577.000 4800.000 5901.000 278.000 -122.330 47.597 1607469.000 48.000 570.000 6697.000 700.000 384.000 2017.000 3022.000 52.000 1100.000 4055.000 279.000 -80.517 41.233 128299.000 39.000 442.000 8121.000 593.000 450.000 3458.000 2557.000 268.000 1316.000 4765.000 280.000 -87.748 43.760 100935.000 49.000 524.000 5722.000 394.000 1035.000 1922.000 2652.000 68.000 937.000 6213.000 281.000 -96.576 33.695 89796.000 44.000 508.000 6534.000 1445.000 1197.000 4401.000 2858.000 2826.000 1389.000 6585.000 282.000 -93.758 32.490 333079.000 19.000 385.000 6528.000 846.000 759.000 4316.000 2673.000 1393.000 1359.000 4648.000 283.000 -96.392 42.492 117457.000 13.000 276.000 7983.000 1041.000 556.000 6271.000 2651.000 465.000 1324.000 5204.000 284.000 -96.702 43.495 109435.000 42.000 545.000 5938.000 830.000 1038.000 5634.000 2874.000 2672.000 1819.000 5056.000 285.000 -86.215 41.669 241617.000 16.000 574.000 6927.000 497.000 869.000 5534.000 2774.000 2988.000 1517.000 4722.000 286.000 -117.405 47.672 341835.000 48.000 524.000 7882.000 1877.000 1225.000 6172.000 3078.000 1983.000 1536.000 5384.000 287.000 -89.648 39.800 187789.000 15.000 453.000 8039.000 710.000 1212.000 6159.000 3525.000 3466.000 1514.000 5289.000 288.000 -72.588 42.100 515259.000 20.000 544.000 6343.000 577.000 892.000 3828.000 2709.000 1634.000 1737.000 5932.000 289.000 -93.290 37.220 207704.000 25.000 648.000 23640.000 2610.000 835.000 3110.000 3029.000 7865.000 1729.000 6158.000 290.000 -73.540 41.053 198854.000 7.000 575.000 8405.000 612.000 540.000 2740.000 3169.000 1271.000 1200.000 4677.000 291.000 -77.867 40.792 112760.000 39.000 542.000 6578.000 505.000 418.000 1532.000 2672.000 147.000 1460.000 3744.000 292.000 -80.597 40.376 163099.000 36.000 625.000 8474.000 342.000 1395.000 4427.000 2155.000 1579.000 1630.000 5672.000 293.000 -121.285 37.958 347342.000 5.000 548.000 7670.000 1040.000 689.000 6951.000 3144.000 5080.000 2851.000 4474.000 294.000 -76.150 43.052 642971.000 35.000 808.000 7770.000 539.000 1162.000 4730.000 2546.000 4297.000 4000.000 4887.000 295.000 -122.433 47.237 485643.000 48.000 404.000 8029.000 370.000 1161.000 5530.000 2790.000 2181.000 1936.000 6021.000 296.000 -84.282 30.445 190220.000 10.000 440.000 7442.000 1189.000 1493.000 5588.000 3044.000 5040.000 2943.000 7256.000 297.000 -82.664 27.955 1613603.000 10.000 557.000 5527.000 453.000 630.000 3550.000 3012.000 1226.000 1401.000 4353.000 298.000 -87.408 39.467 137247.000 16.000 467.000 5717.000 343.000 822.000 2537.000 2899.000 63.000 669.000 4772.000 299.000 -94.052 33.432 113067.000 44.000 518.000 7767.000 1738.000 998.000 5323.000 2852.000 4389.000 1952.000 4534.000 300.000 -83.528 41.591 616864.000 36.000 501.000 7110.000 1148.000 999.000 5348.000 2795.000 1632.000 1141.000 5464.000 301.000 -95.670 39.052 154916.000 17.000 636.000 10616.000 1372.000 1181.000 4786.000 3311.000 5029.000 1646.000 5772.000 302.000 -74.767 40.225 307863.000 32.000 589.000 8548.000 1259.000 1400.000 4397.000 2685.000 4889.000 3131.000 6147.000 303.000 -110.968 32.217 531443.000 4.000 530.000 7498.000 1581.000 1080.000 3758.000 2628.000 4248.000 2024.000 7115.000 304.000 -95.902 36.160 657173.000 37.000 470.000 6464.000 674.000 1014.000 4723.000 2390.000 1432.000 1090.000 4900.000 305.000 -87.567 33.205 137541.000 2.000 500.000 7298.000 672.000 955.000 3460.000 3283.000 404.000 631.000 7327.000 306.000 -95.302 32.345 128366.000 44.000 548.000 6744.000 391.000 400.000 4592.000 2970.000 858.000 1750.000 5226.000 307.000 -75.341 43.159 320180.000 35.000 821.000 10503.000 1079.000 964.000 4153.000 2498.000 2962.000 1559.000 5819.000 308.000 -122.194 38.220 334402.000 5.000 768.000 9015.000 517.000 752.000 3817.000 2332.000 1557.000 1464.000 4571.000 309.000 -122.670 45.625 192227.000 48.000 336.000 7143.000 260.000 1092.000 2407.000 2696.000 87.000 1410.000 7599.000 310.000 -97.005 28.805 68807.000 44.000 615.000 7295.000 807.000 1135.000 4133.000 2747.000 2097.000 1474.000 5023.000 311.000 -75.099 39.438 132866.000 32.000 543.000 7778.000 210.000 1132.000 3094.000 2128.000 511.000 2800.000 5563.000 312.000 -119.219 36.204 245738.000 5.000 412.000 6106.000 538.000 1166.000 3018.000 2867.000 1141.000 1248.000 6259.000 313.000 -97.142 31.547 170755.000 44.000 631.000 13724.000 4361.000 1317.000 8236.000 3635.000 21701.000 1578.000 6072.000 314.000 -77.033 38.892 3250822.000 8.000 569.000 10024.000 1218.000 789.000 2434.000 2995.000 318.000 946.000 5656.000 315.000 -73.048 41.410 204968.000 7.000 347.000 7881.000 925.000 700.000 3351.000 2889.000 3000.000 1900.000 4407.000 316.000 -92.397 42.510 162781.000 13.000 308.000 7642.000 818.000 442.000 3496.000 2749.000 761.000 1654.000 4300.000 317.000 -89.640 44.960 111270.000 49.000 509.000 10512.000 375.000 1783.000 5201.000 3224.000 2888.000 3772.000 7992.000 318.000 -80.218 26.655 576863.000 10.000 542.000 6576.000 791.000 308.000 2450.000 3002.000 422.000 1271.000 4740.000 319.000 -80.723 40.070 185566.000 50.000 494.000 7061.000 806.000 1164.000 3933.000 2981.000 2987.000 1508.000 6036.000 320.000 -97.337 37.692 411313.000 17.000 456.000 6404.000 549.000 1179.000 2793.000 2747.000 599.000 1126.000 6805.000 321.000 -98.513 33.910 121082.000 44.000 558.000 7284.000 860.000 464.000 3097.000 2906.000 196.000 726.000 3288.000 322.000 -77.003 41.245 118416.000 39.000 597.000 7927.000 1445.000 1115.000 4532.000 3112.000 4545.000 1923.000 6174.000 323.000 -75.550 39.747 523221.000 9.000 564.000 6858.000 1099.000 1423.000 2904.000 2876.000 1077.000 2668.000 5390.000 324.000 -77.923 34.237 103471.000 28.000 562.000 8715.000 1805.000 680.000 3643.000 3299.000 1784.000 910.000 5040.000 325.000 -71.795 42.272 402918.000 20.000 535.000 6440.000 317.000 1106.000 3731.000 2491.000 996.000 2140.000 4986.000 326.000 -120.513 46.595 172508.000 48.000 540.000 8371.000 713.000 440.000 2267.000 2903.000 1022.000 842.000 4946.000 327.000 -76.728 39.960 381255.000 39.000 570.000 7021.000 1097.000 938.000 3374.000 2920.000 2797.000 1327.000 3894.000 328.000 -80.729 41.170 531350.000 36.000 608.000 7875.000 212.000 1179.000 2768.000 2387.000 122.000 918.000 4694.000 329.000 -121.622 39.128 101979.000 5.000 ggobi-2.1.12/data/tao.xml0000644000175000017500000022055514651527764010615 This is a subset of data taken from the NOAA web site http://www.pmel.noaa.gov/tao/. The data is generated from recording instruments on a grid of buoys laid out over the Pacific Ocean. The grid was setup to monitor El Nino and La Nina events. This subset contains measurements from 5 locations (0deg/110W, 2S/110W, 0deg/95W,2S/95W,5S/95W) and two time points Nov-Jan 1993 (normal), 1997 (El Nino). There are missing values in this data set. 1997.000 0.000 -110.000 27.590 27.150 79.600 -6.400 5.400 1997.000 0.000 -110.000 27.550 27.020 75.800 -5.300 5.300 1997.000 0.000 -110.000 27.570 27.000 76.500 -5.100 4.500 1997.000 0.000 -110.000 27.620 26.930 76.200 -4.900 2.500 1997.000 0.000 -110.000 27.650 26.840 76.400 -3.500 4.100 1997.000 0.000 -110.000 27.830 26.940 76.700 -4.400 1.600 1997.000 0.000 -110.000 28.010 27.040 76.500 -2.000 3.500 1997.000 0.000 -110.000 28.040 27.110 78.300 -3.700 4.500 1997.000 0.000 -110.000 28.020 27.210 78.600 -4.200 5.000 1997.000 0.000 -110.000 28.050 27.250 76.900 -3.600 3.500 1997.000 0.000 -110.000 28.070 27.230 77.600 -3.700 2.900 1997.000 0.000 -110.000 28.090 27.320 77.500 -4.800 1.800 1997.000 0.000 -110.000 28.200 27.310 80.100 -3.500 1.900 1997.000 0.000 -110.000 28.250 26.440 85.200 -1.000 1.800 1997.000 0.000 -110.000 28.420 26.780 79.800 -1.500 0.900 1997.000 0.000 -110.000 28.580 27.420 76.300 -2.600 0.700 1997.000 0.000 -110.000 28.520 27.500 81.800 -4.400 2.900 1997.000 0.000 -110.000 28.350 27.090 84.600 -5.800 3.300 1997.000 0.000 -110.000 28.280 27.290 81.300 -7.300 3.800 1997.000 0.000 -110.000 28.180 27.090 84.700 -6.300 4.700 1997.000 0.000 -110.000 28.060 27.060 83.900 -4.800 6.800 1997.000 0.000 -110.000 28.040 27.280 79.200 -3.200 6.700 1997.000 0.000 -110.000 28.090 27.300 77.500 -2.200 3.500 1997.000 0.000 -110.000 28.120 27.510 80.400 -4.900 1.900 1997.000 0.000 -110.000 28.130 27.540 82.500 -5.700 1.500 1997.000 0.000 -110.000 28.110 27.620 81.500 -5.300 2.900 1997.000 0.000 -110.000 28.150 27.510 81.000 -4.400 4.000 1997.000 0.000 -110.000 28.190 27.600 80.700 -5.100 4.200 1997.000 0.000 -110.000 28.170 27.640 81.000 -6.600 2.400 1997.000 0.000 -110.000 28.210 27.560 77.000 -4.600 4.200 1997.000 0.000 -110.000 28.210 27.520 76.500 -2.900 4.300 1997.000 0.000 -110.000 28.250 26.810 84.700 -3.000 2.600 1997.000 0.000 -110.000 28.260 27.040 86.700 -5.000 1.800 1997.000 0.000 -110.000 28.230 27.180 87.200 -6.300 2.400 1997.000 0.000 -110.000 28.320 27.840 82.600 -6.500 4.300 1997.000 0.000 -110.000 28.020 25.760 91.100 -1.400 2.900 1997.000 0.000 -110.000 28.030 26.380 86.600 0.000 2.300 1997.000 0.000 -110.000 28.150 27.000 87.000 -1.300 2.800 1997.000 0.000 -110.000 28.520 26.880 89.300 -4.100 3.600 1997.000 0.000 -110.000 28.480 26.290 88.900 -1.800 -1.300 1997.000 0.000 -110.000 28.560 27.170 83.800 -3.600 3.000 1997.000 0.000 -110.000 28.590 27.500 84.600 -3.900 4.100 1997.000 0.000 -110.000 28.460 26.220 89.300 1.200 3.600 1997.000 0.000 -110.000 28.420 27.780 78.900 -4.000 4.700 1997.000 0.000 -110.000 28.550 27.650 78.500 -3.600 3.200 1997.000 0.000 -110.000 28.520 26.580 85.600 -2.000 3.800 1997.000 0.000 -110.000 28.510 27.220 82.100 -2.400 3.500 1997.000 0.000 -110.000 28.720 27.200 81.000 -0.900 0.100 1997.000 0.000 -110.000 28.980 27.680 82.800 -3.800 2.200 1997.000 0.000 -110.000 28.570 26.590 89.400 -4.600 2.900 1997.000 0.000 -110.000 28.500 27.270 87.200 -5.600 1.200 1997.000 0.000 -110.000 28.530 26.520 90.300 -3.600 -1.100 1997.000 0.000 -110.000 28.730 27.640 87.000 -2.100 2.300 1997.000 0.000 -110.000 29.020 27.780 83.400 -4.100 -0.100 1997.000 0.000 -110.000 28.940 27.240 86.500 -4.800 0.900 1997.000 0.000 -110.000 28.860 27.400 86.900 -6.300 0.700 1997.000 0.000 -110.000 28.780 26.770 89.800 -5.000 0.100 1997.000 0.000 -110.000 28.830 27.150 86.300 -1.400 0.500 1997.000 0.000 -110.000 29.080 27.310 86.800 0.200 1.600 1997.000 0.000 -110.000 28.910 27.490 86.100 -5.600 1.500 1997.000 0.000 -110.000 28.740 27.310 88.900 -6.400 -0.900 1997.000 0.000 -110.000 28.650 27.740 89.300 -7.200 -4.000 1997.000 0.000 -110.000 28.570 27.600 90.400 -7.900 -2.300 1997.000 0.000 -110.000 28.510 28.370 88.000 -5.400 -6.200 1997.000 0.000 -110.000 28.590 28.280 88.100 0.100 -4.400 1997.000 0.000 -110.000 28.480 26.420 90.200 0.800 2.200 1997.000 0.000 -110.000 28.630 27.630 81.900 0.100 2.400 1997.000 0.000 -110.000 29.000 28.100 82.300 -0.400 0.900 1997.000 0.000 -110.000 29.090 27.280 87.100 -2.400 -1.000 1997.000 0.000 -110.000 28.780 27.420 88.200 -1.900 -1.400 1997.000 0.000 -110.000 28.760 27.330 89.600 -3.100 -0.400 1997.000 0.000 -110.000 28.780 26.910 88.500 -2.900 1.600 1997.000 0.000 -110.000 29.030 28.080 86.800 -3.900 -1.700 1997.000 0.000 -110.000 28.780 26.980 91.300 -3.900 -3.700 1997.000 0.000 -110.000 28.760 27.640 85.800 -2.400 -2.400 1997.000 0.000 -110.000 28.730 27.130 89.600 -1.900 -0.800 1997.000 0.000 -110.000 28.660 26.830 92.100 -1.500 3.900 1997.000 0.000 -110.000 28.700 27.060 89.900 1.800 0.800 1997.000 0.000 -110.000 28.830 27.680 86.000 0.800 -0.700 1997.000 0.000 -110.000 28.890 27.870 86.700 -3.600 -0.800 1997.000 0.000 -110.000 28.820 27.840 86.700 -3.700 -0.400 1997.000 0.000 -110.000 28.900 26.900 90.900 -2.800 -1.700 1997.000 0.000 -110.000 29.040 27.550 89.000 -4.100 -1.600 1997.000 0.000 -110.000 29.060 27.520 88.000 -1.300 -0.700 1997.000 0.000 -110.000 29.000 27.280 90.100 -3.100 0.500 1997.000 0.000 -110.000 29.040 27.810 87.600 -2.800 -1.500 1997.000 0.000 -110.000 29.220 28.400 85.300 -2.900 -1.700 1997.000 0.000 -110.000 29.330 27.670 89.700 -0.900 2.100 1997.000 0.000 -110.000 29.290 27.950 88.200 -0.300 0.300 1997.000 0.000 -110.000 29.410 27.780 89.900 -2.500 -1.500 1997.000 0.000 -110.000 29.330 28.300 89.100 -3.100 -1.200 1997.000 0.000 -110.000 29.550 28.330 87.600 -3.300 -1.300 1997.000 0.000 -95.000 26.790 26.390 79.400 -4.500 4.900 1997.000 0.000 -95.000 26.680 26.190 77.700 -3.600 6.000 1997.000 0.000 -95.000 26.620 26.150 78.400 -2.600 6.100 1997.000 0.000 -95.000 26.590 26.390 80.500 -2.400 5.000 1997.000 0.000 -95.000 26.640 26.270 81.900 -2.900 6.900 1997.000 0.000 -95.000 26.690 26.350 78.400 -2.300 6.400 1997.000 0.000 -95.000 26.850 26.150 75.900 -1.200 4.500 1997.000 0.000 -95.000 26.910 25.830 78.400 0.900 4.000 1997.000 0.000 -95.000 27.030 26.270 73.800 0.200 5.100 1997.000 0.000 -95.000 27.240 26.310 73.500 -1.100 3.900 1997.000 0.000 -95.000 27.460 26.590 75.600 -0.600 3.400 1997.000 0.000 -95.000 27.490 26.870 78.700 -1.900 5.400 1997.000 0.000 -95.000 27.400 26.630 81.600 -2.800 5.300 1997.000 0.000 -95.000 27.620 26.670 79.400 -3.000 5.300 1997.000 0.000 -95.000 27.730 26.790 78.000 -3.600 6.000 1997.000 0.000 -95.000 27.690 na 79.800 -0.600 4.200 1997.000 0.000 -95.000 27.630 na 74.500 -3.900 5.800 1997.000 0.000 -95.000 27.510 na 76.300 -2.800 5.300 1997.000 0.000 -95.000 27.540 na 81.600 -2.300 5.600 1997.000 0.000 -95.000 27.470 na 81.900 -4.600 6.100 1997.000 0.000 -95.000 27.440 na 74.200 -4.400 6.500 1997.000 0.000 -95.000 27.450 na 72.100 -2.600 6.100 1997.000 0.000 -95.000 27.520 na 72.400 -0.100 4.900 1997.000 0.000 -95.000 27.490 na 81.600 1.300 2.700 1997.000 0.000 -95.000 27.600 na 74.500 -1.000 5.500 1997.000 0.000 -95.000 27.590 na 73.800 -0.700 6.200 1997.000 0.000 -95.000 27.560 na 75.600 -1.600 6.100 1997.000 0.000 -95.000 27.530 na 75.900 -2.200 7.200 1997.000 0.000 -95.000 27.550 na 76.600 -2.700 6.500 1997.000 0.000 -95.000 27.600 na 80.200 0.100 6.100 1997.000 0.000 -95.000 27.600 na 81.900 -1.200 4.900 1997.000 0.000 -95.000 27.610 na 83.000 -2.900 4.300 1997.000 0.000 -95.000 27.700 na 80.900 -5.300 4.600 1997.000 0.000 -95.000 27.750 na 78.400 -4.400 5.100 1997.000 0.000 -95.000 27.810 na 83.000 -4.700 2.700 1997.000 0.000 -95.000 27.870 na 84.400 -4.500 2.400 1997.000 0.000 -95.000 27.970 na 84.000 -4.100 2.800 1997.000 0.000 -95.000 28.030 na 83.300 -2.900 3.500 1997.000 0.000 -95.000 27.970 na 83.000 -3.500 4.400 1997.000 0.000 -95.000 28.140 na 82.300 -4.100 4.700 1997.000 0.000 -95.000 28.020 na 85.100 -1.500 1.400 1997.000 0.000 -95.000 27.930 na 79.400 -3.400 4.200 1997.000 0.000 -95.000 28.000 na 79.800 -3.000 4.100 1997.000 0.000 -95.000 28.010 na 84.400 -2.100 4.400 1997.000 0.000 -95.000 27.910 na 87.500 0.200 1.300 1997.000 0.000 -95.000 27.890 na 83.300 -0.100 2.200 1997.000 0.000 -95.000 28.150 na 82.300 -2.000 2.800 1997.000 0.000 -95.000 28.470 na 81.600 -2.300 1.300 1997.000 0.000 -95.000 28.610 na 79.100 -4.000 0.900 1997.000 0.000 -95.000 28.740 na 78.700 -4.600 -0.800 1997.000 0.000 -95.000 28.740 na 80.500 -4.700 1.200 1997.000 0.000 -95.000 28.830 na 80.500 -4.000 1.100 1997.000 0.000 -95.000 28.790 na 85.100 -4.900 0.100 1997.000 0.000 -95.000 28.330 na 88.900 -1.600 1.000 1997.000 0.000 -95.000 28.210 na 84.700 2.100 -0.600 1997.000 0.000 -95.000 28.410 na 79.400 -2.300 1.500 1997.000 0.000 -95.000 28.740 na 73.800 -1.500 0.200 1997.000 0.000 -95.000 28.930 na 82.300 0.600 2.600 1997.000 0.000 -95.000 28.550 na 84.400 1.600 -1.000 1997.000 0.000 -95.000 28.750 na 84.000 0.200 2.700 1997.000 0.000 -95.000 28.750 na 81.900 -3.400 2.100 1997.000 0.000 -95.000 28.950 na 80.500 -5.200 -3.400 1997.000 0.000 -95.000 28.830 na 79.100 -5.300 -4.400 1997.000 0.000 -95.000 28.720 na 80.200 -5.200 -3.400 1997.000 0.000 -95.000 28.540 na 82.600 -2.700 -1.600 1997.000 0.000 -95.000 28.250 na 84.700 1.900 1.800 1997.000 0.000 -95.000 28.360 na 86.100 4.300 1.100 1997.000 0.000 -95.000 28.210 na 85.800 2.700 1.600 1997.000 0.000 -95.000 28.140 na 86.500 -1.900 -2.200 1997.000 0.000 -95.000 28.610 na 80.500 -2.900 -1.800 1997.000 0.000 -95.000 28.920 na 80.900 -3.000 -0.600 1997.000 0.000 -95.000 28.910 na 80.500 -2.200 -2.900 1997.000 0.000 -95.000 29.230 na 78.400 0.100 -2.500 1997.000 0.000 -95.000 29.350 na 79.100 -2.700 -1.800 1997.000 0.000 -95.000 29.390 na 77.300 -3.200 -4.400 1997.000 0.000 -95.000 29.240 na 80.500 -2.900 -3.400 1997.000 0.000 -95.000 29.140 na 79.400 -1.500 0.000 1997.000 0.000 -95.000 29.140 na 82.300 -1.300 -4.100 1997.000 0.000 -95.000 29.000 na 75.600 -0.700 -2.800 1997.000 0.000 -95.000 29.380 na 77.000 -2.300 -1.300 1997.000 0.000 -95.000 29.570 na 79.100 -2.000 1.700 1997.000 0.000 -95.000 29.650 na 77.000 -2.000 0.800 1997.000 0.000 -95.000 29.890 na 74.500 -3.000 -0.200 1997.000 0.000 -95.000 30.170 na 77.700 -1.400 0.700 1997.000 0.000 -95.000 29.950 na 78.000 0.900 -4.000 1997.000 0.000 -95.000 29.630 na 76.300 -0.400 -3.900 1997.000 0.000 -95.000 29.560 na 79.100 -2.300 0.400 1997.000 0.000 -95.000 29.440 na 83.000 -0.200 2.000 1997.000 0.000 -95.000 29.480 na 84.000 1.900 -1.200 1997.000 0.000 -95.000 29.430 na 81.200 -0.400 0.500 1997.000 0.000 -95.000 29.380 na 79.800 -3.900 2.600 1997.000 0.000 -95.000 29.210 na 79.400 -4.100 -1.100 1997.000 -5.000 -95.000 26.600 25.470 82.300 -6.800 5.100 1997.000 -5.000 -95.000 26.650 25.630 79.900 -5.800 5.200 1997.000 -5.000 -95.000 26.670 25.200 85.700 -5.200 5.300 1997.000 -5.000 -95.000 26.590 25.470 85.200 -5.400 4.100 1997.000 -5.000 -95.000 26.480 25.820 81.900 -5.100 5.000 1997.000 -5.000 -95.000 26.550 25.780 79.000 -3.400 4.400 1997.000 -5.000 -95.000 26.640 25.740 77.400 -3.200 4.200 1997.000 -5.000 -95.000 26.830 25.740 76.100 -1.100 3.700 1997.000 -5.000 -95.000 26.830 25.860 78.200 -3.100 3.600 1997.000 -5.000 -95.000 26.780 25.860 81.500 -4.900 3.600 1997.000 -5.000 -95.000 26.820 26.010 81.100 -4.800 4.000 1997.000 -5.000 -95.000 26.820 25.970 82.800 -5.500 4.700 1997.000 -5.000 -95.000 26.800 26.130 84.000 -5.500 6.100 1997.000 -5.000 -95.000 26.780 25.780 84.000 -6.500 3.700 1997.000 -5.000 -95.000 26.770 26.090 80.700 -6.300 4.600 1997.000 -5.000 -95.000 26.810 25.970 79.000 -4.600 4.000 1997.000 -5.000 -95.000 26.890 26.050 79.400 -6.000 3.200 1997.000 -5.000 -95.000 26.910 26.130 79.900 -5.800 4.000 1997.000 -5.000 -95.000 26.900 26.320 82.800 -5.500 5.900 1997.000 -5.000 -95.000 26.890 26.050 81.100 -6.500 4.900 1997.000 -5.000 -95.000 26.900 25.820 80.700 -5.400 4.100 1997.000 -5.000 -95.000 26.930 26.200 78.200 -5.300 2.700 1997.000 -5.000 -95.000 27.050 26.440 79.000 -3.000 4.400 1997.000 -5.000 -95.000 27.110 26.360 81.100 -3.600 4.000 1997.000 -5.000 -95.000 27.110 26.130 79.900 -4.100 3.900 1997.000 -5.000 -95.000 27.120 26.280 79.400 -4.000 4.500 1997.000 -5.000 -95.000 27.110 26.440 77.800 -5.200 4.100 1997.000 -5.000 -95.000 27.140 26.470 72.800 -5.100 3.700 1997.000 -5.000 -95.000 27.160 26.470 77.000 -5.700 3.500 1997.000 -5.000 -95.000 27.190 26.510 79.000 -5.200 4.100 1997.000 -5.000 -95.000 27.230 26.670 83.200 -5.100 4.700 1997.000 -5.000 -95.000 27.280 26.670 84.000 -6.100 4.600 1997.000 -5.000 -95.000 27.330 26.670 81.900 -6.000 4.200 1997.000 -5.000 -95.000 27.400 26.670 80.700 -6.000 2.800 1997.000 -5.000 -95.000 27.530 26.980 78.600 -5.100 3.700 1997.000 -5.000 -95.000 27.570 26.980 82.300 -5.300 4.700 1997.000 -5.000 -95.000 27.590 26.860 82.800 -4.200 5.500 1997.000 -5.000 -95.000 27.610 27.050 84.000 -4.100 5.100 1997.000 -5.000 -95.000 27.570 27.050 85.700 -4.900 4.800 1997.000 -5.000 -95.000 27.560 27.130 86.900 -5.500 3.700 1997.000 -5.000 -95.000 27.560 27.090 83.600 -5.000 5.200 1997.000 -5.000 -95.000 27.600 26.860 84.000 -5.200 4.100 1997.000 -5.000 -95.000 27.610 26.860 85.200 -4.700 3.800 1997.000 -5.000 -95.000 27.560 27.010 83.200 -5.500 5.100 1997.000 -5.000 -95.000 27.570 26.980 82.300 -4.900 6.000 1997.000 -5.000 -95.000 27.600 26.940 78.600 -5.000 5.200 1997.000 -5.000 -95.000 27.620 26.860 85.200 -4.400 5.500 1997.000 -5.000 -95.000 27.610 26.980 84.800 -3.500 5.800 1997.000 -5.000 -95.000 27.590 26.710 86.500 -4.900 5.000 1997.000 -5.000 -95.000 27.660 26.740 90.600 -4.700 2.600 1997.000 -5.000 -95.000 27.680 27.170 88.100 -6.600 3.100 1997.000 -5.000 -95.000 27.640 26.940 87.700 -7.900 4.500 1997.000 -5.000 -95.000 27.600 27.210 81.500 -6.900 3.700 1997.000 -5.000 -95.000 27.630 27.130 79.400 -4.700 4.800 1997.000 -5.000 -95.000 27.660 27.050 81.900 -4.300 3.700 1997.000 -5.000 -95.000 27.650 27.130 86.900 -5.500 3.900 1997.000 -5.000 -95.000 27.590 27.280 86.900 -5.900 4.800 1997.000 -5.000 -95.000 27.600 27.090 84.800 -5.200 5.300 1997.000 -5.000 -95.000 27.600 27.050 77.000 -4.300 5.100 1997.000 -5.000 -95.000 27.550 27.050 79.000 -5.300 3.500 1997.000 -5.000 -95.000 27.550 26.860 87.300 -6.100 3.800 1997.000 -5.000 -95.000 27.660 26.900 91.900 -6.300 2.400 1997.000 -5.000 -95.000 27.710 27.400 91.000 -6.100 3.600 1997.000 -5.000 -95.000 27.800 27.400 88.100 -7.100 3.700 1997.000 -5.000 -95.000 27.910 27.360 82.800 -5.200 4.500 1997.000 -5.000 -95.000 28.110 27.320 81.900 -2.600 4.300 1997.000 -5.000 -95.000 28.210 27.670 83.600 -2.600 4.300 1997.000 -5.000 -95.000 28.280 27.630 83.600 -3.700 3.700 1997.000 -5.000 -95.000 28.320 27.480 86.900 -4.900 2.800 1997.000 -5.000 -95.000 28.350 27.480 88.600 -5.700 3.500 1997.000 -5.000 -95.000 28.390 27.630 90.200 -6.700 3.500 1997.000 -5.000 -95.000 28.360 27.130 90.600 -4.500 4.600 1997.000 -5.000 -95.000 28.230 26.740 91.000 -3.100 5.000 1997.000 -5.000 -95.000 28.260 27.630 83.200 -5.200 4.100 1997.000 -5.000 -95.000 28.310 27.360 85.700 -3.700 2.600 1997.000 -5.000 -95.000 28.430 27.750 88.100 -4.000 2.900 1997.000 -5.000 -95.000 28.600 27.670 89.000 -0.800 3.100 1997.000 -5.000 -95.000 28.630 27.090 92.700 -3.300 1.400 1997.000 -5.000 -95.000 28.050 25.660 94.800 -1.000 0.800 1997.000 -5.000 -95.000 28.330 27.210 88.100 -4.600 4.000 1997.000 -5.000 -95.000 28.470 27.480 83.600 -4.200 5.700 1997.000 -5.000 -95.000 28.350 26.900 89.400 -4.400 5.200 1997.000 -5.000 -95.000 28.240 27.280 90.600 -3.500 6.000 1997.000 -5.000 -95.000 28.160 27.280 91.900 -4.500 6.200 1997.000 -5.000 -95.000 27.950 26.550 94.800 -1.700 5.000 1997.000 -5.000 -95.000 28.110 26.710 90.600 -0.500 3.400 1997.000 -5.000 -95.000 28.260 27.790 88.100 -2.600 5.300 1997.000 -5.000 -95.000 28.320 27.560 92.700 -3.600 3.000 1997.000 -5.000 -95.000 28.400 27.590 92.700 -3.500 1.400 1997.000 -5.000 -95.000 28.610 27.790 89.000 -3.800 1.800 1997.000 -5.000 -95.000 28.580 28.170 87.300 -4.300 5.700 1997.000 -5.000 -95.000 28.940 28.100 90.200 -4.500 4.600 1997.000 -2.000 -110.000 27.550 27.190 75.500 -6.800 4.600 1997.000 -2.000 -110.000 27.530 26.870 75.100 -5.200 4.900 1997.000 -2.000 -110.000 27.510 26.990 73.600 -5.700 4.200 1997.000 -2.000 -110.000 27.570 26.990 73.600 -4.700 1.800 1997.000 -2.000 -110.000 27.640 26.950 75.100 -3.600 3.700 1997.000 -2.000 -110.000 27.660 26.990 74.000 -4.400 2.400 1997.000 -2.000 -110.000 27.780 26.990 74.400 -1.800 3.300 1997.000 -2.000 -110.000 27.750 27.110 75.900 -3.700 4.300 1997.000 -2.000 -110.000 27.710 26.870 75.500 -4.300 4.400 1997.000 -2.000 -110.000 27.820 27.150 74.700 -3.500 3.100 1997.000 -2.000 -110.000 28.000 27.230 76.700 -4.500 3.000 1997.000 -2.000 -110.000 28.070 27.270 79.000 -4.800 2.600 1997.000 -2.000 -110.000 28.070 26.910 82.900 -3.800 3.500 1997.000 -2.000 -110.000 27.960 25.890 86.400 -2.600 3.400 1997.000 -2.000 -110.000 28.010 26.830 82.500 -4.200 1.500 1997.000 -2.000 -110.000 28.240 27.150 82.900 -4.400 2.800 1997.000 -2.000 -110.000 28.260 26.760 83.700 -5.900 4.400 1997.000 -2.000 -110.000 28.180 27.270 77.800 -6.100 5.500 1997.000 -2.000 -110.000 28.120 27.310 77.100 -7.400 4.600 1997.000 -2.000 -110.000 28.050 27.350 77.100 -6.500 6.500 1997.000 -2.000 -110.000 27.990 27.110 78.600 -5.200 7.300 1997.000 -2.000 -110.000 27.930 26.990 74.400 -3.200 5.900 1997.000 -2.000 -110.000 28.000 27.310 74.700 -2.300 2.900 1997.000 -2.000 -110.000 28.030 27.700 78.200 -5.100 2.900 1997.000 -2.000 -110.000 28.050 27.860 80.200 -5.800 1.500 1997.000 -2.000 -110.000 28.070 27.510 79.400 -5.400 4.600 1997.000 -2.000 -110.000 28.080 27.630 77.800 -4.500 4.400 1997.000 -2.000 -110.000 28.080 27.590 77.100 -5.300 4.300 1997.000 -2.000 -110.000 28.070 27.550 77.500 -6.900 4.400 1997.000 -2.000 -110.000 28.090 27.740 71.600 -5.400 3.900 1997.000 -2.000 -110.000 28.130 27.350 74.700 -3.600 4.700 1997.000 -2.000 -110.000 28.100 27.470 81.300 -4.800 5.100 1997.000 -2.000 -110.000 28.070 27.430 83.700 -5.900 4.400 1997.000 -2.000 -110.000 28.100 27.820 82.900 -6.800 4.600 1997.000 -2.000 -110.000 28.100 27.740 78.600 -6.000 5.000 1997.000 -2.000 -110.000 28.080 27.070 83.700 -1.700 6.100 1997.000 -2.000 -110.000 28.050 26.120 85.600 0.700 3.000 1997.000 -2.000 -110.000 28.120 26.680 86.800 -4.000 5.000 1997.000 -2.000 -110.000 28.170 27.700 81.700 -4.800 5.100 1997.000 -2.000 -110.000 28.280 27.310 81.700 -5.200 3.700 1997.000 -2.000 -110.000 28.260 27.030 82.900 -4.200 4.600 1997.000 -2.000 -110.000 28.360 27.820 79.400 -3.200 5.900 1997.000 -2.000 -110.000 28.370 27.820 76.300 -2.400 5.800 1997.000 -2.000 -110.000 28.340 27.670 75.900 -4.700 4.500 1997.000 -2.000 -110.000 28.370 27.780 78.600 -3.800 3.700 1997.000 -2.000 -110.000 28.300 26.360 85.200 -1.500 3.900 1997.000 -2.000 -110.000 28.290 27.510 82.100 -3.300 4.100 1997.000 -2.000 -110.000 28.350 27.270 84.400 -3.600 4.900 1997.000 -2.000 -110.000 28.310 27.820 80.200 -4.500 6.600 1997.000 -2.000 -110.000 28.300 27.630 82.100 -4.900 5.300 1997.000 -2.000 -110.000 28.270 27.510 84.000 -5.600 4.600 1997.000 -2.000 -110.000 28.250 27.270 87.500 -5.600 3.600 1997.000 -2.000 -110.000 28.240 27.150 87.500 -4.500 1.100 1997.000 -2.000 -110.000 28.300 26.790 87.500 -5.900 2.000 1997.000 -2.000 -110.000 28.340 27.590 83.700 -4.600 2.400 1997.000 -2.000 -110.000 28.380 28.140 80.900 -6.600 2.700 1997.000 -2.000 -110.000 28.430 27.980 81.300 -6.000 5.000 1997.000 -2.000 -110.000 28.410 26.830 87.100 -4.900 3.300 1997.000 -2.000 -110.000 28.510 27.230 84.400 -3.000 2.600 1997.000 -2.000 -110.000 28.560 27.900 82.500 -6.500 4.100 1997.000 -2.000 -110.000 28.450 27.780 81.700 -7.600 2.600 1997.000 -2.000 -110.000 28.430 27.740 86.800 -7.500 0.800 1997.000 -2.000 -110.000 28.470 27.940 86.800 -8.100 1.900 1997.000 -2.000 -110.000 28.520 27.900 86.800 -7.600 -1.500 1997.000 -2.000 -110.000 28.450 26.520 89.500 -2.600 0.600 1997.000 -2.000 -110.000 28.480 27.030 84.400 -1.300 1.200 1997.000 -2.000 -110.000 28.440 27.820 80.200 -1.100 2.800 1997.000 -2.000 -110.000 28.610 27.780 83.700 -3.300 2.200 1997.000 -2.000 -110.000 28.670 28.060 80.900 -4.800 4.700 1997.000 -2.000 -110.000 28.790 27.550 85.200 -4.300 0.900 1997.000 -2.000 -110.000 28.810 27.670 83.300 -3.200 1.600 1997.000 -2.000 -110.000 28.570 26.760 83.700 -3.500 -0.100 1997.000 -2.000 -110.000 28.810 27.700 84.400 -3.700 0.800 1997.000 -2.000 -110.000 28.770 27.820 83.700 -4.700 2.200 1997.000 -2.000 -110.000 28.870 26.360 89.900 -2.000 1.400 1997.000 -2.000 -110.000 28.890 27.070 86.800 -3.000 4.800 1997.000 -2.000 -110.000 28.930 27.700 82.500 -2.100 6.100 1997.000 -2.000 -110.000 28.950 27.270 86.400 -1.800 1.600 1997.000 -2.000 -110.000 29.120 27.430 85.600 0.400 -0.900 1997.000 -2.000 -110.000 29.100 27.510 81.300 -2.600 -0.900 1997.000 -2.000 -110.000 29.130 27.780 81.300 -3.500 2.300 1997.000 -2.000 -110.000 29.280 28.500 79.800 -4.900 0.800 1997.000 -2.000 -110.000 29.010 27.590 86.800 -6.800 3.700 1997.000 -2.000 -110.000 28.770 26.790 89.100 -4.300 0.700 1997.000 -2.000 -110.000 28.710 27.110 84.800 -3.100 0.900 1997.000 -2.000 -110.000 29.030 27.780 83.700 -3.800 0.400 1997.000 -2.000 -110.000 28.990 27.430 86.400 -1.300 3.000 1997.000 -2.000 -110.000 28.920 27.470 86.000 -1.400 3.400 1997.000 -2.000 -110.000 28.910 27.190 89.500 -4.000 3.800 1997.000 -2.000 -110.000 28.880 27.070 89.500 -3.500 1.000 1997.000 -2.000 -110.000 29.080 28.180 85.600 -3.200 0.500 1997.000 -2.000 -110.000 29.320 27.900 87.100 -5.000 2.500 1993.000 0.000 -110.000 23.590 23.100 81.200 -2.200 3.400 1993.000 0.000 -110.000 23.570 23.150 81.700 -2.500 4.600 1993.000 0.000 -110.000 23.670 23.150 82.000 -5.800 4.000 1993.000 0.000 -110.000 23.430 23.200 80.800 -6.700 2.800 1993.000 0.000 -110.000 23.420 23.130 83.500 -5.700 3.100 1993.000 0.000 -110.000 23.430 22.990 81.600 -5.600 4.200 1993.000 0.000 -110.000 23.490 22.900 80.700 -5.300 4.100 1993.000 0.000 -110.000 23.490 22.830 81.500 -6.200 2.500 1993.000 0.000 -110.000 23.240 22.660 85.900 -5.300 3.700 1993.000 0.000 -110.000 22.750 22.380 88.600 -3.600 4.800 1993.000 0.000 -110.000 22.330 22.210 88.700 -2.200 4.600 1993.000 0.000 -110.000 22.280 22.090 87.500 -2.800 2.500 1993.000 0.000 -110.000 22.230 22.220 87.500 -2.400 3.400 1993.000 0.000 -110.000 22.240 22.110 88.300 -2.800 2.600 1993.000 0.000 -110.000 22.460 22.320 84.200 -5.200 2.400 1993.000 0.000 -110.000 22.490 22.180 85.500 -4.400 2.300 1993.000 0.000 -110.000 22.510 22.470 85.300 -4.100 3.600 1993.000 0.000 -110.000 22.520 22.240 85.600 -4.300 2.400 1993.000 0.000 -110.000 22.490 22.270 86.200 -4.200 2.700 1993.000 0.000 -110.000 22.380 22.060 87.200 -4.600 2.300 1993.000 0.000 -110.000 22.390 22.090 87.500 -5.000 2.300 1993.000 0.000 -110.000 22.820 22.370 86.000 -4.600 2.700 1993.000 0.000 -110.000 23.410 22.700 81.100 -5.900 1.800 1993.000 0.000 -110.000 23.930 22.730 79.900 -4.800 2.700 1993.000 0.000 -110.000 24.670 22.940 80.300 -5.100 4.900 1993.000 0.000 -110.000 23.970 22.920 81.600 -4.400 2.500 1993.000 0.000 -110.000 23.100 23.020 84.400 -2.800 4.000 1993.000 0.000 -110.000 23.480 22.730 86.700 -3.300 4.000 1993.000 0.000 -110.000 24.200 22.980 82.900 -7.200 3.700 1993.000 0.000 -110.000 23.820 22.710 82.800 -7.000 3.100 1993.000 0.000 -110.000 23.000 22.830 79.900 -4.400 2.400 1993.000 0.000 -110.000 22.910 22.830 83.400 -1.500 5.300 1993.000 0.000 -110.000 22.800 22.520 88.700 -2.300 3.300 1993.000 0.000 -110.000 22.820 22.460 89.100 -4.500 2.800 1993.000 0.000 -110.000 22.750 22.530 88.300 -4.000 1.800 1993.000 0.000 -110.000 22.710 22.590 91.900 -4.600 2.200 1993.000 0.000 -110.000 22.850 22.660 90.300 -3.800 2.300 1993.000 0.000 -110.000 22.840 22.730 89.300 -3.400 2.900 1993.000 0.000 -110.000 22.890 22.940 90.200 -2.800 3.400 1993.000 0.000 -110.000 22.760 22.690 89.400 -4.300 1.900 1993.000 0.000 -110.000 23.010 22.930 88.800 -3.500 2.100 1993.000 0.000 -110.000 23.200 22.980 87.500 -3.400 3.400 1993.000 0.000 -110.000 23.360 23.300 85.400 -3.400 4.800 1993.000 0.000 -110.000 23.320 23.170 85.900 -3.900 4.100 1993.000 0.000 -110.000 23.370 23.220 84.500 -4.300 3.000 1993.000 0.000 -110.000 23.390 23.060 82.700 -5.200 1.500 1993.000 0.000 -110.000 23.330 22.950 81.400 -4.100 2.800 1993.000 0.000 -110.000 23.290 22.990 86.100 -4.100 3.000 1993.000 0.000 -110.000 23.240 22.990 86.700 -4.900 2.400 1993.000 0.000 -110.000 23.180 22.880 87.500 -3.600 2.400 1993.000 0.000 -110.000 22.930 22.840 86.400 -2.300 3.300 1993.000 0.000 -110.000 23.500 23.140 86.800 -4.400 3.100 1993.000 0.000 -110.000 23.780 23.490 88.400 -4.400 3.800 1993.000 0.000 -110.000 24.100 23.680 85.700 -5.500 2.700 1993.000 0.000 -110.000 23.980 23.430 85.600 -3.800 4.100 1993.000 0.000 -110.000 23.600 23.030 86.400 -2.000 4.900 1993.000 0.000 -110.000 23.370 23.170 87.900 -3.200 4.100 1993.000 0.000 -110.000 23.430 23.130 88.600 -3.000 3.300 1993.000 0.000 -110.000 23.400 23.140 89.300 -2.100 1.900 1993.000 0.000 -110.000 23.440 22.970 90.400 -1.700 2.200 1993.000 0.000 -110.000 23.400 23.230 90.100 -3.400 3.500 1993.000 0.000 -110.000 23.370 23.210 89.900 -4.300 2.600 1993.000 0.000 -110.000 23.450 23.160 90.000 -4.100 1.100 1993.000 0.000 -110.000 23.710 23.140 87.700 -3.000 1.600 1993.000 0.000 -110.000 24.290 23.390 85.800 -3.000 2.900 1993.000 0.000 -110.000 24.080 23.530 87.800 -3.400 2.000 1993.000 0.000 -110.000 24.250 23.710 87.200 -3.200 3.100 1993.000 0.000 -110.000 24.190 23.820 87.100 -4.200 3.500 1993.000 0.000 -110.000 24.190 23.850 86.200 -4.200 1.300 1993.000 0.000 -110.000 24.140 23.800 85.900 -3.200 2.600 1993.000 0.000 -110.000 23.900 23.650 87.200 -3.500 2.800 1993.000 0.000 -110.000 23.880 23.580 88.500 -4.300 2.200 1993.000 0.000 -110.000 23.960 23.470 88.600 -3.900 0.700 1993.000 0.000 -110.000 24.010 23.770 89.100 -3.500 3.100 1993.000 0.000 -110.000 23.890 23.590 89.500 -4.300 2.100 1993.000 0.000 -110.000 24.000 23.650 87.800 -4.100 0.600 1993.000 0.000 -110.000 24.000 23.570 85.100 -3.800 3.000 1993.000 0.000 -110.000 23.970 23.520 86.600 -2.900 2.900 1993.000 0.000 -110.000 24.030 23.770 87.300 -3.000 2.000 1993.000 0.000 -110.000 23.930 23.470 87.500 -3.700 1.000 1993.000 0.000 -110.000 23.930 23.450 86.400 -4.200 1.300 1993.000 0.000 -110.000 23.940 23.570 89.100 -3.100 2.100 1993.000 0.000 -110.000 23.980 23.750 89.300 -4.400 2.100 1993.000 0.000 -110.000 24.160 23.670 90.400 -3.500 1.200 1993.000 0.000 -110.000 23.750 23.580 91.100 -5.500 2.100 1993.000 0.000 -110.000 23.420 23.500 91.800 -4.200 1.800 1993.000 0.000 -110.000 23.480 23.530 91.900 -3.600 1.400 1993.000 0.000 -110.000 23.690 23.540 92.200 -2.500 0.900 1993.000 0.000 -110.000 23.670 23.430 89.900 -2.700 1.100 1993.000 0.000 -110.000 24.320 23.890 88.600 -2.100 0.400 1993.000 0.000 -110.000 24.090 23.790 91.600 -2.300 1.500 1993.000 0.000 -110.000 24.150 na na -3.000 1.900 1993.000 0.000 -95.000 24.990 23.190 na -5.300 1.800 1993.000 0.000 -95.000 25.050 23.500 na -4.700 3.100 1993.000 0.000 -95.000 na na na -5.600 3.100 1993.000 0.000 -95.000 24.930 22.870 na -7.100 2.500 1993.000 0.000 -95.000 24.780 22.400 na -7.300 0.300 1993.000 0.000 -95.000 24.480 22.720 na -6.500 0.000 1993.000 0.000 -95.000 23.960 22.560 na -5.300 3.600 1993.000 0.000 -95.000 23.320 22.640 na -4.000 5.500 1993.000 0.000 -95.000 22.460 22.250 na -2.200 6.300 1993.000 0.000 -95.000 21.940 21.970 na -0.800 4.800 1993.000 0.000 -95.000 21.970 21.810 na -2.200 4.300 1993.000 0.000 -95.000 21.600 21.420 na -2.800 4.100 1993.000 0.000 -95.000 21.860 21.890 na -3.000 3.900 1993.000 0.000 -95.000 21.860 21.850 na -3.200 3.600 1993.000 0.000 -95.000 21.870 21.890 na -3.000 3.100 1993.000 0.000 -95.000 21.960 21.850 na -4.000 2.800 1993.000 0.000 -95.000 22.640 22.090 na -6.300 0.800 1993.000 0.000 -95.000 22.900 22.440 na -5.400 0.100 1993.000 0.000 -95.000 23.080 22.520 na -6.400 -0.400 1993.000 0.000 -95.000 23.240 22.290 na -6.600 1.400 1993.000 0.000 -95.000 na na na -6.300 0.500 1993.000 0.000 -95.000 23.520 22.130 na -5.300 0.700 1993.000 0.000 -95.000 23.370 22.290 na -4.800 1.900 1993.000 0.000 -95.000 22.950 22.170 na -5.400 3.200 1993.000 0.000 -95.000 22.520 21.890 na -5.000 2.300 1993.000 0.000 -95.000 22.320 21.730 na -4.400 2.000 1993.000 0.000 -95.000 22.280 21.660 na -3.700 1.900 1993.000 0.000 -95.000 21.800 21.730 na -1.800 2.700 1993.000 0.000 -95.000 21.850 21.890 na -0.500 3.600 1993.000 0.000 -95.000 21.780 22.010 na -0.300 3.100 1993.000 0.000 -95.000 21.900 22.210 na -1.500 4.100 1993.000 0.000 -95.000 22.970 22.560 na -6.200 1.900 1993.000 0.000 -95.000 23.180 22.720 na -6.700 3.200 1993.000 0.000 -95.000 22.720 22.440 na -5.000 3.600 1993.000 0.000 -95.000 22.510 22.250 na -5.100 3.000 1993.000 0.000 -95.000 22.400 22.250 na -3.200 5.600 1993.000 0.000 -95.000 22.190 22.320 na -1.500 4.900 1993.000 0.000 -95.000 22.030 22.250 na -3.200 4.900 1993.000 0.000 -95.000 21.900 22.090 na -1.500 3.300 1993.000 0.000 -95.000 21.990 22.170 na -1.500 -2.600 1993.000 0.000 -95.000 22.260 22.290 na -2.000 -3.300 1993.000 0.000 -95.000 22.350 22.560 na -3.600 -3.200 1993.000 0.000 -95.000 22.480 22.520 na -4.000 -0.100 1993.000 0.000 -95.000 22.550 22.600 na -2.700 -2.400 1993.000 0.000 -95.000 22.440 22.640 na -3.300 -1.700 1993.000 0.000 -95.000 22.360 22.440 na 1.600 3.800 1993.000 0.000 -95.000 22.550 22.600 na 2.300 3.500 1993.000 0.000 -95.000 22.730 22.840 na 3.000 2.200 1993.000 0.000 -95.000 22.850 22.840 na 3.300 0.200 1993.000 0.000 -95.000 23.110 23.030 na 2.900 -0.100 1993.000 0.000 -95.000 23.330 23.270 na 0.600 -4.300 1993.000 0.000 -95.000 23.360 23.420 na -2.500 0.700 1993.000 0.000 -95.000 23.430 23.390 na -4.200 3.200 1993.000 0.000 -95.000 23.280 23.350 na -2.000 4.100 1993.000 0.000 -95.000 22.990 23.230 na -0.800 4.000 1993.000 0.000 -95.000 23.160 23.270 na -0.800 3.300 1993.000 0.000 -95.000 23.810 23.540 na -2.300 2.900 1993.000 0.000 -95.000 23.800 23.540 na -2.500 3.300 1993.000 0.000 -95.000 23.730 23.700 na -2.000 2.500 1993.000 0.000 -95.000 23.670 23.580 na -4.100 1.800 1993.000 0.000 -95.000 23.770 23.580 na -4.900 1.700 1993.000 0.000 -95.000 23.600 23.460 na -4.900 -0.200 1993.000 0.000 -95.000 24.200 23.700 na -5.000 -0.300 1993.000 0.000 -95.000 24.070 23.860 na -4.400 1.200 1993.000 0.000 -95.000 24.020 23.820 na -4.900 1.000 1993.000 0.000 -95.000 24.650 24.210 na -5.900 0.800 1993.000 0.000 -95.000 24.420 24.010 na -5.800 1.700 1993.000 0.000 -95.000 23.920 23.900 na -3.700 1.800 1993.000 0.000 -95.000 23.560 23.660 na -2.900 3.200 1993.000 0.000 -95.000 23.660 23.740 na -1.900 3.500 1993.000 0.000 -95.000 23.630 23.660 na -2.400 3.100 1993.000 0.000 -95.000 23.520 23.540 na -2.900 3.100 1993.000 0.000 -95.000 23.600 23.540 na -2.600 2.600 1993.000 0.000 -95.000 23.400 23.540 na -3.000 3.300 1993.000 0.000 -95.000 23.460 23.310 na -3.100 1.500 1993.000 0.000 -95.000 23.550 23.390 na -2.200 -0.800 1993.000 0.000 -95.000 24.010 23.740 na -3.300 -1.200 1993.000 0.000 -95.000 23.940 23.900 na -3.500 -1.100 1993.000 0.000 -95.000 24.280 24.010 na -1.800 -1.300 1993.000 0.000 -95.000 24.560 24.170 na -1.700 -1.400 1993.000 0.000 -95.000 24.740 24.050 na -1.800 -1.600 1993.000 0.000 -95.000 25.070 24.640 na -2.700 -2.400 1993.000 0.000 -95.000 25.660 24.960 na -6.000 -1.800 1993.000 0.000 -95.000 26.000 24.920 na -6.900 -0.700 1993.000 0.000 -95.000 25.790 24.600 na -6.600 -1.400 1993.000 0.000 -95.000 26.380 24.840 na -6.200 -1.600 1993.000 0.000 -95.000 25.940 24.880 na -5.700 0.800 1993.000 0.000 -95.000 25.020 24.370 na -2.400 1.100 1993.000 0.000 -95.000 24.610 24.520 na -1.700 1.300 1993.000 0.000 -95.000 24.790 24.760 na -2.000 2.000 1993.000 0.000 -95.000 24.780 24.760 na -1.800 2.300 1993.000 0.000 -95.000 24.790 24.490 na -1.400 3.400 1993.000 -2.000 -95.000 22.660 22.430 85.000 -2.600 3.500 1993.000 -2.000 -95.000 22.610 22.470 88.600 -2.900 4.200 1993.000 -2.000 -95.000 22.540 22.190 90.400 -3.600 4.300 1993.000 -2.000 -95.000 22.650 22.350 88.600 -5.500 4.300 1993.000 -2.000 -95.000 22.540 22.390 85.200 -4.500 4.600 1993.000 -2.000 -95.000 22.480 22.510 84.800 -3.200 4.800 1993.000 -2.000 -95.000 22.460 22.550 86.300 -3.200 4.500 1993.000 -2.000 -95.000 22.430 22.630 85.300 -3.800 4.900 1993.000 -2.000 -95.000 22.440 22.590 88.000 -3.700 5.000 1993.000 -2.000 -95.000 22.530 22.510 88.000 -3.900 4.800 1993.000 -2.000 -95.000 22.640 22.310 87.700 -3.100 4.700 1993.000 -2.000 -95.000 22.610 22.510 85.200 -2.700 5.100 1993.000 -2.000 -95.000 22.590 22.510 81.400 -2.800 5.100 1993.000 -2.000 -95.000 22.750 22.750 79.800 -3.800 5.200 1993.000 -2.000 -95.000 22.630 22.830 81.600 -3.200 4.500 1993.000 -2.000 -95.000 22.500 22.710 84.300 -4.900 3.400 1993.000 -2.000 -95.000 22.390 22.790 87.200 -4.500 3.200 1993.000 -2.000 -95.000 22.340 22.510 88.700 -3.200 3.100 1993.000 -2.000 -95.000 22.310 22.750 86.900 -3.100 4.100 1993.000 -2.000 -95.000 21.990 22.430 85.200 -3.500 5.200 1993.000 -2.000 -95.000 21.840 22.430 82.500 -2.800 3.600 1993.000 -2.000 -95.000 22.040 22.230 84.100 -2.700 3.300 1993.000 -2.000 -95.000 22.200 22.190 85.800 -2.000 2.000 1993.000 -2.000 -95.000 22.330 22.310 86.400 -2.700 3.500 1993.000 -2.000 -95.000 22.310 22.350 86.500 -2.800 4.000 1993.000 -2.000 -95.000 22.370 22.510 87.500 -3.900 2.800 1993.000 -2.000 -95.000 22.430 22.710 85.700 -2.600 3.600 1993.000 -2.000 -95.000 22.620 22.860 86.600 -2.100 4.000 1993.000 -2.000 -95.000 22.700 22.510 88.500 -0.900 3.100 1993.000 -2.000 -95.000 22.830 22.860 88.900 -2.800 4.100 1993.000 -2.000 -95.000 22.770 23.100 90.100 -5.100 3.200 1993.000 -2.000 -95.000 22.760 23.140 90.400 -4.500 4.800 1993.000 -2.000 -95.000 22.690 22.900 88.600 -3.900 4.700 1993.000 -2.000 -95.000 22.710 22.900 83.600 -3.900 3.100 1993.000 -2.000 -95.000 22.810 22.510 86.600 -4.200 1.600 1993.000 -2.000 -95.000 22.830 22.860 87.900 -4.800 4.300 1993.000 -2.000 -95.000 22.760 23.020 89.600 -4.600 4.300 1993.000 -2.000 -95.000 22.680 22.830 90.600 -3.900 3.500 1993.000 -2.000 -95.000 22.690 22.940 90.800 -3.000 4.000 1993.000 -2.000 -95.000 22.810 22.940 90.100 -2.400 3.600 1993.000 -2.000 -95.000 22.890 22.830 88.100 -1.800 3.400 1993.000 -2.000 -95.000 22.800 22.940 88.800 -1.700 4.000 1993.000 -2.000 -95.000 22.990 23.020 88.300 -1.000 4.900 1993.000 -2.000 -95.000 23.140 23.260 84.600 -0.300 4.900 1993.000 -2.000 -95.000 23.150 23.060 80.000 -1.500 5.600 1993.000 -2.000 -95.000 23.200 23.020 79.900 -1.400 4.200 1993.000 -2.000 -95.000 23.260 23.260 86.000 -1.600 4.300 1993.000 -2.000 -95.000 23.320 23.500 91.100 -2.300 3.000 1993.000 -2.000 -95.000 23.190 23.420 88.300 -3.800 3.400 1993.000 -2.000 -95.000 23.240 23.570 91.100 -2.700 2.800 1993.000 -2.000 -95.000 23.390 23.610 91.000 -2.300 3.200 1993.000 -2.000 -95.000 23.410 23.690 89.700 -2.700 4.800 1993.000 -2.000 -95.000 23.490 23.850 86.700 -2.600 4.300 1993.000 -2.000 -95.000 23.580 23.690 86.700 -1.500 5.300 1993.000 -2.000 -95.000 23.690 23.810 85.500 -0.900 5.100 1993.000 -2.000 -95.000 23.780 23.850 85.800 -1.900 3.900 1993.000 -2.000 -95.000 23.820 23.930 88.300 -2.700 3.300 1993.000 -2.000 -95.000 23.840 23.930 90.600 -2.800 2.600 1993.000 -2.000 -95.000 24.100 24.170 90.300 -2.200 2.700 1993.000 -2.000 -95.000 24.120 24.200 89.100 -3.000 3.700 1993.000 -2.000 -95.000 24.120 24.280 88.900 -3.500 3.200 1993.000 -2.000 -95.000 24.160 24.280 88.400 -4.300 2.600 1993.000 -2.000 -95.000 24.080 24.090 88.500 -2.500 2.400 1993.000 -2.000 -95.000 24.030 24.280 89.000 -1.000 2.400 1993.000 -2.000 -95.000 23.910 24.130 90.700 -1.800 3.500 1993.000 -2.000 -95.000 23.960 24.200 90.900 -3.200 3.000 1993.000 -2.000 -95.000 23.950 24.200 91.000 -3.300 3.700 1993.000 -2.000 -95.000 24.010 24.240 89.500 -2.500 3.600 1993.000 -2.000 -95.000 24.050 24.400 90.000 -3.200 3.400 1993.000 -2.000 -95.000 24.070 24.400 89.800 -3.800 4.000 1993.000 -2.000 -95.000 24.080 24.440 88.700 -4.200 3.100 1993.000 -2.000 -95.000 24.000 24.400 89.000 -3.700 3.500 1993.000 -2.000 -95.000 23.980 24.320 88.500 -2.600 3.500 1993.000 -2.000 -95.000 24.020 24.400 88.100 -1.500 5.400 1993.000 -2.000 -95.000 24.150 24.320 83.100 -1.900 4.100 1993.000 -2.000 -95.000 24.430 24.090 81.800 -1.300 1.600 1993.000 -2.000 -95.000 24.620 24.800 84.300 -1.100 4.100 1993.000 -2.000 -95.000 24.430 24.640 88.500 -0.900 3.300 1993.000 -2.000 -95.000 24.760 24.560 88.400 -0.200 2.800 1993.000 -2.000 -95.000 24.930 24.400 89.200 0.600 2.400 1993.000 -2.000 -95.000 24.940 24.520 89.800 -1.500 3.400 1993.000 -2.000 -95.000 24.850 24.440 91.800 -4.000 1.300 1993.000 -2.000 -95.000 24.700 24.910 90.900 -4.300 1.600 1993.000 -2.000 -95.000 24.540 24.800 89.800 -4.400 1.600 1993.000 -2.000 -95.000 na na 89.900 -3.400 2.400 1993.000 -2.000 -95.000 24.590 24.950 91.000 -3.600 2.400 1993.000 -2.000 -95.000 24.710 25.030 89.800 -3.500 3.200 1993.000 -2.000 -95.000 25.110 25.030 91.300 -1.300 0.900 1993.000 -2.000 -95.000 25.140 25.030 89.700 -1.900 3.100 1993.000 -2.000 -95.000 25.210 24.870 90.500 -1.200 3.500 1993.000 -2.000 -95.000 25.430 24.990 89.100 -0.500 3.800 1993.000 -2.000 -95.000 25.570 24.680 87.200 1.300 2.300 1993.000 -2.000 -110.000 24.540 23.780 81.100 -4.800 2.500 1993.000 -2.000 -110.000 24.260 23.660 82.200 -5.000 3.000 1993.000 -2.000 -110.000 23.830 23.620 84.000 -7.000 1.600 1993.000 -2.000 -110.000 23.620 23.540 84.800 -7.800 1.200 1993.000 -2.000 -110.000 23.440 23.260 88.400 -7.300 1.200 1993.000 -2.000 -110.000 23.330 23.540 85.100 -6.200 2.100 1993.000 -2.000 -110.000 23.190 23.380 85.000 -6.100 2.500 1993.000 -2.000 -110.000 23.070 22.980 87.600 -5.300 0.800 1993.000 -2.000 -110.000 23.090 23.220 89.100 -5.000 2.100 1993.000 -2.000 -110.000 23.190 23.260 88.200 -4.800 3.500 1993.000 -2.000 -110.000 23.340 23.300 85.800 -4.900 2.800 1993.000 -2.000 -110.000 23.360 23.420 85.000 -5.400 2.200 1993.000 -2.000 -110.000 23.410 23.460 83.200 -5.600 2.600 1993.000 -2.000 -110.000 23.460 23.380 83.300 -6.100 1.300 1993.000 -2.000 -110.000 23.490 23.340 81.600 -7.200 0.900 1993.000 -2.000 -110.000 23.500 23.300 82.500 -6.800 1.900 1993.000 -2.000 -110.000 23.540 23.420 83.900 -6.800 2.500 1993.000 -2.000 -110.000 23.610 23.380 83.300 -6.100 1.600 1993.000 -2.000 -110.000 23.560 23.340 83.300 -6.100 1.500 1993.000 -2.000 -110.000 23.490 23.380 85.400 -6.300 2.200 1993.000 -2.000 -110.000 23.450 23.420 86.100 -7.100 2.300 1993.000 -2.000 -110.000 23.410 23.380 85.300 -6.700 1.400 1993.000 -2.000 -110.000 23.260 23.300 84.900 -6.500 1.300 1993.000 -2.000 -110.000 23.110 23.180 85.700 -5.200 1.700 1993.000 -2.000 -110.000 22.930 22.980 86.700 -5.600 2.300 1993.000 -2.000 -110.000 22.810 22.860 87.400 -4.200 1.100 1993.000 -2.000 -110.000 22.850 22.940 89.000 -3.100 2.400 1993.000 -2.000 -110.000 22.880 23.020 88.200 -4.700 2.700 1993.000 -2.000 -110.000 22.930 23.100 87.500 -6.500 1.600 1993.000 -2.000 -110.000 22.950 23.060 85.200 -6.700 1.400 1993.000 -2.000 -110.000 23.060 23.100 85.200 -4.700 0.700 1993.000 -2.000 -110.000 23.250 23.300 83.200 -3.400 3.000 1993.000 -2.000 -110.000 23.160 23.380 85.800 -4.000 4.400 1993.000 -2.000 -110.000 23.100 23.340 87.800 -5.600 2.500 1993.000 -2.000 -110.000 23.270 23.380 86.400 -5.000 1.500 1993.000 -2.000 -110.000 23.380 23.500 85.300 -6.000 1.300 1993.000 -2.000 -110.000 23.570 23.820 86.300 -5.700 2.000 1993.000 -2.000 -110.000 23.660 23.620 88.100 -5.300 3.000 1993.000 -2.000 -110.000 23.770 23.900 89.900 -5.200 2.900 1993.000 -2.000 -110.000 23.870 23.660 87.500 -5.900 2.400 1993.000 -2.000 -110.000 23.920 23.900 85.800 -5.500 2.000 1993.000 -2.000 -110.000 23.960 23.940 83.900 -5.100 4.300 1993.000 -2.000 -110.000 24.040 23.820 82.100 -5.600 3.200 1993.000 -2.000 -110.000 23.980 23.740 84.000 -5.900 2.800 1993.000 -2.000 -110.000 24.010 23.780 81.300 -6.800 2.000 1993.000 -2.000 -110.000 24.030 23.740 80.500 -6.900 0.200 1993.000 -2.000 -110.000 23.950 23.660 82.500 -6.400 1.400 1993.000 -2.000 -110.000 23.900 23.620 85.000 -6.500 1.900 1993.000 -2.000 -110.000 23.860 23.780 88.100 -6.100 3.000 1993.000 -2.000 -110.000 23.890 23.860 84.800 -5.200 2.500 1993.000 -2.000 -110.000 23.960 23.700 85.400 -4.200 1.800 1993.000 -2.000 -110.000 23.970 23.780 88.300 -5.400 1.400 1993.000 -2.000 -110.000 23.970 23.660 91.900 -5.200 1.500 1993.000 -2.000 -110.000 23.990 23.740 91.300 -4.500 0.800 1993.000 -2.000 -110.000 23.890 23.900 87.000 -4.400 3.000 1993.000 -2.000 -110.000 23.890 23.860 86.400 -3.900 2.900 1993.000 -2.000 -110.000 23.950 23.900 85.800 -5.800 2.500 1993.000 -2.000 -110.000 23.980 23.940 87.700 -5.100 1.500 1993.000 -2.000 -110.000 24.000 23.940 87.100 -4.400 1.400 1993.000 -2.000 -110.000 24.060 23.980 88.200 -3.400 2.300 1993.000 -2.000 -110.000 24.000 23.980 90.400 -4.700 2.400 1993.000 -2.000 -110.000 24.020 24.100 90.000 -6.000 1.100 1993.000 -2.000 -110.000 24.080 24.260 89.600 -5.400 2.400 1993.000 -2.000 -110.000 24.210 24.180 84.700 -4.400 2.300 1993.000 -2.000 -110.000 24.300 24.340 81.700 -4.600 2.300 1993.000 -2.000 -110.000 24.220 24.540 82.300 -5.000 2.400 1993.000 -2.000 -110.000 24.230 24.420 86.600 -5.100 3.100 1993.000 -2.000 -110.000 24.220 24.380 84.900 -5.800 3.100 1993.000 -2.000 -110.000 24.430 24.340 87.600 -5.000 0.400 1993.000 -2.000 -110.000 24.600 24.460 86.100 -5.000 1.100 1993.000 -2.000 -110.000 24.660 24.180 88.500 -4.900 2.200 1993.000 -2.000 -110.000 24.760 24.500 87.900 -5.500 1.700 1993.000 -2.000 -110.000 24.900 24.620 87.900 -5.000 0.500 1993.000 -2.000 -110.000 24.890 24.580 88.300 -5.500 2.800 1993.000 -2.000 -110.000 24.870 24.730 87.100 -6.500 2.600 1993.000 -2.000 -110.000 24.970 24.970 81.700 -5.600 1.100 1993.000 -2.000 -110.000 25.030 24.620 80.800 -5.700 1.000 1993.000 -2.000 -110.000 24.940 24.580 83.100 -4.300 2.500 1993.000 -2.000 -110.000 24.730 24.380 85.500 -3.300 1.800 1993.000 -2.000 -110.000 24.550 24.420 85.500 -5.000 2.500 1993.000 -2.000 -110.000 24.550 24.340 84.900 -4.800 0.700 1993.000 -2.000 -110.000 24.620 24.420 89.000 -4.500 1.200 1993.000 -2.000 -110.000 24.690 24.700 88.100 -6.000 2.700 1993.000 -2.000 -110.000 24.770 24.700 90.600 -4.700 1.500 1993.000 -2.000 -110.000 24.640 24.660 90.000 -6.300 1.700 1993.000 -2.000 -110.000 24.560 24.660 88.300 -6.300 1.000 1993.000 -2.000 -110.000 24.690 24.660 89.200 -5.400 0.500 1993.000 -2.000 -110.000 24.780 24.620 90.800 -4.400 1.700 1993.000 -2.000 -110.000 24.880 24.500 91.100 -3.000 0.200 1993.000 -2.000 -110.000 25.120 24.890 89.700 -4.000 1.100 1993.000 -2.000 -110.000 25.160 24.930 89.500 -4.300 2.500 1993.000 -2.000 -110.000 25.140 24.770 87.900 -4.600 2.300 ggobi-2.1.12/data/prim7.xml0000644000175000017500000014373314651527764011072 5.752 4.553 1.526 0.156 23.512 -5.530 -0.148 8.000 0.903 0.287 12.087 0.275 13.583 -0.355 -0.388 3.000 1.368 0.694 14.300 0.622 13.784 -0.630 -0.634 3.000 2.759 1.583 2.268 0.392 22.891 -2.327 -0.166 3.000 9.157 0.712 17.297 7.504 2.668 -1.118 -8.649 4.000 8.381 5.306 5.769 1.689 1.379 -0.137 -1.700 0.000 8.205 1.966 1.436 0.994 19.168 -7.043 -0.068 6.000 10.155 4.764 10.248 5.317 8.553 -5.811 -6.348 4.000 14.692 7.297 6.397 2.585 1.753 -0.161 -6.392 0.000 8.168 2.119 1.420 5.544 2.305 -0.680 -0.053 9.000 9.797 0.216 19.683 1.795 1.539 -0.222 -9.903 2.000 13.043 10.003 1.446 0.755 15.530 -12.656 -1.022 8.000 15.959 0.271 12.706 13.007 1.516 -0.984 -16.498 4.000 1.087 0.597 8.994 0.308 20.170 -0.855 -0.256 3.000 2.258 0.905 9.614 1.124 6.426 -0.646 -1.043 3.000 2.968 0.482 11.664 1.940 9.310 -1.049 -0.782 3.000 1.203 0.245 4.242 0.706 6.049 -0.361 -0.174 3.000 0.655 0.414 5.242 0.134 7.716 -0.147 -0.180 3.000 16.764 0.311 11.225 9.034 2.241 -0.868 -17.810 4.000 7.669 1.113 18.067 1.504 1.323 -0.316 -6.238 2.000 3.056 0.996 13.968 0.942 6.181 -0.471 -2.110 3.000 15.052 1.612 3.433 0.230 12.330 -16.491 -0.200 8.000 1.151 0.327 14.594 0.454 14.392 -0.413 -0.787 3.000 12.525 2.410 1.668 1.968 14.733 -10.412 -0.388 8.000 8.457 1.338 1.288 0.495 20.261 -8.221 -0.500 8.000 2.601 0.175 18.715 1.995 4.068 -0.328 -2.239 4.000 3.551 0.083 25.090 1.520 1.980 -0.065 -3.458 2.000 6.913 4.357 2.666 2.161 2.889 -0.203 -0.845 0.000 7.017 1.821 1.361 1.628 15.314 -5.062 -0.076 6.000 1.025 0.527 3.499 0.472 2.703 -0.105 -0.156 3.000 8.425 0.663 5.527 0.605 16.736 -8.091 -0.439 6.000 11.470 1.718 14.470 9.252 2.541 -2.835 -10.851 4.000 10.136 1.214 17.351 0.541 1.581 -0.031 -9.115 2.000 1.620 0.759 4.655 0.240 16.602 -0.670 -0.425 3.000 7.614 3.660 11.939 0.387 2.641 -0.039 -4.132 0.000 8.507 1.945 1.420 0.638 19.259 -7.970 -0.079 6.000 1.565 0.239 16.552 0.718 4.654 -0.427 -0.649 3.000 9.607 3.213 1.314 5.131 5.498 -2.074 -0.066 9.000 9.104 0.312 20.023 8.190 1.530 -0.580 -8.832 4.000 7.800 5.676 5.583 0.966 1.961 -0.040 -1.599 0.000 1.568 0.687 11.831 0.248 3.820 -0.462 -0.506 3.000 6.863 2.648 7.627 3.080 2.684 -0.249 -2.295 0.000 2.446 0.478 6.009 0.620 17.606 -1.658 -2.253 3.000 14.481 5.474 1.622 0.091 14.742 -14.949 -0.274 8.000 11.274 0.836 1.586 0.613 17.714 -10.843 -0.102 8.000 1.514 0.538 18.798 0.367 4.253 -0.063 -1.005 3.000 5.594 0.840 19.825 0.437 1.761 -0.120 -4.484 2.000 4.075 0.321 22.336 3.481 2.561 -0.259 -3.432 4.000 4.132 1.656 13.957 1.001 1.822 -0.066 -2.003 3.000 1.643 0.389 1.839 0.709 11.617 -0.506 -0.855 3.000 9.743 2.871 14.153 0.963 1.407 -0.508 -6.601 2.000 15.294 11.187 1.888 0.369 13.086 -15.564 -1.170 8.000 1.883 0.658 17.210 0.411 7.060 -0.181 -1.384 3.000 1.474 0.576 7.669 0.531 16.056 -0.843 -0.186 3.000 1.590 0.548 10.325 0.964 6.928 -0.721 -1.008 3.000 9.922 0.343 19.008 3.867 1.585 -0.177 -9.798 4.000 4.175 0.516 9.618 2.641 5.176 -0.527 -1.891 3.000 3.801 1.535 7.065 0.549 17.829 -2.019 -1.253 3.000 4.198 1.818 5.258 2.087 1.634 -0.146 -0.511 0.000 7.062 1.222 18.922 0.624 1.471 -0.034 -5.780 2.000 8.827 1.179 18.543 0.360 1.429 -0.017 -7.740 2.000 7.881 0.514 15.683 2.003 6.721 -1.181 -6.848 2.000 1.324 0.640 3.987 0.300 19.680 -0.818 -0.089 3.000 16.887 4.876 2.145 0.876 11.223 -17.124 -0.559 8.000 1.888 1.058 12.023 0.559 15.533 -0.800 -0.848 3.000 2.496 1.691 5.094 0.521 21.711 -1.798 -0.403 3.000 9.459 7.933 2.282 1.149 1.787 -0.132 -0.740 0.000 7.468 1.537 1.260 4.877 4.794 -1.198 -0.261 9.000 1.657 0.844 11.662 0.261 8.793 -0.206 -0.811 3.000 3.395 1.823 5.858 0.646 5.662 -0.841 -0.487 3.000 14.585 0.361 14.457 13.143 1.384 -0.838 -14.723 4.000 0.919 0.578 8.444 0.181 19.816 -0.709 -0.203 3.000 2.507 1.395 7.863 0.481 2.500 -0.140 -0.662 3.000 2.805 0.245 21.891 1.213 5.058 -0.537 -2.068 3.000 1.230 0.101 24.253 0.808 3.419 -0.093 -1.094 3.000 3.094 0.936 2.572 1.751 7.681 -0.725 -0.202 0.000 2.149 0.863 6.259 0.698 18.646 -1.403 -0.230 3.000 0.818 0.101 20.922 0.384 7.267 -0.165 -0.589 3.000 2.954 0.936 6.611 0.435 20.887 -2.144 -0.701 3.000 6.413 1.495 1.599 3.550 7.492 -2.297 -0.139 9.000 13.521 0.495 13.812 5.584 2.120 -0.743 -13.446 4.000 10.211 0.647 1.417 6.212 7.368 -3.705 -0.060 9.000 11.710 8.112 1.470 0.185 17.032 -12.141 -0.552 8.000 6.027 0.537 1.944 4.507 5.878 -1.243 -0.088 9.000 1.319 0.448 9.112 0.684 8.217 -0.832 -0.455 3.000 1.657 0.594 18.465 0.726 9.173 -0.399 -1.070 3.000 14.580 1.096 4.019 11.214 4.055 -4.165 -0.157 9.000 1.593 0.150 5.804 0.384 17.884 -1.129 -0.108 3.000 8.858 0.610 1.548 1.826 16.849 -7.061 -0.019 6.000 1.554 0.437 2.196 0.435 20.038 -1.036 -0.028 3.000 0.928 0.323 18.541 0.510 10.115 -0.318 -0.519 3.000 1.084 0.595 2.713 0.165 19.336 -0.893 -0.084 3.000 2.471 1.463 6.234 0.653 7.014 -0.336 -0.431 3.000 1.455 0.591 16.698 0.089 2.662 -0.099 -0.811 3.000 1.013 0.337 11.962 0.604 9.610 -0.421 -0.397 3.000 16.037 0.212 12.633 11.205 1.595 -1.044 -16.438 4.000 2.956 1.318 2.228 1.373 4.496 -0.461 -0.226 0.000 12.788 3.930 11.839 0.420 1.652 -0.024 -9.094 2.000 1.725 1.098 1.889 0.546 5.087 -0.326 -0.367 3.000 1.446 0.535 16.820 0.103 4.134 -0.286 -0.862 3.000 3.455 0.589 1.270 0.224 25.026 -3.267 -0.079 6.000 0.990 0.585 4.509 0.249 20.776 -0.730 -0.212 3.000 10.056 3.569 2.320 0.305 18.620 -10.218 -0.244 8.000 1.320 0.543 3.872 0.588 3.423 -0.093 -0.174 3.000 1.082 0.508 3.915 0.200 19.792 -0.865 -0.088 3.000 0.933 0.334 18.422 0.455 9.180 -0.280 -0.666 3.000 3.369 1.050 8.924 0.943 17.939 -1.816 -2.274 3.000 20.010 14.755 1.577 0.935 7.130 -21.443 -2.704 8.000 2.118 0.867 16.572 0.299 3.550 -0.794 -1.184 3.000 1.317 0.193 22.191 0.236 2.864 -0.036 -1.025 3.000 14.449 0.603 14.440 4.624 2.015 -0.349 -14.267 4.000 8.050 5.214 2.032 2.466 1.458 -0.076 -0.492 0.000 1.968 0.469 8.122 0.365 12.979 -0.898 -0.630 3.000 1.974 0.364 12.863 0.487 8.081 -0.631 -0.893 3.000 5.248 1.302 18.234 1.531 5.903 -1.039 -3.856 2.000 2.001 1.495 5.040 0.342 22.591 -1.758 -0.532 3.000 4.798 0.725 1.928 0.449 23.002 -4.408 -0.072 6.000 6.946 0.576 20.241 0.612 2.499 -0.049 -6.565 2.000 3.994 0.934 3.741 1.673 14.896 -11.401 -24.245 2.000 2.321 0.771 3.397 0.152 21.216 -1.887 -0.149 3.000 2.325 1.694 5.401 0.429 21.958 -1.788 -0.338 3.000 6.227 2.930 1.676 0.481 21.171 -6.075 -0.596 8.000 11.142 6.766 2.431 0.222 16.274 -12.309 -0.997 8.000 2.036 0.773 1.434 0.223 24.672 -1.779 -0.051 3.000 2.129 0.685 3.603 1.267 2.573 -0.092 -0.344 3.000 0.717 0.285 16.487 0.397 10.977 -0.219 -0.361 3.000 0.972 0.644 5.368 0.117 19.002 -0.804 -0.137 3.000 5.507 3.243 3.622 1.250 4.076 -0.311 -0.946 0.000 2.382 0.275 4.752 1.615 6.565 -0.568 -0.279 3.000 0.892 0.272 3.176 0.564 5.582 -0.143 -0.096 3.000 4.815 0.639 1.597 1.500 17.645 -3.414 -0.514 6.000 6.888 2.197 15.555 0.458 1.558 -0.267 -4.960 2.000 1.869 0.750 17.294 0.176 2.159 -0.241 -1.098 3.000 11.442 9.751 1.295 0.187 18.063 -11.594 -0.488 8.000 11.327 2.852 1.383 0.833 17.021 -10.721 -0.190 8.000 6.211 0.179 22.201 3.155 1.928 -0.331 -6.081 4.000 6.862 0.222 22.552 5.443 1.737 -0.429 -6.592 4.000 5.662 0.416 3.424 1.584 14.554 -4.825 -0.158 6.000 0.867 0.278 15.762 0.471 12.378 -0.347 -0.567 3.000 1.529 0.618 15.296 0.851 9.241 -0.661 -0.941 3.000 1.367 0.677 9.583 0.516 3.697 -0.183 -0.346 3.000 3.187 2.207 3.583 0.936 5.258 -1.371 -0.902 0.000 2.938 0.487 12.772 1.678 10.578 -1.029 -1.460 3.000 8.197 0.205 21.210 4.503 1.610 -0.359 -7.952 4.000 1.648 0.665 11.309 0.732 15.671 -0.883 -1.085 3.000 10.416 3.855 1.445 0.628 17.970 -9.797 -0.150 8.000 2.790 0.972 15.588 0.502 9.500 -0.577 -1.721 3.000 9.514 0.690 1.472 3.383 12.678 -6.117 -0.026 9.000 4.292 0.134 25.525 2.912 1.536 -0.143 -4.151 4.000 2.324 0.594 10.056 0.591 7.038 -0.298 -1.032 3.000 5.095 1.816 1.477 0.089 24.208 -4.961 -0.065 8.000 1.591 0.537 18.334 0.985 9.256 -0.743 -1.097 3.000 3.136 0.907 14.790 0.902 1.555 -0.075 -2.130 3.000 5.958 1.754 2.548 0.418 20.298 -5.629 -0.201 6.000 4.863 0.140 23.552 1.441 2.357 -0.150 -4.609 2.000 11.910 0.231 17.307 9.774 1.357 -0.598 -11.398 4.000 1.883 1.119 10.752 0.082 4.027 -0.095 -0.701 3.000 1.465 0.581 17.409 0.772 10.212 -0.369 -0.852 3.000 1.075 0.451 6.697 0.401 7.394 -0.313 -0.125 3.000 3.177 1.503 1.558 0.216 25.285 -2.904 -0.045 3.000 3.125 2.304 3.336 0.293 23.146 -2.293 -0.784 3.000 14.536 0.439 14.560 13.228 1.337 -1.135 -14.632 4.000 6.036 4.951 3.967 0.433 1.377 -0.030 -0.803 0.000 1.727 0.438 11.123 0.580 8.595 -0.533 -1.190 3.000 17.521 0.417 10.669 14.500 1.301 -1.662 -18.509 4.000 1.287 0.613 2.785 0.606 5.481 -0.116 -0.072 3.000 7.470 1.751 1.338 0.167 21.960 -7.378 -0.057 8.000 13.480 9.047 1.411 0.303 14.956 -13.925 -1.051 8.000 2.847 1.744 1.890 0.560 10.588 -1.073 -0.099 3.000 15.491 7.350 5.418 3.055 9.151 -13.715 -2.892 8.000 7.466 1.729 1.557 5.393 3.020 -0.618 -0.195 9.000 1.432 0.567 4.498 0.749 2.068 -0.347 -0.120 3.000 10.348 1.600 2.051 1.597 15.295 -8.753 -0.270 6.000 13.534 7.421 1.420 0.424 15.035 -12.966 -0.633 8.000 3.127 0.438 20.779 0.661 2.092 -0.047 -2.507 3.000 1.576 0.615 6.562 0.658 5.068 -0.282 -0.258 3.000 0.633 0.214 18.842 0.384 9.094 -0.166 -0.363 3.000 1.031 0.282 13.082 0.482 2.962 -0.173 -0.848 3.000 11.340 9.387 1.589 0.566 17.718 -11.112 -1.037 8.000 4.034 1.150 17.300 0.273 1.927 -0.017 -2.985 3.000 9.949 6.428 1.925 0.632 18.769 -9.227 -0.521 8.000 6.635 3.857 3.310 2.179 1.384 -0.262 -1.223 0.000 1.839 0.376 13.366 0.527 5.526 -8.688 -2.501 0.000 10.127 2.560 1.454 0.128 19.541 -10.108 -0.122 8.000 0.715 0.382 5.787 0.186 15.156 -0.448 -0.144 3.000 5.297 0.371 22.644 0.783 2.006 -0.097 -5.024 2.000 4.941 0.360 1.441 0.781 21.065 -3.853 -0.312 6.000 18.082 4.022 8.171 13.501 3.142 -5.564 -15.521 4.000 9.945 1.489 1.435 7.224 3.446 -1.447 -0.053 9.000 8.679 1.594 2.776 1.506 15.934 -7.337 -0.290 6.000 3.825 0.557 22.084 0.522 1.690 -0.019 -3.277 2.000 10.565 0.627 3.945 3.144 11.131 -9.268 -0.363 6.000 13.047 1.647 14.493 2.043 2.270 -0.543 -11.708 2.000 1.518 0.237 22.650 0.599 4.245 -0.121 -1.160 3.000 1.662 0.378 19.049 0.541 3.109 -0.265 -0.856 3.000 3.510 0.705 1.537 0.815 18.211 -2.616 -0.060 6.000 6.406 0.574 5.339 3.229 10.259 -4.098 -0.188 6.000 15.013 5.227 2.717 9.568 1.489 -0.538 -1.372 3.000 12.515 0.652 16.199 4.006 1.670 -0.500 -12.429 4.000 3.152 1.111 16.985 0.528 2.119 -0.025 -1.942 3.000 6.719 0.744 18.670 5.427 1.998 -0.512 -5.645 4.000 10.087 0.179 19.595 1.980 1.389 -0.044 -10.028 2.000 1.892 0.792 9.098 0.944 13.257 -0.858 -0.725 3.000 1.086 0.507 9.384 0.474 12.008 -0.510 -0.413 3.000 5.091 0.177 23.779 0.698 1.607 -0.054 -4.845 2.000 5.362 0.866 1.841 0.619 20.157 -4.900 -0.050 6.000 9.966 2.140 15.658 0.648 1.411 -0.025 -7.862 2.000 10.207 2.195 15.570 0.656 1.425 -0.027 -8.057 2.000 1.650 0.770 6.375 0.832 3.511 -0.113 -0.284 3.000 3.377 0.390 8.036 0.763 13.518 -1.747 -0.755 3.000 1.129 0.160 3.813 0.559 12.023 -0.453 -0.047 3.000 2.277 1.061 4.389 0.948 2.074 -0.062 -0.332 3.000 5.016 0.181 23.902 0.707 1.862 -0.026 -4.915 2.000 8.711 1.289 1.516 5.216 6.454 -2.616 -0.077 9.000 11.480 9.118 1.738 1.852 1.558 -0.093 -1.030 0.000 5.905 0.254 21.138 3.092 1.632 -0.296 -5.948 4.000 4.896 0.728 5.410 3.674 2.985 -0.729 -0.238 9.000 1.168 0.424 16.435 0.643 12.491 -0.471 -0.618 3.000 1.991 0.609 1.592 0.237 23.963 -1.646 -0.017 3.000 1.497 0.291 3.204 0.170 22.882 -0.941 -0.338 3.000 5.913 2.835 2.467 0.281 22.609 -5.318 -1.136 8.000 5.141 3.289 5.879 0.460 16.363 -3.620 -0.891 3.000 1.203 0.640 10.010 0.425 4.296 -0.307 -0.364 3.000 12.905 1.047 1.650 0.909 15.530 -12.516 -0.443 8.000 6.913 0.304 21.960 1.706 1.508 -0.065 -6.531 2.000 2.018 0.798 6.451 0.707 3.950 -0.201 -0.406 3.000 7.165 0.530 4.968 5.479 3.407 -1.170 -1.150 9.000 2.634 1.312 1.561 1.260 2.301 -0.104 -0.175 3.000 1.264 0.362 7.722 0.820 6.953 -0.622 -0.247 3.000 13.010 0.205 15.111 1.798 3.062 -0.408 -13.809 2.000 9.523 0.260 20.034 3.556 1.565 -0.429 -9.223 2.000 8.354 0.941 19.382 1.694 1.519 -0.143 -7.342 2.000 3.107 1.689 1.739 0.840 15.410 -2.387 -0.522 3.000 2.117 0.886 4.949 0.083 21.633 -1.969 -0.158 3.000 5.444 0.915 20.848 0.536 1.657 -0.034 -4.534 2.000 1.462 0.829 3.534 0.271 12.983 -0.392 -0.219 3.000 11.949 7.672 1.606 0.593 16.896 -11.538 -0.737 8.000 1.049 0.449 14.773 0.569 12.832 -0.440 -0.451 3.000 8.078 0.143 18.825 3.591 2.396 -0.294 -7.543 2.000 1.636 0.651 17.329 0.672 8.170 -0.778 -0.986 3.000 8.095 1.880 1.348 5.875 2.390 -0.539 -0.063 9.000 2.031 0.167 26.124 0.840 1.921 -0.094 -1.790 3.000 6.727 0.507 21.512 2.774 1.576 -0.142 -6.129 2.000 1.825 0.817 12.218 0.926 13.928 -0.816 -0.585 3.000 1.725 0.563 19.111 0.967 6.890 -0.335 -1.108 3.000 1.287 0.584 13.055 0.089 5.913 -0.506 -0.621 3.000 10.986 0.808 3.366 1.159 15.438 -10.695 -0.079 6.000 2.912 0.427 6.751 1.830 3.852 -0.950 -0.275 3.000 2.340 0.282 22.250 0.950 3.700 -0.138 -1.899 3.000 11.129 1.305 15.638 0.658 2.605 -0.152 -9.979 2.000 11.193 1.301 15.778 0.662 2.587 -0.147 -10.048 2.000 2.064 0.562 20.482 0.751 4.204 -0.142 -1.402 3.000 1.029 0.377 14.381 0.457 11.082 -1.296 -0.825 3.000 8.580 0.586 1.655 2.250 15.506 -6.201 -0.060 6.000 8.407 0.452 20.115 6.686 1.519 -0.579 -8.063 4.000 9.701 0.684 1.956 1.393 17.398 -8.648 -0.106 6.000 3.851 0.661 3.332 3.037 1.777 -0.393 -0.080 3.000 9.126 0.816 2.156 1.412 16.518 -7.820 -0.080 6.000 3.929 1.533 11.576 1.114 1.536 -0.152 -1.399 3.000 2.905 2.241 2.040 0.592 1.410 -0.014 -0.107 0.000 7.644 3.100 1.554 0.550 20.985 -7.047 -0.100 8.000 20.604 1.018 6.524 16.744 1.704 -3.355 -21.599 4.000 1.542 0.693 5.077 0.482 5.336 -0.385 -0.168 3.000 1.450 0.576 12.529 0.235 6.985 -0.327 -0.600 3.000 1.194 0.598 6.725 0.493 15.383 -0.509 -0.149 3.000 1.619 0.085 17.149 0.837 6.426 -0.229 -1.306 3.000 3.400 1.896 1.914 0.567 18.837 -2.407 -0.109 3.000 13.611 2.688 12.387 0.866 1.926 -0.040 -11.235 2.000 1.777 0.603 13.704 0.434 2.793 -0.248 -0.693 3.000 2.509 0.356 22.502 0.483 4.738 -1.513 -1.525 3.000 16.065 4.345 2.109 0.666 12.920 -16.050 -0.478 8.000 4.528 0.153 24.972 1.003 1.457 -0.849 -4.126 2.000 1.735 0.905 4.998 0.783 3.181 -0.121 -0.194 3.000 3.767 0.873 20.019 2.666 7.380 -0.990 -2.836 4.000 4.325 2.281 1.472 1.938 1.884 -0.092 -0.231 0.000 11.351 2.137 1.503 8.697 2.313 -0.870 -0.070 9.000 1.320 0.681 6.307 0.149 19.987 -0.892 -0.200 3.000 1.792 0.362 18.186 0.656 9.466 -0.718 -0.905 3.000 11.845 0.249 16.957 6.385 2.119 -0.660 -11.776 4.000 1.807 0.475 11.821 0.582 3.975 -0.098 -0.993 3.000 1.089 0.499 2.383 0.115 22.897 -1.055 -0.153 3.000 1.867 0.588 6.771 0.212 14.201 -1.549 -0.167 3.000 3.405 1.724 11.063 0.598 1.696 -0.090 -1.585 3.000 2.198 0.569 16.445 0.369 10.225 -1.215 -1.008 3.000 15.087 12.755 1.309 0.483 13.868 -15.209 -1.032 8.000 1.477 0.602 14.989 0.619 13.902 -0.844 -0.670 3.000 9.886 0.427 1.475 0.815 18.471 -9.220 -0.025 6.000 10.398 0.533 1.542 5.705 8.479 -4.865 -0.079 9.000 7.493 0.215 22.187 4.048 1.507 -0.198 -7.304 4.000 9.538 1.737 1.518 1.650 16.979 -7.877 -0.124 6.000 3.997 0.526 20.126 2.835 1.804 -1.097 -3.770 4.000 2.341 0.404 16.306 1.812 4.712 -0.325 -1.432 3.000 10.319 6.883 6.046 2.420 14.474 -7.881 -2.848 8.000 1.528 0.697 3.536 0.236 24.648 -1.298 -0.091 3.000 16.406 2.529 9.065 0.605 4.004 -0.102 -15.762 2.000 0.771 0.517 8.124 0.158 15.503 -0.426 -0.186 3.000 2.690 0.623 19.555 0.739 4.841 -0.170 -2.286 3.000 3.977 0.524 1.745 1.263 17.951 -2.665 -0.088 6.000 4.293 0.488 5.804 0.618 19.888 -3.824 -0.275 6.000 2.973 2.167 7.606 0.409 8.869 -0.661 -0.738 3.000 8.233 0.265 21.210 6.021 1.389 -0.452 -8.087 4.000 8.396 2.502 1.679 5.494 1.771 -0.523 -0.145 9.000 6.148 4.623 1.406 1.375 1.599 -0.083 -0.458 0.000 9.639 3.671 2.862 0.366 17.353 -10.913 -0.956 8.000 1.197 0.347 20.504 0.566 4.832 -0.133 -0.799 3.000 19.350 0.453 3.674 3.689 7.083 -17.618 -0.057 8.000 6.203 1.484 1.379 0.317 22.892 -5.896 -0.031 8.000 6.065 2.739 1.611 0.660 21.445 -5.372 -0.195 8.000 7.509 0.662 2.308 1.800 17.283 -5.875 -0.036 6.000 1.361 0.582 8.026 0.672 4.151 -0.252 -0.218 3.000 4.974 2.316 8.822 0.585 16.382 -3.299 -1.506 3.000 4.756 2.106 11.684 0.756 1.541 -0.216 -1.937 2.000 9.906 0.561 1.408 7.699 4.260 -1.932 -0.022 9.000 2.751 1.120 5.400 0.634 8.547 -0.448 -0.739 3.000 2.544 0.252 3.832 1.449 8.698 -0.976 -0.091 3.000 4.494 2.089 12.425 0.204 2.875 -0.095 -2.271 2.000 2.224 0.734 4.639 0.707 16.828 -1.501 -0.294 3.000 13.920 1.087 3.605 9.758 5.144 -4.592 -0.356 9.000 15.119 2.692 1.817 0.688 13.662 -14.648 -0.165 8.000 16.811 0.317 12.225 10.239 1.518 -1.071 -17.067 4.000 2.545 1.677 4.414 0.712 1.621 -0.132 -0.400 0.000 16.326 1.800 11.568 9.796 2.103 -2.254 -15.105 4.000 0.647 0.249 9.497 0.356 10.364 -0.264 -0.201 3.000 7.552 0.597 1.443 1.667 17.080 -5.820 -0.037 6.000 7.149 1.725 6.062 1.383 15.652 -3.603 -3.545 6.000 10.480 0.372 18.406 5.751 1.491 -0.863 -10.646 4.000 10.579 0.083 18.467 4.335 1.789 -0.326 -11.077 4.000 8.966 2.769 1.336 0.273 19.983 -8.921 -0.134 8.000 13.677 1.178 14.207 6.626 1.480 -1.139 -13.074 4.000 4.951 3.749 4.148 0.559 1.341 -0.209 -0.682 0.000 1.658 1.019 8.989 0.223 12.988 -0.174 -1.033 3.000 0.813 0.455 9.538 0.131 3.349 -0.059 -0.238 3.000 2.393 0.913 1.418 0.137 26.417 -2.197 -0.039 3.000 2.437 0.963 6.627 0.619 6.137 -0.282 -0.675 3.000 1.507 1.136 5.439 0.208 19.837 -0.832 -0.380 3.000 5.814 4.403 3.471 0.468 3.697 -0.300 -0.854 0.000 7.735 3.029 1.444 1.044 18.790 -6.632 -0.209 8.000 10.803 4.004 12.395 0.451 1.533 -0.024 -6.873 2.000 10.802 3.971 12.470 0.544 1.527 -0.025 -6.870 2.000 6.246 0.637 4.026 4.823 2.834 -1.236 -0.102 9.000 0.983 0.351 10.843 0.314 16.850 -0.763 -0.624 3.000 2.149 0.962 1.907 0.193 22.007 -1.800 -0.049 3.000 1.224 0.525 8.179 0.585 8.676 -0.690 -0.688 3.000 12.327 0.529 16.327 9.681 1.293 -0.817 -12.133 4.000 6.496 3.092 10.997 0.579 1.642 -0.157 -3.381 2.000 1.068 0.643 6.221 0.327 15.090 -0.386 -0.338 3.000 9.471 1.031 1.520 7.093 3.761 -1.511 -0.069 9.000 7.787 0.985 15.900 6.161 2.868 -2.259 -8.188 4.000 12.655 1.445 15.267 1.267 1.566 -0.570 -11.532 2.000 10.662 9.235 2.286 0.747 1.439 -0.067 -1.001 0.000 1.122 0.666 6.394 0.352 17.435 -0.858 -0.440 3.000 5.462 1.985 2.108 1.221 17.858 -4.912 -1.803 8.000 2.814 0.102 26.024 1.787 1.498 -0.061 -2.633 4.000 6.745 0.107 22.502 2.082 1.650 -0.199 -6.397 2.000 4.795 1.518 1.480 0.093 24.714 -4.317 -0.436 8.000 2.115 0.891 1.488 1.122 4.138 -0.170 -0.034 3.000 4.700 2.559 1.660 0.237 24.486 -4.453 -0.129 8.000 11.481 3.418 12.958 0.852 1.542 -0.026 -7.984 2.000 1.365 0.738 10.750 0.425 18.069 -0.843 -0.404 3.000 2.811 1.734 1.440 0.542 14.424 -1.287 -0.080 3.000 3.258 0.696 2.957 1.479 8.749 -1.125 -1.052 3.000 2.737 1.932 7.982 0.345 8.471 -0.900 -0.698 3.000 13.855 1.310 11.757 4.567 2.072 -1.180 -14.279 4.000 7.032 0.595 20.452 2.831 2.435 -0.837 -6.160 2.000 2.417 1.136 6.021 0.830 7.264 -1.099 -0.361 3.000 9.357 1.272 17.137 1.388 1.497 -0.035 -8.058 2.000 14.987 0.993 12.912 4.843 2.030 -0.464 -14.469 4.000 7.379 4.987 1.599 0.157 21.946 -7.094 -0.258 8.000 5.704 0.183 23.203 4.333 1.446 -0.131 -5.447 4.000 2.281 1.081 11.066 0.431 2.406 -0.036 -0.921 3.000 9.075 0.609 1.362 3.298 13.140 -5.786 -0.033 9.000 0.547 0.144 21.600 0.220 4.976 -0.104 -0.348 3.000 6.176 1.975 1.756 3.931 3.747 -0.574 -0.156 9.000 1.341 0.812 9.545 0.364 9.558 -0.302 -0.367 3.000 1.735 0.423 13.390 0.421 5.020 -0.529 -0.507 3.000 3.170 0.298 24.808 0.803 1.454 -0.069 -2.785 2.000 1.196 0.652 2.156 0.166 22.386 -1.027 -0.085 3.000 5.817 1.488 18.260 2.733 6.038 -1.961 -4.112 3.000 2.967 0.464 13.827 0.887 13.541 -1.741 -1.046 3.000 3.617 0.990 1.423 2.146 6.874 -0.713 -0.029 3.000 14.468 2.747 12.348 1.045 1.795 -0.065 -11.865 2.000 7.140 0.710 1.433 3.355 11.758 -3.662 -0.071 9.000 2.959 0.880 13.725 0.477 13.654 -1.023 -1.758 3.000 10.220 0.303 18.724 8.542 1.607 -0.708 -10.441 4.000 4.310 1.781 5.387 0.208 19.585 -3.550 -0.630 6.000 1.676 0.721 8.715 0.670 10.698 -0.554 -0.294 3.000 8.404 0.480 4.172 0.779 17.756 -8.415 -0.071 6.000 2.198 0.109 5.805 0.837 15.491 -1.620 -0.031 3.000 2.277 0.540 18.400 0.611 1.821 -0.042 -1.692 3.000 1.795 1.090 3.737 0.490 7.047 -0.469 -0.372 3.000 2.963 0.384 5.152 1.260 10.136 -0.889 -0.572 3.000 14.154 1.715 1.814 11.781 1.853 -1.164 -0.066 9.000 1.871 0.427 14.402 1.038 8.771 -0.703 -0.637 3.000 11.936 2.551 1.482 6.854 5.220 -3.593 -0.081 9.000 3.983 0.199 25.181 1.585 1.517 -0.040 -3.762 2.000 7.612 4.473 1.343 0.300 21.686 -7.390 -0.236 8.000 3.035 0.538 10.449 1.785 2.619 -0.481 -1.192 3.000 1.063 0.596 5.233 0.380 12.118 -0.886 -0.595 3.000 12.571 0.526 16.531 7.138 1.617 -0.581 -12.276 4.000 0.571 0.258 14.904 0.256 8.160 -0.085 -0.231 3.000 13.185 4.168 11.362 0.605 1.638 -0.031 -9.229 2.000 1.126 0.598 2.634 0.270 16.101 -0.865 -0.204 3.000 0.808 0.194 15.041 0.343 3.839 -0.058 -0.562 3.000 5.735 0.314 22.113 3.612 3.061 -0.353 -5.568 4.000 1.231 0.456 15.779 0.427 13.310 -0.532 -0.590 3.000 10.860 0.372 18.601 8.937 1.515 -0.494 -10.583 4.000 1.816 0.483 2.885 0.727 16.663 -1.027 -0.135 3.000 1.647 0.535 11.223 0.813 5.981 -0.838 -0.478 3.000 3.815 1.678 5.402 1.806 1.233 -0.085 -0.925 0.000 20.608 12.014 2.211 2.923 6.294 -19.564 -4.601 8.000 14.495 0.460 14.409 8.000 1.361 -0.876 -14.488 4.000 7.160 1.284 13.053 3.526 1.598 -0.157 -3.980 9.000 1.039 0.449 6.902 0.121 18.685 -0.875 -0.115 3.000 1.056 0.468 16.518 0.451 10.309 -0.381 -0.567 3.000 1.196 0.414 16.990 0.615 7.946 -0.213 -0.725 3.000 6.513 3.079 1.513 2.280 8.598 -2.340 -0.175 0.000 1.395 0.293 11.719 0.678 4.327 -0.331 -0.427 3.000 2.149 0.354 19.006 0.368 4.358 -0.149 -1.519 3.000 1.334 0.754 9.401 0.521 16.161 -0.981 -0.592 3.000 4.972 1.637 11.029 0.879 9.976 -2.042 -1.659 3.000 11.476 0.408 16.533 0.614 2.916 -0.069 -12.031 2.000 5.406 0.777 21.064 0.614 1.233 -0.078 -4.701 2.000 9.170 0.371 19.567 7.832 1.585 -0.563 -9.026 4.000 12.878 2.408 1.572 0.499 16.019 -12.455 -0.165 8.000 4.437 1.518 15.483 1.512 1.638 -0.046 -2.342 3.000 10.227 1.178 1.542 0.277 18.910 -9.725 -0.963 8.000 1.825 0.382 3.730 0.653 12.369 -1.150 -0.149 3.000 2.442 0.788 13.170 0.503 15.206 -1.720 -0.794 3.000 4.217 1.147 16.042 0.180 7.216 -0.062 -4.003 3.000 1.278 0.621 8.961 0.179 12.951 -0.850 -0.297 3.000 13.232 6.243 7.341 3.199 1.621 -0.127 -5.645 0.000 2.868 1.943 1.950 0.169 25.107 -2.652 -0.101 3.000 0.906 0.327 15.197 0.462 7.703 -0.163 -0.359 3.000 0.643 0.264 13.267 0.304 14.812 -0.357 -0.373 3.000 11.098 3.462 1.386 0.467 17.826 -10.705 -0.097 8.000 0.727 0.257 14.027 0.330 5.333 -0.087 -0.432 3.000 1.829 0.442 10.389 0.346 17.833 -1.397 -0.384 3.000 2.447 0.811 16.300 0.154 4.045 -0.289 -1.376 3.000 11.905 0.937 2.387 0.477 16.158 -12.494 -0.328 8.000 1.358 0.610 12.780 0.627 15.615 -0.722 -0.502 3.000 11.224 0.345 18.163 8.492 1.727 -0.587 -10.760 4.000 14.880 0.910 13.323 13.153 1.526 -1.664 -14.695 4.000 10.209 0.428 18.735 7.838 1.369 -0.407 -9.886 4.000 1.490 0.357 8.267 0.768 13.807 -0.717 -0.210 3.000 2.533 1.084 10.684 0.437 7.050 -0.239 -1.176 3.000 8.219 0.485 21.090 1.249 1.306 -0.113 -7.613 2.000 1.844 1.065 11.428 0.690 16.643 -0.991 -0.718 3.000 1.986 0.479 9.513 1.021 4.041 -0.176 -0.584 3.000 16.945 11.696 1.486 0.623 11.691 -17.113 -1.134 8.000 2.837 1.359 1.501 1.168 5.024 -0.448 -0.049 0.000 17.197 11.859 1.373 1.010 10.439 -15.175 -0.657 8.000 0.838 0.308 18.565 0.326 7.292 -0.116 -0.528 3.000 3.228 0.291 15.403 0.827 11.431 -0.957 -2.457 3.000 2.404 0.298 22.876 0.733 2.943 -0.091 -1.970 3.000 1.223 0.310 17.423 0.411 6.816 -0.164 -1.046 3.000 2.772 0.362 20.292 0.336 6.989 -1.500 -1.800 3.000 7.365 2.545 1.870 4.569 1.357 -0.172 -0.352 9.000 5.242 2.302 1.892 0.477 20.782 -4.165 -0.260 8.000 10.237 1.146 2.975 7.873 3.429 -2.280 -0.235 9.000 4.291 0.251 23.221 0.671 1.865 -0.118 -3.843 2.000 17.732 8.699 2.060 0.236 10.372 -16.869 -1.118 8.000 11.091 9.486 1.447 0.434 17.932 -11.000 -0.992 8.000 4.521 1.771 10.047 0.377 14.063 -2.772 -1.381 3.000 4.732 0.614 1.302 0.624 21.585 -4.040 -0.024 6.000 1.844 0.874 1.721 0.913 3.366 -0.110 -0.029 3.000 10.476 8.693 1.460 0.188 18.589 -10.316 -0.402 8.000 3.296 1.522 8.572 0.264 14.145 -1.548 -0.952 3.000 1.945 1.069 1.866 0.638 8.476 -0.355 -0.088 0.000 5.597 0.166 24.186 4.074 1.568 -0.148 -5.454 4.000 0.707 0.401 10.558 0.148 4.630 -0.040 -0.218 3.000 1.853 0.197 24.732 0.298 2.602 -0.760 -1.608 3.000 13.168 0.578 1.644 1.086 15.300 -12.383 -0.023 8.000 1.912 0.610 4.960 0.339 14.281 -1.471 -0.108 3.000 15.578 1.042 11.826 5.966 3.315 -2.618 -14.497 4.000 12.994 10.479 1.686 0.252 15.880 -13.855 -1.391 8.000 1.896 0.453 18.563 0.148 3.961 -0.049 -1.602 3.000 2.717 0.575 5.276 1.719 2.710 -0.200 -0.909 3.000 1.771 0.579 11.904 0.442 12.574 -1.225 -0.687 3.000 12.370 0.519 16.180 10.452 1.769 -1.062 -12.491 4.000 1.280 0.597 15.480 0.514 11.556 -0.604 -0.662 3.000 1.584 0.494 4.040 0.887 9.738 -0.421 -0.074 3.000 1.508 0.315 22.545 0.935 4.597 -0.410 -1.279 3.000 4.899 0.510 22.584 2.324 2.569 -1.133 -4.476 4.000 1.936 0.735 1.576 0.425 19.665 -1.420 -0.051 3.000 2.449 0.594 20.769 1.471 5.808 -21.900 -6.769 3.000 7.920 1.671 1.248 5.782 2.799 -0.613 -0.046 9.000 2.996 1.152 12.280 1.503 13.723 -1.609 -0.894 3.000 1.547 0.698 2.443 0.596 5.891 -0.523 -0.424 3.000 1.752 0.451 6.557 1.174 1.943 -0.450 -0.135 3.000 2.622 0.752 16.277 0.311 6.925 -0.396 -1.588 3.000 1.940 0.442 9.895 1.435 3.262 -0.154 -0.369 3.000 12.202 10.858 1.951 0.587 1.724 -0.246 -0.947 0.000 13.713 3.514 1.605 1.074 14.052 -12.974 -0.391 8.000 2.184 0.914 3.493 0.122 25.414 -2.069 -0.197 3.000 6.550 0.145 22.422 4.733 1.594 -0.204 -6.506 4.000 7.449 1.264 17.803 1.481 1.486 -0.041 -6.027 2.000 4.079 0.290 12.226 2.769 2.948 -0.581 -1.510 3.000 4.356 2.718 1.530 1.311 3.867 -0.335 -0.150 0.000 6.098 0.486 15.387 3.946 4.356 -0.928 -5.210 4.000 7.422 1.363 18.037 4.667 4.642 -1.180 -6.115 4.000 ggobi-2.1.12/data/algal-bloom.xml0000644000175000017500000002745214651527764012221 Data from Box, Hunter and Hunter "Statistics for Experimenters" Wiley 1978 p. 442-3 "This investigation was concerned with the study of the growth of algal blooms and the effects of phosphorus, nitrogen, and carbon on algae growth. A 2^3 factorial experiment was performed, using laboratory batch cultures of blue-green Microcystis aeruginosa. Carbon (as bi- carbonate), phosphorus (as phosphate), and nitrogen (as nitrate) were the variable factors. The response was algal population, measured spectrophotometrically." The responses are measured in some absorbance units. (Source: R. W. Mann, "Significance of Phosphorus, Nitrogen and Carbon as Regulators of the Growth of the Alga Microcystis aeruginosa," Master's Thesis, Department of Civil Engineering, Tufts University, Medford, Mass., June 1971.) 1 2 3 4 5 6 7 8 low high low high low high 1 0 0 0 0.312 0.448 0.576 0.326 2 1 0 0 0.391 0.242 0.309 0.323 3 0 1 0 0.412 0.434 0.280 0.481 4 1 1 0 0.376 0.251 0.201 0.312 5 0 0 1 0.479 0.639 0.656 0.679 6 1 0 1 0.481 0.583 0.631 0.648 7 0 1 1 0.465 0.657 0.736 0.680 8 1 1 1 0.451 0.768 0.814 0.799 1 2 3 4 5 6 7 8 low high low high low high 1 0 0 0 0.312 4 2 1 0 0 0.391 4 3 0 1 0 0.412 4 4 1 1 0 0.376 4 5 0 0 1 0.479 4 6 1 0 1 0.481 4 7 0 1 1 0.465 4 8 1 1 1 0.451 4 1 0 0 0 0.200 4 2 1 0 0 0.200 4 3 0 1 0 0.200 4 4 1 1 0 0.200 4 5 0 0 1 0.200 4 6 1 0 1 0.200 4 7 0 1 1 0.200 4 8 1 1 1 0.200 4 1 0 0 0 0.448 6 2 1 0 0 0.242 6 3 0 1 0 0.434 6 4 1 1 0 0.251 6 5 0 0 1 0.639 6 6 1 0 1 0.583 6 7 0 1 1 0.657 6 8 1 1 1 0.768 6 1 0 0 0 0.200 6 2 1 0 0 0.200 6 3 0 1 0 0.200 6 4 1 1 0 0.200 6 5 0 0 1 0.200 6 6 1 0 1 0.200 6 7 0 1 1 0.200 6 8 1 1 1 0.200 6 1 0 0 0 0.576 8 2 1 0 0 0.309 8 3 0 1 0 0.280 8 4 1 1 0 0.201 8 5 0 0 1 0.656 8 6 1 0 1 0.631 8 7 0 1 1 0.736 8 8 1 1 1 0.814 8 1 0 0 0 0.200 8 2 1 0 0 0.200 8 3 0 1 0 0.200 8 4 1 1 0 0.200 8 5 0 0 1 0.200 8 6 1 0 1 0.200 8 7 0 1 1 0.200 8 8 1 1 1 0.200 8 1 0 0 0 0.326 10 2 1 0 0 0.323 10 3 0 1 0 0.481 10 4 1 1 0 0.312 10 5 0 0 1 0.679 10 6 1 0 1 0.648 10 7 0 1 1 0.680 10 8 1 1 1 0.799 10 1 0 0 0 0.200 10 2 1 0 0 0.200 10 3 0 1 0 0.200 10 4 1 1 0 0.200 10 5 0 0 1 0.200 10 6 1 0 1 0.200 10 7 0 1 1 0.200 10 8 1 1 1 0.200 10 ggobi-2.1.12/data/sat.xml0000644000175000017500000002062314651527764010613 SAT Scores Many administrators, teachers and parents perceive a "crisis in education" in the USA. Learned skills and test scores suggest lower achievement by students both over time and compared to their counterparts around the world. Much of the concern is whether our children will be able to compete in a global economy if they are underprepared to meet the challenges of the coming decades. Using the SAT scores of high school children as a measure of educational achievement, does it appear that the level of financial resources committed to schools in the U.S. influence educational success? What does influence SAT scores of U.S. students? The data contains 51 observations on the states and 10 variables for the school year 1988-1989. The variables in order are: OBS record number in file SAT Average combined verbal/math score (400-1600) EXPEND Total expenditure for elementary and secondary public education used for instructional, noninstructional and support services in thousands of dollars. PERPUPIL Total amount ($) per pupil ENROLL Enrollment, Fall 1988 TEACHERS Total number of teachers, measured in full-time equivalents ATTEND Average daily attendance RATIO Pupil/Teacher ratio SALARY Average teacher salary COMPUTER Total number of personal computers STATE State, in alphabetical order 1.000 1022.000 2188020.000 3197.000 724751.000 38845.000 18.700 25190.000 684453.000 28353.000 2.000 923.000 739020.000 7716.000 106481.000 6272.000 17.000 41754.000 95776.000 8806.000 3.000 853.000 2143148.000 3902.000 574890.000 31617.000 18.200 28499.000 549219.000 31676.000 4.000 986.000 1319370.000 3272.000 436387.000 27730.000 15.700 21395.000 403106.000 17734.000 5.000 906.000 19370242.000 4121.000 4618120.000 203342.000 22.700 34684.000 4699865.000 186468.000 6.000 966.000 2266667.000 4408.000 560081.000 31398.000 17.800 29558.000 514232.000 32212.000 7.000 908.000 2984542.000 6857.000 460637.000 35502.000 13.000 37343.000 435227.000 21188.000 8.000 903.000 479327.000 5422.000 96678.000 5898.000 16.400 31585.000 88397.000 3328.000 9.000 846.000 584035.000 7850.000 84792.000 5936.000 14.300 36290.000 74398.000 3695.000 10.000 887.000 7245515.000 4563.000 1720930.000 100370.000 17.100 26974.000 1587882.000 86267.000 11.000 847.000 4006069.000 3852.000 1107994.000 59916.000 18.500 26920.000 1039977.000 45715.000 12.000 888.000 643319.000 4121.000 167488.000 8737.000 19.200 30778.000 156114.000 4621.000 13.000 965.000 571159.000 2838.000 214615.000 10425.000 20.600 22734.000 201219.000 8442.000 14.000 982.000 7655153.000 4906.000 1794916.000 105097.000 17.100 31145.000 1560461.000 66679.000 15.000 871.000 3779468.000 4284.000 960994.000 54029.000 17.800 29331.000 882175.000 45439.000 16.000 1084.000 1925623.000 4285.000 478200.000 30327.000 15.800 25778.000 449418.000 25340.000 17.000 1040.000 1712260.000 4443.000 426596.000 28122.000 15.200 27360.000 385364.000 21653.000 18.000 996.000 1918741.000 3347.000 637627.000 35788.000 17.800 24930.000 573221.000 27125.000 19.000 986.000 2468307.000 3317.000 786683.000 43203.000 18.200 22470.000 744142.000 27301.000 20.000 987.000 921931.000 4744.000 212902.000 14593.000 14.600 24938.000 194350.000 9126.000 21.000 914.000 3505018.000 5758.000 688947.000 40899.000 16.800 33895.000 608699.000 33574.000 22.000 905.000 4522119.000 5979.000 823428.000 60068.000 13.700 32221.000 756285.000 40731.000 23.000 972.000 7493266.000 5116.000 1582785.000 79847.000 19.800 34823.000 1464766.000 69821.000 24.000 1066.000 3282296.000 4755.000 726950.000 42750.000 17.000 30660.000 690266.000 59184.000 25.000 988.000 1372290.000 2874.000 503326.000 27283.000 18.400 22578.000 477439.000 10890.000 26.000 989.000 3096666.000 4263.000 806639.000 50693.000 15.900 26006.000 726451.000 35121.000 27.000 992.000 592454.000 4293.000 152191.000 9626.000 15.800 24421.000 138016.000 9004.000 28.000 1030.000 1105009.000 4360.000 269434.000 18003.000 15.000 23845.000 253426.000 12785.000 29.000 926.000 615161.000 3791.000 176474.000 8699.000 20.300 28840.000 162256.000 8446.000 30.000 932.000 733230.000 4807.000 169413.000 10442.000 16.200 26702.000 152536.000 4484.000 31.000 894.000 7309147.000 7549.000 1080871.000 79698.000 13.600 33037.000 968176.000 52330.000 32.000 1015.000 975552.000 3437.000 292425.000 15770.000 18.500 23897.000 280921.000 19192.000 33.000 890.000 17127584.000 7663.000 2573715.000 172807.000 14.900 36654.000 2234976.000 139032.000 34.000 836.000 3892971.000 3874.000 1083156.000 61933.000 17.500 25738.000 1004837.000 64245.000 35.000 1067.000 431814.000 3952.000 118809.000 7731.000 15.400 22249.000 109271.000 5537.000 36.000 948.000 7425194.000 4649.000 1778544.000 101021.000 17.600 29671.000 1597117.000 72839.000 37.000 1001.000 1822743.000 3379.000 580426.000 35116.000 16.500 22370.000 542693.000 25762.000 38.000 927.000 2123241.000 5182.000 461752.000 25147.000 18.400 29390.000 409717.000 23961.000 39.000 886.000 8597355.000 5609.000 1659714.000 104379.000 15.900 31248.000 1532806.000 6994.000 40.000 895.000 736942.000 5976.000 133585.000 9216.000 14.500 34233.000 123321.000 4903.000 41.000 838.000 2118732.000 3736.000 615774.000 35877.000 17.200 25623.000 567133.000 30784.000 42.000 1041.000 427522.000 3581.000 126910.000 8260.000 15.400 20530.000 119400.000 9378.000 43.000 1009.000 2668341.000 3491.000 821580.000 42657.000 19.300 25619.000 764354.000 29817.000 44.000 877.000 11761447.000 3877.000 3283707.000 196616.000 16.700 26527.000 3033684.000 152835.000 45.000 1036.000 1040104.000 2579.000 43119.000 17602.000 24.500 22852.000 403294.000 18776.000 46.000 905.000 485226.000 5481.000 93381.000 6852.000 13.600 27092.000 88532.000 3147.000 47.000 902.000 4151050.000 4539.000 982393.000 60883.000 16.100 28967.000 914445.000 52214.000 48.000 939.000 3204265.000 4352.000 790918.000 38780.000 20.400 29199.000 736345.000 41840.000 49.000 939.000 1202486.000 3883.000 335912.000 22177.000 15.100 21904.000 309691.000 17170.000 50.000 1013.000 3688311.000 5266.000 774857.000 48541.000 16.000 30779.000 700389.000 39970.000 51.000 978.000 491930.000 5375.000 97793.000 6693.000 14.600 27685.000 91515.000 7566.000 ggobi-2.1.12/data/roos.xml0000644000175000017500000007720114651527764011012 data on kangaroos in australia, which comes from the Andrews and Herzberg Data book. the problem is that there are 3 historical skulls (housed in different museums in europe) whose species identification got lost somewhere along the line. so measurements were collected from 3 different species, both males and females from herds near where the originals were collected in order to identify the historical skulls. one complication is that kangaroo skulls keep growing throughout life and they can be affected by diet. the historical skulls came from kangaroos transported to europe in the late 1800s fed on a bread and beer diet! 1.000 1.000 0.000 1312.000 1445.000 882.000 na 609.000 241.000 180.000 394.000 782.000 249.000 227.000 531.000 153.000 88.000 1086.000 131.000 179.000 591.000 2.000 1.000 0.000 1439.000 1503.000 985.000 230.000 629.000 222.000 150.000 416.000 824.000 233.000 248.000 632.000 141.000 100.000 1158.000 148.000 181.000 643.000 3.000 1.000 0.000 1378.000 1464.000 934.000 na 620.000 233.000 135.000 403.000 778.000 244.000 240.000 575.000 144.000 107.000 1131.000 116.000 169.000 610.000 4.000 1.000 0.000 1315.000 1367.000 895.000 230.000 564.000 207.000 158.000 394.000 801.000 224.000 242.000 568.000 116.000 79.000 1090.000 132.000 189.000 594.000 5.000 1.000 0.000 1413.000 1500.000 969.000 na 645.000 247.000 161.000 426.000 823.000 241.000 252.000 607.000 120.000 99.000 1175.000 131.000 197.000 654.000 6.000 1.000 0.000 1090.000 1195.000 740.000 na 493.000 189.000 122.000 350.000 673.000 234.000 185.000 462.000 188.000 90.000 901.000 101.000 138.000 476.000 7.000 1.000 0.000 1294.000 1421.000 872.000 239.000 606.000 226.000 155.000 396.000 780.000 237.000 238.000 577.000 149.000 101.000 1084.000 124.000 168.000 578.000 8.000 1.000 0.000 1377.000 1504.000 954.000 248.000 660.000 240.000 159.000 417.000 812.000 240.000 245.000 614.000 128.000 91.000 1149.000 129.000 175.000 628.000 9.000 1.000 0.000 1296.000 1439.000 878.000 208.000 630.000 215.000 na 387.000 759.000 248.000 219.000 584.000 151.000 117.000 1069.000 121.000 159.000 578.000 10.000 1.000 0.000 1470.000 1563.000 987.000 236.000 672.000 231.000 185.000 429.000 856.000 227.000 268.000 659.000 103.000 94.000 1240.000 132.000 196.000 683.000 11.000 1.000 0.000 1612.000 1699.000 1119.000 281.000 778.000 263.000 185.000 441.000 921.000 251.000 284.000 699.000 86.000 79.000 1345.000 148.000 232.000 772.000 12.000 1.000 0.000 1388.000 1500.000 936.000 227.000 616.000 220.000 150.000 412.000 805.000 236.000 249.000 628.000 107.000 85.000 1179.000 132.000 180.000 652.000 13.000 1.000 0.000 1575.000 1655.000 1100.000 295.000 727.000 271.000 178.000 461.000 905.000 251.000 281.000 692.000 82.000 125.000 1309.000 145.000 210.000 712.000 14.000 1.000 0.000 1717.000 1821.000 1184.000 307.000 810.000 284.000 185.000 490.000 960.000 258.000 288.000 764.000 104.000 81.000 1443.000 157.000 222.000 731.000 15.000 1.000 0.000 1587.000 1711.000 1115.000 293.000 778.000 279.000 184.000 461.000 910.000 234.000 282.000 673.000 81.000 75.000 1339.000 135.000 207.000 692.000 16.000 1.000 0.000 1604.000 1770.000 1132.000 268.000 823.000 272.000 173.000 474.000 880.000 249.000 258.000 702.000 57.000 109.000 1361.000 140.000 208.000 713.000 17.000 1.000 0.000 1630.000 1703.000 1122.000 294.000 755.000 268.000 190.000 467.000 902.000 261.000 314.000 710.000 81.000 104.000 1377.000 137.000 206.000 754.000 18.000 1.000 0.000 1490.000 1599.000 1007.000 289.000 710.000 278.000 179.000 483.000 897.000 250.000 299.000 674.000 115.000 107.000 1253.000 142.000 194.000 688.000 19.000 1.000 0.000 1552.000 1540.000 1031.000 234.000 701.000 238.000 192.000 447.000 852.000 246.000 287.000 691.000 82.000 89.000 1293.000 137.000 213.000 722.000 20.000 1.000 0.000 1595.000 1709.000 1092.000 267.000 803.000 255.000 204.000 455.000 904.000 243.000 306.000 695.000 83.000 130.000 na 138.000 183.000 701.000 21.000 1.000 0.000 1840.000 1907.000 1279.000 297.000 855.000 308.000 225.000 536.000 984.000 277.000 350.000 780.000 84.000 116.000 1539.000 163.000 238.000 795.000 22.000 1.000 0.000 1740.000 1817.000 1225.000 291.000 838.000 281.000 185.000 493.000 977.000 273.000 265.000 736.000 121.000 83.000 na 159.000 227.000 770.000 23.000 1.000 0.000 1846.000 1893.000 1300.000 na 830.000 288.000 213.000 527.000 1013.000 252.000 330.000 784.000 21.000 89.000 1530.000 152.000 232.000 829.000 24.000 1.000 0.000 1702.000 1860.000 1270.000 332.000 864.000 306.000 221.000 513.000 947.000 239.000 315.000 765.000 39.000 137.000 1526.000 138.000 218.000 776.000 25.000 1.000 0.000 1768.000 1890.000 1173.000 na 837.000 285.000 252.000 512.000 968.000 233.000 347.000 798.000 41.000 100.000 1547.000 140.000 243.000 842.000 1.000 2.000 0.000 1112.000 1225.000 755.000 na 525.000 175.000 141.000 354.000 702.000 221.000 201.000 497.000 203.000 82.000 933.000 106.000 154.000 533.000 2.000 2.000 0.000 1262.000 1367.000 855.000 211.000 575.000 200.000 145.000 386.000 760.000 226.000 220.000 569.000 164.000 72.000 1059.000 113.000 164.000 578.000 3.000 2.000 0.000 1423.000 1490.000 971.000 229.000 626.000 226.000 159.000 441.000 839.000 256.000 234.000 613.000 148.000 106.000 1197.000 129.000 173.000 651.000 4.000 2.000 0.000 1373.000 1494.000 952.000 247.000 664.000 238.000 171.000 428.000 828.000 249.000 228.000 605.000 147.000 99.000 1131.000 126.000 167.000 621.000 5.000 2.000 0.000 1414.000 1517.000 971.000 256.000 659.000 229.000 197.000 433.000 853.000 233.000 264.000 664.000 131.000 94.000 1215.000 139.000 200.000 660.000 6.000 2.000 0.000 1415.000 1523.000 973.000 257.000 671.000 247.000 181.000 443.000 859.000 240.000 288.000 665.000 125.000 104.000 1202.000 147.000 192.000 676.000 7.000 2.000 0.000 1374.000 1463.000 927.000 241.000 629.000 205.000 169.000 393.000 833.000 235.000 247.000 615.000 129.000 100.000 1176.000 128.000 171.000 638.000 8.000 2.000 0.000 1427.000 1487.000 978.000 221.000 646.000 210.000 173.000 402.000 823.000 238.000 242.000 589.000 125.000 99.000 1198.000 128.000 169.000 649.000 9.000 2.000 0.000 1382.000 1494.000 942.000 229.000 674.000 221.000 170.000 407.000 803.000 210.000 222.000 599.000 101.000 106.000 1151.000 122.000 176.000 629.000 10.000 2.000 0.000 1440.000 1557.000 985.000 233.000 687.000 225.000 175.000 413.000 832.000 229.000 265.000 646.000 121.000 88.000 1214.000 130.000 195.000 668.000 11.000 2.000 0.000 1575.000 1667.000 1105.000 285.000 756.000 249.000 185.000 467.000 903.000 233.000 301.000 722.000 104.000 117.000 1324.000 147.000 198.000 731.000 12.000 2.000 0.000 1462.000 1516.000 1016.000 255.000 687.000 223.000 190.000 432.000 873.000 222.000 286.000 663.000 135.000 105.000 1258.000 131.000 205.000 688.000 13.000 2.000 0.000 1559.000 1650.000 1087.000 282.000 734.000 245.000 182.000 462.000 920.000 248.000 258.000 699.000 103.000 70.000 1355.000 149.000 193.000 724.000 14.000 2.000 0.000 1507.000 1590.000 1043.000 na 700.000 255.000 175.000 446.000 na 236.000 264.000 644.000 112.000 91.000 1257.000 139.000 215.000 681.000 15.000 2.000 0.000 1546.000 1621.000 1072.000 275.000 729.000 238.000 180.000 445.000 914.000 251.000 272.000 672.000 80.000 93.000 1344.000 137.000 204.000 735.000 16.000 2.000 0.000 1512.000 1567.000 1052.000 287.000 695.000 251.000 183.000 439.000 885.000 235.000 271.000 646.000 82.000 67.000 1297.000 135.000 203.000 709.000 17.000 2.000 0.000 1400.000 1501.000 1041.000 267.000 731.000 242.000 167.000 440.000 878.000 234.000 259.000 688.000 123.000 130.000 1265.000 137.000 175.000 684.000 18.000 2.000 0.000 1464.000 1573.000 1037.000 286.000 717.000 258.000 182.000 450.000 848.000 205.000 262.000 625.000 70.000 118.000 1235.000 124.000 180.000 659.000 19.000 2.000 0.000 1491.000 1578.000 1028.000 259.000 682.000 253.000 177.000 455.000 875.000 244.000 288.000 647.000 114.000 111.000 1290.000 148.000 194.000 706.000 20.000 2.000 0.000 1530.000 1576.000 1037.000 276.000 704.000 241.000 191.000 449.000 910.000 243.000 271.000 na 193.000 101.000 1321.000 143.000 218.000 741.000 21.000 2.000 0.000 1570.000 1618.000 1064.000 294.000 725.000 261.000 160.000 455.000 894.000 212.000 302.000 684.000 74.000 103.000 1355.000 141.000 206.000 706.000 22.000 2.000 0.000 1607.000 1647.000 1118.000 276.000 741.000 261.000 184.000 475.000 911.000 222.000 306.000 699.000 95.000 97.000 1370.000 139.000 218.000 733.000 23.000 2.000 0.000 1558.000 1646.000 1087.000 na 740.000 232.000 177.000 478.000 908.000 205.000 320.000 704.000 28.000 93.000 1394.000 131.000 182.000 733.000 24.000 2.000 0.000 1589.000 1750.000 1128.000 311.000 811.000 289.000 187.000 479.000 911.000 238.000 326.000 716.000 122.000 90.000 1366.000 129.000 174.000 715.000 25.000 2.000 0.000 1548.000 1663.000 1079.000 265.000 784.000 251.000 206.000 457.000 907.000 244.000 282.000 687.000 100.000 119.000 1314.000 126.000 198.000 706.000 1.000 1.000 1.000 na 1493.000 980.000 na 635.000 236.000 161.000 394.000 798.000 242.000 269.000 589.000 135.000 85.000 1160.000 125.000 170.000 659.000 2.000 1.000 1.000 1299.000 1345.000 895.000 219.000 565.000 204.000 163.000 385.000 764.000 235.000 215.000 542.000 153.000 93.000 1054.000 118.000 156.000 556.000 3.000 1.000 1.000 1337.000 1395.000 910.000 234.000 562.000 216.000 145.000 404.000 794.000 272.000 236.000 577.000 154.000 102.000 1094.000 122.000 158.000 625.000 4.000 1.000 1.000 1372.000 1456.000 920.000 na 580.000 225.000 156.000 420.000 814.000 230.000 250.000 589.000 124.000 88.000 1110.000 136.000 179.000 636.000 5.000 1.000 1.000 1336.000 1441.000 903.000 185.000 596.000 220.000 151.000 414.000 788.000 245.000 240.000 574.000 156.000 95.000 1083.000 133.000 178.000 623.000 6.000 1.000 1.000 1301.000 1387.000 888.000 225.000 579.000 219.000 157.000 411.000 787.000 231.000 229.000 582.000 113.000 78.000 1115.000 123.000 164.000 616.000 7.000 1.000 1.000 1360.000 1467.000 915.000 na 636.000 201.000 158.000 406.000 813.000 226.000 261.000 570.000 138.000 76.000 1102.000 123.000 171.000 603.000 8.000 1.000 1.000 1276.000 1351.000 824.000 na 559.000 213.000 134.000 408.000 766.000 212.000 235.000 533.000 129.000 91.000 na 112.000 159.000 608.000 9.000 1.000 1.000 1351.000 na 921.000 na 615.000 228.000 180.000 424.000 833.000 231.000 275.000 640.000 136.000 100.000 1117.000 135.000 194.000 654.000 10.000 1.000 1.000 1613.000 1726.000 1136.000 269.000 740.000 234.000 180.000 496.000 883.000 246.000 302.000 na 75.000 103.000 1365.000 148.000 184.000 745.000 11.000 1.000 1.000 1542.000 1628.000 1020.000 213.000 677.000 237.000 187.000 455.000 885.000 242.000 247.000 na 94.000 100.000 1249.000 148.000 190.000 709.000 12.000 1.000 1.000 1440.000 1580.000 972.000 248.000 675.000 217.000 158.000 399.000 815.000 227.000 234.000 647.000 129.000 84.000 1213.000 131.000 186.000 634.000 13.000 1.000 1.000 1474.000 1555.000 989.000 239.000 629.000 211.000 170.000 433.000 888.000 251.000 253.000 662.000 134.000 91.000 1225.000 144.000 205.000 716.000 14.000 1.000 1.000 1503.000 1603.000 1031.000 259.000 692.000 238.000 152.000 454.000 825.000 220.000 268.000 638.000 83.000 95.000 1264.000 141.000 203.000 712.000 15.000 1.000 1.000 1597.000 1653.000 1060.000 na 710.000 221.000 178.000 470.000 908.000 243.000 294.000 na 104.000 107.000 na 146.000 194.000 761.000 16.000 1.000 1.000 1671.000 1689.000 1130.000 248.000 730.000 281.000 191.000 495.000 892.000 236.000 306.000 na 62.000 78.000 1357.000 138.000 208.000 770.000 17.000 1.000 1.000 1673.000 1720.000 1140.000 na 763.000 292.000 299.000 497.000 946.000 270.000 318.000 709.000 107.000 120.000 1361.000 153.000 196.000 755.000 18.000 1.000 1.000 1458.000 1588.000 969.000 na 686.000 251.000 183.000 435.000 836.000 239.000 243.000 624.000 115.000 105.000 1181.000 128.000 192.000 676.000 19.000 1.000 1.000 1568.000 1689.000 1086.000 290.000 717.000 231.000 183.000 450.000 900.000 252.000 318.000 694.000 18.000 98.000 1337.000 140.000 194.000 759.000 20.000 1.000 1.000 1650.000 1707.000 1173.000 319.000 737.000 275.000 200.000 523.000 943.000 268.000 na 744.000 72.000 90.000 1395.000 146.000 184.000 768.000 21.000 1.000 1.000 1774.000 1838.000 1210.000 281.000 816.000 275.000 198.000 547.000 994.000 275.000 368.000 753.000 56.000 80.000 1482.000 146.000 227.000 794.000 22.000 1.000 1.000 1893.000 1945.000 1315.000 267.000 893.000 260.000 213.000 499.000 994.000 234.000 345.000 754.000 13.000 92.000 1568.000 163.000 216.000 824.000 23.000 1.000 1.000 1765.000 1781.000 1240.000 295.000 766.000 261.000 192.000 476.000 978.000 220.000 313.000 726.000 38.000 95.000 1503.000 159.000 211.000 775.000 1.000 2.000 1.000 1030.000 1121.000 665.000 174.000 454.000 141.000 124.000 303.000 640.000 202.000 na 435.000 216.000 96.000 856.000 101.000 132.000 473.000 2.000 2.000 1.000 1389.000 1486.000 931.000 245.000 625.000 203.000 152.000 411.000 801.000 245.000 242.000 587.000 125.000 114.000 1164.000 123.000 166.000 645.000 3.000 2.000 1.000 1263.000 1372.000 857.000 225.000 587.000 203.000 146.000 400.000 782.000 232.000 237.000 554.000 170.000 113.000 1055.000 120.000 166.000 580.000 4.000 2.000 1.000 1067.000 1167.000 702.000 na 474.000 151.000 121.000 320.000 683.000 215.000 193.000 475.000 209.000 76.000 894.000 103.000 134.000 511.000 5.000 2.000 1.000 1379.000 1500.000 947.000 na 676.000 222.000 160.000 427.000 801.000 236.000 248.000 607.000 129.000 107.000 1125.000 130.000 171.000 631.000 6.000 2.000 1.000 1335.000 1407.000 900.000 na 586.000 189.000 136.000 397.000 899.000 233.000 na 603.000 159.000 72.000 1132.000 129.000 197.000 619.000 7.000 2.000 1.000 1282.000 na 835.000 172.000 na 186.000 165.000 385.000 785.000 233.000 235.000 na 157.000 60.000 1070.000 132.000 182.000 612.000 8.000 2.000 1.000 1413.000 1490.000 962.000 244.000 630.000 235.000 170.000 430.000 834.000 240.000 271.000 626.000 88.000 96.000 1198.000 132.000 191.000 665.000 9.000 2.000 1.000 1470.000 1583.000 1000.000 211.000 690.000 242.000 166.000 451.000 855.000 249.000 271.000 634.000 129.000 80.000 1209.000 138.000 210.000 708.000 10.000 2.000 1.000 1377.000 1479.000 923.000 na 630.000 239.000 162.000 452.000 874.000 283.000 256.000 na 148.000 95.000 1136.000 129.000 190.000 679.000 11.000 2.000 1.000 1464.000 1539.000 971.000 246.000 663.000 196.000 165.000 411.000 821.000 236.000 237.000 645.000 138.000 83.000 1219.000 143.000 188.000 702.000 12.000 2.000 1.000 1452.000 1592.000 973.000 236.000 694.000 236.000 176.000 461.000 855.000 261.000 240.000 656.000 140.000 87.000 1210.000 143.000 194.000 695.000 13.000 2.000 1.000 1444.000 1552.000 972.000 217.000 667.000 261.000 156.000 467.000 869.000 262.000 251.000 650.000 176.000 105.000 1194.000 138.000 197.000 704.000 14.000 2.000 1.000 1487.000 1586.000 1002.000 242.000 681.000 240.000 171.000 439.000 822.000 245.000 290.000 656.000 112.000 108.000 1237.000 127.000 187.000 679.000 15.000 2.000 1.000 1515.000 1617.000 1036.000 na 712.000 217.000 153.000 440.000 854.000 245.000 271.000 641.000 101.000 90.000 1245.000 132.000 196.000 729.000 16.000 2.000 1.000 1536.000 1620.000 1070.000 255.000 716.000 242.000 165.000 455.000 894.000 222.000 326.000 625.000 87.000 85.000 1287.000 135.000 196.000 692.000 17.000 2.000 1.000 1499.000 1606.000 1028.000 275.000 699.000 254.000 177.000 439.000 835.000 254.000 264.000 650.000 112.000 91.000 1243.000 125.000 200.000 668.000 18.000 2.000 1.000 1505.000 1569.000 1042.000 220.000 703.000 207.000 164.000 433.000 843.000 230.000 266.000 629.000 127.000 88.000 1228.000 136.000 194.000 709.000 19.000 2.000 1.000 1519.000 1594.000 1066.000 259.000 704.000 238.000 184.000 430.000 865.000 238.000 273.000 645.000 70.000 121.000 1275.000 131.000 192.000 689.000 20.000 2.000 1.000 1566.000 1606.000 1046.000 227.000 669.000 238.000 198.000 450.000 882.000 268.000 267.000 656.000 135.000 114.000 1296.000 142.000 219.000 699.000 21.000 2.000 1.000 1509.000 1601.000 1023.000 256.000 693.000 228.000 183.000 434.000 828.000 240.000 256.000 638.000 120.000 107.000 1248.000 129.000 198.000 692.000 22.000 2.000 1.000 1553.000 1607.000 1059.000 235.000 675.000 259.000 203.000 484.000 882.000 239.000 294.000 698.000 140.000 117.000 1314.000 135.000 212.000 722.000 23.000 2.000 1.000 1660.000 1701.000 1171.000 300.000 769.000 253.000 188.000 482.000 960.000 247.000 320.000 695.000 86.000 126.000 1430.000 154.000 205.000 770.000 24.000 2.000 1.000 1719.000 1757.000 1190.000 275.000 800.000 245.000 194.000 492.000 939.000 270.000 333.000 705.000 65.000 97.000 1450.000 154.000 240.000 813.000 25.000 2.000 1.000 1688.000 1720.000 1188.000 285.000 798.000 235.000 183.000 459.000 893.000 247.000 312.000 na 73.000 95.000 1415.000 138.000 220.000 760.000 1.000 1.000 2.000 1382.000 1493.000 928.000 230.000 573.000 231.000 169.000 427.000 861.000 261.000 250.000 618.000 151.000 98.000 1162.000 133.000 186.000 640.000 2.000 1.000 2.000 1438.000 1481.000 976.000 250.000 566.000 218.000 173.000 428.000 912.000 249.000 261.000 619.000 172.000 86.000 1220.000 147.000 193.000 655.000 3.000 1.000 2.000 1304.000 1408.000 959.000 261.000 525.000 200.000 176.000 413.000 889.000 253.000 250.000 na 138.000 96.000 1187.000 151.000 196.000 700.000 4.000 1.000 2.000 1391.000 1430.000 950.000 256.000 551.000 202.000 176.000 421.000 886.000 260.000 252.000 646.000 140.000 106.000 1187.000 146.000 202.000 688.000 5.000 1.000 2.000 1716.000 1688.000 1158.000 249.000 698.000 247.000 192.000 471.000 972.000 290.000 300.000 687.000 189.000 88.000 1450.000 160.000 236.000 799.000 6.000 1.000 2.000 1530.000 1578.000 1046.000 259.000 638.000 208.000 185.000 452.000 929.000 243.000 265.000 667.000 134.000 104.000 1315.000 144.000 201.000 750.000 7.000 1.000 2.000 1625.000 1630.000 1132.000 274.000 658.000 234.000 193.000 470.000 939.000 240.000 283.000 685.000 144.000 102.000 na 151.000 200.000 734.000 8.000 1.000 2.000 1559.000 1567.000 1069.000 243.000 630.000 216.000 196.000 461.000 955.000 230.000 280.000 678.000 110.000 95.000 na 156.000 212.000 760.000 9.000 1.000 2.000 1578.000 1566.000 1094.000 263.000 628.000 237.000 203.000 472.000 953.000 254.000 294.000 687.000 172.000 93.000 na 146.000 207.000 772.000 10.000 1.000 2.000 1562.000 1580.000 1076.000 295.000 638.000 240.000 177.000 455.000 925.000 243.000 272.000 675.000 118.000 80.000 1320.000 154.000 217.000 753.000 11.000 1.000 2.000 1656.000 1640.000 1146.000 280.000 624.000 226.000 194.000 500.000 969.000 235.000 314.000 738.000 114.000 92.000 1422.000 166.000 227.000 805.000 12.000 1.000 2.000 1477.000 1486.000 1001.000 244.000 590.000 206.000 155.000 402.000 867.000 242.000 268.000 639.000 160.000 88.000 1245.000 147.000 185.000 672.000 13.000 1.000 2.000 1568.000 1601.000 1095.000 262.000 628.000 250.000 205.000 504.000 932.000 265.000 290.000 719.000 115.000 96.000 1367.000 159.000 223.000 777.000 14.000 1.000 2.000 1656.000 1646.000 1142.000 297.000 656.000 232.000 198.000 471.000 947.000 217.000 309.000 721.000 104.000 75.000 na 149.000 207.000 778.000 15.000 1.000 2.000 1619.000 1678.000 1106.000 256.000 719.000 253.000 193.000 473.000 946.000 242.000 276.000 689.000 119.000 94.000 1369.000 159.000 215.000 765.000 16.000 1.000 2.000 1687.000 1692.000 1153.000 260.000 687.000 263.000 204.000 491.000 986.000 240.000 288.000 735.000 111.000 104.000 1412.000 157.000 227.000 823.000 17.000 1.000 2.000 1748.000 1731.000 1212.000 282.000 700.000 262.000 243.000 494.000 1000.000 236.000 340.000 735.000 129.000 98.000 na 166.000 239.000 859.000 18.000 1.000 2.000 1783.000 1788.000 1243.000 303.000 746.000 275.000 239.000 503.000 972.000 207.000 330.000 764.000 80.000 105.000 na 159.000 226.000 841.000 19.000 1.000 2.000 1745.000 1738.000 1235.000 304.000 715.000 246.000 237.000 513.000 1070.000 258.000 328.000 744.000 149.000 96.000 1502.000 167.000 239.000 853.000 20.000 1.000 2.000 1680.000 1668.000 1151.000 293.000 685.000 255.000 224.000 479.000 1032.000 213.000 337.000 728.000 78.000 76.000 1466.000 158.000 214.000 835.000 21.000 1.000 2.000 1653.000 1701.000 1151.000 299.000 734.000 239.000 215.000 490.000 1004.000 239.000 319.000 742.000 126.000 94.000 1408.000 169.000 209.000 836.000 22.000 1.000 2.000 1732.000 1702.000 1200.000 328.000 708.000 255.000 230.000 496.000 990.000 233.000 312.000 703.000 106.000 87.000 1474.000 158.000 239.000 822.000 23.000 1.000 2.000 1729.000 1694.000 1199.000 303.000 691.000 259.000 229.000 494.000 1015.000 222.000 322.000 737.000 125.000 117.000 na 161.000 222.000 799.000 24.000 1.000 2.000 1711.000 1695.000 1191.000 291.000 699.000 233.000 221.000 461.000 989.000 210.000 308.000 751.000 60.000 73.000 1452.000 154.000 215.000 815.000 25.000 1.000 2.000 1834.000 1823.000 1247.000 320.000 737.000 278.000 280.000 535.000 1090.000 262.000 371.000 770.000 151.000 100.000 1555.000 156.000 271.000 880.000 1.000 2.000 2.000 1271.000 1334.000 859.000 211.000 503.000 171.000 152.000 381.000 824.000 240.000 216.000 563.000 199.000 70.000 1078.000 130.000 181.000 634.000 2.000 2.000 2.000 1329.000 1375.000 885.000 229.000 549.000 197.000 172.000 396.000 838.000 214.000 239.000 587.000 153.000 79.000 1103.000 133.000 182.000 666.000 3.000 2.000 2.000 1248.000 1286.000 827.000 236.000 494.000 196.000 154.000 380.000 804.000 230.000 227.000 574.000 169.000 72.000 1046.000 131.000 170.000 616.000 4.000 2.000 2.000 1271.000 1355.000 855.000 212.000 522.000 190.000 138.000 374.000 799.000 247.000 215.000 585.000 167.000 90.000 1058.000 132.000 179.000 629.000 5.000 2.000 2.000 1317.000 1311.000 891.000 198.000 497.000 167.000 152.000 390.000 807.000 226.000 237.000 609.000 155.000 93.000 1073.000 130.000 178.000 648.000 6.000 2.000 2.000 1356.000 1387.000 926.000 214.000 554.000 195.000 160.000 392.000 837.000 220.000 245.000 611.000 181.000 85.000 1140.000 135.000 188.000 657.000 7.000 2.000 2.000 1250.000 1327.000 859.000 249.000 532.000 232.000 176.000 421.000 830.000 274.000 266.000 na 214.000 80.000 1067.000 127.000 176.000 639.000 8.000 2.000 2.000 1048.000 1145.000 693.000 na 434.000 167.000 131.000 337.000 725.000 217.000 173.000 481.000 198.000 61.000 880.000 108.000 152.000 511.000 9.000 2.000 2.000 1363.000 1430.000 926.000 227.000 578.000 217.000 167.000 408.000 844.000 234.000 249.000 603.000 153.000 73.000 1163.000 129.000 194.000 654.000 10.000 2.000 2.000 1389.000 1415.000 944.000 230.000 574.000 212.000 172.000 405.000 822.000 241.000 241.000 612.000 170.000 73.000 1163.000 139.000 191.000 641.000 11.000 2.000 2.000 1370.000 1424.000 934.000 248.000 571.000 205.000 171.000 408.000 859.000 246.000 235.000 623.000 154.000 98.000 1152.000 143.000 194.000 689.000 12.000 2.000 2.000 1405.000 1426.000 956.000 212.000 571.000 199.000 182.000 407.000 868.000 235.000 250.000 na 167.000 107.000 1176.000 134.000 194.000 683.000 13.000 2.000 2.000 1428.000 1430.000 977.000 252.000 570.000 214.000 162.000 437.000 880.000 248.000 263.000 620.000 170.000 83.000 1179.000 140.000 189.000 650.000 14.000 2.000 2.000 1456.000 1489.000 992.000 245.000 602.000 219.000 188.000 427.000 878.000 235.000 253.000 657.000 118.000 78.000 na 141.000 193.000 717.000 15.000 2.000 2.000 1395.000 1426.000 942.000 240.000 571.000 222.000 182.000 430.000 853.000 228.000 259.000 650.000 138.000 79.000 1199.000 148.000 202.000 700.000 16.000 2.000 2.000 1385.000 1399.000 945.000 215.000 553.000 191.000 156.000 386.000 827.000 217.000 247.000 585.000 137.000 98.000 1156.000 134.000 190.000 642.000 17.000 2.000 2.000 1441.000 1449.000 984.000 na 568.000 221.000 166.000 435.000 879.000 231.000 257.000 635.000 160.000 82.000 1233.000 142.000 185.000 700.000 18.000 2.000 2.000 1464.000 1496.000 1008.000 226.000 636.000 230.000 183.000 436.000 897.000 234.000 264.000 646.000 172.000 78.000 1263.000 150.000 216.000 715.000 19.000 2.000 2.000 1486.000 1483.000 1019.000 287.000 603.000 213.000 180.000 442.000 927.000 230.000 274.000 649.000 139.000 97.000 1291.000 157.000 217.000 737.000 20.000 2.000 2.000 1499.000 1511.000 na 255.000 699.000 212.000 190.000 435.000 936.000 256.000 278.000 642.000 200.000 118.000 1291.000 150.000 200.000 740.000 21.000 2.000 2.000 1485.000 1500.000 1016.000 277.000 552.000 205.000 203.000 454.000 919.000 225.000 278.000 676.000 122.000 74.000 1260.000 148.000 194.000 751.000 22.000 2.000 2.000 1468.000 1536.000 996.000 264.000 667.000 222.000 190.000 431.000 951.000 217.000 305.000 650.000 178.000 82.000 1287.000 141.000 199.000 736.000 23.000 2.000 2.000 1510.000 1546.000 1043.000 264.000 656.000 218.000 197.000 423.000 891.000 190.000 270.000 651.000 78.000 87.000 1337.000 158.000 210.000 747.000 24.000 2.000 2.000 1526.000 1512.000 1052.000 281.000 625.000 250.000 201.000 470.000 934.000 236.000 289.000 680.000 145.000 106.000 1334.000 153.000 211.000 739.000 25.000 2.000 2.000 1570.000 1583.000 987.000 285.000 646.000 244.000 198.000 482.000 984.000 253.000 291.000 699.000 188.000 103.000 1354.000 153.000 223.000 807.000 100.000 1.000 0.000 1899.000 1925.000 1327.000 306.000 905.000 310.000 265.000 560.000 1067.000 na na 770.000 46.000 108.000 1648.000 174.000 257.000 880.000 200.000 1.000 2.000 1848.000 na 1276.000 na 751.000 287.000 257.000 na 1045.000 266.000 na na na 128.000 1583.000 na na 843.000 300.000 2.000 2.000 1115.000 na 748.000 182.000 na na 178.000 311.000 756.000 226.000 na na na 48.000 1009.000 na 204.000 593.000 ggobi-2.1.12/data/tao-nomiss.xml0000644000175000017500000035515014651527764012123 It contains some records taken from the Tropical Ocean Atmosphere project, http://www.pmel.noaa.gov/tao/. This project maintains a grid of buoys in the Pacific Ocean that provide an early warning system to detect El Nino and La Nina events. The subset that is available here contains measurements on sea surface temperature (SST), air temperature (AirT), relative humidity (Hum), east-west component of wind (UWind), and north-south component of wind (VWind). They are the daily average values for 2 time periods Nov 1, 1993-Jan 31, 1994, and Nov 1, 1997-Jan 31, 1998. The former was considered to be a normal season, the latter a very extreme El Nino event occurred in the time period. There are several different buoys included, and the location of these is defined by the Latitude and Longitude positions. The buoys differ slightly for each time period because the available data by buoy differed some. 1997.000 0.000 -110.000 1.000 1.000 27.590 27.150 79.600 -6.400 5.400 1997.000 0.000 -110.000 2.000 1.000 27.550 27.020 75.800 -5.300 5.300 1997.000 0.000 -110.000 3.000 1.000 27.570 27.000 76.500 -5.100 4.500 1997.000 0.000 -110.000 4.000 1.000 27.620 26.930 76.200 -4.900 2.500 1997.000 0.000 -110.000 5.000 1.000 27.650 26.840 76.400 -3.500 4.100 1997.000 0.000 -110.000 6.000 1.000 27.830 26.940 76.700 -4.400 1.600 1997.000 0.000 -110.000 7.000 1.000 28.010 27.040 76.500 -2.000 3.500 1997.000 0.000 -110.000 8.000 1.000 28.040 27.110 78.300 -3.700 4.500 1997.000 0.000 -110.000 9.000 1.000 28.020 27.210 78.600 -4.200 5.000 1997.000 0.000 -110.000 10.000 1.000 28.050 27.250 76.900 -3.600 3.500 1997.000 0.000 -110.000 11.000 1.000 28.070 27.230 77.600 -3.700 2.900 1997.000 0.000 -110.000 12.000 1.000 28.090 27.320 77.500 -4.800 1.800 1997.000 0.000 -110.000 13.000 1.000 28.200 27.310 80.100 -3.500 1.900 1997.000 0.000 -110.000 14.000 1.000 28.250 26.440 85.200 -1.000 1.800 1997.000 0.000 -110.000 15.000 1.000 28.420 26.780 79.800 -1.500 0.900 1997.000 0.000 -110.000 16.000 1.000 28.580 27.420 76.300 -2.600 0.700 1997.000 0.000 -110.000 17.000 1.000 28.520 27.500 81.800 -4.400 2.900 1997.000 0.000 -110.000 18.000 1.000 28.350 27.090 84.600 -5.800 3.300 1997.000 0.000 -110.000 19.000 1.000 28.280 27.290 81.300 -7.300 3.800 1997.000 0.000 -110.000 20.000 1.000 28.180 27.090 84.700 -6.300 4.700 1997.000 0.000 -110.000 21.000 1.000 28.060 27.060 83.900 -4.800 6.800 1997.000 0.000 -110.000 22.000 1.000 28.040 27.280 79.200 -3.200 6.700 1997.000 0.000 -110.000 23.000 1.000 28.090 27.300 77.500 -2.200 3.500 1997.000 0.000 -110.000 24.000 1.000 28.120 27.510 80.400 -4.900 1.900 1997.000 0.000 -110.000 25.000 1.000 28.130 27.540 82.500 -5.700 1.500 1997.000 0.000 -110.000 26.000 1.000 28.110 27.620 81.500 -5.300 2.900 1997.000 0.000 -110.000 27.000 1.000 28.150 27.510 81.000 -4.400 4.000 1997.000 0.000 -110.000 28.000 1.000 28.190 27.600 80.700 -5.100 4.200 1997.000 0.000 -110.000 29.000 1.000 28.170 27.640 81.000 -6.600 2.400 1997.000 0.000 -110.000 30.000 1.000 28.210 27.560 77.000 -4.600 4.200 1997.000 0.000 -110.000 31.000 2.000 28.210 27.520 76.500 -2.900 4.300 1997.000 0.000 -110.000 32.000 2.000 28.250 26.810 84.700 -3.000 2.600 1997.000 0.000 -110.000 33.000 2.000 28.260 27.040 86.700 -5.000 1.800 1997.000 0.000 -110.000 34.000 2.000 28.230 27.180 87.200 -6.300 2.400 1997.000 0.000 -110.000 35.000 2.000 28.320 27.840 82.600 -6.500 4.300 1997.000 0.000 -110.000 36.000 2.000 28.020 25.760 91.100 -1.400 2.900 1997.000 0.000 -110.000 37.000 2.000 28.030 26.380 86.600 0.000 2.300 1997.000 0.000 -110.000 38.000 2.000 28.150 27.000 87.000 -1.300 2.800 1997.000 0.000 -110.000 39.000 2.000 28.520 26.880 89.300 -4.100 3.600 1997.000 0.000 -110.000 40.000 2.000 28.480 26.290 88.900 -1.800 -1.300 1997.000 0.000 -110.000 41.000 2.000 28.560 27.170 83.800 -3.600 3.000 1997.000 0.000 -110.000 42.000 2.000 28.590 27.500 84.600 -3.900 4.100 1997.000 0.000 -110.000 43.000 2.000 28.460 26.220 89.300 1.200 3.600 1997.000 0.000 -110.000 44.000 2.000 28.420 27.780 78.900 -4.000 4.700 1997.000 0.000 -110.000 45.000 2.000 28.550 27.650 78.500 -3.600 3.200 1997.000 0.000 -110.000 46.000 2.000 28.520 26.580 85.600 -2.000 3.800 1997.000 0.000 -110.000 47.000 2.000 28.510 27.220 82.100 -2.400 3.500 1997.000 0.000 -110.000 48.000 2.000 28.720 27.200 81.000 -0.900 0.100 1997.000 0.000 -110.000 49.000 2.000 28.980 27.680 82.800 -3.800 2.200 1997.000 0.000 -110.000 50.000 2.000 28.570 26.590 89.400 -4.600 2.900 1997.000 0.000 -110.000 51.000 2.000 28.500 27.270 87.200 -5.600 1.200 1997.000 0.000 -110.000 52.000 2.000 28.530 26.520 90.300 -3.600 -1.100 1997.000 0.000 -110.000 53.000 2.000 28.730 27.640 87.000 -2.100 2.300 1997.000 0.000 -110.000 54.000 2.000 29.020 27.780 83.400 -4.100 -0.100 1997.000 0.000 -110.000 55.000 2.000 28.940 27.240 86.500 -4.800 0.900 1997.000 0.000 -110.000 56.000 2.000 28.860 27.400 86.900 -6.300 0.700 1997.000 0.000 -110.000 57.000 2.000 28.780 26.770 89.800 -5.000 0.100 1997.000 0.000 -110.000 58.000 2.000 28.830 27.150 86.300 -1.400 0.500 1997.000 0.000 -110.000 59.000 2.000 29.080 27.310 86.800 0.200 1.600 1997.000 0.000 -110.000 60.000 2.000 28.910 27.490 86.100 -5.600 1.500 1997.000 0.000 -110.000 61.000 2.000 28.740 27.310 88.900 -6.400 -0.900 1997.000 0.000 -110.000 62.000 3.000 28.650 27.740 89.300 -7.200 -4.000 1997.000 0.000 -110.000 63.000 3.000 28.570 27.600 90.400 -7.900 -2.300 1997.000 0.000 -110.000 64.000 3.000 28.510 28.370 88.000 -5.400 -6.200 1997.000 0.000 -110.000 65.000 3.000 28.590 28.280 88.100 0.100 -4.400 1997.000 0.000 -110.000 66.000 3.000 28.480 26.420 90.200 0.800 2.200 1997.000 0.000 -110.000 67.000 3.000 28.630 27.630 81.900 0.100 2.400 1997.000 0.000 -110.000 68.000 3.000 29.000 28.100 82.300 -0.400 0.900 1997.000 0.000 -110.000 69.000 3.000 29.090 27.280 87.100 -2.400 -1.000 1997.000 0.000 -110.000 70.000 3.000 28.780 27.420 88.200 -1.900 -1.400 1997.000 0.000 -110.000 71.000 3.000 28.760 27.330 89.600 -3.100 -0.400 1997.000 0.000 -110.000 72.000 3.000 28.780 26.910 88.500 -2.900 1.600 1997.000 0.000 -110.000 73.000 3.000 29.030 28.080 86.800 -3.900 -1.700 1997.000 0.000 -110.000 74.000 3.000 28.780 26.980 91.300 -3.900 -3.700 1997.000 0.000 -110.000 75.000 3.000 28.760 27.640 85.800 -2.400 -2.400 1997.000 0.000 -110.000 76.000 3.000 28.730 27.130 89.600 -1.900 -0.800 1997.000 0.000 -110.000 77.000 3.000 28.660 26.830 92.100 -1.500 3.900 1997.000 0.000 -110.000 78.000 3.000 28.700 27.060 89.900 1.800 0.800 1997.000 0.000 -110.000 79.000 3.000 28.830 27.680 86.000 0.800 -0.700 1997.000 0.000 -110.000 80.000 3.000 28.890 27.870 86.700 -3.600 -0.800 1997.000 0.000 -110.000 81.000 3.000 28.820 27.840 86.700 -3.700 -0.400 1997.000 0.000 -110.000 82.000 3.000 28.900 26.900 90.900 -2.800 -1.700 1997.000 0.000 -110.000 83.000 3.000 29.040 27.550 89.000 -4.100 -1.600 1997.000 0.000 -110.000 84.000 3.000 29.060 27.520 88.000 -1.300 -0.700 1997.000 0.000 -110.000 85.000 3.000 29.000 27.280 90.100 -3.100 0.500 1997.000 0.000 -110.000 86.000 3.000 29.040 27.810 87.600 -2.800 -1.500 1997.000 0.000 -110.000 87.000 3.000 29.220 28.400 85.300 -2.900 -1.700 1997.000 0.000 -110.000 88.000 3.000 29.330 27.670 89.700 -0.900 2.100 1997.000 0.000 -110.000 89.000 3.000 29.290 27.950 88.200 -0.300 0.300 1997.000 0.000 -110.000 90.000 3.000 29.410 27.780 89.900 -2.500 -1.500 1997.000 0.000 -110.000 91.000 3.000 29.330 28.300 89.100 -3.100 -1.200 1997.000 0.000 -110.000 92.000 3.000 29.550 28.330 87.600 -3.300 -1.300 1997.000 0.000 -95.000 1.000 1.000 26.790 26.390 79.400 -4.500 4.900 1997.000 0.000 -95.000 2.000 1.000 26.680 26.190 77.700 -3.600 6.000 1997.000 0.000 -95.000 3.000 1.000 26.620 26.150 78.400 -2.600 6.100 1997.000 0.000 -95.000 4.000 1.000 26.590 26.390 80.500 -2.400 5.000 1997.000 0.000 -95.000 5.000 1.000 26.640 26.270 81.900 -2.900 6.900 1997.000 0.000 -95.000 6.000 1.000 26.690 26.350 78.400 -2.300 6.400 1997.000 0.000 -95.000 7.000 1.000 26.850 26.150 75.900 -1.200 4.500 1997.000 0.000 -95.000 8.000 1.000 26.910 25.830 78.400 0.900 4.000 1997.000 0.000 -95.000 9.000 1.000 27.030 26.270 73.800 0.200 5.100 1997.000 0.000 -95.000 10.000 1.000 27.240 26.310 73.500 -1.100 3.900 1997.000 0.000 -95.000 11.000 1.000 27.460 26.590 75.600 -0.600 3.400 1997.000 0.000 -95.000 12.000 1.000 27.490 26.870 78.700 -1.900 5.400 1997.000 0.000 -95.000 13.000 1.000 27.400 26.630 81.600 -2.800 5.300 1997.000 0.000 -95.000 14.000 1.000 27.620 26.670 79.400 -3.000 5.300 1997.000 0.000 -95.000 15.000 1.000 27.730 26.790 78.000 -3.600 6.000 1997.000 0.000 -95.000 16.000 1.000 27.690 27.100 79.800 -0.600 4.200 1997.000 0.000 -95.000 17.000 1.000 27.630 27.100 74.500 -3.900 5.800 1997.000 0.000 -95.000 18.000 1.000 27.510 27.100 76.300 -2.800 5.300 1997.000 0.000 -95.000 19.000 1.000 27.540 27.100 81.600 -2.300 5.600 1997.000 0.000 -95.000 20.000 1.000 27.470 27.100 81.900 -4.600 6.100 1997.000 0.000 -95.000 21.000 1.000 27.440 27.100 74.200 -4.400 6.500 1997.000 0.000 -95.000 22.000 1.000 27.450 27.100 72.100 -2.600 6.100 1997.000 0.000 -95.000 23.000 1.000 27.520 27.100 72.400 -0.100 4.900 1997.000 0.000 -95.000 24.000 1.000 27.490 27.100 81.600 1.300 2.700 1997.000 0.000 -95.000 25.000 1.000 27.600 27.100 74.500 -1.000 5.500 1997.000 0.000 -95.000 26.000 1.000 27.590 27.100 73.800 -0.700 6.200 1997.000 0.000 -95.000 27.000 1.000 27.560 27.100 75.600 -1.600 6.100 1997.000 0.000 -95.000 28.000 1.000 27.530 27.100 75.900 -2.200 7.200 1997.000 0.000 -95.000 29.000 1.000 27.550 27.100 76.600 -2.700 6.500 1997.000 0.000 -95.000 30.000 1.000 27.600 27.100 80.200 0.100 6.100 1997.000 0.000 -95.000 31.000 2.000 27.600 27.100 81.900 -1.200 4.900 1997.000 0.000 -95.000 32.000 2.000 27.610 27.100 83.000 -2.900 4.300 1997.000 0.000 -95.000 33.000 2.000 27.700 27.100 80.900 -5.300 4.600 1997.000 0.000 -95.000 34.000 2.000 27.750 27.100 78.400 -4.400 5.100 1997.000 0.000 -95.000 35.000 2.000 27.810 27.100 83.000 -4.700 2.700 1997.000 0.000 -95.000 36.000 2.000 27.870 27.100 84.400 -4.500 2.400 1997.000 0.000 -95.000 37.000 2.000 27.970 27.100 84.000 -4.100 2.800 1997.000 0.000 -95.000 38.000 2.000 28.030 27.100 83.300 -2.900 3.500 1997.000 0.000 -95.000 39.000 2.000 27.970 27.100 83.000 -3.500 4.400 1997.000 0.000 -95.000 40.000 2.000 28.140 27.100 82.300 -4.100 4.700 1997.000 0.000 -95.000 41.000 2.000 28.020 27.100 85.100 -1.500 1.400 1997.000 0.000 -95.000 42.000 2.000 27.930 27.100 79.400 -3.400 4.200 1997.000 0.000 -95.000 43.000 2.000 28.000 27.100 79.800 -3.000 4.100 1997.000 0.000 -95.000 44.000 2.000 28.010 27.100 84.400 -2.100 4.400 1997.000 0.000 -95.000 45.000 2.000 27.910 27.100 87.500 0.200 1.300 1997.000 0.000 -95.000 46.000 2.000 27.890 27.100 83.300 -0.100 2.200 1997.000 0.000 -95.000 47.000 2.000 28.150 27.100 82.300 -2.000 2.800 1997.000 0.000 -95.000 48.000 2.000 28.470 27.100 81.600 -2.300 1.300 1997.000 0.000 -95.000 49.000 2.000 28.610 27.100 79.100 -4.000 0.900 1997.000 0.000 -95.000 50.000 2.000 28.740 27.100 78.700 -4.600 -0.800 1997.000 0.000 -95.000 51.000 2.000 28.740 27.100 80.500 -4.700 1.200 1997.000 0.000 -95.000 52.000 2.000 28.830 27.100 80.500 -4.000 1.100 1997.000 0.000 -95.000 53.000 2.000 28.790 27.100 85.100 -4.900 0.100 1997.000 0.000 -95.000 54.000 2.000 28.330 27.100 88.900 -1.600 1.000 1997.000 0.000 -95.000 55.000 2.000 28.210 27.100 84.700 2.100 -0.600 1997.000 0.000 -95.000 56.000 2.000 28.410 27.100 79.400 -2.300 1.500 1997.000 0.000 -95.000 57.000 2.000 28.740 27.100 73.800 -1.500 0.200 1997.000 0.000 -95.000 58.000 2.000 28.930 27.100 82.300 0.600 2.600 1997.000 0.000 -95.000 59.000 2.000 28.550 27.100 84.400 1.600 -1.000 1997.000 0.000 -95.000 60.000 2.000 28.750 27.100 84.000 0.200 2.700 1997.000 0.000 -95.000 61.000 2.000 28.750 27.100 81.900 -3.400 2.100 1997.000 0.000 -95.000 62.000 3.000 28.950 27.100 80.500 -5.200 -3.400 1997.000 0.000 -95.000 63.000 3.000 28.830 27.100 79.100 -5.300 -4.400 1997.000 0.000 -95.000 64.000 3.000 28.720 27.100 80.200 -5.200 -3.400 1997.000 0.000 -95.000 65.000 3.000 28.540 27.100 82.600 -2.700 -1.600 1997.000 0.000 -95.000 66.000 3.000 28.250 27.100 84.700 1.900 1.800 1997.000 0.000 -95.000 67.000 3.000 28.360 27.100 86.100 4.300 1.100 1997.000 0.000 -95.000 68.000 3.000 28.210 27.100 85.800 2.700 1.600 1997.000 0.000 -95.000 69.000 3.000 28.140 27.100 86.500 -1.900 -2.200 1997.000 0.000 -95.000 70.000 3.000 28.610 27.100 80.500 -2.900 -1.800 1997.000 0.000 -95.000 71.000 3.000 28.920 27.100 80.900 -3.000 -0.600 1997.000 0.000 -95.000 72.000 3.000 28.910 27.100 80.500 -2.200 -2.900 1997.000 0.000 -95.000 73.000 3.000 29.230 27.100 78.400 0.100 -2.500 1997.000 0.000 -95.000 74.000 3.000 29.350 27.100 79.100 -2.700 -1.800 1997.000 0.000 -95.000 75.000 3.000 29.390 27.100 77.300 -3.200 -4.400 1997.000 0.000 -95.000 76.000 3.000 29.240 27.100 80.500 -2.900 -3.400 1997.000 0.000 -95.000 77.000 3.000 29.140 27.100 79.400 -1.500 0.000 1997.000 0.000 -95.000 78.000 3.000 29.140 27.100 82.300 -1.300 -4.100 1997.000 0.000 -95.000 79.000 3.000 29.000 27.100 75.600 -0.700 -2.800 1997.000 0.000 -95.000 80.000 3.000 29.380 27.100 77.000 -2.300 -1.300 1997.000 0.000 -95.000 81.000 3.000 29.570 27.100 79.100 -2.000 1.700 1997.000 0.000 -95.000 82.000 3.000 29.650 27.100 77.000 -2.000 0.800 1997.000 0.000 -95.000 83.000 3.000 29.890 27.100 74.500 -3.000 -0.200 1997.000 0.000 -95.000 84.000 3.000 30.170 27.100 77.700 -1.400 0.700 1997.000 0.000 -95.000 85.000 3.000 29.950 27.100 78.000 0.900 -4.000 1997.000 0.000 -95.000 86.000 3.000 29.630 27.100 76.300 -0.400 -3.900 1997.000 0.000 -95.000 87.000 3.000 29.560 27.100 79.100 -2.300 0.400 1997.000 0.000 -95.000 88.000 3.000 29.440 27.100 83.000 -0.200 2.000 1997.000 0.000 -95.000 89.000 3.000 29.480 27.100 84.000 1.900 -1.200 1997.000 0.000 -95.000 90.000 3.000 29.430 27.100 81.200 -0.400 0.500 1997.000 0.000 -95.000 91.000 3.000 29.380 27.100 79.800 -3.900 2.600 1997.000 0.000 -95.000 92.000 3.000 29.210 27.100 79.400 -4.100 -1.100 1997.000 -5.000 -95.000 1.000 1.000 26.600 25.470 82.300 -6.800 5.100 1997.000 -5.000 -95.000 2.000 1.000 26.650 25.630 79.900 -5.800 5.200 1997.000 -5.000 -95.000 3.000 1.000 26.670 25.200 85.700 -5.200 5.300 1997.000 -5.000 -95.000 4.000 1.000 26.590 25.470 85.200 -5.400 4.100 1997.000 -5.000 -95.000 5.000 1.000 26.480 25.820 81.900 -5.100 5.000 1997.000 -5.000 -95.000 6.000 1.000 26.550 25.780 79.000 -3.400 4.400 1997.000 -5.000 -95.000 7.000 1.000 26.640 25.740 77.400 -3.200 4.200 1997.000 -5.000 -95.000 8.000 1.000 26.830 25.740 76.100 -1.100 3.700 1997.000 -5.000 -95.000 9.000 1.000 26.830 25.860 78.200 -3.100 3.600 1997.000 -5.000 -95.000 10.000 1.000 26.780 25.860 81.500 -4.900 3.600 1997.000 -5.000 -95.000 11.000 1.000 26.820 26.010 81.100 -4.800 4.000 1997.000 -5.000 -95.000 12.000 1.000 26.820 25.970 82.800 -5.500 4.700 1997.000 -5.000 -95.000 13.000 1.000 26.800 26.130 84.000 -5.500 6.100 1997.000 -5.000 -95.000 14.000 1.000 26.780 25.780 84.000 -6.500 3.700 1997.000 -5.000 -95.000 15.000 1.000 26.770 26.090 80.700 -6.300 4.600 1997.000 -5.000 -95.000 16.000 1.000 26.810 25.970 79.000 -4.600 4.000 1997.000 -5.000 -95.000 17.000 1.000 26.890 26.050 79.400 -6.000 3.200 1997.000 -5.000 -95.000 18.000 1.000 26.910 26.130 79.900 -5.800 4.000 1997.000 -5.000 -95.000 19.000 1.000 26.900 26.320 82.800 -5.500 5.900 1997.000 -5.000 -95.000 20.000 1.000 26.890 26.050 81.100 -6.500 4.900 1997.000 -5.000 -95.000 21.000 1.000 26.900 25.820 80.700 -5.400 4.100 1997.000 -5.000 -95.000 22.000 1.000 26.930 26.200 78.200 -5.300 2.700 1997.000 -5.000 -95.000 23.000 1.000 27.050 26.440 79.000 -3.000 4.400 1997.000 -5.000 -95.000 24.000 1.000 27.110 26.360 81.100 -3.600 4.000 1997.000 -5.000 -95.000 25.000 1.000 27.110 26.130 79.900 -4.100 3.900 1997.000 -5.000 -95.000 26.000 1.000 27.120 26.280 79.400 -4.000 4.500 1997.000 -5.000 -95.000 27.000 1.000 27.110 26.440 77.800 -5.200 4.100 1997.000 -5.000 -95.000 28.000 1.000 27.140 26.470 72.800 -5.100 3.700 1997.000 -5.000 -95.000 29.000 1.000 27.160 26.470 77.000 -5.700 3.500 1997.000 -5.000 -95.000 30.000 1.000 27.190 26.510 79.000 -5.200 4.100 1997.000 -5.000 -95.000 31.000 2.000 27.230 26.670 83.200 -5.100 4.700 1997.000 -5.000 -95.000 32.000 2.000 27.280 26.670 84.000 -6.100 4.600 1997.000 -5.000 -95.000 33.000 2.000 27.330 26.670 81.900 -6.000 4.200 1997.000 -5.000 -95.000 34.000 2.000 27.400 26.670 80.700 -6.000 2.800 1997.000 -5.000 -95.000 35.000 2.000 27.530 26.980 78.600 -5.100 3.700 1997.000 -5.000 -95.000 36.000 2.000 27.570 26.980 82.300 -5.300 4.700 1997.000 -5.000 -95.000 37.000 2.000 27.590 26.860 82.800 -4.200 5.500 1997.000 -5.000 -95.000 38.000 2.000 27.610 27.050 84.000 -4.100 5.100 1997.000 -5.000 -95.000 39.000 2.000 27.570 27.050 85.700 -4.900 4.800 1997.000 -5.000 -95.000 40.000 2.000 27.560 27.130 86.900 -5.500 3.700 1997.000 -5.000 -95.000 41.000 2.000 27.560 27.090 83.600 -5.000 5.200 1997.000 -5.000 -95.000 42.000 2.000 27.600 26.860 84.000 -5.200 4.100 1997.000 -5.000 -95.000 43.000 2.000 27.610 26.860 85.200 -4.700 3.800 1997.000 -5.000 -95.000 44.000 2.000 27.560 27.010 83.200 -5.500 5.100 1997.000 -5.000 -95.000 45.000 2.000 27.570 26.980 82.300 -4.900 6.000 1997.000 -5.000 -95.000 46.000 2.000 27.600 26.940 78.600 -5.000 5.200 1997.000 -5.000 -95.000 47.000 2.000 27.620 26.860 85.200 -4.400 5.500 1997.000 -5.000 -95.000 48.000 2.000 27.610 26.980 84.800 -3.500 5.800 1997.000 -5.000 -95.000 49.000 2.000 27.590 26.710 86.500 -4.900 5.000 1997.000 -5.000 -95.000 50.000 2.000 27.660 26.740 90.600 -4.700 2.600 1997.000 -5.000 -95.000 51.000 2.000 27.680 27.170 88.100 -6.600 3.100 1997.000 -5.000 -95.000 52.000 2.000 27.640 26.940 87.700 -7.900 4.500 1997.000 -5.000 -95.000 53.000 2.000 27.600 27.210 81.500 -6.900 3.700 1997.000 -5.000 -95.000 54.000 2.000 27.630 27.130 79.400 -4.700 4.800 1997.000 -5.000 -95.000 55.000 2.000 27.660 27.050 81.900 -4.300 3.700 1997.000 -5.000 -95.000 56.000 2.000 27.650 27.130 86.900 -5.500 3.900 1997.000 -5.000 -95.000 57.000 2.000 27.590 27.280 86.900 -5.900 4.800 1997.000 -5.000 -95.000 58.000 2.000 27.600 27.090 84.800 -5.200 5.300 1997.000 -5.000 -95.000 59.000 2.000 27.600 27.050 77.000 -4.300 5.100 1997.000 -5.000 -95.000 60.000 2.000 27.550 27.050 79.000 -5.300 3.500 1997.000 -5.000 -95.000 61.000 2.000 27.550 26.860 87.300 -6.100 3.800 1997.000 -5.000 -95.000 62.000 3.000 27.660 26.900 91.900 -6.300 2.400 1997.000 -5.000 -95.000 63.000 3.000 27.710 27.400 91.000 -6.100 3.600 1997.000 -5.000 -95.000 64.000 3.000 27.800 27.400 88.100 -7.100 3.700 1997.000 -5.000 -95.000 65.000 3.000 27.910 27.360 82.800 -5.200 4.500 1997.000 -5.000 -95.000 66.000 3.000 28.110 27.320 81.900 -2.600 4.300 1997.000 -5.000 -95.000 67.000 3.000 28.210 27.670 83.600 -2.600 4.300 1997.000 -5.000 -95.000 68.000 3.000 28.280 27.630 83.600 -3.700 3.700 1997.000 -5.000 -95.000 69.000 3.000 28.320 27.480 86.900 -4.900 2.800 1997.000 -5.000 -95.000 70.000 3.000 28.350 27.480 88.600 -5.700 3.500 1997.000 -5.000 -95.000 71.000 3.000 28.390 27.630 90.200 -6.700 3.500 1997.000 -5.000 -95.000 72.000 3.000 28.360 27.130 90.600 -4.500 4.600 1997.000 -5.000 -95.000 73.000 3.000 28.230 26.740 91.000 -3.100 5.000 1997.000 -5.000 -95.000 74.000 3.000 28.260 27.630 83.200 -5.200 4.100 1997.000 -5.000 -95.000 75.000 3.000 28.310 27.360 85.700 -3.700 2.600 1997.000 -5.000 -95.000 76.000 3.000 28.430 27.750 88.100 -4.000 2.900 1997.000 -5.000 -95.000 77.000 3.000 28.600 27.670 89.000 -0.800 3.100 1997.000 -5.000 -95.000 78.000 3.000 28.630 27.090 92.700 -3.300 1.400 1997.000 -5.000 -95.000 79.000 3.000 28.050 25.660 94.800 -1.000 0.800 1997.000 -5.000 -95.000 80.000 3.000 28.330 27.210 88.100 -4.600 4.000 1997.000 -5.000 -95.000 81.000 3.000 28.470 27.480 83.600 -4.200 5.700 1997.000 -5.000 -95.000 82.000 3.000 28.350 26.900 89.400 -4.400 5.200 1997.000 -5.000 -95.000 83.000 3.000 28.240 27.280 90.600 -3.500 6.000 1997.000 -5.000 -95.000 84.000 3.000 28.160 27.280 91.900 -4.500 6.200 1997.000 -5.000 -95.000 85.000 3.000 27.950 26.550 94.800 -1.700 5.000 1997.000 -5.000 -95.000 86.000 3.000 28.110 26.710 90.600 -0.500 3.400 1997.000 -5.000 -95.000 87.000 3.000 28.260 27.790 88.100 -2.600 5.300 1997.000 -5.000 -95.000 88.000 3.000 28.320 27.560 92.700 -3.600 3.000 1997.000 -5.000 -95.000 89.000 3.000 28.400 27.590 92.700 -3.500 1.400 1997.000 -5.000 -95.000 90.000 3.000 28.610 27.790 89.000 -3.800 1.800 1997.000 -5.000 -95.000 91.000 3.000 28.580 28.170 87.300 -4.300 5.700 1997.000 -5.000 -95.000 92.000 3.000 28.940 28.100 90.200 -4.500 4.600 1997.000 -2.000 -110.000 1.000 1.000 27.550 27.190 75.500 -6.800 4.600 1997.000 -2.000 -110.000 2.000 1.000 27.530 26.870 75.100 -5.200 4.900 1997.000 -2.000 -110.000 3.000 1.000 27.510 26.990 73.600 -5.700 4.200 1997.000 -2.000 -110.000 4.000 1.000 27.570 26.990 73.600 -4.700 1.800 1997.000 -2.000 -110.000 5.000 1.000 27.640 26.950 75.100 -3.600 3.700 1997.000 -2.000 -110.000 6.000 1.000 27.660 26.990 74.000 -4.400 2.400 1997.000 -2.000 -110.000 7.000 1.000 27.780 26.990 74.400 -1.800 3.300 1997.000 -2.000 -110.000 8.000 1.000 27.750 27.110 75.900 -3.700 4.300 1997.000 -2.000 -110.000 9.000 1.000 27.710 26.870 75.500 -4.300 4.400 1997.000 -2.000 -110.000 10.000 1.000 27.820 27.150 74.700 -3.500 3.100 1997.000 -2.000 -110.000 11.000 1.000 28.000 27.230 76.700 -4.500 3.000 1997.000 -2.000 -110.000 12.000 1.000 28.070 27.270 79.000 -4.800 2.600 1997.000 -2.000 -110.000 13.000 1.000 28.070 26.910 82.900 -3.800 3.500 1997.000 -2.000 -110.000 14.000 1.000 27.960 25.890 86.400 -2.600 3.400 1997.000 -2.000 -110.000 15.000 1.000 28.010 26.830 82.500 -4.200 1.500 1997.000 -2.000 -110.000 16.000 1.000 28.240 27.150 82.900 -4.400 2.800 1997.000 -2.000 -110.000 17.000 1.000 28.260 26.760 83.700 -5.900 4.400 1997.000 -2.000 -110.000 18.000 1.000 28.180 27.270 77.800 -6.100 5.500 1997.000 -2.000 -110.000 19.000 1.000 28.120 27.310 77.100 -7.400 4.600 1997.000 -2.000 -110.000 20.000 1.000 28.050 27.350 77.100 -6.500 6.500 1997.000 -2.000 -110.000 21.000 1.000 27.990 27.110 78.600 -5.200 7.300 1997.000 -2.000 -110.000 22.000 1.000 27.930 26.990 74.400 -3.200 5.900 1997.000 -2.000 -110.000 23.000 1.000 28.000 27.310 74.700 -2.300 2.900 1997.000 -2.000 -110.000 24.000 1.000 28.030 27.700 78.200 -5.100 2.900 1997.000 -2.000 -110.000 25.000 1.000 28.050 27.860 80.200 -5.800 1.500 1997.000 -2.000 -110.000 26.000 1.000 28.070 27.510 79.400 -5.400 4.600 1997.000 -2.000 -110.000 27.000 1.000 28.080 27.630 77.800 -4.500 4.400 1997.000 -2.000 -110.000 28.000 1.000 28.080 27.590 77.100 -5.300 4.300 1997.000 -2.000 -110.000 29.000 1.000 28.070 27.550 77.500 -6.900 4.400 1997.000 -2.000 -110.000 30.000 1.000 28.090 27.740 71.600 -5.400 3.900 1997.000 -2.000 -110.000 31.000 2.000 28.130 27.350 74.700 -3.600 4.700 1997.000 -2.000 -110.000 32.000 2.000 28.100 27.470 81.300 -4.800 5.100 1997.000 -2.000 -110.000 33.000 2.000 28.070 27.430 83.700 -5.900 4.400 1997.000 -2.000 -110.000 34.000 2.000 28.100 27.820 82.900 -6.800 4.600 1997.000 -2.000 -110.000 35.000 2.000 28.100 27.740 78.600 -6.000 5.000 1997.000 -2.000 -110.000 36.000 2.000 28.080 27.070 83.700 -1.700 6.100 1997.000 -2.000 -110.000 37.000 2.000 28.050 26.120 85.600 0.700 3.000 1997.000 -2.000 -110.000 38.000 2.000 28.120 26.680 86.800 -4.000 5.000 1997.000 -2.000 -110.000 39.000 2.000 28.170 27.700 81.700 -4.800 5.100 1997.000 -2.000 -110.000 40.000 2.000 28.280 27.310 81.700 -5.200 3.700 1997.000 -2.000 -110.000 41.000 2.000 28.260 27.030 82.900 -4.200 4.600 1997.000 -2.000 -110.000 42.000 2.000 28.360 27.820 79.400 -3.200 5.900 1997.000 -2.000 -110.000 43.000 2.000 28.370 27.820 76.300 -2.400 5.800 1997.000 -2.000 -110.000 44.000 2.000 28.340 27.670 75.900 -4.700 4.500 1997.000 -2.000 -110.000 45.000 2.000 28.370 27.780 78.600 -3.800 3.700 1997.000 -2.000 -110.000 46.000 2.000 28.300 26.360 85.200 -1.500 3.900 1997.000 -2.000 -110.000 47.000 2.000 28.290 27.510 82.100 -3.300 4.100 1997.000 -2.000 -110.000 48.000 2.000 28.350 27.270 84.400 -3.600 4.900 1997.000 -2.000 -110.000 49.000 2.000 28.310 27.820 80.200 -4.500 6.600 1997.000 -2.000 -110.000 50.000 2.000 28.300 27.630 82.100 -4.900 5.300 1997.000 -2.000 -110.000 51.000 2.000 28.270 27.510 84.000 -5.600 4.600 1997.000 -2.000 -110.000 52.000 2.000 28.250 27.270 87.500 -5.600 3.600 1997.000 -2.000 -110.000 53.000 2.000 28.240 27.150 87.500 -4.500 1.100 1997.000 -2.000 -110.000 54.000 2.000 28.300 26.790 87.500 -5.900 2.000 1997.000 -2.000 -110.000 55.000 2.000 28.340 27.590 83.700 -4.600 2.400 1997.000 -2.000 -110.000 56.000 2.000 28.380 28.140 80.900 -6.600 2.700 1997.000 -2.000 -110.000 57.000 2.000 28.430 27.980 81.300 -6.000 5.000 1997.000 -2.000 -110.000 58.000 2.000 28.410 26.830 87.100 -4.900 3.300 1997.000 -2.000 -110.000 59.000 2.000 28.510 27.230 84.400 -3.000 2.600 1997.000 -2.000 -110.000 60.000 2.000 28.560 27.900 82.500 -6.500 4.100 1997.000 -2.000 -110.000 61.000 2.000 28.450 27.780 81.700 -7.600 2.600 1997.000 -2.000 -110.000 62.000 3.000 28.430 27.740 86.800 -7.500 0.800 1997.000 -2.000 -110.000 63.000 3.000 28.470 27.940 86.800 -8.100 1.900 1997.000 -2.000 -110.000 64.000 3.000 28.520 27.900 86.800 -7.600 -1.500 1997.000 -2.000 -110.000 65.000 3.000 28.450 26.520 89.500 -2.600 0.600 1997.000 -2.000 -110.000 66.000 3.000 28.480 27.030 84.400 -1.300 1.200 1997.000 -2.000 -110.000 67.000 3.000 28.440 27.820 80.200 -1.100 2.800 1997.000 -2.000 -110.000 68.000 3.000 28.610 27.780 83.700 -3.300 2.200 1997.000 -2.000 -110.000 69.000 3.000 28.670 28.060 80.900 -4.800 4.700 1997.000 -2.000 -110.000 70.000 3.000 28.790 27.550 85.200 -4.300 0.900 1997.000 -2.000 -110.000 71.000 3.000 28.810 27.670 83.300 -3.200 1.600 1997.000 -2.000 -110.000 72.000 3.000 28.570 26.760 83.700 -3.500 -0.100 1997.000 -2.000 -110.000 73.000 3.000 28.810 27.700 84.400 -3.700 0.800 1997.000 -2.000 -110.000 74.000 3.000 28.770 27.820 83.700 -4.700 2.200 1997.000 -2.000 -110.000 75.000 3.000 28.870 26.360 89.900 -2.000 1.400 1997.000 -2.000 -110.000 76.000 3.000 28.890 27.070 86.800 -3.000 4.800 1997.000 -2.000 -110.000 77.000 3.000 28.930 27.700 82.500 -2.100 6.100 1997.000 -2.000 -110.000 78.000 3.000 28.950 27.270 86.400 -1.800 1.600 1997.000 -2.000 -110.000 79.000 3.000 29.120 27.430 85.600 0.400 -0.900 1997.000 -2.000 -110.000 80.000 3.000 29.100 27.510 81.300 -2.600 -0.900 1997.000 -2.000 -110.000 81.000 3.000 29.130 27.780 81.300 -3.500 2.300 1997.000 -2.000 -110.000 82.000 3.000 29.280 28.500 79.800 -4.900 0.800 1997.000 -2.000 -110.000 83.000 3.000 29.010 27.590 86.800 -6.800 3.700 1997.000 -2.000 -110.000 84.000 3.000 28.770 26.790 89.100 -4.300 0.700 1997.000 -2.000 -110.000 85.000 3.000 28.710 27.110 84.800 -3.100 0.900 1997.000 -2.000 -110.000 86.000 3.000 29.030 27.780 83.700 -3.800 0.400 1997.000 -2.000 -110.000 87.000 3.000 28.990 27.430 86.400 -1.300 3.000 1997.000 -2.000 -110.000 88.000 3.000 28.920 27.470 86.000 -1.400 3.400 1997.000 -2.000 -110.000 89.000 3.000 28.910 27.190 89.500 -4.000 3.800 1997.000 -2.000 -110.000 90.000 3.000 28.880 27.070 89.500 -3.500 1.000 1997.000 -2.000 -110.000 91.000 3.000 29.080 28.180 85.600 -3.200 0.500 1997.000 -2.000 -110.000 92.000 3.000 29.320 27.900 87.100 -5.000 2.500 1993.000 0.000 -110.000 1.000 1.000 23.590 23.100 81.200 -2.200 3.400 1993.000 0.000 -110.000 2.000 1.000 23.570 23.150 81.700 -2.500 4.600 1993.000 0.000 -110.000 3.000 1.000 23.670 23.150 82.000 -5.800 4.000 1993.000 0.000 -110.000 4.000 1.000 23.430 23.200 80.800 -6.700 2.800 1993.000 0.000 -110.000 5.000 1.000 23.420 23.130 83.500 -5.700 3.100 1993.000 0.000 -110.000 6.000 1.000 23.430 22.990 81.600 -5.600 4.200 1993.000 0.000 -110.000 7.000 1.000 23.490 22.900 80.700 -5.300 4.100 1993.000 0.000 -110.000 8.000 1.000 23.490 22.830 81.500 -6.200 2.500 1993.000 0.000 -110.000 9.000 1.000 23.240 22.660 85.900 -5.300 3.700 1993.000 0.000 -110.000 10.000 1.000 22.750 22.380 88.600 -3.600 4.800 1993.000 0.000 -110.000 11.000 1.000 22.330 22.210 88.700 -2.200 4.600 1993.000 0.000 -110.000 12.000 1.000 22.280 22.090 87.500 -2.800 2.500 1993.000 0.000 -110.000 13.000 1.000 22.230 22.220 87.500 -2.400 3.400 1993.000 0.000 -110.000 14.000 1.000 22.240 22.110 88.300 -2.800 2.600 1993.000 0.000 -110.000 15.000 1.000 22.460 22.320 84.200 -5.200 2.400 1993.000 0.000 -110.000 16.000 1.000 22.490 22.180 85.500 -4.400 2.300 1993.000 0.000 -110.000 17.000 1.000 22.510 22.470 85.300 -4.100 3.600 1993.000 0.000 -110.000 18.000 1.000 22.520 22.240 85.600 -4.300 2.400 1993.000 0.000 -110.000 19.000 1.000 22.490 22.270 86.200 -4.200 2.700 1993.000 0.000 -110.000 20.000 1.000 22.380 22.060 87.200 -4.600 2.300 1993.000 0.000 -110.000 21.000 1.000 22.390 22.090 87.500 -5.000 2.300 1993.000 0.000 -110.000 22.000 1.000 22.820 22.370 86.000 -4.600 2.700 1993.000 0.000 -110.000 23.000 1.000 23.410 22.700 81.100 -5.900 1.800 1993.000 0.000 -110.000 24.000 1.000 23.930 22.730 79.900 -4.800 2.700 1993.000 0.000 -110.000 25.000 1.000 24.670 22.940 80.300 -5.100 4.900 1993.000 0.000 -110.000 26.000 1.000 23.970 22.920 81.600 -4.400 2.500 1993.000 0.000 -110.000 27.000 1.000 23.100 23.020 84.400 -2.800 4.000 1993.000 0.000 -110.000 28.000 1.000 23.480 22.730 86.700 -3.300 4.000 1993.000 0.000 -110.000 29.000 1.000 24.200 22.980 82.900 -7.200 3.700 1993.000 0.000 -110.000 30.000 1.000 23.820 22.710 82.800 -7.000 3.100 1993.000 0.000 -110.000 31.000 2.000 23.000 22.830 79.900 -4.400 2.400 1993.000 0.000 -110.000 32.000 2.000 22.910 22.830 83.400 -1.500 5.300 1993.000 0.000 -110.000 33.000 2.000 22.800 22.520 88.700 -2.300 3.300 1993.000 0.000 -110.000 34.000 2.000 22.820 22.460 89.100 -4.500 2.800 1993.000 0.000 -110.000 35.000 2.000 22.750 22.530 88.300 -4.000 1.800 1993.000 0.000 -110.000 36.000 2.000 22.710 22.590 91.900 -4.600 2.200 1993.000 0.000 -110.000 37.000 2.000 22.850 22.660 90.300 -3.800 2.300 1993.000 0.000 -110.000 38.000 2.000 22.840 22.730 89.300 -3.400 2.900 1993.000 0.000 -110.000 39.000 2.000 22.890 22.940 90.200 -2.800 3.400 1993.000 0.000 -110.000 40.000 2.000 22.760 22.690 89.400 -4.300 1.900 1993.000 0.000 -110.000 41.000 2.000 23.010 22.930 88.800 -3.500 2.100 1993.000 0.000 -110.000 42.000 2.000 23.200 22.980 87.500 -3.400 3.400 1993.000 0.000 -110.000 43.000 2.000 23.360 23.300 85.400 -3.400 4.800 1993.000 0.000 -110.000 44.000 2.000 23.320 23.170 85.900 -3.900 4.100 1993.000 0.000 -110.000 45.000 2.000 23.370 23.220 84.500 -4.300 3.000 1993.000 0.000 -110.000 46.000 2.000 23.390 23.060 82.700 -5.200 1.500 1993.000 0.000 -110.000 47.000 2.000 23.330 22.950 81.400 -4.100 2.800 1993.000 0.000 -110.000 48.000 2.000 23.290 22.990 86.100 -4.100 3.000 1993.000 0.000 -110.000 49.000 2.000 23.240 22.990 86.700 -4.900 2.400 1993.000 0.000 -110.000 50.000 2.000 23.180 22.880 87.500 -3.600 2.400 1993.000 0.000 -110.000 51.000 2.000 22.930 22.840 86.400 -2.300 3.300 1993.000 0.000 -110.000 52.000 2.000 23.500 23.140 86.800 -4.400 3.100 1993.000 0.000 -110.000 53.000 2.000 23.780 23.490 88.400 -4.400 3.800 1993.000 0.000 -110.000 54.000 2.000 24.100 23.680 85.700 -5.500 2.700 1993.000 0.000 -110.000 55.000 2.000 23.980 23.430 85.600 -3.800 4.100 1993.000 0.000 -110.000 56.000 2.000 23.600 23.030 86.400 -2.000 4.900 1993.000 0.000 -110.000 57.000 2.000 23.370 23.170 87.900 -3.200 4.100 1993.000 0.000 -110.000 58.000 2.000 23.430 23.130 88.600 -3.000 3.300 1993.000 0.000 -110.000 59.000 2.000 23.400 23.140 89.300 -2.100 1.900 1993.000 0.000 -110.000 60.000 2.000 23.440 22.970 90.400 -1.700 2.200 1993.000 0.000 -110.000 61.000 2.000 23.400 23.230 90.100 -3.400 3.500 1993.000 0.000 -110.000 62.000 3.000 23.370 23.210 89.900 -4.300 2.600 1993.000 0.000 -110.000 63.000 3.000 23.450 23.160 90.000 -4.100 1.100 1993.000 0.000 -110.000 64.000 3.000 23.710 23.140 87.700 -3.000 1.600 1993.000 0.000 -110.000 65.000 3.000 24.290 23.390 85.800 -3.000 2.900 1993.000 0.000 -110.000 66.000 3.000 24.080 23.530 87.800 -3.400 2.000 1993.000 0.000 -110.000 67.000 3.000 24.250 23.710 87.200 -3.200 3.100 1993.000 0.000 -110.000 68.000 3.000 24.190 23.820 87.100 -4.200 3.500 1993.000 0.000 -110.000 69.000 3.000 24.190 23.850 86.200 -4.200 1.300 1993.000 0.000 -110.000 70.000 3.000 24.140 23.800 85.900 -3.200 2.600 1993.000 0.000 -110.000 71.000 3.000 23.900 23.650 87.200 -3.500 2.800 1993.000 0.000 -110.000 72.000 3.000 23.880 23.580 88.500 -4.300 2.200 1993.000 0.000 -110.000 73.000 3.000 23.960 23.470 88.600 -3.900 0.700 1993.000 0.000 -110.000 74.000 3.000 24.010 23.770 89.100 -3.500 3.100 1993.000 0.000 -110.000 75.000 3.000 23.890 23.590 89.500 -4.300 2.100 1993.000 0.000 -110.000 76.000 3.000 24.000 23.650 87.800 -4.100 0.600 1993.000 0.000 -110.000 77.000 3.000 24.000 23.570 85.100 -3.800 3.000 1993.000 0.000 -110.000 78.000 3.000 23.970 23.520 86.600 -2.900 2.900 1993.000 0.000 -110.000 79.000 3.000 24.030 23.770 87.300 -3.000 2.000 1993.000 0.000 -110.000 80.000 3.000 23.930 23.470 87.500 -3.700 1.000 1993.000 0.000 -110.000 81.000 3.000 23.930 23.450 86.400 -4.200 1.300 1993.000 0.000 -110.000 82.000 3.000 23.940 23.570 89.100 -3.100 2.100 1993.000 0.000 -110.000 83.000 3.000 23.980 23.750 89.300 -4.400 2.100 1993.000 0.000 -110.000 84.000 3.000 24.160 23.670 90.400 -3.500 1.200 1993.000 0.000 -110.000 85.000 3.000 23.750 23.580 91.100 -5.500 2.100 1993.000 0.000 -110.000 86.000 3.000 23.420 23.500 91.800 -4.200 1.800 1993.000 0.000 -110.000 87.000 3.000 23.480 23.530 91.900 -3.600 1.400 1993.000 0.000 -110.000 88.000 3.000 23.690 23.540 92.200 -2.500 0.900 1993.000 0.000 -110.000 89.000 3.000 23.670 23.430 89.900 -2.700 1.100 1993.000 0.000 -110.000 90.000 3.000 24.320 23.890 88.600 -2.100 0.400 1993.000 0.000 -110.000 91.000 3.000 24.090 23.790 91.600 -2.300 1.500 1993.000 0.000 -110.000 92.000 3.000 24.150 23.400 86.800 -3.000 1.900 1993.000 0.000 -95.000 1.000 1.000 24.990 23.190 86.800 -5.300 1.800 1993.000 0.000 -95.000 2.000 1.000 25.050 23.500 86.800 -4.700 3.100 1993.000 0.000 -95.000 3.000 1.000 23.600 23.400 86.800 -5.600 3.100 1993.000 0.000 -95.000 4.000 1.000 24.930 22.870 86.800 -7.100 2.500 1993.000 0.000 -95.000 5.000 1.000 24.780 22.400 86.800 -7.300 0.300 1993.000 0.000 -95.000 6.000 1.000 24.480 22.720 86.800 -6.500 0.000 1993.000 0.000 -95.000 7.000 1.000 23.960 22.560 86.800 -5.300 3.600 1993.000 0.000 -95.000 8.000 1.000 23.320 22.640 86.800 -4.000 5.500 1993.000 0.000 -95.000 9.000 1.000 22.460 22.250 86.800 -2.200 6.300 1993.000 0.000 -95.000 10.000 1.000 21.940 21.970 86.800 -0.800 4.800 1993.000 0.000 -95.000 11.000 1.000 21.970 21.810 86.800 -2.200 4.300 1993.000 0.000 -95.000 12.000 1.000 21.600 21.420 86.800 -2.800 4.100 1993.000 0.000 -95.000 13.000 1.000 21.860 21.890 86.800 -3.000 3.900 1993.000 0.000 -95.000 14.000 1.000 21.860 21.850 86.800 -3.200 3.600 1993.000 0.000 -95.000 15.000 1.000 21.870 21.890 86.800 -3.000 3.100 1993.000 0.000 -95.000 16.000 1.000 21.960 21.850 86.800 -4.000 2.800 1993.000 0.000 -95.000 17.000 1.000 22.640 22.090 86.800 -6.300 0.800 1993.000 0.000 -95.000 18.000 1.000 22.900 22.440 86.800 -5.400 0.100 1993.000 0.000 -95.000 19.000 1.000 23.080 22.520 86.800 -6.400 -0.400 1993.000 0.000 -95.000 20.000 1.000 23.240 22.290 86.800 -6.600 1.400 1993.000 0.000 -95.000 21.000 1.000 23.600 23.400 86.800 -6.300 0.500 1993.000 0.000 -95.000 22.000 1.000 23.520 22.130 86.800 -5.300 0.700 1993.000 0.000 -95.000 23.000 1.000 23.370 22.290 86.800 -4.800 1.900 1993.000 0.000 -95.000 24.000 1.000 22.950 22.170 86.800 -5.400 3.200 1993.000 0.000 -95.000 25.000 1.000 22.520 21.890 86.800 -5.000 2.300 1993.000 0.000 -95.000 26.000 1.000 22.320 21.730 86.800 -4.400 2.000 1993.000 0.000 -95.000 27.000 1.000 22.280 21.660 86.800 -3.700 1.900 1993.000 0.000 -95.000 28.000 1.000 21.800 21.730 86.800 -1.800 2.700 1993.000 0.000 -95.000 29.000 1.000 21.850 21.890 86.800 -0.500 3.600 1993.000 0.000 -95.000 30.000 1.000 21.780 22.010 86.800 -0.300 3.100 1993.000 0.000 -95.000 31.000 2.000 21.900 22.210 86.800 -1.500 4.100 1993.000 0.000 -95.000 32.000 2.000 22.970 22.560 86.800 -6.200 1.900 1993.000 0.000 -95.000 33.000 2.000 23.180 22.720 86.800 -6.700 3.200 1993.000 0.000 -95.000 34.000 2.000 22.720 22.440 86.800 -5.000 3.600 1993.000 0.000 -95.000 35.000 2.000 22.510 22.250 86.800 -5.100 3.000 1993.000 0.000 -95.000 36.000 2.000 22.400 22.250 86.800 -3.200 5.600 1993.000 0.000 -95.000 37.000 2.000 22.190 22.320 86.800 -1.500 4.900 1993.000 0.000 -95.000 38.000 2.000 22.030 22.250 86.800 -3.200 4.900 1993.000 0.000 -95.000 39.000 2.000 21.900 22.090 86.800 -1.500 3.300 1993.000 0.000 -95.000 40.000 2.000 21.990 22.170 86.800 -1.500 -2.600 1993.000 0.000 -95.000 41.000 2.000 22.260 22.290 86.800 -2.000 -3.300 1993.000 0.000 -95.000 42.000 2.000 22.350 22.560 86.800 -3.600 -3.200 1993.000 0.000 -95.000 43.000 2.000 22.480 22.520 86.800 -4.000 -0.100 1993.000 0.000 -95.000 44.000 2.000 22.550 22.600 86.800 -2.700 -2.400 1993.000 0.000 -95.000 45.000 2.000 22.440 22.640 86.800 -3.300 -1.700 1993.000 0.000 -95.000 46.000 2.000 22.360 22.440 86.800 1.600 3.800 1993.000 0.000 -95.000 47.000 2.000 22.550 22.600 86.800 2.300 3.500 1993.000 0.000 -95.000 48.000 2.000 22.730 22.840 86.800 3.000 2.200 1993.000 0.000 -95.000 49.000 2.000 22.850 22.840 86.800 3.300 0.200 1993.000 0.000 -95.000 50.000 2.000 23.110 23.030 86.800 2.900 -0.100 1993.000 0.000 -95.000 51.000 2.000 23.330 23.270 86.800 0.600 -4.300 1993.000 0.000 -95.000 52.000 2.000 23.360 23.420 86.800 -2.500 0.700 1993.000 0.000 -95.000 53.000 2.000 23.430 23.390 86.800 -4.200 3.200 1993.000 0.000 -95.000 54.000 2.000 23.280 23.350 86.800 -2.000 4.100 1993.000 0.000 -95.000 55.000 2.000 22.990 23.230 86.800 -0.800 4.000 1993.000 0.000 -95.000 56.000 2.000 23.160 23.270 86.800 -0.800 3.300 1993.000 0.000 -95.000 57.000 2.000 23.810 23.540 86.800 -2.300 2.900 1993.000 0.000 -95.000 58.000 2.000 23.800 23.540 86.800 -2.500 3.300 1993.000 0.000 -95.000 59.000 2.000 23.730 23.700 86.800 -2.000 2.500 1993.000 0.000 -95.000 60.000 2.000 23.670 23.580 86.800 -4.100 1.800 1993.000 0.000 -95.000 61.000 2.000 23.770 23.580 86.800 -4.900 1.700 1993.000 0.000 -95.000 62.000 3.000 23.600 23.460 86.800 -4.900 -0.200 1993.000 0.000 -95.000 63.000 3.000 24.200 23.700 86.800 -5.000 -0.300 1993.000 0.000 -95.000 64.000 3.000 24.070 23.860 86.800 -4.400 1.200 1993.000 0.000 -95.000 65.000 3.000 24.020 23.820 86.800 -4.900 1.000 1993.000 0.000 -95.000 66.000 3.000 24.650 24.210 86.800 -5.900 0.800 1993.000 0.000 -95.000 67.000 3.000 24.420 24.010 86.800 -5.800 1.700 1993.000 0.000 -95.000 68.000 3.000 23.920 23.900 86.800 -3.700 1.800 1993.000 0.000 -95.000 69.000 3.000 23.560 23.660 86.800 -2.900 3.200 1993.000 0.000 -95.000 70.000 3.000 23.660 23.740 86.800 -1.900 3.500 1993.000 0.000 -95.000 71.000 3.000 23.630 23.660 86.800 -2.400 3.100 1993.000 0.000 -95.000 72.000 3.000 23.520 23.540 86.800 -2.900 3.100 1993.000 0.000 -95.000 73.000 3.000 23.600 23.540 86.800 -2.600 2.600 1993.000 0.000 -95.000 74.000 3.000 23.400 23.540 86.800 -3.000 3.300 1993.000 0.000 -95.000 75.000 3.000 23.460 23.310 86.800 -3.100 1.500 1993.000 0.000 -95.000 76.000 3.000 23.550 23.390 86.800 -2.200 -0.800 1993.000 0.000 -95.000 77.000 3.000 24.010 23.740 86.800 -3.300 -1.200 1993.000 0.000 -95.000 78.000 3.000 23.940 23.900 86.800 -3.500 -1.100 1993.000 0.000 -95.000 79.000 3.000 24.280 24.010 86.800 -1.800 -1.300 1993.000 0.000 -95.000 80.000 3.000 24.560 24.170 86.800 -1.700 -1.400 1993.000 0.000 -95.000 81.000 3.000 24.740 24.050 86.800 -1.800 -1.600 1993.000 0.000 -95.000 82.000 3.000 25.070 24.640 86.800 -2.700 -2.400 1993.000 0.000 -95.000 83.000 3.000 25.660 24.960 86.800 -6.000 -1.800 1993.000 0.000 -95.000 84.000 3.000 26.000 24.920 86.800 -6.900 -0.700 1993.000 0.000 -95.000 85.000 3.000 25.790 24.600 86.800 -6.600 -1.400 1993.000 0.000 -95.000 86.000 3.000 26.380 24.840 86.800 -6.200 -1.600 1993.000 0.000 -95.000 87.000 3.000 25.940 24.880 86.800 -5.700 0.800 1993.000 0.000 -95.000 88.000 3.000 25.020 24.370 86.800 -2.400 1.100 1993.000 0.000 -95.000 89.000 3.000 24.610 24.520 86.800 -1.700 1.300 1993.000 0.000 -95.000 90.000 3.000 24.790 24.760 86.800 -2.000 2.000 1993.000 0.000 -95.000 91.000 3.000 24.780 24.760 86.800 -1.800 2.300 1993.000 0.000 -95.000 92.000 3.000 24.790 24.490 86.800 -1.400 3.400 1993.000 -2.000 -95.000 1.000 1.000 22.660 22.430 85.000 -2.600 3.500 1993.000 -2.000 -95.000 2.000 1.000 22.610 22.470 88.600 -2.900 4.200 1993.000 -2.000 -95.000 3.000 1.000 22.540 22.190 90.400 -3.600 4.300 1993.000 -2.000 -95.000 4.000 1.000 22.650 22.350 88.600 -5.500 4.300 1993.000 -2.000 -95.000 5.000 1.000 22.540 22.390 85.200 -4.500 4.600 1993.000 -2.000 -95.000 6.000 1.000 22.480 22.510 84.800 -3.200 4.800 1993.000 -2.000 -95.000 7.000 1.000 22.460 22.550 86.300 -3.200 4.500 1993.000 -2.000 -95.000 8.000 1.000 22.430 22.630 85.300 -3.800 4.900 1993.000 -2.000 -95.000 9.000 1.000 22.440 22.590 88.000 -3.700 5.000 1993.000 -2.000 -95.000 10.000 1.000 22.530 22.510 88.000 -3.900 4.800 1993.000 -2.000 -95.000 11.000 1.000 22.640 22.310 87.700 -3.100 4.700 1993.000 -2.000 -95.000 12.000 1.000 22.610 22.510 85.200 -2.700 5.100 1993.000 -2.000 -95.000 13.000 1.000 22.590 22.510 81.400 -2.800 5.100 1993.000 -2.000 -95.000 14.000 1.000 22.750 22.750 79.800 -3.800 5.200 1993.000 -2.000 -95.000 15.000 1.000 22.630 22.830 81.600 -3.200 4.500 1993.000 -2.000 -95.000 16.000 1.000 22.500 22.710 84.300 -4.900 3.400 1993.000 -2.000 -95.000 17.000 1.000 22.390 22.790 87.200 -4.500 3.200 1993.000 -2.000 -95.000 18.000 1.000 22.340 22.510 88.700 -3.200 3.100 1993.000 -2.000 -95.000 19.000 1.000 22.310 22.750 86.900 -3.100 4.100 1993.000 -2.000 -95.000 20.000 1.000 21.990 22.430 85.200 -3.500 5.200 1993.000 -2.000 -95.000 21.000 1.000 21.840 22.430 82.500 -2.800 3.600 1993.000 -2.000 -95.000 22.000 1.000 22.040 22.230 84.100 -2.700 3.300 1993.000 -2.000 -95.000 23.000 1.000 22.200 22.190 85.800 -2.000 2.000 1993.000 -2.000 -95.000 24.000 1.000 22.330 22.310 86.400 -2.700 3.500 1993.000 -2.000 -95.000 25.000 1.000 22.310 22.350 86.500 -2.800 4.000 1993.000 -2.000 -95.000 26.000 1.000 22.370 22.510 87.500 -3.900 2.800 1993.000 -2.000 -95.000 27.000 1.000 22.430 22.710 85.700 -2.600 3.600 1993.000 -2.000 -95.000 28.000 1.000 22.620 22.860 86.600 -2.100 4.000 1993.000 -2.000 -95.000 29.000 1.000 22.700 22.510 88.500 -0.900 3.100 1993.000 -2.000 -95.000 30.000 1.000 22.830 22.860 88.900 -2.800 4.100 1993.000 -2.000 -95.000 31.000 2.000 22.770 23.100 90.100 -5.100 3.200 1993.000 -2.000 -95.000 32.000 2.000 22.760 23.140 90.400 -4.500 4.800 1993.000 -2.000 -95.000 33.000 2.000 22.690 22.900 88.600 -3.900 4.700 1993.000 -2.000 -95.000 34.000 2.000 22.710 22.900 83.600 -3.900 3.100 1993.000 -2.000 -95.000 35.000 2.000 22.810 22.510 86.600 -4.200 1.600 1993.000 -2.000 -95.000 36.000 2.000 22.830 22.860 87.900 -4.800 4.300 1993.000 -2.000 -95.000 37.000 2.000 22.760 23.020 89.600 -4.600 4.300 1993.000 -2.000 -95.000 38.000 2.000 22.680 22.830 90.600 -3.900 3.500 1993.000 -2.000 -95.000 39.000 2.000 22.690 22.940 90.800 -3.000 4.000 1993.000 -2.000 -95.000 40.000 2.000 22.810 22.940 90.100 -2.400 3.600 1993.000 -2.000 -95.000 41.000 2.000 22.890 22.830 88.100 -1.800 3.400 1993.000 -2.000 -95.000 42.000 2.000 22.800 22.940 88.800 -1.700 4.000 1993.000 -2.000 -95.000 43.000 2.000 22.990 23.020 88.300 -1.000 4.900 1993.000 -2.000 -95.000 44.000 2.000 23.140 23.260 84.600 -0.300 4.900 1993.000 -2.000 -95.000 45.000 2.000 23.150 23.060 80.000 -1.500 5.600 1993.000 -2.000 -95.000 46.000 2.000 23.200 23.020 79.900 -1.400 4.200 1993.000 -2.000 -95.000 47.000 2.000 23.260 23.260 86.000 -1.600 4.300 1993.000 -2.000 -95.000 48.000 2.000 23.320 23.500 91.100 -2.300 3.000 1993.000 -2.000 -95.000 49.000 2.000 23.190 23.420 88.300 -3.800 3.400 1993.000 -2.000 -95.000 50.000 2.000 23.240 23.570 91.100 -2.700 2.800 1993.000 -2.000 -95.000 51.000 2.000 23.390 23.610 91.000 -2.300 3.200 1993.000 -2.000 -95.000 52.000 2.000 23.410 23.690 89.700 -2.700 4.800 1993.000 -2.000 -95.000 53.000 2.000 23.490 23.850 86.700 -2.600 4.300 1993.000 -2.000 -95.000 54.000 2.000 23.580 23.690 86.700 -1.500 5.300 1993.000 -2.000 -95.000 55.000 2.000 23.690 23.810 85.500 -0.900 5.100 1993.000 -2.000 -95.000 56.000 2.000 23.780 23.850 85.800 -1.900 3.900 1993.000 -2.000 -95.000 57.000 2.000 23.820 23.930 88.300 -2.700 3.300 1993.000 -2.000 -95.000 58.000 2.000 23.840 23.930 90.600 -2.800 2.600 1993.000 -2.000 -95.000 59.000 2.000 24.100 24.170 90.300 -2.200 2.700 1993.000 -2.000 -95.000 60.000 2.000 24.120 24.200 89.100 -3.000 3.700 1993.000 -2.000 -95.000 61.000 2.000 24.120 24.280 88.900 -3.500 3.200 1993.000 -2.000 -95.000 62.000 3.000 24.160 24.280 88.400 -4.300 2.600 1993.000 -2.000 -95.000 63.000 3.000 24.080 24.090 88.500 -2.500 2.400 1993.000 -2.000 -95.000 64.000 3.000 24.030 24.280 89.000 -1.000 2.400 1993.000 -2.000 -95.000 65.000 3.000 23.910 24.130 90.700 -1.800 3.500 1993.000 -2.000 -95.000 66.000 3.000 23.960 24.200 90.900 -3.200 3.000 1993.000 -2.000 -95.000 67.000 3.000 23.950 24.200 91.000 -3.300 3.700 1993.000 -2.000 -95.000 68.000 3.000 24.010 24.240 89.500 -2.500 3.600 1993.000 -2.000 -95.000 69.000 3.000 24.050 24.400 90.000 -3.200 3.400 1993.000 -2.000 -95.000 70.000 3.000 24.070 24.400 89.800 -3.800 4.000 1993.000 -2.000 -95.000 71.000 3.000 24.080 24.440 88.700 -4.200 3.100 1993.000 -2.000 -95.000 72.000 3.000 24.000 24.400 89.000 -3.700 3.500 1993.000 -2.000 -95.000 73.000 3.000 23.980 24.320 88.500 -2.600 3.500 1993.000 -2.000 -95.000 74.000 3.000 24.020 24.400 88.100 -1.500 5.400 1993.000 -2.000 -95.000 75.000 3.000 24.150 24.320 83.100 -1.900 4.100 1993.000 -2.000 -95.000 76.000 3.000 24.430 24.090 81.800 -1.300 1.600 1993.000 -2.000 -95.000 77.000 3.000 24.620 24.800 84.300 -1.100 4.100 1993.000 -2.000 -95.000 78.000 3.000 24.430 24.640 88.500 -0.900 3.300 1993.000 -2.000 -95.000 79.000 3.000 24.760 24.560 88.400 -0.200 2.800 1993.000 -2.000 -95.000 80.000 3.000 24.930 24.400 89.200 0.600 2.400 1993.000 -2.000 -95.000 81.000 3.000 24.940 24.520 89.800 -1.500 3.400 1993.000 -2.000 -95.000 82.000 3.000 24.850 24.440 91.800 -4.000 1.300 1993.000 -2.000 -95.000 83.000 3.000 24.700 24.910 90.900 -4.300 1.600 1993.000 -2.000 -95.000 84.000 3.000 24.540 24.800 89.800 -4.400 1.600 1993.000 -2.000 -95.000 85.000 3.000 23.600 23.400 89.900 -3.400 2.400 1993.000 -2.000 -95.000 86.000 3.000 24.590 24.950 91.000 -3.600 2.400 1993.000 -2.000 -95.000 87.000 3.000 24.710 25.030 89.800 -3.500 3.200 1993.000 -2.000 -95.000 88.000 3.000 25.110 25.030 91.300 -1.300 0.900 1993.000 -2.000 -95.000 89.000 3.000 25.140 25.030 89.700 -1.900 3.100 1993.000 -2.000 -95.000 90.000 3.000 25.210 24.870 90.500 -1.200 3.500 1993.000 -2.000 -95.000 91.000 3.000 25.430 24.990 89.100 -0.500 3.800 1993.000 -2.000 -95.000 92.000 3.000 25.570 24.680 87.200 1.300 2.300 1993.000 -2.000 -110.000 1.000 1.000 24.540 23.780 81.100 -4.800 2.500 1993.000 -2.000 -110.000 2.000 1.000 24.260 23.660 82.200 -5.000 3.000 1993.000 -2.000 -110.000 3.000 1.000 23.830 23.620 84.000 -7.000 1.600 1993.000 -2.000 -110.000 4.000 1.000 23.620 23.540 84.800 -7.800 1.200 1993.000 -2.000 -110.000 5.000 1.000 23.440 23.260 88.400 -7.300 1.200 1993.000 -2.000 -110.000 6.000 1.000 23.330 23.540 85.100 -6.200 2.100 1993.000 -2.000 -110.000 7.000 1.000 23.190 23.380 85.000 -6.100 2.500 1993.000 -2.000 -110.000 8.000 1.000 23.070 22.980 87.600 -5.300 0.800 1993.000 -2.000 -110.000 9.000 1.000 23.090 23.220 89.100 -5.000 2.100 1993.000 -2.000 -110.000 10.000 1.000 23.190 23.260 88.200 -4.800 3.500 1993.000 -2.000 -110.000 11.000 1.000 23.340 23.300 85.800 -4.900 2.800 1993.000 -2.000 -110.000 12.000 1.000 23.360 23.420 85.000 -5.400 2.200 1993.000 -2.000 -110.000 13.000 1.000 23.410 23.460 83.200 -5.600 2.600 1993.000 -2.000 -110.000 14.000 1.000 23.460 23.380 83.300 -6.100 1.300 1993.000 -2.000 -110.000 15.000 1.000 23.490 23.340 81.600 -7.200 0.900 1993.000 -2.000 -110.000 16.000 1.000 23.500 23.300 82.500 -6.800 1.900 1993.000 -2.000 -110.000 17.000 1.000 23.540 23.420 83.900 -6.800 2.500 1993.000 -2.000 -110.000 18.000 1.000 23.610 23.380 83.300 -6.100 1.600 1993.000 -2.000 -110.000 19.000 1.000 23.560 23.340 83.300 -6.100 1.500 1993.000 -2.000 -110.000 20.000 1.000 23.490 23.380 85.400 -6.300 2.200 1993.000 -2.000 -110.000 21.000 1.000 23.450 23.420 86.100 -7.100 2.300 1993.000 -2.000 -110.000 22.000 1.000 23.410 23.380 85.300 -6.700 1.400 1993.000 -2.000 -110.000 23.000 1.000 23.260 23.300 84.900 -6.500 1.300 1993.000 -2.000 -110.000 24.000 1.000 23.110 23.180 85.700 -5.200 1.700 1993.000 -2.000 -110.000 25.000 1.000 22.930 22.980 86.700 -5.600 2.300 1993.000 -2.000 -110.000 26.000 1.000 22.810 22.860 87.400 -4.200 1.100 1993.000 -2.000 -110.000 27.000 1.000 22.850 22.940 89.000 -3.100 2.400 1993.000 -2.000 -110.000 28.000 1.000 22.880 23.020 88.200 -4.700 2.700 1993.000 -2.000 -110.000 29.000 1.000 22.930 23.100 87.500 -6.500 1.600 1993.000 -2.000 -110.000 30.000 1.000 22.950 23.060 85.200 -6.700 1.400 1993.000 -2.000 -110.000 31.000 2.000 23.060 23.100 85.200 -4.700 0.700 1993.000 -2.000 -110.000 32.000 2.000 23.250 23.300 83.200 -3.400 3.000 1993.000 -2.000 -110.000 33.000 2.000 23.160 23.380 85.800 -4.000 4.400 1993.000 -2.000 -110.000 34.000 2.000 23.100 23.340 87.800 -5.600 2.500 1993.000 -2.000 -110.000 35.000 2.000 23.270 23.380 86.400 -5.000 1.500 1993.000 -2.000 -110.000 36.000 2.000 23.380 23.500 85.300 -6.000 1.300 1993.000 -2.000 -110.000 37.000 2.000 23.570 23.820 86.300 -5.700 2.000 1993.000 -2.000 -110.000 38.000 2.000 23.660 23.620 88.100 -5.300 3.000 1993.000 -2.000 -110.000 39.000 2.000 23.770 23.900 89.900 -5.200 2.900 1993.000 -2.000 -110.000 40.000 2.000 23.870 23.660 87.500 -5.900 2.400 1993.000 -2.000 -110.000 41.000 2.000 23.920 23.900 85.800 -5.500 2.000 1993.000 -2.000 -110.000 42.000 2.000 23.960 23.940 83.900 -5.100 4.300 1993.000 -2.000 -110.000 43.000 2.000 24.040 23.820 82.100 -5.600 3.200 1993.000 -2.000 -110.000 44.000 2.000 23.980 23.740 84.000 -5.900 2.800 1993.000 -2.000 -110.000 45.000 2.000 24.010 23.780 81.300 -6.800 2.000 1993.000 -2.000 -110.000 46.000 2.000 24.030 23.740 80.500 -6.900 0.200 1993.000 -2.000 -110.000 47.000 2.000 23.950 23.660 82.500 -6.400 1.400 1993.000 -2.000 -110.000 48.000 2.000 23.900 23.620 85.000 -6.500 1.900 1993.000 -2.000 -110.000 49.000 2.000 23.860 23.780 88.100 -6.100 3.000 1993.000 -2.000 -110.000 50.000 2.000 23.890 23.860 84.800 -5.200 2.500 1993.000 -2.000 -110.000 51.000 2.000 23.960 23.700 85.400 -4.200 1.800 1993.000 -2.000 -110.000 52.000 2.000 23.970 23.780 88.300 -5.400 1.400 1993.000 -2.000 -110.000 53.000 2.000 23.970 23.660 91.900 -5.200 1.500 1993.000 -2.000 -110.000 54.000 2.000 23.990 23.740 91.300 -4.500 0.800 1993.000 -2.000 -110.000 55.000 2.000 23.890 23.900 87.000 -4.400 3.000 1993.000 -2.000 -110.000 56.000 2.000 23.890 23.860 86.400 -3.900 2.900 1993.000 -2.000 -110.000 57.000 2.000 23.950 23.900 85.800 -5.800 2.500 1993.000 -2.000 -110.000 58.000 2.000 23.980 23.940 87.700 -5.100 1.500 1993.000 -2.000 -110.000 59.000 2.000 24.000 23.940 87.100 -4.400 1.400 1993.000 -2.000 -110.000 60.000 2.000 24.060 23.980 88.200 -3.400 2.300 1993.000 -2.000 -110.000 61.000 2.000 24.000 23.980 90.400 -4.700 2.400 1993.000 -2.000 -110.000 62.000 3.000 24.020 24.100 90.000 -6.000 1.100 1993.000 -2.000 -110.000 63.000 3.000 24.080 24.260 89.600 -5.400 2.400 1993.000 -2.000 -110.000 64.000 3.000 24.210 24.180 84.700 -4.400 2.300 1993.000 -2.000 -110.000 65.000 3.000 24.300 24.340 81.700 -4.600 2.300 1993.000 -2.000 -110.000 66.000 3.000 24.220 24.540 82.300 -5.000 2.400 1993.000 -2.000 -110.000 67.000 3.000 24.230 24.420 86.600 -5.100 3.100 1993.000 -2.000 -110.000 68.000 3.000 24.220 24.380 84.900 -5.800 3.100 1993.000 -2.000 -110.000 69.000 3.000 24.430 24.340 87.600 -5.000 0.400 1993.000 -2.000 -110.000 70.000 3.000 24.600 24.460 86.100 -5.000 1.100 1993.000 -2.000 -110.000 71.000 3.000 24.660 24.180 88.500 -4.900 2.200 1993.000 -2.000 -110.000 72.000 3.000 24.760 24.500 87.900 -5.500 1.700 1993.000 -2.000 -110.000 73.000 3.000 24.900 24.620 87.900 -5.000 0.500 1993.000 -2.000 -110.000 74.000 3.000 24.890 24.580 88.300 -5.500 2.800 1993.000 -2.000 -110.000 75.000 3.000 24.870 24.730 87.100 -6.500 2.600 1993.000 -2.000 -110.000 76.000 3.000 24.970 24.970 81.700 -5.600 1.100 1993.000 -2.000 -110.000 77.000 3.000 25.030 24.620 80.800 -5.700 1.000 1993.000 -2.000 -110.000 78.000 3.000 24.940 24.580 83.100 -4.300 2.500 1993.000 -2.000 -110.000 79.000 3.000 24.730 24.380 85.500 -3.300 1.800 1993.000 -2.000 -110.000 80.000 3.000 24.550 24.420 85.500 -5.000 2.500 1993.000 -2.000 -110.000 81.000 3.000 24.550 24.340 84.900 -4.800 0.700 1993.000 -2.000 -110.000 82.000 3.000 24.620 24.420 89.000 -4.500 1.200 1993.000 -2.000 -110.000 83.000 3.000 24.690 24.700 88.100 -6.000 2.700 1993.000 -2.000 -110.000 84.000 3.000 24.770 24.700 90.600 -4.700 1.500 1993.000 -2.000 -110.000 85.000 3.000 24.640 24.660 90.000 -6.300 1.700 1993.000 -2.000 -110.000 86.000 3.000 24.560 24.660 88.300 -6.300 1.000 1993.000 -2.000 -110.000 87.000 3.000 24.690 24.660 89.200 -5.400 0.500 1993.000 -2.000 -110.000 88.000 3.000 24.780 24.620 90.800 -4.400 1.700 1993.000 -2.000 -110.000 89.000 3.000 24.880 24.500 91.100 -3.000 0.200 1993.000 -2.000 -110.000 90.000 3.000 25.120 24.890 89.700 -4.000 1.100 1993.000 -2.000 -110.000 91.000 3.000 25.160 24.930 89.500 -4.300 2.500 1993.000 -2.000 -110.000 92.000 3.000 25.140 24.770 87.900 -4.600 2.300 ggobi-2.1.12/data/sleep.csv0000644000175000017500000001173514651527764011133 "","BodyWgt","BrainWgt","NonD","Dream","Sleep","Span","Gest","Pred","Exp","Danger" "1",6654,5712,NA,NA,3.29999995231628,38.5999984741211,645,3,5,3 "2",1,6.59999990463257,6.30000019073486,2,8.30000019073486,4.5,42,3,1,3 "3",3.38499999046326,44.5,NA,NA,12.5,14,60,1,1,1 "4",0.9200000166893,5.69999980926514,NA,NA,16.5,NA,25,5,2,3 "5",2547,4603,2.09999990463257,1.79999995231628,3.90000009536743,69,624,3,5,4 "6",10.5500001907349,179.5,9.10000038146973,0.699999988079071,9.80000019073486,27,180,4,4,4 "7",0.0230000000447035,0.300000011920929,15.8000001907349,3.90000009536743,19.7000007629395,19,35,1,1,1 "8",160,169,5.19999980926514,1,6.19999980926514,30.3999996185303,392,4,5,4 "9",3.29999995231628,25.6000003814697,10.8999996185303,3.59999990463257,14.5,28,63,1,2,1 "10",52.1599998474121,440,8.30000019073486,1.39999997615814,9.69999980926514,50,230,1,1,1 "11",0.425000011920929,6.40000009536743,11,1.5,12.5,7,112,5,4,4 "12",465,423,3.20000004768372,0.699999988079071,3.90000009536743,30,281,5,5,5 "13",0.550000011920929,2.40000009536743,7.59999990463257,2.70000004768372,10.3000001907349,NA,NA,2,1,2 "14",187.100006103516,419,NA,NA,3.09999990463257,40,365,5,5,5 "15",0.0750000029802322,1.20000004768372,6.30000019073486,2.09999990463257,8.39999961853027,3.5,42,1,1,1 "16",3,25,8.60000038146973,0,8.60000038146973,50,28,2,2,2 "17",0.785000026226044,3.5,6.59999990463257,4.09999990463257,10.6999998092651,6,42,2,2,2 "18",0.200000002980232,5,9.5,1.20000004768372,10.6999998092651,10.3999996185303,120,2,2,2 "19",1.4099999666214,17.5,4.80000019073486,1.29999995231628,6.09999990463257,34,NA,1,2,1 "20",60,81,12,6.09999990463257,18.1000003814697,7,NA,1,1,1 "21",529,680,NA,0.300000011920929,NA,28,400,5,5,5 "22",27.6599998474121,115,3.29999995231628,0.5,3.79999995231628,20,148,5,5,5 "23",0.119999997317791,1,11,3.40000009536743,14.3999996185303,3.90000009536743,16,3,1,2 "24",207,406,NA,NA,12,39.2999992370605,252,1,4,1 "25",85,325,4.69999980926514,1.5,6.19999980926514,41,310,1,3,1 "26",36.3300018310547,119.5,NA,NA,13,16.2000007629395,63,1,1,1 "27",0.101000003516674,4,10.3999996185303,3.40000009536743,13.8000001907349,9,28,5,1,3 "28",1.03999996185303,5.5,7.40000009536743,0.800000011920929,8.19999980926514,7.59999990463257,68,5,3,4 "29",521,655,2.09999990463257,0.800000011920929,2.90000009536743,46,336,5,5,5 "30",100,157,NA,NA,10.8000001907349,22.3999996185303,100,1,1,1 "31",35,56,NA,NA,NA,16.2999992370605,33,3,5,4 "32",0.00499999988824129,0.140000000596046,7.69999980926514,1.39999997615814,9.10000038146973,2.59999990463257,21.5,5,2,4 "33",0.00999999977648258,0.25,17.8999996185303,2,19.8999996185303,24,50,1,1,1 "34",62,1320,6.09999990463257,1.89999997615814,8,100,267,1,1,1 "35",0.122000001370907,3,8.19999980926514,2.40000009536743,10.6000003814697,NA,30,2,1,1 "36",1.35000002384186,8.10000038146973,8.39999961853027,2.79999995231628,11.1999998092651,NA,45,3,1,3 "37",0.0230000000447035,0.400000005960464,11.8999996185303,1.29999995231628,13.1999998092651,3.20000004768372,19,4,1,3 "38",0.0480000004172325,0.330000013113022,10.8000001907349,2,12.8000001907349,2,30,4,1,3 "39",1.70000004768372,6.30000019073486,13.8000001907349,5.59999990463257,19.3999996185303,5,12,2,1,1 "40",3.5,10.8000001907349,14.3000001907349,3.09999990463257,17.3999996185303,6.5,120,2,1,1 "41",250,490,NA,1,NA,23.6000003814697,440,5,5,5 "42",0.479999989271164,15.5,15.1999998092651,1.79999995231628,17,12,140,2,2,2 "43",10,115,10,0.899999976158142,10.8999996185303,20.2000007629395,170,4,4,4 "44",1.62000000476837,11.3999996185303,11.8999996185303,1.79999995231628,13.6999998092651,13,17,2,1,2 "45",192,180,6.5,1.89999997615814,8.39999961853027,27,115,4,4,4 "46",2.5,12.1000003814697,7.5,0.899999976158142,8.39999961853027,18,31,5,5,5 "47",4.28800010681152,39.2000007629395,NA,NA,12.5,13.6999998092651,63,2,2,2 "48",0.280000001192093,1.89999997615814,10.6000003814697,2.59999990463257,13.1999998092651,4.69999980926514,21,3,1,3 "49",4.23500013351440,50.4000015258789,7.40000009536743,2.40000009536743,9.80000019073486,9.80000019073486,52,1,1,1 "50",6.80000019073486,179,8.39999961853027,1.20000004768372,9.60000038146973,29,164,2,3,2 "51",0.75,12.3000001907349,5.69999980926514,0.899999976158142,6.59999990463257,7,225,2,2,2 "52",3.59999990463257,21,4.90000009536743,0.5,5.40000009536743,6,225,3,2,3 "53",14.8299999237061,98.1999969482422,NA,NA,2.59999990463257,17,150,5,5,5 "54",55.5,175,3.20000004768372,0.600000023841858,3.79999995231628,20,151,5,5,5 "55",1.39999997615814,12.5,NA,NA,11,12.6999998092651,90,2,2,2 "56",0.0599999986588955,1,8.10000038146973,2.20000004768372,10.3000001907349,3.5,NA,3,1,2 "57",0.899999976158142,2.59999990463257,11,2.29999995231628,13.3000001907349,4.5,60,2,1,2 "58",2,12.3000001907349,4.90000009536743,0.5,5.40000009536743,7.5,200,3,1,3 "59",0.104000002145767,2.5,13.1999998092651,2.59999990463257,15.8000001907349,2.29999995231628,46,3,2,2 "60",4.19000005722046,58,9.69999980926514,0.600000023841858,10.3000001907349,24,210,4,3,4 "61",3.5,3.90000009536743,12.8000001907349,6.59999990463257,19.3999996185303,3,14,2,1,1 "62",4.05000019073486,17,NA,NA,NA,13,38,3,1,1 ggobi-2.1.12/config/0000755000175000017500000000000014651542215007677 5ggobi-2.1.12/config/ltmain.sh0000644000175000017500000120646414651530033011447 #! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 # libtool (GNU libtool) 2.5.0.14-9a4a-dirty # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2019, 2021-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. # GNU Libtool is free software; you can 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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 . PROGRAM=libtool PACKAGE=libtool VERSION=2.5.0.14-9a4a-dirty package_revision=2.5.0.14 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2004-2019, 2021, 2023 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # These NLS vars are set unconditionally (bootstrap issue #24). Unset those # in case the environment reset is needed later and the $save_* variant is not # defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # func_unset VAR # -------------- # Portably unset VAR. # In some shells, an 'unset VAR' statement leaves a non-zero return # status if VAR is already unset, which might be problematic if the # statement is used at the end of a function (thus poisoning its return # value) or when 'set -e' is active (causing even a spurious abort of # the script in this case). func_unset () { { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } } # Make sure CDPATH doesn't cause `cd` commands to output the target dir. func_unset CDPATH # Make sure ${,E,F}GREP behave sanely. func_unset GREP_OPTIONS ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" # require_check_ifs_backslash # --------------------------- # Check if we can use backslash as IFS='\' separator, and set # $check_ifs_backshlash_broken to ':' or 'false'. require_check_ifs_backslash=func_require_check_ifs_backslash func_require_check_ifs_backslash () { _G_save_IFS=$IFS IFS='\' _G_check_ifs_backshlash='a\\b' for _G_i in $_G_check_ifs_backshlash do case $_G_i in a) check_ifs_backshlash_broken=false ;; '') break ;; *) check_ifs_backshlash_broken=: break ;; esac done IFS=$_G_save_IFS require_check_ifs_backslash=: } ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1=\$$1\\ \$func_quote_arg_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_portable EVAL ARG # ---------------------------- # Internal function to portably implement func_quote_arg. Note that we still # keep attention to performance here so we as much as possible try to avoid # calling sed binary (so far O(N) complexity as long as func_append is O(1)). func_quote_portable () { $debug_cmd $require_check_ifs_backslash func_quote_portable_result=$2 # one-time-loop (easy break) while true do if $1; then func_quote_portable_result=`$ECHO "$2" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` break fi # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string # contains the shell wildcard characters. case $check_ifs_backshlash_broken$func_quote_portable_result in :*|*[\[\*\?]*) func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ | $SED "$sed_quote_subst"` break ;; esac func_quote_portable_old_IFS=$IFS for _G_char in '\' '`' '"' '$' do # STATE($1) PREV($2) SEPARATOR($3) set start "" "" func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy IFS=$_G_char for _G_part in $func_quote_portable_result do case $1 in quote) func_append func_quote_portable_result "$3$2" set quote "$_G_part" "\\$_G_char" ;; start) set first "" "" func_quote_portable_result= ;; first) set quote "$_G_part" "" ;; esac done done IFS=$func_quote_portable_old_IFS ;; *) ;; esac break done func_quote_portable_unquoted_result=$func_quote_portable_result case $func_quote_portable_result in # double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # many bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_portable_result=\"$func_quote_portable_result\" ;; esac } # func_quotefast_eval ARG # ----------------------- # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then printf -v _GL_test_printf_tilde %q '~' if test '\~' = "$_GL_test_printf_tilde"; then func_quotefast_eval () { printf -v func_quotefast_eval_result %q "$1" } else # Broken older Bash implementations. Make those faster too if possible. func_quotefast_eval () { case $1 in '~'*) func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result ;; *) printf -v func_quotefast_eval_result %q "$1" ;; esac } fi else func_quotefast_eval () { func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result } fi # func_quote_arg MODEs ARG # ------------------------ # Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result # double-quoted (when needed), suitable for a subsequent eval # ii) func_quote_arg_unquoted_result # has all characters that are still active within double # quotes backslashified. Available only if 'unquoted' is specified. # # Available modes: # ---------------- # 'eval' (default) # - escape shell special characters # 'expand' # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might # be used later in func_quote to get output like: 'echo "a b"' instead # of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. # # Examples for 'func_quote_arg pretty,unquoted string': # # string | *_result | *_unquoted_result # ------------+-----------------------+------------------- # " | \" | \" # a b | "a b" | a b # "a b" | "\"a b\"" | \"a b\" # * | "*" | * # z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" # # Examples for 'func_quote_arg pretty,unquoted,expand string': # # string | *_result | *_unquoted_result # --------------+---------------------+-------------------- # z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" func_quote_arg () { _G_quote_expand=false case ,$1, in *,expand,*) _G_quote_expand=: ;; esac case ,$1, in *,pretty,*|*,expand,*|*,unquoted,*) func_quote_portable $_G_quote_expand "$2" func_quote_arg_result=$func_quote_portable_result func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) # Faster quote-for-eval for some shells. func_quotefast_eval "$2" func_quote_arg_result=$func_quotefast_eval_result ;; esac } # func_quote MODEs ARGs... # ------------------------ # Quote all ARGs to be evaled later and join them into single command. See # func_quote_arg's description for more info. func_quote () { $debug_cmd _G_func_quote_mode=$1 ; shift func_quote_result= while test 0 -lt $#; do func_quote_arg "$_G_func_quote_mode" "$1" if test -n "$func_quote_result"; then func_append func_quote_result " $func_quote_arg_result" else func_append func_quote_result "$func_quote_arg_result" fi shift done } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_arg pretty,expand "$_G_cmd" eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_arg expand,pretty "$_G_cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2010-2019, 2021, 2023 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # # Set a version string for this script. scriptversion=2019-02-19.15; # UTC ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # in the main code. A hook is just a list of function names that can be # run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of hook functions to be called by # FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_propagate_result FUNC_NAME_A FUNC_NAME_B # --------------------------------------------- # If the *_result variable of FUNC_NAME_A _is set_, assign its value to # *_result variable of FUNC_NAME_B. func_propagate_result () { $debug_cmd func_propagate_result_result=: if eval "test \"\${${1}_result+set}\" = set" then eval "${2}_result=\$${1}_result" else func_propagate_result_result=false fi } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do func_unset "${_G_hook}_result" eval $_G_hook '${1+"$@"}' func_propagate_result $_G_hook func_run_hooks if $func_propagate_result_result; then eval set dummy "$func_run_hooks_result"; shift fi done } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list from your hook function. You may remove # or edit any options that you action, and then pass back the remaining # unprocessed options in '_result', escaped # suitably for 'eval'. # # The '_result' variable is automatically unset # before your hook gets called; for best performance, only set the # *_result variable when necessary (i.e. don't call the 'func_quote' # function unnecessarily because it can be an expensive operation on some # machines). # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). Leave # # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@" in case we need it later, # # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd func_run_hooks func_options ${1+"$@"} func_propagate_result func_run_hooks func_options_finish } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do func_unset func_${my_func}_result func_unset func_run_hooks_result eval func_$my_func '${1+"$@"}' func_propagate_result func_$my_func func_options if $func_propagate_result_result; then eval set dummy "$func_options_result"; shift _G_options_quoted=: fi done $_G_options_quoted || { # As we (func_options) are top-level options-parser function and # nobody quoted "$@" for us yet, we need to do it explicitly for # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result } } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} func_propagate_result func_run_hooks func_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} func_propagate_result func_run_hooks func_parse_options if $func_propagate_result_result; then eval set dummy "$func_parse_options_result"; shift # Even though we may have changed "$@", we passed the "$@" array # down into the hook and it quoted it for us (because we are in # this if-branch). No need to quote it again. _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break # We expect that one of the options parsed in this function matches # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" >&2 $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_parse_options_requote=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac if $_G_match_parse_options; then _G_parse_options_requote=: fi done if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables # after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} if test "x$func_split_equals_lhs" = "x$1"; then func_split_equals_rhs= fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. # The version message is extracted from the calling file's header # comments, with leading '# ' stripped: # 1. First display the progname and version # 2. Followed by the header comment line matching /^# Written by / # 3. Then a blank line followed by the first following line matching # /^# Copyright / # 4. Immediately followed by any lines between the previous matches, # except lines preceding the intervening completely blank line. # For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /^# Written by /!b s|^# ||; p; n :fwd2blnk /./ { n b fwd2blnk } p; n :holdwrnt s|^# || s|^# *$|| /^Copyright /!{ /./H n b holdwrnt } s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| G s|\(\n\)\n*|\1|g p; q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.5.0.14-9a4a-dirty' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname (GNU libtool) 2.5.0.14-9a4a-dirty automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host_os in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote eval ${1+"$@"} libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, windows, cygwin, or some other w32 environment. Relies on a # correctly configured wine environment available, with the winepath program # in $build's $PATH. Assumes ARG has no leading or trailing path separator # characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_arg pretty "$libobj" test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_arg pretty "$srcfile" qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wa,FLAG -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_arg pretty "$nonopt" install_prog="$func_quote_arg_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_arg pretty "$arg" func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_arg pretty "$arg" func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then func_quote_arg pretty "$arg2" fi func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_arg pretty "$install_override_mode" func_append install_shared_prog " -m $func_quote_arg_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw* | *windows*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_arg expand,pretty "$relink_command" eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw/windows # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw/windows-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" func_quote_arg pretty "$ECHO" qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw/windows when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #if defined _WIN32 && !defined __GNUC__ # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ _CRTIMP int __cdecl _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw* | windows*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_arg pretty,unquoted "$arg" qarg=$func_quote_arg_unquoted_result func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xassembler) func_append compiler_flags " -Xassembler $qarg" prev= func_append compile_command " -Xassembler $qarg" func_append finalize_command " -Xassembler $qarg" continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. -pthread) case $host in *solaris2*) ;; *) case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac ;; esac continue ;; -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $func_quote_arg_result" func_append compiler_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_arg pretty "$flag" func_append arg " $wl$func_quote_arg_result" func_append compiler_flags " $wl$func_quote_arg_result" func_append linker_flags " $func_quote_arg_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xassembler) prev=xassembler continue ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fdiagnostics-color* simply affects output # -frecord-gcc-switches used to verify flags were respected # -fsanitize=* Clang/GCC memory and address sanitizer # -fno-sanitize* Clang/GCC memory and address sanitizer # -shared-libsan Link with shared sanitizer runtimes (Clang) # -static-libsan Link with static sanitizer runtimes (Clang) # -no-canonical-prefixes Do not expand any symbolic links # -fuse-ld=* Linker select flags for GCC # -static-* direct GCC to link specific libraries statically # -fcilkplus Cilk Plus language extension features for C/C++ # -rtlib=* select c runtime lib with clang # --unwindlib=* select unwinder library with clang # -f{file|debug|macro|profile}-prefix-map=* needed for lto linking # -Wa,* Pass flags directly to the assembler # -Werror, -Werror=* Report (specified) warnings as errors -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-no-canonical-prefixes| \ -stdlib=*|-rtlib=*|--unwindlib=*| \ -specs=*|-fsanitize=*|-fno-sanitize*|-shared-libsan|-static-libsan| \ -ffile-prefix-map=*|-fdebug-prefix-map=*|-fmacro-prefix-map=*|-fprofile-prefix-map=*| \ -fdiagnostics-color*|-frecord-gcc-switches| \ -fuse-ld=*|-static-*|-fcilkplus|-Wa,*|-Werror|-Werror=*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_arg pretty "$arg" arg=$func_quote_arg_result fi ;; # Some other compiler flag. -* | +*) func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_arg pretty "$arg" arg=$func_quote_arg_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-fopenmp=*|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then func_warning "Linking the shared library $output against the static library $deplib is not portable!" deplibs="$deplib $deplibs" else func_warning "Trying to link with static lib archive $deplib." func_warning "I have the capability to make that library automatically link in when" func_warning "you link to this library. But I can only do this if you have a" func_warning "shared version of the library, which you do not appear to have" func_warning "because the file extensions .$libext of this argument makes me believe" func_warning "that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *windows* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host_os in cygwin* | mingw* | windows* | cegcc* | os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then func_warning "Linking the executable $output against the loadable module" else func_warning "Linking the shared library $output against the loadable module" fi func_warning "$linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host_os in cygwin* | mingw* | windows* | cegcc* | os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then func_warning "lib $linklib is a module, not a shared library" if test -z "$old_library"; then func_warning "And there doesn't seem to be a static archive available" func_warning "The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$lt_sysroot$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$lt_sysroot$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. func_warning "This system cannot link to static lib archive $lib." func_warning "I have the capability to make that library automatically link in when" func_warning "you link to this library. But I can only do this if you have a" func_warning "shared version of the library, which you do not appear to have." if test yes = "$module"; then func_warning "But as you try to build a module library, libtool will still create " func_warning "a static module, that should work as long as the dlopening application" func_warning "is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then func_warning "However, this would only work if libtool was able to extract symbol" func_warning "lists from a program, using 'nm' or equivalent, but libtool could" func_warning "not find such a program. So, this module is probably useless." func_warning "'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else func_warning "Linking the shared library $output against the non-libtool objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|midnightbsd-elf|osf|qnx|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|sco|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf | midnightbsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; file_magic*) set dummy $deplibs_check_method; shift file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` if test -n "$file_magic_glob"; then libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` else libnameglob=$libname fi test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do if test yes = "$want_nocaseglob"; then shopt -s nocaseglob potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes func_warning "Linker path does not have real file for library $a_deplib." func_warning "I have the capability to make that library automatically link in when" func_warning "you link to this library. But I can only do this if you have a" func_warning "shared version of the library, which you do not appear to have" func_warning "because I did check the linker path looking for a file starting" if test -z "$potlib"; then func_warning "with $libname but no candidates were found. (...for file magic test)" else func_warning "with $libname and none of the candidates passed a file format test" func_warning "using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes func_warning "Linker path does not have real file for library $a_deplib." func_warning "I have the capability to make that library automatically link in when" func_warning "you link to this library. But I can only do this if you have a" func_warning "shared version of the library, which you do not appear to have" func_warning "because I did check the linker path looking for a file starting" if test -z "$potlib"; then func_warning "with $libname but no candidates were found. (...for regex pattern test)" else func_warning "with $libname and none of the candidates passed a file format test" func_warning "using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then func_warning "Inter-library dependencies are not supported in this platform." else func_warning "Inter-library dependencies are not known to be supported." fi func_warning "All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then func_warning "libtool could not satisfy all declared inter-library" func_warning "dependencies of module $libname. Therefore, libtool will create" func_warning "a static module, that should work as long as the dlopening" func_warning "application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then func_warning "However, this would only work if libtool was able to extract symbol" func_warning "lists from a program, using 'nm' or equivalent, but libtool could" func_warning "not find such a program. So, this module is probably useless." func_warning "'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | windows* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_arg expand,pretty "$cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* | *windows* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty "$var_value" relink_command="$var=$func_quote_arg_result; export $var; $relink_command" fi done func_quote eval cd "`pwd`" func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" relink_command=$func_quote_arg_unquoted_result fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* | windows* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_arg pretty,unquoted "$var_value" relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" fi done # Quote the link command for shipping. func_quote eval cd "`pwd`" relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" func_quote_arg pretty,unquoted "$relink_command" relink_command=$func_quote_arg_unquoted_result if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *windows*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: ggobi-2.1.12/config/config.rpath0000755000175000017500000003502514651530011012123 #! /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-2005 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # 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. # # 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/'` cc_basename=`echo "$CC" | sed -e 's%^.*/%%'` # 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,' ;; darwin*) case "$cc_basename" in xlc*) wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; 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*) ;; unicos*) wl='-Wl,' ;; 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 cannot 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 ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; *) 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 ;; bsdi[45]*) ;; 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*) hardcode_direct=no if test "$GCC" = yes ; then : else case "$cc_basename" in xlc*) ;; *) ld_shlibs=no ;; esac 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* | kfreebsd*-gnu | dragonfly*) 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*) ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; kfreebsd*-gnu) ;; 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*) ;; knetbsd*-gnu) ;; 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"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # # 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-2023 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 # shellcheck disable=SC2162 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 nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ | 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 ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) 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 ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; 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 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; 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 case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; 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/-.*//'` ;; *-*) # shellcheck disable=SC2162 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|'` ;; *-*) # shellcheck disable=SC2162 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-dietlibc*- | linux-android*- | linux-newlib*- \ | linux-musl*- | linux-relibc*- | linux-uclibc*- | linux-mlibc*- ) ;; uclinux-uclibc*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-msvc*-) ;; -dietlibc*- | -newlib*- | -musl*- | -relibc*- | -uclibc*- | -mlibc*- ) # 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*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; *-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*) 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: ggobi-2.1.12/config/compile0000755000175000017500000001635014651530034011176 #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 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 | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ 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: ggobi-2.1.12/config/install-sh0000744000175000017500000003610114651530034011616 #!/bin/sh # install - install a program, script, or datafile scriptversion=2023-11-23.18; # 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 $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-writeable /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 incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac 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: ggobi-2.1.12/config/missing0000755000175000017500000001533614651530034011222 #! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=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) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook '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: ggobi-2.1.12/config/depcomp0000755000175000017500000005602014651530034011173 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook '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: ggobi-2.1.12/config/mkinstalldirs0000755000175000017500000000653514651530035012433 #! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2004-02-15.20 # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit 0 ;; --) # 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 # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done 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 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: ggobi-2.1.12/config/config.guess0000744000175000017500000014267614651530034012151 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2023 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2023-08-22' # 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-2023 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 c89 c99 ; 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 #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 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 ;; 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 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: ggobi-2.1.12/ggobi.pc.in0000644000175000017500000000051214651527764010404 # File for pkg-config # prefix=@abs_top_srcdir@ exec_prefix=${prefix}/src libdir=${prefix}/src includedir=${prefix}/src Name: libggobi Version: @PACKAGE_VERSION@ Description: GGobi library for dynamic graphics. Requires: gtk+-2.0, libxml-2.0 Libs: -L${libdir} -lggobi Cflags: -I${includedir} -I${prefix}/libltdl Home: ${prefix} ggobi-2.1.12/ABOUT-NLS0000644000175000017500000020610514651530011007574 1 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 free software 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 on translations can 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. 1.1 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'. 1.2 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 included GNU `gettext' 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 not be 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 usually have 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. 1.3 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. 1.4 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. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of May 2005. 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 cy da de el en en_GB +-------------------------------------------------+ GNUnet | | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] | bash | [] [] | batchelor | [] | bfd | | bibshelf | [] | binutils | [] | bison | [] [] | bluez-pin | [] [] [] [] | clisp | [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | darkstat | [] () [] | dialog | [] [] [] [] [] [] | diffutils | [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] | findutils | [] [] [] | flex | [] [] [] | fslint | [] | gas | | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] | gip | | gliv | [] | glunarclock | | gmult | [] [] | gnubiff | () | gnucash | [] () () [] | gnucash-glossary | [] () | 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 | | gsasl | [] | gss | | gst-plugins | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] () | gtkspell | [] [] [] | hello | [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] | iso_3166 | | iso_3166_1 | [] [] [] [] [] | iso_3166_2 | | iso_3166_3 | [] | iso_4217 | | iso_639 | | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | latrine | () | ld | [] | libc | [] [] [] [] [] | libextractor | | libgpewidget | [] [] [] | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | | libiconv | [] [] [] [] [] | libidn | | lifelines | [] () | lilypond | [] | lingoteach | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] | make | [] [] | man-db | [] () [] [] | minicom | [] [] | mysecretdiary | [] [] | nano | [] () [] | nano_1_0 | [] () [] [] | opcodes | [] | parted | [] [] [] [] | psmisc | | ptx | [] [] [] | pwdutils | | python | | radius | [] | recode | [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] | sh-utils | [] [] | shared-mime-info | [] [] | sharutils | [] [] [] [] [] | silky | | skencil | [] () | sketch | [] () | solfege | [] | soundtracker | [] [] | sp | [] | stardict | [] | tar | | texinfo | [] [] | textutils | [] [] [] | tin | () () | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | | xchat | [] [] [] [] [] | xkeyboard-config | | xpad | | +-------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB 10 0 0 2 7 5 0 40 43 2 51 91 19 1 14 eo es et eu fa fi fr ga gl he hi hr hu id is +-----------------------------------------------+ GNUnet | | a2ps | [] [] [] | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] | aspell | [] [] | bash | [] [] [] [] | batchelor | [] [] | bfd | [] | bibshelf | [] [] | binutils | [] [] | bison | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] | cpio | [] [] | cpplib | [] [] | darkstat | [] () [] [] [] | dialog | [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] | error | [] [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] | gnubiff | () | gnucash | [] () | gnucash-glossary | [] | 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 | [] [] | gsasl | [] [] [] | gss | [] | gst-plugins | [] [] | gstreamer | | gtick | [] [] [] [] | gtkspell | [] [] [] [] [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | impost | [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] | iso_3166_1 | [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_3166_3 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] | latrine | [] [] | ld | [] [] | libc | [] [] [] [] [] | libextractor | | libgpewidget | [] [] [] [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] | libgsasl | [] [] | libiconv | [] [] [] [] [] [] [] [] [] [] | libidn | [] [] | lifelines | () | lilypond | | lingoteach | [] [] | lynx | [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] [] [] [] [] | man-db | () | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] () [] | nano_1_0 | [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] | psmisc | [] | ptx | [] [] [] [] [] [] [] [] [] | pwdutils | | python | | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] | silky | [] | skencil | [] [] | sketch | [] [] | solfege | | soundtracker | [] [] | sp | [] | stardict | [] | tar | [] [] [] [] | texinfo | [] [] [] | textutils | [] [] [] [] [] | tin | [] () | tp-robot | [] [] | tuxpaint | [] [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] | vorbis-tools | [] [] | wastesedge | () | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] | xkeyboard-config | | xpad | [] [] [] | +-----------------------------------------------+ eo es et eu fa fi fr ga gl he hi hr hu id is 15 85 21 15 2 35 115 45 16 8 1 6 40 27 1 it ja ko ku lg lt lv mk mn ms mt nb nl nn no nso +--------------------------------------------------+ GNUnet | | a2ps | () () [] [] () | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | | aspell | [] [] | bash | [] | batchelor | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] [] | bluez-pin | [] [] | clisp | [] | console-tools | | coreutils | [] [] | cpio | | cpplib | [] | darkstat | [] [] | dialog | [] [] | diffutils | [] [] [] [] | doodle | [] | e2fsprogs | [] | enscript | [] | error | [] | fetchmail | [] [] | fileutils | [] [] [] | findutils | [] [] | flex | [] [] | fslint | [] | gas | | gawk | [] [] | gbiff | [] | gcal | | gcc | | gettext-examples | [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gip | [] | gliv | [] | glunarclock | [] [] | gmult | [] [] | gnubiff | () | gnucash | [] () () [] | gnucash-glossary | [] [] | 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 | [] | gsasl | [] | gss | | gst-plugins | [] [] | gstreamer | [] [] | gtick | [] [] | gtkspell | [] [] [] | hello | [] [] [] [] [] [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] [] | iso_3166 | [] | iso_3166_1 | [] [] | iso_3166_2 | [] | iso_3166_3 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] | jpilot | () () () | jtag | | jwhois | [] [] | kbd | [] | latrine | [] [] | ld | | libc | [] [] [] [] [] | libextractor | | libgpewidget | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | [] | libiconv | [] [] | libidn | [] | lifelines | [] | lilypond | | lingoteach | [] [] | lynx | [] [] [] | m4 | [] [] | mailutils | | make | [] [] [] | man-db | () | minicom | [] | mysecretdiary | [] | nano | [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] | parted | [] [] [] [] | psmisc | [] [] [] | ptx | [] [] [] | pwdutils | | python | | radius | | recode | [] [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] | sed | [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] | sharutils | [] [] [] | silky | [] | skencil | | sketch | | solfege | [] [] [] | soundtracker | [] | sp | () | stardict | [] [] | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] | vorbis-tools | [] | wastesedge | [] | wdiff | [] [] [] | wget | [] | xchat | [] [] [] [] [] | xkeyboard-config | [] | xpad | [] | +--------------------------------------------------+ it ja ko ku lg lt lv mk mn ms mt nb nl nn no nso 46 35 11 2 1 1 2 2 3 11 0 15 96 7 5 0 or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv +----------------------------------------------+ GNUnet | | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] | bash | [] [] [] | batchelor | [] | bfd | | bibshelf | | binutils | [] [] | bison | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] | cpplib | | darkstat | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] | fetchmail | [] [] [] [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] [] [] | gas | | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () [] | gnucash | () [] [] [] [] | gnucash-glossary | [] [] [] | 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 | [] | gsasl | [] [] [] [] [] | gss | [] [] [] | gst-plugins | [] [] [] [] | gstreamer | [] [] [] [] | gtick | [] [] [] | gtkspell | [] [] [] [] [] [] | hello | [] [] [] [] [] [] [] | id-utils | [] [] [] [] | impost | | indent | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] | iso_3166_1 | [] [] [] [] | iso_3166_2 | | iso_3166_3 | [] [] [] | iso_4217 | [] [] | iso_639 | [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] () () | kbd | [] [] [] | latrine | [] [] | ld | [] | libc | [] [] [] [] [] | libextractor | [] | libgpewidget | [] [] [] [] [] [] | libgphoto2 | [] [] | libgphoto2_port | [] | libgsasl | [] [] [] | libiconv | [] [] [] [] [] [] [] [] [] [] | libidn | [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] [] | minicom | [] [] [] [] | mysecretdiary | [] [] [] [] | nano | [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | psmisc | [] [] | ptx | [] [] [] [] [] [] | pwdutils | [] | python | | radius | [] [] | recode | [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] | silky | [] | skencil | [] [] [] | sketch | [] [] [] | solfege | | soundtracker | [] [] | sp | | stardict | [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | | xchat | [] [] [] [] [] [] [] | xkeyboard-config | | xpad | | +----------------------------------------------+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv 1 3 47 29 57 6 78 73 5 44 12 12 50 85 ta tg th tk tr uk ven vi wa xh zh_CN zh_TW zu +-----------------------------------------------+ GNUnet | | 0 a2ps | [] [] [] | 19 aegis | | 0 ant-phone | [] [] | 5 anubis | [] [] [] | 11 ap-utils | () [] | 2 aspell | [] [] [] | 13 bash | [] | 11 batchelor | [] [] | 7 bfd | | 1 bibshelf | [] | 5 binutils | [] | 6 bison | [] [] | 18 bluez-pin | [] [] [] [] [] | 25 clisp | | 7 console-tools | [] [] | 5 coreutils | [] [] | 17 cpio | [] [] [] | 7 cpplib | [] [] | 8 darkstat | [] () () | 15 dialog | [] [] [] | 25 diffutils | [] [] [] [] | 28 doodle | [] | 5 e2fsprogs | [] | 8 enscript | [] | 12 error | [] [] [] | 16 fetchmail | [] | 12 fileutils | [] [] [] | 18 findutils | [] [] | 17 flex | [] [] | 15 fslint | [] | 7 gas | [] | 3 gawk | [] | 14 gbiff | [] | 5 gcal | [] | 5 gcc | [] [] | 4 gettext-examples | [] [] [] [] [] | 21 gettext-runtime | [] [] [] [] [] | 25 gettext-tools | [] [] [] [] [] | 19 gimp-print | [] | 11 gip | [] | 8 gliv | [] [] | 7 glunarclock | [] [] | 13 gmult | [] [] [] | 13 gnubiff | [] | 3 gnucash | () [] | 10 gnucash-glossary | [] [] | 9 gpe-aerial | [] [] | 13 gpe-beam | [] [] | 13 gpe-calendar | [] [] [] [] | 18 gpe-clock | [] [] [] [] | 17 gpe-conf | [] [] | 12 gpe-contacts | [] [] | 7 gpe-edit | [] [] [] [] | 15 gpe-go | [] [] | 11 gpe-login | [] [] [] [] [] | 18 gpe-ownerinfo | [] [] [] [] | 19 gpe-sketchbook | [] [] | 14 gpe-su | [] [] [] | 16 gpe-taskmanager | [] [] [] | 17 gpe-timesheet | [] [] [] [] | 17 gpe-today | [] [] [] [] [] | 19 gpe-todo | [] [] [] | 17 gphoto2 | [] [] [] | 18 gprof | [] [] | 10 gpsdrive | | 3 gramadoir | [] | 6 grep | [] [] [] [] | 32 gretl | | 4 gsasl | [] [] | 12 gss | [] | 5 gst-plugins | [] [] [] | 17 gstreamer | [] [] [] [] | 15 gtick | [] | 11 gtkspell | [] [] [] [] | 21 hello | [] [] [] [] | 37 id-utils | [] [] | 13 impost | [] | 3 indent | [] [] [] [] | 25 iso_3166 | [] [] [] | 12 iso_3166_1 | [] [] | 20 iso_3166_2 | | 2 iso_3166_3 | [] [] | 8 iso_4217 | [] [] | 10 iso_639 | [] [] | 12 jpilot | [] [] [] | 6 jtag | | 2 jwhois | [] [] [] | 12 kbd | [] [] | 12 latrine | [] [] | 8 ld | [] | 5 libc | [] [] | 22 libextractor | | 1 libgpewidget | [] [] | 17 libgphoto2 | [] | 9 libgphoto2_port | | 5 libgsasl | [] | 7 libiconv | [] [] [] [] [] | 32 libidn | [] [] | 6 lifelines | | 4 lilypond | | 1 lingoteach | [] | 6 lynx | [] [] [] | 15 m4 | [] [] | 17 mailutils | [] | 7 make | [] [] | 18 man-db | | 5 minicom | | 11 mysecretdiary | [] [] | 12 nano | [] [] | 13 nano_1_0 | [] [] [] | 18 opcodes | [] [] | 9 parted | [] [] [] | 18 psmisc | [] | 7 ptx | [] [] | 23 pwdutils | | 1 python | | 0 radius | [] | 6 recode | [] [] | 22 rpm | [] [] | 11 screem | | 1 scrollkeeper | [] [] [] | 24 sed | [] [] [] | 21 sh-utils | [] | 15 shared-mime-info | [] [] [] | 21 sharutils | [] [] [] | 20 silky | | 3 skencil | | 6 sketch | | 6 solfege | | 4 soundtracker | [] | 8 sp | [] | 3 stardict | [] [] [] [] | 10 tar | [] [] [] [] | 15 texinfo | [] [] | 14 textutils | [] [] [] | 17 tin | | 1 tp-robot | [] [] [] | 8 tuxpaint | [] [] [] [] | 34 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 18 vorbis-tools | [] | 10 wastesedge | | 1 wdiff | [] [] | 22 wget | [] [] | 7 xchat | [] [] [] [] | 26 xkeyboard-config | [] | 2 xpad | [] | 5 +-----------------------------------------------+ 73 teams ta tg th tk tr uk ven vi wa xh zh_CN zh_TW zu 149 domains 0 0 0 1 77 30 0 92 16 0 42 32 0 1746 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 May 2005 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'. 1.6 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. ggobi-2.1.12/CPLicense.txt0000644000175000017500000002650314651527764010742 Common Public License Version 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. ggobi-2.1.12/share/0000755000175000017500000000000014651542215007534 5ggobi-2.1.12/share/colorschemes.xml0000644000175000017500000075714514651527764012723 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.78820.4980 0.74510.68240.8314 0.99220.75290.5255 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.78820.4980 0.74510.68240.8314 0.99220.75290.5255 1.00001.00000.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.78820.4980 0.74510.68240.8314 0.99220.75290.5255 1.00001.00000.6000 0.21960.42350.6902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.78820.4980 0.74510.68240.8314 0.99220.75290.5255 1.00001.00000.6000 0.21960.42350.6902 0.94120.00780.4980 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.78820.4980 0.74510.68240.8314 0.99220.75290.5255 1.00001.00000.6000 0.21960.42350.6902 0.94120.00780.4980 0.74900.35690.0902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.78820.4980 0.74510.68240.8314 0.99220.75290.5255 1.00001.00000.6000 0.21960.42350.6902 0.94120.00780.4980 0.74900.35690.0902 0.40000.40000.4000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.87060.92160.9686 0.61960.79220.8824 0.19220.50980.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.95291.0000 0.74120.84310.9059 0.41960.68240.8392 0.12940.44310.7098 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.95291.0000 0.74120.84310.9059 0.41960.68240.8392 0.19220.50980.7412 0.03140.31760.6118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.95291.0000 0.77650.85880.9373 0.61960.79220.8824 0.41960.68240.8392 0.19220.50980.7412 0.03140.31760.6118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.95291.0000 0.77650.85880.9373 0.61960.79220.8824 0.41960.68240.8392 0.25880.57250.7765 0.12940.44310.7098 0.03140.27060.5804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98431.0000 0.87060.92160.9686 0.77650.85880.9373 0.61960.79220.8824 0.41960.68240.8392 0.25880.57250.7765 0.12940.44310.7098 0.03140.27060.5804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98431.0000 0.87060.92160.9686 0.77650.85880.9373 0.61960.79220.8824 0.41960.68240.8392 0.25880.57250.7765 0.12940.44310.7098 0.03140.31760.6118 0.03140.18820.4196 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84710.70200.3961 0.96080.96080.9608 0.35290.70590.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.38040.1020 0.87450.76080.4902 0.50200.80390.7569 0.00390.52160.4431 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.38040.1020 0.87450.76080.4902 0.96080.96080.9608 0.50200.80390.7569 0.00390.52160.4431 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.54900.31760.0392 0.84710.70200.3961 0.96470.90980.7647 0.78040.91760.8980 0.35290.70590.6745 0.00390.40000.3686 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.54900.31760.0392 0.84710.70200.3961 0.96470.90980.7647 0.96080.96080.9608 0.78040.91760.8980 0.35290.70590.6745 0.00390.40000.3686 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.54900.31760.0392 0.74900.50590.1765 0.87450.76080.4902 0.96470.90980.7647 0.78040.91760.8980 0.50200.80390.7569 0.20780.59220.5608 0.00390.40000.3686 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.54900.31760.0392 0.74900.50590.1765 0.87450.76080.4902 0.96470.90980.7647 0.96080.96080.9608 0.78040.91760.8980 0.50200.80390.7569 0.20780.59220.5608 0.00390.40000.3686 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.32940.18820.0196 0.54900.31760.0392 0.74900.50590.1765 0.87450.76080.4902 0.96470.90980.7647 0.78040.91760.8980 0.50200.80390.7569 0.20780.59220.5608 0.00390.40000.3686 0.00000.23530.1882 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.32940.18820.0196 0.54900.31760.0392 0.74900.50590.1765 0.87450.76080.4902 0.96470.90980.7647 0.96080.96080.9608 0.78040.91760.8980 0.50200.80390.7569 0.20780.59220.5608 0.00390.40000.3686 0.00000.23530.1882 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89800.96080.9765 0.60000.84710.7882 0.17250.63530.3725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.69800.88630.8863 0.40000.76080.6431 0.13730.54510.2706 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.69800.88630.8863 0.40000.76080.6431 0.17250.63530.3725 0.00000.42750.1725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.80000.92550.9020 0.60000.84710.7882 0.40000.76080.6431 0.17250.63530.3725 0.00000.42750.1725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.80000.92550.9020 0.60000.84710.7882 0.40000.76080.6431 0.25490.68240.4627 0.13730.54510.2706 0.00000.34510.1412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9922 0.89800.96080.9765 0.80000.92550.9020 0.60000.84710.7882 0.40000.76080.6431 0.25490.68240.4627 0.13730.54510.2706 0.00000.34510.1412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9922 0.89800.96080.9765 0.80000.92550.9020 0.60000.84710.7882 0.40000.76080.6431 0.25490.68240.4627 0.13730.54510.2706 0.00000.42750.1725 0.00000.26670.1059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.87840.92550.9569 0.61960.73730.8549 0.53330.33730.6549 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.70200.80390.8902 0.54900.58820.7765 0.53330.25490.6157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.70200.80390.8902 0.54900.58820.7765 0.53330.33730.6549 0.50590.05880.4863 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.74900.82750.9020 0.61960.73730.8549 0.54900.58820.7765 0.53330.33730.6549 0.50590.05880.4863 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9843 0.74900.82750.9020 0.61960.73730.8549 0.54900.58820.7765 0.54900.41960.6941 0.53330.25490.6157 0.43140.00390.4196 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9922 0.87840.92550.9569 0.74900.82750.9020 0.61960.73730.8549 0.54900.58820.7765 0.54900.41960.6941 0.53330.25490.6157 0.43140.00390.4196 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9922 0.87840.92550.9569 0.74900.82750.9020 0.61960.73730.8549 0.54900.58820.7765 0.54900.41960.6941 0.53330.25490.6157 0.50590.05880.4863 0.30200.00000.2941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.10590.61960.4667 0.85100.37250.0078 0.45880.43920.7020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.10590.61960.4667 0.85100.37250.0078 0.45880.43920.7020 0.90590.16080.5412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.10590.61960.4667 0.85100.37250.0078 0.45880.43920.7020 0.90590.16080.5412 0.40000.65100.1176 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.10590.61960.4667 0.85100.37250.0078 0.45880.43920.7020 0.90590.16080.5412 0.40000.65100.1176 0.90200.67060.0078 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.10590.61960.4667 0.85100.37250.0078 0.45880.43920.7020 0.90590.16080.5412 0.40000.65100.1176 0.90200.67060.0078 0.65100.46270.1137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.10590.61960.4667 0.85100.37250.0078 0.45880.43920.7020 0.90590.16080.5412 0.40000.65100.1176 0.90200.67060.0078 0.65100.46270.1137 0.40000.40000.4000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.87840.95290.8588 0.65880.86670.7098 0.26270.63530.7922 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94120.97650.9098 0.72940.89410.7373 0.48240.80000.7686 0.16860.54900.7451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94120.97650.9098 0.72940.89410.7373 0.48240.80000.7686 0.26270.63530.7922 0.03140.40780.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94120.97650.9098 0.80000.92160.7725 0.65880.86670.7098 0.48240.80000.7686 0.26270.63530.7922 0.03140.40780.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94120.97650.9098 0.80000.92160.7725 0.65880.86670.7098 0.48240.80000.7686 0.30590.70200.8275 0.16860.54900.7451 0.03140.34510.6196 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9412 0.87840.95290.8588 0.80000.92160.7725 0.65880.86670.7098 0.48240.80000.7686 0.30590.70200.8275 0.16860.54900.7451 0.03140.34510.6196 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9412 0.87840.95290.8588 0.80000.92160.7725 0.65880.86670.7098 0.48240.80000.7686 0.30590.70200.8275 0.16860.54900.7451 0.03140.40780.6745 0.03140.25100.5059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89800.96080.8784 0.63140.85100.6078 0.19220.63920.3294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9137 0.72940.89410.7020 0.45490.76860.4627 0.13730.54510.2706 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9137 0.72940.89410.7020 0.45490.76860.4627 0.19220.63920.3294 0.00000.42750.1725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9137 0.78040.91370.7529 0.63140.85100.6078 0.45490.76860.4627 0.19220.63920.3294 0.00000.42750.1725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.9137 0.78040.91370.7529 0.63140.85100.6078 0.45490.76860.4627 0.25490.67060.3647 0.13730.54510.2706 0.00000.35290.1961 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9608 0.89800.96080.8784 0.78040.91370.7529 0.63140.85100.6078 0.45490.76860.4627 0.25490.67060.3647 0.13730.54510.2706 0.00000.35290.1961 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.9608 0.89800.96080.8784 0.78040.91370.7529 0.63140.85100.6078 0.45490.76860.4627 0.25490.67060.3647 0.13730.54510.2706 0.00000.42750.1725 0.00000.26670.1059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94120.94120.9412 0.74120.74120.7412 0.38820.38820.3882 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.96860.9686 0.80000.80000.8000 0.58820.58820.5882 0.32160.32160.3216 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.96860.9686 0.80000.80000.8000 0.58820.58820.5882 0.38820.38820.3882 0.14510.14510.1451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.96860.9686 0.85100.85100.8510 0.74120.74120.7412 0.58820.58820.5882 0.38820.38820.3882 0.14510.14510.1451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.96860.9686 0.85100.85100.8510 0.74120.74120.7412 0.58820.58820.5882 0.45100.45100.4510 0.32160.32160.3216 0.14510.14510.1451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00001.0000 0.94120.94120.9412 0.85100.85100.8510 0.74120.74120.7412 0.58820.58820.5882 0.45100.45100.4510 0.32160.32160.3216 0.14510.14510.1451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00001.0000 0.94120.94120.9412 0.85100.85100.8510 0.74120.74120.7412 0.58820.58820.5882 0.45100.45100.4510 0.32160.32160.3216 0.14510.14510.1451 0.00000.00000.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.90200.8078 0.99220.68240.4196 0.90200.33330.0510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92940.8706 0.99220.74510.5216 0.99220.55290.2353 0.85100.27840.0039 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92940.8706 0.99220.74510.5216 0.99220.55290.2353 0.90200.33330.0510 0.65100.21180.0118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92940.8706 0.99220.81570.6353 0.99220.68240.4196 0.99220.55290.2353 0.90200.33330.0510 0.65100.21180.0118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92940.8706 0.99220.81570.6353 0.99220.68240.4196 0.99220.55290.2353 0.94510.41180.0745 0.85100.28240.0039 0.54900.17650.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96080.9216 0.99610.90200.8078 0.99220.81570.6353 0.99220.68240.4196 0.99220.55290.2353 0.94510.41180.0745 0.85100.28240.0039 0.54900.17650.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96080.9216 0.99610.90200.8078 0.99220.81570.6353 0.99220.68240.4196 0.99220.55290.2353 0.94510.41180.0745 0.85100.28240.0039 0.65100.21180.0118 0.49800.15290.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.90980.7843 0.99220.73330.5176 0.89020.29020.2000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.94120.8510 0.99220.80000.5412 0.98820.55290.3490 0.84310.18820.1216 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.94120.8510 0.99220.80000.5412 0.98820.55290.3490 0.89020.29020.2000 0.70200.00000.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.94120.8510 0.99220.83140.6196 0.99220.73330.5176 0.98820.55290.3490 0.89020.29020.2000 0.70200.00000.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.94120.8510 0.99220.83140.6196 0.99220.73330.5176 0.98820.55290.3490 0.93730.39610.2824 0.84310.18820.1216 0.60000.00000.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9255 0.99610.90980.7843 0.99220.83140.6196 0.99220.73330.5176 0.98820.55290.3490 0.93730.39610.2824 0.84310.18820.1216 0.60000.00000.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9255 0.99610.90980.7843 0.99220.83140.6196 0.99220.73330.5176 0.98820.55290.3490 0.93730.39610.2824 0.84310.18820.1216 0.70200.00000.0000 0.49800.00000.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 0.99220.74900.4353 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 0.99220.74900.4353 1.00000.49800.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 0.99220.74900.4353 1.00000.49800.0000 0.79220.69800.8392 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 0.99220.74900.4353 1.00000.49800.0000 0.79220.69800.8392 0.41570.23920.6039 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 0.99220.74900.4353 1.00000.49800.0000 0.79220.69800.8392 0.41570.23920.6039 1.00001.00000.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.65100.80780.8902 0.12160.47060.7059 0.69800.87450.5412 0.20000.62750.1725 0.98430.60390.6000 0.89020.10200.1098 0.99220.74900.4353 1.00000.49800.0000 0.79220.69800.8392 0.41570.23920.6039 1.00001.00000.6000 0.69410.34900.1569 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 0.87060.79610.8941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 0.87060.79610.8941 0.99610.85100.6510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 0.87060.79610.8941 0.99610.85100.6510 1.00001.00000.8000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 0.87060.79610.8941 0.99610.85100.6510 1.00001.00000.8000 0.89800.84710.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 0.87060.79610.8941 0.99610.85100.6510 1.00001.00000.8000 0.89800.84710.7412 0.99220.85490.9255 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98430.70590.6824 0.70200.80390.8902 0.80000.92160.7725 0.87060.79610.8941 0.99610.85100.6510 1.00001.00000.8000 0.89800.84710.7412 0.99220.85490.9255 0.94900.94900.9490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.88630.8039 0.99220.80390.6745 0.79610.83530.9098 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.88630.8039 0.99220.80390.6745 0.79610.83530.9098 0.95690.79220.8941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.88630.8039 0.99220.80390.6745 0.79610.83530.9098 0.95690.79220.8941 0.90200.96080.7882 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.88630.8039 0.99220.80390.6745 0.79610.83530.9098 0.95690.79220.8941 0.90200.96080.7882 1.00000.94900.6824 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.88630.8039 0.99220.80390.6745 0.79610.83530.9098 0.95690.79220.8941 0.90200.96080.7882 1.00000.94900.6824 0.94510.88630.8000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.88630.8039 0.99220.80390.6745 0.79610.83530.9098 0.95690.79220.8941 0.90200.96080.7882 1.00000.94900.6824 0.94510.88630.8000 0.80000.80000.8000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.91370.63920.7882 0.96860.96860.9686 0.63140.84310.4157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.81570.10980.5451 0.94510.71370.8549 0.72160.88240.5255 0.30200.67450.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.81570.10980.5451 0.94510.71370.8549 0.96860.96860.9686 0.72160.88240.5255 0.30200.67450.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.77250.10590.4902 0.91370.63920.7882 0.99220.87840.9373 0.90200.96080.8157 0.63140.84310.4157 0.30200.57250.1294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.77250.10590.4902 0.91370.63920.7882 0.99220.87840.9373 0.96860.96860.9686 0.90200.96080.8157 0.63140.84310.4157 0.30200.57250.1294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.77250.10590.4902 0.87060.46670.6824 0.94510.71370.8549 0.99220.87840.9373 0.90200.96080.8157 0.72160.88240.5255 0.49800.73730.2549 0.30200.57250.1294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.77250.10590.4902 0.87060.46670.6824 0.94510.71370.8549 0.99220.87840.9373 0.96860.96860.9686 0.90200.96080.8157 0.72160.88240.5255 0.49800.73730.2549 0.30200.57250.1294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55690.00390.3216 0.77250.10590.4902 0.87060.46670.6824 0.94510.71370.8549 0.99220.87840.9373 0.90200.96080.8157 0.72160.88240.5255 0.49800.73730.2549 0.30200.57250.1294 0.15290.39220.0980 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55690.00390.3216 0.77250.10590.4902 0.87060.46670.6824 0.94510.71370.8549 0.99220.87840.9373 0.96860.96860.9686 0.90200.96080.8157 0.72160.88240.5255 0.49800.73730.2549 0.30200.57250.1294 0.15290.39220.0980 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.68630.55290.7647 0.96860.96860.9686 0.49800.74900.4824 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.48240.19610.5804 0.76080.64710.8118 0.65100.85880.6275 0.00000.53330.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.48240.19610.5804 0.76080.64710.8118 0.96860.96860.9686 0.65100.85880.6275 0.00000.53330.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.46270.16470.5137 0.68630.55290.7647 0.90590.83140.9098 0.85100.94120.8275 0.49800.74900.4824 0.10590.47060.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.46270.16470.5137 0.68630.55290.7647 0.90590.83140.9098 0.96860.96860.9686 0.85100.94120.8275 0.49800.74900.4824 0.10590.47060.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.46270.16470.5137 0.60000.43920.6706 0.76080.64710.8118 0.90590.83140.9098 0.85100.94120.8275 0.65100.85880.6275 0.35290.68240.3804 0.10590.47060.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.46270.16470.5137 0.60000.43920.6706 0.76080.64710.8118 0.90590.83140.9098 0.96860.96860.9686 0.85100.94120.8275 0.65100.85880.6275 0.35290.68240.3804 0.10590.47060.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.25100.00000.2941 0.46270.16470.5137 0.60000.43920.6706 0.76080.64710.8118 0.90590.83140.9098 0.85100.94120.8275 0.65100.85880.6275 0.35290.68240.3804 0.10590.47060.2157 0.00000.26670.1059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.25100.00000.2941 0.46270.16470.5137 0.60000.43920.6706 0.76080.64710.8118 0.90590.83140.9098 0.96860.96860.9686 0.85100.94120.8275 0.65100.85880.6275 0.35290.68240.3804 0.10590.47060.2157 0.00000.26670.1059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92550.90590.9490 0.65100.74120.8588 0.16860.54900.7451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.74120.78820.8824 0.45490.66270.8118 0.01960.43920.6902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.74120.78820.8824 0.45490.66270.8118 0.16860.54900.7451 0.01570.35290.5529 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.81570.81960.9020 0.65100.74120.8588 0.45490.66270.8118 0.16860.54900.7451 0.01570.35290.5529 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.81570.81960.9020 0.65100.74120.8588 0.45490.66270.8118 0.21180.56470.7529 0.01960.43920.6902 0.01180.30590.4824 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9843 0.92550.90590.9490 0.81570.81960.9020 0.65100.74120.8588 0.45490.66270.8118 0.21180.56470.7529 0.01960.43920.6902 0.01180.30590.4824 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9843 0.92550.90590.9490 0.81570.81960.9020 0.65100.74120.8588 0.45490.66270.8118 0.21180.56470.7529 0.01960.43920.6902 0.01570.35290.5529 0.00780.21960.3451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92550.88630.9412 0.65100.74120.8588 0.10980.56470.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96470.93730.9686 0.74120.78820.8824 0.40390.66270.8118 0.00780.50590.5412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96470.93730.9686 0.74120.78820.8824 0.40390.66270.8118 0.10980.56470.6000 0.00390.42350.3490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96470.93730.9686 0.81570.81960.9020 0.65100.74120.8588 0.40390.66270.8118 0.10980.56470.6000 0.00390.42350.3490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96470.93730.9686 0.81570.81960.9020 0.65100.74120.8588 0.40390.66270.8118 0.21180.56470.7529 0.00780.50590.5412 0.00390.39220.3137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9843 0.92550.88630.9412 0.81570.81960.9020 0.65100.74120.8588 0.40390.66270.8118 0.21180.56470.7529 0.00780.50590.5412 0.00390.39220.3137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9843 0.92550.88630.9412 0.81570.81960.9020 0.65100.74120.8588 0.40390.66270.8118 0.21180.56470.7529 0.00780.50590.5412 0.00390.42350.3490 0.00390.27450.2118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.63920.2510 0.96860.96860.9686 0.60000.55690.7647 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.90200.38040.0039 0.99220.72160.3882 0.69800.67060.8235 0.36860.23530.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.90200.38040.0039 0.99220.72160.3882 0.96860.96860.9686 0.69800.67060.8235 0.36860.23530.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.34510.0235 0.94510.63920.2510 0.99610.87840.7137 0.84710.85490.9216 0.60000.55690.7647 0.32940.15290.5333 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.34510.0235 0.94510.63920.2510 0.99610.87840.7137 0.96860.96860.9686 0.84710.85490.9216 0.60000.55690.7647 0.32940.15290.5333 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.34510.0235 0.87840.50980.0784 0.99220.72160.3882 0.99610.87840.7137 0.84710.85490.9216 0.69800.67060.8235 0.50200.45100.6745 0.32940.15290.5333 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.70200.34510.0235 0.87840.50980.0784 0.99220.72160.3882 0.99610.87840.7137 0.96860.96860.9686 0.84710.85490.9216 0.69800.67060.8235 0.50200.45100.6745 0.32940.15290.5333 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.23140.0314 0.70200.34510.0235 0.87840.50980.0784 0.99220.72160.3882 0.99610.87840.7137 0.84710.85490.9216 0.69800.67060.8235 0.50200.45100.6745 0.32940.15290.5333 0.17650.00000.2941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.49800.23140.0314 0.70200.34510.0235 0.87840.50980.0784 0.99220.72160.3882 0.99610.87840.7137 0.96860.96860.9686 0.84710.85490.9216 0.69800.67060.8235 0.50200.45100.6745 0.32940.15290.5333 0.17650.00000.2941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.90590.88240.9373 0.78820.58040.7804 0.86670.10980.4667 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.84310.70980.8471 0.87450.39610.6902 0.80780.07060.3373 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.84310.70980.8471 0.87450.39610.6902 0.86670.10980.4667 0.59610.00000.2627 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.83140.72550.8549 0.78820.58040.7804 0.87450.39610.6902 0.86670.10980.4667 0.59610.00000.2627 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94510.93330.9647 0.83140.72550.8549 0.78820.58040.7804 0.87450.39610.6902 0.90590.16080.5412 0.80780.07060.3373 0.56860.00000.2471 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.95690.9765 0.90590.88240.9373 0.83140.72550.8549 0.78820.58040.7804 0.87450.39610.6902 0.90590.16080.5412 0.80780.07060.3373 0.56860.00000.2471 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.95690.9765 0.90590.88240.9373 0.83140.72550.8549 0.78820.58040.7804 0.87450.39610.6902 0.90590.16080.5412 0.80780.07060.3373 0.59610.00000.2627 0.40390.00000.1216 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.92940.9608 0.73730.74120.8627 0.45880.41960.6941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94900.94120.9686 0.79610.78820.8863 0.61960.60390.7843 0.41570.31760.6392 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94900.94120.9686 0.79610.78820.8863 0.61960.60390.7843 0.45880.41960.6941 0.32940.15290.5608 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94900.94120.9686 0.85490.85490.9216 0.73730.74120.8627 0.61960.60390.7843 0.45880.41960.6941 0.32940.15290.5608 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.94900.94120.9686 0.85490.85490.9216 0.73730.74120.8627 0.61960.60390.7843 0.50200.49020.7294 0.41570.31760.6392 0.29020.07840.5255 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98820.98430.9922 0.93730.92940.9608 0.85490.85490.9216 0.73730.74120.8627 0.61960.60390.7843 0.50200.49020.7294 0.41570.31760.6392 0.29020.07840.5255 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98820.98430.9922 0.93730.92940.9608 0.85490.85490.9216 0.73730.74120.8627 0.61960.60390.7843 0.50200.49020.7294 0.41570.31760.6392 0.32940.15290.5608 0.24710.00000.4902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.54120.3843 0.96860.96860.9686 0.40390.66270.8118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.79220.00000.1255 0.95690.64710.5098 0.57250.77250.8706 0.01960.44310.6902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.79220.00000.1255 0.95690.64710.5098 0.96860.96860.9686 0.57250.77250.8706 0.01960.44310.6902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.93730.54120.3843 0.99220.85880.7804 0.81960.89800.9412 0.40390.66270.8118 0.12940.40000.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.93730.54120.3843 0.99220.85880.7804 0.96860.96860.9686 0.81960.89800.9412 0.40390.66270.8118 0.12940.40000.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 0.81960.89800.9412 0.57250.77250.8706 0.26270.57650.7647 0.12940.40000.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 0.96860.96860.9686 0.81960.89800.9412 0.57250.77250.8706 0.26270.57650.7647 0.12940.40000.6745 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40390.00000.1216 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 0.81960.89800.9412 0.57250.77250.8706 0.26270.57650.7647 0.12940.40000.6745 0.01960.18820.3804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40390.00000.1216 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 0.96860.96860.9686 0.81960.89800.9412 0.57250.77250.8706 0.26270.57650.7647 0.12940.40000.6745 0.01960.18820.3804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.93730.54120.3843 1.00001.00001.0000 0.60000.60000.6000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.79220.00000.1255 0.95690.64710.5098 0.72940.72940.7294 0.25100.25100.2510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.79220.00000.1255 0.95690.64710.5098 1.00001.00001.0000 0.72940.72940.7294 0.25100.25100.2510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.93730.54120.3843 0.99220.85880.7804 0.87840.87840.8784 0.60000.60000.6000 0.30200.30200.3020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.93730.54120.3843 0.99220.85880.7804 1.00001.00001.0000 0.87840.87840.8784 0.60000.60000.6000 0.30200.30200.3020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 0.87840.87840.8784 0.72940.72940.7294 0.52940.52940.5294 0.30200.30200.3020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 1.00001.00001.0000 0.87840.87840.8784 0.72940.72940.7294 0.52940.52940.5294 0.30200.30200.3020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40390.00000.1216 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 0.87840.87840.8784 0.72940.72940.7294 0.52940.52940.5294 0.30200.30200.3020 0.10200.10200.1020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40390.00000.1216 0.69800.09410.1686 0.83920.37650.3020 0.95690.64710.5098 0.99220.85880.7804 1.00001.00001.0000 0.87840.87840.8784 0.72940.72940.7294 0.52940.52940.5294 0.30200.30200.3020 0.10200.10200.1020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99220.87840.8667 0.98040.62350.7098 0.77250.10590.5412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92160.8863 0.98430.70590.7255 0.96860.40780.6314 0.68240.00390.4941 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92160.8863 0.98430.70590.7255 0.96860.40780.6314 0.77250.10590.5412 0.47840.00390.4667 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92160.8863 0.98820.77250.7529 0.98040.62350.7098 0.96860.40780.6314 0.77250.10590.5412 0.47840.00390.4667 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.92160.8863 0.98820.77250.7529 0.98040.62350.7098 0.96860.40780.6314 0.86670.20390.5922 0.68240.00390.4941 0.47840.00390.4667 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9529 0.99220.87840.8667 0.98820.77250.7529 0.98040.62350.7098 0.96860.40780.6314 0.86670.20390.5922 0.68240.00390.4941 0.47840.00390.4667 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.9529 0.99220.87840.8667 0.98820.77250.7529 0.98040.62350.7098 0.96860.40780.6314 0.86670.20390.5922 0.68240.00390.4941 0.47840.00390.4667 0.28630.00000.4157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.87840.8235 0.98820.57250.4471 0.87060.17650.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.89800.8510 0.98820.68240.5686 0.98430.41570.2902 0.79610.09410.1137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.89800.8510 0.98820.68240.5686 0.98430.41570.2902 0.87060.17650.1490 0.64710.05880.0824 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.89800.8510 0.98820.73330.6314 0.98820.57250.4471 0.98430.41570.2902 0.87060.17650.1490 0.64710.05880.0824 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.99610.89800.8510 0.98820.73330.6314 0.98820.57250.4471 0.98430.41570.2902 0.93730.23140.1725 0.79610.09410.1137 0.60000.00000.0510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96080.9412 0.99610.87840.8235 0.98820.73330.6314 0.98820.57250.4471 0.98430.41570.2902 0.93730.23140.1725 0.79610.09410.1137 0.60000.00000.0510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96080.9412 0.99610.87840.8235 0.98820.73330.6314 0.98820.57250.4471 0.98430.41570.2902 0.93730.23140.1725 0.79610.09410.1137 0.64710.05880.0824 0.40390.00000.0510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98820.55290.3490 1.00001.00000.7490 0.56860.74900.8588 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.09800.1098 0.99220.68240.3804 0.67060.85100.9137 0.17250.48240.7137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.09800.1098 0.99220.68240.3804 1.00001.00000.7490 0.67060.85100.9137 0.17250.48240.7137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.98820.55290.3490 0.99610.87840.5647 0.87840.95290.9725 0.56860.74900.8588 0.27060.45880.7059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.98820.55290.3490 0.99610.87840.5647 1.00001.00000.7490 0.87840.95290.9725 0.56860.74900.8588 0.27060.45880.7059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5647 0.87840.95290.9725 0.67060.85100.9137 0.45490.67840.8196 0.27060.45880.7059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5647 1.00001.00000.7490 0.87840.95290.9725 0.67060.85100.9137 0.45490.67840.8196 0.27060.45880.7059 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.64710.00000.1490 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5647 0.87840.95290.9725 0.67060.85100.9137 0.45490.67840.8196 0.27060.45880.7059 0.19220.21180.5843 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.64710.00000.1490 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5647 1.00001.00000.7490 0.87840.95290.9725 0.67060.85100.9137 0.45490.67840.8196 0.27060.45880.7059 0.19220.21180.5843 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98820.55290.3490 1.00001.00000.7490 0.56860.81180.3765 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.09800.1098 0.99220.68240.3804 0.65100.85100.4157 0.10200.58820.2549 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.09800.1098 0.99220.68240.3804 1.00001.00000.7490 0.65100.85100.4157 0.10200.58820.2549 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.98820.55290.3490 0.99610.87840.5451 0.85100.93730.5451 0.56860.81180.3765 0.10200.59610.3137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.98820.55290.3490 0.99610.87840.5451 1.00001.00000.7490 0.85100.93730.5451 0.56860.81180.3765 0.10200.59610.3137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 0.85100.93730.5451 0.65100.85100.4157 0.40000.74120.3882 0.10200.59610.3137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 1.00001.00000.7490 0.85100.93730.5451 0.65100.85100.4157 0.40000.74120.3882 0.10200.59610.3137 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.64710.00000.1490 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 0.85100.93730.5451 0.65100.85100.4157 0.40000.74120.3882 0.10200.59610.3137 0.00000.40780.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.64710.00000.1490 0.84310.18820.1529 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 1.00001.00000.7490 0.85100.93730.5451 0.65100.85100.4157 0.40000.74120.3882 0.10200.59610.3137 0.00000.40780.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 0.59610.30590.6392 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 0.59610.30590.6392 1.00000.49800.0000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 0.59610.30590.6392 1.00000.49800.0000 1.00001.00000.2000 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 0.59610.30590.6392 1.00000.49800.0000 1.00001.00000.2000 0.65100.33730.1569 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 0.59610.30590.6392 1.00000.49800.0000 1.00001.00000.2000 0.65100.33730.1569 0.96860.50590.7490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software (The sequence of colors has been modified to improve its default behavior in ggobi.) 0.59610.30590.6392 0.96860.50590.7490 0.89410.10200.1098 0.21570.49410.7216 0.30200.68630.2902 1.00000.49800.0000 0.65100.33730.1569 0.60000.60000.6000 1.00001.00000.2000 0.20.20.2 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40000.76080.6471 0.98820.55290.3843 0.55290.62750.7961 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40000.76080.6471 0.98820.55290.3843 0.55290.62750.7961 0.90590.54120.7647 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40000.76080.6471 0.98820.55290.3843 0.55290.62750.7961 0.90590.54120.7647 0.65100.84710.3294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40000.76080.6471 0.98820.55290.3843 0.55290.62750.7961 0.90590.54120.7647 0.65100.84710.3294 1.00000.85100.1843 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40000.76080.6471 0.98820.55290.3843 0.55290.62750.7961 0.90590.54120.7647 0.65100.84710.3294 1.00000.85100.1843 0.89800.76860.5804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.40000.76080.6471 0.98820.55290.3843 0.55290.62750.7961 0.90590.54120.7647 0.65100.84710.3294 1.00000.85100.1843 0.89800.76860.5804 0.70200.70200.7020 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 0.70200.87060.4118 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 0.70200.87060.4118 0.98820.80390.8980 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 0.70200.87060.4118 0.98820.80390.8980 0.85100.85100.8510 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 0.70200.87060.4118 0.98820.80390.8980 0.85100.85100.8510 0.73730.50200.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 0.70200.87060.4118 0.98820.80390.8980 0.85100.85100.8510 0.73730.50200.7412 0.80000.92160.7725 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.55290.82750.7804 1.00001.00000.7020 0.74510.72940.8549 0.98430.50200.4471 0.50200.69410.8275 0.99220.70590.3843 0.70200.87060.4118 0.98820.80390.8980 0.85100.85100.8510 0.73730.50200.7412 0.80000.92160.7725 1.00000.92940.4353 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.98820.55290.3490 1.00001.00000.7490 0.60000.83530.5804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.09800.1098 0.99220.68240.3804 0.67060.86670.6431 0.16860.51370.7294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.84310.09800.1098 0.99220.68240.3804 1.00001.00000.7490 0.67060.86670.6431 0.16860.51370.7294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.83530.24310.3098 0.98820.55290.3490 0.99610.87840.5451 0.90200.96080.5961 0.60000.83530.5804 0.19610.53330.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.83530.24310.3098 0.98820.55290.3490 0.99610.87840.5451 1.00001.00000.7490 0.90200.96080.5961 0.60000.83530.5804 0.19610.53330.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.83530.24310.3098 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 0.90200.96080.5961 0.67060.86670.6431 0.40000.76080.6471 0.19610.53330.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.83530.24310.3098 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 1.00001.00000.7490 0.90200.96080.5961 0.67060.86670.6431 0.40000.76080.6471 0.19610.53330.7412 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.61960.00390.2588 0.83530.24310.3098 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 0.90200.96080.5961 0.67060.86670.6431 0.40000.76080.6471 0.19610.53330.7412 0.36860.30980.6353 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.61960.00390.2588 0.83530.24310.3098 0.95690.42750.2627 0.99220.68240.3804 0.99610.87840.5451 1.00001.00000.7490 0.90200.96080.5961 0.67060.86670.6431 0.40000.76080.6471 0.19610.53330.7412 0.36860.30980.6353 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.96860.98820.7255 0.67840.86670.5569 0.19220.63920.3294 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.76080.90200.6000 0.47060.77650.4745 0.13730.51760.2627 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.76080.90200.6000 0.47060.77650.4745 0.19220.63920.3294 0.00000.40780.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.85100.94120.6392 0.67840.86670.5569 0.47060.77650.4745 0.19220.63920.3294 0.00000.40780.2157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.85100.94120.6392 0.67840.86670.5569 0.47060.77650.4745 0.25490.67060.3647 0.13730.51760.2627 0.00000.35290.1961 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8980 0.96860.98820.7255 0.85100.94120.6392 0.67840.86670.5569 0.47060.77650.4745 0.25490.67060.3647 0.13730.51760.2627 0.00000.35290.1961 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8980 0.96860.98820.7255 0.85100.94120.6392 0.67840.86670.5569 0.47060.77650.4745 0.25490.67060.3647 0.13730.51760.2627 0.00000.40780.2157 0.00000.27060.1608 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 0.92940.97250.6941 0.49800.80390.7333 0.17250.49800.7216 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.63140.85490.7059 0.25490.71370.7686 0.13330.36860.6588 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.63140.85490.7059 0.25490.71370.7686 0.17250.49800.7216 0.14510.20390.5804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.78040.91370.7059 0.49800.80390.7333 0.25490.71370.7686 0.17250.49800.7216 0.14510.20390.5804 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 0.78040.91370.7059 0.49800.80390.7333 0.25490.71370.7686 0.11370.56860.7529 0.13330.36860.6588 0.04710.17250.5176 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8510 0.92940.97250.6941 0.78040.91370.7059 0.49800.80390.7333 0.25490.71370.7686 0.11370.56860.7529 0.13330.36860.6588 0.04710.17250.5176 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8510 0.92940.97250.6941 0.78040.91370.7059 0.49800.80390.7333 0.25490.71370.7686 0.11370.56860.7529 0.13330.36860.6588 0.14510.20390.5804 0.03140.11370.3451 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.96860.7373 0.99610.76860.3098 0.85100.37250.0549 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8314 0.99610.85100.5569 0.99610.60000.1608 0.80000.29800.0078 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8314 0.99610.85100.5569 0.99610.60000.1608 0.85100.37250.0549 0.60000.20390.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8314 0.99610.89020.5686 0.99610.76860.3098 0.99610.60000.1608 0.85100.37250.0549 0.60000.20390.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8314 0.99610.89020.5686 0.99610.76860.3098 0.99610.60000.1608 0.92550.43920.0784 0.80000.29800.0078 0.54900.17650.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8980 1.00000.96860.7373 0.99610.89020.5686 0.99610.76860.3098 0.99610.60000.1608 0.92550.43920.0784 0.80000.29800.0078 0.54900.17650.0157 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8980 1.00000.96860.7373 0.99610.89020.5686 0.99610.76860.3098 0.99610.60000.1608 0.92550.43920.0784 0.80000.29800.0078 0.60000.20390.0157 0.40000.14510.0235 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00000.92940.6275 0.99610.69800.2980 0.94120.23140.1255 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.6980 0.99610.80000.3608 0.99220.55290.2353 0.89020.10200.1098 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.6980 0.99610.80000.3608 0.99220.55290.2353 0.94120.23140.1255 0.74120.00000.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.6980 0.99610.85100.4627 0.99610.69800.2980 0.99220.55290.2353 0.94120.23140.1255 0.74120.00000.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.6980 0.99610.85100.4627 0.99610.69800.2980 0.99220.55290.2353 0.98820.30590.1647 0.89020.10200.1098 0.69410.00000.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 1.00000.92940.6275 0.99610.85100.4627 0.99610.69800.2980 0.99220.55290.2353 0.98820.30590.1647 0.89020.10200.1098 0.69410.00000.1490 000 111 From Cindy Brewer; one of the schemes in the ColorBrewer software 1.00001.00000.8000 1.00000.92940.6275 0.99610.85100.4627 0.99610.69800.2980 0.99220.55290.2353 0.98820.30590.1647 0.89020.10200.1098 0.74120.00000.1490 0.50200.00000.1490 000 111 ggobi-2.1.12/INSTALL0000644000175000017500000003662614651530034007414 Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this 'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. 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, and a file 'config.log' containing compiler output (useful mainly for debugging 'configure'). It can also use an optional file (typically called 'config.cache' and enabled with '--cache-file=config.cache' or simply '-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. 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 you are using the cache, and at some point 'config.cache' contains results you don't want to keep, you may remove or edit it. The file 'configure.ac' (or 'configure.in') is used to create 'configure' by a program called 'autoconf'. You need 'configure.ac' if you want to change it or regenerate 'configure' using a newer version of 'autoconf'. The simplest way to compile this package is: 1. 'cd' to the directory containing the package's source code and type './configure' to configure the package for your system. Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type 'make' to compile the package. 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the 'make install' phase executed with root privileges. 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. 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'. There is also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. You can give 'configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run the 'configure' script. 'configure' automatically checks for the source code in the directory that 'configure' is in and in '..'. This is known as a "VPATH" build. With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, 'make install' installs the package's commands under '/usr/local/bin', include files under '/usr/local/include', etc. You can specify an installation prefix other than '/usr/local' by giving 'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like '--bindir=DIR' 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. In general, the default for these options is expressed in terms of '${prefix}', so that specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the 'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of '${prefix}'. Any directories that were specified during 'configure', but not in terms of '${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the 'DESTDIR' variable. For example, 'make install DESTDIR=/alternate/directory' will prepend '/alternate/directory' before all installation names. The approach of 'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of '${prefix}' at 'configure' time. Optional Features ================= 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'. 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. Some packages offer the ability to configure how verbose the execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be overridden with 'make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX 'make' updates targets which have the same timestamps as their prerequisites, which makes it generally unusable when shipped generated files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its '' header file. The option '-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in '/usr/bin'. So, if you need '/usr/ucb' in your 'PATH', put it _after_ '/usr/bin'. On Haiku, software installed for all users goes in '/boot/common', not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the '--build=TYPE' option. TYPE can either be a short name for the system type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file 'config.sub' for the possible values of each field. If 'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with '--host=TYPE'. Sharing Defaults ================ If you want to set default values for 'configure' scripts to share, you can create a site shell script called 'config.site' that gives default values for variables like 'CC', 'cache_file', and 'prefix'. 'configure' looks for 'PREFIX/share/config.site' if it exists, then 'PREFIX/etc/config.site' if it exists. Or, you can set the 'CONFIG_SITE' environment variable to the location of the site script. A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 'configure' Invocation ====================== 'configure' recognizes the following options to control how it operates. '--help' '-h' Print a summary of all of the options to 'configure', and exit. '--help=short' '--help=recursive' Print a summary of the options unique to this package's 'configure', and exit. The 'short' variant lists options used only in the top level, while the 'recursive' variant lists options also present in any nested packages. '--version' '-V' Print the version of Autoconf used to generate the 'configure' script, and exit. '--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. '--config-cache' '-C' Alias for '--cache-file=config.cache'. '--quiet' '--silent' '-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). '--srcdir=DIR' Look for the package's source code in directory DIR. Usually 'configure' can determine that directory automatically. '--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. '--no-create' '-n' Run the configure checks, but stop before creating any output files. 'configure' also accepts some other, not widely useful, options. Run 'configure --help' for more details. ggobi-2.1.12/plugins/0000755000175000017500000000000014651542215010113 5ggobi-2.1.12/plugins/Makefile.in0000644000175000017500000004612514651530034012104 # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 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@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = plugins ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/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)/config/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@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIBTEX = @BIBTEX@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GGOBI_RELEASE_DATE = @GGOBI_RELEASE_DATE@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOB2 = @GOB2@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MICRO_VERSION = @MICRO_VERSION@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PDFLATEX = @PDFLATEX@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PLUGIN_DIRS = @PLUGIN_DIRS@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SRC_DEBUG = @SRC_DEBUG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localedir_c = @localedir_c@ localedir_c_make = @localedir_c_make@ 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@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = @PLUGIN_DIRS@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(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 plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu plugins/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: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # 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: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool 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 mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ 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 mostlyclean-libtool 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: ggobi-2.1.12/plugins/Makefile.am0000644000175000017500000000002614651527764012101 SUBDIRS=@PLUGIN_DIRS@ ggobi-2.1.12/bootstrap0000755000175000017500000000037514651527764010336 #!/bin/sh case `uname` in Darwin*) export PATH=/usr/local/opt/gettext/bin:$PATH && export ACLOCAL_PATH=/usr/local/opt/gettext/share/aclocal:/usr/local/opt/pkgconfig/share/aclocal ;; *) ;; esac cp README.md README autoreconf -iv --force autopoint -f ggobi-2.1.12/configure.ac0000644000175000017500000001520114651527764010653 dnl This is the configuration script for ggobi # Configure the version information here m4_define([ggobi_release_date], ["March 16 2015"]) m4_define([ggobi_major_version], [2]) m4_define([ggobi_minor_version], [1]) m4_define([ggobi_micro_version], [12]) m4_define([ggobi_version], [ggobi_major_version.ggobi_minor_version.ggobi_micro_version]) # Initialize autoconf AC_INIT(ggobi, ggobi_version, ggobi-help@lists.ggobi.org) AC_PREREQ(2.60) # Tell autoconf where our sources are AC_CONFIG_SRCDIR([src/transform_ui.c]) # Setup the header where our checks will be made available to the source AC_CONFIG_HEADER(src/config.h) # We will store build scripts in the 'config' directory, since it is cleaner AC_CONFIG_AUX_DIR(config) AC_SUBST(ac_aux_dir) # Initialize automake AM_INIT_AUTOMAKE([1.10]) # Figure out where we are installing immediately if test "${prefix}" = "NONE"; then prefix=$ac_default_prefix fi # Remember where our GGobi data is installed GGOBI_DATADIR_TMP=`eval echo ${datadir}` GGOBI_DATADIR=`eval echo "${GGOBI_DATADIR_TMP}"` AC_DEFINE_UNQUOTED([GGOBI_DATADIR], "$GGOBI_DATADIR", [Location of GGobi data installation]) # Initialize gettext AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION(0.14.5) GGOBI_LOCALEDIR="${GGOBI_DATADIR}/locale" AC_DEFINE_UNQUOTED([GGOBI_LOCALEDIR], "$GGOBI_LOCALEDIR", [Location of locale files]) # gettext needs MKINSTALLDIRS, but for some reason isn't getting it MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" AC_SUBST(MKINSTALLDIRS) MAJOR_VERSION=ggobi_major_version MINOR_VERSION=ggobi_minor_version MICRO_VERSION=ggobi_micro_version GGOBI_RELEASE_DATE=ggobi_release_date AC_SUBST(GGOBI_RELEASE_DATE) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(MICRO_VERSION) dnl These go into config.h as #define entries (used in about dialog). AC_DEFINE_UNQUOTED([GGOBI_RELEASE_DATE], "${GGOBI_RELEASE_DATE}", [Date of GGobi's release]) AC_DEFINE_UNQUOTED([MAJOR_VERSION], $MAJOR_VERSION, [The major x.*.* version]) AC_DEFINE_UNQUOTED([MINOR_VERSION], $MINOR_VERSION, [The minor *.x.* version]) AC_DEFINE_UNQUOTED([MICRO_VERSION], $MICRO_VERSION, [The micro *.*.x version]) # Configure options (debug? local? any plugins?) AC_ARG_ENABLE(debug, [--enable-debug Compile with debugging symbols]) PLUGIN_DIRS="" AC_ARG_WITH(all-plugins, [--with-all-plugins Enable all (supported) plugins]) #AC_ARG_WITH(mysql, # --with-mysql Enable plugin for reading data from MySQL databases, # MYSQL_PLUGIN=1; PLUGIN_DIRS="MySQL") #AC_ARG_WITH(postgres, # --with-postgres Enable plugin reading data from Postgres databases., # POSTGRES_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} Postgres") AC_ARG_WITH(dataviewer, --with-dataviewer Enable plugin for viewing data in a datagrid., DATAVIEWER_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} DataViewer") AC_ARG_WITH(describedisplay, --with-describedisplay Convert GGobi plots to R plots., DESCRIBEDISPLAY_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} DescribeDisplay") AC_ARG_WITH(graphlayout, [--with-graphlayout Enable GraphLayout plugin], [echo "With graphlayout"; GRAPHLAYOUT_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} GraphLayout"]) AC_ARG_WITH(ggvis, --with-ggvis Enable ggvis plugin, [GGVIS_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} ggvis"]) AC_ARG_WITH(graphaction, --with-graphaction Enable graph operations plugin, [GRAPHACTION_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} GraphAction"]) AC_ARG_WITH(varcloud, --with-varcloud Enable variogram cloud plugin, [VARCLOUD_PLUGIN=1; PLUGIN_DIRS="${PLUGIN_DIRS} VarCloud"]) AC_ARG_WITH(plugins, [--with-plugins With plugins in a quoted, space-separated list]) if test "$with_plugins" != "" && test "$with_plugins" != "yes" && test "$with_plugins" != "y" && test "$with_plugins" != "no" && test "$with_plugins" != "n" ; then PLUGIN_DIRS=$with_plugins fi if test -n "${with_all_plugins}" && test "${with_all_plugins}" != "no" ; then PLUGIN_DIRS="DataViewer DescribeDisplay GraphLayout GraphAction VarCloud ggvis" fi # This is obviously ugly, but AC_CONFIG_SUBDIRS *requires* a literal for p in ${PLUGIN_DIRS} ; do if test "${p}" = "DataViewer"; then AC_CONFIG_SUBDIRS(plugins/DataViewer) fi if test "${p}" = "VarCloud"; then AC_CONFIG_SUBDIRS(plugins/VarCloud) fi if test "${p}" = "ggvis"; then AC_CONFIG_SUBDIRS(plugins/ggvis) fi if test "${p}" = "GraphAction"; then AC_CONFIG_SUBDIRS(plugins/GraphAction) fi if test "${p}" = "GraphLayout"; then AC_CONFIG_SUBDIRS(plugins/GraphLayout) fi if test "${p}" = "DescribeDisplay"; then AC_CONFIG_SUBDIRS(plugins/DescribeDisplay) fi done AC_SUBST(PLUGIN_DIRS) # Make sure we a C compiler and symbolic link capability AC_PROG_CC AC_PROG_LN_S # Set up libtool to create only dynamic libraries # and to support DLLs on Windows. AC_DISABLE_STATIC AC_LIBTOOL_WIN32_DLL AC_LIBTOOL_DLOPEN AC_PROG_LIBTOOL # Configure for building against local libintl AC_SUBST(INCINTL) # Check for questionable functions (kind of paranoid) AC_FUNC_MALLOC AC_CHECK_FUNCS([pow sqrt strchr strrchr strstr memset]) # Check for some non-standard header files AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h string.h strings.h unistd.h]) # Make sure our compiler doesn't suck AC_C_CONST AC_HEADER_STDBOOL # Debug? if test -n "${enable_debug}" && ! test "${enable_debug}" = "no" ; then SRC_DEBUG="-g -Wall" fi AC_SUBST(SRC_DEBUG) # Find GOB2 (don't fail if not found, not necessary for distributed builds) AC_PATH_PROG(GOB2, gob2,,$PATH) PKG_PROG_PKG_CONFIG(0.20) # FIND GTK2 echo "Looking for gtk2" PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.6.0]) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) echo "Setting gtk flags: cflags=$GTK_CFLAGS, libs=$GTK_LIBS" PKG_CHECK_MODULES(GMODULE, [gmodule-2.0]) AC_SUBST(GMODULE_CFLAGS) AC_SUBST(GMODULE_LIBS) PKG_CHECK_MODULES(LIBXML, [libxml-2.0]) AC_SUBST(LIBXML_CFLAGS) AC_SUBST(LIBXML_LIBS) # Find pdflatex and bibtex for building the manual AC_PATH_PROGS(PDFLATEX, [${PDFLATEX} pdflatex], false) AC_PATH_PROGS(BIBTEX, [${BIBTEX} bibtex], false) # Are we on Windows? AC_MSG_CHECKING([for native Win32]) case "$host" in *-*-mingw*) os_win32=yes ;; *) os_win32=no ;; esac echo "${os_win32}" AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes") dnl Process the different .in files, substituting the values computed here in the configuration dnl script for the corresponding @variable@ in these files. AC_CONFIG_FILES(Makefile src/Makefile plugins/Makefile ggobi.pc ggobi-system.pc po/Makefile.in doc/Makefile) AC_OUTPUT echo "*******************************" echo "" echo "GGobi" echo " Plugins: ${PLUGIN_DIRS}" echo " Installation directory: $prefix" echo "" echo "*******************************" ggobi-2.1.12/ggobi-system.pc.in0000644000175000017500000000046414651527764011734 # File for pkg-config # prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libggobi Version: @PACKAGE_VERSION@ Description: GGobi library for dynamic graphics. Requires: gtk+-2.0, libxml-2.0 Libs: -L${libdir} -lggobi Cflags: -I${includedir}/ggobi Home: @datadir@/ggobi ggobi-2.1.12/Makefile.am0000644000175000017500000000370514651527764010427 SUBDIRS = src plugins po doc EXTRA_DIST = bootstrap CPLicense.txt datafilesdir = $(pkgdatadir)/data dist_datafiles_DATA = \ data/places.xml \ data/sleep.csv \ data/tmin.xml \ data/Shipman.csv \ data/laser.csv \ data/prim7.xml \ data/sleep.xml \ data/tmin1.csv \ data/Shipman.xml \ data/laser.xml \ data/ratcns.csv \ data/snetwork.xml \ data/tmin1.xml \ data/adhoc.xml \ data/morsecodes.xml \ data/ratcns.xml \ data/stdColorMap.xml \ data/tmin2.xml \ data/algal-bloom.xml \ data/olive.csv \ data/river.xml \ data/tao-nomiss.xml \ data/tmin3.xml \ data/buckyball.xml \ data/olive.xml \ data/roos.csv \ data/tao.csv \ data/tmin4.xml \ data/cube6.xml \ data/perm4.xml \ data/roos.xml \ data/tao.xml \ data/eies.xml \ data/perm5.xml \ data/sarsHK.xml \ data/tips.csv \ data/flea.csv \ data/pigs.xml \ data/sat.csv \ data/tips.xml \ data/flea.xml \ data/places.csv \ data/sat.xml \ data/tmin.csv desktopdir = $(datadir)/applications dist_desktop_DATA = xdg/ggobi.desktop iconsdir = $(datadir)/pixmaps dist_icons_DATA = xdg/ggobi.png sharedir = $(pkgdatadir)/share dist_share_DATA = share/colorschemes.xml pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = ggobi-system.pc ggobiconfdir = $(sysconfdir)/xdg/ggobi ggobiconf_DATA = ggobirc install-data-hook: cd $(DESTDIR)$(pkgconfigdir) && test -f ggobi-system.pc && \ mv ggobi-system.pc ggobi.pc uninstall-local: rm -f $(DESTDIR)$(pkgconfigdir)/ggobi.pc DISTCHECK_CONFIGURE_FLAGS = --with-all-plugins # We add symlinks for developer convenience all-local: ggobi ggobirc ggobi: ln -s src/ggobi ggobi # Use this rule to build your ggobirc (for loading plugins) ggobirc: echo "" > $@ echo "" >> $@ for i in $(PLUGIN_DIRS) ; do \ echo "" >> $@ ; \ cat plugins/$$i/plugin.xml >> $@ ; \ done echo "" >> $@ echo "" >> $@ win32-installer: ggobirc makensis //DVERSION="@VERSION@" win32/ggobi.nsi ggobi-2.1.12/AUTHORS0000644000175000017500000000072514651527764007442 Most of the GGobi code was written by Debby Swayne, Di Cook, Duncan Temple Lang and Andreas Buja. Nicholas Lewin-Koh has provided a great deal of help and wrote the primary version the time series displays. Heike Hofmann provided the primary version of the barchart displays while at AT&T and then at Iowa State. Michael Lawrence fully upgraded the GUI to GTK2. Hadley Wickham redesigned the web site, helped with many GUI design improvements and reported many bugs. ggobi-2.1.12/aclocal.m40000644000175000017500000174630214651530033010222 # generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 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'.])]) # build-to-host.m4 serial 3 dnl Copyright (C) 2023-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Written by Bruno Haible. dnl When the build environment ($build_os) is different from the target runtime dnl environment ($host_os), file names may need to be converted from the build dnl environment syntax to the target runtime environment syntax. This is dnl because the Makefiles are executed (mostly) by build environment tools and dnl therefore expect file names in build environment syntax, whereas the runtime dnl expects file names in target runtime environment syntax. dnl dnl For example, if $build_os = cygwin and $host_os = mingw32, filenames need dnl be converted from Cygwin syntax to native Windows syntax: dnl /cygdrive/c/foo/bar -> C:\foo\bar dnl /usr/local/share -> C:\cygwin64\usr\local\share dnl dnl gl_BUILD_TO_HOST([somedir]) dnl This macro takes as input an AC_SUBSTed variable 'somedir', which must dnl already have its final value assigned, and produces two additional dnl AC_SUBSTed variables 'somedir_c' and 'somedir_c_make', that designate the dnl same file name value, just in different syntax: dnl - somedir_c is the file name in target runtime environment syntax, dnl as a C string (starting and ending with a double-quote, dnl and with escaped backslashes and double-quotes in dnl between). dnl - somedir_c_make is the same thing, escaped for use in a Makefile. AC_DEFUN([gl_BUILD_TO_HOST], [ AC_REQUIRE([AC_CANONICAL_BUILD]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_BUILD_TO_HOST_INIT]) dnl Define somedir_c. gl_final_[$1]="$[$1]" dnl Translate it from build syntax to host syntax. case "$build_os" in cygwin*) case "$host_os" in mingw* | windows*) gl_final_[$1]=`cygpath -w "$gl_final_[$1]"` ;; esac ;; esac dnl Convert it to C string syntax. [$1]_c=`printf '%s\n' "$gl_final_[$1]" | sed -e "$gl_sed_double_backslashes" -e "$gl_sed_escape_doublequotes" | tr -d "$gl_tr_cr"` [$1]_c='"'"$[$1]_c"'"' AC_SUBST([$1_c]) dnl Define somedir_c_make. [$1]_c_make=`printf '%s\n' "$[$1]_c" | sed -e "$gl_sed_escape_for_make_1" -e "$gl_sed_escape_for_make_2" | tr -d "$gl_tr_cr"` dnl Use the substituted somedir variable, when possible, so that the user dnl may adjust somedir a posteriori when there are no special characters. if test "$[$1]_c_make" = '\"'"${gl_final_[$1]}"'\"'; then [$1]_c_make='\"$([$1])\"' fi AC_SUBST([$1_c_make]) ]) dnl Some initializations for gl_BUILD_TO_HOST. AC_DEFUN([gl_BUILD_TO_HOST_INIT], [ gl_sed_double_backslashes='s/\\/\\\\/g' gl_sed_escape_doublequotes='s/"/\\"/g' changequote(,)dnl gl_sed_escape_for_make_1="s,\\([ \"&'();<>\\\\\`|]\\),\\\\\\1,g" changequote([,])dnl gl_sed_escape_for_make_2='s,\$,\\$$,g' dnl Find out how to remove carriage returns from output. Solaris /usr/ucb/tr dnl does not understand '\r'. case `echo r | tr -d '\r'` in '') gl_tr_cr='\015' ;; *) gl_tr_cr='\r' ;; esac ]) # gettext.m4 serial 78 (gettext-0.22.4) dnl Copyright (C) 1995-2014, 2016, 2018-2023 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext 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-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL must be one of 'external', 'use-libtool', 'here'. dnl INTLSYMBOL should be 'external' for packages other than GNU gettext. dnl It should be 'use-libtool' for the packages 'gettext-runtime' and dnl 'gettext-tools'. dnl It should be 'here' for the package 'gettext-runtime/intl'. dnl If INTLSYMBOL is 'here', then a libtool library dnl $(top_builddir)/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). 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. m4_if([$1], [], , [m4_if([$1], [external], , [m4_if([$1], [use-libtool], , [m4_if([$1], [here], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) m4_if(m4_if([$1], [], [old])[]m4_if([$1], [no-libtool], [old]), [old], [errprint([ERROR: Use of AM_GNU_GETTEXT without [external] argument is no longer supported. ])]) m4_if([$2], [], , [m4_if([$2], [need-ngettext], , [m4_if([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_building_libintl_in_same_build_tree], m4_if([$1], [use-libtool], [yes], [m4_if([$1], [here], [yes], [no])])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])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 { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.ac 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 not documented, we avoid it. m4_if(gt_building_libintl_in_same_build_tree, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) m4_if(gt_building_libintl_in_same_build_tree, yes, [ USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no m4_if(gt_building_libintl_in_same_build_tree, 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. if test $gt_api_version -ge 3; then gt_revision_test_code=' #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 ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. m4_if(gt_building_libintl_in_same_build_tree, 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_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_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv or other dnl OS dependent libraries, specifically on macOS and AIX. gt_LIBINTL_EXTRA="$INTL_MACOSX_LIBS" AC_REQUIRE([AC_CANONICAL_HOST]) case "$host_os" in aix*) gt_LIBINTL_EXTRA="-lpthread" ;; esac if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } \ && { test -n "$LIBICONV" || test -n "$gt_LIBINTL_EXTRA"; }; then LIBS="$LIBS $LIBICONV $gt_LIBINTL_EXTRA" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [LIBINTL="$LIBINTL $LIBICONV $gt_LIBINTL_EXTRA" LTLIBINTL="$LTLIBINTL $LTLIBICONV $gt_LIBINTL_EXTRA" eval "$gt_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 { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools \ && test "$PACKAGE" != libintl; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi m4_if(gt_building_libintl_in_same_build_tree, 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. USE_INCLUDED_LIBINTL=yes LIBINTL="m4_if([$3],[],\${top_builddir}/intl,[$3])/libintl.la $LIBICONV $LIBTHREAD" LTLIBINTL="m4_if([$3],[],\${top_builddir}/intl,[$3])/libintl.la $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= 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 -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi 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 { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "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 { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "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 m4_if(gt_building_libintl_in_same_build_tree, yes, [ dnl Make all variables we use known to autoconf. AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) ]) m4_if(gt_building_libintl_in_same_build_tree, yes, [], [ 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 Define localedir_c and localedir_c_make. dnl Find the final value of localedir. gt_save_prefix="${prefix}" gt_save_datarootdir="${datarootdir}" gt_save_localedir="${localedir}" dnl Unfortunately, prefix gets only finally determined at the end of dnl configure. if test "X$prefix" = "XNONE"; then prefix="$ac_default_prefix" fi eval datarootdir="$datarootdir" eval localedir="$localedir" gl_BUILD_TO_HOST([localedir]) localedir="${gt_save_localedir}" datarootdir="${gt_save_datarootdir}" prefix="${gt_save_prefix}" ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], []) # host-cpu-c-abi.m4 serial 17 dnl Copyright (C) 2002-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible and Sam Steingold. dnl Sets the HOST_CPU variable to the canonical name of the CPU. dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its dnl C language ABI (application binary interface). dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in dnl config.h. dnl dnl This canonical name can be used to select a particular assembly language dnl source file that will interoperate with C code on the given host. dnl dnl For example: dnl * 'i386' and 'sparc' are different canonical names, because code for i386 dnl will not run on SPARC CPUs and vice versa. They have different dnl instruction sets. dnl * 'sparc' and 'sparc64' are different canonical names, because code for dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit dnl mode, but not both. dnl * 'mips' and 'mipsn32' are different canonical names, because they use dnl different argument passing and return conventions for C functions, and dnl although the instruction set of 'mips' is a large subset of the dnl instruction set of 'mipsn32'. dnl * 'mipsn32' and 'mips64' are different canonical names, because they use dnl different sizes for the C types like 'int' and 'void *', and although dnl the instruction sets of 'mipsn32' and 'mips64' are the same. dnl * The same canonical name is used for different endiannesses. You can dnl determine the endianness through preprocessor symbols: dnl - 'arm': test __ARMEL__. dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL. dnl - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN. dnl * The same name 'i386' is used for CPUs of type i386, i486, i586 dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because dnl - Instructions that do not exist on all of these CPUs (cmpxchg, dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your dnl assembly language source files use such instructions, you will dnl need to make the distinction. dnl - Speed of execution of the common instruction set is reasonable across dnl the entire family of CPUs. If you have assembly language source files dnl that are optimized for particular CPU types (like GNU gmp has), you dnl will need to make the distinction. dnl See . AC_DEFUN([gl_HOST_CPU_C_ABI], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_C_ASM]) AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi], [case "$host_cpu" in changequote(,)dnl i[34567]86 ) changequote([,])dnl gl_cv_host_cpu_c_abi=i386 ;; x86_64 ) # On x86_64 systems, the C compiler may be generating code in one of # these ABIs: # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 # with native Windows (mingw, MSVC). # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if (defined __x86_64__ || defined __amd64__ \ || defined _M_X64 || defined _M_AMD64) int ok; #else error fail #endif ]])], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __ILP32__ || defined _ILP32 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=x86_64-x32], [gl_cv_host_cpu_c_abi=x86_64])], [gl_cv_host_cpu_c_abi=i386]) ;; changequote(,)dnl alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] ) changequote([,])dnl gl_cv_host_cpu_c_abi=alpha ;; arm* | aarch64 ) # Assume arm with EABI. # On arm64 systems, the C compiler may be generating code in one of # these ABIs: # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef __aarch64__ int ok; #else error fail #endif ]])], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __ILP32__ || defined _ILP32 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=arm64-ilp32], [gl_cv_host_cpu_c_abi=arm64])], [# Don't distinguish little-endian and big-endian arm, since they # don't require different machine code for simple operations and # since the user can distinguish them through the preprocessor # defines __ARMEL__ vs. __ARMEB__. # But distinguish arm which passes floating-point arguments and # return values in integer registers (r0, r1, ...) - this is # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which # passes them in float registers (s0, s1, ...) and double registers # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer # sets the preprocessor defines __ARM_PCS (for the first case) and # __ARM_PCS_VFP (for the second case), but older GCC does not. echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c # Look for a reference to the register d0 in the .s file. AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1 if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then gl_cv_host_cpu_c_abi=armhf else gl_cv_host_cpu_c_abi=arm fi rm -f conftest* ]) ;; hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) # On hppa, the C compiler may be generating 32-bit code or 64-bit # code. In the latter case, it defines _LP64 and __LP64__. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef __LP64__ int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=hppa64], [gl_cv_host_cpu_c_abi=hppa]) ;; ia64* ) # On ia64 on HP-UX, the C compiler may be generating 64-bit code or # 32-bit code. In the latter case, it defines _ILP32. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef _ILP32 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=ia64-ilp32], [gl_cv_host_cpu_c_abi=ia64]) ;; mips* ) # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this # at 32. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=mips64], [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but # may later get defined by ), and _MIPS_SIM == _ABIN32. # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but # may later get defined by ), and _MIPS_SIM == _ABIO32. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if (_MIPS_SIM == _ABIN32) int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=mipsn32], [gl_cv_host_cpu_c_abi=mips])]) ;; powerpc* ) # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. # No need to distinguish them here; the caller may distinguish # them based on the OS. # On powerpc64 systems, the C compiler may still be generating # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may # be generating 64-bit code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __powerpc64__ || defined __LP64__ int ok; #else error fail #endif ]])], [# On powerpc64, there are two ABIs on Linux: The AIX compatible # one and the ELFv2 one. The latter defines _CALL_ELF=2. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined _CALL_ELF && _CALL_ELF == 2 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=powerpc64-elfv2], [gl_cv_host_cpu_c_abi=powerpc64]) ], [gl_cv_host_cpu_c_abi=powerpc]) ;; rs6000 ) gl_cv_host_cpu_c_abi=powerpc ;; riscv32 | riscv64 ) # There are 2 architectures (with variants): rv32* and rv64*. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if __riscv_xlen == 64 int ok; #else error fail #endif ]])], [cpu=riscv64], [cpu=riscv32]) # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. # Size of 'long' and 'void *': AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ int ok; #else error fail #endif ]])], [main_abi=lp64], [main_abi=ilp32]) # Float ABIs: # __riscv_float_abi_double: # 'float' and 'double' are passed in floating-point registers. # __riscv_float_abi_single: # 'float' are passed in floating-point registers. # __riscv_float_abi_soft: # No values are passed in floating-point registers. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __riscv_float_abi_double int ok; #else error fail #endif ]])], [float_abi=d], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __riscv_float_abi_single int ok; #else error fail #endif ]])], [float_abi=f], [float_abi='']) ]) gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}" ;; s390* ) # On s390x, the C compiler may be generating 64-bit (= s390x) code # or 31-bit (= s390) code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ || defined __s390x__ int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=s390x], [gl_cv_host_cpu_c_abi=s390]) ;; sparc | sparc64 ) # UltraSPARCs running Linux have `uname -m` = "sparc64", but the # C compiler still generates 32-bit code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __sparcv9 || defined __arch64__ int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=sparc64], [gl_cv_host_cpu_c_abi=sparc]) ;; *) gl_cv_host_cpu_c_abi="$host_cpu" ;; esac ]) dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same. HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'` HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi" AC_SUBST([HOST_CPU]) AC_SUBST([HOST_CPU_C_ABI]) # This was # AC_DEFINE_UNQUOTED([__${HOST_CPU}__]) # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__]) # earlier, but KAI C++ 3.2d doesn't like this. sed -e 's/-/_/g' >> confdefs.h <. dnl Don't make changes that are incompatible with that documentation! 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). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles 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_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. gl_saved_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_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #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 gl_saved_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #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="$gl_saved_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, dnl Solaris 10. gl_saved_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif ]], [[int result = 0; /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from successful returns. This is even documented in */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_CONST char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ { /* Try standardized names. */ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP"); /* Try IRIX, OSF/1 names. */ iconv_t cd2 = iconv_open ("UTF-8", "eucJP"); /* Try AIX names. */ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP"); /* Try HP-UX names. */ iconv_t cd4 = iconv_open ("utf8", "eucJP"); if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1) && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1)) result |= 16; if (cd1 != (iconv_t)(-1)) iconv_close (cd1); if (cd2 != (iconv_t)(-1)) iconv_close (cd2); if (cd3 != (iconv_t)(-1)) iconv_close (cd3); if (cd4 != (iconv_t)(-1)) iconv_close (cd4); } return result; ]])], [am_cv_func_iconv_works=yes], , [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) test "$am_cv_func_iconv_works" = no || break done LIBS="$gl_saved_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) 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="$gl_saved_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE, in order to avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". AC_DEFUN_ONCE([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([whether iconv is compatible with its POSIX signature], [gl_cv_iconv_nonconst], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include extern #ifdef __cplusplus "C" #endif size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); ]], [[]])], [gl_cv_iconv_nonconst=yes], [gl_cv_iconv_nonconst=no]) ]) else dnl When compiling GNU libiconv on a system that does not have iconv yet, dnl pick the POSIX compliant declaration without 'const'. gl_cv_iconv_nonconst=yes fi if test $gl_cv_iconv_nonconst = yes; then iconv_arg1="" else iconv_arg1="const" fi AC_DEFINE_UNQUOTED([ICONV_CONST], [$iconv_arg1], [Define as const if the declaration of iconv() needs const.]) dnl Also substitute ICONV_CONST in the gnulib generated . m4_ifdef([gl_ICONV_H_DEFAULTS], [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) if test $gl_cv_iconv_nonconst != yes; then ICONV_CONST="const" fi ]) dnl A summary result, for those packages which want to print a summary at the dnl end of the configuration. if test "$am_func_iconv" = yes; then if test -n "$LIBICONV"; then am_cv_func_iconv_summary='yes, in libiconv' else am_cv_func_iconv_summary='yes, in libc' fi else if test "$am_cv_func_iconv" = yes; then am_cv_func_iconv_summary='not working, consider installing GNU libiconv' else am_cv_func_iconv_summary='no, consider installing GNU libiconv' fi fi ]) # intlmacosx.m4 serial 10 (gettext-0.23) dnl Copyright (C) 2004-2014, 2016, 2019-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.4. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_saved_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_saved_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Don't check for the API introduced in Mac OS X 10.5, CFLocaleCopyCurrent, dnl because in macOS 10.13.4 it has the following behaviour: dnl When two or more languages are specified in the dnl "System Preferences > Language & Region > Preferred Languages" panel, dnl it returns en_CC where CC is the territory (even when English is not among dnl the preferred languages!). What we want instead is what dnl CFLocaleCopyCurrent returned in earlier macOS releases and what dnl CFPreferencesCopyAppValue still returns, namely ll_CC where ll is the dnl first among the preferred languages and CC is the territory. AC_CACHE_CHECK([for CFLocaleCopyPreferredLanguages], [gt_cv_func_CFLocaleCopyPreferredLanguages], [gt_saved_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyPreferredLanguages();]])], [gt_cv_func_CFLocaleCopyPreferredLanguages=yes], [gt_cv_func_CFLocaleCopyPreferredLanguages=no]) LIBS="$gt_saved_LIBS"]) if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then AC_DEFINE([HAVE_CFLOCALECOPYPREFERREDLANGUAGES], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then dnl Starting with macOS version 14, CoreFoundation relies on CoreServices, dnl and we have to link it in explicitly, otherwise an exception dnl NSInvalidArgumentException "unrecognized selector sent to instance" dnl occurs. INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,CoreServices" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # lib-ld.m4 serial 13 dnl Copyright (C) 1996-2003, 2009-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid dnl collision with libtool.m4. dnl From libtool-2.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 lds only accept -v. case `$LD -v 2>&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi if test -n "$LD"; then AC_MSG_CHECKING([for ld]) elif test "$GCC" = yes; then AC_MSG_CHECKING([for ld used by $CC]) elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi if test -n "$LD"; then # Let the user override the test with a path. : else AC_CACHE_VAL([acl_cv_path_LD], [ acl_cv_path_LD= # Final result of this test ac_prog=ld # Program to search in $PATH if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. case $host in *-*-mingw* | windows*) # gcc leaves a trailing carriage return which upsets mingw acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) acl_output=`($CC -print-prog-name=ld) 2>&5` ;; esac case $acl_output in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` done # Got the pathname. No search in PATH is needed. acl_cv_path_LD="$acl_output" ac_prog= ;; "") # If it fails, then pretend we aren't using GCC. ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac fi if test -n "$ac_prog"; then # Search for $ac_prog in $PATH. acl_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_saved_IFS" 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 variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_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_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) 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. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" ]) AC_ARG_WITH(PACK[-prefix], [[ --with-]]PACK[[-prefix[=DIR] search for ]]PACKLIBS[[ in DIR/include and DIR/lib --without-]]PACK[[-prefix don't search for ]]PACKLIBS[[ 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\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" additional_libdir2="$withval/$acl_libdirstem2" additional_libdir3="$withval/$acl_libdirstem3" fi fi ]) if test "X$additional_libdir2" = "X$additional_libdir"; then additional_libdir2= fi if test "X$additional_libdir3" = "X$additional_libdir"; then additional_libdir3= fi dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Use breadth-first search. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]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= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do if test "X$found_dir" = "X"; then eval dir=\$$additional_libdir_variable if test -n "$dir"; then dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi fi done 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//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" 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/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; 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 "$acl_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 "$acl_hardcode_libdir_flag_spec" && test "$acl_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 "$acl_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 $acl_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 */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem3 | */$acl_libdirstem3/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi 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* | gnu* | k*bsd*-gnu) 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. saved_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$saved_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $dependency_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$dependency_libdir" != "X/usr/$acl_libdirstem" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then haveit= if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) 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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then dnl Really add $dependency_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$dependency_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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then dnl Really add $dependency_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$dependency_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. dnl But on GNU systems, ignore -lc options, because dnl - linking with libc is the default anyway, dnl - linking with libc.a may produce an error dnl "/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie" dnl or may produce an executable that always crashes, see dnl . dep=`echo "X$dep" | sed -e 's/^X-l//'` if test "X$dep" != Xc \ || case $host_os in linux* | gnu* | k*bsd*-gnu) false ;; *) true ;; esac; then names_next_round="$names_next_round $dep" fi ;; *.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 "$acl_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:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_saved_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_saved_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_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 popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) 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 ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2" \ && test "X$dir" != "X/usr/$acl_libdirstem3"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2" \ && test "X$dir" != "X/usr/$acl_libdirstem3"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_saved_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_saved_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_saved_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) # lib-prefix.m4 serial 22 dnl Copyright (C) 2001-2005, 2008-2024 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH([lib-prefix], [[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_saved_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_saved_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_saved_prefix="$prefix" prefix="$acl_final_prefix" acl_saved_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_saved_exec_prefix" prefix="$acl_saved_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a function acl_is_expected_elfclass, that tests whether standard input dn; has a 32-bit or 64-bit ELF header, depending on the host CPU ABI, dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing dnl the basename of the libdir to try in turn, either "lib" or "lib64" or dnl "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar. AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib, lib32, and lib64. dnl On most glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. However, on dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib. dnl We determine the compiler's default mode by looking at the compiler's dnl library search path. If at least one of its elements ends in /lib64 or dnl points to a directory whose absolute pathname ends in /lib64, we use that dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default, dnl namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT]) AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf], [AC_EGREP_CPP([Extensible Linking Format], [#if defined __ELF__ || (defined __linux__ && defined __EDG__) Extensible Linking Format #endif ], [gl_cv_elf=yes], [gl_cv_elf=no]) ]) if test $gl_cv_elf = yes; then # Extract the ELF class of a file (5th byte) in decimal. # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header if od -A x < /dev/null >/dev/null 2>/dev/null; then # Use POSIX od. func_elfclass () { od -A n -t d1 -j 4 -N 1 } else # Use BSD hexdump. func_elfclass () { dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "' echo } fi # Use 'expr', not 'test', to compare the values of func_elfclass, because on # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002, # not 1 or 2. changequote(,)dnl case $HOST_CPU_C_ABI_32BIT in yes) # 32-bit ABI. acl_is_expected_elfclass () { expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null } ;; no) # 64-bit ABI. acl_is_expected_elfclass () { expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null } ;; *) # Unknown. acl_is_expected_elfclass () { : } ;; esac changequote([,])dnl else acl_is_expected_elfclass () { : } fi dnl Allow the user to override the result by setting acl_cv_libdirstems. AC_CACHE_CHECK([for the common suffixes of directories in the library search path], [acl_cv_libdirstems], [dnl Try 'lib' first, because that's the default for libdir in GNU, see dnl . acl_libdirstem=lib acl_libdirstem2= acl_libdirstem3= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. if test $HOST_CPU_C_ABI_32BIT = no; then acl_libdirstem2=lib/64 case "$host_cpu" in sparc*) acl_libdirstem3=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem3=lib/amd64 ;; esac fi ;; netbsd*) dnl On NetBSD/sparc64, there is a 'sparc' subdirectory that contains dnl 32-bit libraries. if test $HOST_CPU_C_ABI_32BIT != no; then case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparc ;; esac fi ;; *) dnl If $CC generates code for a 32-bit ABI, the libraries are dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64. dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32. dnl Find the compiler's search path. However, non-system compilers dnl sometimes have odd library search paths. But we can't simply invoke dnl '/usr/bin/gcc -print-search-dirs' because that would not take into dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS. searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test $HOST_CPU_C_ABI_32BIT != no; then # 32-bit or unknown ABI. if test -d /usr/lib32; then acl_libdirstem2=lib32 fi fi if test $HOST_CPU_C_ABI_32BIT != yes; then # 64-bit or unknown ABI. if test -d /usr/lib64; then acl_libdirstem3=lib64 fi fi if test -n "$searchpath"; then acl_saved_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;; */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib32 ) acl_libdirstem2=lib32 ;; */lib64 ) acl_libdirstem3=lib64 ;; esac ;; esac fi done IFS="$acl_saved_IFS" if test $HOST_CPU_C_ABI_32BIT = yes; then # 32-bit ABI. acl_libdirstem3= fi if test $HOST_CPU_C_ABI_32BIT = no; then # 64-bit ABI. acl_libdirstem2= fi fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem" acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3" ]) dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and dnl acl_libdirstem3. changequote(,)dnl acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'` acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'` acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'` changequote([,])dnl ]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2019, 2021-2024 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 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. # GNU Libtool is free software; you can 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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 . ]) # serial 61 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_DECL_FILECMD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), in case it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2024 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR $AR_FLAGS libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [m4_require([_LT_DECL_SED])dnl AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then # Trim trailing / since we'll always append absolute paths and we want # to avoid //, if only for less confusing output for the user. lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*|x86_64-gnu*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*|x86_64-gnu*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} _LT_DECL([], [AR], [1], [The archiver]) # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because that's what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS _LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. _LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | windows* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | windows* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -z "$STRIP"; then AC_MSG_RESULT([no]) else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl*) # Native MSVC or ICC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # -rpath works at least for libraries that are not overridden by # libraries installed in system locations. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw* | *-*-windows*) # 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. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname 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 yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | windows* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | windows* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_manifest_tool], [lt_cv_path_manifest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_manifest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_manifest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-mingw* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | windows* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BCDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw* | windows*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *flang) # Flang compiler. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | windows* | cegcc*) case $cc_basename in cl* | icl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([[^)]]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -Fe $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -Fe $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and ICC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e. impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "[[-]]L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | windows* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl*) # Native MSVC or ICC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "[[-]]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "[[-]]L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "[[-]]L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "[[-]]L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R,l}" and the path. # Remove the space. if test x-L = x"$p" || test x-R = x"$p" || test x-l = x"$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_FILECMD # ---------------- # Check for a file(cmd) program that can be used to detect file type and magic m4_defun([_LT_DECL_FILECMD], [AC_CHECK_PROG([FILECMD], [file], [file], [:]) _LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) ])# _LD_DECL_FILECMD # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* | *-*-windows* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2024 Free # Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 9 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2024 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2019, 2021-2024 Free Software Foundation, # Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 4350 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.5.0.14-9a4a-dirty]) m4_define([LT_PACKAGE_REVISION], [2.5.0.14]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.5.0.14-9a4a-dirty' macro_revision='2.5.0.14' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2024 Free # Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # nls.m4 serial 6 (gettext-0.20.2) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016, 2019-2024 Free dnl Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) 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]) ]) # 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 # po.m4 serial 32 (gettext-0.21.1) dnl Copyright (C) 1995-2014, 2016, 2018-2022, 2024 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.60]) 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([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AC_PROG_SED])dnl AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.20]) 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 >&]AS_MESSAGE_LOG_FD[ 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 Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) 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 >&]AS_MESSAGE_LOG_FD[ 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 Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) 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 >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Test whether it is GNU msgmerge >= 0.20. if LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt' else dnl Test whether it is GNU msgmerge >= 0.12. if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet' else dnl With these old versions, $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) is dnl slow. But this is not a big problem, as such old gettext versions are dnl hardly in use any more. MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet' fi fi AC_SUBST([MSGMERGE_FOR_MSGFMT_OPTION]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ 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 # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. 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" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/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" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. 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" | "$presentlang"_* | "$presentlang".* | "$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. 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" tab=`printf '\t'` 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' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ([2.53]) # 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 # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. 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 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. ;; *) gt_saved_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in m4_if([$5], , $PATH, [$5]); do IFS="$gt_saved_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 echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$gt_saved_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. m4_if([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test m4_if([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) # Copyright (C) 2002-2021 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.16' 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.16.5], [], [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.16.5])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-2021 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-2021 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-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2021 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-2021 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 # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2021 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-2021 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])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2021 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-2021 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 ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 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-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2021 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-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2021 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-2021 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-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR ggobi-2.1.12/doc/0000755000175000017500000000000014651542215007177 5ggobi-2.1.12/doc/Makefile.in0000644000175000017500000003665414651530034011176 # Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 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@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(dist_doc_DATA) \ $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(dist_doc_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/config/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIBTEX = @BIBTEX@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FILECMD = @FILECMD@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GGOBI_RELEASE_DATE = @GGOBI_RELEASE_DATE@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GOB2 = @GOB2@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INCINTL = @INCINTL@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBXML_CFLAGS = @LIBXML_CFLAGS@ LIBXML_LIBS = @LIBXML_LIBS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAJOR_VERSION = @MAJOR_VERSION@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MICRO_VERSION = @MICRO_VERSION@ MINOR_VERSION = @MINOR_VERSION@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PDFLATEX = @PDFLATEX@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PLUGIN_DIRS = @PLUGIN_DIRS@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SRC_DEBUG = @SRC_DEBUG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localedir_c = @localedir_c@ localedir_c_make = @localedir_c_make@ 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@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ dist_doc_DATA = manual.pdf XML.pdf all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(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: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_docDATA: $(dist_doc_DATA) @$(NORMAL_INSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || 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)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-dist_docDATA: @$(NORMAL_UNINSTALL) @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(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) all-local installdirs: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool 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-dist_docDATA 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 mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_docDATA .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool cscopelist-am ctags-am distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_docDATA 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 mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am uninstall-dist_docDATA .PRECIOUS: Makefile all-local: manual.pdf XML.pdf %.pdf: %.tex @if test "$(PDFLATEX)" = false; then \ $(ECHO) "ERROR: 'pdflatex' needed but missing on your system."; \ exit 1; \ fi @if test "$(BIBTEX)" = false; then \ $(ECHO) "ERROR: 'bibtex' needed but missing on your system."; \ exit 1; \ fi $(PDFLATEX) $< -$(BIBTEX) $* $(PDFLATEX) $< $(PDFLATEX) $< # 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: ggobi-2.1.12/doc/manual.pdf0000644000175000017500000161156314651536313011106 %PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 828 /Length 1443 /Filter /FlateDecode >> stream xYnF}Wc ޹,mS-4]"ˊԖjj]^d#Cq9sf̅R8aBI%JNZbQ,n[zΨ'ŋ`ХAҕQ\tA@PJBrvbHCuZ\A;iv3@,( /H/ Z; /n!Vx+ A N(`vNVh#( \\6p a@f*' % ?4]B^ I,6C%LWA^6ZO@EA${qQhr6\JCƚBTtP =X ycX#)u_DZYK#0#H֗@@&[\bIIBDIbB大8Zh,("B6~<6n; tRIy 0> s)aKsv} ME?[^11GlFVj1 GxX/Ƶ'(i@ UAˇ:z֙^r·dYzW-.v*c֌/~p,Z8ۣJ+8]cC|UW |jR9kT&M̏X|oɝ!u>W2nM۾zh|kߎT|yz|Wv)HT<~3?'~NӨFULQq g3Iwc}.U,Y;+RDH yKVv!ͷ;ImO+>g>$RSX{6kϲɝ ٺj5_PDgq Ƹg\;21x)P h=D :&s ҷ(jerPT%`8w}cםwK.M{UY~)Z#jQTbJ鳷[u&rؒIJ*dn _JHN!Ugmɭ)G{P磮m yy9&3Tm z3&sT.W:ƎtV4;|n =b:uZA șhz2χ8J_=1LM]o!չK"i 8!;FSw'=+!D{&v .SjOT)!-{[ ! endstream endobj 266 0 obj << /Length 1777 /Filter /FlateDecode >> stream xڥX[6~ϯ0Xu6ۤE)ڢ-6%L/3lؗyx$"Yzse"3L9'38%A|g=9gq ~kc?fx=휘=⼗WSUA_7GKY*5wٸ{[OvR ͚@#eII@̀,<&ff i(D5&nʴęSu\~-gқf OE~&bR5qѫW "?ggjfjuLN0z,W ,LjކNո[ά`rDCk`4R=Z^ez%ϢqLE x`C/N"w$,G4 L409,cv6,:`9e;(@7mY W P!|duqY.%t8ҳN'Hૂ^Go #TLsew,nw$L b}gd΀&Ҩ~>8G=Dpڵ觋7ڂt9a#ONQ)&zk-lݶ? τtS3'G1X"ݐǧ[VaaAA]Gw[ }Fy^#iDTJ"60<-%E|00[F/z#z'X`_ *eIQFϷآkd6\I{9H=$-X"}g7; i,8z~ ]a5f q-2i;_H7+=eH1  BSY>~*?i,q! G @>l;=>3# PFκz-[:X|݉*O!XG2W=& _*"Yε?#OA{{Jvf6Rc3* Oq䉬WCQ؟hP E(uX"D%q4% Du\9+Q~΀3 endstream endobj 305 0 obj << /Length 981 /Filter /FlateDecode >> stream xZo0_GG"g; &i&i5h'd- ڗ:w;؛x;>uzp-'`IIB  t}FP" {f⹇c; (PaEa0nrBQnR?YJRuwMÕyg+<5= A۸)"{Qh\̫mYf+ 8A܉$n#IDxQ!:B (42@8G?RSvb(UF M5&Ca$[̴O%`;(}г<,`J :,d!WeY6}͢bE)z0]4ht;yu!* !piy#k_ƩkZk{U=kgF/eY͔SXD 18u:g$b-*rz tn[-_ sU[p:vd~Oܧ$֕46>KUxUhMǗq.m%wkap;O+7e+?BE @?Jp2gȑ]>A%w  DrC-|rdlŸLc![o"-Lf)%ӗXIIɠ\4 Ia"$"b; s156=@i밸5j¡;G8Og[YŠxZ{f1@K8tO8ڒpxM8i^M6#5I Hk쩬8ve+m'9xDƯ*"j9n#@=\,α'Ҭ`$٦gC=K%q2}ݝ5<~d<ʢugd]OW{%+céju,^V_R VVzgQԽ~tZ$RaD"UXCnfp endstream endobj 340 0 obj << /Length 1086 /Filter /FlateDecode >> stream xYn8}W詐pľuI`0 tAeCKP"%K(qzy)+6){﹇Xjʐ\]\^#߀aAc4|.1<@ĝd dͫbڲ <)te3[#67|3%7t!?-VQa7=g:bZp@OaG#8o Ԁې9y@CB?-u y/} BsZ=fv>Q^0+L5@/72z,ʽ< E;)"`O֙dBEY.Vf-/G{"LŸxky%x8PCSo@(|fT+q*(푗A_9; ?z FI+f*/6qPw[Md3. J:X(AɳT {epBT  i J#*"0~4|| #[ǘ/@p. 6t!X Qс[w`QaTZYR_󫅑y͹f;XlZ07CyXKugMW y endstream endobj 353 0 obj << /Length 472 /Filter /FlateDecode >> stream x[O0)&}2Ƙ:P1ގP9;== =̵Coz;QoC(10݀0$BKPCt#p' a97Ceq'h fz|=z մ[5/"ru~ƜKBTZN endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 888 /Length 2450 /Filter /FlateDecode >> stream xڵZmo~c3! J&mEZl⨱ 4ɿ3{ԞN'ݮ]@"ow əR uɪbbp?~LԮQͨc*J\ b2: xN)Kٰx\Ag%jWuOdR&uWC6#W ` aU6bI; `23C12453D̰FC,( 2l[Lp0M1 3$k\O froouvuY⫏Oܗ_.xY_ʊ7s+6Vv!=}OB Vuٷ]>L Ca8 w=}X?W}1}g:{KXݯg;7g?YMm!}C~mTw:bh<$;&'M/Clw|9smt? 鼿|{Twk1\K+~9Iq'\]Ʒ1]ah4z8ghv\?}?s\V~(; eʇGgxOۧ#=So=hG!11C=dK_ComSs-Oί^[/O./r޼_-6ZluٹݭW|ݝPs~*^[:Y4uÇ$|6'l@']C vfErw+w??q˗߯\ս w%bHdzilunuiv|gojj5:ᕆW^ixՆW^mxՆW^mxՆWxSo-v],_\ꮿ;_X~xD^/v4v&3h%Gh^vG)^j>f_O7{&eW̞!9ţ,hz1yE A1B$<ʂc3Hl̛~T ,Ylk'a*&Z`-Uh GgJX{B 6Gz%X.!x]"tz&JdRtULC&fޤ-QPLdbI[A}T72= $1Y^ `>jaL`EIbX! $rlRx MO%Up$L(f(]a*<0Xr3YL=6s,M,(I# M+8v>[ ]e'[ >TF&͡+WFW$$4 mmȎ(J?!;l_ة>0LE'bTjFl/ (O.׈Tb&3yHy@7%t( t5f,|(bJI m\$# }ǐ5"["IhozN@l(Yƒpka$,')%<2-Z8[ݞGnujZ[[]ZQãG 5HH|l[*$Gj)RLM2I-e"a͞pd $J9 endstream endobj 372 0 obj << /Length 2965 /Filter /FlateDecode >> stream xڥYY۸~[.ʛwrjw+eOoQ"9c:Ʃ@P.ÛH?>]/b*OE, #/׋A$ ޷4[w=փ]R.(*}iw-420=ia[O< uagQ24rʚ% uc84Cw0^Ì'lׇus]GGm4TnK|;4]?2a- Bu^UU&XղvR~i%Z{!3e74ܧBЭ`1Nm{M{ݑE(Cnj=hgpzѢ.3 %*ۻN624'"8}] fDU 2trww4zY"X-._`$a(`<81 ނA0ș_n$o ݾTQA).-2 >cbv7qA~E^XJzՄ4WNP|+Wʓ]A}XYR_)FH3O*m)?_=sGgAdaMsdcmscqe+'y ܊Ja1k\7LqזJsc[$: XvBXlpEWE AxL "ogqP4ڡZʙѽ(Ў,_=O2s't̰*ɱ I ^/?|HÆMhs3R>ٵYqt;V>>,ff,YA A{Rwxr+CrGå%Զ(:eWTe0'b[sy h@l44\Ǘ+C`hĤ²-8YԍuU `juAЛ<(:oɌLӢ,ljqXke.{Y| fa r5*hN7)@:85,#hiB /c*5hDpo0nkngN`D:$"pm_M#DgTlSJ!M#3b؈JIC($f\sDT*`s 4w(y!s֘%֢{6WB%I (3Ijb6T:AZ $vnCkۥ'e"v%d vV*w8=YdgG Ug j{S(9'Z}xL~?hʉ+Ё~V 4.0ҫN32<{}6ہ7O ޶yм0D! ]V=W+=`7\F\m"LԳ/H77܎M2LʌMl$xmQ599?U`Hk k3qd*%lJ,_On("Z%e C/ `YJDZ?x;lL[B~eA7=Fgqݮ1BTO#?}k2 aE {׮i9<غs-ki51FsGM&+ %9X숃R"WeKltd8ZȤ}b.tݾVhP~d!tJQB)C+| L{{ApZ ~ҍ^ҭM%Kyw)Gݯmk5ooTyh놝UuI#CE5XG:?H@ي M`'.Q"o(qm5Vo 8楁.qj^lw\2Wf1rdM1ӃW:8[`H,?#j+)=q7Mq@sa/B"XU00bY GoI:i'D/Ӱ̕(!pz. YE[>vk & B{u/GD.gHGט3|AtGnǢx1CėӘHu#(n;?=5rP&JJ1'2 ğ,r *;B2X&0"AD܂O2?-3hC&Z53 P7[i灔ZP ^528WV‚g?]PoK&|_Ƙ%/@ͦt u!> stream xڭX[4~?b YΝ>Qࠢ t@B->w4/q{bg+@UOgfyRqZ瀻ER$+kaX,vB+Wxt˅gw  jyrʃW'r\,hp$t}@'̫j*6SBJ @縰+DP@U჋dJ~RwRKH3~C܅왜,&'7B7OOGl eU#^H}ޣ qV9ReE: Ի aH$^]\JO1[T"5C@ ]ca^| 27C4ߧ,ظ[u9cQ4깟^2Ofo #H 8кjLtu bd2C[ޖ6(_^ iWq~$oyg;ߨY Wti2E%8Mx]U~2S{Nj{)`@|?,Wy+Wĭ_6HXT"Ԥ5t-,)-@ gUXrNͮ`[1*`UgwqUU|b织Ο` endstream endobj 367 0 obj << /Type /XObject /Subtype /Image /Width 325 /Height 329 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 396 0 R /Length 10146 /Filter /FlateDecode >> stream x tEagxΈB,&dqef -DTEp d@HK\^ tC4Mܹsײlٲe Pb@ϧE ]… ([,5kDEE8p~{@>ydee%塜J[GJKrܺ82f{mYcb6Ѳiw*ݩyw__}UՇMD(11ȑ#W\أ4Ô_nD]cB%{Μ93g<}4c:˹.]i5 ntel,TmFmΥի~II^vmjj*5/^$vŖ'ͤEpuCaO(mmĉt+訩- &XMuSfeU *NgT|\2!hBԄ}XzN=k7mCjwFmyy9~cK154ѣG)W7:΄*c[n7nܶm233O:EPk\Y4!@ =K{'b&ԕ6&/.H-&NκJjvRRuQɢ#>?K[ fVdR6n3;˗/_^lܹs322>3>_llW-VU~Ie5Oe1ޮ.# hۋ..e?+:GY~)-}gC{9sEB&nϪ*j(l:\L8߸qcΝm̕p5O:k1۫}d YmiGXs48nv)ο19995D Jo%h&59wD?>|>ॗ^Zv[4ηl_ll )d_*6Lқed[GVW[w^Y{v mC$f?#WA$V?umEEW7ͣʼnDtjj*qݶn[u8[l}i )Gު.ί֭AUj-"=f l32w;F $8M| u`eC_T1c033f]OAĐB?)PYv|qd4E.?xwS,JeɷAe.{gcYPͥ^:D:ufҢ]ݠ)??׮]Dnzz߿w}Ds.-[^bLr~"wV e1:$$$$ˍF?#!!<5hЀ{W%o!g3gL۞ܵk>%; ֵˊ|>ߐ\iZs]>ؙX:بX#Q 6duyewzU80y9E={ź;qC ?'qƫusHJUQ^fF/%怳kq?DS }3V%P6?v钎}Y|IQcz8r8lݲqĈ'cGuݻt/>˸x?d8}cȿdQܸ~VlZa%;կ͈!ǧ;[7Mڮ /;K&IPvhc>uwdNfHH0#4T rgajUv5jmJ?14wiP>:Rg-ߤIMRM)her_lY39lTKYm||ϝȗǿh~'G.}z޶Cç^¬ Ãc>34AFMP9ڵU)K@kqSGyNH}fWnV\[i|F `gzCEhc8 WۨZmK&K֙un֬?3[rg///%/t5ׯ[}r)_D- M\TBUϮ0ji~߳1ӧ.?ڕ ޵۷Mx'uqOŴPXϞٱz /UvX㜐qP;@b9 ?/=ʽr gajUηjQ֙g:4vڝdQ>jڒsPg(?|f,t~jTmd,4#*75Ԅ9It-9qg{㬬}=#ϝ3߽iEgz%#O}([R\@Of_`kC͢t)g˖ީ8pD'kǕ-<|ZjI;6ځs8SmRVҵFO2IflKUdl(^qQepg(uÙ0|bj5`@_TuUֳGg?JO:V W> O(u8=zmڰ.u9%m )@ʟy038׈IQ۵cƌpk c>ۡ=`#Ȋ%fg% >{8 ިV8i: #q59l:t&qniH8tG?rft6+r>ܺ9p c!g V AP=H8d3AyMBR+P)ooo=͊+=BC6O\oS;|};Pwܤ |(coݓJut88s:h{vA!@^cTrg?79oĬU pf)[H%Q8SԽ۴n"}.Wa_Ըq#>Ah&\&zS<SfLwmY8o\#}B@Np29ꡇ0jñ35?ofx@ % Azywdfgi߾M\d[{ȟ:M 83F!BGPi"ivm3Τݺ2@3=c!x q& gQ#&FN9Λ7;ܢhxai+0H_d~zbΆ9$$׷)}nT 8c'g A AU8* Oջs?9FG',!W<g6Q_78C49҅c׿_PP/oݲqĈ'cG^٤N(~I!H3F?)ܬbW|V)>w#_Ϝ *N%p< N.q.fL`kW.x{{3xل8+S~zxֵS;U)TKj]WWw2׭~Qل8+/~Mr9x~l<8{SLYѤA#ZN}?E#8 3\8dwWvx|;'=$${شa08 8^?o'|I!sOM0Ȟ%p~cO,p, ^TEµgg̮ 3nޒ6plgZg qb36wNFP+vm*Ϣ~}0?u#yR?%Y$S:X3Q041y${_|7b48;CؼY>>gncy;3 xsZT\HzAuغeԽM'E3sÆ H`¯{P ] 6mhQ83crc[|:H8;.q6ur``@@?& rΓ'EQ3_AFQ%3pΐ3g$W|!|p8CYv6HQ0T, 8) 3pF7j}İ!Aw3{&gqMD}!M6<|5k֬V`usė]E_/r!ΉW&dNfHH_!rOHWn">q4 9^(Lz.3]ga$F(i3`8,s|g((L83&;# ԨP988+=gD99i84Έa?qΈ!!s !)pg'xgD: p )`Znv03_Y. ! 18A8gX glA 8gDip gjњXN3sOeE?-1Yց3]>ΈgC3pƋ*8;p8g8g g ! 3p:ٸQ0j ]Q8g&F1t*/p6ΆtIǎ,EBB-FIQ.'I0S 07JYQ0|᭴uP˧ل Wgs<(b, gap ee8=pʭvu!`PәspP%12sjUQ~#Άq2'zl4t08v W}G/0z=:Qb# ]! N#b8c 3pF3p88C8g:H8# ́3`@բ\~!|/8C8Cp67Έg3Up8C8ukWwاú[X'J?v( -Iͳ.}MU'8+U+Nz΀X83M2sf ǧ;[7jT_ӭkiάGя63%ʕuVz^[(=?U`"qשjT9X]5++մiS* UXg7[Q٠Q0꽳]h_ETyN!B,ͩ,yz!`u^4zXrGaA>W(WtWB&C9=J=*mޥƶq! ZEg {QE)jK/xџ*Iw~*DLVGN/|s zpz%fgQ{A ot`h[;žnkM #1q m=#l8枔7!`hw^=# OOkC"!pƘm #8g g\}pts$Wΐpg8{Έgs(p6 Z!Ou:BŹ5Q`@9s !8gǵQ`pOAĶ@ sZgCDp&e@!`c(!X`qVC 8? gaBˀ<gCD(&B`'l(v`'l(v`FA8Cp!8gt3`@9pF 2 g3A{(UxQA8Cp !8g3`A[gD (r2nã`(Ah ȸ8{x e9gDP!(8#4d Cgƀ0H 8C!8g3p qF 2ΈA Ap } / 8g3g A8C~p6J JHBP (!`hI8CQp6DPGgp0'O3qM005g̠݄a/rMQzDP H}gG8>s^SAB;Š+JgGس+5<uxWoHW],_]U˫Y-ߐ538x~]{2m俼'6vREyMl{wkǎooۓ e_fz&͝d=|0{Ngv J !ly5rтyF@΍5bV:ƍ2nfgؙo~T* A}6m+6GĘKX YY&"_jE~}97O|6j!~jԼ(OXXOcU声9GGG0nl=e / a\,^HHkt-[E!jƶ5q/P9Tld#)-ULyNmc۞ڢĹV!\)+i/aXcO˖ޜc&VzB;}]}:~;\vۛeM\Ewx jtd&-`lȗ'{AtNh!C!вUd>qaRdx0}Sk\}DZLiRߟ&MhT+|ɔv^QXEDooe<)8V{%H:m?R}g۳ -ن4u|Md&[^!Roܸ!;C)bcjpӋZ|6֞uj,g O)W^LtmgiHHHLgmy .{ށ endstream endobj 396 0 obj << /Type /XObject /Subtype /Image /Width 325 /Height 329 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 189 /Filter /FlateDecode >> stream xA 0DURps TOX''LD8xn6muMDTj^DHk]4拧#S endstream endobj 369 0 obj << /Type /XObject /Subtype /Image /Width 326 /Height 337 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 397 0 R /Length 7947 /Filter /FlateDecode >> stream x TSw3sTZy* P֥V3H{:E W+*ʢ VdbP6C HBa 1 uCԙ~7.!&$9?w~ߛ[?1$)k+iO?t;wлn `$,iK&͛7oi￿quC$,6A"F׮]`"J:i! 6),,quu7-M*߼bDH$Wڤ▖< yYoh!|9s,Yd۶mQZ(CTHo@c<""ŋ BT֒Zꨐ*PAL%UQVLs 't(jxhjk5Ʋ?qM1K W\a]ҋ}M:ߎOH)Q6ڿ111r-}CR+Gk612WJP_1.ǃ?h'x 1s7ڒWx>Ʋ?y*5zMK.]|2{RPP0s9  s*sr0' ]HeCaÇٳfzoݺǏnPU/Q?gEiec#GnykEA5W$ o0KPAUqAABy7G/[[t~{D 1U!芔^wmek}vFŦN9tD)Q1[v}cj+axV^???z͜t_y2R\5<^`AåѨt;04ƅct{PE.#/ {i 47ߥ^A_Pt[œy΁mQL@; TB-,\BoϷmn4|p"ni#uCtc,psYo{`C1)qG|AKw3FԴ.͛7ݻǾK y]xxi yti7ԅ~qȘԄc'rEbiYQEuRXPYM6/8[8C;vJTwt4wԳ즢9lj0\^Ϛ^䣃9✃.T`sZh6P](qeIR <#-/fM:+ UV(ddANiZ\Ь;t&۲bڥrZmT^lY5ˎ~LS{xNsyOB61 qPcΣ=3N]G{,6\ŽշSl>+`W v+ڌMe׶a iYYEiMB%oP.k8_VY]Tt<7`U3zF%7ݕԴFݻ2og(U*!:;l'6C%P_}H)Ύ/Oc<:^ *W:Zɿ=$Ub.nJqMIv vg+.r2S=ƆBGzk]9wwwsvcECjliQ津MW.Xntm'ֳA/'' SWtYM-ጶmkbSwVosbC;lߡ*rWa4cB}ҟ"uLS:snr ?S|klK%7ȑgݷvZ;BOc&IAOR.c+UY]FMwEg[vMγ!ݠX=GTV:M#ձMjC%ҏ>=&Pԫ/ݸ㝛wW)[Rgo'*莎 6^:u&]m`ՌnBIUUЛ"ouRR )CXͫT7tl.TUIӓjBS^X'D*OIEߔH$B&l_U;EN)9'D<;WkfQk?rN/H1J]$_τ_DGCӋޛlÏҬP?о~HFʹ=|i/J2{ ZNw0,0Y"*:Jg}T[R7x)CItI:&#yh(a&309ڹr >LaܩtGX6CUG^&$|= µ:|{nn˫|v'%PfCaڵdq?I~M ][vd9jZmi&jg\O*ڨKӨ獩w4uUIh]P@A>I6%u|&%&<xXWirbLҜG.蔔VFsto>z!8Xv43lsD^( ͖ׯ_~A v`~R`V-}eQ٬#\uR"̽n0PSSTv^P6al@!3|9_Ɵ5$$NI0 F#!!h$$$`t-,,vlJNwpƕT<v|v_yF.nbc>6yYWWUPJ?n8A$22礒 fǎp_jE>XTH%wcWsE3fL4?7Ӟ~/66l8nѯ8%0er3IC55(MUrĉR&,t ^.'82!A^^_e23YYMf sz@^}gF?#O=]W+LC] Wh~X֔6g{֨Ǐ!>  Fs2ih_5s}Mvy-G8`to׶m O|=OqqW]u5}]u^u6鵦ܣ>3 F6Z.[[W?8}{Eyݱ>p=ݛ O(++{+.Ғ_mgΜ^VZ܏ѳ_e'lg~a2iFBldăF#!WHH0F#!h$$$4 F&I'h,h=ƏT06 ;f0]1{Oh!a@S~sȏ6a400F/\0&#`4btrb̠>yŊTuVL2s=d$IiiiAgϞ&goܸdz}{677ܹޒJjzժUlsε?^P,_G#1ۛLFFFXXgtpp0/))ٸq#e<==[ZZ?O{CCFbtaa](nݺ:yu׮]c ׮]+i»w` Fwܹ~wZyxxFs޾}{zP>2s_ptA@H gtqqqtt4_z5uֲe( k~a"|}}!V\ye=-ZDt}ElZU*UBB00p`4Xi4d0a400xЌ}050FhLۺ8TѫVzl2۷mYz<9IiT&hL &UѨ---a40`lW3)VV06zJϭ>Pw+>ԍƷW 00a04Vj< Fdg ll-ZX[S 0iI/)p8v0ӽ4~ʨSL?R`4&mtaAΜ9|ۏ>\hLh.ʝ>E I]^&W}t 0imlNqpkl `4F`4Fa400 0  hu`~:yQ0:`-hLT.0ӽ4šcHO<hQq-O>X.·.N)0i--'pKKK I&&LRB0i33 쬭ҫ03F`F&hhFh`4F`4Fa4001t6u{[Q7b䌶رgyG8jRhLt」\WZTDO=$nkiga4Fo}䫤S8̛ 0-XFcnO8\g40Ez?)gN}4fs_00  h hh0X1Y>u?:Cj0F0zN?iS0F6:2bk-Q)_^&Ѹ&m/nzwll]]OhL & Ka3fLSk(jR06zb(06r lmm9ٙ060F`4F`40F00  F<FhRx^7X10;6eRh`FcF_yW3bzmiqF`W  h hFh`4F?Ph<Yft_ h4_}4f`tfƱeoPP| jR4kfr {=?F`FuvrԨa4f`&O?Eךs0ӽ.Fch4000  h 聀g u5F`Fl q1V+'=c.˶ 0'NfhcNI>8F`F4YZZhL,6s_.NW.΢ y\u_j00  h hxx(x^7Xa4FkWܬ&f9hLCժz$gUwC|ĉ00zw z  1ysbf S7g} x'vh>R  h hFh`4F`s@x 0Z.I,,,p /<3n8| \uh`4F`4Fh`ƿF`4F`40F00  h}^7k4{궶6z]v`777rىϷuuq>lfƍѫVzl2۷mYz`hF;::`K,JpZ-|7i%11ݻz͗.]ZWWGMJo{Сn1z$)SQ. Ѿ llxzzl!9Dz_WTTPfϞ=ܻYfŋb Ԫzhԍ0!G_z'wttv[xΝyQյ)3w۷os:;;S楗^u (b͓ h殺gS`4C3իWS8::-dKg;88X{FZn'c m۶d2,Znnwz-TZ׷-]tF+F GGGzݺu+i;~ 34 h `4HNTѼ!8Z`T:;L i{/ `=A äI8dž6_qΚ9#7$ff۟&ЎbF`0'egƍslh Xcf; yFH⢼{lFN>qD̐' /z*FrBn᎙ 03}nmmH'02b)U!ILI>8{4&`4FGEL\E2[zL0Zѐ7n?#ϔcÈ_W++a+q?F36+ϖϝB8d La8p_5ZOap<0F0F' wPS endstream endobj 397 0 obj << /Type /XObject /Subtype /Image /Width 326 /Height 337 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 192 /Filter /FlateDecode >> stream xA 0DUN8VETO ,$dj'/^xe,qiJ%ȐU0*B^8 .u endstream endobj 408 0 obj << /Length 2319 /Filter /FlateDecode >> stream xڅX͗۸ _C#7È>S6mzmAcіYrf/ʲ4/obA~ox;7zuMffwNe)sb/Hb$I0lfUҰt$: )X1B]ho޼OʍUWzh+*Uc9zΣ>cۇ4͢n7j.؏~h5I4u-UAT]abji4CRF< ,)KLt5,_AJ N2*s>nvB(zPTwmx '^g?GYpWZϾ_=mygeKg::ڿHh(v‰2)Ȩ WU@j䳡&c?:?1,zBK2ٯ=K( wc'^mxcaԁN}Na#$]*˻(U݄E=G׮'R\H\T.|V I1q[8AUkF'*O2Zqu@T*apmp ';tGt_@& 0a.aqyC? h.Mz i Wf ! :&\fG 59ܸ||'{yAvT&(OQxw#=|NĂ$= /G`HHBDō3e Jmk=#oпV!"dbffY}^kZm(tdnQLgփX_n'`m.)y@b׍*8qg K*q k}Bb LZP`":CG̴,RD- 2e0iDpגL(Q-^/L xQTWx~ ke*s #ijVmf!֟v5L*$A2ݐծ;)ask\r$98f"F{@ w9 Z{M| g]/xvwgZ{̳/!onx\z eF_`\π2n\-w!h_=SFh@yzxeA]<-`B籑BQFwdjN 5y! {Z0˶4/U%lOX?v9M/>))xX?=;>a\9M_&DH( 8'"tt|VQfe|fQ]x%LhE66GW]+ d!W;O{J\ڛex]faG:9rրtPQ{zS5PPq榥f C)2aލGL5x&p3UEV5sx{{*=hdLp@ Lpg5QqtɶAJH))\kYtM=6Z0*C׾>"6$y%XF=;OŁAvY^-Zzgbч(=24]CUn2"`K6:*B;#:wT`Љ-uy$NFNcp+ذNJ5Z[(~g&__sp`ƞ߃r㗦%Я\:#Rs@̃Tk"JfOBTqp=g$?=Fy[F!Z`]."ˎ!J]G%P.A-ҫ"H枧֪3uFwU,/TO{~dc'w!!{Ch3Wyxaɋm!|Enœ3f-Ҁүg3@Pzf[?I vƌyKMR)8sy_K:nr0ٲ@>} *3^iLN> stream x|Eë( UBB 5APQ :RR({ -@7 ptDQ}ݽ%~&Ǐ2eJv#ld7Šc Ɗxl~@Jbb7xJ3\//Zuݻw6mZH~@*m4DEE=z4777===###333++B~HG.ʠwQ>!5G_1{*Roش%)%ƍ["Dd-\Pn@{K..^2謵~ҽ7~+f'A}ݤ}Ji`w.جCꌳ[]jDn߾}D=߼{v8x8!%#=Bjօ) u(bwBnnԩS999'O } ه(O Г' ]Ѡ=|ŁmOr#-{5;mjS+9 νPA{[+ܺu Ν[n:ev@ڰaC?ٳ=vRf%%M@䢛8p`߾}?.XƘ5#2D7?:;xB#j<^e 9Nm~5o9VnyܬAѐ5|})~SOҶCϜ>oɂuk–~ҵ,]7wq3PC+ܦpH>zh˖-'LN>r?2(:9Qo sye3|U]ߘy޴#rϡ#$EM>q4n2a_&VM'OJ8#$''9 hJJGTn| k3<-+-))/B^EY˗.#p:iYa'"uA5+ WOiQ1RrR^tJ\Bfd݇fnnĉr1^r;!..N3J*7Έ ܦ'ͮPv՜uѷr9ߓq5p"EgG`s6mfGAv~#_U+ 7|Z%ݥr7bϧ0s^¥VMǏG~;v숈Xbit:kj.RJZ^o˧Aސ'C/rھY=%ҳ=ڗ}=| ԩSA4z~AS,ΟvYɑDtw!;?oȼ 1)6uٕ<ԻOLKvr$#C{#sy 0XQ.zMaD˽?Dll| eVJb|De^F9Ŀ%B)y9d 7oLLJڼC/\xa[''=,(6vqu֬Y6?lذa͛ҥKQ2AU!--M177o_|!-[1d7ŐNO#J3[KR<ň]FƟ,D10d7g`PZtW.RUj_μQ*trLQę(LQq(8SqVss/eFJŲ3 7j+K _9g˗J#Y"^ю ǚQyUL䯬'yU8kJ$%i٢y9N"ka׮C;aLP9Y7j|Ţ6Gg9.C..\ 7b (|֭[G/eyc+ʷo]뻴jH]WzG֫WLOzꩊ)ɟ .{٘ YM̝USWr/`ʕ+VCq8;W_vO z% D|M`?J;լ;oѼY8k֯Q}g8;:lTܳGЍ܋ojʱE*TP;99FD0% 0SG/EsgbE=8KE5">g(j~>ymz`~}DZnճ{& A"V}O@og^Ζ[yt fC;yثYFI2|&YWz+JGzj&fȲ/IYYUQ>|vV肱?O>H7vS/eWR'M0 @ΛSG7{^@$wz7s`d_id%WUp֬__ {g}YWpWLp6-;wlп/NHcpi %Ɍ_zvPt#_swW0*]30SpV{r4A11ggEY}Vh'8sݳ6%\V-1Qcq)=l?]ڠ[FժUqE83T J樑#my6q8koQYa:ΆYWp=wE߇ TIFURZPONQU}+ >Pjذ1K<ÔGlW!߿/壎C"L {ڵj>ȷ<&ЯKq5sAQTé(w 7w;uq֬pt FͳHG>t)\u@YՓP P; 8n {f:MV4Jxz(٦(8SE)8#EQ+ gPEqҁ3oERq(ʆp^t-F*TXy^7h4mM2YB5q6nosq=gM*VX 糧c,L968zRhZK3lN)%LG3UX;u.(ZaSuR3q d+ɰݿMթq֙f8gt 4:iNgSgL ^ԃiYgu>`ʕ3э7c:Kl#}lsɢ@SpV^؃cAsc]Ci-MT>MgW)<nYqEHIGQLXϥEY #?ܳ{R8_ɽRmq}ٲeXQ.\P5{6 #׮]ke{g۰"γgޭG!Eٔ5e=8haDV bS1Q֌3Ԥq#CQ/3f].u(qYjW b8Z̳G!' F#l>:e$XF{)3!`'Emfy 'Y_O:q3q&q&ę7lVp..*qΖ<(utBq(L)8K&4pC߶mJȍog*AEd5..VuS6|{Gg3i1s ts1\<[FHƷ|֭[Gة^ t l'JfrA Y"o;99%%{馤*(}Ɍ8R,06+*s֭[Eۚ0yƷ{膋@ȲŢU͝3ӓ5j WhOR;K*gY30߹c}=w޼iW4EH8I&1Ν 8})N|[8?ګݻ>i]Y[#|vVy~']ӽq.n28F8ӳpqΦLOPBjUC?xc1Px玭baq.8l#<̯S%E% =KGz^G+U YM'fDs4# ~ iC,r_x͚/(p􈁙5 3-!2[ę3q(L)8SE)~p6S3LQLO\5 LQ\YjyRpV>.5^g8[3Əg3-z{ҤI[afܱ J;3e8ϝ;{g޶bŊ@_ٳ*U$=`޽{%&&"2l0QH Y3x; M6 cǎR:>VO>oO1 =w.#8S_)F9p LΞ~>}?~)b˜$mdܹsÆ \RK.ŌsQ,$>*Tm@FHW笠U. 3 j;zu/X\4#e$E[Fb8@㢝:\YrXd 77 ܄qN'rRM6]bM4F|5n1g' OԏJEAU`vf}43( \H`NtB D"*_* ^V-EIy,%FQ#ǵqɍE"{0\-z4a_+.uySqN.8_& ራKjSS,q6,)^0 @ɚ NqLMxC/Y Wlk:(Ύң)7G6q74MaIGnU8{ xD%%fe$hy6F͚VqZFBSę8g8g.3q&ę8g8gLg;^0T-e8oe˖ڵkMoQ)f%8 ]S6sCضm>2ϛشd'Jp(l y~ 3_ؓHM$>:t@ؽ޽{Ϙ1jժW $Δ]\U{"r̙# (SLAݺ0jdɒ۷o#RB@L%ngϞ ?0@ &'OD\X&tw q{D0 eƍ⢤h=L As>}:G>Zb,Ef͚`8G@>}D\n'ʮp.q;v@w#Çr#`TH۶mK/\PPv3q+K_vv6{8߽{WΜ9|1|N;v qd!KVTZa'8g.#2LgL)L3Em`uڳ 6Q B!jϞ1R2^0b5swqJ:1ؓv88[:zTA$߷s'/Eɞ=nD`^\Xv8CGϷ!5蘑PԐTbŊWȵCKp qFę88!! ԃ^zb>.{v*rqq*Cw/bݛk]'LI:ף{W cjzQ<ٷ lsg_FGEę8g8|qޗ|1e"s=E,"Wl읉3U p3_ER.n~eO $GGw;oQl>lʜkwEVHr[8g28mȽqWϦ堳FdBF+b WW8ȊO'f]r}ɇB?8gs/#u?B_>HG'-DAj;`"D}/7'"~nq ½OsE< 6*p 8CWn~6ya("S."J5n|!`8STaoF Dޞ\zέ{_b‹)9o[a{O|G͇YsϾtΰ+3EY2>f8S6sε;? 8+^0(.*>3q&ę8g8gLgL)L3q&փz(uEgĹ6@u9'0҇Mx[n~Br]B //Yh+s);[ ԓpF'3x+5S1;^AMu+dbBs }>228ۡ{sz-5]vW7ϾzkuĹ{hղE}zR M}d{YqY#9;@;J8/vȀ3Cd08s U8%gE"2uIX_F s xK囷}D3 VB qJ'-ᣯCV4ӂ?$a63sJ,#. 3e8/ٴK=QWi~*D6쉲-TLp2tK8SsFM7Κf1FΣg,osr/Aq}L/q.8 Eg#;,٦l|E)l8B8S67OGAYs(Ԉ8Sq&E3EgLQę4zdN.(;m F8Sl^0b5swqC 5`ɅeV1cT~";y)A'[MmQƿKXM/OgagM/ę8!6Clۚ^08ζTL{Sz͛K7֤5`qϹ3Pę8g\ 5<|h?+W~Rv8c"*oRZ_jIMJM^qm YXp {ٳfp~'xByGGzG:`@?[qvsVQ L/T 5iH,1GΚK0QF6o 3H?OW$fǸ qmۆ3zMM>S-3E8ΫV,lQ}8k.%ʻծmժUAׄjժ6l`QR=d77WVmղE}zngH8S63VfF/{g.*8gL)LgL)LO%8S.xCXLQV`Hpۂ2(;Yg#^0LqxAgl^05n_JZOg=㬳/8UEK7tA-CgmwoYe?8ۄ Muw,sm 8Y嗑0XI[a$tE\e$q&ę8 gL3q3q&q&ę0F/vpMgzs^0(Ź=XLQsqy{,BLgs\\ 8S8+[aA( mg>l*oGI*$ę8Sę8gL)L3E3qML/k l3`PLאVA^05SH+ i^05Usz( u=O(􂡮8S63`1(™^0 L͝3q(L)8Sq&E3EY!AY@=k`/zR8ϝ;ʘob_oW8ۄ /j*1|Sg ֽ`~)US1QM]\5o.݋kղE}zs0/jVHe$E3EgLQę3q(L)jq *8 Eq1޽f͜޻+Psrĥ_|S1Q"7y8o2DP^‚VPŏ+-k}~zjB֭7U4rQoa#[yCG;gٰ S$(YsuzKҴ}Vsg|=^Do'tajZ8=tqФnBxY67_ ]p7~G>{8TIgaՖ._bDp3dMo/\42rIZs1# J}MF+6Q4dn ~#1JW4mV@[.F-j3[EC z+LβEb)^5ڴi}[H4z,IӔrZ\D0¨[J_(}+B_x>K{QUXշ¦Nv> stream xA 0DURps TOX''LD8xn6muMDTj^DHk]4拧#S endstream endobj 390 0 obj << /Type /XObject /Subtype /Image /Width 326 /Height 337 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 412 0 R /Length 9495 /Filter /FlateDecode >> stream x TSw3sZmLk(RֺbES=ZfXA me_U,EE@(KvEkmBI~]p~>@!Iܹs]zR%mI^Zuo+}ݭ[n޼yŐ* &Hdf4[D~5@j+LW%;;?P@R>{]]]^^P(,POHܦ&\@? y7ڴFӧ/X`˖-A (EZIYаdxbUUT*&kkkkJځvC]f7_w.I9#A=uu$/)̦W\a._醟߸qc}݈rIU[EJ"M3Õ=$$Dgh+vEsf.n-rBΏF\bKbpKv`}:k .]te .w%++k[[qr2T";+̤gΡh쑑[ZZڔ)S.\xߔoiMvYsZ*xe+ .k%_-'o>kP('> TM >< GOw/j:g_ :曘S2ό;u̎=w~5SmMTWWO6¢_vSWr wM/-OX˹)3:]7sW[berm\3;OD]= f2R=sW[H~IIvRBviS[s>][nq|.8kX {njk*[QԤZoi6?,>?[e!)(?5.!䇸$AA}K'.5=Ye0x~dviIzE!Etl}HBRz>ݾqIAa ӹSg H7j$ӳ]{KMlY'\KJJ=0-Le=O5vWԉN ՗Hm\tvX+5^ȵ\6 0߸+0$>hڱL8tyNIE4%(:#yamÕoHm۶b['u-6fŪƓ,q.:͋4ҺZE,..]]txqlxjd:i1-epx$?taU!qVu=s؝$.lz+g*kbSw?K;haPv|> z.\Z&&;D2h P*Q$ EbBqגI˔*)bg$=ItsTrE}D:x{=z-I"t_(A>Oi%5}V^02foq**$7bXNAh'QQQ111dt\\Vto:r;-`w44wS@֞nTUU)/65q?wq RgpMM՚1ً +Z"{QRZDt\$*T -ʕh@eeT1-%}axDQ#zD˹$$$}Jt@5$$N10 F#!!h$$$`t;1Ԅ舉'>~&Ƭ{|W Fknt5|9a奧)(+SO=34XF|pV,={x33I}ɓ9zh">\G}u3a~6Aw͕P$yIT+*8~9}2|˗WW'? F;;;ө ))ח?,.((Qwyi&m,O4a`VOOO6qx"[)WGijKBCCI\j84<###66vԩ+(ӧOz T@mtvvΝ;)Xv-5w`'l%xJ$vڧG?޽{Uwiٳ)9s;wyh琝5Ѹ)=OAdd71M]7nܸ_~W ]ׯgq>1PKcgtwOkܳZsg4=ݝO4߿a~~>_D\\\xxʵA`^Zx1n4A7ij{Mf4UuciO!;k4og?wK9qDLLLnӧivrr} rXb˗UNܹs馌.*:ލ]4Fd(ݝu-[+zjҥK'c48dmiiٯm 7,MC| /\@MY7'cmmm9v1nݪ0VBM駟ҐӽwС \E0zh 1z7OOK@10F/5'-uh`4F`4Fc4~ahђr K cV3,++ht+\6F-׬^ injyMTGAI` @9r\VKA~ԨQ0 жYp@^s \n4@/L fw% lffjdd8wR NG_Sq5@觟~Ytر06L߿/5FFgg>}hth>J4M N]\OrYBxhth##Cqc'Ns;@of 000  h h<FcF萃FFs>F?|Ωt?0'Ota4:mt~n /_4Xfht)ѣFQFhthcQaDht䤣f&5%9FF&hhFh`4F`4Fa40!9cx/OFf&,+s0?߇}4/{/@yчŌ;Kl FFHF]R,δo--h>0F`4F`40F00  Ѡhcc2~bua4:a'N07x<@ -j)..ʇѸ:moY7a3< fXfht#G `[oMc k+)5Hn N*"<_7Օs߶?dZ2@/L  hhFh`4FO%0Ztzi4 h'Zk#LMXa41 N|/㖽.fBzmjyYV06O$QVzuttkALIIɭ[~Wͳ,_:uњ5k[ZZ\IԽHW.g^/~,ظq#y=͛w}ͳ$$$DM6(tҪU  iӦN2"?7K׍677w,X iT{ʕl%Kh)::nkk[SSCYREaaa ׮]۴iUhR͛T[z}Biܱcچ={޻Ν;WUUlٲGr ofJKKcco#Vl޼9//yF/Lk͍.HАM)V^^^+?1ӄLJݻw[===ŋl\3ٙjEARR/_w/ yw;^jJRR}OSNX]E9>}իWmllؤ" fzM?̏bU}uݻ4Q`eeh:{l fΜy~%tk{fggܹk /ճ8::J$сeϏSN4~}"##8@<04pBLOegtwOkP7nܸ_~W)TmCh׳ yd9s3ο'X&w 388dk3gh2#oO{~|>??_ W)TmCh xb 5\lR|)'N}8}4 NNN F[l)//`ܹtJnTKOipTnggW[[B_[[}Su 7,M *+V|JjB94d(MjUXXxjͺ/T>kkkΡduV&=υ\]]!O?!U{СCAAAp FM`4F4h0UR֮ikʥCj54]lH *YՁFkh41j,m0ZEgH `t_&&NPzx؍ U(KH `=c4z3F>>jrrVO3jNN:nc~ne3j&mNLSkehn'Q]7:atΩtK s6hth?=/˔Yz8 Y&Fh<  h hFh`4F?>T ]> ?uy0GkccS| N]%)eOxǬ;+#p@633=ztJr"@?Hsi00fԨQ06:#=4M N=҂}{e52?7 Fn000  h ~|9c< F`h16?e['>6:"\VKATd!>@?fu5ѣGhO7h}Vhtࠀ1c^+)7c_+E(z`#^|E3SJ'N}4R  h hFh`4F`9cY< Fy`hsgFhO=>@of0  ի?3?;~:[yYfQ`eeh:{l fΜy~%SNu BŤ$Sgh~->-k`^`!Μ9ɬ[yWWppuw7W|2@޲eKyy9sΥ[Vguҥ쓱xUֶh|{annN@_ hFhZotLDp@k itz=HHHؽ0FBfԃKX /1X:p<1L~+qL_;cv@ccS:/ѱ奧z)\c"C 3}*IiܜA4z>Y7F2zhL;0+#pZrA~=ӿ433Ô!6F#u}Vgin>m(&}}}a4JZI2kzzL0ty= {;AJQa.:3SYpI nzck<#^|E3SJ'N}>҂}{e52?7kMGAֆ,_lHEgZþJtz2Z&)> stream xA 0DUN8VETO ,$dj'/^xe,qiJ%ȐU0*B^8 .u endstream endobj 417 0 obj << /Length 594 /Filter /FlateDecode >> stream xڕS +8bf`=FF[ܪV&5FI6RUE73h(Z-?SĐ.F%U5? RV cS3Z/vΚD9DЊV 71%9ͮ\^(E _u\/}( wHH(F-q4Y^H,Tu&+4n_hl8ӛf}9S[n3;$}KUAPI:S@߁iv.{0e匓RT0u=n{ HyRQ2VΞކ3L¹E&榆F=u -b 1 |)0`%5ԍ,g80BLտgK¥@䤪d2J?/QLJn/YH./~?9J?c3N뜕Xsѵpffp Ln:@wRgX/10{_,)ShNcѸbuNƶuo僅um{Bq A*ܧojM endstream endobj 401 0 obj << /Type /XObject /Subtype /Image /Width 303 /Height 333 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 419 0 R /Length 12663 /Filter /FlateDecode >> stream x \U, 3T (kYj{|, =J̌-WRqA1 AYAD>Qk>r3n̅y}_p3=93gTwsݻwC@@e ʈ5""ܸqWc_n߾} (#tD'?pMxڵl/X#zR~'&D@@}`#qA"ᩁS‚FEcffg,u._|̙􌿂4Srss^[NNkk׮ٳg/Y$221PdҥHmKp} .ٳg1P:m};f\JKʇX.+j$FEE}6lHMMϿl Hh Ǐ=}U Ν}蛊(̋\W7`վ,Wھ }!Bsh`,A!^07{n2 oz۶mKJJ&jHQ7ڃu3caa!5RSn:<܁`cѫrwZ2$ɜ;"$H\@mFhڃdaZ(}\ϸ*A"78 4/75n{jC5# ?@npGys~Wb0$$x ;:?dDxqC`,zs1$Cm H((/5`Ar^~~NrQWPF!3L2~T%Qܿ?A,ܺu:n111(xv·6rj_JH.}}hOaYg{KQޜ>7}ev?߉|hû_ oCA9 7U/ |K.Q;EcZZUDmnyNݻww5tР 6#H^4 EnW /RδM1pxӂBȣqE0Ψ># qqq;ڽ{7QpQJM6{>CBB–-[ȝ;wرc۶mۍRk2Dxnp 61\~>RCߓo  l''X0R<0Ap.D@@(PB#H0XiٺU# a0`# 0XGqk܈<==xU wwwk<|lqZ\h>c^xތwe43'fkkC="eLo]eIM*VFGIN:Km6tusk3r%WpA?4|PHil~m۶7jۢy]b=w60xN>diX~>OO6GӫU{t>S"(d9ԪUKY"mS?JԺ V^ ҽR9e=Ь7ܧѸCj2Faj'Uèv5j])T0vrٽk;Ӓ+C;99ҟx j4)ˆ`>)E|6cbY$j6c,ڵjOۃ?>D%|wYA]5_R(S}6uմQ;oܮ] ESn\QP^:rĻV-/@/+@Nk<TVgM&Ke[XjUj֬a!UTQv-.s:o:ENJE-a-[RGTK =򃩓dtvv.ϷvJ)j3?Qק&A*-85'Of 8ItTVf5dz @?Jfq?!R0 [F˨Q#]4][߼a:#yM?ybyWIKȜLo甶_Sm=ȟ.'5|XHAzX=MaT aԾcϞ'Oap̉$_ҩ@ӒtSV$I O{V1Ԍ+F--/w,S+\FuPG3:Hu5;+] ң}G&sS*Tj0 >VXe:Huڅ8P졍M裼*WRk+aZ00'XbþTWhr>ޭT7F<~ؓ\\dFM<>P]6V_FP:1`@ɺq~ZTV;%m A=s% 8T `,E5&,rG* 0u83OUTX6`EgK# 0F֒CVaL=#`,)00 a\0[F ]\9hl+!u`߰ݹ̾h0-_#X(: (}dZay^)QSJULmnNП˫)6S[RXiO?-59+/ѣK ACbck\4 m`hğ);+]rBp0Q*ͭk.!j3rXn936ƑS2sƩ]VD=͑Ml9Y02 FhlMaRmU8SۓOV="KԞr{_jOBL%R+,4#?:LIgggvM|gFTn0*V3m2s0p>KǍ!6K#7;{KWzMB͛+#{C} pxN&*V3TLbqs/8,>?~ᇕ fs^9lc(0Z21? >1Aʡ ^SJULmn[ߥ~=*GfLbqs=۶m͆6@*}_YC=glɢn m5r8XGyѸ2#Lhs?uDG1JetEqheK+!79V!G u_ҹd0B҅p̚z"l`]s (v/+z6h &AY'%rFaԿ+{^gĖM;P Ǭn kҷhƍB*0s(~dS%XCd ǬigbS'tfzZ8Yf#W|v]Ç \8fTjl\eatEqV-."̅cԣ}tHHb0`0`#`Ye8/|Eq^48PFFF 0salfg 6`:+/?U<rke)tՆ\lzTz3e۽/V "tǾե+N&gϜҐQ0>#n6pww۾uyPrNw-dGiT".r{!}._zy6~~ƴwm?u2Tk"e3gMjʞ0#^aCbURKhˎR6Tj}ݰOzv}BS+#`17'r*ʵy&M>CLK#6k ʎR6؊Oœer>f$ȕSCv،4 D Fey F'd= '(nuÝ19!s?g E,*ʵy&MvD-g䠆m ߧޅ>緿Rʨc{uj01ǓdT5`Tcl2:%2:ay}w[+TRV#Mkr Da$N;U\R'VcF>uB8j,d װ3(.\Z(.]/WS*?մ W}\̉ vPRrFUIU9M3;n~mX55jP*薽oGٙq"-#' CzЛ0B*jhy-P7vmByHr|#=. J&jD*QLV*Eb=>Pv^)!TjJu~3j*{aZav3 XE\/Tê=rR!BC_AQhP6͐R/,bre]-F%A%PbEs$^&oI)F5_m e狭R9} M=+=JCP7F(T4(R/6Q(;5er|O/W,%78g!o:[zػ899Ϩ vD^EoL钅tKA(Lnz)rGM Bzѡ1 ў'^˛AA-`0# 0F"PѼ+ Eq+0# 0,qn5tq栁km@9%-Ma¸|"OOc8̏?Ԑ02.QVaNFo69Efնr mzFl~!TjkXGn,enW BM[Hū}zHׁ I99P1A!0:r)BbDz#Lo0:r Pرl*[FGQW  };]JBA=0`0a0a0`0`#<_{>֝bYK|t8%H FieXH0[BRl2i恣GJieRe *wFùBRNp64sTrZ២pkBuS)ʭҖUeej$ ɤ ʤ0* M0* K maɊPbEsɤ5!20 BRl2&UJ^-a t53`0F3 K:d̵J\vZԕ8H9 -}FXL[+::4*-`-(^{ A,ܴۖCp (d0 Fhp|EquxP0:Sdz!ŵaa֚LEq*\[#`48wt(#}h#d5dbIdzMeq`qlzoDS rŵ2qX }m"F$|P}$70S9j2)=[0trrS iyTL XM+ٶMkN"ŅO/#`v3:A2!Ӹ}o۶5(8tp#>MCmbڐNF# # 0F`yA@Q0ƒhcah0:6s # 0҂—(`62Xެ`c[5wlF1Mx͜a9VWd۲'<+0M~˖06m2ZWQ2 H W&Fg#wlUWG6|b)K,'㰲 #Wkh{cG[hEEq!Ϧ֭Û <+0>gիWhEEq!l;SR%XNaeƈZ^ݥKXitS0*qXYys$)lºu^;|qattq,XgT0$޽z?qattq0诫wS׬Z ӕF0#`0F`0ZF(uk$'^~s sVf tә?~7oOI6hl4 jvo1=]Vf9Y9LoKqbX[7oPXR۴-b}rH:6zQⶆ@#_tӆ^䍢9M>@~6/_īW.S FFbuiFӞϝeM-3O`ΞEcڰ5 uH +׮>2NeОGg:y$ÊȞÜH#oGfN$Rp>gc"ũj 0Ff^Lcg[nLg7n\@ORvMaHM!yԶ{1ƯH3giטBӉO6ǀ0F`#*?`V0&'uvvf 4[0rHQ\h%3yO OftZ-##`,) h>y՝c)+)-q>=;\Nj>(+)-qv=`O'Ns xuatEqe>l 91A= <+>Mu Eqi>T`l׊=i ߼ť~nNhF;ˌ #a(01FKŅ0Yf0ψA] mFONJJ*iEj޼9hZ0ȁIcx='''tR===LKKcΝ͚5>}zJd7~~~tH6m.^ȷΜ9Euԉwf -[dSCI %֭+0BO(۱e\pa߾}YhbdIy0ùg`Sm$ Eq{H7%%"oFpp0Kd)uff  #lm۶N:Qׯuȶ={VBN4'~…VZyzzn:??0FMݻGoN"+E܌!55x0bh0"F#`D0"F`0":(nE*%Ĺ c9oBQ\rl!0aD(έmL֛gjl  &MմPB<6fYJ}*[ F(.sQ3;Hcx|6"TDgkq(uKX˖ 7~gei ֖5Ft%4V1==.Ԏ;Eن!ɥ ߼I S;!OǍקO^{M~,eFPZ5iP^!z0vhjkq![ڵ/]TVk׮D*ɓ7oi&8U׮]ݛ6mڮ]ӧO((7Q耑Jvkx>7d/0.1::G X|9q͚5,.︋e0AK`8p (a駟X\(NԡCJ`xm>uG=S姸`fø~_2e,Q(NO ,X0Fh9:uO8"Q(NE=JjO}||>C(MFA#a8`DP:# 0F`D 0,701adӛAcba 0F#`0F#`6UW㏦5o?h3cTh7o0EqѯUӦP0l/ZFm(mM5W߶5B;FÆnnwFn5EHfͼjb{vch&Rqa3(g^`*NcXgu){vww7S;iVlNsYԔnj9+UDžZWl0Fŵa?_aZ[Fj֬ap*U233YcbG-\0kTfh]}cXaDQاURg EYM ߼n;-[T[0F=+ ƞ=Sũ7j7*^%ozZ2cJRZWl0g-T'RuBm7سbjǛIۢy\9Kafh]q>#1u`62Xެ`# # VӉ8H4Yh` F a0# q`0H"``0S\ V&};tN QG0`6baZ:fkWHMb3gOTV"&4W.gVfI E=sjڵoܨMq_OPlҗ>Z#]4ͻj0CVf!/E͟WKWXkګp,Z8+=5xe/*[˨0t$<57U17'ZmׄJTjj_udNdk ~ NmS.M-J}o0JITsSqj׮ݪՋaCYp%n(U=YWy/>kۦt C6WYWzM4QI_7w:X}bq";jn Lh |(٩?QxDn)E uKkuimϨLR^ݙdJ'\_@,[ep'Z~7OkՒ# ۾u3k7jHhrj2ߥKj峴B$;wNgg_jgp5jm_F#B;|V NNDF̦oKa's-QDg`zx7 endstream endobj 419 0 obj << /Type /XObject /Subtype /Image /Width 303 /Height 333 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 184 /Filter /FlateDecode >> stream x D_ tI*,z8P 0p4)%lDV[[ːc(N%&)0a {ܫ j`'$ endstream endobj 402 0 obj << /Type /XObject /Subtype /Image /Width 616 /Height 381 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 420 0 R /Length 9733 /Filter /FlateDecode >> stream xyt{>Y%[J B@1vqp\0(("H4&[HBLHȂFHI:$\F1xNAtW7}3VkKuQ_m2ٳgo?=IDɉ׿~G~'@G(Y8J"[5mooH %E%R2^W_}whCTJ4jCڪ9K~~o݆ ȷ25;; G(** _ȑ#+r$J+iC*c44_}QFM4i…)mȀ|+#KHXz3gjjjVkmmd:)d]NdV~mh=A7URy`/P+WOeێJK'e@rӪUpqFKFn\-vY}mUM蜦lsSю?VvtQ>zyr; FlUzv{$mP)}._L^^ވᡣn :.P Śq谌5vL }useggu]?9;_\\,2֌8ܶfߡ¼uqMqy.w:oqˊ j.|mK-,ۗyɣM6&f2'5q^^fy(L3gטyh)ҶOu`[l|Xͅ;;[lQxbI /FnݺuʰtSk1]-U5oɴ,4tCLII2fɼ9M-FR5OٯH/6->75{]ku` gps! SDFF6/ZzŚ7lL[yg杯mz+7%ٗeȈ(ͳgS1>::_~QnɜmOFLJ\ruIEے+͊ͭs;M1&kq7 ٶvjϕB^ܲ pt,Sk.K~G>2摄mɳB {qQe11nkz̮\NJn:sǜ{\WiV#{mۑY`p\=Ut5oSOݛΌ;3VKW}ybP)֎9r˖-?$9̈́F盚R䦉/Z,[_]fݐckV49J榤e唶^VK#RVje9mK/lCsQ,[W摬Mi1ybIHI}V"ϘlWHBZVZ#m=_]v{rVte ޟ۶2ez,9dnnܝSjh ̢5ڶ'@N* ޯ+;W}ߡ7z[ 8;7oB7ߔt.Y~LB W7T<}ֶ|R|vOvs%z̀!j嗑aaaס6MZdr)}AxɅo3{r[Z3e(:iȌ2nmxzt[%?e8LX$: Mh?n[ʔqgF~D۷9rCp\ͅZYw{MjvW9k2̑-Hɴ9i/\FsGK[wg_S7_~??|*iyiqbͳgΝ;W;w}W)ꫯnjξoyUTow/˨d,.Qf(ؕhԛ65CK2*dГi(5ߖ - ֣ Ƿ8Oi9v[TyeN7?J2r~DۈDیekg˴;m7L2T.6zwS^QQvyQ&Z\j?o-ؑq_Y`m!HeWܽ1 (:n0ijOޖE?/?G_~{X;dZ;;6lP+{ftts֬YKje2 h82/O{KQܐ%uTkJb<ƁyjFV>{K'r<8-XJK"f^*AnQUv`'},vgٵ D'_uOwtUomp͙3gxeM߫/|u;e-mwM6)Okfdd?Y[RG2r겺׃iTLe-+-s1QnKU_S"fiTL,նa֎WtAsR5ml7@o駟VTVnֆIܓ*/.?!oƍo߾yftm۶J7d2?%/H5Gr1ɘvqlxZ'jjjmn_G=k=Co8vXIIU]ƕ)_m`#St ҋ96 H_c_y@uuz1o-AJ1a`HN$&tnMtϹX6@͐+ t{FhAAvM0x1 N\M&y;כ\oM t"7n?M @7&t@7&Г11zSV#l ~0SH?n t 0B4!ݯy&zM@7MԽ.0H7y=m r\rP e=5ڳM~1}t0:.n@nqbgtM|錼@ M㧓n&>d -btt&h9tƝf"q{a]1ZVU@7*Mf>?շQp&ݤz~ݤ@7Bٱ 0H4O4nzs5hw߭FkM#|N^lMI7&p&бl!ڵ^ M M^OK7&Mn>ij~nd tP% `tnM ûoP% U?)nUjI7h w\?NOJ7v&tm:>z6n^Mtߋ&tH|&Y]nu30gM7nJntS ^ tck7H41+n:c~˻V#oJ|x3&ݤtn'nI7&ݤ&ݤtnMMnvtռV&oM֋~A~&tnM~tnM @7n^xPZm0N7ڥ@7gk^tS?m?R=ڍMlAAhtnMI7;^ I7&ݤ+I#nMI7&pI7&ݤtnw7y~nMI7&y=.iM~ߤ@7}Z׼_siq?M @7&t@7&tn`|9bNeF(1taFMͳwatL6z-:nq.!^tS1Fn5~Twjo>F7&ݤt|k7T4{ [tnMٱ fMI7&_9OtnMI7MI7&ݤttnMI7fWinM >M~n@7b_ 0r7y0ޟn^huY)B7nM @7& @7&t&lﺼv}^[nt3`[y*B5^@7jމ^`nxK7nYFhq=1Fn5~TGffnA5I7&ݤ\^B7&ݤt|k7Z4o stnM fMI7&_9OtnMI7MI7&ݤt't7&ݤtnzy3x=-ݤt|&ݤtnM%+%_tfCڮPM>{~nM @7& @7&t& 6}^zCwl|wNGDDuT}ұtfn0""q7K  1Plfece9$+3]H|;xysԮj5?C |YUj+gx `PHpаa|nj*?& "":?N\dX+ qwT'KJWLUe)#+VȀ|Ud?jvs8gE&%.wX}N{j-2l5^۷o=-kUϝ;y٧OkM 4YjPUp~:\UmMu.WfSC H bW~'N~ސo I^9M9OzVYZ\ _Ky>Ba7K 1"dɓ&H""*#C6?_{l#M;+;3}!ر ykX^n2rƌÆas:{c}#@2xysԣN&,YիJ F /+)t>fzgo:d7WFVe9BJ9]{5ˮKn/͑2cDXLwuCWgzW+-r>-\ڟL4Otg!zɢؘ͕hYQrwpiǏ+`ed{kr_+;9O4ʰzޓkO52)!^#'I+d@G X+ qR[\2AyeE&%.wXF_[ .q7##G}8n+n/͑S&OLK*9ys$dSNE:7N |0q(=ۑ9e8 Yw΁: uP I*#$R#搵)1}_dھ*ukME}fSC Qn|U͍tFW*̛,5\iwqWd`]봛Ksd~H!9GW\R:*':3 Wru)˔ I)\~4w r+R0=o+w:n>؟7t\ve2&^:;o!g3#M޽{_wݵrhr-|]ݔF\=%!M #iXN4CEDa7;앻GqQ wŦ?i{w0H#Ay _`=5IiGV&9x4Uר> !B x'kWjΥ2i57RsΏhފz4l޴je”)o̞<7yi:u/*9BX_́341-urG9Ɓ*':3`|\ UxqivS;ۥK!C?3)V͘n]iƃ3\``OU.1ÂG--9ܼi :d޳O?N|u"ΜFjQ][KfcFF6;3Ks| +VDX7G'g='Dtr16PM.~~ߪl_>՘edcd*kRדj,LUV@C]:Rsi}%MiDͥ/+*RcoEsfϒ˽3p3@qgL?<|Yܬ}75F7DB7[nq` L:e믿~Qw)c4'_`iq|:~U̢ ui"#\8mRB<"r}\cF۞,AzDDDM>[|+_W?=ޔDDD&h\w#"""""bwx<"""~Atn"""MDDDH7tn"cFoۺadT{H7A+U(o -=u3%l 4??pkKիn"RLOO6nX;tSqK+D=˗)TaWӏwn 6bxYI22>.& `4C1""*c2ӹ#&}xۻwj7<>V۷odR2fi[eP t.9tͦ7ӧB,KДדyg V:DեRL'1"t]fkK=oϘ~xH T ==M~]5ޓ77nX;얛+uAI 㴥UWSL:e{//v} '{ ;6nӾ?|mͫߡ<:JтaAAreZZrD9ְ !0)q2RY>y҄o}H7}(ٺSD4l7O>M7èJ7ʹO^|KaMfRRDDDd7[[[%| DDDtMhMDD)7MDDD7> stream xA 0EU:ZS=*pO6"b 9ږY>gV%@$:.Ԁ||K7L endstream endobj 403 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 335 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 421 0 R /Length 6961 /Filter /FlateDecode >> stream x \TeǧZ˶|om4ʹҴ6|[+4JT.&!*ިAn(E@@0P.# wF@򖹩em3pQp&Pyy3sf)gΜ<tFG<ҵ믿>{sӧO G#I65N:uڄTU{;Q ON{g;Zv3I݀dcjh?XIk+W>/^_nDNSZCnyhk.\&zS7EǮ 9OO;aaaMb{ァ%wŹ:Tg7USWWc8pM8j22\q}UMZg:gQՁ+(1?.,m؄BŲloTo8ds"C&ZӼUsvJysc&y]˂B׭ ]rƹ!7 5CjÏ i2OfnԴL&^t@iΞAcM{ܢk5(벉gɄ\ÛOKUgmitҚ*h4eC|B۬Z4ë&6qpMW1gM'3ٴ[֫_k W12nۺu[S7'[I^vo[wM1'prr=q4kmoY 2S?+J+N-O͉ݾ"t ݺZzX啟o^/Z-<󶗫թfICv'jyHX"uN\v-9 mspRעIR4MR0!C^}S4qm[RR`vNKtNR[;d담=-ĩ(PֆPҽ$[xӱ.)o u&|5͘*R-N`ck?u𘄄ܬ}%5*%ܔHu]dPe_C">"Fݬ]-}n2I-foIO!7A^(pr1<;?b6uzkc~Rhӽ:ߐ8"6Xxr{~ŷUjl[!1}˻[wY4dѣ#Ge[˾%[ K*W7˓d{k|ZPj%[]t:W'LjNtp (o;BdWCԦ*OWj̲rc{ꗤCՏfɿv(;EWOVo9 ǘ˧|Y˓d..q(.ڑt޳Zhcs/uyx >Un pMigk[m^f]LͧK;.0+MCM!^^JrMMT{/)MswS6GgFJ@ٱmz)*vM ͭ1m/̍W&05JWakYΐ=0`9q6_eů_6Z9mQ\e)U:ǰ\e|E_}s_CR:6=77=>(8`F;dC+-(=7%prna-ωl*M-4TX>rRΕoԶar\YJlH|kCe^~ճ:5p[^a3Gk F'V&׶Gf6+M&cӼ](vٍ+*uԡMUn>3Mi2P}Z_\}y!{)/lT/7aR`qNXqc ,M靨bmr&(o6MUr&zmiy|6?\u,i-UKi:{d!gUw1m<!1k)*ZjM6DS\W>A]]kGDDJ!HQ,::ZAWQum:v_ڂZhK폯?ש-:~w޵kSU*omBQb{贲*طoдJA6kt-E`K-_Ei. tb!ĺ B1BP#!(FHUW^DE Vo, \`o!p4QO}Xx-"D+^ֺNB?zᇊ >rqarKW733RqkQ\bڦV؛;bp; pH }!|( ~Ȗ6GX0G Hŋ%nC߾su܍b[eZeyՉVV;Csm]JPQOlUoPRhj7X)Rh+*:LJ * (rV'FP-V/En,nͯkT/W W9:>ijzroY}E&(ֈNX[fz_-oxowȋFQ~j7bSenF,?VlcZyyr닋Q#5h1"X??/؈;1K7l>* pPL}6hsؕ>hУvv<(gWF;Ww~^f)v}QBC>=yQ źIxstcZ{*fSAX!(Fbk)&FSLA[:_?pE:ZL]9{6RL]9{?bCrP *fV @wc{ֺ{/W+wRY~oÌ>vZ@<4qSa܈O{ݬVB' Œ?oxgD1d3C;ݫ(pE&*`QS(p5L{A;ws̟8?~Kmz~[vHF7 gد|jcGf:GؒU } ߡ_8/V8s^oIl }1V1@1@1@1~[=f]o:}1,@1cC1@1b(b((bbP P P 5~% P XP PA1C1C1+(b((FP P QC1C1@1#(b(bbn tP XP b>.,4P XX)_y'F159_P  ЧO-׮X^h7G='OX(bj8:>qEiKJ!mߟ9(bjjzm8SA %'%U /v~:35P+'33R%׮XC_&nƎsX+tz)e: I-] x>~s?Xʥۼ}GQ̘݀bh{Mή ~%3kYׇOGbի]w5^2pVYv.߮;bVY:}L̔޴b~'Ν8pJ((Ptb|_ ŀU źZѵ[>zF1CN+PEV1q!C1C1C1nQD1C.T P P P zb\ ze7bb((rbp/((b((H_;' bL:LN;A1V1BPC1b(Fb(Fr=*bbb!(b!|_ bb!(b!|_c#A1#(b!(b!G1]G@1BXn==rWzB1BlXTDXQgr bEk*?_\b6QlY (fԠA1#KP)w!G(FPF>DP <*BPC1BPZ1I!(F!(FA1#Q!b!(b!(F!(FC1bb!(btz,(b(bVTŅ FcCC4iRGWWW@ӧhpb}Z5jT~~~}},m_ʗ_~Y6kkk#""Ο?o}eee`0;<<<***rVV,jR0a8Vt~~~R?E<),X@ĹxՠbG̙3*s1ܹsO= R1ytĈR>|8\Ŗ.]Ϟ=bJPUU5qD)dddjgϞQ?(&~(fϞ]TT$gyF^544> stream x1 0Eѯ:Z Fea> stream xyTW{82?dr&3$*MD̙♓<2>8|1Y LF@Tq j$tdiiyƗL~e4MwuUuU{inݾ[U_ݺđfw޻wᅢ ~;DqD4!ם;w7ۯ_AdbbY#Y,bl8K֭[nBWD}_tFϞ=ߌ"R%J… %F'tPEEEhH"XnEQkϞ=3fXhƍ"R }5jANIw޾z^@5554Hqɮft]E_W,.2b^~0ڵ}7R{{ȑ)ڽ{III:zG}KѮ.C$fkn+) 镆d̻IXv]L,hzksmҌٯlu.Johjkjg;O3B(5Krb>|0''=:ɓ4P$Ef_h[ h&}z㚜T;Ԑh}ξ v%EGZ>tL;gifE[ҫ;뾦"L]$D=&L~O3fL;vө Ioh&EFFZĉSSSY"""uq|(O?eՑutqWF|fuuf`+C(Uj߷HwePW^Ee) vӔ;5Q MǪ[8'82-FP@@ଅ })2M8p#ql_!`^ܒsS/FQEwٺuo)3o,X͎D4 y"wbIkIb?B;tFZbV"Ok-a8i[JA'"C Z 0KZR-xSxkIF$tnґSķ {o%#544uttDEE}7WRɕL^yJqe3QLSܜm 3bs-NRs>2+#;r!Ә6'WV:^PUL-sF*b&1l~IAGoGeʐȲzsc6:Q- LSŕeNj͛NUUeǯ/Lcc3s * /2ˆX.sY..NL"Sŋ-wL=#h 3lޗtЉӹKj +k˫gc&0Sn8`:JII!ʶl٢jM)M>}&-=i;zP_Z럴QXIQ[1{UTTOMYChig{,n*ŠP_Sȷ)Ǫ*2[r0)v_f5ރ'e,ka~iуl^SJT'cRQa?:st~@kOWPMiϿD3)5kN;.,/UշZԵ4wU5V-b4JQFbvi4^a{y m9?C2񗧬[WM7'//߮<2Z.3+:V|matyi4ohy(uva~㊒?c#hs H^ E]3X! 8DṆs,-ux$Lm9a`WKW s%N\R0v gŗkںۮܼr_7urɵQq?[r80<<ƍ4)+,,4݆?Ftn{ؔ؛d=LLF3_]2IGi0d_$S٨t[`.f7J5y~HYSƃ/zf+|f!lrĬGy/ w.YKU?\z8s@Q_4pa0b mAjA%{YMo|{ν׏~ok's֬(.)[rիWF/#nݺ!fL*. ^]E-YLS{{*/%eTWkggSWY“J3S2QgKYLVyUgna8}-%zz⩨j]uIL}獆¬ĤL>XX~>~SBJ=:.Z~VxU1*OjY:׳QX1gM`x&E1,fF+3d1(fQcqtŽ040<ܮ66L݇2SPq7|w~ύ*÷ŤgP6Krb}?붶nJFEf膲K=GEq9ȜZs?180GYT|4bc1T냸A9m 9Kcϥi yQe<ks:ZZ>9Z0h$w6ڶWm 3sU嬨x[j 9lM۲${ʇ(P3#QE>7;X*ʕ[ ͌-ק uJLV©Z#cm;i/޸wu;|rp:Eadv e:lɑ\ZKnv@:&j2(I)J,/---ךiԍڤOI79N`'Cx bYuj*vOM#艌1wFSSuȑÇ8p<Ƀ:tPZZ!A!u9:u.JaM;:B_}Y`O^QQqE_//g?Ca$tΔl^/x1LK٠:~['sCsUA Al= Hi41֥&188 sY&y{.pԩSp/~'[G^sS4bv뒓>e䚪K䯭$?X?fp*F;<8iwSVfڴN?;Oi/sEs(e;y n'? ߙ֡_:PoO_?u l`L ƳEK@4߾0# y|N,[ga{ص#1WW툉$O\low%Nxxc)s~^|_ XcC y@?WcL9wZ~ӟrOM 3bԤl8gP nTěoaL_8E vX4wL:3wpEDSKSHŝ1Ѭ>j/%)1]E &N@y=;9=Mzﯫh~7i7k ϡzxzK _zEOωӦTv b}x޽ygΜ9w5Koԭ[̾A@l F(b@ b" cbbY;={lZZXpppSSSwwwcccPPYW_}c===4wj40w@.A<Y3\=B/A@  A@  A@ AB ; 1b@ 1b@ 1FE̮Az1bO1é5UƌH p)0PTb)GY L3b_ 1 &1_ 1 a.Q"sYĞ4b=xs1H^ Ĕ .+#6ۋu- C/A@ ؋/y6m\b2 &e)ڹ7SYQ1NY)1bGlر&tZaeAC b&숹b"Kzx1Q;2~KPtsdžyCV;1#&ga])1c.|18Q(ֳ-81;CN Vw5/[(pܞ dGLηp bb;FZ݁S &dCqCa"x!{Sk#]PE D1 a.r@LTx|FX#Ѝcx d#׋w;1#C"0BI ԍ|{1l, [Gg@?0s:b#{|YDLW9q,˰( 4sse _>y6m\b2 &^OD-YDlܸg/^ OeE8 &6btFBu+:رc M2yO{#{Q1AcX:zĜۋIМ$3؋]@Q{Y G̕;8 'b;mrFz[@̺^> d"&~vaSS`p՟ o )1Ez8CA/ā 1^!!\ՌN)!ݡTڢv% 1 `<)^()ֳSF.ݵ@L,~`UըEPǖRvdҬ }..kiuzVbn>Nu[MF{&YT~v5#)rmtd@LY9qy9qR&CfU6PTεn1vYݡ]$2QJxu)伺C/?R\,B, v \FeM%G2wH0SbWwgKF떬Vhkr[,sl,n/.lNF{"'y.ԝ)9o6b <q⅀@Lp:!ce@ 1i^ĀsIs1 dh2n_D[gݒeb@L<;YmbXQs+? 4)xA /sĜE0r2t@LM1 ыw&@ )!-B Ĝի1 \ 1q^eɠQb "}b({vĹ)u9'(16HacWU  ]M= b ԧa.&x4W.}1aYb"5l1^ r{1$~K \R\J- EL1?,$kZiblS^ E!&vgĀL}9Buae ʈ؝C sMD}e@ub<Ā 1S}1gmjsd&a1< .b] DĔs( ыJ|11 &wT6eԄu0Bb@ yƫĀ$bAL{[(1#& z1Q'bL "C"b;"m Āa1@ 2sBFl$SB@ A@Lc^y f$o/j@ G 1R.b/-} !7چ#TJmk̝;AEX2w@ b"Pzbi »N2eOf_qQz(B@ A)1]g򯫽 &,b}lڸ~e@  4<ልL 䩬( HXƎkho"OA %Jb$cCؼ5wgR"b0C31@  1z A*(bud0[݁ H@` Qígb b Lmmm  bjѢEZ`0,[ |;wnNNNOOOgggss/566R^xb6f\\EcsJJJkk͛7׭[ZzE  @RIIɚ5kaּӧON糁ٱcGEEx F)稨(XJ^ R uYܻ̒wo޼y3gEtDDD[ϙ@ܿJ 4ۼM1Bw={N%g\AEEEf͛IKKiÍh>!"l1ZW_}x===43jM 4klldM MMM’Eh[r6Eb H21b r1z b$ORr@ lGLKzd#bCz"s$9;bpp@0gW.blpA8:ki/;Mb]Ustz0#!fRS8t0y„\S[;׆;w*O9*1kΝ(Zy*KLKNCѨUwmzNo"E|ݾ}[(5N0f;FzPEHp{¾M"ojXO\l4ڮNN2e2G(_Y> stream x1 0Eѯ:Z Fea> stream xڍXK6ϯ%mY[{ˮ㔷jg#q%yf @J>4x|Tr8Ïw >$nFUz&Nru#9tSzOi)j8h,zӅHLߣƒ"?EtAާ7@@&0 ^_uʢdwI~ؚUG4A;rTh͕FgeV.ݷ OEr%,uok-w VY ~'m4es:+.Ŀ*hq%! .F)+'0 x{#'&q}".^~*m $-õ93w? M$=O\i□JMXr.Jݝ*#Dbx򺅧:/~ꐑYNrL[̰ $٦B\A>h+K wn{0v>[3=PwhN`+[oxI N^~/ɷh#MGϝURg4/G0K܁vD8q ALD/A֓dݓ! 'h拪k3B-<G\Fu@^{E^p"CML3vUeOsJmӟ X܍).,vCx 5.91 w<`IcV K$b!6Tn!I@ t{77(yŵ)D:ғa\mxtJH-}E y\U(P44G6q/S{iU'aʇ%0h-leQ"ǍI:H/;PB+A``PJ@U">YB2nrOZ"t/4a8xuUqY4K> stream x\TW5쾛+(UT@(` Ʋ&bFcb(E`)"*E]200!iɓ'|6gL"(239sssgji?$G {0Od??wx I'dzyooA كB&aΡ 0հ|f/F g 2 z%H" ,?>Qrܿ'(Y/ <шxწ$9#w}Je䀬$#/2x:\/# /؆fL_}W22mλsV%-eG'OJqvqXBa{{Feh#O>;znY/T;>T֧Yiekږ_ʩW\O!ZnGO@o}rޮqs묹[w|BC _|ŗ_~I/tcfj`ZvnPRR-eQT})/T&66Ç֜ r,(96ߊzm, 2 |6YN^Go_},wO::НO++V0ITFg+}kZ{#,ds-4F}BUR66vKWou9wę+gG y6z+6pqUfO$G]v64׿G駟S*C%erM =ses*2 lco 5d% .hzy'+'߈@'q~J[ziSkw/ok]rFM*7%qvWUR/NZFwz2*I=]$V7+= [+wGl7t M}=05fT Zq 6jN5'OEO6xogb.&&gL˻~=9R2a. 0P4 "$$$55z$nYJo5҇Zs²thq+3ՈS*%ږP\SSM|8Wv ]*9gsݽ*EdsP٫Pk`n&qJ,` xJwHY\UY춷JTX*wLTA8mX8LaeBaA!fH*)jXw1[$$2ŧ bl˽g¯$fxʺEƻ Нm*8PڵkÆ qqq4 p{6e˩= i=?1_D6gSXvsm}BE?,{d$íNlkWuŚOQ˖K)-SxڥuO\JZ`mv|crY{JJIik1v{ʥy5=;*nxok-N~V7n:+/i~V哲L9|C.(,,V M.^$2iP 2 'ɩ5~LY*j" e@ Qn-}(BL!}BEQr䶊+|7^TZ˂W>OuyNdq9IG%mP.K+VlI-y\e+ک"|*. x\\Ɇ4U"'=sZ(7>!؊5[)001ѥ Nq- ?g_?'_~_ݘs=t.((( _Ĵ .XYYyyyݿPIඌhIsj3}і9Z p-ܳ:X˶In` l;Pݫdi-j]xQbv ҿqS-V}ݕ $=ΗKQ#*b& R®g)nY${R}[J{ަմZg.JjC)jXOT߉wȆ.@D(9p(:!oO?׊:ngu?\\WUwayQ$>|H>$d B%eе*$Zc#E| #TH͏ t:sI+J\,nk"G4W'H1*%Nv-%;%m*E( n {/ brV޳4qvJ%FZ $=[HZJP$,:o 4?]+ xA/i{kyY)m/|e3w^@ DI]&w7GGOh@8*./T"//dSRRh`Æ1%%%6lXreffO?Dejr-~G}o? ieGvZutcMGo5J|-,]]cAϋh;:s kS8PlWHZ]-*9{V3q>U^-a\qhn]mgQVٳSC7?`sew)lX.-nlG<)iD_ 󯿺WtVSb^jJB#V a Ν; T\_痗W PPE!)iHRDПV$%>PP..Z^.PaZZnKܶߠH&=ݞ ]r "xeJ ޙJFO&!Emk/Gz31FB]P;'jHJJ +WGH"**ի18{,lz#%4.ʪEㆃjVm 2 So%QؗP555eee( ʡ׻wLJ6!̎ ,E?24,\~5A!A gbf_J.yf][{*ˬ][I,Mm)A[PٙYb 9YiTo.fX4.6#(yp:[Z :*eV Q\{tLիV>8vXa=Z(A;m":t(?k)T?rH9bQ@)2ߘYvC55V9֨Lj~)]LN] 5jɘ0a~j'fL>mˬFf,M]:΅Jrg\ZT#!rMU\>bW:ES {{[TMeXyijmSTC̟oAӁV54rk%s!6~7nl͸MUvEW=!r1n]'Jf"Q.rFMM/O7^ʭyp:դݦŐ!C^N,GZsϟE5{v酪!w[gjjBϙcZVZ\U#wC6`:hgueݡ[n2?#=0 kV,7jԤڪiK=hB%5ΖfuuM%?۱}!o eff͢:|a@5TTjTj;1{ G/j4W5ZG/j4Z5wK@5P TT@5P jjըjPDF\ad8MGg„˗ٳ_O!Cj,oz垇+RRR[[[`mU_W)~Q+pFT3iĨ˔[VsV͵Q5&[R`Jx{Mi TՌ5*-%W&fϮh3nؐ,|ӧ̞uz ˼tS_Oزy# 3gHi֬ɉmfJ'fpTct.Y|ۣTs^M4eff ̘a4\)q',jAJеzx&XxH\%jdi')q@]CU3l0HÇkj4_>xR{;N5;(/neLttuus#FVXC|N5̣Y1aN:ry{ g:OM.{{=IQj4_~}UEnZD˗˜@8Q5ĂVnlӜͅ hHCuP Ç{1&Pthkkj4_p/9{$ ](qɓ')QѣƋ\I0lEۻxilF૦%iĮѪ`%;4趰 TtʔtthES$%!o+leJKlp|Lon 4NIN`1QԀk^Nэ窚f47G%Z[ͧ'|@50Tjjj@5P P TTSXS jP j-{CSPFF#z K@5P P TT@5jjT@5YPդ&'̞7y5kVL%OfW€<lUN&;3PWw~ؖD5dQL:%-%:2R^B|%5 :7##.Q"&:b-,_ɡDA~o[l TZՌ3nYqLRv&NXК,fL~qF]j<33S'̝c!sř|htxYU ʻ|mC6SM4MGeΙcJCVJ$J4eP\<6]wpXtSɐ@6ξ >Kd6K/YlC R"$7Zlx}ӖmذQ9%VXFJ|s:j ƌ:|pMTY3COQSÇcŅ4?~ -Po S?9xjZGWIKKs/p#GdqoiT3bQ@)a aN  4 0rY|4Qo5܉&}d*)W!lm}-sҐ gE6mm*w'ԄiHD4Q-WF՜I ׹Mj^3,nHϕLh&PC4?FiȽQžnz[mIRL\"ޥ1ñ-PjUnu%MhD5 rλ̒;FF֭]9sLJ YfFz2a^A.׬~[|t芿֡a1T>W%#O>P P TT@5jjjUQ#jTҨ jP j-{CSP ~W@5@5P Tjj@5P TT@5pW>IMN4=K__oIk֬bρ;s4K5(c>S "YR{;ʤm;,';]IIlˋN2ҨjNžќMN(AOlְǒr_3eF]̞;]IIl T3Ȫ3f4{t4O7L8!2\Кz&fL~qF]j<33Sv=b9̮JO:[(,]>.7z>}ZL駥+/myT#3O~:VloTs2$M411K(yfwP?{fwvf9%VXFJ>KwU3l0f<\cddHeIk׮KIl T3h }ΜizJN5m- :t(L`iikdheR75J.=jF!jH_hCcE4p?H@5Nܵh3ONS'|bIl T3@,;Ѥp"L%%` Q5bW:Es.{{[FTMhئq!χ-Kb[pf0U%%\N4y}"=WR2 @y?.il#Fn {zjmܜ |鼩 K_;3y'Ķ@5vtthES$%!o+gueݡ3uf.G9g)wd'Rzި}̾f븱c URۂ'| Okaj@5P P TT@5jT mFFsUQ@5TTjTj@5@5TjP @5P @5T_5A >FSf gk!5 BYv:B?LEǖtF7G8@GjXa+pQ G8@G`Q k `T)xNqxq. _T`TQ PjZ.] swۿc嫗vٿ0 F5tDQo;+)i,N߸=Au `?D?l`T Qe6+eE_ޫZuM vTlCY׿sTG;uT+0֮]eXW_}m*dup?&#GG^88AY%Ae656k-8K7m|Bzl/==]##[ JV6cQͳG@5jM[vߑ)J;z^}7-Y̞W[_WD™:mJK_ikioq$%5j숨cWSjzdM:\jm5`ʤIC]&&e+.Ò =E둽3ғ{:}L7=k X…֬%f*Y]gffJΝcV^ZD9>G]]){g̘Ѵ!ԛo{֧ Pᨆ]͚i,AqSF_z%͒\.q\j9q1`BGW?jG{ѹ#ۛdÇ)4կ~ER;?>s'T;HF5Cot9-ǵkvA򡴰I!{/Ylt!'+/%S";3^9r$?{dH %R̪ >KdedumDP^ sqKV,~!Ro@QT8ASSor[[nb4qwV'd̙cmfQuʴ)Uql|g-#pHΗRJ |TCБliiNzܷv;d-+h/F5舁lSyo K<4zF5us> ?z\5jdXeS #mT`Tp#@#}co#4w'Uz7}@  @5TTP P|˘^vvKP (H)sA+3 OinK?HCQ-~̙5ޗߣa"P jNcn,9I7d9Քyffzs瘕c)ȐTW/Zd'#?4޽^kmW6R"(v 9rdmM%uXΊKb)J1T^M6TҠD5#F5($$pb!턝 5jc„IN؆&PoW5]4Z:KKsnÊ<)^M&g +&PϣѣG^n,j ̚5v(Sܗݛ?J YzAYj2{==]m-D_@5eL0 tםu ՟jOcs4]5߇jU5`TMosRgP }xFبDC3rh!DBj='(WO=R0PikkJC5QM/JC5gWr^ `J endstream endobj 434 0 obj << /Type /XObject /Subtype /Image /Width 377 /Height 260 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 181 /Filter /FlateDecode >> stream x10DSs DEfr{~fkM9m{SdH3)kwRA ?2UJl_O endstream endobj 424 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 335 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 435 0 R /Length 8381 /Filter /FlateDecode >> stream xyTW{82?dr&3F0MD̙♓ dpA,\&# * YfoyƗL0_uA4M]]U]{UWTG_~"Ň8R ӷ~{{ѧ}ݷ.b"&:swQ7|W_ݾ}KlQCA,k$"EMgɺuMXA"g(BheonnpBYYYA%%%)R6⎎H$M,V "(Ŭڽ{3-ZaÆD(BHڐCٳA666qMMM---Mt:J ͆Kv('*EQNfˈ)vfxuôsg}7H;Qi@:Dh׮]G'''k Y)enyU-yL1%@=|(|G.89**l%,I[f~)'Į+]+ UVݸsm\@WPE*+#vbh:?.OiXl.0`l>V=E*U>5%q=g- sX=MݛH#8ucLʿo VCQFܹe˖R6g+\ηD |sQ}a;4)T,Ws*R -S flQПJX4+lQރ) )%Z󗨼)4AZjZ*SmA}~% T&'aA:%=Sjj=MYAPI̡2P2Zv=$*?I\qǙGwh5jW q|~GΜ<|o(wÞz[n9H~~~_5e3r3bW+.9z{;LxG 37{ !+3B5q4ܼiLȉZ M%UU'VwvߔY;v)bge&[$>_RQ2$ôڼ8vNx`KI"dIUyIN$yӦ9 +8 ̜ª.Ct VW%S,$*/c[|d^%o@2sN&.4D 0 \9CKSx`ӵ&ds2 ]N4ᅙk6M>|xeKEUu凲}M_)7^|e7oVmx٦s\{V6c#L*F#O(x7P}*++!mΌmf7friŻ)/K{ۘcQmY-d9[V4zn/\憆ڲ 2͸Co.Sԩ\9:~?kGߧ*T~ e%7L+*5|'töU5-W[{k;˫uE'6Elr+nieG3AlxYmN됺=lHq5WՒFHF3m˿Fn K3_;| bMx@[$g^*۩jmVJzeYv1]ԮԸth *2ɏ r{:aS{c-ȉ}tne N1ɸ5"LlZa)K|ҏ]{">Yڶ+7w;}ը-xy Uz+hLEI{ja-әNn9i8+#ʷOj(`\8UѮ-JN:[f:*&k3k;G7G$jMIKj45Yn3ў78.ò**l nQyQYE5CëUz2ҹ&Ģ5\ 5#,J2g13i e9eG3=Ψ vԐivgSAm}0=QWn}?xp&bklzF&ek3'߷o ч~Hpfk˖-DYhh(Tlfn,?spVG iD֙(ƁQUQhf̍ bRuiA\ܶܥܱJ¨3augVI9V8Hw6Wm33t5ջj :C3C7/53 T͈zԑӆz[\E}y?ΪĪilW̜5>Ɵ6Cnߕ~Rm}}7Qپ2( Klg]mƵ5jRM0Uh-A9JQjBmڨV7kNjf39<%91q 3,Wf΢=2;cO¡#3uNAM)Nɇڿ?ERutB,33 u9 غp%L8L ƇN/|hNx"^QeFҔOHݵ3"O&R}+s >ԯELXKf]=hچCNqq.}OS?b0F ivx 43(N&bWp59#Awݰ6}3;SNDrE~⎸XphF.c$ (1ME &MHyϞ;8=ōzoh}7y7/xxzK^zEOIӦT~b};wnnnnOOOgggss/DȊ+Ī8l߾ҤHii5k(ai~~~FF)>||Aq}6޽{ͣȜ9s޽kR_?[n|Q ٚFE(('%%˗|ztL! fদnNdW_XOOjYwGoo/M#8K!AFA  A  A A A@ A A@ A AШ[\= !J_>񄛛 =B B,PZm1c1. 0J p bb;F݁C! Ɋ/a&x![S m"Q@x"\1k@"iR.bDܘ!K1EVL $snĄ21 f;ѥӡdRn={-&Y@ VQyj'6O!Ť7dʥ b1dNP. f:E&^`]1kL:Z̞01 CyA'FlQb6ab>隈!WCL@*ugKTİjs)1Kb/Db=11>s$~<>7w h|0@@L(G89jpPĜ1S&H'Lsg+1{ު9;:!X1bp1@ 0U $Cg3y6@E &}1VmE<1;ojb@̦P_@ v(tA:í? H^e/bBm&@L\ӄ1 `>X gw؊w k1,dyD s#&};nX 1뇽?b@Lp'ϙś1 s[Ϯ/b.ma695}9WĀx++ۿ Ŝ]ώ"5U:i 2A+sl2a_@ 1j=_Kb΍D 8S\Ql6 1-!}p V̉@~% b=!{%`/x ĝPEkf$C,PZm1c1yJxjgr$b-i!s5 e=b>#l1b΍s‘3-D O(bh;e ' "snbr{(c#oC V X3zl=; ijճ<='͞__w 4kWe "7X G:okY|?銋(RUY14H(#;VD.};YmEEL1Z%ٮmeD(/=Ā3XE"7/7oHzYvd,j>y/N @$Ûh<ĀNx%!b'@&Dz rv3:;,wvwX(wCV!Q9oֳ+5JD괵-~`WըEP:b }..iwn= LClP po8K9T~v5pYJĤܛ! ) 4.9/.d,&rfͱ>"&[2GLDW@ ;dE BLΫWN5sA@ Ġ V@ a J 1 .b@ b@ )/E̞z awV Z ) 1 94YyN e  9! A@ 1-Ճ X1bnnnؠU11X1b\^| ](Bo GL}vֆ;w6˕X(ecĄELXFbh »)N2q~3߯zHEx!  VMSDOIg]be "7X AB暧?㟮x"Ue رcMҷ1bĉR3@ ww"ֳD N{1z A(B$9bA"[ &A";Lvw$ bpC31b1bd6AZhZ˖-cXUUG۷WVVw]`qjȊ+,ThbR߯ԭ[L`R޽{ͣȜ9s,(#22rlB* )E4m,2ٳg555 *..NJJb˗/7ބLzzHXn^G)6aMƈr4顕Z6jɞNc] MMMݔ’EjhhĘkj6Fl H21b 1z X1'biI6 A#%\=1~!AEN)܁]O1 -]krͳvW.bD) {vMx*P}vֆ;wSsTb׎;=Q4D,)q;Mg>ֹͷ9:| XWWum9Ùi hB5!Yؚ{ǍMbOul$>.fS? E̞1 YXF̘/%"fVkr.JK'|]O:M>es]D9A>zd[9؄/Jt3h~ۍp-6RoJw`Zc̞E); 4!lUf3櫳S\s'/ fe/*̙E18pZ[[Eq;c7:B1L 1|ٹC@p`}x endstream endobj 435 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 335 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 180 /Filter /FlateDecode >> stream x1 0Eѯ:Z Fea> stream xڕWY6~_VbF%*۴F\Ja[X`58D(~xHn'd"Jd0 _eҌ&'wg)7/7iU:f:$2-$mZշZ mW~z|xV(RF(W)rQh=4:٪wIL)IW0q?:^]ζLuQENб}w};0ػ*_q]sA.N~M "_Zt"5% jHm9&ށ<=EDzlΞy1}۰7ai>i-$e[{Od}fJkX$rm٤Y\ڵn>9Tt!+S<%3\ڊ$twjUX?z^3o&{0P 2a$M. <ŏ?pw 82&Tc$"0JiC= "jsCqu80_UetuL2͔rOofs`c98V܏e)ɿ(P䨸 Bp͈!xcփ/vHyO5ܜ)2BG{u V]uIg3U %JJXtx|$lb $?ؖ|AB/N+XEoBC>WMa.4Dmn1]ꬃ>6ZRﺉ|8O\P2a2֪ e!i++~>Ht6<U YDە2JV:UehX_sU\Fv[ ): pvE0&.;tw?n.A-wcaweV_V$RH߰o3ϤBf$|(cS ֈ\Mw#:GA B}x,aD^݊Q@$WCw2LA5f$ ,cs:[Wq,3P-`Hk9fۥ94A hڳ0`P.7*%) }R )~N3'd>%UT Ɲ,ط=W5Oӥ!Ia|,\#}5c}?3yTG;Zvjؗu>bbrvPI.xPC(w:w?j`1k+NH&h ,;ՠuLsׅ_#0iXgJM^.\9 ~rN \?^{.U8)![{t_=K-!z G/oSE%*rqf?|\QE~#9sàz9{"?X *zJXf̄T FvC;6oMJ}^o,? ۘRx6vpUO[B~h$9'f=* endstream endobj 426 0 obj << /Type /XObject /Subtype /Image /Width 456 /Height 407 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 446 0 R /Length 15905 /Filter /FlateDecode >> stream x TWҎQ{F.2^A)<(!1Ũ8D`Ԉ51# *Q'tɗ~om8*Uu˭;:Tթ~w9vpoW PɘIt?AK`0L#`6 Pʡw}i/˷~g )Id%#2|o?`0 69`铠J_G{e7tRRRĉ4JWsf)kmmrJyyN+++OJG]vrd=շzkر3g\n]VQR&-rGfA۵k_|Hmiiikkkfʤh5s͗J^y% ̤^+=W_I,33sh >~M]A}LZcǎte7Y8Pi6ZJ*'^ ُ>?/jg~pChkV4o|b/?QO?/8ymrJѹ [Z[Zo52NL+j3n9rѣG%%%QQQ#>}ME)]Xtl_ʋZm_ys)Ǯ\Ɨ'JQ^?˧*|b _=͛5>zQқYs>A{:ޚ7?Bv˖-Xvs ouժUci7:9D.nIb)W2.wpz_޽=t|fZU2OQEFN0E+Xu>ɬC'>xx.5|ktX16g=uli[ PO+o5^;v-nz͛7Z_qUmSI*qo]a Ћ4L'&-zAS&-ӂ ¦Jo41 f\ka;vHDOe7j>Oo6斔&5}V9F*'}MJJ###CCCKKK~t;׏)hY-98$׶fP!M#'zj.IXFr+fq\-[Y}U7|ù*yz:<ýDڍEiQG;;Juuu 8oeuE[iK[߯]Az⃎⚊:Q,tq}ẌvJÇG弾~Kɥ?>/Nz39]9097mDAMNN&İ!Zd٤k;/Բe.~iϖ}%sѥkxجl3ձg[[Jjq`.f /coڶSk?/n{kާvseYHؠʇ]R)M/WWn,XVUEhj[uTw[(̸֬hoԼGܙk{'ssNE]e7YM=~{CQOvcǎWsrrh5Qb ¯w?*e7Yʮ]VQQ>;*I¯+sZ՛M-OaMM?>>Z?w9}-:?jSa54qE)v*,t_Q=K, y]AI7^NͭcBC2RMA!#3mW~byN/RPZߩE %WWY]1C>[\"}}}D)X|QJ^ny%&M<Ƅ^PB93g,s^scj?a<ɫW>V3nٜ3w[ꖎz;z.>%Ǝ X4{f`>Dk6Sh\^)/Ҽ[MXbL`52uJQUuTUݦ'.+YxW_0`DGn=;6EkQ/)ӧ\Ɔw; =uS??Nh$fI Wo'_$)Zj[ 45:aK0ʖk jT D\k]J bt垈^"Ac)GyBsFuS^3+S'ΡӧJNJ! 1\U*k0WWz*W# s^vy_u5aac!K_Y^J7'2r EiaÆ:c@-zz01}e>ÇKMLiZ h\풫zcn%[' ϋ["j+m [H+TzUr5^ud"g͜NޠF1qV~qV1^dB.MZoi݆4__e}޷ nl!콲ҟ/tи%Wcĸj4̽=VuT=m+ppЧ[E*) ltʖSU({Aݼ`З16Oهj 3s38HW8~5gzݵ^O{W!W!U p W! R)U CAPZ{H #rA*ArjC}1Ҍ4b+Q srXC {"*]Mgs=rݍs%9B%>&kxa?Y*◇CmIj@j %X I( 'Up"W!AUJWTQ{Ѯ,Cdt$a;\U9ެ]..n\+9޽{f{w(--W!BU ʰAWTz'kSODSnh\ Oux;3e9AꪡC-4$.5\eCG:BlknBOUxFtR Բd*TKp۷meQRn:uJӜcG8/UTs԰1֮6lG%Wmׯ/ WKNYv"}?eKFL\[VCUR\V\ՇƏ{kG:%rOw(\%Qb֮f,i*WesJ\_'H0W3~\87kt56tddk >pv> Ix)bݗE42W~dLUuB&4:WuM hDxK,sҤ n^acB/^(q֮ |;^_OÇ;7on*V>Vz\vi*3ҷMc3xGAxr +:߯__ֶOiWF_^x>>nOp!p2)Wi\5:W>l TxxXǻ^|8|Y?p2WX W!KFpyD^ 6FN:CW;W!*,~9hkkM޸^ WR/\0^|mƵ֣G&3HꗒLUZAUpUKc}|Z7HK>|O²x)-jW-MFjl jUc؅R{WB* zBU*d.+&WUV{pSW1* g"^ ZY \WUhTUp\i `t XKUp\W.Uq<-Rp]* P \U›=7{ZDjd#w@+ف S~t,Go&oP߾w##/`ՌT=kFα#8WrG2e#w@+* s5iC ^z>]oePtA-M,=` 4bp) FZ^v?QAX;u\ WkxÇ9; ꕏ|69GGǦۢ e#w@(W'bbF8nquGf3׸ؘD\;wY0%d#w@"WU5:z~:~\pVIqQOZWS=kt56ᡎA۾ U p \W1~UpQ/B"* #rU_dۅ*泂 s(~{T1*Z!} @W!#j%\իG{  BkNđ<==PJPZ493r 7RS6ӚlJy#;<-2 d-h Nޙ(;',Wkn]!;<]9dOPjUcdžtzsr(:uJd֞wZX$ pY_咝w,F;Mfh/+dW!3ef Ѹ˚ xfey)}8pˑdW!s:pYs:=w<3lL'GF6#;<BU XB6ter^df+)tr\Xp׫RS6*o4kU[b2mxVuI(fʉǛ_5ōtch>>ZJJ[:00Txg+)}Zo{uU z "*Sv&_X=V옫҅4>vSqQJFڻ |jfVmS&GLؑQr&_,0]5њ¿ɑRP"=-eHњ0y/<A{p&}xQZ21A}n45z>]v*uwttd#*)O)4Niݿ6");/8p@c- 23Wbc~2*jQj wHOJiBtByʎYNqr*).pudc F]c%\e'OdGTpm-vTi;8LtyqKD!tSbveTRF]c%\]jysJNwW 2((#$$hMq|iKSmt|Ѯc[!q@G\_ڢ*j wph*=q@cleT!p\WB Y-ZU\W gժfMt懀 6Ij?D=W *Ƕ* AZᩂ*.]ȈhTUp\VL  FŬ*ڭj VDWK1w֛%oGc4g r===zj?kj}Y^7MU]AT*K;BtU Ӈ..S^ˇg )WU Wmׯ/K+I~#.3"W xL){#y"unyBVDO9$ Aઔd$qlѸ_}} Bܹ3ҷ_˔=GGcgw]S" B*j_%o$ )3nU)[$GgXl$:Zˀw`OA$UWfΘqepL uUV|PwVzipa)J_*KMd?]e*wB5sǢ"*IT0HJy?q.{Nxxʑ* D꺤USb'7j@d.jcfg]IT0H:cѮT2&{Nxxʑ* D\%750sSqQ8,t t'ʬ,/3E14$>}|l7%`9GiķvӿOʧH+wvSb*ƯZ!W옎fifj\lOFE1 WMʺzruN>AT9gU* z;9ɩUo)OsJwaڣUp\ I޸4.*@U?W] #-Ua*MiP|V*j6舫3Qs^[P%W]uʽ~sUؕI  O _*Ms?fVp\0-h5.W>EIj?\ UeT"ՎǰNX!cUiW!=;Td!p\E qъJUpP A*d\ "U lOe \e pEFY$L?rD !mBz0~Iߣ1i)z[l_U/ \q55e?dquMrcƄTRzՐ CяǤUaj Vઔ5?L &;dg59}lӏޖ'3,=-W|G:-SK@96!"D9t/d 8+D\5jJ:%2kN63>ir駵6RmOryua4j4. R!<leEx5uUpհ~(5\%g2/D һCvv.C7WW/-xu҄եҐgs(00NrUv/\5}xBvUTX_{o>]6O#*)!Lkݛ) v\=H^Uʂ6&˓̃YpqŻ mlӏKAk˿&U& ${g&_!m=H#KdÂ]r2Wᙇftv˗꿹\0=H^|M 㱪s%NN NQzU_j&rUGYuI(fʉ_@qsrhF9G\&qr*.WU oPsҕ W1P܎ gUúuj\lOFEQU c*J<\=wrSIq&{\@q{me s544$yzJҸZ(nhTUpUʈ3Qs^[P W1P.[UpHfk S7= Y3ZUp\W!c՞* nP5Wwd)/wվAl43pw|}}ث4oPr*U^1*{S> Y]QQfjHHP9k^А` >>Z&Z8{B|ElL#YY!W_0&4D=WeàȾEnOV>6i4[AoEJDɑv0(oc< A7j[|]&R^1@-Q"9}Upk@5` zx5~+WU0~GqgBFT鋫+ PULp8T1 WUpU Wϕ:9 .,8EUe~)UIxzgV U\eC <꺤UaXzĉMbr3@lq0 f4>vSqQJVyzzWU\qUv2&:zg``ZS AjW+ԷNؖi)S_j/qڠ B\<ɨ9ڿ6gNkstٙҁ4©@\=wrSIq&{rUv2p& WjhhH؟qUq(ivٙ-A;r.+U"*q}&jk*a9((#$$Ⲉ3-MFjoe%-pY!pYj^,nx E5oXUp[*cUp \k * *^WUpվj@Up\j~+pU ' Xx \!G{ WM b"GhUq_$*^1WYTEZu0j0тx/.zNS߾}YNrva #{Xps]L\dVZZ9Wqv_]*<<kV8qJUsC6=*Up04>vSqQ*LH߃|V*jWUW+ԷrUC6?Zh}T ոؘc"J߃|&꒮jnR2WOTR\޷\+|ȦRCWԭ`43p544$yzJҸZjb>dCMU"*q}&jk {* W! W!S[AB跂 p \W1W!\U*QPɶo D\zf泂 p2Ek*_ pezm ll X! #[@+ # * UȚ WU A깒B'(}/5eQv'#)g.+_]*<<kV8q 5BF 4WM _;ɩ(qW&.uvq`6ˬ,/  "fuUD$Zz-.P(oX=300,W7 "9JKW&&o_4J)h\X&s"s={֌cG(q䌏Vɼ[ܓ_[?&d\<ɨ9&J2puM b1bB9|4B;4:W7Lvz:'WWM=*_UaKu=6rU!W #ѹjQYvq=%ggi\FU\-5W*u`Νnj.*Ӈ ϋ[vkqFUJD%DymB3pTYqYf]M=\mi6ڕ| [qU(1!WռD`WW!A* B \leT!p\WB Y-ZU\qR gW!P p@W!X^+w-M +ƈ6P(,%)}^U Ȃ\=wrSIq&{\g},.J[PU_ jhhH؟qUqT W9hPy%JP\]ayqK \ [ *5鋫+*ʿ>5E p5#-ua> 0ԵBKSmt|ѮZo oիW>jI"]*[  @Ƃ*泂 p T1*) B VBVk p2TV\WG1pWE\%0*'C.+B*\VW!lY UdnB%"  <.ف* WU 5B WJFaber?_a OOАઊ+MnVWEDLZrgW!쌬**392b[JL)d9ǎP\B9F4zNn? (dZo/#+x q*d7UaKuJ-W!p~+evTi;ܹ׭]Eypqv kꪡCVV\f\!d6:WaxѱfV\-  bpͺY3{xk4.*@Vn߶])[7M:* H%WM JbÆ q\%WuQ#;'5e3hQ=:D\ j_YSLޠ}Uט1pkn]hQ=:D@Uq5iC ^z3Ѝ+YL%$ftk4rw%c>+]6l'7*<ʶZ:0yġ"ؖ]ђ-\Ke pW z9K|xq¼[uvdQLAF""ɑ(glBj!p Txx۫O>w-M + 8Nk%¢XёRJ6K*[ U\gN *mAW!p!]D\]ayqK \ [ E*#-ua> 0ԵBKSmt|ѮZo oիW>jI"]*[ -rU\U U-]os\zWJg*BpY묢!pWB jBBhe A*dt|PUU"îB * 0T#B,Z5P p]1T芊 p_H \ W!U \ W!U pABA*ABeᑬ~Lu\i*Rs**B*  B*B*B* JիׄȈ) cBC*K)}jHH?W!pU W33/Ot⊄I&y{y x2qCy&O.j}|eU\z&W[눟6gsc jrla``_Gf%j4.R)mHpWUK ^]/Rs Txx۫O>|; x& "3%ZU\z,W OrrOtBNHN-_\U\qU(N_H7ן>*eFZ|}}KKc}|Z7 p{4  B*B* *  B* tХ,p\UW` W At  ;xZ "8 4qAW!뒫|G#z{1TL3rȁӧi4.!뿋ɑCDо&GM0VUWXzyBηJ1zI#ٽd$kcnlGw"lծ|]s$czUݬ6jq)W,}Z(qAww7w{kn]]oּNּMNϞ= }È\e?D*#[ewmj,hdςڕϸ>׃rX&j쀫A(1Ȑ;stJܬDjg DX=Ů ~+elb?F~ W\'ws"Q uhBwHڸqǂ˿ڳ? =Z^=ݻvH7쒏lit*uʗ= g~76E\XkL]ygϧy=\-v|Gcg(y5齮κ]KCD6~Xk_ds\}𡈫<-u %RV T,gDα#8WrNx||bX3u',pG!ϑ+} wsRtıѮrA^x9QIWs۷/s6'O2vRHK]*Qhs*M&Magpi< ʗ=Ѻ~ccwMw+(pixbYvy< lG+ܑG]\Pg\6.6+ɽ'm(+ي(/D\*V gGKu蚤wQ& 9Ug;U{wȗj^'t4H==(D#Ssu+#=vmRRtiz^-RjhE;q{i}J+VeϸlxhHW֏UU!TuӁ֜2rqƞ:rΝnj.*ς㖈*;koN|i҆I'|'kSO,[sF_ î[ew]ذVo6͞=sӛoMtpnMD; ['Zo*Dkzj>Df*\X_jlG+^zToNNcǓL}"8v3.Zx$ZoC=UI*!((@ġ${dž ʡTWS=ktzĠ+'"bh`=UAl1^d +m_% 0'Wv"?.EСC#*o_$փF=-z>6mp5I֞EvtHZil˞hO7ůR[r*GdkO> stream xA EUBpj́ ĠڦzHxd#"rfIL9V615%VRDa}%.ôUԮ<H16 endstream endobj 427 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 335 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 447 0 R /Length 7465 /Filter /FlateDecode >> stream x{tǓ#3$"GA7{t 3qE2B$~u~Vnƍw ! 曛7o޺u^~7!w l]k׮]砃__~y+G k2w xY/_p2Hp~_"QQQfWJ.E>qD}}}Gmm-]JԏrqVku\#V;vL>}|A*%hKwl+w944T*U*UGGI)esijJ*0x5%5k\Dѡ軻 DNw.\`m~_Yym m]:H/m߾mU<==]1hz]]d)e Q/פ -tV>^OkN` w.0 U.,aV6}qlh8w)qޔOO>*Z3]ݧ*YY%>y@[Ë{Ґ?yۈCэ"%(yzazeONjKO@~'e_UYQWp*7>>S1h}5[e/ˠ"3>^bur߫k +_w5&~nڴi⣏/|}yƤԌr8+(5=g-//ys⣓cccVYYYMdٚ5k.O>Ӥ9ۜgU W}nzq8kچٳ@aBS =;NBw?%j4%5[Cи* fJ%}0 v}CѾ=$tJcxx }|Joz1_`ܰg/\.n疔=)iR3}Qўu+YO ZqA7n,FE׮]_lϼ:zq08;1[誗2iuuiLhth Q*Vb7[kCw8yIbu/ =\ݫg̨5X޺dY\k^aR*L g*2 .Nr% g):SNVrMD/,x?o\4@w"%-iK %h'ҙVƓ&x͡tՉtuzb u_PG3K zӖRP|I':-;})tilF"^'ŗJ,6\KD>%VaV~pћ?JJ4`n}}G+o4w㖴WF>`#:::M6sLVW_ /Q6k-7#&xEamKKm vpnjYUlѴK*֐z E1{9 z6Jb糗j}zmSSuqauvP_K;t}~-ճ"/RQAmS ZUX<`Om*{(tuqmSCmI~a-R~}zqCKKI z14k%Mz]6`:{[)4*N`ObC%ũd X9s\<פRT]φ[.Nf;/9Ze[܉iw\75{cS[\[ci4Pd.&4/uՓJς2Blok+kN4W[dU 9Ee2>ѧfHxffמ={Ȳ 6477leʶPn*wUr@]6OGt&Etʹ븺+ݔ^'SZĎj+ۄcwб26Ʒ(N60.ƢQ:6Z"YYl =)UjGwSj-炧PcNN]FoeHUtmT6ϟGK"]T o2\Ml}nr9zY(d6k`KiW_6ޤ3zqYfϴ(5gzۺZ:KksF٤VL1K';f13,˪*1LPNPo,U{Jg (-gPѿ*T&mTŝPatkG |=80iVUlBT#?m&[56?י3043'R@Y畎FjltJA3_Hќ0vnn1al7Rg޶ U&]jFƱV4d lJ{܂ضF|. mi)!r+]];AȨMݯ>{m/;t;ּ#iKv.^8w\z(1,*PǗw]zv]|=jV cI.5w/ձTBڋ?ˠ 2FkthaJ^Nlf+uGc(J֩bn糰PưaVg0Acus"tw)BqFQJyR'B V:(%d/CL.$qNʴQKfFCco~oI٥;w׷}půTCoZqA7n^_H1˂bVy2ykk,yRѨd ke5UAnCnx(O&d8(阂Ҳ8VfyeQVz\IK;V*j- ͩ7D%שVGE&SSֺ".l6U%pYT#ҋT*V#L^ņUCQ'մ*T|SP=Yy\őbq !f&,΢n?{3⸠qű5"sY. ʢMOLUDE꺍vF\ޱfy,t3*s}'LaX=)RFE#[EI;P[ߟ޺_nddxd \xckƄܼ|ʦ޽?aڊ!"""EEf鎆}K&@Lzc_Cw]v4U8,X-knB=—jZ.dO,Uw.'-ɭ60^JM*j7=9NgUr4Ά KlWw6jC$#-T*C \3& Kz˜ctmm*-v:3}֎*ipSv% }{d8Ԓ7wS2Lfamiı"&~ P.[vfhh('73r Oxatlޱ+;'2HxFF&Ɍ5|~ɑn\LvU5^f "4J-捪ͦ-ZTf3=%sR.i̹x,pQ)o.. ,㠮k;\'޼<~:Dž-'`ܤ;sGa{Nx8M^999%;;;77ϧl@DN[[.ݹ:TN5;KaR4jo ]rE ><_ɓO}_BnE}frQJ0n]agΜQ 3)%hW-wiw׋ 6nnaA1`&ŰabذA1lذA1lؠ6lw=98r| X$o 7A3&t]w'd4鱐O5'HJ @:薑O>>r 0aCQ"힮3nl6zgO'rh"ݎkEǩ)?ǭvyڴgC {Gi͙3ۉxv*,Sڸ&O;h[_Mȿ 12&Mzl)شgB&9=/zb|-E3OʟS}ٓa&YSD$6l6lP 6( 6( ]lذ 1 bwbb!1b@1b(P (b@1P (@1P b(P (b@1bP (@1P b@1ŠP (b@1b(gb@1P (Dd}bMro(>,bA1xbA1O+P b(/>yR1)#~>=x ŀ'7797)HA1%/S(`P XŠ_P ey( {$BlR\)(D:0A@V,P %Y A1P,㿻A1( |B4(|}"kP h!@R(g7RV̹!҇6w1ʸP@1Šg1Š+/xg1 $2sA1(5|ʌŠ·8lθ4P̏;$)3b~*(i A1(9A1(ŀg;A1'kŠqs1.B@1LpP w8QNP O19b~ݡ/=ϡ,sZŀCC1"W1A$&:|W. A1໊Y _ޚp9=syK1VN u<)&b_ޚ ) A1pG ż|!,f5P >*bP,ܤYe|(CnMh(sٹe"NaP b=2(E$bXkP arA1PLsŠ0IŠsbfC1(u@1XŠbA4ŠbP݊IDC\&( A1022`b>'})߯R^~e_W[9TGᦦDJo޼~kst:~l;{7oY} c#͛G^xAnݺ5g( M: QLHHEu_{gV\y1B!(p®.{ bR8a(f>68.o]>ev ŔJ^ +>>?RPP044V2Q@1)i V kPN|F)YnN;AE?9=}?Sޯ\{D q7C.(x[)?$ԿK|beu5CD%Ş%f==݆-W<Ǻv,{$U Z(&\iªb2h%%f?=wb2;C.\57v8qF=粔SSLĿς i[lb9?N&厄G{E3AỆ]? $藝bŠ4o ULjj/|֨D]<6n b>ꗇ#)PLtD9 z(|Q1W2$>P#2CR<,YP @1wRLd{b"P̭+2h9m6[_.*/(s  *iOl"@@)bǗE TV+s_P b+/($g?ex @S2w,q@1 D/(M=~ms_P @1;uLaQQ. P bOS*K,j_]_o O\iEE٩K/'-[-~q3-㹿ԩq@1;[|BwizFs==+h‰Ϛ5͛tbv*vҥ+WRb0\yle+ͪbV@1;~:Бb{E1E]3ו+W4Mvv񍢣y-)jPXEb?Êe P̭Š?fd/ŠńZ~i*7Ci*◩bP (c~RF,>[^|Z1a@1ɎdF1 gLO~Q_ @1>,[&3>-.~K?<6Ns*1~[EZ(^1x<\e`vob  "-P b@1bEnRںu+zիP 3  bg1DULg1DTد>< b2S `fZP 3s, pEŰawP endstream endobj 447 0 obj << /Type /XObject /Subtype /Image /Width 289 /Height 335 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 180 /Filter /FlateDecode >> stream x1 0Eѯ:Z Fea> stream x \?qڷaD6-6Vm5l^bZ1&\bJ@ Q  žZGsaܹ<̙3yΙs~\]YC=[IXoݺ?֛7o~ }ZI ?awݬ2oܸqڵW`rO>-L$$ 6`L\|`1/$a@^w  6g=?)SwwZ/98p>OJl`@ `zH+Vxzz3f…C 2iSjh-VZu¢'OT(..>}tq=NL*@ڡq&{S۳m#@= 1"\tK2 8eʔ6=^xE2JПIbbb.}wYnzR1ٮL`ٟdzű Tc'm`z+ŻKYmP"I^q/٦f+ŐG|޴`lh\)-)JDO9l닗ړdqɉⒼERQTUhh];vVV)7߈ͻ>V>=Z@7S/ᘙﲬd~#98 ԡFe:H >9uM0c.h٠)&:q.`ѿ5wYaͱq{듢ҕ/Q~&; jkkǍG --/^CH+יiVVcs(Y}嘆OpqϢؕu;Y-:U5JSZonD|B/*yei,_7܊J6j-|=u9uFR){XCr_; 4fO=>D7mϗ1|0'ĆP JY ͊=> ͐"gkĕz.Z"EY[S;gE2]ħ(`i~O0ĭ;?II͟^5%~ܧLpwZA'O:twyyyddׅMT*BmrwQ?وu Wn޾ڠL+~xVX5"i Q'0^\(ZGAw6ڬj|{d^5p)7Wa}h>N]I bxz]u9Ny8 7'MK$ͫ+X_xgd]} RrwFRu vgnǥMIzgd}?>\p|tlvÁWMt_M+]p'm(ɮs?`nႂ^u goOBp܀2gΜIH7"vd*?wz{Çݹ{_)XdYTG@G7$E-(Xx1ɃU*PI3^ۖߐq2 lM x9|ngm=;5ϟۖ;f6Rˎ G8iq(u,LvRҺw'mKM=p.#ZX`qLf[<>v܏YCLh xJ?ѱ/?D8O:4x0C'س|/X }\xqc7ߎYu.ĩM^&a&*`Њ_f.~@J#"kj rs REBJQo"ڥx֓-oQ^rM|_z}~g:xKRx'蓌ܵs/Kx+-gNi).NTr`m[?~G7Å~;r%0  ۗYA׮])Oa[SSh{3ASO5AǎsȔki,i}Q#[SW`cIX:%2}^_0o,|[XX Y胂Ƽ8F -6`0%7X8l@ҥKQa}-(9u\K}k>p8pݳ?ڠK/_,SNtO3m@XΝ; {$ =yo@`0̒7 sgZ|rlw?x ߐk]+{=k]XڀVy⋭I@Wp[m`0Ko@k|(qh1v g[]ON}e]Y7A;K;%"v5O(WīW2exÇ)x*=S{c\ 43nK `0 f Z " 8eoL/8Eviý{1pg54yݳT۴?cǎ,skj3{) =mT{h Y}+Ҟ?̦wގ %`07ђ5'ob# `rߠڃ3`07`{' `x0 A@`0 m$0 Ś ~e Me*fzSE@\p],WX[~82\mr/hh?p.C@`mE\p##p.eh|7> 0~82\68]|Ý 'Hx{}O3}[jm'|Re) ΑO<rwr:# cHB{JlFjWs0t\aW.aVߵqY eK\O)`".0 9чm *KSrBD/ _rm+Ж60l]vUY) r`6 qWN喑4CMNl#گ\OGЊSh[]{n5P6e}ׯ`纹qTwߡ˨K*l^׬8Qԇ臨.ؽ3ֶo+Nӵ̪j‘ft;$z/-/ЊSh[) cI4b e\v_FD+==*hnZF{%嗿%[Xӎ&E0>eu5'Fܯ FhBe^6T%ލzWFJv ;zsb<%vF!bSbO e]t9% KF9x:ӷvaELK0@0.9u^y)$]9 KAn?:r.{c] .^Ƹ֊#:w Mgxq ]h)-|oܱ~1em$.Qp,i6A4MCӎ&sC(¯3_xy #ǟz)!E$l$ J:A1ҵkWO1Am iȻҒBJ2Ez&XܹsQaA}@"P')-0M?I⣋OLy-Z]RrQg9-l? ʤ Պ#*y|Ɖ܅VBۢLfKSMr}ez ZKKMfiGڀΝ_WVݻ1UCggnakgiC%尅47h@JYCc^6ྌ!Q2 qTyZ%I xZf@D!(>JSTn]pD>]Y&{k&H3:;r"[A) cI4b@2犘(C@RԩS>G2vrǝv4 NNz {PJg )"ijF ΉcyݺuUxeg <ķsi&aO+rQ|&݊7~nz¸7}^xGiFGаߘVULmL-|oܱ~1qmen5j6HOUg?1!~ m@Zkw.h #W'7qPɿy}O.c7ܔAq2>aݍ~& OCX:n<7/ rQ|׾w{Wfĉ^5H3:8 "5kB@^swĸ.ahIߙp;O#Z\aڀy|H ;2@>4UXmm[?ݺuN'Fis]0s|۷UFviH_}}?K1fHߐ yX(IivyG1e ~S(\pk+G2\X[~82\6Pj&iƆڏ ɺl|m` `@6 <*K>s,)\~= %00Sh~14nu:rcmmm.ssk`666l qYڵk{nMāĉaذaEEE qwWcܹkMmr3272^nڠ@੧ZTBCC(bŊoj-/}8-M=72^naڀ… =<<Μ92njCÃ#JJJ$%bbb }~ӓ҂f%I-?L6w aS%>cggwJTUUWh~jDٸ iY߿?-jjh֭[ݺuk;EYw>ʕ+odK!v7^nSҴAbb"%6n8n8y%8q͐rmi&Jti, ))?B̙3˜qĀ;kU QΝl5Z%_K.tG"600Bab4GGGOkkk"%r3]hB`h1cF)/ʒEFFqf6K!v7^nSҴ]S~bnnQ钿CrmpgJ fiyI660j`y˖->>> Hҳˇ{J7vXIum]֨wʋ8teeeH66Xm`kk{vIxD #DHC3~[1[i n߾nܢ時]64UUU$:u$ϔ˩T!U.Бݻm=4ӧ8h m ?B$}`RZe>SOB=ػk֬i6ڵ+]řfZh)"444::V&jLKhy+4PeC~RRѣ9삂dSNDzz q9--mРAϟg*x(C'\jR3HpIwM[԰4mNS.bBBB~ d^,\DY[[|||.moj;j@uu㝝(,,d}3%ewrr+++Y&ٷBǁ2]QG-wwj4q-tIeFsXhh6 hh66 hh60m䊌lI32Lè Graĺ5@Юw\&NhooO6efdd8999;;zJ[B/s@Ҥh )z&L;w.J$ShF]fM/wMD4{'9QQQXbƹ[i ʺzd +X ye׮]<޽{iEc={,++Diii^,qHNN2e)}E5.0عs'gBἼӧKƒ<[r327lz4.\Hc̙3,s̘1tF1D2+R"&&k۷o===){nqIz'y9&/\ AAAZr1֚$:ÇXٱTUUŋF˴+[em9 q֭nݺ/-[ͥ%2747;tpmJܽ{ёeRzW\%n&NfeIr[/ )qqƱK.ĉ'h(ʵM(QPPЩS͛7xoذǏWWWKen͛^8=]f >x`ڴi)))} erTnFj6:_^swwE_~C Yd|W .\H"}ٳiN:'Mloo$Z[[|||]Dmsj;j@zdd G-TyeevB){'8Gz,((^ơ.jhPNNN4kQXemF]fM/;?6 mhh66 hh66 "##[XC](dFQCӧ'|ҭ:˜8q=kذaEEEuyڵ]]]Q]73##YSZR4t:M!tsvGm{*p[=<BCC(b o˷-/uUm]vaw^̵#JC5<<|Μ9 qТܾfٳzݚLҟ/_ b[;v3f BJrĈ%%%€_p!)d:_SS {yy=|K]pUUU$l5Z%_Y*+n֭]&輦kUqS-;q/s?77Ғܭ4KJ*Ny#J\VV' h%nܸ! 'OMBy%8q ~a'$$H̙3˜tؑ]hP:wf2-ӓٳgGDD̘1C.ӅM ̜GGGqМˆNYYYI II.]Х=] D^ሒh#ƃzljhZǏgݹsG>v]xE2e5j3evAm`ccS]]l݋;vxSrrNv,s\C:ݕm4Ztẁ$JPZRw+5/11[lQ:q(6rYa<@6X9r䥗^^<\yd[[[څ}(6hg 4888jLKh6SNŸtĪ*1ew)gz']<ܼ}6%޽+__[IB&-OjB'#*tGlh}h׮n 8Pzn/s]f*W΍'7 HvW8PK\6`ĉT2 VTT$_;iweqhSBCC(b Os-/<<|Μ9 u\97rDenvJݻ􌚵{峁js0xI^|9((;vL&$$IM//beo9vvv#HjLKh bC[KJJ 08ҺC\J̻w>ʕ+i_&jiY߿?P/s]V4T97sQC^4eH޺u[njArg 6lD||%;ylJzxxHΜ93,,7n`Yo:vȮU);wVh~.]UI &4+4Jhׯ] .GFFq}ɚݮqttdJz@R97sQ-qY93f̐dZ[[{zz={L{峁j]޼yS"Q׽{wLVjf DJlٲGuF23mDJSߟ3t9+rrCGrw.+D299Y]vMK޽{aƎ m`ڀrV]#h6}@gF˴ ^ofwqinlOdӌCNwzm[K)~3mu=Ľ((H6$$Dӹ]Vu{/P]]Mj{aap}ՋljL<yyyt.z*gfdd8999;;zJk>}X[[7hccݮ/,,tww0aBuuB6BL$˜8q=2lذ"qSaXޭ]8+r2~%CFEEQbŊn5Z%_L^^%\ٳgϲ2JK.gee]zRFxx9s"ܹ{?B*W ή]>>L_pA˗h+cǎIԄЩAÇ ٱWUUhWh~w>ʕ+IK5%rss)]U235:t}6sQCU^oݺխ[7qS;Zޕzrk6mbTcpp (?~x.'Ofw<<<$[gΜ7+ӱc٣sj-/'tuٯ_?ެЮU2#''GX4CMJJDJJJN:TZkkkOOOZ@gϞ-ODDD̘1C!tfpT莖wtG¦@Z;wXIͲ̮]޼yS"]w.<#1,jcc#i$ggg{{ ڐNw~FBFè7C)<բ}%wrrܡ 2dFUnyrmewþHB#Lh@6 mh@6h y&G42Lè#qk`666MsΥyIe4kײtuuݽ{7 ӧ5w '''ggg^Ofr+WF.s3ͦ;-F"444**+V<|2-H33gg^^ӹ?z=z`YYYW^~^BϞ=(QZZګWfr+WF.s3ͦ$2m N,]矷ݹs'}X[[7)n PHFF^ i &TWWL(4rܫr7юalu33suuU{ӦMKII '%%=Z;1~޼ywfyxxZ?@$$$oȐ!K,/ ֆt:777]DmߺC#S[eeO~QC7?GӷXB~~~4' 46UVVj78\Gh"YPP;'''Lll~dq1z4*tٌv|& mh@6 mh@:o#ІvA'4;j@ppp>}׮#y'̌ '''ggg^Oi3^)H%&NhooOÆ +**R;w.G,,,twwj'LP]]ݦ. >p@3e#0BCC(b Os-/uU_׊#M̞={QW^fn/'''O2xd]v=x{[!JP^^Ν;فϟߦ. ϙ3z٘'h˗/qx1QSSBÇy9&/\J_zk^t?okkˆ `ٱ TUU剚F˴K04jΑfk___Z(Kii)..nt[nu֭(I*{ï\"6:t}6ѱM]fV3cǎ\ܹF˴sD ֞z~3Jׯ]WTTe$ܥKv@3fh4J###$J{ġC&%%Q"%%SNF999\^6Id6ڠ{“&RuFk׮7oޔfRgwQ>"UPr ZK.{h;v, V(J[6c%&&Rb˖->>>]u:ݵk2v##9%<<&I#hcޡ hoQZeEڀb~ȑ^ziԨQjjNh/l5Z%H y \RB-W#^iYOMMTUU 9 QWNw޶WWW͛{nN>}R d Nx6 Lw`Lm`iZd0 ՠ `0 A`0 k]m*f `0_| @Q6PY9C`0 *lam`0iY m`0q-68]|b@I%0 6Z|i 6Ampkw-B`0 f4m@L i? m`011o`0 m`  `xS`0 S8`0 % `0 60m@{5j5%a0 ʒ^ `0)1`0 f/kܥ,: `0{ K`0 `0 `0 `0 `0 `0 `0 `0 !QHAc!¸2d=kjhc:0{ܴ%f3\0~0c8Yr=1!&s *h,ˆa2Ǡ6@B`rF7LTYhD# = maD0d6@B$B7L8 гF 3ˆA@`\A@`r^𫿽mO\;8 /LP'l^W%%GQ9Eyo^쳃^o+N7-ٜVy4;(T?~ZqšHu[SSq60馲Ǝ nfqi=BU=j1oq퟾-y}֖huj#̋K賅jhkmL[ڠ*iƊiZ60zg?̌iRL 8GnF&ݻ9t@{o=[%ɣd;gIYVz'L\ᾬܳ`>ݢ0rl/9U1B=˖E%maC=:lͼv$B oޘWplt6@4v4)UJڱI/wo&0f;-ǏCA~u%vnh˵ANNP8n 5$thWb">F,Q˗j5&z9{4`ֵ%}[*x+bXz{OMl=~7wnOQI:NN16~ y )̥KbƱ]5#wkn]OWsOxkjкh:ǧzUAiIBqlE$PRwfp{Ν (Qr8.a+;:MBk _(Mi/6Bo@WR?mSy<56P>&nh%&9:8TE^-m/zQ"76LxgB61{`H4c̫\8L?n;v()7ܭA߾O3F$h3d6XbJv$:.>NEmEHsacF*I^ViܚM~7w_jG-|s\<?b0}F"7NqܳOSF$įgh5yc^aqۜn~$V Z|^:eoϟ%wS)b[16ݻ6XQ (mr3v`6}8G3G~{.pķd-P#d]XrT$n/+4n&.~7wHOu.]z>-}:G& 6:q>N1w_yߠyc^aq0h@{gk2Ǐhoo7`pɠn-.:N~v@Rb-BzC5N}e|9hw[B%_06XbsQo]|ݿvwwÑX=~j_607/4O#wj?XþSy<Ҹ5wO7I+ͺ!ݞU<|%/6P6:q>NQs6x ½N fy Ř7bi[NY &gKXH/(&y]y3q q.é١Ш6hWSV2 ;~r~ŴW B гoaD0cPAg p!m=%hUm=-Vhh,j 8hh X0h aB@`66A m@|$ C@`66A m -m|М FQNYT/j,9M?w Z61"z> stream xA0 E(ips *+My^q[j[rj92 Q" d0 5.xr~S endstream endobj 439 0 obj << /Type /XObject /Subtype /Image /Width 692 /Height 320 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 449 0 R /Length 16310 /Filter /FlateDecode >> stream x \TUW\DdGYMp Ѳ|̰L Mp!\@E$AY\\{?s6ܹ 3wϜ9޳߽s#ɭ[*s{q۷o߹s޽quOlzCe/׮]駟~}ZI 0o%rh3 &ٳg0` (A/)S#wsZo&77_zIWYY(dIb5|9sT@ zIVї/_.)))--=qY'O+(++L*@P}o|33[hݫdؗԪamk\xD zIҥKk5hAbcc\ K6J=n,[yIZ#%X*Q&yJE25q'Uu7wYs4quUS(Pdeeyy ѼiJOWW+*MC^P*VÇ~7e{]<==GuƍJRoͲq2cJ9.E{sZ7W\ kL0K/3"/LI.Sܑ4"]hԢGf%,\⣗W&a c|\|.Xiߜ=?|嚍qSmHڶ~c |X8Dв_ـO>Y8cPVVj*&o,e\e!'^^p |Ր@TLr.9%2߰,-Z@3^Vwm8fr62\*4t_uV.h> a.h RLtʝpI6 |ecmYn5—0_S~"n5jكTz믿Λ7?`R1bh:w`Ls;7^d-hY֭[|ڵk)S1OgDK$JHKoMulAFuco?v֣ܹ2\)ٛǓfʷsGe2>%;BDR |U(/<,2-E^}ϧ#ML<I356s:O*ժ*eɭzH J>2پ˳>m{}ԝò:OyIyCs,Wa笏OjצY$>yΜKP|Cer$f~AD9-7HMM]`ك0oi_o/3`WL6msf+\e19DMlO+cHZWei*5!)@Zl&U<ڏvʁIwb0ZCȑ߿g?!,p^Aށ+T'/l(&ߟynz.Hcm囅V/0EC.(ړ"O4>*eOJ fGTpм$y𔜂ҿԡ"G|i ;=銆!)8w\|ƙsCwep[ھ#/JHHNhYV^VO?5w`޼ydLUb;^v '>D!3KCzvJ*l(vo|8A) x=,a7^2š(?XJR$mOI_X!O m/X]e^JU QVPZ<ѱgg+mӐ:UƵm5tQᮩ:" )ġ-ZiƖC'Իb1|=iW~B3/_ސgK$${,1eg+7$Rn@ fvAZZ #A*=S\JbyyyETҢFPJ5\[;H~xqhAmR^Dl?_|M£DGmɅE'CR|駛6mݰaúu(7nb+uRҙo'())Q~YY)HG['C"9r/{a2_9c]Rb`V"-(...-}t)ws4JD(qAAAAAAAAAAAAAAPk! L֨7A  #Qyi;1AoTc o! ȀA}}]kK@ކ  Cp=roAAAooAAAAo`(''G{޽_m٪jތw[qn&m۶7 M^lmm~T'@k bWҜJW)_:jm[oA.˗-%J6؟]=vG6m_˾k[lWVހ&A1_7xwYLӶ} NaE){t߻5iGZ*A7P_&@AnS7   xxx  7u1C@+h7  ix\41LHK!R^mT^֣.^u4,oxzF#b!!@C4Tӊ77`x#Znoo7!84p*,87`xxnTR˴)=ףњ,n۶mq QF ^o߾U+jT}6SЊQNNv{[ijU'xWý7kQYC>MKѷ oِH8T<lKS;>WcXޠZn2)5҈CxfL[ՙf,F"ݻwO5!zcŽA;aF?H=ByOC9lp~յ#-u-8FG$i ѣj,tٖFtM/ 7,o@Ֆi oPv⸅Eg'8ށS~{fuԷ ,z)7j*4:"VhggsV{eQ^^굥p&d Q-\@m7hj7hRn4"4~fzFpΞxJܷ|I9mڴ$mB"b4+|B=k:^mQ5TRM_~b'hҚ>i={>WR$FG.14c hzdw-!*z })M <4O?ͦhE3:E=ǯyrW]\]]N^xʧ@SI=J, !U69bƄ8JdNco@N1>VKo^}9)xw%)Fq{ԩo)aSATC_/jk@j:zTY}h`ao4b1%oʪg3TUyM]Gp#Φy4A#M SxRUz })Q&. Tx6Zo@%^;֔do~6ԥ:t:PS$%*ʊU6ܹ33gco{; mom\cwҒ'Oh*lh }yޠE!o} ( TƎܜ_Eꡮ h$o@wcǩYU嚠2Dp:25Ajey7JC13T)<* o蔮^25Ԕ$v!0Q7%;+K ( TxY.76~\7:񫯾"P}cHyAScĄpT)@T]Ś ҶлR5-I_*O5TFés8oyGDq>q[!C[@cǶh3+z::"7{&j''G҅'@7T}@տS 9jpT v5XݻS%o(PEy4YjRҜF'&XM ܋ҷط*"r),YNM*_UhM]/P=J &]T;f9~rY~sa!*>mKSro3,vWZ$ހ2U{9h#OiꑯTiSiwttPxވ6o <_yi[=[ѦQ ix&5_vyF;ܻ(p"gߘ{&F77WYC w^VVϾޒkcVF P=J /WRWӉꠠ="oH3NWi$*>zo)]7Y.׎ihMLkI?}$}}W47>njLz;X-o j2\BGh iKi, t|V=sg2BZB ooo7@H!Ax ooooooCC Zh󘤡41LHK!R^mԽ7@  oxxA۶m]]]򚺹yժU}uqqD?>}~WW<0svp iP2q%opAg*]ao999 _JTVVvKN_OW^С6AJӠdJT %&LtRr#FhB||w ,++c4,GpppDD%u|/^+ y 4 J,D m۶C>T}ŋ:ᝀj,a3Rͷ,aM4g >۷o' 7uTpq 4ox7 oxt8oo`(?ح[7W{fժU\\\233YfPPeR8 0TT/H ;-Bpppxx8%"##cW^5߈X\~?;޵kWq}JٳIT/Hf,$x=bccs%Jɝk o žpttTɼ}6%$tW)5D2c!SSzJЙ9V@x&F@%?44tڔ4Е^Ɍo@70ܞٷoߐ!Cs]hIxx4m7!Z;;;MNy JIIiQ/Hf,$x=Ah߸o )++c4NMMxb%-tW)5D2c!CyR)K g(lؓ9,ĄST/Fxx77 xx77 ox70 Glmm (--D=SRR4f̘~eرr)Еp# ᔈ}gddܿ{@=C ==>`O<ӧ)qԩ'|+K! @\t555t) ߾}@=ӱcǻwR޽{,ǎD^^"X[ 􈩩i}}=%fff =/PJRjdBbm7#+/^I\|޿ҤI,O>YYYػw BWRC$3k 1^LLL,--]xzzg111\cǨ+K!x77 xx77 xx7 CѮUV%33L```nLLL3۶m@I ]_J 0NH1|89UAUTT襟;vx]JܻwKaccs%JJ⩀_R%W"*f@Kc@dee⋔>}zll, YW^aYfmm-K{{{륟i&J$''a58LMM)sssW<0KHiX\p 44TKc@L8q͔8z/ nݺ]tqmcyyyC qvvL2zSN !!!;wR76o iޠÆ{47oԩS=z*h׮ٳg7XXXܸqCeC*|Jܾ}[w>}K]BqS#Aŕؼ[jbb㹗s U&LXt)KD׮]ϝ;G+V\|~I&%''c58#""({r\T/%o iPbq%Bo=CMMM^[ƍsvv9r$ˌѣrrrrpp􌉉:kF<è_,|)MxQ<7 o xx77 xx77h% Gڶm;n8?[FS䤥5,驳 ֭;((֖"g\6@Еp)v!~ޠEDdd^z7ܿ_6`̙cǎq.ξz;##{qrr}JJRjdBbm7#666.]DMM lٲe*… 53gS iӆƲ//={zݻ_r_~QޛsA2\&>|8... hѽ7}T/Hf,$x=bjjZ__OP i߽{RvZJō=+hR~bb"%;z)1}XnJlذaԨQM,Q\\-Io:yd611![ow R"X[ Hxw޾}Rعs7n޺uבּ;vT?ĉ7oLGr[ݼyw=AyyyC qvv&W{DCIII׮]SBuuuaaa#F@ h A_YNހx6nب7]4y7AAAd:uԣG ڵkwYMހe߶߻wҚȑ#zz^AJJ OMM[d"X[ HpppDD%E~/"K?~۳w )py{g`$&&?{9wЇJ)_;[[ۼDAUTT,[O;w˜3gZ݄7-o߶Я7.//GCɌoGLMMYރE[N:ݽ{W=%iaRY4@ 65ˌfs:ydSa6m*/Hf,$x6W2dkǎUwM޼ywN)֭[l.N]#2TWW6b.ڼy/BM@[ Mvvvg=߳gO]۷LVeq.7)IIIq4s="X[ HpppDD%E~/O?"vڕ3b uo]vnKSPTkk/_qqq44,=k֬LJݻ+K! @/33f`0c:tPY5BrssSQn.6ȴXZZg u jo=ٙ+K!x77 xx77 xx7 CѮcǎyyyQ=_nƥrQ?iiiͨ**Ulmm~Y7qiD PZZ*N111T/w TDddƦߧ+²6`̙cǎqn~:ʮ]4سg@8%%%?җ/_6ЕjɌo5ҥK@ԗ .SW YWW6mڸ*`"""z왞~,Zw~KK_~9sϝ;Xʙ\bzyA***Zhώ۷o[XXwyyцT/Hf,$x=bjjN\\hك &lذe]qqqGXU$&&>T|Oz)1}XnJPF$oP[[ŴPFi]Z1'ON:M6Q@@@UUT/Hf,$x6TWW^sҤI,s7nP9u;vT?ĉ7oLGr[ݼyw>72d+[}Qt<(III׮]'dzÓho Ptnkgg' _~ x^oЮ];={( tCPP:ѣGOgjR#GzRx*HII'Jܽ{M\F"X[ HpppDD%|JNN\s)s)y:%l-"p$&&?{9wЇJ)_;c{][VXޠ%|||t6"/^l4f͚ػwT/Hf,$֖F7h* S====rL?VC߿?H[YYQ pK9sQ СCi^ݛmBKw/"ԽY=zxxx̟?_ {FZg#B&Ғ]o ~3u]IIT/F«<xJD Ђ!+o71<3xhdyN0ro@*,87~"77QF dZoHr$5@A$U@AoAAPz襋  t vAG%=no5AuM/  @lޠoAA+Zopx@APyʡŗ`z‚nZ7  y`Z r3AA7  o  )oAA%  @ ހjT!ڔ  ET}yĊ  1KWu  H_h p0QAdTW`lQ                H !hW 'cYݏ~{ӑwͰ̌ ipM}!N<)4f6t# 9 # oonDa2GP`d 09oTYx|Ѝ7L*x,>DF&s| 0oa7`rF7 09o+xxLX|}֨d{7emK_;;=m۶mý7]-Kr;W9SĊQNNv{[ijU'WcO>RZA{Cr%\qI6[S-:i9R#p/۷o/Y7hlހ<0'{7#S@A`֎y[ϞϥmODՙZv8 vu &aX:>=7x̰A3"ӌ%6&Ѵ o[G{i۾7A(7 Ẁ1PQb^֥őCU2hggK~u玭*nى㯾MorV.ՕڴiCI;8?+yϬݻxx}f闷š1)ˢrYpd^pqww==9ݾ}--]KCC<[Zb.})~]rIQLM; zGрݳGяܤԲ/~*@}B7c:%ḄƅIS1{FC{5O`P$矅13%XZSż hm38rIg,saT)kJ?rKRT6%wn}|o`ffvX`x+K/RONܮn!>[J 0{wibUOC-iShƋ\ҽTJ*(7b2.0xTJ,{6q>vޑ&>V9ZwK f!FNKafzUcРrݠP^M')ݶ!+w <~kpZ:Nǎr:wH>Mxߵ|8_k[SɿDsСCxS%[aM(/-T ( QQZKK (QQVDŽˎN!W[\[(}TJx(t&ծ];zxGY8y,ro q>vM1ήһۓT:&?/dg ~mB{5O`P ({4#\8o%Ea-wϲ3ԍꖠy)$ o,PWǏZOS^5Do. G̟ac^%Q4=;Ꮫܤ  v! >b쀀 SlCnh(voSO`P$ 0W@k6y1!~ۘ.~8rG4wi~[j*҅>Kc\]VӍ"c4^_KF G}Z\a#;UeHݳEiMjHHKuNvu̢ (`orȽA۽Nq>Aؽ oмrm ζOg1y#XYT+{swwcwaM}{ רCiAa\,{ɯ<`[aj(vZqssÑY=tpzK> <'| dWw#w"Q}7#Epܱ;=|ih C{x?}gMॗp }!_4#\8 1?PG8ad h09C7*c4~S]y3q b(qpjvW7hfdj4utZC*ny iԾ`M `q#oTYx|Ѝo?C7 ooE A ooo#xWpVxx,jZx,Y+5-qY2?Vxx,jZxecހ`XR" :"|NYC)/j ?<2DMe^'4F "tM78s挲1x  2zecP]]"@Ad@17  #N57  c*f@% oAAF 7  cQ*xo endstream endobj 449 0 obj << /Type /XObject /Subtype /Image /Width 692 /Height 320 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 300 /Filter /FlateDecode >> stream xA0 E(ips *+My^q[j[rj92 Q" d0 5.xr~S endstream endobj 455 0 obj << /Length 1467 /Filter /FlateDecode >> stream xڽWM6Q\S|4EKWYВJw!eUEh>cVdon_ ffYU6x V50<2LJ%# s{}{ڌ+:Ғeٻz<ٲ͖]œA hUe$Zj#hjNZt+;i~&bi% ՐBriS磖'bأV=UnIjo0{E]6۲,A>qޢ}2J!A_?X44l]amR8֪AF\S«4q N;R 7. (.(288'?;NVe/y3+45^֣}BҀ= `N!8`֐Fs㳑~‡yH n'%d^%*QlJ T\a@/tU˂4,^apIf mryE=Wk/7 Ã58 $&j¢BxG5Ey[PFc_޼ tyz D5ȇ2Psg]s8pQ\+HMy]CPt Szt>%,0mZn#9ir~.߇m:= [% YQ\,rh֐ROAK1?`T(KUZ~3̯ $v%XIEiBi2d?eQ?;9ap. J ,y)akyrJ0wxk@81]bɏ#yEaRhѐWKC Rר =skRBgm%\.ƶ~WdaDcuQxQX3j|1(J먝lL ,$*%ԗ ~F*y*'Ajt+yUTWl'uGW{ =ju&=:7c<*qo4+x<D6 !5"uYt(TPW/-SöE ~9V|oK FŨ)y^/)p(S =.{azϹ0.k%^ E|qOdm 5mw!#&q(IٰqMU*L痰Ղˊ_laWDa> stream x{tUսwG;9wiϽǶVXwCEu8ZA-Zx(Rh hE@  $4M!! }kmj{^k5k1>~73:/o_s͓@ $Ԅ Sӟw![@ H܄Л0[9!;?w{7߀@ H|pЛ0ܡ=v~k'“?oNȋ/9!Oўn4666 nnnvsB>}H 7sBhO->|رcM4'dIvBoHCCC]]]OOϱcۏ?q"'9!ɯr$e5U>Rܗmjx;PU{/kUUM}]t^h +,\UgN>C |`th;vd2'O< ]]]س_Rue7{o,+wo??ȏooIyk瑏jr5tK9 60(5o^?}vMs|ݩ]&uNqPO6^z饗_~lv7?%'ŤuԪ>EK} e9Āz6RkTrppU?+CIYv $R;sX =zeW_sӔy+/_lSKW>󗬸wnoN} OM3 ٳgˉ2w]}+9wM cն:{KGvX6a脲_i蹦eq'_[^O~PiYU՞RsY:hoYJF4f 2r)3_2߬ݼbSھk֚+fxOn;'ϛ7o .ܶm[]]A9=jhL&ٷvYc'@>u3YTMEtO̖u2=KƭK2J w0-]Ws`cź={Uh$i,]9}}--Ue}Ksu8u麪}};>ƖƲ,dg y&lNKw@~ f+us>r'g?SX\=t:Uuӗ7$gpNUҙ +jȭ#9{9{_ EUtgwD ҈x՛4j>ᆃGT[e+71}ޅ_aɞ={\9r/~naݺucO!G|Zt[9wSwF>БA6Ϯ"-ϒ{G/s6ٸ|"[e/P1&;ggYzMr'Iv/">dp;e)1t9mUzps9eζ;ɱ7:0 Wݔ=7$Ǐ8׿tyfE~]jں TF d;ؽmQPޓ'_vb6|l[-݆[hnBZv)6^aJau٬_[ٖ_]>~u$' \yPY?D~4i7VU5o:t;yh'rL/YHtd|G'd߾}'GYK̫U/vԐyٝds,䀑 ;ȉ.i|!YYu.$?Mۚ)y?sκꗏv_A /2rgsqޓ7omػ‘kVuYn2kݘȑCe8sJw|f?ucCOn*glom_yOv90ځK]5P6vnvg5Mj͡Tm&.,wksEsu)wu>c \<_?U'Ozԫ}??n~ئ;f̙ OMM*++yQFM6ɑ'w\Jb=;"5dn[vgqvA&IT~~cOpjS~ߺڶ/#C뎸a␠UMAqٺ)d,vl>urOgڳTQy;޿t/I&.~ڛ݊{55 nѶ=397CVɶˆlncQ;d۶g\uy[ȞzykבNI&v:|0xss֭[2MMM7pwC9:2uUtLjxɑ摒3'l=~i1wϾ-e^F~9-m:XmK\XmSrvfO]4Ha s圽v8c&Ϝ+m-NfJq̔'.8ҝ,4'ƕ4RjsL^{nѸvQ.%vIms/Ƀ[JҒkyX{>V-nc?%9>lMVgKؔ\,2zWμʳGoëה=*!&Zzgg'!s/):!=JǗ?/\|} &{("7vwHHHqܡW^yE}~ذU+x3s饗lڰs'ӗ~ٽD.{ÚHptg缹/sNn!_"d}yHK1$$$5DYB?uOy3}DgwW'>  <@6̿_<|}+!K~_\XJ6Ulsv;_ #ϊk>|#!tw.(}!7cHHHHvj'ݷ>/j!aqQw/?񏷷\`}%҇oʫɯXWҗ;;ڏP 」oƐ<X|~JBދ\Ur|#* ?яz}ȱ̓WoƐwٮܺYr_;kȿhfA|sȿGsз^_HwWE \J[~9⋇ 6x%iM8n65\r\t/}{wSXկ\D /BIr-wYoӟ&yr-;HHH@>WC$$$$ݐO I]HHHHE#!!!!HHHHH< 0ȓ?\ȧ D  =RVHHiIRTuy!!!!!!! C  C  C  C  C  C  C @@ @@ @@ @@ @@ @@ < @ < @ < @ < @ < @ krR2 o8&%a!]IɐqUq:NȻm yc1%8.SБF<:* ȣf ۬פ)}5a%||9Kr>a-6Qy@>.-y@|$ o<|;[| H" ǥ @@|AΓA佶D ĺ8XT(g,_}S"/|ǝV H5QJv1Eb~}?Rb y>h  :< _P|, G*&ϟ->kA>Qw2PX * `oB?W;xǂvWX  BISS`;'2 Z![_U)+.HQ<y@!of ZBމ7.O CGwPq>C2y5(hq{ /:3{461t v, " 6s>#C9E\yR 31:>Yhy`^$h1 /ApB|Nu¸󼐷*u/C<{)* ~X-@5IE"< ohX Oaak[IPya-6țyƂKIȽkq>Z#ئ̳Ăc^yy'k!n _4ȥQ߽ [<5@Rul2SU8¢)AT큼f 3^Y0 2/Cx3*Ϋs o3Ch  Z pWE9d*_ta XF[Č6d\_fb4!B>4V|xVU!揑$!g$Qos mj+ʼ1F| (!|TK0N֭3Zux b/fțTk{%0s0x#r5>e_N& U/ +x^OHPͻě|QA^!+j!pݫ,(VzBӴ ETq^Z4UukhR s^Rx-c? l0)3G(l1-+ Ӣ  -iވ'/fgOJ7K2ajW5j? rB^,pW`OKxz5B>1*|o F#mWyΫRj9e*KY4s:1*Ӹ ߣF!\(沍 zbD=f۹X /ir^D#xa7t@Lx»R\g!,QmzvX\x9^S.<y[Hup^L%Zzfߪ H@'|.;]*嫐 PP/0Рz,_G*di\ ϮSE8&ßNP%-TiG24FkD9߱~F] xIe^^ݘ/ycWym%,߸3 ț<}U/hrFQgT P.$FtJP5-dLק[BWYZiϚC>tIʌ61`+&KD6I AoF7̛'¯^5^ GFJoGʬdkJ~\3:jy c+\NjG_PwyKrnC~O.:e?ykk"L2.iEFԮf2!p=tI]}xhnd `MAzpsYeҧGNx?i敋%IJ8E0XgQEyR+QN3Q4dUO(5p}.6Ca\qF‹]ba"A^!WyGE8 fX|x԰fO!<Ł,M}2p\ d}'o&nq* aYBp}Jk!@ 5i3)<[!2aɕF~F43 ,].)iʠ[y_kծ @C9b&vFvzׄ>GZ'k$+Jm85Fݐt@>4p_} 4ܡ2(7ގTP L ,+4w9_PXr}<]_Jy.x&@!S8o8>-Ȥ䭍]oT'ͶJoCׇA_XpĀ||!IOfv+O' SXC^`j?@aȄ#cPɆ|$%c >^f ϛ}! ds?>| `ã`5[I P#0ل=./Y7@>}ِBjEҋzUy?Q em6LK@$ U9%WEh#- w)Qڷ OfI OjX["qj VP}P)/xCeEx` < oHxF qV^V(<;}2(HEؗx~eGCo+ ^ϢN,Ԙ򘄀< 0ŵ8gG8/٥V1սU%'5E'< P#as֒Ωj(:ayUjf^<;Xb1diF}XA&%걉V8 6@^v?OK>5}ɠ@xhx^J`/oP˜-y@W ˓Ky.+we+@r@-6nbtIo&W< Ҍ_m6{GrN!5^#O  O45PQ]A}ta&lM^3٪) W85| PCᢰ @x#RuxlZHx 3le |yasL/ e5.0cQwlg|P#xwn+LY}L-Q" o̖T{QY5+PEy9b6 !OoGkyuj5-j|b+01,si~,QjX-ykq\oź\{B›~u[ f /N5eLea.󓁅#wS~i=%? |!yV'uU=tqob^: /y3^ٍ64y_'-˼ HR,3J% -F|KTB}-Z ּ `%%5kZyDR+[WM:Y롇vM/u/M^O^hcMj)() UJS1>w6, Š4.p,(IMMI_)[j_M\N^lEǠgT&W{kHjPk,xM^)״f6# e!ᅼZ%0Fg{ƻ %IA_ΈĞp"o/UyE>13FfEZ=u0'ޢ &OQZ#伯w<}*pDW#B*\/]v'OƸ\(#B٠wh1y}Nnw a%ny5fy%XyPt:/k1~}R1 m1.pYK2Ule8u݅픅/`Ha4 @>*B~%'i)L\'!QymXeW+xyH1g4 hsaxvnխ1M.nQ,lAmVӧʑO>|Is9x?q>C&wkނz([h2e4$ Op9ۄpO޷'(Œ;xS$+ < KöP<,EN8"('+?`Z 5Jbrspqyk!{Cp DM*ŒDwcj=hXZxI;yI;CVMPPŔ^%gX*)a)_sO7L /C>1rYTKxUm2 =/ |}Y$%2XN &C"W} #pX0jgQyבBP8Ge^M-6^1vBx^ Z,d= oޯࠏAqrd>qI 2 d^|' ovxAO<$yQ.^J;\(-</y[ ` r&6|1>t&;CZ^c!_ya3LXXۅڄy"<2z R2L4\4Ig8xO|hU:b9!XeL y組VYB@sZsͶᓭƋ5}&F1B1՝E- ax;ӿBy͒^OϼoOO91ŀ͐g4γ;貏E&Fj& nEAf?y#O hz.Dq$.2U-.Y aFX)X6bOH^a5ʼ)S!0YkF݁MˉWHxse{.I n[ y յ^qgvuHG_oM^ 䅕yJ0=l7:0֚8o/0ˢG@O*Q2w)1A9TB.7㈊Z\퇼p;RhvADU-k"r3jAsZeN"(jk]R KG]kh5@^B^g^c>|뇚y%/tJar^"ٟq@^u@^G01.-<補Q%?~ȧխAK{%P uyW 5^ez ЀJaÖ́7c vRw^9}9YxS#b~ EUoZCB 8詪*}x*7ތ2kI9o4iVLHG)thZ>aDTq>QoaaqU,::GwBK8wGk dXx~T9K*1wR,I霏;ZM73AyQo)[(q%M_);ckgu7/]=㝷VqA^Xn]5F 'ik[CP|PT_;W*]!-NDdcx @ @'<#I#cY:¨׍wUgV0f[ ʼ)Yx \w§SAa\00`}>vxJ,ZG>6/8!vz$#S@쓾<-4=z-<#ȧGoX>(UxWs.NdieQ&"|90Č|ui%9({_I|H_H okWc{_EPt1^>.)ah,WG y`/֑< ( aD(v4M>5q7b&։q˴, <(/h_ _вDHŠ'uhq<D(<@^g @y@@y@|ZEHy@@y@@"4׈- C ]< @y@@y@@y@@y@@y@@y@<<{1yIgcʕޝ&!/gkS@B^dkŒf̤@~)RĴQg-F<*M^GC$_jL$eҞ&{>{Yׯk= /Ϸ?dcٲe'NxWN|N_*Hr7'k_vO.BsRq?}cǎ=tWbɥ{y雓 !UGYfiʪSˆXbEWWkvwƢZK὎֢||sBzG+|3Oӓ5kָ)>ϝ;lyg緿mgG?ɞ̙C6~ӟo+))qϜ9SpdY[[[^^|ld?p@MMMv٘0aihb_򗫮*RIP̛7OkVĞVGg?s;Z u-z |\/>ȓ7ٸ I7tS&! FƨQ?9r=G-c1wy+$W\q{#ȷ~w@^ub y|35c IP8U/bbOU+ܚZK὎֢||sB<D^ $ɷ747v|D yywiaQ{I#۱c|^!ɪVGoJ(Zh= ^[oغ/^,L%.첂Tk׮Unёg|y?Nw޽l2g{ĉ2d1Y;!=ǛOߜ+D_V%5W&S7' їU15(㦣h=ߜ3u97*)>ȧ- ȧ!$YGX\zy@ AC H1C>^@ <$ ,!$y#7 dmC>@, Ou<)#!!!!)6y$$$$xA><R!Kx #!!!T/䑐 y:aGBBBJwy)A endstream endobj 457 0 obj << /Type /XObject /Subtype /Image /Width 503 /Height 319 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 245 /Filter /FlateDecode >> stream xױ 0 EAOPr y(3ޗ,9"bm;?'Z1$}aU"u(2SbqPm$~n$cuq\ endstream endobj 463 0 obj << /Length 1610 /Filter /FlateDecode >> stream xڽXKo8W(*QhZd{`,f!K(5p8E|Cr8*mgE7D1p-j3,a$W>; FMПFߐfI(R{]E Xq^҈5oh=f,׽iE-tl"AwZN3u(S늗5uuGתuVMW-$I:[I1ܕJcyg_hڗ|j8 %E( ,hѡY䅷_(jR-\=A^],;4hwfk7N'5_3Q]x'&!OI ݱ!{{~->6=NAbؾd@a8`o[1n vg0Wqڦ6[Q=bvEvI ziȡz4`/F] -B)q7Ԥ=!;Mgki7q]"O V.m_c5I(]+ T$YJ)9|TYOy&ht(YQڮ;sM+iַ=Ťpej\;UouR\*UHbBa ^ҡ\Ȁǻ\ En;ON(;54tEp=MIŏٰHCN> stream xڝ˒ܶ񮯘Ŝ* EĖ,RѦlWw3CCzRr' e޾XS*̭ջ.ջ4Ȩi ۮxVǢ}~^1NEa 7vs wQf`x>O =hj%R&eG8(:: zj {{}{|{#_ycMLgo߷oc*qAF8_d,ۅ"/MY|:M<c_m }BۅkPR]}Ĺ0w00Kbe9Q&ND؅!(;@ 1*C3byg4-ktEq˷hY jHHiDxHVhhHlS G}~ 3'ЁWNBG^ 2ME ChC0X2b8"3}~{!<,ceː Ksgt,,{mp,Zr7 jgFGlg5f,qlt :N[\9hg{c/]|j y/\Ne&Vdz&\9,(ǑF.P㑀-7z jc8ϼq"N_(e!xOݔsZjm8Krv_VT< pL||._;ܥ1Y",Ur&儀i%Ү@]_o]ĎTpƉ(@pvXF"\ZhWI< ; >X[]յYQA: ^hey/oq|Q+i\@}I-ؽ•sf DIn<(r/SqjRjgRHArʶz f{2r~Y͕|GAQV)Gr+)pGك YKn$Mh^ga;=-WS\چ Q' _^K)Y\Z9+Ǫ>ѕƪcɽċ1SC@FM 'ymZH ܑ5\@=7$p<|*Z-Z0hYBy,sʂ7Uލ.pp^uk08 |> stream x˒ܸ*,Ro!ڝCR[k՞|}"nI$@AJn7|޾xNW7*V77u2):N27S?γiI6neHqUV7[DLQj%*2Cf:]6٦:)| ya>lTdx|wq0m.ȃy9TVg3j|`#TZI޿:F ٪43Q@S`iF&/fꚻ_Z'ӴOUml YqdqDI ܑA`EM-#t!f"JrpqxBgx2j9⑿-ַ$:nSv`/2ӑ5I+fG^l;{ _!4^ =HGGf0N< nऌ۱vSPyho|j>4xpl># NUDf2Npu`D8Pi2֢b/IdInA1~D IXޝN  V>nhfݱp B_Wtx5:l72l +-oKPtРP! 6b^4 {Ӳ)p̖wshL'B֙nGkbN$prKʈ.Dk&;74:#]u6I33b&P$dey՚uf D8p{6 񁷣xnضs:X=nh\lP;C\{̇qrx+䕊e2G*yעB9|:_ 5$ gdk':8SB_a o9 F~'kڪR<"œEipu Xr;~lEzL.6R{R{'TBܼRݿ@`惪sq1EX+a&^J8v8 )4zg{V,U9utoQOΣ}ޜez]qU)@CtYBf'^< Ӫ9lyB endstream endobj 480 0 obj << /Length 1694 /Filter /FlateDecode >> stream xWK6WlEi.Zd$hzJV\Qf}g8C[6)ZbRf/xq"X|x.+2͢,E\Eq fd;UΕ`[%\RaR%n[[/r;\7b;&|e8fDԧ@KgH#s6x۶l0 ]Wg}hL,EOk'I*tEyeBV?.h ;=~Xn-y8ڵRQ&צ5PU)ޢ88) 0u0Mv0+,RFbԳ`' 686p!trS݅HY,L?]tƿ6JkUDHDFiH˻j\!c=虸DilM/փݳwfi;_𼄼y$49gꁼ3˷ tv*q*F366HADy /(Isy qdt\ q*n)2={ԔQeA3ʂT#~Zŀ|"S0fK0=e; xU+k|iaNc|F QQ̦$d`E Bq}z UZHeJᨤxz}@2XmJR@ӘJ2IWU;i2* o^끬nN+YIJ`nh<PQ:Q3#h1if^7$8C<͗ڴtJ?{#29맶9/ʖQ^!}P*=J&8?\H7l|C㐁üfe_$ἷAŸZ\oVruvV7״^XGYEpdqu筭RАSpQXSyx79| endstream endobj 485 0 obj << /Length 2311 /Filter /FlateDecode >> stream xڥX[۶~ϯԌEU}sؓNħn;MpDHDC* )I>X,~`9mͻoouQIOjpܔzS&8`Vo=4v˲$)Q0zh跺xw8ucsǬy`ٶ+Edٺz/x9DX <9߈0*^\W;1 O)?;ygi)t.M dRp2y3 okY-쩇spHkpؚ"y̆Axdxr/q y'C(YXox4Z/ )׭)E)*͢`.H6WiVhD"8"K4rB<ۦ*< R||OcAcij>ޞGa C 2Ҟl/a1P 4fU1 s!:^2gpd!LZ,bL`gH5hk~)St\?cL\@1r:d={^0LqlNahrŃh)jlAۮh+ UUtiXibcC̣[eKiesT0餡t;ׇ9&4`YGG~sFUB15!ۏ GWrUGRgvD]LE: ED9?t*d!Ԙ?}hj} ҽ8҈L/ ll b-K"ʲX%EwuT;^ Cjk =5C=5AV>dtނ! eݵU˓v(4NPC_HYNVh΁x!. ن8jiiG+mE9R8W2j_` ز( #,ihHΊ*d3ل1݉{2&:1\}*'B$ yOe!Β/4Y1Tu/)T_n*=TzP5=Mp1my`5j@F~q?34\0WkKY[9a^X 2!.ё³.r:e⥑Ït2 JNTNx3x^8O ıGDzw+$~T'DQR`Ղ_7"̸}@q914-Д\3ˈ. @c;fyA2`燔=[CAN"VoVPۯ,N:/Qߝ< Nߘ{t@ ~2x_Y?npDͳ`DөPez,q45txfX5=91݈X(Du6<ƕ @l 40 2b5?t?*Dî;⍏~UL\#F83"mv\뫄0]"eۆipe5f?(4K_gyxY!sLߕ/_mgl Gͮ Pb7q endstream endobj 491 0 obj << /Length 2540 /Filter /FlateDecode >> stream xڵYKБS Iߒ8;rDB𱳳pv]y\D<F (ڝw7|SS*,4=vYˢ"=V_CJi{'Yv~}7NEa F}|S@+///.*4LQ֓;̣搓KXVYoJhW֟ dИ+=*>"zՍ3$YxbPLo[ %KB㈗RrЙ9&DgeR!|;5w.$e\6B1Zb4B7mrO,PVn%T+0\:sj>,z('f /&2ij= ~-?XyzQc wYFHXN<+r5ur:'XFRM𧶧[eƎ*ąkp@/ 3}_UՄOAs&^7KG\a8Ӑyn0B.yc Vp|A8W'A8Fؚ:Vlןȉ,H>q뺨r]d8ҍt<K4k/gJ,خ:3 WB%!\Je%J;i=3 +y:g#k7nlG?G۔_"8Cu;oPFdPhɁCFcD^ox Raax"H^OEhJCN|8 Y#ފ$%8yYv2C+uPS6i_Gs(+  hkX~UvbK$ ~]; HO#'p'>V }h7.lㄥ)$iBV[Y$yI`t OaA"J/P@d]W!3l;)y'ĝ D!Nœ(0GJw r^e'ߕI`ݳa,P5d7|j"FH"f/d θUR1uPϊsMDDe{,B(Rb^_+*'WX%I@b d" 8 !׌qחmj+]ˋSg@W6=N%t|/8 9 A˙7< endstream endobj 355 0 obj << /Type /ObjStm /N 100 /First 874 /Length 2263 /Filter /FlateDecode >> stream xڭZn7}MVE`Im dLmCE{g$ŚK<"Ȯ:uY8"!%Pm5HR|0`*cĺFDdʄ;[VLjEBV;f%b́X)9!)cgU0x%c*]+6L9nx+ۛL)3nSWTn w[į2#BdLJ)$kʘ`e_ Fs % 0= 3Vۋ(vfVP: CQPj 7r;נ)cC!L1hO)&9(K >RhPuơjƈZƤbiKNj&A~+:(ˡ**  V)6ܪZC8|W-\P%l?*4J5CX 4gk -95uW[I0(c&Ȃ5#8В+^F,4$Z VFh<{b6<˫l8t;^tyl8Z\6~`zx3lx7 F3Y,P $0c2EjqIݧ\\L~?8ÿ~Ff "+ܟiq! ji11j4?)+>ҟd~Iqhnv+ڝV8vG.4s//5 >&Vj)org C.Ixp) ï7k# B|gGv%#)&X4GAI'wlmeϛ'֓Ԉ2$#GǍ;AR>s{V+HW6 MW66ƀqNN_tncdX5` Q3d`|;~<XCpzkkGB)\'[ҍZ F\_p|6wy1( oݼOEdu~FRSü'Kʈ|,Jj]n<Ә]!rt㭁l'$K{ m?4A4O@TmC[$@Trh[%mɪe:&|SsQ[(ޱ@bbzW%z %*3J–խyl֦A97Uh,Pl[.`u<k:-uxJ *sADf9@"_J^> D`(Ias6>۰Gzz *Qn!#%/p0gJDbt˭"Q1x5莽!)Ϝ8:^%C!nӴd-1y@2nv+ Hy@کe'.~KנIV6D#l[2mиSL, DT4@.Q9C2>lW~'*e;,}zhԢB;W~`etpL9ӹ+Zx&5ur2:iӌQ *k/עyQaz 6:<.VACdmU9]=e> stream xڅYK ϯ[䪵VH=I6GU*SIWrivezbR H SxiJ*|y*ҧ"D;OGK#Sݟk-!?_m{f_l`w uҵg{п3u{=opԣb+>rd%Hn!-OG\YD IřtcJY]8Ϟ榥ͬ>= s7[ŻQK*bvD4o0-#w;5 {)z-.*ܼ05C7M:ЌiWRM7aF1@e߳;1.˴lK}'u M_wFr`֭`4.bl.) ԕq+lu :PX@=#܊;9%\eF â[kG Y00ѩA)_xrRKj|#HҬ mw2:!.%^/LH+it8KbUMAAˢt}UTj +#\HLGV aGxkτ'W<RqyzԂCíL=Dx4'+0?hC6#%0@ɭC/冹Hr^Pd)1 cP]fn7S$1}&٤hH_8OĮLH|fdY_FsdQVr-,qW<؋lw~ϩ6*y>T]2qZ7>Ȋ;Z}F 9JIcj{7E|zz@fq&QgowEެ2E;aN0! xgPW>򼷊Rq"y|84)0,QfDG!?)qZdPL/Zl{PFY'ʅC"++i|:qOLE.y pA|D" ~{yc<6,{r^(y7 ARCoGzU8ʠQ)~KTTqX8K^ʪlk9H *kߍWD"G6NQrz]d!;s1hh"׈J `rע,~%.C( 3p"p &xv_(kxԻv4)}oWwO%܋߫jHE:!3q)$/w{)L+ɹdtT o]wJ@F)@O)=%k_!:sy]ieYMo$@f8鹱fބVExˤn /ԫ-Εɟ K"T*֓eeaiȂi *5=B+?= endstream endobj 502 0 obj << /Length 2772 /Filter /FlateDecode >> stream xڍI>]\t& -,$ X23wnlO d"CHx:{PQGzx>>!020Aѹ⥩CAY\yxYPdhOx⮏:ϊqQ6q~|bQPϏ6ٰd[+7w=A L>/ Ckr8 Ƙ6fE!qpwMk(4Dwԕ+x]}i*Ǯhv|TANL)3Elo@H麒āΝH|4S)k܊k-âDZ ;;mhؑ3bY.IϬ,<ʼ*aP]WJ;Ң5ط >.V &alrq۹g $BF 8x0LI <~ g;ep]kg A*o NVaBlhhgq9McY[:c ;uE5 33^_Ae0|t~IT*ݲ[tol9t"a䩗B`K <Ʀ``1V؞v\,AD'B</V0 8p˟⭤Mݮ\B,Lum}iz)l#!T{&3^WK;$HL&:΁: U=@R@&i[AMK0փ׺߿aBc&v e*u&F8dcJwϳDC${mfYy}\X`l1fhaWC*B'OpnW9r ՛#kX|l|u]gdJCH2k;9{/$RTQ󦦾XY/m8BqqG!tp1]!vw$ l*>}BDr=9['9rl?wu*aE2kM T'C]ȫ?d,c0 ہbsYr5q 55P_!nU yj0` E7\ڮxDeB >/BIï?ު{^]=%HGЇSڼ% J);p)(eF]N޳̄6U~ןKRXDoPGDa7bQu6|((l%_J_َ^޽2XQ}aվ˖wOt飷)^K'OaHחoxbcRM1I2U뻵zFvju0rʐ㐱ō뮌NZ36'֋ĉA0Td*`S]2.q\b發%6t%oU"p+t$_Z?@,Dv8a#E@a%A؄q^ՇEe$R\k1{ }pך< ;DVk'.a05lY^ _WFϓ?ᄐ+)֕8OBJ[Fb: zU #Sz@V`C`1 hL{"%>@?5`& 箖Da um$ꅋ8d4CILg&M/t9Spo1Gx V׵V/b? r֩+n`(8)ϚA3)lSڗ}8{!//|BA^kYDk4HkuO~?2pWw1UIҟ?BH endstream endobj 507 0 obj << /Length 2548 /Filter /FlateDecode >> stream xڍr-|U#-ĉSIU*U*{ I\F3 Dٹ< %wwId7~ʻ4J uW$Uj 6uUFk.*7EOs>OSߍGkñ|1ɟ>x|Wm[=|`zOnG(z^G<'>qf*mdOp.rK4L>ũ>MUdED \)&0TiEˎ-mz&D=-dqQ6Q v} ${ikI)$&+ۍsj;? ZfVy8XMbI\jspcDHmh9E8]rm˳/x Twg KB "DJv~ˈ endstream endobj 512 0 obj << /Length 2052 /Filter /FlateDecode >> stream xڵXOϧe{cB[&K.v39`[npz>}~U%a{HNJq.rߏ~U2DEaw`xDwe]52:h-?S(,"&6jd7:WA{< veC c|a全ς({VNr{Ywcr񷝀vf/@݂Ǿި)uHgv7Tm3p$6Pȹ/bq B0p_8m כT M x[vy?+v'y;aV= կޝuL{bѫ~W<m7P%i<) qzfvL;sf]ێ, g?VؖΥg]TؓIf-NS->MuP{u&T^ ٷphz;}K6ؤQ" !~ÒH}|! AcUߜ%˺ѱ:{sFr T]I.O$"?xd +"k/G>sF$&w՘/7&&:^\4muW S[;?UY 1`<8wS3:9|-qKt݉7_=;m72a /ԒblM{Su>^\w2 |.OQ1o:Ǐfj M7|nh1^߇.&%fatQstqk{&̗na4!d1Fe1BNڠ*]=?WIC4S,gDyx_ad endstream endobj 516 0 obj << /Length 2419 /Filter /FlateDecode >> stream xڕ˒_1CLUh3r*)裸 S䄠V}pv7'hǻ7|;]ީ$J }W$U0k~Ʒ{~:Dhv{]Fn۫-@eҏo:$p m$8'd'Gg•&~3\~L_򞎘$za'< ]ha/6λ#8G, A *jw45?g`;W{׹zr[N+&ngGRypsVqv5q1G0EB+jA0lA> ᆽ-fsF;؛tb!̀%tVb쌆[x%dT d!]hDxZ@AO3_Ec 歲>%k@8&MWV&8!&2ަ EN3=r缍[Y\ЗE'GɢBdcU8oka1MN!qRfu$՝(V!aC3cr$pX lߒ,L|R1:\L+&axIm5z׭( wB /*7 4,MM:D,xlH$\U:V@B7 郋EUY/5i8{Ҵ_tT#{A+\فWB 8o>ME 4{2T֗{yv'JM {-8<~r;fTTq.ęer[z\/#O\YSZFPFQɤQ&.DN^ |Ң6 Fa嶈ǿ;l ya90flE'`_tLr҈銈Z&* Sea`-G* jHsf ^uȓWal^`8Bj 4xlgƷZ\ixƛX;|цW[ϿU)%.˒k;w endstream endobj 524 0 obj << /Length 2379 /Filter /FlateDecode >> stream xYKϯT MHmL*I"!|O@w*aD׍&7] Ow~T& D$Asp2x#{[ʼ-eii-u*t=U{Soa)ﱴ<{=ϣqNogP!$E-=hk4<|,S6:i˃m9#S {>ǻ]A%vx1ٓI + LO~RsMz>іA A¤-|Bhje$`JkcAVZٮ;;+JvR֊WW&ݱ*>Ze0Jz'@=; Ή-Ý,U.K?M ;g&™!3e6Fʞk{nȻg&:U3HW $"Q1dtZ疄/JL@Cr_ҿF 5T^36jIq 4ƸF"Z6խ8;9Cgx X`z"y iKJSpFR䧾w_NJ1((!T͙A3HYgax P$ -V?n㧻O41.B\sc6]\W$cF.G,kI$7je`1+)wRN&R,et-%I9ߏCJjOwy ?*2?Q"rJ\7K%f嫌R r1yLҝ7G~B>~p*2ȩ-`*@8߀l7Etba}Kʂsm| Ya\ү%М9G2IYF'U |ƾ[`tD~"pKǙ eWx ,͜R߿HeEW2*1yn&Bm]dg<@ % 8y+|Y(AiXV^5X}b#"O C52_tI?BLk=TA8p\bHF $\^VkDA)? w  +OJwXޏyz׌݊^# t!՜8k7;pCȀ#%Hhf7@ɭ6j8Y^&./U F;^j8?(\C8)A<@꽧24r=VAހԽل7I㞫ORPtK9$|k%G6d99 L1v%p3)_Fdu+;oo3?> stream xYY~_,J7۰1l#@8{ZX4ѱF e"Ūb_q!8MW?A~p>d! r?0Sކ*8l Y|3=L8La ᐷR1ܠ&<ֲRQ݊& *LyMɶE2Sl}%^J>ٕ8OON ݣqU%`IYl#8Tqe3 u5"̡l?(2r) (){>LoZw&Ir]ES%T4W3-ڮsqP@-_Mh|~+BzĊ krRRRyTZeo~߯? ?L\K{6c=dwI<g&JGSQa^Ƚ־zKLAm~C__).? xke{^2Mzm9SNDq?[UP^%h .8u' NƋs7q젂B vQP+m,<(=C  AA&bdɄ1 7Hf=d,?~krpiǧѝ݅2 :{51m7 cĽе1/,4yt :!t:7]+Ypf>&W8;\.o0'u3ޞ0$v>R`:B'C@>E4.vʈ<E@N I|)# MNxˡu$xq4,ؿ `ľg@dcsmo-2Yf[6TJ)ruh阁I⇑ >9qg0fA}2Hل`恃|" 㵝y2T3Mn7G/rӖ@ɩE|)Q`gsw#N 3P?q1$m'5#V:`gSjRZ9 G>yS+lghsgr/8nd{6Dp#N&K~Lo陝IivУ>{[ ?q1Y/c/ Be0hmG17&Sǁ̪]YѳEBoXkf9>y='_zs-;z=u>sm8wQǑYIR*уd˰3mpejy%C{ h l;KKuHɀc %\ سoR,[( 5 q5E*2IO O}ư8 Z_ bRHNJ 0ahfBT$aw$"kaV$̍C3ṟȖVV9H%oe1Y8\/\=ɧf9w-74pۆo6#3nGſf˶$slwMmEϕoL;ʹ/}P]HM "_ /wrtT8!JYҰqze R([׭>- z΍_/_æMb*qmGWD9RL" >gIa&k%SlҰzM=cYc :M[v-߾ E\d`@`,i5Fg#ݕÀmt__oDe&\ˈZLc엿l- d2?09@$`-kdWL0'|\5KiϾXlۍMJQ2T|y1zcȹcH?Q%X /Y> stream xڽXK8_bsj(`u,[I4G9~ɱsr(,Ήܒ[v]çH~e.Vadzɮ0R3(8Nu_`$ZygVYF;!")ecֿV=Z}l 0(ӽέ3eB1f$*ba׋uC ?%hnό)dsw aqiM=,,._Xnӣi=h@,ǁaU>` D}?:rkn9X*΂Ev^olvqҬ+ I0!N,c槹\m(ô*5M[3`X7iXwm5O|g*L`M!n{D!.²R?K'3&A a5-0BpyqCFӢX-LQg QCT M47RB7͢877>uS=)RT~rT )$u1`p)V1`4KR2DG@ءaFs` Ғhg;O.\%PJB JsIM4_@f̊ђ$*&5|.c>+|-|I-@$[ۚ }Ѐ L([(& zF qEt0^ۣ`ݱf.|iZ,0e7ʏL" ;Nnm أ\I)K$"X5lM9 xtLA 5-BX)\@l4Ӱ{ -Dm[^[70m407ɌGaAImt!W(7-bf^A5ECUqWH^qѨ8f:!Wp@ &0>{&G PVQ9nf|"m?-%Ibv3L{;:_M&vK9Tmk' Of:ht4,,7Pw~G `&_+8e7+#y遡k ̽$<%u΢"M%O-Wob.>/7s^v\s"O4:s ݽr/<p6,Sx D  ܙeL~n߮w,r|F=ޒMR~Wl^INIbeRB.MW>nWzBߘ`=V~(vnjd2Jm,vhnZ^x*6ςi,oƙ _mqu40 L/J]PͿgؿ6Ui+Y*Ot߄COO{a3ӶMr\|ʛZ>D7R.yoy#3ogI&7kK\^5aⶤ,E Җw\|Ư|`#jMoER!]L0@=4+.a . 7{;4,,=.7~?BF endstream endobj 542 0 obj << /Length 2526 /Filter /FlateDecode >> stream xڍY[ܶ~8ȋ"Jjڨ I'M$eI_߹ҮOK7r]rY"/}ZwiWI= uW$Ud0k~UYE)ݿ_&X;0G}#χ}뵒z_YRH9H\?<ْ*S-)HVbß*FnJU+/Z")[K)d[J'StC*Wn赬,iS|wd褰Do%F|U} 2,jꞩTF&;UDO` /p>n.>daBh{ݍ|-Eߓ22r7e@(}eixByv2&MtǺ!tFSD'5k*+N;1߭\k:BQaıC%Kk(LAEszN>폼 @]sh3=;3 "-i$3٦3;y| OgY 0WK fӣ[#SJ }`^MuU3a@8x|+@2U!o0@^!+BF;HHm=? Nj%whi1j*Q|,.~NDGڙ?Ohi6uedvOݓ.s8L^k3xw}ිN&8-M3цz8Hl0UEP 0&A'Bro}FE?8_sH_;aH2YJeZ\E#Xou.v-ύ<{YM% ;dž7#S*z77N}CuŌ%fFڟst!3⇳G(7C^stGCF :y4O ox%TP,varEghЀmg.pT&']6^ـKh^>yu˓ ,:H<-J'l.#L^xx)09Gӆ U^ qlb5$^|KIasK'{<10:e,.r|`EDo{σ̓Z Xy"Rhnp ^"pCOʖ#ASJJu-Q=cs;#d \^ϯoDULTzk4vrXKEm/Upqrȡ“H[׷VзO N)RNxDUNBJ '\Ed-i'Ux׮ tB.-$!rKR&ǣ@k+$+)p,nUr+ZPzֵduu\@1t}n nRo?lPeP "&)/j%M*7R&a endstream endobj 550 0 obj << /Length 1880 /Filter /FlateDecode >> stream xڽ]4}E[j3a X[UYɞܯ[ݲf,Z*X~Wn~c?IU~Z^7izQANP$ ~8ɻ/_o9MZyD,:O]r?)=d/Ӝy ݪ!Џ3_& q^7&F m,]T@Ae!;^jN ' ]l@I}q2,s-`MiRLKuxnג?D/&F@gz-##52QMCZU &Cy3G+Y֡h^)uAt"ĉ3 ~iqqeKZA3¥|knh*:Eٳ`Czҧ"?+8r?#{U# ?N1pa[`# R O3|PryۏHν C<$wPD)\h+k<yfpJ(Zu͒'rqN ? 2i~lg.Rhb.CtѠbZI#$\9I( "*3|ߩYʙ"wqn*7*(@e3T6!R+ށ} 34ׯi@LE/$MNќB ޖ8صRru{z]F zv[0#Ccup=f' ]w~/?W?}%Hda{t69kylɯ%Z[LApG["Y}"­۹ ܊FVFζnfh/Tk)J::)!Ta*r|xHK@o^ ҽ~w;\l?׳·#$!P3`_0~yrCL׊?->19@[mܚ  癓]ޝEo0aذ+E>C3IꅡB\jd{dxf#[^QJS 4 |?'UqsRd~VgE~FJ4ߦUZ\tpC*B-=`)Gcց8oiA4=i ѻ.;vXJ#Y!J s]4 f9N=  /F W,1>izV~_\&gFJ,N"鲌~]4_AǶVrLFdh?9h%6ٚ .}ݹY*1اu: yz56U(}W4=ʯ+.L endstream endobj 556 0 obj << /Length 2940 /Filter /FlateDecode >> stream xڍ˒6PSU#囓rRf#bD)R!L&_'ً4 Cp] ?X~r?=0JO_˱9OqxOdꦻ?E! "(B$NQ'@h<a[yQ<kܫʱQy>Cg^N}ˉWM^j0#Ony\ly C뵍_>Гձ!a'w{Dp/MWGǓSn cUed3!OKF 銿Otf#767֖ό=zT>= R(߇%f*lS鮣x¿.ˌCs,`{UG5S3 ;F= }72|Ӷ {zPe5`юН% ;k6X\KaFvk_*4X|y1J"}a&V? wBhr#LA ̄ NX)nsB̜S^x{;c'8V^y}+!.uo6nlJ*Ρ+ o^NDZd0xlL:z5T #ެi~&m {uv|<Ԑa]e ,0qP6F)N˸6ȉ;7b>Zwf,D0xiKZ抦z_c36@iC]V/mt ߦ=O4d# `uZ {LBQwyb06saMA\> /r6:+H'ʥby0_ xB uWݞCa*oe.* %$ρi_tЈ.[Ӌsk 4t#'H 9K]ak* Ϋ284]M/{/˷A35`|WGO\\uq$!u)^ZR~%w=}Ge4`qYw|'~W':FuYڻrω]=he(wz&+ܶYTܬ=Rmo/LHkGW"!rv(NZSGbO={ofB]!8!v%$$9|w-6'zPw0iX(Je0VLJ/h}G: C0F3x[dh־<3앢޴)R9pJ r< 3\&Ռ3{pL`Ԗb?9 r (dgr X1^ 1'UbXy߱ˠ0HImavNDh*Q,_nr_R枋ܕb ad!*s1J!&1E<~A$+&N6W}2l.w+b[hE:r݇iV[ōOu%gĞj്gН 9,Rbʼn/I_G)p.뭖O7(8w);࣊//bGeYG:p[Fb\ &[CC, T5H35]$*AW>XZlD0 Ő?t:5 ـټR<'l^?HBj`Ui$NadR #wcwٱaQr+M`b, 2pI:o\H)G`$5փ" SLaA ad- ^F!L\q9 6>JWQ- \њ~3đTb}-aۆG,CZ/iKI827,c(s%g("K}ǎ>+e=. eOE4I9R4`5y@fNlg08K;gF5~rxgQ\cIPNTp!E)9ja9gqIX@P)>O_vKeO8頶a\jT(@SQl' qmbzn#x.mn•$GҌ4;|ƒ4dBg۳y6>ǣU'v*6Aa9|(KI>bJ)\ !}OŐ'@ Ҿ=r‟{1  =+;RZ V|J:dN2>ZX` bq)NfQ(5徧(*&Fr3FޠQ-OU"m 1$уvtFϙE!<O1u Rl7H*K d^єeN dwFK^x[=,k4ʟJc+eG=hN-BRw1Kɖts*DYs9:yF\_":7pb助8=` &4vо꿛mlTZ@VsDžk}Dǰ;͏}i~"+}b`ȉX1O_٢lu;A@JFa^Se~Fo)6obu6Ik\ꀮedTX{U~E!?Tr=zY4!U@ٟ@F.%8yQǰZGSq%zCNIZ.wyY>7x۴s]BX+}} 8E ā?#sYS,;Z|BoR/<|pH G}@fW&!{k$,Woc?E9 9TG`ěX!}~|?MXmo endstream endobj 561 0 obj << /Length 2483 /Filter /FlateDecode >> stream xڍɎ6_a2VP49%Aj0d,YU%K)6ʔK"Ƿ/t:էw|z|/Ix_*0R0ۭYo4 cmk8UU;ڡ66n~K8,,A,jfa\2",֛8Na|04݁OS6̀:Pu5FU8̲Ӿ+<t}:.0 $,˭C;m&)YwuYk~鑉d ?X;6҈06q _&jVHgm+.kj%|2̒-c O(DRT8ϭ&$$B(u2 &C,QT`-(R!E7B/Ə}gj/PU1?/Ke5/xE:,`5v [% Z@Gi\xBbOY^ᦗ.-3@Eng@Փӷ!$0+%dh Hh1{fDET$00hlȾ@(^&-!eտ54k SD Ǹ2L=jjg ]+h)dmC-ZA WAV<B)mp冀PJS0v[,לƖ֨G㹰deng[RS>f&p0y?.6A@n^,rLX j=MD.PI+ogCכz'VHy^s(wΗ=71Lܨ,He15NUnZr9-R\a"]*N>DÀELS,R R˒Fuۏ,1 ۓm}\@N+\ݛe #q3)9WL+pP0s:&,lJ=MŐ`GG.f=ys?r;>HVv#e#5R61hd2IVv:ΐA:^>K;B^YzDB%YBQwy{]%h34{"+4vO" &vo0@k L 2k&;t% +YhxFi$ivGLR]DIM8л ՗]d8ar]8(p"~)r-J 28 !PSR݉AEdB`QEё`j  77my<6-')W$pK&]F i jj>F'iܵ!p3m%HH#? ExԒȵÑjY7[%a1Sr,o9%s@ 10yςC{=78XM Lm ]C] 8P%n!j&yAeC/h8񎿮Ri\ ,=+f*,oM|qϋOjl*v>QaCy/%όw|KŅ&-=89=GAݗ?/K *Γ0oY*L寒{+W̚VvXJwX~⚵YנBC]> stream xڕYIׯ% 5ڗ rH'Ӎ0@]A39dfJ QjW!>o,U=E>nomh!LJ>d&:aS&2(~KPuowqGe`lTfa]^8g#}EQ;^K&;pwɞOmRvYaOpsY7d`%eY4AVt95 +hli dMCN^Dzap RZ᥋,P"* 8/ӭf8A(9g"1?zB.I0+ ~Ig|ѭnQIHj=a$#Iדu2ˠUoSI؝4\;ə,h;!39،M0+ʁ `Eh!t,ᴍYb/9LuSNFGҚef I\IxpM;?u*2Q4Z")s9LHP0A-Xr+Հ G-Vs<4<]ذsxk Gq&y-K:" ` 0co;eԏ!,wEe>rF963z" KsE$^9eR*9E)cG.F4ʹ]5zp6`yYc[0f9s1R+Za, ,]K:z<> A=-QCvBئ`}A1F1 ʴ1O4J-fjc[ Iyt*iU"@LSܼ$r0 ⧵֌g&L"&NUy~(Ш)AeFJqvHZVl: 2j0mbˣ܂T%[b(P 4o(@ע(gۥkەaUNeZ)Xw w8:b M97 ,mgvvt7  ;NRL/a^xZa2[~v6Kof,ǔ UVo1dhu9ΗT#,_3ټ@;4]b){{֜P;?97iGdx@TFY 77qg$@iWS`?C7u Ђd 0Q}JA궔zj Ր)ɘt2ph2Pl :&HE* 0U^%U 3yӮ$ zJg6q mGhPRTpcR(gcRG QQ&"@^ԓssiDL86t둤.t2ayNT΃sE>/* l_2x`ԐVYȽmSo$u̐ G:(KXmw`d#4ԏTb@963>hM'sIk8S+JH)8$ Ѧ?nTIƐeuJ xafgS{P q>&I||Xbc*r/:ߛ{O`GE.sKOq!74 ҁD|YlאئڣjwO9|9@]5ǠU;ر_r-lPMAxO'Iw5*$ъ[ `^U h-wtodZuQDY v"Ӧg]G?"sٿpkY*xz$oy$-D~BkNJDA`.yO6˰WG\"[3n0 Q2xKȾ ^f(83y]7$g;YA2WB~Cw`hoܥU6Qst3 5@~vXFY$u.],K͋P84aKD,?,.gpq5P 0-X=)_|Gew%iS'8\glwKD`@uSPiYUYygyo>}KP\G*'>D'c.'_?rIc(e(b "rTorpCu.'Ŏd^IRHsD9*x/&?m endstream endobj 572 0 obj << /Length 2570 /Filter /FlateDecode >> stream xڅXݏ6_a%2.VD}XR лKrEq">,o(K[%}59Ù07ëD~qڨ$Zm7e):Nr__i˓$-Qyg¸H&It6-#a6fU9 I{4RVE}Q5RW=m 5,.2] Bk0Əף5E* vϋd<}:fkf3UQGyɮIyEՇ7]}E"bt63-LG:sqf?#-$&ՙgl88ӽ veY9^?J7NVi{iۿ^08/0"a>glw6LgΛU.B,h

Hb"S<`ih\;ǟ9oxAi )dfKdxr1|D,VtExBd i`kA,"e,/n2&sd> =?aX" k=o,z#_R;[rWq7 6<) G.2iVŠ@/sUG+@ qpCp汐-a>=F"^ѥmYG |bd, QA[G6 f<Dt@d#$| xB -*@̾ 63E$vv sH,ڨ<}*,O`& Ri}Ҏ] \o5?|1X?Po G`k @Q҃<(4SBJ|sB%mXvgo;UDrlYWqYM%kgŔxn LҦ~I}fz~\U'_=6~BSTkvP]N$c W /lJ_Nxv>. Ϙ0K_mM;RMF1T@}EϥSJ,a/M¼q\wAY2:یE w{cl $J4Wp&ˉ] хUX^I'RODž0" i+Bڅ=q}'S1 L` /)0y,뚎~t+v7Apխ+<ӞN Q1_Ts/|z =Mi e ECpP᮰DBo8`襩'BySy# IUȕm<>FN]/tLN>*= ?/}>"m0b0gq}h6 #=T OZc)}x+ɩE7vm0b)ߎ18 3]`H)G""`2;.sOWkϙE߃C3q EllcDv Ңsݞr#ITM\v9kRK0%T;Yۃgc~Å煋"@yлNI '=d,'-_rHUYhq &w]_z86V0pc27ǒj/5ޠ6 68_<=gK#g ϼ/5yNB;;iBnXpt ߆P 88hy ګw@kI&`jO\e=GZ*BK(\kH@ C>Zbs XDqh-bɠHЭ$TZ6ؐo^ q~Dd#rY)VwX{s.I+´K3kzUAt1SM1^A3xy OH ߞBFnoXcxjO%P[~P\q+CbVW3@Y[g|m|w endstream endobj 577 0 obj << /Length 809 /Filter /FlateDecode >> stream xڽUKo8W{X^|"=]=4=-ĀȱӴ'͛3<$>+{zw[7I.mVnꤑLV /euhϝlTnJWe+ōf#FVtM.SDpI{A &3q&=ʰbSTj8>ȼ$!/{̠ mٚBU^fu6m)?Z\q@^yn#ճ:g(;AHbQ3v&f0p!vAkVi KU X$F(tԥێ:Q{ҝޮJ,x"io髿a$x UYpUsYr*;!e #QiY EqMtgeKcka&XBSYh{P3JW+tw+ޡUQduLcfb64( "7?~Ur,ğHb&HjfxUO}owOj8 e9@EwtQޚe{~:{;v%q(;[PvXb3j7qAg%Ng6׿8=N낷)~,ډb ZxKv'Tf41 \$OW~ EHd-x ,}q9HN`w Pi5ˮ$̳)U DSxY^X!Z endstream endobj 495 0 obj << /Type /ObjStm /N 100 /First 868 /Length 1633 /Filter /FlateDecode >> stream xYMo7W^(pfHFā-$95|p0bHlu>Z+`/wwH{3 ( -0`9irP(dQM4\s"CJOLS9XKx'ٯ* 54jT P(e4R耷Ė`+f\p_ GQ>?>{Iqѫ*Oj6^5C#SG A6ā;)$oX%͔`Ǔupq2Ì)?[-r72%ndNe60R$gDs.@/)F YAal1lNP+P82F]$PMB& 00\UWJI@px(yF_| 8pL* ^5ׅׄP3=tSH*"ջX >k'ǂSm ỊXVwQO48'K1pY12^QוKYr} ^M:`WpԊ bV >;:_SA@:8[tM/ofϞuv'M8: gNv=N@É,Q* 1^]Y܄0$.n/Zǘi,v}{]8u߁0}q>-l,N/p`PSqu'=,7v=zBB}`=ߎ۷"FZdQ;HG2V&k= 葒a<֋]  H{+&()ȗc6(.q1;[ͣvYsLám۽lȥXa4$Ml=$(HU7"d6ƙ'#={v&t61RnjTN Bڒ8NB79cbBڄxݲO)ݽp7NWj 봒D;&FJ%dagK m9 Z +q;-<0ӏ ӛ/޴}P|K?~}kX5 endstream endobj 586 0 obj << /Length 2587 /Filter /FlateDecode >> stream xڅYKh`FֳNN]$ 9[nfRCvv?j'bWE*YWDy|2]ElUlHW(4+_4v=U= QZ4o^II6)D&<\)Int}wO4^::2fp0EwYW47# #DU?&iFq?CX`McrqL+ qw3.%hkI8qAo/{TLQrD]GCIKmu4|( 1N8F;o6iȀnu4'?P.,L\`ȧ/4T H?n?91( $e.΁5YP3|/'nzNȴD+N"~ 8oi\ʃ< 3#6慌(T)U3!PuĻV,%u1%h0ގƑ&FpJ6+ZƂ.3]RQM2,@Tq89rBbiJSK'B:wjgXuo*g<@.7E'eciU Ѧwrum6IN1(^{j톲\$ɜ\Au2.3uoh3HV'x&Uߝ{ GI'%;]QPI{fJh^ޞPJ0|e3W ^9mrX޹W-*Øym^r8I;+hԻ1ȼ|HۓlIFm2MlY}UwV2[ {0%߄l #[cX#?3>a,< !8/d\R}"d> stream xڕY[6~ϯ[dXշY$-Gm6dҹ`΍f_2p887H?~~ݻ,qXf|>l )2x| b.UMzK,8tY?>wjG V?j4͂*k>lwjYp2=yuW8hږ;`<هp/l4EBof @nc%s^Ux8 "n>2y˼,7yl)"^O'ҸDwQ6/hRZ(ۍkuzGu8i¤LۚՕTٕӲ~2$>vt71 6q7/0(R>F`["p 6!bQhز8pq$QںJ50a 7GqM:>d#HnM w_0 }jʟڂ3ѓxMNpg}4[}.+7Qm~a:?+ri펿J0Y$3Tzf9WEkB rS7!K?[TO~7D>|z@[+pzƺvQEFسܚ[KVr}:^F5]DNKa ^LX_UQDe_Ǧs8jWZeȨiyC,|?=HY_WtniGïVe]ꍛO6fƀÝLc>>^° X c֬j<{r t'ےIRN(ӿvSͰ#VS'X^L i8u,X.\P^LgnN!goZ滮<旂w0-"HcܜV"/*T\ fF!}-MfD"E4|3_+[KWD9XTHZy'{> stream xڍYKϯ0@[+wLbmsGQN|EYv1sR*Vqm>û?FE>ګaSě"ڇQ z[@V?6fK4;&vFthjnk=yy$ζ_,xT4'SO8 h2 Lm Y٢.B瓩8̶;,x c:V|``ukѣ% CA.]<@ MrTI`vrQ,6i6D~ T|ecg=Hch:@@Uj 2/\ݥi|:@͟'I;wSi" v> j F z1̅W=quUu7۴WlEX<)POHJ~ؐ1 %ty|19RΒngSk+Ml. @l$E(TEx;>'Lt{4+_- nԉ|q^wwH Lnfݒ5bQv`Of -08qf|Ҙl  E[Y=P#26hj2kI@+W 8p3sF`YD@c{{=َ'jnbk.Gd\/uw?}lQ@KWD%?ypi%l8lws/RݺDXqjEobONkna ;r3*gFz) lD0)Ws݈gJ'4w~DYJ<(ȁ8F-tdlSK"G[תk](jqv9/WK r뙋*a+'Iiͻ'VRJn FTTȨ'p]XJSr4(Deamӭ79V3Etd—M^7b eo`Ij|ь&JWJs}Y.(gcv'IEi\^P NtCB& i4 qHNF2CUqY5O`_H]sLf=r ĕ1 מEͣΧCμ~$Oy$| ̉8vdB'גX=>KS+2Q9eS}'TZiW>%( LB: (3n38>Y^^ɼI*U@ڥQj0cqgIֵDWK> |{(Y lk-8p>pH]# rK|TSN,O9[,L9!E/Z1sfVHGCb/1w"q e+0)k+( 9P:F\Ժ;y-y.-_{1ڝ9 nTtLdqy3LZhb"X +rs,Bss4{;8 -Bj({RCDjC_I5\ݖȑn ,P Fb5zXI052Ȇ%#LPIWnR. cq14VlOtgvƮ]<*GmYQSXoY;&^EObhh-b y Iz 4w>CY.8Ci>QLqRPgX Ф| %X]L*2c2#h{w& =0S_`suX>sM^s_M=#ŭ 8HDzA;+DjZʛy _byg _yGCf`2TQLA{x5 endstream endobj 609 0 obj << /Length 612 /Filter /FlateDecode >> stream xڝTK0Wp4R1CM>Kv{pXaqFl?16iE=7o$?OKV&T4YI*LrN39r6Xl̩TڔIt9Ç9ڪ6 |:6\WBy8Gizz7!~(9|_yu] K(b٧'gl]s7B 8@Mhy^0r*0 s<|2Bg8EOO toSL`x%'>˴i ;zdΘW"rQrt[&Kys8/f9c ZWjqPCce.V+1q.s۝ȵ p}RΨ&|Sܛ>T[GOL37 Mpȼêഞk.M`ݧ?1RtWX\{߬aR ^R< V5#qaƦM‚őiy2j` &~qA6I  &^Ш QTӍrv[;b'.nu!iAE=1Ysyz^/+[ endstream endobj 615 0 obj << /Length 2476 /Filter /FlateDecode >> stream xڕXKs8ϯi`E9~M\+Vg+#&"qۍ)Sً@5 /ēI<%/'ObR%b2b̗/g`k[.l3s~ݯ<fce)'3aV~LtGb*Lt&N3Y?lM (\?ItVo]tlhzʣmr#-hyzSTm#H9|4M#;Th$fDyҿ]H,*ݢxn\CmCUUk&r]mk փA>:ڕ%g4s ^R)fzhִŝ6]r}Hq0H _^D D+Og"K[\"Q:=P Qk O{7) G >D.Kfq ڥky7FWae"AhC `τS= ͎Z {HR,lӨU`ME@bQ.Q9:܋R҈pe|@=\@&gAcA2hְ1$ɿ kjvCz%؈h@tjl PlVsyg]nI&xE[T'|cdnV%$,3M!f%NQSS"*@vݭɿ0>wHv[7[ҟ2n76)rFأ$ܖZvy?6'8WIpuzLGq2^+W B2<@g ʫ=ʔ4Pޕ T ӢOâCWuЉ9eس 'GqQE }wƤ{ !rVZ-aFvhqfx*vh(U<Ʒ*DV5ky0wZU+(\EPfQեC@yӸ1W< cBӈcї%ÄOu'+]q)F>@ ]ɢ||-Dq}ߛev׭- Xl> >4O[$ښk2E UQݠ4񯀐뼦# 6lm8ڈ [xM"bl Q xwf$Ԭl*~eU(ΏDz7jHGf |\ۼ΋҅zJHa%ֻJeld/LKދ|~}Npc݅Ͷ?!TYXtѺ201 ϐpqjط ԮYv8|P]1hO Xw80RWM[* rKu-pB4qTozapn008iGHOYSW:$AK672x:^eqtơQ(%`fx] 2EH_! ~w_@y3QJ &>Aýcht4=7] KUvxmR6NL:VM/e_ q ^._O8<3XWV :جuSTǚ΁^r2ӆIx4/ʱ endstream endobj 620 0 obj << /Length 971 /Filter /FlateDecode >> stream xڍOo: >@Idٽkӭۊ{@+ ]/?Rf/vdHG%%W'|~f gd%ODgf%es5:~I'1raIVߘu: 3$wO)k{9UIc '73M *ߘzxl`wi_ +ڮ=KkT1Wq=zBi4Q%YFe& T2 %Lgpfo] N#LSǙ R[8[/R')&w8vnBIUF<㧂hq~fp~C ߺ~Bkmr uYob.PٙEǔ RRA0K A8:r4xYrw[+6JVA\ YtAӭm"&p=dz2r~~{ d5q$7GmOR[A#'xL3*磫56 . .(#,ϱP\gDnڍʁ_?hrj)*t9s <$l_UT2.<й endstream endobj 626 0 obj << /Length 155 /Filter /FlateDecode >> stream x313R0P0U0S01CB.cI$r9yr\`W4K)YKE!P E ?0? J!DH" @ l%r38 H.WO@.E endstream endobj 639 0 obj << /Length1 2370 /Length2 20138 /Length3 0 /Length 21520 /Filter /FlateDecode >> stream xڌP[ Nqw 6wwww -Np ̙ޢ ާi]kAE$j 2J윙ؘYblVVfVVv$**UKgHT@G'K?@#gLLd\ll6n>6>VV;+A| #WKS<3@dtB{8Z[8@kB`_Q[@h hbdPX== 3\flP:]J(]3@o  l,MvN`;S#"-l,7ؘ9 `fi|cvvwfٙE4q\,mnU+w}N&NN6p%LA@;g'tõyYڙU= PZ bee@w zdK d04 y9Ύ.@*!L-M@sK;?b|VXxLAv6:b9M-Y .J11; `c?|׏t}Oʮ/}) t]V.V//SAIKO7Godkioxr][ j^]1I;wAmtt*Z:X=.Z4K;"t2_N ^ )ig2k'lh>d0x)0ہ&pq>3#_'`K7A<?"}HX 6?HA?E"sQ|/+A*8Ax8pfFE`=xAK Xg$Ilmxk2XLCmf  fp{0şYS\? H\\`S;*C'1bOm? ~v =a'=ӝp?gX-h;Pg7? d[#;ؽ? *?]{:GG+|݁&Hˋ `·ZQ"7I9}t:&e.'4M;є~]I[WF$gxS' CĈTE_ {d\x ?7 UN.+p"T2ŨES,93#c]aM&I`@9⥽^KHIM@ }51C%v*UV)7< NHH\$/׃Mٛfhn2!m@ *hTM1VfX%QҔ\;1--ɝ Nw/#KG93 xU |$ǜbt~03YA[y8n "+N>+6&]~鉷iŹ 0;Ƒs(͎/vV;*ɺc^ JcZT̐0kNY9)P9S \$s{|#w.I:,FMsk~iM67 xrԤ!UnrF̱,3'z\gB._kFB(^-)ڲ~.%e 3f|Ojd fwߴ\e I.rJҢ!?ulPKI|HQ:r̹YgeveBgYR'BKO+<݋B䕹E9Χcn36\=RRb{Ol!*$doCPMDp y4~٨Uo .qz3aHӰp<{P$uv:@üVqF`ȊNQey=[Nj:a <">&m&72[ o۔QgT*5K ?q1Lqn[V|`;6_kt6EFP*55!g>$7:zŤ8?K#AfTQCc/(|)JkXwmChj!Ve싮%;5HhϧS/r5;"4%)%ikp=T )7o,P)ִXcq5hΆwGbOa; u| ʿ%6"pk-thٿ|^}b/LT:S8 `̸PosMy5A@H2R8,`bS>|1L"N.&'uyTjMoZ3|z:QOnq]hsS^~!`,|`3#RNllCDZ/ھY?ӐԘaP%;9`}O~`$vBcwj~q& Uvf%+} aYÕ܂AW>G= UI"]BjN/Wm>Le<1?`$BAV tAF_, >`־l9xRQޛ>rq.+ja]Jo!ʀ&P~Zʳwҽm:X"xXod9w5ZņӢ^ V=9`Yw2zu >|bۈ젦pF+\zڄzyJIL43gy2Vp",K5BdA؁N0e:ʙuB\19-(dTFy¤T-FTnqA'c(NjzOss 2Zh=[8Mi16v߷zBf#hU2MR.NG!nMA_}w ;^ȃGdcP#ǥ*H^ҝנDŽ65>7l{S3s'ы9 "Y>OC4:"|@xteHd(#^兊I}.>SbMeCէ2/ռ[qQ;+RXr ocUF[*iM។QKeibԆyyL]+aZTZrCajO^%s`B>c.hH`:SXI'A^HbNа5* &t *~_w"[ p~t]ȝm 7<ۄ%T%IQ34 ^J&k(Րdȁ'|c3X EcGԢk @*"^Hes$e|n~5+ !EqNij{oNnjO+5bCxQPmJobYnI5n1Չ8il~Ej,Ǭ0,FWj pg,H#/=˃46m.pysc)ה\Wޜu#5BP?z 2NT4>hcc~7L\L//SUEiVdڻ"Qwo6t_SAjٌseb4:ݟI[|uRˡ ܽÏr+<$W/vz"4| mwMPX~obĵP]OB 1je3K=%CfQA&oDZf8ST`E? LWݼ[w92d}9 lQ87,MAb "!m DY d:T\bJe Qs7, p){Gk-t>s2G䳔\OWNM<9y St)(OhklԶ|\iRM-l#_{_8_qǸ鬈?PA17"n~TR Z 'OBYT)z,z; u|![bUqmb++ߗ\dնϞHGa7^/JVn@NaýGICa)hnTNY"Μ3N;Ͷ T7 teO" :-/-ŮfOE-LDw8:^A$Ŵx%=ytYCvW `ejجI1@&H<s!6TOx#!2qЊ<)HZMԶ+UU!isH_$eMW{D1UQ{8-||%K1Pvہ]W:o+-} {i1y R>2ϡ O)6Ol'$?wLC 05G~xFrxGr{ͨGu,^\o 6j~NMl4xYL"8U![IP~Xc S69u}ጜ쓔Qc*1,x]yial]L#ߖΞtHn`-p 9f4%V'9eɣ9kHXHEs'($ɚB_iFY2ͫI.,d9},tI`23ѝɰ.Bhhz <z: [W-كޜ%blX"`c5l2*pt04(' 9n saLdoA'vhoT C~:GVm}}֯(wqaf-]yYbkm?o̓xwC7å B6_ed%@i)@ΰ2{^%q̋)MϷ\ۣeKYN.QӉQ ˂u6A)~\2 3k''3**m{1t$KO"RlZ.j߼ O *o ( ZB刺0-m١𣷥DDd3caB`8!y1T|G2Z/KWViwbYt!z<$pPQӇ`46#B,<2v9{׭H9D"ʥ^S>kHd1qͅφCމfzV7VcKm~!JԳ4ެWbE-\,+_%,l$3wyVa6{twמIC1)jGƯ;wC 8OaFk7#sĊ/EKK"oI:q1Se~(m8reBҘ8A3F!=huƋݛˣ/~oW||- b<>_}VsFM,لQ#c ل)} M d,8E_<&&, 46]r`6RB\j۷Tˀa=h)bsB E!Vغ={@KcEpm,2n/9~>gs2("ef[C(|Cp |{αe‹)4M!r7Ȃ=Uת<]7YOB΅u eXEGmbCu>Dr.OZdT:yīIjG4QIɕx.K5:f!kO".2vYD&TTGoW:d*=|x G] Qۅ.j S9* PLoUNdK(|ڇpf7t`@ gbPШH@|Wz̟}Rl |WJwuub릧D-(w Rs, "p۫JT(xǜEu | AMRk%||ڔDy p0R?ײ?)|ř.'"g!Cr^^ )Jh1}H{% ݅vH3:$^, 黭o0 pDD8|p]8i4Y{6?UD9wG$G뺭skHߛ!(ں074N$A" Wѕv {B;/w<7D__~}vI=Y];TiT U]Kdߚ3Yx;=t\hG O<ڏ PаW#$%ۨzX;xjTn |{K>$dCWut3lPZʟ،2lvO 鳊pmz=F0Iө/.apCV0PO-B$ULJ!xy&\60џ*mJ`j76a:9u[L} U3 J+ڽxۇg;؏K9<L,1!0ԴgCì1?E.,dn1+ DSx"tR7*P'Э4 X.; K@gCp1pQH\qM5eXCn? 'Op6dz%>^؊{I˧f#r6!smuv>c˷PX)KLgS8^ެ/0E9UbϿrxuVv  |%.cj ʴ@{ēkb#ac)$,jIi{n{4iS02. RjslуU))B?Ze]dzgjӵ 8qS-{^2ۇV:5B^{+̚{&]N JƦ#D}IFo(Cu`hO$E꟤p=9B;KoeVd$)z_W`>L6ܤ4!A9Y/=hHC:sU`[vj: G(a'hoB9+&.?KQ_b#7 {֙)u%~ᤰ[}Sa׃Xn: l>tcy4\}b 5%+jbOe!?3b Y[3Z-*ŀ\!M\bu}7{*x׭_ ⍼񄯒o\HZ3'YtQLZ[2  kntQvhwh[Uw3Sޟ%[ n ~0jMpRNі$R_B*竷.0; 2,]s2Pu& Z|4`O\ٻ@(TU|1Ȧ=-pTZ "RײlPGFw}ڬ|TGk8JJ{TuGHjX\ѝo]?=66x}u=5#V#ˈA}M ix  ,w;V9N F?EFMwI L}x0Tz[:ϖ JيQڦa}i,ٽjT2ᆭL< DdZ @ϴ* PS[2W?b!TP [KhlDȨ^J4vDWТ:|WZqI6MtoHpɜuw0nW(pO};ܾHl]3Y1\-]D*p2ś/kRreXԸ4sWڴ# 5S1%]JY&<hOvz`H,2}BAEzck;aUpDnvՇ :Tmz #& o暢tQn_N=ԏ'c+INoʎ4"w9q`[ˈ'PK7CqN;Ge皲B5ZzFS$ub]ˣ,990!2}Y\6Hb8]HHL υ!NdjLKL+lWM:垩`|@MiGQL l1x{}RE6e!-:_yK1vLJИ5(&$Px|)mɵO.4aifDa,T%Qt we+@cIqVvj_1-xG'O z*cs' ! C ),HtM S0cSƷ| h6REXEy,B=Ȓ>zT+lǾ*ڌ\o97m;"5'x6uro䑋@U:k:mol $Fi525=c6ˆxKƤxZXbDNӾ6>ُ23vÃqg 8&L?Ceضxx0b]Umjee.A˨޳[C5^c/>%WF꾽h2׹Fƍ+AqI_&e{I;4;&ύ0xΧkBAh^/ieCuޤ>SѴ+YtʙPнBJBHe ELWɮq_3K $ SnO`c _rWkp|˫W`.%#yaERW$9M΅w \+b#I~W=_Pg@ty͊٪<>c: Q`3Հ 1!xh# r@8*s"y"ݷC&f鷉H26;wNٟ,'+x+$%Ry+@9_t**P05Cէz9]wv,nq='c UzcElOo6V+Mnl>C]m<г.t5k(|M'om_haF}& uWb,qlxg}9p zi9L č/|Vg) : n2!B_s|&tN`}L?uOs{OmaW3!G@} U{\"DDzQ_RC.֫xSN{2+%zVd4ʳ&R:-ECDN΁!mJ7e?HdapmTx54|#'!TjnSZy|z~X7-7r|Z{ۨ؞__9FgLvsKoZT| ;~Ř[FѿM\#.g6q* J6!^ L@?ɿSYVToܾ(y8 Ē=X,kgkm y%m -glRox ϧPe 74*D_)T|d8]N1G39,u!dzej)AtyqUiI |)giRn0P:"=^͌V@mKqa{15֫DT3*f7`TTg*?AOȷp$x#nu ~۩Bh!A`66u FG.S8vEۅ}#S%'z*{ȇ/Kow9U}ٔEG_ʆM=ueա@$TtE-K9SOsK|2Jy.3ԡ| CVen`Ӓ%o5_HYRj6e SqF扠\-f&r9͵uk#h}qb3cX(2F7n<TFR Ir93SA,L>O ֝PvUdI/%;ѹu[I=SGdžqs\Q槏a;T#˞:WxÇ&L=tdX{h0L򝧑fݣ➖F3C֖Ʃ缶ulmCkS8ٚO6C+$PT~Tz%$JүTJxHs?T/ݡb!Zjag|)ر܉ ƃ&goDTFZ ƍ)YOm)"8Ȧ>@>=8u(c$Gl^vt4OÿI]wQ~Yl9tg6iJMx 5 BdX5;Fˆ$5#ؠ߃3oiK$r.P$PeU[ΚwPbZaGIb=Q¶r4!kkRYV~F|GG*EL-A;̯$2Cp/9vz2K+6N5#h;nDxk |VhְU+H9 )/m&?uգW!6x8dU#fED2) Ψ̴aõM/]xxOШs& :@ GWV_~#e?wmGKd`Gu5հ)+O-t$GHíqr<|=_a9DdvycDI'1Y"!.*3bvTN ĥ2bEv<Nh+z V| bB;B垑#W|i^\KB# o~ 72ƸW%I}ƘA*\]4 |E`ZzJr碮-8ߗYCexLz^`-:-_D7fdt@?6iqz#Z ?,C `@Nąp8ͶJb g+b/0y#/Uyh3̓$;06dq6$|M$IK {#G#ty8ZaA?\#|RW®/':2؂lh4Zh4WFhj̇?G37Z-oqx'ױXVqcŜT\05z,<9G fh)KԾ3WK<\h?X-{N)be l5jR}_?6GdaIWs=A`iɒh_^TSVLk=)ս6U'` /*Ņ+-7B.c5<5zR3I6G}?`o xj94eb d5 $ taRLc<̨τA-J*xs]d3\GhBiZ<ݍs 4Oo=m"G!1sLmc!+BhKX P화cPFH./וaE-"|Wb"9"Kx) {5BIPw>l/c`_.I>ݫo 6'g&I^- /j .Ðg\\A;?/IgK%+鑈"߆֟>ɪ㞄n峠~F)'8s^%P@pNv̰m$]IiG)@kz1QPp5D-Z1Kgq2zo+zbf[ F`4tؕ~UA8zC h 0kf^oqYyԖ1T֋᚞Fe Ц>%F b ԝeUP"\u[BǎbxO%w"\A%cbhqbƿ\' ܯg#۸p׵}*oA>,>J!9ppS RD!x69]v 䗈㑐D3';Հ;|zQɸSVt`tQdn`n"LX;3p3]̋iuBcl~Ƽ\!&@Ʈ-m$Np($|#ծ͌~>~tk&2 nYxځ*gN/cHE;a]5J?bU{r˧ YC[7,yX2~u_[bLS㩺0Pި4@m7Ġ)0|Ek<`$, BԽA@,!p&U?LOsxWoR4ZV`H#gmeV|Qp2Mrv)y+X6dhh TB0& xb"vz hs uz鰺Ln>oEXd v2{`yf㙂GkQ^\sjt^em~ 8(` Ō9BZ9ے}O׿8R_z &0;E#Ҳh(NW$\V~TD+0F6GY ֙s?(?$t=y/A= [n4 :'LhAHr2A-t͒"ўc7& G<  ,_f? p(_O!'sœroJơ];*ntmeևS l2(7sįo?ˮjphS`4{! h&#RG j7m TY.o*,+6i3X{֙xloal]킖5WOs]؟Ww~Uާi[ӭ"ȺA'ĴimsLDܱ0G-Qv4rٚ&*߁^)@&|RP7Rtqh/W .\+Y\HK o2K8P,))Q4pPdD߳HX*;&.O CRpwWw)5qܖ%È3#ir&I̊"QwgVԴ٧zmՠVy*%]~+Q"Ќ#c>ޙf竨i6XwHJJpݛxJ KCx;UG 832{Q:5|^V{au R=B GOKͤ=|'9_Bӵ,( \+@@n8Yz =|H92*k.b a$K(4&3FJJlR(jK#Zcq{;5#Q< <|/YI(s2Ĵa.PIX6 )?*j*w{ytID8xp$NWǰYiXXUylWr-q򺆲IfE#+]wR;$8|ݭeXJ5] @!버]CrN@@{"B&ؙuA@wMC :?RF] w^aQ{Oj&8[0-<9K<~Q?R& G2Jdu40Ԉ)R"EWvoX.uql@}vJf[WN7wS{;wm=@ dtmJP1Fe@iu9hCKXCd㦵2ܿcJbqtYwhê(j1d.N73Q=xP(ПSKYqInMOu$kkK.wcx"EF,DMA[Kqhvb#_;U?Όn>=pNkP=l.њpa%AӃ^k,B@{pq:PPȽ{薜&,wq#!%Vg;-`;ñdh eG3|4 :q\6^DJL$:twZt>#;&o9+;y0= EH\pHۅ"(oSQ p< (f-[׸㷈~*D KA;R|" cs5;ӵ;X(b WAX[?0X *U\ }n~23Mo&[|8gh9fG knz&cz[d/@X g?׼(!ȵ 5x ^.z*ZcRN(4W1l9F+#lNHjQ e|w8fe^~-wW r;EPpWEwgg0 XZ[PDŽZOԠ`8(#ߨѤV<G? !m{-VT<}ߧ%`lUt ܝQorհ?l/p#fm5p:("e0gĆ7J:??$ :4>u$GG0 ?TcǜSݠeX?A)RtB ڔ+5j<٠[} *9K'+=XT~^ Yb5a<&{&:MzUpp< /HP{~x- -pRIux#exQWfO(j]]fS5 5rv؎̪(SdE>q&Age0x5gt ш4J+V $c*_l% bc)3& o !K`,tpJHio²(r,ghJ~v!Q cuzo C)]Yw6su=E*͓"V~61} I*dӣ<7{:x+G?/^ U:wQb <*y|*dpz g쟓 J%O0AW1\ :˹2ٺ1'8'QsrV)AN*2hW)=?7$( @.5'w-UEW+S (8x]lpyՌ,hjeU -֯w~Lm̤ u-CUOv(3{4BY8D|;8;3na֫j U⡯Tѩ|4 >9$qبZ.2< P7(B%.Pa؅jO<Ω 4WJcI ԒFE"Q᧱ql.,&;H /Ca鶡K-vԵl5ՐWwyؖ"GT>- jdDW%(챕%vXr3v kE$W-E2RMVNI endstream endobj 641 0 obj << /Length1 2288 /Length2 16968 /Length3 0 /Length 18313 /Filter /FlateDecode >> stream xڌPjB{p 4и'X!Hp \Μə{*}m2"E:!;#3=#7@DNXB GFjl Ldag G]& t~7HXXLL܌fFF9rD&9z- L=>(L\\rـ-99=1bglr nnn@'z;G3~*Z9@rt ڀM jnB  -AN..& G{v,@d7Dp+v6@[ [35 .KL ښev{-F*R_ f1[;_Z8ZڹzZؚEŞA$%ow9@ %PK= 8;|_00v,lDLwp0~{0;[k?1Ϳ)W),lcc11Xlw|lM\ާP7]u-+ߊ]G8_-_S ߧ+lgmuR[5o--A&rhdcbd?2z>w_*oJ1[c;ttz13M@b  A0A\"F`X RAe{v?='3AzϠgPcA15wF{"wK˻%}zk.5uvc/͛͟o?+{6MRZqg #_z;{71|/O17]f^?{ˬ;`NOdwW}ݟbޝGNXLlt?B pc{7wzr8vpv;w 1w$c~λ's.yzߟ}@ c;c`j!<7IY]*:eG$$BI#(k;b7+/^-a JmO_w0 ө y8xX}l&vpDREwp(]]Uګb.V (#1ʜ&r#FpGEF($K{9as\٩G 4A4֢Wqathd)B2ЁktAH)th6ȡJV'6jvG AR gd\c"sXj_J΃E%.7?KF9:=^@w}~suʯ:?Be2'2<1n&p-RPW^Om%<}}F#e[UjYI># ߳gui@)^NE>.rKe:g?] ]PDz]^{gR} gYK!MA;Mmвզ%Ϭ;ebm*'"6@1| " xՕ%t>hz-QD슡 cSJ>~mKj-'yqЄz3jǏ.~"rf%/e  v6;\ъvrE0YP1^(ֻK&IPQs짧Rav̝[)쒌3ze&R~^-u邠\jeJY+y:5HHRBn]orٳX),^UJu9d/J@#\>RZLT|H>l<er8A-|wہY̐Ț|p)X9(7|bѻVl? XX%0 AM7SiO*8>EJNm7ɰ>ؙlf 5N79ո*Q'1%Ǟ /hاՍΦkJuN?gb.:ɄṾ.WIipeKfBC41O MpPHP6 O_V3)Jm[g+́[Yf+1y1Tho4 1W<&s2pT+Gm&K 7  1w+sUg. xQ撧\ 6½{{އ.BX;!Eb{ص)JP{[d<88|͕^=Ϋuc;zhC1 fBc 1fuފipNrlT|%jI`=XWRܗ/ĖmN_qĪO2eNMi҉Մ¿@+ڽΑ Hted~$iĥ+(!DW @RNDhkg֑jB +7MX x>d[qGY ZW$V'B!'pdWt\bėzEfjj_9L%ت*8gq?Abw<ioGCe %5_`mm+${wG"k;`-`up`SuF=´ZS{Zq8aY ٍ1& g7ݖb Ź[:K70 z- >RX"?= F!Y>so'g35Ψ_<؉3q[OpƳ6LY%˭)&`R^7@MKFIc5Y#wN4~ NUj2h5_[/YpP 6"s|VYD u]L湳h3< ǀ7N5O'5}t]ĘbNKZMEJr0z\]٨+zvAo}GcV?rb[*?Foe-R{ܺFJH5Efۨ1/.Q7>{qZBh!@Z%2NT:TLuMh̪6g> uE)! `i&=nqfd;ssN\G\;u[671$0Fm;wmc}Ye A?ؐLD~v /.8U}dm{ɚi2U̳k:ѧMA:c7`X2_9aN;ܯSy=v o`[Q. 3@yh&W(53W}V:ۯDW /= ˝Fo-9{u7Ͻܔth#shZwlliZيJ!+KTATk!Uqˇ`eʠDp ` KcDS, Zu{*~%e0!3Vݲm'ڹLBG \Gv1PL]\f#O3}yO F8hԆ0 h̕e{^FgJ@g+wB!i}?zewCfh`i9NcE Ӛ;*wq5Of9iy֓zKt-yHm PLF(&&d)vo D>a3- !=>ĐX yuF} 99ȖZS)*> 'zhmZ*Ÿ+C>vp6 F>EbYT9a*o6Ïx_nvnʛ5򝐸 z"zFC8Ӌ+$i49]M xĮ 7lfQnﱩvEVɇ9+߾R`b16s\+«h{uKQBR6e) YƸ 8Db}5i R:I$~ ;En v.0oS\6URw\5}ZX+QHv5cv9In>=nIsqsNcF>S`!=3YaaFDofx+.2|,yD,&ES&4$dfpemTeaW/[2u}[ sC Jm{=(+\";׊~; _Iʻ .w~%Tʽ{c ey\9SΣ+kql9vJ^ _y.-/{%j0yHbZ D`@i%L^uEV-urI̠!yshd#DCjPI ?IH3Óod#C 5isft ~j>^)Фh9򒦖gQYr^Ϯx!5^Brd= ySr*l", {X#n; >𔉍*{IB6]s::=a8D .{>=lSi#<,5Lp0߻s? reo$<=o{ӄ\Ѓ+HfSw)묰Kcg}'Bh !Xp;i.Wv/X$#HNxj,Y| $̢:B}ǟcܣk8 ԅAh:70cyad#A([ZG W% mP _0uEbFDJ0 %FNՏjLXR2i~e\>@~Z *==G'~Tl̮kښP,3w߿U#Bpjٝ/!521ی% |O8`Rul=&Sfɾ.!f\0L|<Pmy'nAuWRg ܷXZ|<\qTbM* QX9$A"B#V)šY=T1zMAw{ΊybpO+_4R?KisiewGfwXeыh4TL=9]gIBi7l ]q=iduK7GxWAKlu NFDȖ%2틮}\"?e ŧQHݻp?]ZWnK*2lEt؟hRlE`VG˷G/oNMܽL'.dl*wɆF\Ӥ)w$5 5tӸw?70fRW=i]chܐ*`. D1 FtBf?٥o CwMXc3Ab#poUV*<&nI ]".`Y~>KBW"fŷ/{ΌFrձ}7vȨf+t9o+Co2#!V!kʧ&Y&ј&%װÝ QQ!zF,E*%%0gPB91Ur^ܴ2ֲit%M0탻mʇg[ 9 -LްN${a'& | C6vwlSO{`/:E(/_KIS.Bm{tfPi/O.e#gM-=JHDslsq znt$8ۭv~n&ESA)5GD )<@`O6V\iX5q:-86=٘:23ypFiQ Kt5O#}n>DkҁKm єZ" L&,CTRy(Hv11_"=q:SWD WJFFp"8Édʗ' Ϥ\0_UgVl?y"3TD "o/A|e\$+|rd:TF8&^gVO\uS)^o\jU([<[ 'F")Y*?;*Sջ漢,-f-OԙzkI,;wZ؍]rRGC!cq>3z*Zu2_,+()wļ"/C -7¬hpԣB {>ĖVS2#̽X3tʸץ&<"eGXm0/k{P\"ngލL4SqD?k)$q-]$ܴR B̒fkSOEv)# <\3hP]䝜kp]E>y 1kHOyGr /%AȔBpm>BRLˋ /R)ea^3"[T?^#f.J?Mj"u{KtdE&]k8?]p/H,3>FHd5iFkXhͧZsSV>byQx(¶ }f+cW^+l~-{ݰܨFT,|"zodžP#5 jS+i8T\)}we9z5(׿%EE!}nj>k;U UWV Yo25sKxRh k@Oo}#`F٠,?荢!遠s8㔎xoe'J>8A# 0cTЪԦ|6ɚ:1i7ڔDq L1$o5o*eztc͐_z(ܹͷs}xZ;a=LR4,fN ~kܣ7CNćP 4LeUjLK-t!uIu#w^^ԁ9*,̫?J BfCOП7ؑ[;|5բ}(0Ű*4+Wf' MN*9w~/V1Hj8 < AIꪑa2Uw ihL/c/bW/:e=zge !d E954@>.\˿1I8|]fI3iR&v\%+,b!W$^,#8 OMr .E/uJinR{)v ](6tS V$Ee 1zwC({X ϹO ,gfg_E(!P _]ͯfsZvtɬ ܍҂Ŕ r1ҺqNY1+U>Q:Vr( #BHnшJ:C:T0f.6(f!hVYL:gwҥ [F*Y/k1ȔTL9%&,1q:~_Tj[ OH1p4iCJ"bz5@KTxI#lڞpjt EzÁgti5=x(3W%* *i`Vlxkzg~ESD1 b"< mBY¬hqOƈܤnxX ²n=W3S864Π+⛛@ GBKA (vԝz\o&ʝ/O_.z\E#F]x s91Z. jd1 @aE GsCznHGgR{& 7oȂ/Z/V>\msgzeb[$Gxfh9_ 1G6=T#E~DE! 1!zf=j!:fp$I IXP_wfb/R w':dV#|._NDLe,HjzB"3J/׈TYMVE^Rnf+jh>af-Y.4T;MYƭ,s;CgGH]@hTTnÆ͛.д}[ۦ60BO3ɉԡ v7(oy:x[ffqgOݒ7r!lq~E-.05rl^r(lbT Q'/;ec@*Hll6H)ctZBMM}&[tJL[+\eNf*MUNAP$?%CrR+Y9jgߞ 矵+L3Xiz2y0\>%κ;Ss%/sv?'3o+|N>m?sM_u0k# .!A0\2eߙz .3к,#lR3 Hᛵo%3MS|K롥C~c9čĤhBgſȠgџBuҠdo{>]R2kл 7AE'֩ڸXJԢFR9jo'b΋p,!U8}H\7,e 'a`\t)yGSb|\7<~|bqPۮv5+ua}Wu2Ľli#ٍ5M҈[.Sћ{tJLZAkinmS;Y<̦f\s'NY?v׷QU^jO&)dAOi/wV :F }#Nh5aj16mg}VḮ: xD/M#&{{M'dI& (3x]S2(kiLxfP-0|B%&P>/|]ƩÕ=/ Mˇ)˩S$ZozI7Gq^7'jc_v=)B3!R-m4 y~u4)-Qi N9,IO3'8}h_4xpt [ e.E _iShtVrA0"H݂!!EF8t}JݝZk=mΠdC]!ϲ ?G@ mOpDL.{,$] (j_ ,]BT 'z6v,AF>^ʲQD\~=! =N;>Fo bFKj &EEYJ P2H֏qyfmG]O WEȗXԕ+Q<ŘҔW _E-? tV:2$0/u/ܗlTlXx/K%ZN]Lo~- Y4 a% vM0N䲼<+O{~(\qd3( rH[=^S*C@`_o3M0=C2MYFr.bQ1.#Y?;T}ŨU1?ϹJQj`+y%<;WK˜;bwM[mr~Crw#EBf[Uf s?c‰(fchՍN'*{@ )pUɪ_?5,L꧛-\S;M, n߭QU}(N[.#/~4DH'̉?M^fv@=Jx䰓!etąoǧ/Kz[F_ `vHP-z˦pX?aa8q?i;,}``f_Q[]ZNܸ1^ ?n,"".uCh/] PϑkJtpH['^Sn\xyn1{ؑ|,ABrͦ ub '\KA(>3`A"Z|KOK*<UkcFG\E"֓hg_ cXPE!Ma h^tJC+Ccԇz=)LbxQ51#3pޡc~I,N^ .H  W$޺NZ;>-!JvD'7V<"܂eS1a2+e=yv?KhrkHg6+Iݽ$Q9ڬ8nhbgߘRY{G7jN iĚRW<~vw [M$u&LQ)4ȒUk Rl2U^n<%}C1j>'0:>>{/P>Jq1S/P }tX.oSoBA0˲/#I~u=n$'6mnOՇL鑍B. Hċ"+#= V:UlaVۚ.tBe~L^tG>9rD{7^sQsL= W̙|eIJY O~lվl2 NqG7|ľ0 L{xjs=6wkra,GY\#MeEÊ;ZQ0ՊzɴZT9 Y"CW(Z{tձȉ N1Iq}2ܪM2ūXJ,6fk$32-:3ʟjqLYPze&ǡ/p.]lŵ? }±`ɺrPBNX4of,U׶R=!UTJ*g~b2٫T?cx>GLA-N7bpS?/ʛ\ȏ\1]\n+JiPD1le犙J)«T$Qk?sĜ6Z<4>~ڌLfy4C;X޽FZ,-cCfߕcFYI eF^WyO%b1qI ^ҏ(w}%;һhVK{xCu[ ʦW)^Qc(Gڸ龀 Q>s~qL@ί gէK^#ETG#a vlPUY;xVF^fQSOwycy][rf ۵bb˵$RYЁhIJak&g8!AbrM-ȾaMV3ш耘˵?D:Gov5׉wnbZLع ihn! ƣմp(َٜ14үs V3w~l;&*b&RA`ec萩*yҔ6t#+0"?'XuxyG}*gH`(y҆惓TX^dpKb)G)u:Uv]%Lua$/;<}䉸3!%b^ϋ Ur]5SljO}aNUM\ntC!ќEaAHUE@"!/w>bbX1 NtC2MSތS$6Ane?I>cZLhz fۂz8xGO H @#.6<b!ۢA|]Ո:NZ+♫rY ,P|3GB)Z9C϶)˲Po_ ٠lӋ wCs>H` =aOi&g%*py-C$z e o ކyz6fq+~9{rI;YMX0!}S@ ajfpJ`$bM3VDܴAkʶ,?n& j[O @[M26w;AǤI~;wZ>^ 1.\g1J>DQgkLw :6sǎSE$ FMD0Vڍ :9\<0bog8S+o+i,Jhz9mε %/ 8EPkbǡB7v{>U%Ս%5A[;xD@w2~7 W;isN-GR?H# c%q󪨙(>ڤꄑ_E$D;g; endstream endobj 643 0 obj << /Length1 1569 /Length2 8274 /Length3 0 /Length 9327 /Filter /FlateDecode >> stream xڍTo64"͂.ݡ , 4HHtJ#!tJHt|/3s3s_s?0krJ[,! 0g'7H @\ [dquœE! #:90 T9T^:y"܂" sȁݡu. $ {Bm}^XX‚ P+3@8!w;taVPB!p à s`x@vb ]2@4.&O.v G  @UVh!pjpyulesζ#ƅDpֿ`G7:-?R`df #ܸܠkl, pbupy8-@m~aw(ApB~ ?xZoaF62 ~P  \_B|77jXBl8FG!6wzAHq@?L 9;z ㈁ʊzZQF p >! rqп_egw"w aw0 ˿L7񃬐_|濣_)tt'c;AB urjsv!ЗNkUF l4'7O=M ւ"͟zuhܠ?6Y9 7$74ݐ# PwV0/p>1xn@5l`8ZPCZJ|޿i/ "G BCy@G8 t7"2>?*#_ꥫ+O٣?n$b3;}m_ZʃscD 0҈s +?n9^a[̾CC2{igދNa˖2nd5A3;dZb^-HNlIk^]&g3̤% *!m%jd{u-zr;Eh3_$xT,| Tq8b EɋP=2XS쾛NcH"k[̚|Yql~kJSM |T&573z>;_"͠; ԵTA%,Dkn{lKeѾ, w{~ LmBQ[U'˳e1:f-L ڵI-n 0"sV~?,|~ww.TL(Iag>OoۯQl[mޒkn]lC+cfۣZ#AK[T; ݦj Y񑘌W:7@#L~OؑIDG<4+:hZ퀡V:$Ե2-4ӳGhc Vۛ88>҃Q4*} 'dLdk!j{8}yoeLQ&bp^|cj܋|qM5_egIIutyIn>/[CO;B'9 z"|t84R?`ЁA5ȇbNpбL›; %Jϣ=݉?+p2f0dXҳ4x;iX"D {p5(*&0N2,lôb ӧ{- "%z-" fV0frwU$9Bj~ZhFp+ZIN+E|0񒫆o3؁5j ^36't 7Tko|R}PsSpr F_ȌҍL7[5*(*~j )?U~X?TEEstYɥ© RRֱ1][&9$Vz^h_y_1īdkVJ#&;8$ט{a&&8eFm؆BUwgi%aFMQٻ*8JԮq 4-#{ywd<I7'SӒo|![~ z oN" oƣlO v"'|"#(E_Xk'(36&w?`!'sq"W1&O"DH.Ĝ:aZC;V2 dJzwˑ%hMA(C.ڡ~v'E8Mpܼ| j-\ԧ(jm&9>X Ļඋ8>AZ';{8X&@vP;`d-w^z;@{wSoJſmӸŭ{5Xs$9[i-1族 f _ 9Fc?J||c%!eXQnyKqp d")kMJ8>f"K1AxwT=dt/)?Fg}Ge{.݅+4q_} ހ7㥪Zr򘭸(IC洆&E.f߽s2٠*=ff5{,EjDM^Sx@3A, rD9V exL%~pD޽#%Z25zaHfiMݴJT2ccG})V)=+~3[&%.:7|12FrI^~C[+Rd" }kR)2t|hKO>!}N*>]{⩐WOirvme%vF&#_M_'[1-WDdą%g`k?s%8Ʀn rX_(ށSWGQ  =]7W -xe_Ӯ\kdcderW#I],I3]*XxL;4 TY[oAu4{p䋟fѩ,uU%6U22O]MySpvߕc4ZJ/q+{aqlpGWxŖR'â:Q <^Udgh?lnϨ?-\Nˋ{ fe[&tw+m[}~kĪy?5gWUNb'g4jLZha` :Y߀b!}˚'HNEtU=;m7LާtۏD9-Y >UMI?u/vV.&H^ޟ*Saqwחc J>4-ȸ-8HpP}i[k?ѧD t=-eUHt!2>:ouSq > TxɈ -4o S*)3ZvZQq tWu]̡g_ְR#o>ޤZV}M}P  iפe]vANA-lňÛ)2O$eO&geF!iLCl;M0{5!?60>DSǜzɽxdXd42|JlBP }}n9T R̛^RɾO11CP;aX%'n0`Ҩ)9f@Kރyo)FnJ15p /q~UO\SL7GIx[MVrBQ:L-'F>st0s+ɛl}\Dͬ\-ZsQ4;c|L|yuGC01LKAsJS7iRݫhn$pWBf} 7՗Ji:Q΁j=5eda"Ρ刎f,6@=2!WaqOSW:7~lSi*Kb}oF&O뿸zsxGF@|Y=_wEd+Hj~z AE1 ؏ST:~M{(us +o p9VKd1|ӖX}_Рf-0OɁл|gEXK:Lc7s-~Tl~#/@U_#|I]y%S65H >sS'Em{do]a2OZSA?KSY~=K'O3+^zD\{Cůf!EGAo;۰Zfn%~_gX ǫ^[śAmzkǍ}-7zâF2f(%á-Vv٦EZ5 D`ˉD0>$e{&3\KRwY]MyL=YZตZBml\4nCbg1ujڡCFi&) D֝,E%zAþ1 njݰd´9e;-0ɼsN"wjWvr Ons=P̓?U5J~O'k5ϰf`[nc\tF5XNi4:8Yg7[9(N`dm&ꙮ2cze:ޫJ%2΢3]to&r@K~YwH !xlH_"F0XJGRG-'IR4K\3nA_-,Mʁ}ޫNkz[wӜdvV}1A q<waJ^(O*r]t,K\UtT:l w (Y&I`f::#]<>l 'K'Dϔagc G71+̖l|qK,n4!eaĝm_SlVG;`pAoD2xcrs}Z)d_*꯴L0drǸbᒳ9f[`H) ;2̻ۑ-yE=LX13.{T㯀ea̲,/z뉁VOKG֜ -(@ JH͖` fVjvuͧENA4sxMl)ywm|VȒ^櫡Bs60^s=]#Q95*TRoxMX+)Qa1$SXyT:+:uW#.?i/jNk@R)Zq/ּ7, }ߊhx$x_&p՚*}Кn) r 3J]?}w8U$]ߍX QdRS4 **ܞE[\&͖&.~!v;WrOxebOd1X9o&hd,|0 }3Hɐ81UJ`iB 2_AƢ|^Ҫn3OEW,^/lDEk6 @4x_ ЄKQA'PrTjd)Mv& j,=݁|Ӷ C BO$tm2 ?_ޢn%"b |b8ډ+|E-韍2x2 |h]yau y>n: k*finAԕaZ@FQc %dngmiǿ͜¹lEoq]"Ys5 5ުh:Q2'{:}CE7OFJJ!$SHE%Dlj4!^=)8nf-NݞCyH ʂPLce㺫f$̔Z*p]EyTU/HhuPX zUjn,1]IO|tZL=wfAQP|z6.ʆ1\ ߽5n3W_'^y>o/Nf&:uӬY0=i8$񲅔Qz{$Gޔ(n+pJd`A)u嗵Ecίc&&'z%i6k'1Il^>[v[3Iۦ:wV2͸zgG'n4n\Ct~ m2^sGuZ)ƋsWOCZE N E|ULJ^B!GZTXDž mxDVqr>us/H( cAzSr:I]__]ٱ7n4rB7t%^pt^R;+jo?F5~;ƧmQ5'8o@-Z=jyR :8oݳ ` endstream endobj 645 0 obj << /Length1 1393 /Length2 6063 /Length3 0 /Length 7011 /Filter /FlateDecode >> stream xڍuT6( -H %cllAR HH4"!g<=;g}\w\lFJ-Te*::@ 1OBÑPAAAOuWGPJ D"Q2U<@"h.' nҒJNP Bt@  r!p(_%` -D+ܠϕ 'I08wiq"иW4zPoo?+#AO8`wԵ1~ 9|~+@  sGepǬ  |p;wO?tGxmk@\LpW E KIJI.&3WӍ íAq?$hAB}w - : mX 0 )iY?Aee[@E$!O&=/ (bHun),. }+FUL]Ź8 +'$N BkW :wTA aPLPXV{@!p 6&?G@hW .KXb8^#h7@h0. ʼns!HOK@(ȓw8K n p;(-)"WY+ ۿz@$cHlCupJ%Fw;)D 0jÏ?efLiO[;*|Ϛ?^a})MU}͞7OLcxI,2EN<}m F\>w;&K>imi,о$pk`c"~Hw7{)&h)2"Y7]K$νbgWv9C1j=Lbgγ6Өm5Unґ%4Ys9dDI6țҾ'ARٟyCf [zi'/.;h|Ý++{ڧd!\@4:F,|A,Y"clqmf`ɲD;dE@taBbvuݽqV !4}Ս}I7 Me/_LkIo$?m菶*He|.fW@ݐU?LK?B3LLX{gl>ut%8ĭ; iľqȐ k=輿ا!&+74^e)w;z6yQVxMLw%;;UMĞҗ(vg VEM6&*4m%cԄiw4e!sIrVG>VN]zWlVOe 1uzJ,h*RN !uƍX:*,CZd. L4!YShj92Vzx1nk_T:5 wMf'ݠbiz+,]aj?q0aNIp?$5L?,\q9(Y+,?CVJz([7)*h`Elh K?k} 2`Ѡ~{v9go)Mt"2:$AlWU `T{^,XNv93}ARJ״EHJF9X=3x*z7>>\MV9!wt/(;#40Udͣ]rD5 (t;nٙjiR@ %48 Sn1LR%ݦÍbR4Ct(2NV6BĉV&AfQ+%L"HEŲps pO¶~rϯ}VE{:+y`QG-Jl+y{Ѽ@͹˥RhhX<5W>x0\ٮ~3^A 3 (?sIeэ }ojFAii_|(1=thPI7c&0.^dtaFL5:9vɵ-V}3 mb.3U 'oappљ؜wP*?ա%sD\>%~(ZxWu{~$X>V.}ַdˆL]lKIh'%H һ&:sL?쟾߸f_|3ڢxMT1%w頑t]}v87C}أG.G9 [A;.q_mX+5:LRVC( ̂,] }eq w4syđKȧ|?r20VZT5btLm\ {xyǗ-Wہ U.!ɟ}ߔ|ϖH Ʌ #<:v$o틆Y֭R{j~/&m9Ofӊ? RR 7?WQ ڬj*c$r&ec@)\?_f5d5.[)f%!RS%* 1]uGԟpIzQ(H>Z#'1]˛GԶZs)Yb5z#XΕtP+){C.2ŻI"fJ3j^: {߰W  :k]9(I!{e)+p~1|Iэ4@z(wŨ_rIj#1^׭U/*4V@{Zuf=rLDfaf..0'Qzɫڽq~n?E|l%xN)Qd.LNbp& T0h%K(m.߿ cv4 M0>Xw{+{dߣL8(utǫ W f߿qNk#p}nӌbkAHۯ}e}F4+!bпp6j*2Bn.ORNgySlh}Dn_+(9vcsoIl:lSC, }Kh#[rp/'^beTu~/(Ezӹc] ]@)ݩl,A$:>xLc16</U",yxNqeBFQF| U2UV G뼜?f/B Z[V5nڣ&d>eG?PqmBY'0B+>Nr{)'6vzt.kL}K([GNwj )_јMfp-oU秗ʅDJ+R/D,ؓZa漣 <@aR2?ʭ RǀWq'pϏ)!(%-'A5yFZ7MDMbrcjnܺ`*v} L<5OZYgI r&GM,xc;CP,D)Hh\;NgmF(7*sL0M %C[gIwȱ)ewf=AКu)d^z1P*bIF71Ƌu2:x6ChVxH[G]݉$WG4߬gEUl&XqK-=ҨLp l).3/cJ[)/(bI7S[GU,*ME>"r.F2o}SE_>T>X!:aio8 ?EK|eӃd9'jzDwKH׼Th9i*0UY-(%."u16Q~Wh\G1II˞ܮ[޷ۘ-wXR?iHyrNs᱃ea D,њB]G؝7wlB$Oh}ßK&-5#M:]oz[ꌿjn.PNZ0.7C^;ĺޞ0DAՒ #??+> MrJY^|>R8Ӆni/,7}ݲlp9.v_E9I:FʫkvE!]y3.pe˹Xr$b[zy0Ѡtu*b+1&1ٕOBAѢ͞a~iWMn%_ϡl6:4|(jS%lcq>av5;g+!y/֛7o}3::YXvʜ˿e#E촤nV}%9f-ù-XVzK6kIup'O-&r9S>Z `l ?~/OEgc_z_ܚO>_{3L yZ|Zmu|Mnoe'(Se3b N&CuCf}LĺHʔ E^ɤHhC.b4~}Ak3w2\9>ySj{`u kvjQ {|sTeHjy0TH t={e`9mlŔ$v1Wy띜No)F1m9B~iPOyZ, n>b  ~)kCrݣ%2_y)k+m Oi>aY`s0.kj5N\J YQD%`s>> stream xڍt4\HDH%Jc2{Ga`FщD !!$!ZDQ"RoZgsF X;* @$% q@`c&"=p(,F 818F>T0/ Dܗz#}~S`0s f!( QA87%p$ 0EH9k8R`_z/M~`.]ev)2mPU&]Eى[5"{TWo%MgbxEg"YNCL&gnd7RU1,mZ& ӯ v]K9 cfiI7?隦jcn YRbR!4οvSⵞAoFDkjHOޥzDju)|m~Ɨ"'lPڡ05T<-g-1^zF0Dd0Ez,]{bӟ!,r4ym<j4ipI'`_\XT;m7Sx ~FO e*88~TD~)%S#Q ɡ29U)>U_~et-5l{fw[-r@ȹ$Ky0cOOzSb@ŲW8s3Q8H\bOM^z+;ϕ~zVHtZl0qe'q\7ϹڛY-74f8[9~En;ޙЀnh-(+nsۿbT֔f}% 1/~nӅ=:F_QǡJg"Z K?w/^{ #5rN=2-J Pי0sَ$H6chXY՛͇H_Kfg8>L; T!wa(zԛY߅)g"S׾\- =Xj%[WoSG?[]RigAOE 17y" =ɍ1P!S9s°NDžԆ.͘ 0;.:)\wwdD^LmihpսexnGŸ*Te_I܌/߮5>}xd3 R.af-5w^VhaNl ֈ3{0^TFɈO~:dS<;V=ZiP"D#aTK3Lt,r7U@/ׂslol2wh-F݃]Lw'_mߴ.LG?%*be7R1}4a#߻J%,q8rjBf4{ {VjsZyejԾɂ.ghah ZJBi~ /8gb[(hK5.,ܫ+>_m9ҜSh(\^@1'BQh~hpPOq^iOMu;94F ;ǓfKI{s&*= ɢs̝T 4{hT[`clduV0죯7/3f[68q/pt%fD;_ҩ.vBXCdZ .Uz&o]=62{yvvxS@#/_lSZmUзM_n zw#kѥGPdKjs;Փ,G4%[I1_O{J1;*8Kx;I0gsq]Eb=tҚ l O꫋|ș],<hlU4KeοBSDNϭsNu0'R~]^rZ*)C+|}RoNq`ЍvO:{jV<{?&d[&b+ݾàNs,$6!Xs/nGSԴg ĈZ&}=T ޾?e)%C#m) p<]zx+i!G`Qw8kBþ_w"^t/BpK9i/WJH'tgpnj]4xpPǨ<8rPc0|!YAQ֞|VJb9$Ɣz|Hv5MDdj¨4{h1$vy!fɤ:gw+OW{r(Lĥqc[{BkUS*{alDؐY}ޝCGYqV׊DVڻ53zhR@XnMw%ڲ'Vؼ_Q# n zUez0P wOYa1z[%HUg27Dncg$$P$@2+~Kzm)z u8W՟*߭ȇ^T{:sy?nJ]O7]ˎ-9[0 zvb-Zǡ{<V}KD,:-|eXt/*B}4bz4(:ZAg"=N?9J:%?8ԉhp( 8ʼ@B`m1G9G?>nIJNF(˷r~V8Ę6;ADWXx:q ( pW gplV^扡RzK>%9IP BrXCoc7/x~h(r5Er#׆=T_%z/8U H~y427|^ e4&W/U߉x}t lq܊ WEQ<YŒzee2ߒתpM;֔ >=ޖkΌj/4:"Ģ`K'JqVw(hܻ\?E}3 ݝ똠#quc8́6urH`5#݇x&%ޘ׍,ܿzP=8l.yD{"yJ=zc'h{K4vKޤ'yZ6㺃RW ұ)=?>{,7g@AT`F̝;<2\ %_U9 XY!WV1.%}c' sWI4.NYM\}Ǩ6c<#)'nIݫLe]Ô w #;YKُҪۙV-Th_SK*oa_:E²Hv gZI3*Ǎ}Kn,gO إⷎ=\޴ (X;ܼ}U~rb?y25Mչz醢ۍI?RӁ`j9~ni FBK\o`mN*Ú`XYbykFWڤdmߘ* 4 B_m.t?t`4Hmkɿ~GnOv!^4X b$ CM_)W쪉~LeЄo{;z" 7Q8fa-UqԴa kvP0ݦzJa2zqE{"iaoxq'r1ocRkVn=TTd/<|[sKSOpe&n?d{k9e4]vag^T& ZS"W3N./'jP|[G Q W.3LĚ&zݻv+/|acp*[NNQ6\wj(8s.QAdـg[^ly/ \uQ{cQj7ه2a=ME; RR&'5'~7ZoNsj(%oTdٍPNb݌qŖ?C˞)vO)X4]mES<2v'e)۽Hpvu:T3nɉUgP"ߪ\i`;ƄjobD YN&{NVs cN.GYR1tGeq$ȗ~{߅pnAGW  yn9^]Vv./'gm F"?֎׽+~7"'P9VT <Ԋ>qd:Zn$^MzanU5;gԍzHsx8Z#żis!:լsgSw$C)}P {7I,wi|kUݧUm+IO*Y7H }BdcUsd ]) T? q20HH{5i[;wl|^B>hmg#cF(&=\߸((7 #ep/Ad@m4g?tƜ<>3ӫ{7x6%攽*hœAҔk<[v>\-հ(|u(/;]R2- =wsH־k)bon$8w#{۽Mh2쬋>JFȞSh:g}G…HB$:Ik^"vVV=gOdw5Xw.۸3YnZ6S#ا|Ff@˞yLךuTFm_ʪ"Ef~gLT0{\>DtPGz'roeBTXQv:jP1u%^myJ;F# K4SXGӱ4sa.ghHwAc74E,sʤ': Zl*^Hf.Pm:"2yx7AD y,Ah4l F/R-~\ɓ? O%Wj_Z^kjiڛV⯙E!I,ec.~Bi!O6YvHE/o؛C҉$~beHcEȶGlW0 E ~MeԭD"ΜZZzpe7T0S퀙ɛO$1IΙ;*~=HfW˦d_eT&z3L=yeGU?i endstream endobj 649 0 obj << /Length1 2747 /Length2 23975 /Length3 0 /Length 25501 /Filter /FlateDecode >> stream xڌP .L7].N^tw#"Hwww q{uw}TIA(` Waa03123"PRY#Pj]y0udbƮ ;y{- `efCg^@ `tAuprtSZ ۿv@g+Sc{%`jtO~KWWG^&&Fc;Fg Aڷ+WK 4j`l3FJrUsWcg $2ڻ<̀Pr@hoo`ne (J1zۛ24uq[  ! 05O{.V..VZd4eq{3Q;; ¯Ĭ{1Y{{&܀bDe@W333zZ2 KK `jgeBq1v\݀~>*XXfV= 1o Z'@=?e`o2iʨɈ:O;3d\~ dlOJۛ;x4sRpMr=ffS?,TῢH pKM6DZ7W;j>ZyJA1ZHXy͔\M-fr_WfkeTrpX0Vt2=:\@K]Sۛ::1VNh aݢ/\A.P{~sg_0 8L"I70F<&3I7b0IF&߈ $d~#P-ToE7բ/բF쪿(oʮkF욿(oʮ/e@~"6#x~=IM~#LMmo9ۿ/_(鿈Ħ.͘@D܀.=e^ hfb+9מY~qM{ 'I>9@A\@oeaU;-j ɻz8=^@ t;ߦnΠ%࿾.@SYSڐjaq)/ > no`i҃֜o{QiI}[a?+=>ƪL!O`(\7@OȠ&h%CF)Σ_ҳntin,SHi\2W"8:3O)$2~Gl>:Q3+j.xx:D裓T>"I28s>_=[ H&/32UY7ո.tlg'B blה4a:)bUcְ;EVo4z̭ y~Խ-7<; |ez74Yn noQ2tD&P{"~s||ffn>Ql(3i9[t`NW䳳|B؟޳v(р!DQ.Av 7i{"6Ec[W H"zz&@bּ!\HX6v44 %Bƌ)8~$/N_+|ϴz ntѫ]żP&׭ N&.T~b31뇧d`Aj޶UlB&$+Nnf*VA-i 8}p8-j̡s %64j 72(U 2`2`T}>\015}݇3R3L%#o$,<$8=UC)|^Ɠ'3YK|R^~ڝ7ϧ[fU|P]n%W!6h6nb%?; ѥ;)Ed>Δf?gY7l`VRS~7^ij/ĔzkNZ[wIu o[sO몞3]gi3Fp& Sn!2~h2. ő1@ &Zy&KUyJ#SZCy3C<κn74pl8nOvt"ӭ(^[7r~\UOӜtmte<]kdMiq};rzWFУ#~"LAO9-|QfP&'>ُ-Cm !cR{]X}kJwҖPsDN$`pxX' yqu/$Cp9T/MVgOuLJ< G(\o>U>ѵ-I(t.oF73rcK9~\As-84lVgH'҅8V1=BBѐ`By0R*Vv[o]iVSZ_yL^v 0F4$W J#kC{ $J԰# 7fyFU)ZeURft Ҟ0~5Hڟ%s._"ΦdgP"kuQ])_һui:-3j~jSO/6Sk9L0'B`#$ !eHEhP hX[:3I3Y?>6Ӈ[2Woy Ew<[[nebBl'z⒈^g .Mv! D'kTT$Q3@xq񃅋3 I4*9~.(f[ $zFzAob` ZʑOYX߹O@\_}7#ƛɷCHZk@ wǵ#-䥪! "Adgy<yUZ5,W1 R1:3̞/Z=Y< ňj@i (~d>Cjpr(FI~t{VYFjheU:>`hqA\h9 ~9SiUXA>)<*% ̸L|FŲ"V8=$U ]ʎrh?6f7\0EQ#\nBX `z0Kb-);AD &بQee8oʉk8b~fU&Sb'C!$/$ҜO5Pw8d5a}KaRI:-SUn~]{}W0IoIډG`p;SYxUGďi" UaXnShoFu?Yj3:xs䕴%Kf&y" J&q?q[YGKD n乜+81[U&rѶ*o1Ck>-f4.wKLHU*= nƍ!DQS6pi\!Lվ{>EiJyd]eZR-2ɒ$=jsyIi-MgfHscRRpcQ$|j/b7es/#P,,QZ HQ}&j;Vs._j\^3E84O[Mzyhg"% {m%#6_[wJVjiҝ)ޑ#\/󖇊6FM'i[wHn^I+n~N}=^+3wGoVwfZJ]dw*~_4*$|q,w_g 8&G~> F2EL#Gn!a5|s5/౤ z(:77"){Q1x-t*\f.fVwec3O"E3bX@+!Ci[LVV!V>2&&@޵3Az D=lMٱٞϛ*w:%ޗ#{$ rTCyFb^ܓawھ=}Ú}V(V01@޹@P=yiq`1fV/=߇\Z>@1dqNU7X*u,7m"ՠgIPE .nKke}L&Dkq0O*LW.;mxJ'!7_??c,j%1lvO,r^&#܇>^B& /D_.pC^| R.}d]wꛣ۾ 3 Iٷ{.X/L%N}P7(:!b%BHl@Դ}y!AkZ~MKmP׹W ̌orkdsW!}Dsg/yq J~|adS7SjMo$no !!R}TbzARnӜ_3نL<ɛH.ITGyKMЎ(]ebaGr_O҉5V{<[`i7OzfCr8tLHU*ư* ӫQP ~{,4/qճ\_Nf9 n"!d8_Ak =@-bB8ք(U-6b 4w挭BˋQ4agOd0zo8V\I!YTNiD='a GaB:if?=2y,S6En搣 ֊GhcBQ a3iQ#@?k87 tYv|@YJRI~⧬RJ\=8Uۚ sC"7(Y)[v7w!- 6~U /:zLY=X88Ǐ{TտP2:ܠhWVsT.PP- UtT,e4Q/D7/l_'X,G<: zWYY#|d3.%Bn2Ō@/y(UJ<Cjr@l \IM~sa7آTY`VY//k+C7B7KgE" OeE"(OsNfF'oP`նl#5`#@эvt4&W`T~@Md贽\Q,h6Py5 EĶ/i͵xەM= mB,^q]7+{͠;9D L١f:2þ$lLy6[/U+zǮ'#Ty/liX[HjדM|'Rk(R2a_.غi.vW0/ ປEHŅpqzF\6f[:et^u4#/1|>ٲzmx@t_r~xi/5K({E8R׏>阙=AJz\]'*4+'0}PrGzSE%Lyd/ĩ#3Т'HuuhW {~g^Q܊nea&' Y2҃G|A39ʵϒu/;)CДCh)JҨd/aOXDZɝ[rH7"*, 2qU ςpq{BU1*Q2~6dn>1:tWxh#jߎRV2*/.F;_}3_V_% k&t>fo+U>fK2{"8Y$pn= CԳT6}ſn-*\.lBXbSa~8Lbd_b5AYJ"J~`.v}i_#V7ߓc~7}۽_&!ێ9kAwu!\"[JkIT2 e=IVqfMSqjƍ2}Xf O=Ih񈓱͏ x߾x#/w.}@sӿҞUruQͅ!d]D n@"gR=LG6(TvεoO1([58C /X"`#7vk!M$Dv&;WsO\Z?Ou6Ž(;|eUKPeݘy=v.n,hYLR+|--I@.C67#Yw=қf8X&곗#\qV'rr7$"Yo͕,Up'478`0O+gp}-H8;bI${/sR3brdC80晅dor}MYڝYOtHגRЇoFmv,2gjHC"" L)KSW nYV5$ed$I> r+-m}%la1;VS?4ҷ+ʘ_q6%y.ìB?'ԖX\ߣ-_bTetӵ{ǹΡkk;޳z(WeF3@legZͲ=TAʉr$6LjBL~d+qdUæ|,+J4B꜌jnD0:L?~ n`xdW̕9 V NE\.y.u$ շҹabX;drJ{fRc` oyMF#yUqM!{\ub N J%E}dkT1:V9gE*Vk+ZPtx_·{sɈ)$&˶UDX!cyZ5ҦG]JYƏa |/KtPql ªqj['$͞@rHI+!l,r}a<=A=oZOTo%ؕq+z[%*x>&U]l/a_ݼ:TdU_nsspx黝>M[4ue3{Em( K$75 jlLOGJǾU${#:J`@8 ,1#c%+SJ^%O۪jM^l`MyziQ,-!I.x>s"(/e9ohom..JQ-'>xR. #*"SQV1.+%Y<#2M) D֧lVڋ39ci,cpQN)Mk8%+MfG,KD QĞt+'oYsMn$1^XYw?Yr8 #0|2Z F# հټc5{‚\L#Obz:CW_ނQ rƟ'_ RNx%>*M#[-SIHn{{+rz\oCd xA*釁[0MEwgb(D~4W?z[;be;N#V9MWQRnZ$wARі{N[^Lm&쑕ݖê3G>E|?* Sw FGj*9J^)f)r+E4@ᄅc]=;y2V*kҬ-iw{g_7«[b'6-OsLdy#k=tyllI$H] >u+nc؎ 'Ye߄45+2hηs兂|5Q'(Lj,upg=ɫ Jdb_D,e+:Tƅ7abh5ҋ1#qBc?.}5jt}UA}b/c92*ᚲp[dzN}geCC5?:*U}:bjʜoN_]Wuz}!Cpt=).&ܘ,3UR_ 8e#TQ*q [ P C"LXneF>a=HaTs-.}ԟ3r#XWXAm6n6oczQ=hxSp#|J~V3q/ W8hFЌ-}iTbL 噞JنL@*9t|?CquzY88Rf&.wOc@\ae  tI7Yki sBFbk;z3sO*]!^zώg$5БhJTsnC>n8c)%50ςr)(,:ْ*1m(rLKIC2͉U:c~r) }T^zR[_RPթkSV+Wf"Uñݎ[.:3D{m"nԋqrSݼNFM1ilGD'.C"-x8âk dyІO47_esU,RUb I2N(4Hfr-.V {`>^Hu>^5!l:̗hTLm"dt8Mط?D6rA4#f<0h0Mf_<ށ V,x%sXrO767*MY<թ:NBW-ǤCʻ^`7; *vMY*8.ps;GEI"#gspiΛ\CnV4bU]7y"J|뫆 HBLH0C~v|gh~Dh;ְ1-[ߎuđfЄ2`6RhU6g),yE^hlqSn@3-wLsnhZ$Kj~vpWb&(S N;4ʤ)si'l[hdQ<4Rx4OK*EI|Cﱑ'Z3C#`1N*O)yp%;e 1.,ۀw(.[]͊;aBD(GkO>r_d$Zr7}He %z4Cd*Z:d+q+s(]7ẒؚX|ɝ"?ib1HČ~7[Ko9:P_@j xP3q>3x?u֪S mmn% %ZђD/q-~ܮa<~; O610S ᆏ{H?I&/j'IB9fan+T\sGA'scf<áTD[|!$,aߗnM@T z, .nOPMAɨ*u7c.;ʵMiߦ4ӕ։p"35͖>D/P6\% "a'tv*/Dh9 җ̷%>%-ykXuV#fs<859;ėDfW63_YF: NQ Y.V˼}o&krJ?GEf7J'edT:Vo[I~}Lc6l{=q9D,Y4h\2#=eqQ[u~. ^hB{/O" Ͽ$ᾤhr^YQM|xʠE-:x!-4冟,0Y&4: S@^O d jŏVThǠN8^Vq2;6yUl4 T>H!2zM{*C76Zz ,PYKU^CQW*FA䏗GVo PEM%]bB?!"d-&@ply vv .?bµCD3uY ZKt"S(D  Xu:~%-0CyV7ӇpT T6o'dێH\d^WFA0G&rT6NL7xIYiȞ|I#t.%-Gh[6m%\Qn慷-E65a  u!F7` M]*zOB noxyw1tVI,A;oՠ$29Mb308xQzt4G-'`W"g8 C3"/5'F^.ΐm|?XNfxZf^PFG'm#| kM(a3#!rYC͵n ܧ<Ԋ)Wi 'yV%]wjE/ [FUv1x΁ X:5v-h5N{ ~~Yި`ON#XX;&:Fa4l\%"qm1O6:/CI*n_B] hIfG[dg$ֈ@8ͧBCڽE'ce?1ZpRB(" "k2{ޛ\ Zt"1X=rU($r}9d=G2l)3x[1%0•J,2hN*(vX Kxʫ 5ӈH5]y_m, -v"txD ܼGb +?ϖY:!݌pTtNgRy| H 7c9yhJϭkۗOp?k!IZZCjl~;De8P=2q>lf &8hn Dj_r,kf2 xCOS߇P#DHV::Ƈ>|90YM!SyG5@:>~8Sؓj >ϑO)wk({x}̃tqE@yL+'B;0 4V wώsq$jZoqQI|/<#-\)ߍ*7HShsv?L֞Bܞ-PΚN|U O v̎fq&ȔT_Gd))n$Viv >F<ڃ}FFi} nnF ȞD\ ""^ u9"!Xdtg0^~i)A{gp8""O}Y(ÿN9Pq:GL-RNTdZ%xWc'^OH'`ڇ JjYV6,.iתvmċ}X?SSaKVzNE 2uUG|0>(Nu^FyH?OdgzNcQ>JN?وmO#|uaЪ捨 ֒xnjop3o~&5mzUCo 17- HYKcKi (N5&cTsv!g3dc UwD%w\"shrk^.`s{l3k_ 3ptf",["K׍ʖHzw00* k[Wp0G13ts4AtO=.. OWݫxyer|Vϐv=*z) ?qMQ}s9ih +ORjsWnmB߲v",`z1Btw&&t1Nβ$ nI08Yg=3.S}βlV @c\M&YK+,f L|7\Qd=Ah V$C=7'v[c/9yAG({S,KF}H&,xg)r59ٹ=#1YL@{ mϧ>=&bZV:/;F znTJ)Qi\(P_U=yy-jrm՗$F=6q!! =!)y.YwQr=>ːmբk:"+%Z] zjn@zbC'~4 $~DP5'qѶ:qpWƮX^gL:W } 1Wsl 3F5$5 +\o1X|[I;Ea3=7튮d%AMbq6Xo&/Lz-]h"n| C xI3b:jɛ`Y9PDMزBG%SWw&kO? H@-G(ك;ANsfJ,̞δx-D9[>76fμ Q4@6I4hQ.yeg?k|:C\hDq B(߷J K(tB>ʭ&-?#lLXh8Vtu0 :bڽGDů+c"̎;z,:]hq\r7m@@];Mw4sk ==ނ}8=a-G=%hT[۬ԞWV$z}(J Z0p1%Ԩ\S>%}'S`:kJ(c w*\dSo.hpŞ/Rc3F?w^ q1EX.Ʊģt;}3%3FʧՈb \Y5#-Fi,K7Rws@x0;z^p^]P̞Хa KsPigI+@s<`ϟZ r(o'ÏHm._  h[cy*/fú\9a^U:h!'FTf=soi{d;h]j OEB]$7 ڟ N|ċ&8jBɋG?vٽ3@nP_ѻRv=F͆oÉ'T=Yh)Ɲ[ZʞNjcTkT.?۸p>+HʻS¯0h`eU7`?+=ҏ-E8$EMWKf[x ZUZu ײ3Ö"77SMR-_ ,DVrW~:g|0,xrgF˄Bk@O`b?%me.\r 0)DI@ (`egS p+z/uT:-qϧ2t|)W&6')id8 ʀ+~b pX]j~'[E8;&3˯_L^hV =&c*݄Զ>NgOKTÁݱRl"4땠/鼆%O⠼W\4U&MWY63#|!-8_g5Jaln''磊`PDc hw3"v0$Ro|SXp=*7tdsq!sq=IKpɚNJUZQ]ϺASU YDg;Ho-ل)ӝey1E`jaZ3LFWʻ{(ٖT#\ Z;T ʈ^u<<{5 pZex .;i SXwq9;`'0/mFܽVzc%w42Z$۪Q@C7TF83շUMoD%B(lzb>ZJsYH. f`H, =12]!ry2aL\K<].;8(E^:KzZg'!4*D"x6#ħCQR*y:Y>yKyL,~)JWXNOJLfM<ƑݧqRsMHcu#LmnpJHNQhɋ +w[qm]z3! 8@Cep>F5C?1AK*?ce4lQ5@WcV.E7 <TnRpf"v6'&wɕ,-85}dDz >(b5Xoi˕cV'(qÉЉemϬ;a8_!LOHq*n.K'yb/ƠO):@=ʞ{ u~(磃56l/)mOm:f4pcogf ]χ_W >gY7Ÿ@IMhZ@KQ]^|bTkS J8lKt[Xfr/9NHM >Uy5SȌvmDS!z&簋PrjOˇ%XSneq#*O .;1bRŘlGN\AR[;O,\IJ*Uk[1YrA*{Ōu g`=j|TXjlòcbp,â%; ̓94Zz4k,ş6_Wrvd='x߇!/g1vmP%92qē#NEkV J t0ֶYFgT^1辣dDG_@kcx/ iiX2džOW (yl2lP\7 S=' YIЍW-T͋[Rou_T-)%hr65:(uا"g=#8L7ecn\uzi->Xk:Pz;01,˵#qcI(K'jӤ0B5lLZX 9)$?cvCqld*ioj[d(giANoMфzr>® lt|rd~̿E.3 a pT3Fha0+POyz1XK0' 07M.TGW7 Ͼ K;-5΢-Ƒ=obB24Fh0dgQq;sqqU8uɗ(R >%)GGdzVGXCNJm`WܝU 8+O!Ey},4 )V^^q܈B/_P40x}U$1}z{mlfsW>po_.On\\m  Jffyq aec>W'I͝gQ9Sc8ҦJ C=plV\ (EXF[<pn7xͻA  {{6̩P mx+ڙ^jd˫&P)G%{ܓh]?c3^E.9CRAUfA9>\bOi|8v`o'`n*zZEW2(ROv{8]!Una=֧fM 1wm#Rӈo_Dn;AcF?W/$ݶ# u'KV>G?.e+j&,UW *ɹ4_$CIiUUT ڤn T;owʒn#nYo†Ig{`Q88 $( 8 v6cm(ŵ vV7>ܻ! @q"bS(fd.f^8Xk:3SM;J 4k+ӟ3A+L, nToՙް2ŏ1!r `L̻$i.o]dI-`DZwrU]: mlɍ_veD,,Ǯ>QdPHvӺS@ )Jh60W-]6^ְ9Vʚl&qyWz5rzg)Svv B.OW4:oC>7ـZz8W\3=ZLl;D6TB 1_dG{g=\9y/ \EҮRͶ ;Jq[7r0D{6TR=xlӧh;*R ڿt'|,Bt̫F`4>rdv6 NX Y"H>. pzC8L462l^x*1«u9WIXa spkMmUj>v}z X}*ߨܽٴ/y~/}y6RXbd,g~RڷӟwЬ֋ѝZrI4;WG9sRSd*R1A=L:1~Ze) yK-wx(W`-} = \|lpVoIJaf5IA(h}͆4I,Q@BrCX[^4E:2M 3QKn"R(Xbys]'P| -L/u*k~ oaG+FN;jKv_Xb׬uIEntW;l_ 2A_f责oj=C]}avG[G1&UEo8GGyv0QI?"څ崍kJ H( P,j~NyŶ,9A;*H#lMq1[1/: 9:ugo2{lX#t3/SO 9+5xS 0z$D?^h>:,l<c~ӳvXΆVW 5-j6}^5kot@z#qp >նWsNz:=|qT9W[D8}9AogvavTU~:{0Vg)QrzMrd :Y.Wc$c<ÐHNn&^8Mť:ЩϮrE~N:09j&4_32 *C8qYK#+,WF;3CWbAqKOLٺ,}2?*2ecGi` ͚}~sqч@$D/2$;ba).LnEQS輙dԜ|eVƖ'̼pJW{dnIl`qdڒຌ%[b{E>K[mF2HKei0+XSdXWJDZ~n5g:`w0vA~,q%{#(@%E^̀:5i>L^w9G+}*aSqB!yt)vs~yʃC &hG \3;=P2us\j9R \gQLS,RH=:!M$<Ib10, WL1G|2Ѡ6z~I#%ɯ[ o;8bZ~G6iVqnՎǎgnK7"VdEhUDq<EwMCփrKRezFl| endstream endobj 651 0 obj << /Length1 2028 /Length2 14324 /Length3 0 /Length 15562 /Filter /FlateDecode >> stream xڍTJ w :kpw`pw nKp`[pw 5\]3OUu[U :)HPTccr0#RQiXځcF9X; $oq` `ge@g~$ w\$-\߶Z3:b gk3 tٿh;Y\W ZA+WWG~f 0# r9 Pڃ ae] @`n`s3ms@'XFtYW"kߋff@5`am(K+0z2`v.o@k;[ʁi1UblbmW,y;e)=>Ikg۱{s`lnWn,`k'7BLl W+++'yY^/[~>"@~/D;"` #fYol g}=6_2|k/sןEZOSRL៊w0qpع|.V΢ ?Kľvg6;[ӂz܀N{+[_Anvviv^ xY7׷Wtx 3 sk7śh"m 2Wv5Yk5dv`_ &pyȿ][J0v.nH\\Q4yf[y~ gĿn "!HxXXdETCo9KoYT[?EqX4Лj?SFǛj[7j,f%η.?9!߄ _!oX B,o[;ہ IiloJ77U }`Uۛ22"כQ~ǿ{S/|S/|SS|G[7dܜߞS  2C\w0鸯#`!4CF LW|+<}uGFtWk#|x[jq^;$D/~b"& }'_@[V.y<'7^T{>φ򕱰=HL1%TspL1=fong0s'^Ic8}6c*5]S'?H[)-pK߲Ob;SRw>4}-)zM6,3|U~SԅQ9UَK o1^>\ 'N @Qg9n0h6D3`2#pMlxsHnB{:p,akd2USSAm[r$'܆lb[VBX䬌V&Ac_Ht5G;b5UyYEcZ·pe&%1÷#bӆ\iW}vufX*\n.dp6Eh؋C=4bPȫOo$`9<|^q}ΓSp Q篔z4:'C#;# Vq S+Z-P] r9U߂Ǐps'c)a8\A)CgD|2AV'WtS(]Px $NnCw=h\$ sгezgE 3OIV[O_Tf((\֊,j{wNpM7mV\_ϟPrU*Ss8Z[EMJ b^X|Ǥjw_/Y;JhR63y\^< )V-Iՠe!*z N47E(.UN[b)0cj$?6{L$~i.xecmSv#/PiԝD#Chs73a$BlzunV"U7>Fdn ަuƶ]/WT󶅊lbLL! Jk^c±tX؏K>jA1}9#⩟ylS ^ؑ%Tȯi[#]X͇HRbw))= uv8W4)Mrk 7Vqs-2JUɓq V ǐa~I4*ME7M_03<#V n%L5 NC(pfZJ~ vtOsd`s&r%CubɋP:C։ ]YqlK ChP-އA>u`:8)N nL|mSˬq@]λ7]ן-=6KnW^GfԏC `Q7}:bmIbZzLC~ a;^'a]`Մ`zFCQ &{L=!<יj~s%Ԡ$}g^/Y9YdRLj&<]<<~Is,^SGr#N?+.PRsl\1r <7f ҰLĐ0%#e O ˆF;=v2o^:d5 e8\'L%d,JjXHXרP%~Tut{͊Oi/x5_ Ϲw17((S|T1 cŇָ$R4GYRπJSRḺ蕥P45߯ٹwA>̾tE0FU1acYIScȠI\6kfl_}@5/Wm?aB|2A VҌXD16v QePpDC7j̹Dn~ Cٺ'LV)WơltַРe҆\.0Bk^q!NQ'(IW<%ʱWR7I\>bCDZwu,)^J$%EvUdvCA6Kcww/Ii`٫Y "|eOFb0xEE8Q bRWĒmǖȕ@Ȃ6նSSrT{No$G@J!B5 ?<)+᝴;4"3:n@^PT.V qdļ>&5|Vg?꺅3Vsj? w¢I*{ޓ@*xQa\r~ocoKz9!A5![/Y=%AL郦f򈀿J)W{sᐨ!w#c)(ma!4܋_r0U(K5! [pdRoGWwnzs +T$BWWgm_n @! dx`R;YU-zXoHoeԷ}c'b8726qwtcK4bJVԄ%6 ݾz SdfǰbHx8t[+E|UMvgQӷ̾^[z9g 63jj hIH@]PlIG Z1*&jͺ0uJx/u{^XnJ< w 9<$KDVE ń'ibĘ`uYd k]EQp@im,z8*^`*لe)C&1eRxd\5!8'Xr!칑9j҂5|p]VejO،1P:0hvLoX㎖NFaw1FYj\L{h#R؂ [ɋ[E gW 62в߿|Qh8=q&s>FbjVJU]əlDwo̬O3Q ;9Y5^3Z "6e1 ]e -}1.f7k#X!a((|z0KBy[*؛T*xQZpEҩZ,ۇ:P{2x8x7\fvSE9l8.lj&e_|s8]ct5nf ]nj$Ǚ~cS;q2HӇ)t*H< Fജ^4Quډ4O_qH=Fur;dMY\&۟kp p+ׯuXz $HB;Hl3|A)vA R+)" e/pa*v*VL6PɇJB =fY L%ĹyP÷oʍ5{S[1JPm\"r x6!w_;l AL=Xtm#A0T t*:U6dՓKJpsIh|.0L߆J:а0b]BTzvn×[2(+N10J蠘YX>3drZu򇗛citPT¯_˵en7Ű,zFmujԏOW C1:GUH49#Ay f|%D65(LMYb{DFkռ,0"S-miNt/)\ӟh?l=33p{͉fNϝ~HA$f2yƈNL'+.a-QRtF0İUŜR10^v'"_ }9m f۳V@jٛ]uZKa=Qm!<͢_ g{*e;ֲM`p\\8y]0'Jo7e؝mOV^츄=eMay >(% Q{E7{#T =DCo/"Тp'[:Jof WZth_BG4x簻(r5 9![3x-zz$欽7בz)z(Sh\fSskhRgl3/VD^+o ]WG񑱩ICv)_!um& LM=׏0Hv0B fRXxk_>iUw߻s_d(.')m?/͎_/wŶt-#XA?*%5K.Cn:^I-9zmVs)[p` iTS _Gy tL133,˨ R90&m~aӞKqK˵=ԗRFK\% wwǬ#CXxDb*ţ.T%1,ɌQ*iA;yy̆3%E*mڥ^I <xEպ~o'S!$}UK8jIJЂЕW9N4?uںbt'i7Sp]4xH¦_B)fZv8%;j>kErrx `"xl\̨N` ՑQ~k(fxz!GӈfP/׺owVPQ|.DX7w-/Zy( h۱٣ꨇROuk2iܹ1^a 5&lpT,RyX9o{4}].ex*[Z>5nzNX?8Ӝ4dJJP3*~";Ջ ~-Wn g5,( JS~\2P~mCjԊOtSFĒeIpZc|&g9˯uFɃ=31F`CoN.zg~k-@:Bn~X_'׭=!a ! -scП; JVm©%듓8"-561(nDF._sٙ:>—mP"O;k8q,0m+0#eLT75It xx(6ME&Tؓg+mSFMG@ϯ5 <._ZVWLJȐ9e-LoV&{:&mo 6֚:.I~_0NZs+jѻHyH7]KmYiBat: pi2l4 KKJ[\/#yӧ~Fl+)g>Vx,|4^HчH`?Գ03g^W] ;5G! jtS,FVb\l(d]>URZ.\+BQxGh Z[B U4ٱd.a+yMQbDe'@ԛW՜FAW[ǖ2 o͋^'[21QX^U>UDŽ ~& ,a%{\g=}8b'K+)ӳxqƲ_tI򙂡aY;ioTTQYg G; [ɦk_ 3E-edD>"{bn ʌǕ 8F, <><:)d ~0 :j(JmXKsEWP6@4a쮮d->bhgD'VՋdr'}ҩ,T[IOpWrFϳk*P>ݯTX4Ex1Lu(c!>_Fv%\YJkʁqIĚu+ {i{e۷kH&%R7}%=@܀ TD7kjX6Gd~shw@&ne+HtW!"e( W,eF4:9;{H7RiI DP#EN5@+꾸u.~\u,80֤M_4MbU].SŮ\k^h ;eH_A~_7QʭNk5}TH0eǓLQ>Cq^8:ü0>~;třt;!_g9D_(UѹnkjUF8ǐeǚeTܐI7<fmIgB;J5Ϋ"ڎzRg֔%]zJza}.%>-8.NMxSM[ j&ޤLX9xlFx 3[gDnweŻ:9>}n;pޫ7fZ3x8thz[.y cwL ءYgbE~mҧ)̵5ĉ ?CW@&<`L:BmvwmC+ȨTQH}FkTc |:#1GxM:(xQ7v^SkUQ'5d\⨥Na"07964dϿK4ǔM.SҢS]ڑ -M.)vxĪ[(_ņ^2_\ c/!Uz9S|V}[LuS5:\tE Ǔ8}[#wx/|5s2anf[aߟ3*4SEow!$.c}BZV}Fz^n6j!5բ~utN`BSСo`3e "*pՠ?wPga$5N/|QY1Z'B9Ŋ: t? 7r&0q*R\=pX^m@Z@$5K܌B]0wywveLubyhkɋLj:4cnns8^y`Џ. A4ad8 mymg|JԓbRsi{>U^({G[4fYR4l*BCy% RYc VygG-SlUXhUمvF&gmyijc=2qǼY2|qR'#GCrQNui\*~>}|. !JLsS̏hw:dLD+A^D;5וs@O+kɼU(!2Ѡ.$k.N_\8Q$b_wn\mV>R!(/[O7" sء- X]o"тuP_Y^W/cPk+U]e}wlqM L87<Ѿn㊢5+|+gQ,6@daZ%̔S[Ž L5+h$^~s6h%TbrF"l8bBk::ܵ B?RE&ߵn(mwoY(ե]\H`*>?#">҂hAgUG0L$PJޟ!(WO2zh(VBO{3,kb.>_X\/Kv2"=sҡ@=@T]f#k 7\ff-lWH|I'aӆrxRMN V6M~ӱڶ5;akDyZZ= u&#`R 9G|f$d>Js)d'[Hci0:.GjaYB=U*`BN}:f"R<ç)x'ٛ1:xQ..>Dm>C}4eZK'<#\pGYPupEbzeLJan֖Z[%/$zUGCDƒdN.3 n} /cJr2sX@t}fu:.m6:zFeؘb$)T5Kj2ńjpac_b)W.,A•WN̠$(ԙĉ yTߡRce0rv !_wQ+F;VrY1ܰ`\ n~ןDV2sN֒G5^ ȫ\;$O8n iXLF(ewR~ LpQ)ZFٞU{Xƶb2 93QDUw} ntۛrac{o=Z@~!Ɲ/yEHSax걏~vx ?g3=a O@  =ȶ.h(;-js_#qE|lcP\g!sPQ*JqiJf% *]vSk,TfbΕ8H)BϨJwHcÑHE_|mۼ{ەU[tG\ˠ8T`F.DSԴax²SrGJ–~j=2- ot0\9쀑 C7U ]~x؋ PZ@ =~1Iow>ǢͶӕ*}s#  s*smD&- o/kb[hawڝQK~Qӈ*;ffؗ6|`H97sܙD1Bss~%F쨚}r;eA N `)\u;<~-5(ܘ*ߥg8c/Oda3 ۡ@|:|.GX,jHEDG!:yn+Eo*Ƕ]y&Ql&Hy&bcp~* | Pf1TKc wHz R~r[^xf|uOX}&Zj 'i\JWA#+4XED#Rqԗ=ǽE8υ+|T1ekVG݄v9O b3X ك:}fKJak|WrOKsTesdÊ\B4 ?J`߁y!F[*j *I''JTp1n/\=tG/ g׎w8,߇䏐ll].2"@(724Wͮ,\Ec8&U;iRs3 ,h4M{IBKRt8T:۳(CHd7Y?K'1ݣ Ѣ Dx qoQ%.>/ 7M6*b㬑m8"aٕr$b'&д[RyqrUl` Awڭ7Hrа'%} ƆG"\2Vj-_q&a{tlx4u.7N6U=E߅Hyڏ+E:@[ұkDgY<*s m8G6֞ܥ@MA/ޮVP7nkL2TZ48<--ӸuF"( endstream endobj 653 0 obj << /Length1 1421 /Length2 6673 /Length3 0 /Length 7640 /Filter /FlateDecode >> stream xڍvT6JJt"]t7H3  3ݍ 4H7HJt"ȇZ߷fg}} #u-N) 9DGrp2< fdԆ"a،G'(.Gy!p8@<@пGa,jP(#'lF#yw̿,`Vow  5D0B?BZ#ܮ\ ;'.8+hB . j ;ȟʸP?z-%)`P0t 8h)=p  v ;n ϹnHn 9!A. ( d~9 /WyN`G=҉ U"0w][ pd]ݹLp{%XBpցC!JAT H?@75F_ =˻" PK@::C=O `#+(wjnP7!{<Ͽe/mF<9@S~S!?eU nIKJRCܑ`F@~ .?qw~Y~3 s pYgUw[oΪB,vmUB@ nwNP7: C?z_K!'[nw7# w#`ů 9:ܱwDxܭ7\ppW7kn_ߒНpynw`?2;;:oܥ/AsHMUPE+^2+c|DˎgR; XN%o< m|tum9ل=w4TuNm/^7^)3f;8 \v+U| u8gN$cyc $'-q-r;N4_ ob6S;J ZS1&Oog!0MY=E`1KY)Qs%q]EԴըnAU1wa#튗IVB;xdq7Ra!o:O=cs[o^~ZKo ^4SVp@OKjػ%:kħ0*cU:F֨C)z>,%mK g?X,~(i HL_i׊z}WÞe{ZN/՗fbT ֈKjhfo+m \iKΪ}sz޼֫v'Vik鼈 f'Jkޕ:Is7_|ڢkQaB8F6Eyӗ.Nzqn ^yF(D\q"%&l+S-S ƴԈ=x}8 =S+ɷ{ _ԒHWG KhR3X7-bo.yF,NE tٵfV8m?\~9MPE3Hۙ%ހnd%1Z}TI)2J7.ԪR@sXq`ޤ{:8 \ݯ78%tLaTX_?c?]_Za*oX6*37q5_ř(B5LI.$4g`>[0Fi5 c~ Q6;f 䳮BX^QC\gWoYEO%_񁏚nk6lw^XOg7II\=Z8nQVPt)P4O 9EkllܪPV[`tUkp~mKgll)))1IӒWb?>e:x9"84+Zx{9EU`[ܣ\`.fK# tzg+o>^yNz0@||0;PLU=i0J V6r|ڜOЛtgPxWҮ: kY( ɪS[bJ :" I?qܹ6;NZRMQa4b1eه{-H>fy M2_>C-Cvt;eL]"chpU䚔҅s}`տ>IBF7V`8cXFIoNF }Vc;~.dIr$<$*Ԅ&5{n-wnCBɣ4Iv4O<J2O.a4ZGn>70wyDqW[ l&'<4=n]M <'~VqZts(|ڔaTM&A7ȧld]bRM1 ^8h)c1;MBfaO۠`l,&\G.9ahvGf)j %U[dfeXԊM~/aWxd#F ٶ\FҠޟ@޾޾v,e,-nژj4q|9CH{K^Ńg&;d/+܅.} Ǡ*SVf˔8߳2K/,!2 83L 8]#UQ.{YwYdJEU%2&qݪ"xXLPF{W^q%U#=070է_UVj{eP?]cېEʁEcؘӒtӮj:]wݻ5 sMD8-N|īj퍻I˫kr/P1?ZSF`;n:ۚ5k%8T|ցFHGND2S{i"=ܵ@C3eF n`!jbTQpP2tע=td* Pl88]iܖJ\ Flv֙|9kk 5PD+uŸöR*g{Ю5lq}'}"U/9xrmb:!F˃wkO\tI*>LEnJϚuȭ6w*S::"%xȋtZIjYn!IJ2;q*ޠf|BEs^[FLcH3A!g[O$/v򤋻 cRMN q̖tqgu@:mWOp{182YE@̧QUAHzַ(NͯSlsmx(ri29zῡy],f.߽NfڙNS-vY{iGޜBXu1)/38᝕oytE|׹p9|PoZ]lQe9#t'-Lv-, ^oDv3{va䝹*F͑=Χu~(.(RsYaY={×O(sR}O9t5qp,"_ᲄE9ZS؞4#CݼV[.65UpOov{uM&eޏoFJj1?~WՍa: gԵHmH-}f&RVafZ"F O8+éVAb܍FgV5' ;XbK0?Xè<ٻ6gL~3*< Q#됰Z5dRcGٜp$vD-n'Ȓf c4XTIDpfm[b+zy'Ek~vRQ] w5wR6"Ly/s$}LR#E5ŗˮtǨʼnRə `G[),;X8*P(({gzT3^$?cǑ7r.sa ?Xhsһaڄ/RZh}~<;t/fOvͳg |H>A0@Ty}x}|?#egǞ0ԸN]c! t^ {3I\BRb^يLLRHj3gyѲ*I 5:EC/0w? amuo-J ߸)auLN$u)Hh17^Zd1M0,#:^ 2ő]^Er$lO`uR,^PxTA ug=Nlv9s;hqQMBGNʣm2gmhO >|s)7|4F7;=^%'~H|)NH`Pg>/8 O5(_x݋tb- zxL|VAfBo-%o )]Qȴ-/;ƬR~ խL{3&*NV2URE1!eofh;U"5\ '~0*ӈm4'i>~Q7BJԘd"HGe9h{ Ls۵^LlEE4/o_ɵ(R'ML;VְyļTA,$,tDfU!ѣg/zsAm{ @55ܪ2Z\<ij"aFvϡ,J6U6* D.y}٠Ҩ$K=.tU54BGd%'!QY0T\d[%x3z (5yaR5ejԒS<`B#ҳ"Rx໕vg@Y czfNH&enR]n5 5ޒ)z82Pn"}/\ &4X w:oU@}!.L~-k 9>I˯Gm7mԗ >K޼oP,3u.szZ6L$Ueyaad%pMIr|9%uP7j^vj|)ȫ]/J˓Lu5W=_"_J,Ce7 =GtĻTzNr@e@~zAHqd7 Re(S6B +,̓k^uw.ѓ3m]c'W k"aIx<x{؅Gpؑq6jD8!~Kkno3˒]ŹՑUlXt?+HGI bۓ†~ͩ]_JkHLuQF`x_জY κc@nuťfbs?Lc_HgNJM%7ǹBCοSc̲ dwnc`Sk]g,1&)$xgy c\/E*uo endstream endobj 655 0 obj << /Length1 1732 /Length2 10634 /Length3 0 /Length 11740 /Filter /FlateDecode >> stream xڍP- 6@< 3`K BpG9;WWS5k[ݽvW 5jZ;01$޳XY9YYّ!ؑ5v5v`Cg;C@5@`gge'jxgrPk=2bjZc:_1+``z5\ ? 3=3T q0vN`wEC+?1#S ;Ԡ&Άv`b Nqϻdl;ؘ?ٿ AJ646ZZBM&K0@I=#;od44z!@JL`?Al!{d]%AP++=o~ v`swer-A&k6@6,[GbML.VVV>^v16c /'os6Ps`O  ps{oAF`S5՟`A\X`Ya ]1+o3^ )Cvf +C!+=Ϙ#b̿\m%߳ 03tE~gpg{J/-X)=&P;`1mXE|Ay͗dӹ,f6fʿ6տY,z-bYq?Ȳ=c|b?7;ɕӿ_kƞ/?G v#/B̫Z+ňF9zC/6% vT$o.8r:nְ؋-X-{$-Զ21`=Ⱦ-ޮka 2;iPwg=ۚIۓ|Pfs//*L@XZkxtsѣXR!vƗh6iI]D).I(Z˖_Z#a5*tstZȠ(|4ֳJ8 = a'pd8T f4tEW/('M"l4Z~uK_G'Gʊ ,,Dhli:ez}Ш+W@kSҏ@ҧN%LDo4HQ)Zrb]'4L7R&t2Cv3s}u5vT &rx`4^fvqP[K^nHQe˜%sէ.^WjK2PЅX,d]+-[WI{Ue&K0R#oN&4._|/?W Oo~;":YX2 侜p(3Za2J %M= oR r ./˝98#\~r[9*{"{ոWMIى\pF!x3a:5%e*q7AlXKbru|X)mdEBҏWO˟V"ii!*aQ,a?=`˵mfl>YyI8~{_H+R,GH #DSUǕ(CQWY=XA-73^zX8rM8V SxE?Ɖ=^՜H~x$0Y׾D#S fu(Ť|]AA:"zd07$Hn2!nF=}4ߗ,~ w\$tl]A|3PEfe}uVr?8}c:+3P@ :IَF-!kWDY6Fc"̯'vX#n|*PR2rFͳ>=5mxmY޺dn ,r_}J~v"EfzaNB.GvK%wRjY+}LC(AyVtAH\QZ)0^SU F~6TExAy"İ;珔Ֆ/=Msd]DIWjlV?wD!Nufp2̞bx,ZTRP/w|AœlTYrӶSWM[HsIjό˱;yhT:6%^xפ!mњŠ2UwåUq#J=sMt❽a;;;Sp1Z( eSzl+̮jY([ / >zU~&73R zzQ񯛸cg (+ƩwAI;vT!/ Řq°1ް:Eb;?~fݿԇψy=9K>HTDeZ1EH\0Qᖪ\fVphGHtAۀهgBAnD7%E .LKy&Z(h3)!F7{stK lȲ}̯EYu"-F{ޕ1|UI= ODl꧋H )lbu9 Fӏ4~!cg* MkHߢgU[)DrD#mU'c]w}6fsjEyb#F{^-{EAXõ?`po|ԉL+'ka x57vZy֤>48o}XN e9bclJԬ[ 7Kp,e&ݜlGM +&*R:l .綻|%y_=tIXJۭ/XSr؋)r UiP$S2ǽu^*̰4YPeT>? ];sDAu%ttoA84szGtJgajoW;BMjzxCB QA1|xKXP/C֬߯{PdVe.)Lٶ.]4 b5b!YEKHxG$JS{.p^+oGo@+pGI}U@+Z۫e!fS܆n.0"ć&R~fҒ\L3ג+OEy"[Jމ{TwpRRC*J5!JMuL؍~ G!W>AYf>e^Z +LqnJLڰ/ZHb| Y͜= #b_vE[W8Y$|QvKǝ |d| Rhl7Df.]lᬤ)~ /3 WRP&^` ۼ?NIv,NC\LДd0xw^ ^}* dEGFYjSL^a=ln&L0OE#9 㯓iF r WHvfa||+a[02%%g c3dh܆M s/M⎸\zQn}jY|2qu/?:*MMŽp +1M3{hIE2},*7ד3- k fEx<᜵Ta{UXb%)@ΫKgSe*!Ѯb%buHtwul[ڥ5tYEx.8zbt3zS%Atu xCG _$j *gF(_`!Hnى©w0Lyr;Z=^(MĔ_{@!XǴ0(*x?Dm*QKJܤ\m[0ꁵ,yE4SZtؒȻ92AOW ]&1ҹvkS3O+}0+Njڲ(᧾f/3u^E9 9 k0񀿢hP:!=iv,+4<2%rWi_+ JFgŊe3Uv/E!Ů492)6UsˁЏIi.Qޯ-zȚ`G=~xp^InAw lU2MM}*|b]rasjmP _a6.իJ>sE?V6л[! ~=AqzytL0- kM7 mĬoN#?ݡhƤ=d-Z.&®{>B1#Ʒ.x!~*l(Ӓ򞳺`|zɂGi l.uFӰ xNak qޑnuԬog 1WUuy*挻]MrEׂ^=ѾI,A(m 5')9: j`3|tElE Cz:j@[_Dq/*:(u UӤk}UObylBnkޙ(槢e $? NOhk0¸̯vֹVS^ PE:g^~;Llҕhr{J-= \Մ}=[otdyU0~HKy0$_݆"ly5T >.Mw?^ $>Mm_]#tE֩Ƙ9d??_j)ͱ-q>,3l~iQ}܁X)!-xNC(mH9͚k~} 6JYRqEǛ(b0s8pR<)d9%mJMXJ"?vUV2Tb8BF[_Iw0pnry.\ƶ[LlmuC2_29Qffl#U5 tuwkb_TFPxqjjXL]|w|'5Ec a\xvۿDJ/v_(]>4Os^YgT.LPeS{,L6 fk,ǝ`Kޭk=cy WtbkZ(3Ε 'V[A+ήbzC@#pCf(ty[5z};OK9jJ>}rqk^g~`zs6Dnްe O'K2,&_$aE!C|Q;`;kM)R 9DK/iܤHMΫOI"u?)/!um.1,kWE۳L R1`])ʾnc!GdNϻlcףM[X32PZb+:]sԦNI,Ozy^G;q%Ffwen%yz0Nk tu5^'hIJؓ k$icò=u+t%_@&F Vw[k}*uOS+,6Xee@|WX_?χsbJ} -݅w,r62b?G\OU>dїw}Y{mZJo__(}2vƸm?P1W|~X9`{8tx`ǟX}"DIqNF?W\@S/,ctWT05wZW&ZKAǮ$u*J_ma/a@٠sET̪r^!i–4p&N{{ՏAU=( ~`Z廙9*{ 4-DŽBܫH~E" [%pF ع2L'DFxzJRjTX RK 9c=kKVYr 1rJz% {b0<A6cXݏwid9t/@B>{I] Fԝ7“Id:si2 gg/?_H)o2[kcCE=O}¯EқrS#Q 3SYU[RZ{0 ͛LGvc=CϘ'}'Q1#/UoOpD4π)) [EkqpLo2 -`#1Xu7ǣ蛲6pg,puy dؔ2c"в˝\9˼"Yjw*~_>R* sYςɁ 5wW,,'vcDQy݅@/L>1 TDtS4ǽ7ɠ3ۮC12:ޙgr.B$7hz㙳~ U3lA)jTmvF?~v JUZ,l Ivbq~ xNw| hD64F`nRz41f(,ɧ](oivRW#PRbaK۫on=Ԥ GوbuD966 ;40y1SS:_6nFjyvD{ۃL8w\;)]r}B?WMNVqLHe&!^k5TΔWT:}wAOk0a!rN^g|}O@ >O2x|Dʢaj7BzZ( ĵ>YX$zuc(cŘ%Qf?@|g+봨C?bs 7kR(GcVlZԷBqJ¾f#r(69| C:BTd5{H/c:/_\Q<):0cК]y_HWvĦAɾɸ,s5:jmpb.7?*d@@5z0 VCGoEdwŪϗd~ \qD 4-FX5 5~h_o_(b.z @K*;#+R5N(YBq&56#&l{T"ml>q6`*a l+ +v.,ʋ_W-#} EZKmۆ,9Ysɮcơ+ )T߼$"Fz:cKcu ":U4 IV"fBÕmXK6 {("\C+goZjŹSO*E qzcXkkt$Q[`^p3neB2cO5G tȐ&OxR~ (X=n& $!T ?kX‹.c>vtL1Ƞ.ƣY`i1ByC[tZxp+Hi"ZIA\cvLAڃޟ"Gh}I!T90\#(GX A1{ ^'J]qZY7#'14wpc pW߿9q g3_uEoq7̑M-bk}z#,77jGLCI4yxlQD@6mx2 !1q9~j%76sS;2I%گQ=M*ey,n*1co}=$sñ?GҰD~jv|urYz9GY*ޚUM(m֬{eޑϲBDbtS b?2 ~J[#XZV(jjJ-{yzú&%B&mLht+Ajk<2_ȇ#K-AM ::Am3 ,Ўlbu"XaU߆EOOf٩4蛜BQK}WĉBh5/)g)KJu`@xx»PX-_=W-#(MQzft"`oI)>OLɦ6Ebk_)ǀglӔ0mMW\sTյvLˋeu4`1첳&?)\8AQut@713$ !7Lj3f> xpU,;pk=jV|ײ [<_װLu975^\tם§"pRut UdQp\2̜.Jl‚Q16#H %EÇ2cd*"n 8(q7oiobU9$d.ɊsQ킜YTфF@ Qp;JgJ4gӜVbr=W[H7CZ7+0m_QPl~8Y'XאǶTwDjuc!IAnOz6 Kec^J^9D+:}pQmEXƷ)_̺n] R ӟH`:L̝*8b9C0aHIr֗;e`mp,$eO 5Ta~%9-wc$%>Hd~?kAX$jnb0O7!pvQ.3\L2wń/ɠZ b#{iÛh" FP]G[󆻼*ŊHŤ1CyusŎ|JZ Q]⦥wtkLGٞ!&'C~b,3F}JDqz[p&/^qU2 [{]z'sk㥦1P@,w tnX&;놾Fl@7r.f όe5έL/qv^In=TŜ扥>n$[3JԝCJ{~5i N%2XlkѯzRAgi¸1T9 s;W0 H"w-J >B賒 \ endstream endobj 657 0 obj << /Length1 1423 /Length2 6228 /Length3 0 /Length 7207 /Filter /FlateDecode >> stream xڍxTS6"U@:.7)!I]޻ #+UA EAt _xZ߷~gwvH[   @@(" sppvbc Dڔh,P !<8p #Z`##  !0()8Ѯ<<<.(A ?vCQP7 e65Ab# iAX"Pw ` q"k9Ht%!~!+C8ap(@GESv`8 c08 ]:"c; sEQ0~2NEQĿSA!s3\gՆ5EDbb 1 q+ۃ+`mb}P` vs+b`Pٱf_k` ~ _wX!pXHCY\SOr*( =>’I1 E~̣ ?bH_b18G <Fb p菀@?w忲DT~{A`ƪ@ ⿡&пW ƪAe _vJ Ӆ!//a.FÊ }b5}/ nn`/b쬱+QJ;o2H46`t#5Xrr!Q2` V-oCP ""VCrWDY(3GML 6vUtie3_G=XLUC(*vbdpOXOc&J2 ٨^/BmK\ŧܮ(3Ve#[nFcWQ3ho^C?O9* ~Ț;8HOé zXF_ʹg#}`=aPĽA[1ΓMHܞ#&,oBt-i 5v8C5"^,ZSȒ33Mh'A"Vt61 ai bpa{)**]u˔r|+eSvH [p)NMMX㤅ȭ}7řԽWF}ȹfC$EVrJ+~E o A87e5oXGDR_2}jcz8 9+ TITG쵗<˓ KnjJZfJC[( *h^ Z ެj-Ch='lsuw#IO/L0g*'eM|L^MQy&%#E%j̏/ Nxn (.Z& fO#貵ve l_+-]B(J5uLƲߌ~1W})rwѼoKn=]U,Yu,_HX8NT3/Zg7^A6DdO[&'ߑJή 1F.o*/)Fv uEYXm4SN]ȁVu i}]x;ps`P7,dSvwOJwK.!z[/ocs=*MTQyffEҙċ2vZқ$'=P`ʏYުlЏEu#b1Eͭvy|wvȎs7@kka!~a_\7cZKM2's11$nedZѻ6'M<_ _ye]#z}e# WOeLpu=V7~Z6(}SHn'Δ;,(YۤM-^%=1+Y ծKp;N(%9z6|*ߤy̝[|O X!^%j :e Tf*6lal~!˵lƿNݨ^k5>\T-j3P{/YIWe*7j(M ݧP4=kteekS$E˱rX%QxeWhxWݨUa'jT9D7ZWl_܅<Fr'*Ōg4Tºo݊>ސ.eh2L䭃}q˶k?+. %^/A2IFMG#j4N<oقjg^g4DΚtȓNfKP]9Ytx@44Bdlb <ϑm8Sם" h)BIkx9|qYQ DԑhG<9y܅%d+o/k134<= M\soyn ݬ6H͈_]"{e+(>zEz(7 '.7Q Ǻ~g?3gzDu|u{ 6Q%,~kx\uT|(u$q?1m_pKHM0 +%qd&} 6zaAn%5HɊVI傶NQ5"gE*_(dleʗVZ|b`ʼn{,a_@պtnT牝v\gzVXbIGcړn3UyEc~7&7~RHe&JUgvw\@hÃ/B_[nn.*ӛ)׫ͩ)k(6OIcEwδ xgk J;q E}p-aJms9%m}'n"Vqc}0 gSЙgm&MsTOmTGXnn@NUYQTZWs]vPI.8,;fȘ L(@|4ܦ)iuq" ϖԘmAI+j>-AVfdUJߥ)3ȺzMR.rH (Νj:?nhWHt`x{qƍSїlaA3:? $TrE[پ|t(.OpY>X0֚Z}Sud 5%N|Eu woDR .Ko6nYU%JOFy(2S-tM(j"^+Nt?[]>鼿8ڣټ7L;AIh49ýfwz)=˯Oe % e6pO>hMن*&wQ[{AȇYz\|}<(0^.竤,jzy,Yo ̬)<ԗDh(zbDG!=.,-ӷ6;IGYܴm-%n'ZtIpqe9jٯք.Dg6!܅L0yl }.tD?7:@UTd/<ρpߟɞRgcw/,) 6LLsO84|m4>^=rW N ;|z'!)x5SҾaˀQ+wɒ-Kʌ#NnlܗA'BȜ],>U8\8up\|;Qɋ H;{20 h.;I>e5 h ~ˣh0ci0Qff?x ]N2X3tsUdtc}N+GUlY"sGtĞH)X%|U)Rhco^R gCaN:%@?I=ZЧlO6^cu\ó,=qվ]a-`|$ubS^k1]N0G\!Vz)qC:UvuHXf(sY}_Y3bDT-ߩ<חaK q )Ha ^SN m''|83_ch!F18,U{E1n{YS0cK*n˷J'r^KhU"E!0,n9Kbm'; o[,V"+:Y&kbφ-ԶwOYdy{%NCA Ӣiv6!r>׽Ldd.j6-_~Ы&5I=x`+^gk;.Wn?H.}mN:[!_VގVt<>:q:3= 䞯7wx(8't\\f/gzK֥{M?R~v[I\3txPl9`gSU|qe9p;q24QoUb~@D]Z5ӆm Zd$Nr.Tc_}']*3Ɯ0i:|ւѓjlj15MPSmۨtb|uRxW1Zzw\}-dڊDCRRfm;y ͊rF]4¨h` ڶ޹K'a<mWYBD?Vdb@pXox߸wA~_&S:;((m͗d)F =7ڵą?˝ endstream endobj 659 0 obj << /Length1 2108 /Length2 17412 /Length3 0 /Length 18679 /Filter /FlateDecode >> stream xڌPҀ ,]nnAC!8$K}$|_uoQ2=SPj0Y8ܘؘYJrlVVfVVv**M?r*m+с.@Swۻ@`ggeх i(1TN. +k8Кx^MJn@v Gs\ Z9xzz2ڻ2;X 1Ws++YrR@7Wݛ߇k9XXU('ow :^,vdK^ ?psqS̀V ?@Xۏ  ;G̢w2qpعXllj wX+`W=:Rv|\ Orb/ymzMAvx\w)Pr|k*-@W+f> bV/9UP[k%k@@UGW_7*V{2s[5VgJ9;Z5l\SSo~'./TZnf {KG "_ `C<? `C|+EXdEqX{y@@I˵ǜ~o,kjHϕmϙ ^h*5'XCZTmA,KDa`2A(d),.w9-Mb9KnjGCv[7rc.YaU9w &Iۼ6I,m  %DL5Q =~B I#rR*J'jpWP<:N."XgҢrҌS͑Aյq9RG IȜΊA]}vβ4%IO(i}pMb*SvɡՀ']YEH`%ݮM&WzXV -uY^3=IO-خՆSQX4*OX,ő>4wȦ&a5Nk9ƲXqaU4[른vz\ZZTm9OePF"Iݨ޴\X -OJa-5(NKH5x ױqP;]{q(dx08Hx-9563"{(\\LMZct'8 9H^"% G*sDc ^3SCź ,.$S3],M"?nuRc EpMShX{jP,΁;d!L6ץ3ʢ`ѼS1[pQ:Dc2"ܠCLn |f˹Ka8HZ!qe~qJLhA! sLXx8ϿVzM?!HE1?@CGODlf~XɤeW5qk@3xY/N݉͡cs ^Kџ&8VQJˊRYRH?Wy 'ГYa_!lO tfDn˳z2=biX *N0z>Zo I3p,4Uc*C*@/WsCWGPk7ֱ^GŪ@}>¼ӌwP(S7Q"9Bp6g`-t5Ί=ǝ&C>Li 5Y)n}\n:g<Gըsa'~ cEMkW*;߆)рM;weƧh?~ c_gzd'F\ǡ]WnM>hq}4C9A2Cw|y {`C3k@,{6\e7?ls(R_闻tji|r&7kX8_o@oj;%Žn/\엗E8:SUOzu\{tMm+Wy~U ^L>98lTa ̌$P;;y]-8> 49"#Kt8g!"\fQiSEiNdcs1Jj ;>] 5 ;a%wqv$[I/YU rWfϮ("g[jFA Wz>C>1}qаeTld%`#m :NS/Su]LQZDvd7u#ֲ 7s߅>T+gsI-!J%]d>_*d\=Hl3ǒmUvY.`Q>j}I9!MFaS1^^ToQQc*ߐn!ZAÿ{# O=A_*혗) ' ]O.XJe/d, 1v>1IMbk~v r!ynjQ(BBt]sبw(w#:]wשf{D!׫ @٦b'ff/bU7o;se)8WHDzw,{Aw)Qoسg"9Jו8i p51iA@1n_Dtw<f~+;Uw<"}C= ^n5EqH&i}q_ct'.._w7V.ϔV@Ohso&WR5ESoЫ͞$GWgW.ׁM`d9|(N&4fIi>m*eM|֋^wE ;}hy߆@kȈC(.]ةDo9_ru` \ęp-Rn=Q5exBtwm{YdD a6~/=Z"5(pmh)kj$-ͲAANGs\9TO6 K' ޗuh Ϋ [!_ܟZ TB ̄'&KlS0INӡ#Źϛl:WbDjT86o~W\ܗ5>sI%. uVw/|,.u -Kҭo3֠1,0,g⡬<bfHpxzL֦Ez|@~^ Q:aW@h'gk@gY.Z̤Q$e~Ǭ.6!l *9f!CPHo! Cz}jy&{.ABFT͜_G1{@-ba_Kt3¬XUma-h҆F;H8Ig8X C2LYZO"IFr|p`5$(`_%W.՟oMJߤ7iyY[-(ڕwuM %6>{N1 Hb_e)IJ|mfv4ͭZDYR.k~Wٗ[80R^+6T:f~ +&]emٺ0r]=z ~U!2k@ gGw2Nn^1V˵@ ɹl&~[+dWM}3j#G<@taٹ^UeIlEknh[*^S$T>wJ5aԽn|n@;1.1ubwSnpzAp[/^vo*OB3Ca?Ү2m{>8݂N \3FN=1w?ZmnM~8A D\rB= *@1 D55jմHk7"}&|2"7+XX bK)dM 9Í=V#Up[j1>DK݄'Bθ]m­DnK6a}wdp@s ozxy$l'N:q/B]5>sZ.v̊`f2%'\6TdP?1d>D#nCv,Yl&rɱNiM GmOQ2eqEB\/9Is҆"ylbbDoS=$~G bqzc)in_e/1.?{օb-0Fo\猄Y~X<8a&qhh{+(&yȰp1K('\}R1D*Kʼn_dgҡ.s=ޛjpʘQǗ>j~-8#*607K*LruoWQ@' 3@n@pyU(+' *hd|EW:ݨ؍.(?r(y9\6c+ -_G1Qɠ:t町Y;#RQmP`s 87dVi >zuN\:skfzT 2|k(s$?H0:{X" kolZ(je-[2 ~)FmL'eܕ4X7%*i%M#lB2AD}:7GSuYM\i()F0KVOp$l@uvD%NOgQ/j)UqYƟY@`n) #*|V5„J@pTM61eKufl0<tsLZgs/dS}7Xln3|l˞܊8 -$7cNeK!րWL&AT-ov?}u q(G?a9=ufu 1o[4߭SAP(#%6X\xC@YoXat`!7柣 䭥$"e%V9uhSK>-%0 UF.*sY1 /E'Ȏ1_y tZsϝђNIad9-F¢x:#\?}BB3}r S ψ% |7lyev!Q.Q64H͠JVu^\ݿ&H V6,OHỞ~~ΕɆ,>q_hLkꦊIW{uR9> ێ# KUGE:ܰ`P1CaVz!Kvs9ow|M6MXЯ@r>AY_&yZ)Y BƊ:}k !(~%cqzBxq rQtxT7GG_"l iYQTí <׼Z !52[".ێ}ףkwt@RChOd~(^)}ss0& O б,~$hXYpxP0&^ +ˏIxi*N?7NM3@}w9፦*[+^(zXDI->\$Kȹ?uhlW*_KPXJj\9Fncz#HIz,2cGxot6/3IJb[wrnE1Fq2snd No^Mo=<IlHq衁k|{VNџZkXMIz);#WbUֲvVP7pfaW.o?X a,%qI|nL1 Bů\*a;="f$ӽ":ۆ69t2xr;¥[͙2_NU9]ܡ  ۵̌&lQ:SO1dalE0C\OcMUD0/>;;VMl缜WЫ;˔/İLVzveAs*r%M4)"3Ц  l/_Ttja33VsXBf4 !- ;VmaŀU׋런%{Hȴ?oid;㽝ZsmЍNu(qǝ2uuAe' Ps& S`Lx#t~4gUynjkHiB\`\$KEwoV-$hBcI7|Gz4g&$圍+kPUP-? f6c`h T8`A?BNUGVWfoZ'D҆oYr0kL}AfVG9-q-1kcɚ]x?j%͵,6[]nl:f?.k&l8})1ޚF 5s?ν*zNjќUͺs"ED Yij5(S&=85ۅyŋHp TR0!zp1?[{?JW*U[2Gy)ֺi)V[xޗL6}Dݱ<}wKّ Pz1p|\μLUh7UBlx5j7D{n@X沵#[grbϼC' a|ʞT̂(KiZ 5# 1 usX%p 0̋{'SYdWGLZnB>0o\)&J%[όL/2/ mU!+L ^Fj}]_A_`4rY;f;ߤA#H?fO)恪 ܛ$F8g/.ڿ!75Ia ᘜ teIxẔ]mϵtΓSqU[d^brcM6\}k'WW$? q + FuBF( >C!EsU,Z{|Yv]PǓ`ɡW./(Y\2ZD谧rZ}ڀ+oJQWSLbDdLnL߯GvV{HE BZ3Le柋VAp=.{t(|}Ȇ4洐*1 +}\"lN(])"Oz+XoB3o_dꤐ?ⴴ%X@34~;1_ [:{oF#/Z$!i+cS<osJW],6)mХ6|'9qJxEIqϮ)|fD z Lnz7ᷮ%,̤Z7Q_&`x| q ΢qPʑri )"&1W'+ogr 6W7Bs76^6~mC[K}dal!uUqwmAQ}@/Ȓ= s܌5/;_?*)H@6ֽaADӘ5?b>70ޣ= {CEFLeՉ:9;^8]e֤nW_nAٷm8ծh7}Qz.z`)=y18'J*osB[YTQsh^^P3}zbRL䗕ؑP3$W:Y>V1/D#УtNϝY٧QG E=@qXa @o ahy[Ͷ,ee$Þ+j8lVP"n|9 /Y;doavKtʤcځˁV< dG> /!T{[0JKj,?pC5YJdM3'06)[WQbE5N/&2n<dZa$o³,t<8y> Ccli('xk=b0)6>%}|daD*zu&EZ_Y@Ƶf2U2Ík:X q?@ %5&VS/{0ݍDϗW#U-OSyl­Qo-J;`|׀ݐ m{ =tOWz@+mpj8wC*Ŋs!eeKH4aCeJ8iV Kz ~WhY!٧py̐N]Qk>>QWe'qͳib%=]Rևڑ$h6V"Gl$|J#DNtr -BߝEnyOt2EOL:E\EubG1idE7 m)b"|O{ag7X΃R׮ [Z#M~`(EzTùnr0ʘ0PB"֪vyL@Jf@ D/"[G7ISo7$7vME>/\ߑ{xF4UIZ4<o+~~(>iwLlP{ݍ3 x i?W_2 yxR,P>Q{~I :9}:ẦI|4`#98㚩MOm*iq)u f5H81iszEpT"=yY'H1ʧ0$|?\~,"E| )cR6v^zW@꼍jX#n.m}` Vj7'@V';*ܲUnɢef$8Yqؼ5v߾DBXsoԪ)kѶ?Rؤj_fP,s&5ny!E\&"uaX3r}\W?y͛sN^qRKW޴L*BA8bVnʂ"^ /Lc62(߹K%A<$#Όq'%7]2%8e*]D1νrA3Z5,wkZZ>uܖ8@ sE|w8.$Ci*G\V)M^@j @qFM]֮f)A.^!Z\if*h]}b:H\hk)j>pkWp@$9}]tB;˯Q4Gİ̋*wJwQ}3F¿mH3'檪i26餴 *jNwYrcf*s9ۉg 5%cP /ڻvЗf&`4 q-+G̚Uh}'ߜju4 R:}F8Wpz3mNlAz70Ȧ:eaZr,crG^;ٝ ^1ocd0Xj{&y  cکU d~ws;bH%aH7hSS/2[3_hJO1m}f z e]qj\ߤ`6eB?#~v$,dmϭU&:N lf+ hIQ'XcHϯba0{38'3Lԗ]~XNUr tǂKW暵&s.6n=&Kg(,;+13(qZxԊԡЋ/ GAk<:5j\>$ᎉ`0m<[PĻOTG/^JsePO4 etOJ59QD< _>QylUTZfɐLG?e)Z b\ ^}*A1/*;dΝ嬾/ E3*Lh6FDIpC'f۵ʨ؊8@@aF]Kj#6I,Mhɬ;LNIV9x:lp 5m~Iܖap i_ԙto:l^]O)Ƈv*'Ft=%MP ]s:xqeXŬTn &OUu 'U !m.CCmпky+Gtݺ1|UA]G<=56*>1 eF`>cEE[ݛ3[9xTA ZHL;jf$ɑ8{蠞 cKM ,`Pjq40 sIV7=Uˡ\4Hbuu{hmV4OLl f-,|4<7(j&/ݼ4\`X4Qg F񜭱SY1ckbw ^> :mN^5Q1?BIyOY<_sjh7Z2L&F ؈@4Ca%?z .{$j\XIv>F 9׫ o>{:"vhnP; i;3OM[8]33!k8Bu' Ȭ JH .!"uf] ]z{pj8= ݈avi/!Fot[`gituZZtyy,u2#Zp& Qe Y^uiz{1wsddD.¨^땭8KBi tQ D2Z%w-,~iJo|L>7;j`EH7A%]F<d5k#Iك{r; 87% * i@r4sË>gd endstream endobj 661 0 obj << /Length1 2189 /Length2 14973 /Length3 0 /Length 16296 /Filter /FlateDecode >> stream xڍP[ |஁{pwKpwwNz9畜{aV޽P**3mmXy"r**,ff6FffVJJ?vJ5#ֆ ӻM(gkvX8yYxXxxY@Ɔ69C'sƆVe[cR|3wrebruue4vdu0LCp9@ /yCk࿥1"PTAr(ۚ::+1=x?,% P,/=07ݿJ;dc0Y ⲌNnNCV. +Cwߥą [ɑdFҼYDhW} {ݙp-ml]msffw+ߊĝoh r7}nw@}l/UŕW}l̬H8 hr26{6eVkϬ@6@E[G_7 ޗp|ɿ]lmMZ2VN;$rpsOeDBKQP]K 2ԍɍɯImmxfuї{o,9}.BRZ^SY}7bg(IihM\q7: 1ҜN..ɡɴ˧U7PxXҟC 6M{t*7J p9'L2s;KPyLJᑫj34zݰX>YE7Ԙo7e;c ˺5>cZZK#nCՑu!~TqG`T{mxۃmvN,X0LD完J4G 5ҺYkV`}>]Cftì3d,?9{TkrXIjcFf:VoJ}7b}Г9Z(!`e>m-V\G ' Кܓ"J8H:PFm'l}~MErvXapesi.ݗQisڧȮ{ӳX;fGW "2̯[2_i (|LS2xs/KiKTJO"Mqa1E LRzs+229w|#h*<< `O0Mه⫮MŶ$:M4 "Oԉ) $3d%e]e>EBвv3洰u pyzOф53n]sפn*;7ocu<̂1a+ R!QnHfx{KoOdӅҵ㈄ˢSSN'>%GjҘQW}e`54N=D׾7x|lT[/L=3ē7`pi԰^ !O뙅BsCtj##8$! TPr]kjv+t2D@Us_ ڦ>8X9-NO*/Q?4 B ̂,9B:Q.F|پXjp}ZπcR,5u# 5,2L-Eyz^Cpe6 V%AN-y=(jÛ8橽w9WOVe%cUv;r<0?f\IwR:FTf*E yIu\  K`#z `zTTbm$ÀV?ѿ_E`..KB7Q>CkߖvNW0*-qn&ڋ\eP0dH,!Ԝy(IC"0l,mIn;p+:f@ m,4kӳZnNcrd- 4MŶYƛs֛PgnXYœDնs;-[<L>G(n;1A^<$]CnFbό꟞lq ZZ4z™=Ӄ[ySu|@2- #t!_k|ʥzj|u +ĦEu*m%2H}cdMm 4Um =]t&rrOW8YB~W+p~`-A[@g $aXͮܰ#"3+((cj2 m; ȥ܉`Un ϼ2n(4o(BxqyvL҅'>sj3b'͌v3k|X WkD\Q|4W̔0 JxQLOlQU8 Rj I4699 Y?R;&'v:&h{-pP*G2жwқQa83cBgu4 ND)O߇/[q;_ڤ Ɇ2nws&'V%&7u>I"! lnVhL`岐 nao&8nPN%+w=s`AހMsGS$H S@NXA~x[*C!21 F ^Jgt8?dcek{gA4=7}yq:u0tĥT,.2,̌%L?"tg2FNAPw]ZYÍ~S/~X!cӶ9&ohI2AeMeri~O˽Y8Vדߴ ~M{@@Xd☏!.aԞ^!3u%8f 3)'5rݛ4Tj(Ky_X2A2DsǦsj.m[4ѩ;Xڭ>{qhVpuWsyM;򨕭;49Gg?X^5b*%WҲꇂEgw͕}Xu cܼZJM}j-2KM .riYL!L /(?ZMfsW#YDqhVL)]Ꞙ rK:n?ݬa3]EY;pMn4'Pݩ ʅ1`0 ٔ #}l]rV.u>'^QYcKE#8?%ڞq]J@d2Yo%L`;~Tb0irw)K+}[MVZ&]\\!msOAZ߆Ȕ`pfA0An覵sV瓷Q|O:>[Z~^.LY NaT6 rmtJz7U'vLJ)IYa .ނ@{`ø+Jl^G\JXbZ291T y)(uTFsf 6CeUbsԟ^Xp!#_~j Kf+n&|Ufɾ$MXd`'̛k)n+Gxc7Db M?pBD$Ϊ\̓Y⠦ k |_fiƔ֞W#?k`VUL _9C(;s%1XEKߝ ^Ba,։AӄBh@X̭' 81^|.R4sbۯWًDZ䕍DCyφ~ x&?R\9!29}Jt 7U8n)kObղ}^ =5!NQ⽃2:]]U2' C𬻓 NXS - fG%O0u"?4|;c,}BH)%Fhs|8`&7ChiҞ -Ɂ/ܥ#LR,Ő7?}d:z'Z ^*}G`ޢ2a$$}.)Ocph!Jr*Qgګˡ%oȕkr3 zj7#=_9<-G D ,f.┕Moxџlϙ;t*A@/{ 0# $,gD.9:Q|3xq+WS74Ȑ41(|x8CvTc>P&:2Hvqefv'@e'%אAJl=/OURgQ:&2׎ެx_h\񥏝`5AlΑJl*qF^>'|GO]\xFBA~9id58Ш! xI&.C4t6ĕc_rEJSH'{KeǯAoNNږA$m≯a{C<8 ,0άWFq%m+p̧jbAj'Eg-n󹸁N%pB I}XXJ9r~ cxؘGnbEU ;e lvWKh}AF0t=Ơdp Xjt&PF]mvMC=?!'"rVx=4GPBQ!!.g>Q %Ą<C*M*20odL.NWR&nc,=f_~`,o&gɡeg$>`47wDƓP܊]3a]1nfԜ%Py&;bԃ#VVdɣ(G&>]O"E`7ȁ-"`` 8a_N4 J ͋/0H? 3^MtuU du&zdHLڶΛ]wGy)'@(~,EW~\ZP]- EDioj5ZV&rVPsʅR҉D"B̖~N0,r4mPotW;1:?/%3rײ!-`N}Vk6dT8Uzh~i|]xΡܑ5(c+7eEoe6Bg^Hs.0~Ð'h{x-쾍sVWsԴǶK(ncYg=eޭly,\="]&M9l|h#4wjJIp?*[S;'Y\ ~DP8YHKdx #\!Xw0b fO9c"+nng;EJ*Ɠe5X(lR.*)io'1 )ހt PӺ yRV.U&ĐNmӮ??MI>@R>̊CҬfvlppJ ٴU2+˕@SYov;n<1&BZ+7rEX}co TFH]ՉG8Yuwb6̛"#ߌ5M1=.ķN~R ݃;)/2FZ4u&oƵg4w~ndzoEDhtl(q .S y/DX Su,JF+6I ʞ4L6g3Vl3pgeE"g=MShih!sCǧ\XT<|J[q~VKA/ڵPjlpkW`$2uqT}s]CIVașJoj.W0 5NLo6%RǤpEUy?=ƒc xwtW2x#n9/%`akd"GJCtXCFC)'ctbomOo/Nݻa8fČ1?f֑*4sخ!jcI W<{C iRާ3d %Ҹ 8)-}:m䂄ڮJ}ڈhӜ*&4,\q"2sUEc\f/3~ؔ錽#rJovtInq J4Mݐ13TY[Q6+~h^} {8uXE4)<ٕdNږɥW203_̠tO.kG/U2L=|tLr2Wt&nXx)Z9Q[ Hm1kKN M9S7K=q˧kHCF: CrSd6n޲Vmt|T1}l9U=k(0A 6ExC^d5doT#e\vINa޽bW$??͌E~!Y P h(n8*9IZ)gv:wqNWUĞ k 7 >N/t*p<",D*xB0%f%<;zHg~'F.e߽ǣ$N SQcD.ߒ Cv'pو|҇ǩ+?kıoyؘs&PREnQͨP{6ެ5{H%|dpU5#'#Ӛ97vAcJR^ G,:ϰ|$ʣ]X?Ocus\!pZGFL$T|EM-Vr5GY5XB}qzй.߆!ݯURKFСG,1 Μ^T #w2M˹v I` .l{>QR X8D5 (voz,".ԍ=6뵣V kdۘ8xoY2riw%Ӎ[yW506 *s6+em[`,NыS,ܻ2", )z @;F24XvRej(Q_8U\}-=s0ET4~ ҤƷ:\@0/)6-@#EaAJ fzM~Gz]-}T,Ơ~Z5+0ׇBRbxXb-_L-T;)- ߬BH}q ܌eg`N$ |7 c=Ji=#]}Z~vjQ:V[0f. nXAnBERHq-zakgNKci6f:#,$Pn6%{`i2))y(""&pSr#z4W~V^QBmNDұ4DŇ0Esą]8u"e\_*%+Bo ܾ2|:c1Mh%7V1F*@,`icc9S?Y݇{bYʬܕ}P=yWڗwN(C921|(ô?[,x۸B$>[O#vp36eC/)mWLP5'xg\*yu U9>?Gb/-Rw##nfIZ \^:'s({lv?n8%,bEP)tW iPpHWE\+ܱ}h80KJcƕgG e.1:t 1"„co7{@.ivuKDъ֧Dӈbw#YXA#ӋPʴKZ| d Ei6{5ǎɭ|hhga4iV8ׯbKwp ZF.+y?-.zo\@ !ԯ`"kr=-Άى 5.Zcn##CB t9ѿJ-S\2[m% ,T\0SpII2S{lcN>7]2Zv6A]SU>c6I/18">r=W-dT *Vi7F#DMI_Ct5L. u֍H|tUMˆDEuAcK&Y>r{-<HH?*v_D3ݭ>E;-X8İʄ2Nq9+~pޘWM()B'e>ױfUHF=S)KR$wy]Dd _ˍBq&_߂C#?z ll9iTlW I1F!WGoKbrJ{-g0ـN;sxJ/eٽxǎ }6t+`7͞ xzbѦ{tF OҟM,(\?r}J菧1Ӑݖ-o/~rc7c6AIL=̭\^}giU[֘ZhĴu_uYs(@reLFF&wul ¨4r&SZ?!ZtrH6D>ݼhkNDK CjQR([=atk꒷8}Mb[zb2Pij3cpSL͑_0(2MF KܓDYikӍpFĪ)pi!=mS ]EѦAּ"):ktHFѽ=dhh+~v42}{O%K/nVaM\go9%3mYgX5M?]cprΗG=m@AU`j-ckͿT/]^n8/ly"c(VErS6>f` Tˮ tT \`[Ϳ֛C~HeϚ/AGkU w#.7(ak]QA+>}Z3u)vLD=(^.tlfR^IF1m gsÿmN ٔM5ф)/Vaz!󥛪2ׁ˘P-CVmK' Uwbg8C* Oe7 8+c/1萧bl0'd؈vNgev PE=kBP V%W$0t>_|pgSǪhqo9e+`>w6/e. cѣH?``%V{ m;YK35.*]w&92#ְ %/GJf)Z#Nn2>0H'@7 'C3҃yIR8|&Uz˽BAg^c<-9jgH%! ε(7PwGS-ԓjX1GEF"r Ѣtne.kwɦݬb t?w0u oh3Oשlp\S>w>S3Iݏ.]Z\U-k`SNȪP~SVQXW\ }?Ht6:_( )`Q;TE0'#Pm 1cLx3riFA&> MQp;)zcF*Y,lrƨIiP,۽f [lJM|t;c uN/^ԉX|Q;h:Ϋ鿶oj6R' $K}X`EmƬ}W;adzo'1Eq9˫`+#XENE]2ɉ(7%.)l峎'5Ney2)y>jδx/"hWT^9` oF9}F}aMII|nv.!!kQ40; o*ϗճ'[x1X֙oZJ-?(S W7l' {њ=AL336(84#xontPSz-{QtE@A 6xzo2NI,*X4Ory9r2 r9jcmأKU*UR] ЩJpFX^tGM!zvZI+I+U .R]"¬R}Q,{{P\eߋ0g {-a>d~y\7G6X~,nߨ支Chfz<acEeXH4r  ̂}`Z𦞚s Y;Eͷ\Oe 3 ˦Nvj^̡omjSX'4iYTUs#d"Xz8yE ;.}H#:*:+)b")5#Bٌ69^OSDPҤ,Q52|g>p־&T&XbZS2i_' i8Wa.sf<eKJ;\IoZ7tp14V99@QsB{nk$|7ʾB2K׷8l:['a{aMYf:rSUgt 牘DFM~l\S7B)#µm*t-Bzح Iu7 +;fBt,o 7X7~$JXl\m}zt.%7 6wZl_!M~ 6M"r3i9aJn2KEMY)F'F1ѷi3F {}9j=I|kʧqoa-뷇2^>.ߚ3 yn[CKR1>dO|rm*ѠKN~qIp@&;UgNh!o2Qm;r_ypO8ŸKe%J%]ouq`WnzaWh|'@3=AF]tq,7vGBFjk-Nk=n^}6.ُ==]_>7yde +~yL) {w ndTkU_9GshĤ^L)[X?Г,OSۮ P3Eg1 ׳Ζ AM vJPݑAP"nv$[Nm0~"xQA 'YU1M,1ܦ.VN+ 7%€5Dgú]ݩFl3ˇl%'rOgYsޝ40kSRbJ0e_P1=+ZYc#UՃih؞TsaFX9ņfB&؈}f*_c:LN1%ik/+H&S}x"ԩdڊp"xrryU'@*k ..PVQbL=m=،qOch4 }ez}XN=sjIu|۵~ko+NtnovfIa70rBixpd \]ftP6q-gvLz-+vWoV.T⯓jXPӠ{sc宀r@8-pE=Z=߆ Y"~GE`,]o#AFr֓O5[˲*cUD2hM> ᓥO=s!8IGX4Fwi ; ARrzH =PaO[:0 `r[hҶfmrw)*yI> stream xڍT 8TFjK( CŭLq(ڴ̬1+c1ChRNN"iv]KIJP5v<<{H0f ht*: LT@OP8nd@x|$#|~$YZ2LP0!ABwdB\1XM G()XLBdlm`Ĉ<`Y@2ӫ DASO-C|.„Q"BY0݁+ă)Li_Mg !d2db<D`F0JFd@+|(BP7O#<,@)21;,;,4Fl>{3sL_nѨAYl,"a"~_}SզpC5A̍x l#D p"8&o-XS`%|a?[8h*}y g C_WLtX9򗠭-i  Ksmw5ecrjX>>Ҵ< 6b8oa@JmTs*oO7˪O?˝Bn4Hk Õ~O f!B ~9HDD,wDLrc-AawLȾ,F~ !ηP&ƒ@|>IL217Q4\,8bĀBF1!bdWjPdIF5࿙怂|5qRI">$M?ۓIxcQCcظ9[Z4l4Ml`T=jOy?'B|թ!td6~p[Ȥ}õkMQVz_mԦ`QX_NVz9}/v)G%WSȼZ`[̨T+sX˱s$]ggWK6H3:-47lꉭKW% A<3M@<&x uΛ['^o63W9Z&r']3v`mpu+6ǝ|x$D' aQ) Gv[XxY+9q\=_0mx@h]N\69mn`6X?꾪Yb_9' l*pX?bdRa՝%4ix.U7}iWtIT훡rq4(÷piŸKR8;wfo+(lz:fKJ="]ÞoH'&M7C 4wy)xO{s<_Xv(3*NټHM@>IƠ8C@zRZ=}է2c2/swlZ|?\+[\8>GV?j:}|/^k]׺%&gyUk?}T6zj)Xuy{kO? PMu Sp^9WqĹYoT2g=A#;kXnnꜨH',^(-AHډA)95Ū)7n}*v)ԫt~^Rò{qOlBknԸm3XlPcptГ_zc:e⿣'y1o} endstream endobj 665 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/@̪X endstream endobj 666 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/znb endstream endobj 667 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 668 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS 9_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZK endstream endobj 669 0 obj << /Length 695 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS'K}v}tƾ`R\ws*pWl:*;m_Ű=EB.=]6E%‡hWvE;^N ƣՊU ٟweӟQ?OIz^UU|ڕߵ6ZrbˢXEIS:.trA&TH>4"PX H BM@5*08WfH AX v.2I## .zӘˈ0Qa8tcpN0A2 @݆s>^l>^wo_j4Rrtsľ x[%QLuQ.ݢT ܂PKߗp#}߂pMAM37CB2>*R{@8񩎤3 }c$f O#z  ) spW)9N{=g-_Z ~YK/t:/~e}Y%៍-t:UEk nmGkp\x{)ނ endstream endobj 670 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=Ƈ`Uv+NmΧ@j*Ѱϓaҍ*mima%+,U`꿹V#5T>WU2F[l 5GT8XD2dC-X]d>**lv.<T39pD;ps٭N)I&S?^`qq5 B{ $.  SqdAEBu7js"ܨF)EYQУ.?yRmTq'oOz>OZO)yJS*}/6%>{[ቫs}O =F/Ehq endstream endobj 588 0 obj << /Type /ObjStm /N 100 /First 908 /Length 4052 /Filter /FlateDecode >> stream x[[o~ׯ]o@Qvi춹R"m_Jp D\.9}KEW…T( e=Ua=u3>Bk[E 㶈 dRES("&P9 ̒:PHP.B](X_h `=`0/Z\J>` d( z$z|x 4u{la h#:@ytM0{lA)yt,4BQ9 FC^x0eAZs`X.hq:XNU҈A'R{ivR6xZ{6ayTD&{e +%utv25GBp)dz1zCKHXʷķ M*#PMaA^C̆Sл7 oK{TTTFJ =&J)-gR4"PY؋^:6 D7 T[mD (wڽmZ%-.sdEj?,g!EFКS"j`O8t4h.SA}ޟa,5n3q?%Jik6Մ#*4g;S K(Ù$kTxucPZC۔Os$k)צT<mV{1\CYsYC4Zh3_=d=I̲<+ xٿ^^? (Rq [,z␃Tu` wތgm}z0xXS&MB_{|mp57iG?N)#{ &H*P"=6}4@D/Ȋ~9Xܮy~au[d8.5ox< 3>{^M%Iz5vxk /,b{'9M^CZrfHo ZyT/qDiYBg(t~"lf \'u &/9]H7,6 f|HHG3ݛXϙլ&r_M$5~"( ooֆRQFr 6E_hI!!td1O*76AEIsΒM[2JZ;v)鰆naZf"QJTxiΤ9Xa|]LJn@~E׆W9iu2;{G˰䖮lBؒD]M\hӽ4=Ps$1;f_Be˵ En1Fq3!%'V<ť ̷I#l -*UD(8q~4T:L Fm덕ǥh49XFb'~撨_]z6dlXk--粄rEdW.8FJi֏ ޓ|hdv(ׄj23&(5Ç n]}-}^(h<xOφĘ%Y ksn"kBYKXs;61w}mիTr&mEx|hK4˒(ceIrUzQJ)٪s`G`+ź62os\Y7u_S(]j36u_d]+:nY7,-SA0y1Gܫ3We;XHm te9)X 0q\H+!&[>g|ye+7AK /˔%ëq!:bWCNbJ˹Ln68H8+З :TRJT|zo_C6qiqN[Voɘ|}+0<ξGrmdz'GɎa琔e=dq6ɛO~ы7Jbbؿ;4(DwmKy\5mh;EOg`t= ?URoEH}FCq$Xsq"^'JL"~o[ۏd] q).m_\J?+a|7F]!Vh0X~@:_O]5ī_#1S1೘ͤ쯱gGSMf 7zsF=엣A#4 HR?պU.ߖUH?_<F m쐾#7!~ ? IBU"27*fO?=Lo09Lk'*3nf>yyyvДܗF^V ;䳳g߁כ,ʹrdlsXx lX} "F5">uQQycmAIc=⯆OwYuu1󗌁ߖy0Ain:N/~eK6g~ u1 8~'[,U帕r XHv ?:86Hd?KH!VsLSz)L߭2SXϞӓMsBaZD͡c7fb&Y6<*R҂1P1?Y`؟r[8}k gиW"[f t\-W=VO9qwOQ=;ۘs!FgZ".~H]J0\v]s#ϗ9D}ד[k rXM+Cc#|,7汵(wGoOO^goHbT MW׋~sΆ9O+3S fqD^Ex6e(rS>e)Ef";EW"ۦHR$uEm|":,(cCPܝѦMO*vLZ.6  6AkFmF:AZ)tMh͂NޝvMئhͦcW-b0 endstream endobj 674 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 676 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 677 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 678 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 675 0 obj << /Type /ObjStm /N 100 /First 863 /Length 2638 /Filter /FlateDecode >> stream xڝYn7}hXHNb'YKAg(!s=dq8m.ԩ"gY7F= nI ڧ?`5Kj|<"__}HEGi "@%bP Q qn#0|UXi cP<(DPxn!F~b=dB}A4 ^V0(qE9 aqcqé( CLF^N "ek99(;D&x7^#K eXP D`!(VE-]F8 ƌu,gp9aOb6]!76B;R yC^N0 -g5LbB88n t9_lWo# iu|zyzzϳg/IFoWwۻc'9䛻ow^Nyq5E|x^@DZW>"~'?bD]DEd@ "GtHwQ5"fl(#~|_> _nw4ï:G*_MW5PW^I Fp|͜b|u9u~&y;M1SNe.ʱM5療G0O9svz9XyW}Y ?j”O8hb#:tMU$4LE~"cjZ~Ȥ,bȧlNy)eUf{t4c*=z>-YOS_$|ܙY۰h-8e}e}Q~MZe:La۸E_Fm fmj_pp?YօmmzCS?N-~*BP/A*b ~N~H5D-#jC-T>}>*,^TҒ:z4SB-N^\M'R(Ab]'L_jWWKtϗ+$; W/Xb:ǎc aߠX.h.nC22xQ+/eeߊ'_2R}ڗ=_(ޘ{Eq(.瓨Wb)QF,5q&I#-E~Xj`K ^pEJ LSLL)IoBQKh..]~ї օl}=ua&TO=M kޙA̪WR$iql^Ԡ(ꕠfT{0ʔm8avO,)qOfLaWf͊ċCE9xn`֛e7XXi;(SʡN7Dni2X*E߇ᨖxܝX˘m֛e63U'k>.WFp3e$S2W]$ALm6L}' .WSf`4SW7tmFn:yی[CqfdCn{e6W+AkYk_bC^x O~_u?]^lZ`t#'K(qAg7#W^=:^mPuWWɓg1U-=;y'a>gG"퇳B`lfk_9_뻔lZ>NGdY2,$)|UkN^QUo"4mC@Os<}U:93TS|~u& (._o֧|:[Jt3:l^Ggson=/D@lR"ple"fEqkE4Ҷn,JZWKzݩa \鷦I¬2K 2's'g 83%a-]ԝ`FJCgT.cj*5v]HH$qţǥA5]#ՠԳDƲB'9B]`uux Gdk #Z0=e8Q2LO!TSh@4SLdApqԝV4;&u枏'MJu%!__m77g"Ԝ95BB9Z7\n|ޡQuֶq`Fh(SR?L<*)GUMMtԗ_vw2XgÛBx^ku;G\)J3w ?5xV<={VH,p7\G|)#?r:hf)ϱsuԑ +YOZTH3Q'Lk: zWrU%NBBMm#n:wcuP=W{O Zd<0̡E>3Bo͡E@,-LG}1ӿlz endstream endobj 714 0 obj << /Producer (pdfTeX-1.40.26) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20240728144859-07'00') /ModDate (D:20240728144859-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.26 (TeX Live 2024/Arch Linux) kpathsea version 6.4.0) >> endobj 704 0 obj << /Type /ObjStm /N 10 /First 81 /Length 406 /Filter /FlateDecode >> stream xڍTn0>6/Rjn]T@+BJBTȡrK*!=7lRX ZD#Ro0*Ct‚GAk)<  @JHZh\hQC%n7=a]!6q LQ3:jb0H cI(y,E=}0{-mSSz@J Y c!v5KH]5cWgW <P26*g3 W2.e et5jt̷!WoidF}VQ=lֳYV:nN!*V(F͘18 <ȩO*/C tB{ "|Wn]1˩fG;JVJO&$U1w#te endstream endobj 715 0 obj << /Type /XRef /Index [0 716] /Size 716 /W [1 3 1] /Root 713 0 R /Info 714 0 R /ID [<716038C57B2CAF8B2D03608FA14C2FB1> <716038C57B2CAF8B2D03608FA14C2FB1>] /Length 1795 /Filter /FlateDecode >> stream x%Yl]Wk;i$NOq!8Μqb';Rx@@y<"!>UU>5"X t*D {LN!B)XK|@ ,ahGV@Z$h!l+A;M<N.M65hЦׂuhN6hWNnhhA -ㄭ -G lI+8&ЉVF;FlA%hU#=ma­`JC~5hNh . hhhc`Mk>JAӚ%FZtn~m34RZÄzaкzh}hPhhZhv hChzM2ih2fDC+ϢCA8M3.AF8 ДZڋ26&[̃h݄W"rFД3[h3hMp Z'arv-${N;^\A $ٝd/'ٝd/Iv'ًh䑓ǣBH;~uh䠓dw<etIv_&'$}=LP؎P7ϱMCrZ1rH1z9:zjW`kwqH x &r;>p 8DZ5DŽ;:~vdN8d~NJ: $N9t6⤚8dXX/t'"#6F'I!guٮtq6x'Iआ$_+ޮcj_XS >k*TT2T*Eu@&eEg[6sG@egPi*1k KP9`atD[QѨ=PS(1"ND6.ٖ lf@7Y)MFWT®~iC;ԏZ˽`~-a1gu%!,|3oq+^^Lzyi|PX>ܨ>֏&znXO>8d콟+\W yC01ioߕ6YiܻVzQ=fDᨕKǍJno5%?888`5{زEH~L :ʚgeߗv$_??k=¾=lLU>Xx޲Å&@YljJP>l],[7 _"/Ikn:-&x &&x}}KCQ7^˾SbeO?-m1i#<ʄu {-{%ͪP?hKH;}EHş%+[vIǝ`)i~fUYb%{IM_s&c60R\f^n9iYM@UAg*VӀFt}QeqPkrO4"#Em7tnQmhrtZVn4ڲJZ9Ͳmi(j)s"MS y;NO? Y]:+̒-j}}R٢l&K`Y_,ԙZ5\Wu5\Wu5Djt_5ڭ5X]t1[ endstream endobj startxref 461680 %%EOF ggobi-2.1.12/doc/XML.pdf0000644000175000017500000040247314651541113010260 %PDF-1.5 % 51 0 obj << /Length 2330 /Filter /FlateDecode >> stream xڽX[۶~[Mξ%zig%NJSJ+(j-8/"pwhu*?ﶯ^M*XejRUfZy H?`֛$~gyx}w*p<{.ʠڭ7))Z}XrTXeYWfijaY)պqlץ ^|z* ˢ\mTVi)Ln OE~:.sgT"0MsԞC\18S<-\IiNۨVTEy(g" my8pzoFEm\<ΑwREidod\ <5h۶G>Ѧ^LH=q`CNi u7jgn<ؓ20<Od #`;a)monk*nϷ]N}`j2Lf(U̕i hG̒$*Tdƻ/]aERKl54D%E=^0]ݓ*RGYGLqwn]k3߮I3 2q~`f%|]ZbNUIс_v VSC Bz ̯a D>tN5vhT!,Cgk_\0u$΋}#I:}7&OC-VwqUv?II}{DF|e8\"u| /yt4yv>]=?oy]&׽y<;s[I+q2 yVJ(yuM2hCaB2l9QX#M?%# spc* G  o\O 8ú9Lz0% [nj7 _H/*jB)ezYE%R;؍LԄ_= &^* ,`EC.Qj{MyNlL8 =hf%ϒ #g-5+rK0CH]TKd!vMWR\ 132#'R/ E f!BYF(k~ <%蒚?Z"lwǴ)$!bL{ A2fI}gn|U(Pם| p1D IDC`S{he&N5h9ѳa?V"Ʌ1wkHgf0˶A$_vǛQO7M$k([ChV%ZVצT>=^xM$>r@WIJ vKN˗҈Ggi9Aex"l8܀7xŞٓ*vsMT= :pv,p4Ÿx)/JuՈ.BϦ6EKc- je=aԘc^AC~5(OIh<}h썶pyI9FYc GZ1!BjsirwA mU[T}ŝӬϹψ>^5uX_>[˔ vRq+0|ӕalGK3.ް~3ySc' Ux뎿?1yGDn%-̡9Gg_Ƃ %kn9" mtPZ^[Ԅв̖U)U/dq$,A\5aYk [O7=y\+W'`[|;XZ|AbIr ajgQlߌZܗ $5Afr|(6-T@8r dlS/ =qe4B%`O(B_N EVs?[s1Syѩu{&@P!Xm0MV3NɸM/2 F}ΉH6Q59 Dh%#⃗ i։on#ڹ PȘ[K~8Ϲ~Nf (C13Ed! j9r qH *%>U1+q)iy/ƶoFv(RR4$U9_C~9i=dByt*_ 0E ܃ٜ`g Hlajo&f "x@qe$qY&q( 3=1HuqQrWx M# djN"`1y}$QXyلAtBDҗ. .߃ x~H\/*VaY剿n_XZ endstream endobj 66 0 obj << /Length 2100 /Filter /FlateDecode >> stream xڝXK6WhDUh|JIm2SMekCR H-Azߎ Li|0=@wVHD씊 Ocp@'y^?6n`E?QΦåyV>Ta0nc:< c*[~V7K+k@WmP(Vhgɟ,8.CY{udt:l+DPtM/ˡ VGtRHteaGԓj Ӟy8%rxrW_ >VkYх~IIUu2&9~q(L^O $`OGPXe8,xok?ZnKNsU[@BӸ͙D8`+!7*P'adу@I4gԃ]@.25Es"k(GaW30Z'1 w80e&[DћYaJwmt#Z Oart~Z\|r[yF_!s}pš9hdm) :.q#sL5r by( 7蚇T@xF#s@1N%d .hrdL u߀OdX ZDX^ M;6t}UM\7PǔA dSats;Om;^A@ϟyGߍAp7JR +f\aO;OA-00(񀿔k,9Ū #*5pT*7c=Koۦ~?=1AfW~}/CT5:G^{3w$&R7R@]-No͸-]Q%gؽ[yG)"t6%4*|FvP<}B=uoϵq8cQ S4kRΒi4/ԏm'OgC1\35G{>!_Nr4{mjӺf 8Uݬ|d+,.RػhEWOd#!3{En(yТY&k*Np q;'8ڽ{<*g1XWѢ;,xRU#?H9?.Q:)k|ٲG5-3pBަ:i.9+FmӘR6o '=Gc+{s86/|խ%mD9IEm(]^iLzePG8}> stream xڕXݏ6 "9@3kÆv$B`ٹ)R󵷧H$MQ7ͼݕǿoW(q0[ogI0K|d.f_ bm]|&y;{yzm27[+T~iFWyOQNDu䒈y=_S0Ki" ~dVF9R|h#XJuCYW@OPSz'4q뭵R1Qv !X$S( EOgsYtc#7z8!G߃3Gj{"J]IZ{^bbOK/n.a+ Zo=/ ]l^4ʻR0YvlF!Z&|y`Ep(pa$ݮ(TItYE(|ƕ=6. |ӫ{=( ?"W _]S~l>Dɮ\םT|67ԕq.4׮;"s R yTlNȀ]%{QTKAlj|AqL15&@b[%_>'F=8[UB(ۮ,/16ÉӿOk,sd5czYVKirqMQӊ޳c2.7% z`vA:/]AA]@0s\sɜVJL+vH:_`%~o'jV&Bt} 8śUD iHٖz,/{"H\Fjg%1S LN$ȭldK\|Jo՞wMå﷍ (g,JgmۨMJ6tN܎{% utSMU@ZyÍu! PͶ7>-q593ɸ KJ~oiG [+5N`$8z'<^l {dUDvƩ n@09ۋ38 BO.p@Ns4[ߠ;{xhmtףpI@Ӿc\ U{{O8=`s`0 Ā0\Cy?$ttjAkWw{;P"a C&fnR]d+7 ӱL@=(Ylm8O;hu/O/`g+;k#CԊFY\u#g0d?;CGG 3#zȑY0AoxMjkZk̄-IFq$aܚ[3yبbەЖArf*`4N _FNPzюg\3Zd)%u3΃ @ oKEFoZnZ냨=iZK[_I2ME˩ "@~k"iak戆.hSszCCVo%jcSE |tzԪ6Y|7kv3Z|}1ntDPQɈY4+M&:moX;é<6O󻿯i!][3iS>ϴ^bd- S~#Aa~S0 7@:%F F@Z"0,D2|dc9`h#kO +!Xo F(.GJE@<{ ~P ~ /nS71gˠqnldޭ^ endstream endobj 77 0 obj << /Length 2089 /Filter /FlateDecode >> stream xXK6ϯ0|YV%Y,v1X,#9h[J2DbdIVd6@MW_U)XW_oؽϒ0Y4\"(]']uon0n-70ZgqYҾ~! xM|eEZv4#vTaG4E"be>ѱ`r[tTjz3ݝpty_ɇQC}IT:;n.A< Dv C `[8r(ϰx˲ǓD y>DatP!^$'50H&uM?Fr /r%4#bnlO}<)̍H&vgG^'΄yM>2 ~6v.69Q+4F`0,8̯ ,'9mSRrФ8ۀ#*W՞3{D^kr>| &:1OgS싖/Āp{Fp&t:vΙR8z4=͘fыiDTFwNxjd~|wFI:/i2f霤`5s9Ç(>ZГ2$Tlϥ %xw'CRv%ቺD8ttL{7')yHK}WxOV4:B_xqyI乴} ;Lisn`B^GDj#IK:zF Vں@N -JDUTɗYJ xh!cNᬍ.Hx"Og۞ŀ  Ip0e:{Wߘ[z?!+LiuxoY9Gr^|TrM`Dݣy>vg}D?Dea-g*r)yjVx8șvSd?wo~ endstream endobj 81 0 obj << /Length 3025 /Filter /FlateDecode >> stream xڭ˒۸>_K8f*ov9$%('_nt5ID<~b[Շ_o^UY.ʃ'$&xomhHAORe|DŽ2F&쫡Gez`iFkzA՞l$L2ID|\4Zu\{z޵|2Q,n !NrTxv'@ :7nFi"3|v4(ht÷, `~;_؛ ͸-ܫV+'~7Y.h᭴Lu3ԭB2?,0 D2Sz#uͽ4+-ofh{$1ɂ_ծji4C!U[>zu  M4JGCJjPK (] 7OTFs\E",aB7}w7H(V- 2Ze"#pbI գYzDat)SYz2XԺ95_U0q(2HLEGi (#s1iYIʪ-^L<5a3|i=y(kԒ=C `̯TL\{xr'>ZOКP=wh.v3Y_o6"\ aZi&]㘏8M,vee(ĕ,´]2ϮlMmgVf^Mr7 B@qޤ"lXě+ uz&8 EyEs̎?3s١w ܉P&W( sl/1 Hc|sx0Z~W~Ay1W՘88lɶ2.JfPC"8 6u?l8 sᖹ4"/wSZdG4A{e; 4.#)v̓")ՖY?>#FSdGT€@ĜMZjuvěSqߌvձ םbqͤSK}tJcF$'Ź,Xۡ qEM_|2)b`SsKavXJKI?ABFRl1v;n5R[O`Fc)W@@CƹCA3_.hiG h bK|17^BՓ(}2)!- wbh7[VUHwlICX'*2ԡ?1 u8Nlw~|XSC~b-C;"#M;΁QotfRS5:ӠVvaarP~$s K'âLHzbVE2$ŇF-Asayf}=Nq.!g24Xd{"9'vM} ,yŀ}چ h_S|(g"s,ŠR'=0ͽƛ&N͡.@v7}ҒZwfgLha7Тy::!A$d̂gbS"9 Vj7nEWRe#n/J>àX]{X6.)0ϓ8D?*sz$r sc MAö$֎{7#(Cő~Gl|{T췐EKIml!Aσ>ex[Jaj eJ1ii% Azݘ2B3DEbmۈ+6?c-1{lSTktppl/a4™p"0)uTEQSvͻҫ\ endstream endobj 86 0 obj << /Length 1072 /Filter /FlateDecode >> stream xڍVYo6~ϯУ D$܇m6n Zm": ks8󛃎yw;?.拴4dix˵W$^Ga oxlq~b?Bi ׀?mXVٿ_狤ʓ G^adw U~#Qr52~ DRf\xݮ5+GECo]&%D v27[nHf >jPfS 8 z1\[?FN ֋l&EckUQ`AOc)$VjQ@ $W;zG2\~Oa$gw<@4P3)@uCgXw".f3$mJh$REa4-ƈ@}UI@ d(H\2!TkYWoEYRY *o۵Gv:,:.4!`%. F3_':荑 .d T92 =B)̨ PEq=,EZ~ j#tKEJ;^`qq:hZ`h}!OV.b6c'Va~;P>t]Oet:!o 8`Vizi܎J( j40ځ7zR$ʕ5G#R[} -K\5Gq''6ZL*(;Z@Mхl휴kD_A"}1R k@~ _dq 3$aXT)6?}a SH)5B`\@jn+>VfaY]WrZ(#~hM:ƶ]NecB,O_ЃTi~IӖ6H-o̚3GC5k,*mCWWo~nJKJbk|~8 c6 , \] _w6|~ endstream endobj 92 0 obj << /Length 149 /Filter /FlateDecode >> stream x3135R0P0Bc3csCB.c46K$r9yr+p{E=}JJS ]  b<]00 @0?`d=0s@f d'n.WO@.sud endstream endobj 100 0 obj << /Length1 1661 /Length2 10987 /Length3 0 /Length 12063 /Filter /FlateDecode >> stream xڍP- 7@c tB=\ ];3{U_}Vdd!06.vN!'N GFr!BraO2i PPtp89ܜ18 v"E8;aOys03YpH؃@ f hhB `88\]]فPv(+ h w @{_?K+x؁A' 3);@SA.w; 47;VKFVc,~'; hdG@:_A͝0(;lGaYB borA~' v?ݻ;_õu:xY,,aȡvr)He$BGf^qrr @N5Z?\O=x{:BOm?4O(svy{[ `6@V`?A;Op}2zb?F̡'-(W+%%!nOW|6W..>^/_K@r?%-cB 0CtCWOgQDߊd]3ivY<1*]p_S]П+ _ Vv_#* vYaOE; P?2}z>OCzZN)`eO:;ў^<ؓ 9o%D2E ~>H7pAO~ߕsX r8@W<K;пOWS&9bCOu<=hW5\lAP<ŀSSz]?i.v mvb.׫J 2WtLl-.7X*/;_H$u,0Q{7<jSo3lF1g$o_MK|KY#|"'',+.9ӛ[|Jw%ltfS406 f7 G*4|O)2-nh;K}bgxc;D3E˯g2C}芝R!Q#vP:O e{y*3H23m_I9B3VނH+6X+b{؞5Zk52G)pLN)nvN͋!lo>hDMAc6{%3 PZN}~[uAm%9a(I`('Vn"I ˜SPrmQ jn1y#CF|D({XQdW^%O:N>Ř;vbaw7 {ԋM=nj`2P O zU/uӋvwǘ_4hG+ziAG HJj'1βi"29Ud+c>~:N(ʊ,&c(65khfsZ@.()'N": Ӂ{ׂMdhuنeȽwAsm=CC9iz؇N>;N3F_O~s}Gj-Js]nUbyUʃ~4 wrh cYiGw[F(d ,䷛ ⵩/>{oM.bkQnڱ} @{]FW|XLI{ DY^ &7 ă@*WMDE؝^_D_+D(p?pñlNn33wV9"dC$g ] c  +÷%Xr~8˪Q 4/ CF? 蠥\H~=r|0`޴w;g]zm_I}d]htJqeKMx9ޏ5<0cJrSq1'ETΙ"¾|jE^'mj4מQу뾀m3Tsś+v2L+ $eZX&ӿH2r(p;Ou^t&[j >ETe#4| EjJZ,-`RQh/n^`p4dU} )d֬!6 61ԅ |n /_ M&.FX,$>}}:dIr0İU|7|DQ 4Lxz mL:x'ȏ>YWWO]cb8s|Gh6 QY jML5F)4yqU jEr~ʯh*ՑJ= .aӾD= a"N40ICl+$\$ʪs2K>Www/ylϽ>/D*?)1Zp3?VMƾvOu%Uz%EGHi6ק6=)t3xHLpV+() 5׸FJiĚ~e% `^d($_!fNO3-# O4Ek]wVz$b݋cͣGj̺ Q#$J\c)GPhNf)@"H$vcwɢߦ]=kILOhEѾ*5/-FLZ}Θ=U)MKsA+Qak]sxL>žhn& k ?[WƐ4=ytnbk` ȦTy-lZڶy> pOIi8CgQo'~$-;1lSq1RB`b䥤>xGGǪ8CnKX}h>wFJY(#$wG1^djrd- qn jl3(Pƙ>4tkaZ@)Ζ }ЗљYaTcxÄ́ୌv/59q!R4UbTw&#*a?Y!Y9ΑٚenF# ߉/ ",;mзws?Lп8j5®a^p(/DU^_AFjIߏԍr.[pI0U\?-ٹ_pT N. „O'v#vUI%D)d7+NZ_ |>m7xOS?9WYh_Զr#$y3eo{ĭ~<> {M yS#ޯ5KDfx)DG&-m: c2~[T}ˍDYߦS.f}#j"ie;zM?YV‰B^Y>djy8b-D@WX#=w|l!58-|O)ZӭO+QK]\}<riFhP.A}C׬nyJj5h3nBO=ijϊ*V4/_4i*rK*edaOe 70}J]¸Zࢅ4&6*Pg] 0'㣘gxS0$t1!ƟJBQ{KrDD\׊^ۊ?/S"x˛+pͬwRMaʩOHztG2O]M&wF{xA~ᓗ>ƝߔU/C;H>3L#TwLbCpӂ_3*,y5.K#1Q\i)M4_C ClXZE/R4_cѤl hFf$8 iC*׌mO;5kLl5fDP9K;Ҭw,S/)FwB^ic*eac̔owc|"A%,fHjyGba\@]]sߥ8~D!~wm,DQu }L,EOk@ +Eۅ}+tͦfkEƍB$?JҐZU Y'g)=@aj >'9%gŗC!KB,9ačjUd'jǽ$D^*(!nsvŢd !}[SMDYaZ$1pX ђ數DjO3'=x#Vif7Q*尹iV+O FK[7;UHcU{ SZSh_UHUXj:ݩȮS!'fϐioN_^- ?nPTaw,TGRĹGٓDdj4/MMTsWOi-jK}H8xa6:$y|iWɠ].UdŤL1iSߗDƁwZmLg&\)!y 5n!Z7?('q@*Z7 ^Uv?yV``N؋j V0'S.#=xuMUt$< &BBn:/ɲbnCd'4W7('-I][LCcM(<)8/>PwGq2ӲߢtkFXhhˮh䳆U'㘼:nyD(WRVYC@Bᥐ.Cb~8~h lаCC hc:^ĆCxdFޛ1 N`rβ/@!ԷKT8 x&ZH)ѵǥgA_' r|"% 3RH1q4v=+:ξ WOvoh9EOKkm?s<5}R^k,j1 4W+ ɔHA1а9Фa aժg1HyAIڏwN/Ho$j^yXB<_0?|@=>0k.]9lrq5we棪t eB n~ǥo)gǂ| ,"Q7|5)~yOEkllK*)gu6elj5Z!BJe%Xeiq>&t3b ׺vI(y%~psxط䡌Ro?D#^Ȱ=lqz`J3(NU5͂PtbDy%KO>eƘ\||ۏ6рLq-v:f~R]0΃\1^qTeM :9Aĸ0nkwCQOHh)8F*8˲Ύ0BXKs#V9b U,QgDQKr?DZelJ'E_sYFp,w@bvݎbXb?8kiGCV-"ŀuf%h) 媪gmTFrAEu$F׽|DR)-3 Aru2뛄bV(Q)1AUw1=^R +!te%!zbp%WnW AוOSX 7̨56>$ΗՀ6T9hrc+-oo#ic]9|ێ>!D:2=zD&ƒ.=Ҳ8焕¤. ] /,}­gR1Mbn;Wb 6p-\XԲM3;* Rf9TܶoWFAD=Wfl7X遘.)t"vETׄ MI/8g]?{,cKMWW;wb_E~֎v֩=O*T$?r~Cf)(ԮbC%pr-.{ҥ?z%2jR).*/uR2Hqe?0ߡ"jey`e{SdY?;6c6}v]bgwۀ鞏›՗Haaޖ]=hDCcCa!3!E 4F}`^p(u)'e;Aq$Q=PKx=$04SR~~[R#H#{NIJڵ6~.C oXc@p+7p|p\ky[{wūg=*k=D_hٵ{NVų#&fϯėwVKtD$q.c`v y  'HDzwF1ƤIU}I{e,e/GmGڝeƓ+{=ur.J9ڢn/W+uD>S Q> stream xڍP-@h!6h@ HNp$8 ̝{om]|kTbr9AX98*R\n6.4ZZm;70?v4Z] "i(l=8A`'7O_!@'@agPa(:A@hNP;[>y0X28YHH:v@@f r|h ,@nUAYӓ cdxڹ4A  {d*hlhm[;?ZNn@(lY )+ PsA V388.WBv?N@`mܼX@@ 9-Ij5%͕{FeYb%'cY>7_/ XYݙ]bR+ل\ /K[ A89guvrX?==@7;ߎFh+;K7Og3Ov^#gq8~~2yVO]JAWU_vJI9y|Yy\NNnA?/O 'se4ׂ0ӳrAna,?RTUH gt{\w-Pqz\])'܀ϻ }vrv^ +u;7K?] u'WW |e|}>kyy,qP(YJ\_uyb;9s˿sc X ?o;_ !6ϔmO__?_ߐ9_g*yC531|/`l_ =%*Kw(jc=y,Ѿ9Y WTJdKfdmsBNd LYڐeXxoElr`Nsrmao˾dWrT2VmmG?`&E,w,^yG"4+Xcuf[S!0xa\^Mf?Q(cF?5w;\IBCbHL;2I+H4[oMn: ֆ tᩢ&R<<6L,X{c2"RcVj'X+7`,U}'l34TP+2=U%8Rnn<INW)O,݌|^p7 mC1 Aj-e0a@_9ˢI8%UՌ}PES[ .[a VFɸT{!.°}45VNR#*!Na@zHkurɢ7?*M*O6|]^29L/62qޡF7_>C.M2x@U'%f )U 'HXNk0ﺲcNYtPK3n&Ǡ;e|M qFR lUp]m]6ah;s\ߕ@B;tQYݶ(n6dj@f[vsLi?qC#bg &kᘏWܥ;WNXz5z*&eH 1[HU>Z;B-3jP!Zh2P (_Aw6qn+K)M`/a%SXdUB`c*LD$!U 1ɣ2Faa!5X)eqy0.^6a~q"SuU({ާPGBС;>c°1oS4'x('ȗkjD >/%0‰uRPIXۙV7:|+cZU2\WqX~w2_I6,F%tϥ,źrD_+I!"[v$!( ԭ+~̙L+ ;KG{M^hrP.f͗e?~YfΫ£4S߫GRtU&X\¬H|xKCDu@iXE ܕFA$LV|0HO\7 v۷c0ЪĢb%G#+qꆰ HԎ 7|/}4gNPIFf$-!Y)Flţ?ЗNC}xWހc0cOܜ<qf䥐Y Ubr}maFt@M?4*˨{m?6KcY[О ۗ/_䇡va^.9ŜRM GDBgN.~5$Wa䩴cVs7{M24͒^Ln8QikN?,;:Q|H6/G]'+jKp!Lqb}kcЎKZC [4;N5A]wITOV*fO_IlKѕrluU)h?WOJ}ee _nP`0!Ϩ3;$U<2PXefҺ򿊲68VGxj4UPtI?讬:&j8p`( .{ZP{lTNş>tr,=;KaM&;vM" ~.jJ+;:5ijٵ']ǴSԇnm*w2*/_/hĶΦC/ Lyy#7y2*mj噒@RTHYr}V4>-'/xwv4j(2~ דikq"-9K$ caKW~+vFPRP^4 >d%R^PV^.^`PI`=A3ߞch4yv5~}8"8޽ ӝ\kuSѧR5፶"bC[q(՛fJUD#eskq\N8c#fQʬ%u=7K64ҕ)P/*wI0ir ^8ZNWq ` zV_- ^,]siÒЧ.fC:L⧲XVn=UԴ*d\5^6u"i7\p뒼+Wu]?l ]}{le\,s;ҧEX3Y1)BQ~z*ɳ2KNu儵k6p }fz-Q`y^Њ RCXS_5 ;w@noU;W&mPHT=dOgm'`eoC] jxBmeʓ}ra&98"ݰ7 !HZB?AΚ}#7i%0oE .WQͅ uPSP&DqgOWòfb{,Qm [y,|zCeآ %]ؓ=HU~ڥ<`&fNՑz7>"΍۹ştG Hy-fz}0q=("ê|G5q,TqT<=Z0N$ OJgo9[oT &OHEKAGf`%!Q4)-+5"uqyYCb*gΔ7U\qj@1<6fڄ!xMh E|oi7s.EZ/\z-]yJ7ںBEkR~ވyQѥ0>!+|;gc'`ZWMzVjżSa[y>>'VYd隄qOZRE*9qXY$IHF2WyMGJ3 -Z1a)6,X&[ϊTe>^2FչeiU `N'GhkIlp2VbrTpg8 ؚgBݭVO$_E9əMX:\P@s< fRߤ>仝uP^^o,qsG>BB49 ÕF!Xz,]}ݼDKqR7+Y_'Ż,pf'ХhN!'<&?SzX;+}N]&,aZ.̌VT4̻EA嗭60vhYu+gH-# cQtް\  mԬrz\_QcB:k0nViD.(Zy1΋=)k!}_b5ԉ20IY9pZ=ש0Ceٔ%ό {dވNԯCHI׈9{"•4e_Ic)[!U-Eeo2{ӌޏ`^1NiOL(Kܩs Ƈ )0xt>Q"3EW ,Tr"y q.xzGON>g] [֗XXl3횭ScsO #fh9.hMkU{#zYD9a1tL ɢߙnWMֶY YF K j(8~2%X\Μ'"Ł'!*["1;nOV<['ZVy^V8@O`d/fNS=ʢ*,XRCp %@ɔ:($Ͷ57%u{LeV0k)Q8֙W\XlU$W/LWFWfӞOؠ َKXPk917UeH|#_qS͚+y|n3z&vfc~E*'8/aJ(2I_ax6Hl7 ({Ds* ~/'R@=`ky]pEsx947NP(;T2ªD̀Ŵ k";<@Oc]#}[Mf.k^`uվkbaVi1ɯ.z[@_kbR!H>Pǂ$]H>Ê&RnY#)<,o ~}, XVz|-4qYA*J5 BWY$]9㏔idh%РnL8kW+PBx\gbzDaC;v8SHz=ձ~X ]}ķ:mԏ0/UkDcmlZ''`m6z.m])@di+yJ}aI$0I22.kcԥbsўkź6 yShyzdWY8úJUӥ2Ye5+XR7 ]d\ʫ9-Jy{'wgY88x cIp_"%Q(/9OzZxR>u;&vu$_;Feٔza6k;eVe|;.V[< 7&P5ިf?6?59Nsg00s^ K`O3rLMFfT F߇7 (r{ٷ!zނ7ة>kym'}5Օt,nіT4'` :8*g=MfЧKG9G\rs MiaQ w=mMRS!HL@ei/=™,dSg&XG/cь 'sn&T  38<ΠYϨ4Ά9(? Bh%>] =9p7#qE0"Ak% 0s^=[9i-@Q4Ul$AG-'`j*V/-l$29&m9XlS9y9<"zq L<|~)#w,(*EZ7`EƹB ojD6HHo}2!D 78>m*Gn,x[AqjՆlLl NzyKN"I;ueEtlާ3oPS`o^$,?мfbj Ó1ozA*/"sN=n6;(] YDp x_딴xW:oޘ]e2]]S wX6 a**- Zɤ sXf^"hkԳ(]RoL *aG3Ur*e☭I2\^|G H[O)|9 }W39D[{hLU B *-x}'J+ΚSEQV[av|Y~TVmq$2[.5Ep1ŋOybO6&݇_cl[9%<׍ӯ2} [d(opa5O>_S2SP|~ ';\qbBN[Ŭqmk~r#Cŷ"Y:7r_Fve#C 2V]ZCy=-eB#"ᛢS>ˑ ~ֆ}uA:m:=Ax8sYT!tS4aj%E.\T!e7p6>ASj;rוJܺ k_30hQczUԾC;1iI0ŭуZ;vIcj5%2r1ŠN2^†QTG9Uw3<crfqpٕ@Xy}*U{bHZ w3 \Vh,vlɌy@ؼ]́FCM=˙/}EC*%K*D) .,=Е4 2} (L !9w.}/6U2gzCGxXX9Ϳt!yn>Odlw[|]eiЍ}e]gf{#f!OWB~p*2O&:ncg$H_G>)E=}'K#/B%Un瓳kY YgOcRqCXɅu1 Pw?6Vy gG,C%xDR>9QTRP4(ȘY VS4Q'+{u(-,:SEa>ү[uYLMN~&g)31ߨ5ȲlPzJ9I4^=N\Fwg4hS <{'ڢ> $Df]!^MurФ7$fp-b d\_q}9մ@1lL!q_Aܾj*iEgA! W*C5Vqhs>c iB\t͉KmRCO 6]oշ$Q2\_U[7t!죧/̾xɬ?De6bj?z ǠC<{Q6vr 9~ð m5Ow2fY3pR$ ^m=ˏUF6~!{ q=p+_<qyDr[I[ʂ+-&_LG6]qxϐ]T^%8PS#ukH&6PR({Ϧ;MFPM$=eX`󫑦=kh{jeN }lSbOD'm t-|CUq8Egk{~1?DdwB֝* 杀QAؗtsz=O2Sr~E3pCjzHO,!X1S er:x&ްef&0ihl6zQf=ȲASHd%x:t/^"76k>W~Wp HrF046fw.'GYHwz(>;IqCBKLJzO,~ϧ@|Tp1= x%z f1@5dHgߨ4\Q;mw϶M7X)x vxQbO $}?7Fp6~bN1ǘ7:RU#ɥ/tx`BwF+$80]=H'7v.%йmhާ2ܨ1'`H SW;'NJU &8jYʧVr~2HZM4w#LۿN[E?\Tv5ΗPHu6D)* jQ;T8=Eh6qt@+a q?I[=Icgȝ1A~T U4e5[hCAyq=Oǂ6Å}tpC e/_ͷ~wVQB[\o춢iY ( L}j R09k7p$]84> r:PK}|(p3䑹߽|ɰ&5lu0'm[U9wG<:3@JJ2W-MoNf ~4Eƶ!HLKjzj ed0 }WBYٗT^ z]yjO|U-Mſ,C{UEͪ@Z䣵 &~627FЗxe}M=A~Ud΃)7Q"V 1uỠ2=G`.ƃsNdE3"eDIbU;S7Q2a}kez^9ل#Y)Bl$2ڔƾdʭRq$sϦ>boLb8R7Sm3iݗe?=쉒y#xhRrMfa"%H}.+PdI1eDt7#lN®^[jZv8ͣ [+}]Wa|H$D\_FeҚQI&=;鏸Gi2F*uӧ?1ʸ31ư(lJ9/{0"m~\isW a~s┥HЮPOn3]TɭMNU)Dñb75[^\}c#fʏT$uhN:oyr5^arUf:#3HLj"mQ7Pe¢C\@1ͯ lv;XMƙF͵cGX^grb.,-)qUB;X)`b6QSoYCU;C8eЅ/b$!TZ^/ꢢx70tp9kBN-I&78Y l?\Wt h=*w-ώO:Ȏ#=eΝԏa$Ź.#;; f<^S *U9}[>uUvoϓkC@u0٠@P[I!qTb+FQZT:*\~8LZ<%& odetsXFj4-#l)q7M6޽2a&n]F FUvTm|iHa<:EEfP[b&rHW0tLeH׽n%R-t8Aʽ[@U#7?%w:ުF(eHXIsgEPbF>_M^v'r(  aRkH{v I(,(Dsh I&3tOg˰ѣ"poj+yQGUCXx>_{饨JoJB;F滩3RӭfG5)3%{M? =jĉT0EP'VJ4/|A#E1NxSb_nΑ6|.5`h{ה;8έyK*@c|q@NgWFtR˄_姑Oa NN˃}ۙNQE־cB1$4i>95.'tCFK.DNၨir]ܟ%xO;ڼSn"xC X\Qy^:F +5/u/:]StxqX2>د j.>@'ƺ*`d銦R'Q@;UQ$tAwv ),Ycytۘip;=מ*} GTĘ>zK/dLL,'p/bڒkW87> j}cW KNd]7dgW瀑a謥EPybAm̧Z?ecx=L8q}v'}mcmJvHbZ D@/}WR]KjQ0,V?2evȡ"b8ç[ "IJOp GWBm8J7kYB;g!ikhf*]R7.+kȗ(_Цs=}T{q!7q6x$ gOI"v5F ceÈ贰i% ,˝a#!@/APvV.R'}M`=%o<LfF߂ޓmU>`|6bUpd[ ck:hl0uSQ՛D%j)P J;.J`'25MFi4EO)2ZSytE.%0YfA^ k[&j*l0PӕM%5fDV;Ngԓ\moDZ1\^rJə9&+yQ՞ Ch!*߅I<=5b-wmk{̬7SMf$IKQ)t T'fzDŽ|WcI!N"wC/[ˍ6Z(vP~Pr-v_L#_=g{JHh_`o*_Ɇe4Xо `۱4T 6[w[ťbusHyƧh~ #KWG2܎5w>S+`3J;Wÿc @M\L%mzwe L)!bE**7ѷ4Y0=rŽ9kK=KE2TB /.+6=Z!@I=x~ҽ&X+*=9T#vl"{3_g [ZtJtrPpIB!=VyKA\gnΰSG endstream endobj 104 0 obj << /Length1 2505 /Length2 21445 /Length3 0 /Length 22879 /Filter /FlateDecode >> stream xڌT.Ltw,ncQ¢ .I.nPKrۺ\w]9&WVc13JځؘYb lVVfVVvDjju+gňԚ@G'+;_b@cgLl`Ⱥ8ll<vVV1sZv "3>t6>>DlV %hjlP3:{W:AKgg{~777fc['f;Gw7+gK* 4Nhl '3fDj?r5;sg7cG ,2. 3#LP(Acwmll o߁@r6657yX,V6@<3#dojlecl6ɍ"*cpNىw,À,2Oh .?sy['abϢrpʈ,B#:XYYy8@Ԓwxu{࿔l |$>V@D/'cW "`!;ZtY`/}xفl<,ʢR d; `=d<llc+2sZpĮ/=c)ځ3z\_lϣ/ 6@.66RKQZx<.PjYZ8Ada2Z9IZ͔M- Ts}_:j~_N ޜڙ^1v.n"`b_C `a9]|v;`-qXD  `,A<? "X | O) 0fP8,8[?̮ٵ 0f[A`K?G 51w#? < #-C{LX`J_\ ?4 VZ ]-mnWt_|:?g, kn__\ۿRWߩۂ_ٿQ}/迺o|H{dʜm\8i#hfb_oU \?\`'' o_uq €sCY-`Xr/n_| ;8_\?G:C_#zn7MLjDܘvƅfw虼;\P?Wgn8ވ|A_ݒ^&{:jkMRi{~2LPiC\(<OI]x[3#t 7Y\^T|;>)+;*rHOL1z%y&YspL$o1fof0s&^d}c8>ly}Qgw""O}9:E%"UZ:"XD˜ʄμϞQmju]d%N-k6tP©n3r$4]k6N%^ Eѱ 犝 6nAA܊&R ,9$2C2$#hU A,盕ed?/8ezw#= O5+5 TȷDBnTTiޟWP ΋TrRJ*ݚ}cBy.Jn.5UX.#NM[/w 潤(^KP/q^סtGKMi1ܤyB(J~O ѻ0=E}j˦R m@CjC.:Jew xСFц+hVq(SQ<<|ifJ? G "ȍ.аS[$T{ʎ3*|a\wIL ~m1JJ+߷ҍ}rɸ'n[8WҼ/ۊS?rHm5Sk(_V.bw'u 7";fdpBΚحgyOur?y;OWmjv} @{h.ypx l)feCܷ]I`|yڥMLMu])!m6s̓C׶&5 Zt֪fBжOIk.vՄu) #$,je <~RMz5Qy]rS.rl,*]Htڰ ID (4`^/ED>uT-S`4Z+}P)>>YĬi[1Otb#')L! 'ygЩkCgcQ՝l2]F޼_>2]1 ^ͨ/遼fQsh IYl3`X>ۓ@?)(!-F+^EC l(2{xX=Rp8V?V0V9SW1`TQAfp5JҸdrG) ?)[e1N|aF[(ǎZECN3׃MdpAș$Zk!4ne6HTZgXunk!J|&;J9X#cZo%1X<ʣUj߄'|!|[j{o13,P0 * UV*W>X4sݏui]$F.] S~8. !|}>#5&M[8Ҧ3ukJfn)=OMS8( @vvŸQVov#d-+@"X}3be"dʹ С/|u>ŠqFdKS83|Τ_liT~X"N{.A6ߦ ݎ8]e`{%x#!Ey"0k}h<>#e!m؇X8)Q1MTf lFBnͨ`Kid0(u "aX'Y5l;UBX6q9/\-bJ9<"ώa5}ߋ{;/IoR\Y"%6N$6u9CrqᵞVHu(8Dq-]=֣ЅcKO?1R+#&|}hAGnOޱ$)~2U*>}nl[*zH(>UQUQcoG_ stJa6vOW"b*JY C6}֍OiʷU[7JFe + 1/_/p*S VzP:EaQ@)Qa q CV,|qbHk&OJDϹ}ݫd ͈m'Vw6f7]"\o;Z bW| coYQq-LNr.-@Zv pcKp":$,9LߎdSc".Pf%C!qTȦ(,iB m+r@j=#{W׍#S*7?Tsh|U "|RaVgt&@zߴH1CHtiTF_ @y5ӊa:*oYôaPP֑* 僉!և)Ӂ O\ۘ#DLx4,.m辚nyr:ocjղMMJ5K`<ԶgQ`-Sa5iWS++ K2XoKʸRã}b;۔6%dBe>FJ- =Zs)Y2m-gf$jArγ(%WX2(KͮyuTKh+bINt_'Uglޟ ;]42N ^2rhaebmJReJ+cYKSw=3r앜'Qv&4noohy(4cc2e C/W/\]1c%ds.enRH ]!P)DRa>&)}A!4N\ HQ&= 7xP+ln¯>|n-x4|Kb -`>Y(ٕЖvLmGmt ' 7Yz^keAAc T][#3K,fsMΈZJP;{8]r >K*~H}3{E) B6mG3Rs  +/=k۽SgӘ:$7q1fEk$g #xFlí?'tgK\^ 1ʌ,tBG9 xХ[sɗt6x[vQ%xҘwkӉaxlo?ehN1j~enSlG#RK_eS?_'%KRЇwMR]QAZ!F އ=^A!^ٗEf ҆)tCZFA_%9^r>bOLSJ~a KKsC}/ et?ڗ_<˜9n3rY jYm+{]~<NmmF*sPG2J+HLViOPmB}#|5M&!FH}  Dv~ULR2pl%"S/68YnvMgy7zI⨹C_YNwM=4]'^ޤ:"M)-UY^J̥دI'‹gx{Hjk_,7:8[$ś,VCN1|?(6KLAEAQ6xޜsO!6.:2Ó5p Nl FӘGA#K[y?i5n L"ƲŰ˶d9RaȵFD|8/ZFQ}չVwYM3kʢUpKxAv';DD9h)-Jo0KO'@>z5"~9s5$>!yݯfMIOz_qI+/qMѼ;wZM d9DTuMUʺ0ʑyC\.ѭO ޔz͉b۪_]PWȘl̯k&eZp+tuonp_q"B +{u<BiSDdĈX|ܞzm.F#38 ߎ1,i(GUK>}8c_Vƫ&=fƔPHX<$3 BZPe.ҭAA/b{`C2;>Ǥ1 /wn5+!eí܀u@JnI䭒]᳖w9JBa}*=9U&j6]5fnf<qiQJVD2_{$ rҡtiv_fvwbM*;یb4(os r_^ALQU?Hϋfʶ%퓤DSK[域6̍Nݠ,¥Eo [72٨D+j}#tnJАcg[n }#K'P0y)bCSc+Y<0E wJgl*:XdK"^뜤+E›~*2?|*ofbO_ܛ|4vDݲŠ'c~ǕSDf:kuءg2?CB_'f b4\!'xFN;[EUk뭞M44Tlx\>cPQsOqvRIpܲ#-)6* U3( raVom Z=n Ý؞ bRxAЯf]ӄpwGfzil؄[/1Q\pjD/݂ԊR q s*;% 5j-[Tf .m801o5u{3wS޽N K4aEecG#y}+j k]sO #ޭ渻hȂۅ_Z1WfܢdNJ/z%,͐%)b_t^P󦄑UTr(賹<%؈8c 1mW:|Yb1 7;i3[ĞDuLǏpӐ/"ev̛=ASIHG"*o1\]}t1찪B_+wy~ M(3Jvx0BfZ& È;G\kwp wJG'v"A1+M.'MBLq<02]v?񡈳 KrAqiw*TW%H2 }08*4K'JDԡ#4D15_aWv~ wot~#˜hSC95>$xD6t:RV4^J"bW;+\G$ne=/"FFI*t m~5T%|>9;]._#Ńl/C6)")qT)\a]aۗ~B5: &Ё̗w]3%핐k2fTCLڬifݾ49sYƏrGyZՎXNXCo_Fg}0m砣;H8 IXcGse07c3'L2&zd)e`gFa"Ȕ#$ʈ ivXZЭkmbS]*xzVLs¥s!~Y *\CZV i"I*9@-AƷni< N*=&Myi\[;)tu}Rea%dȏOt,Z@f;2(=~ F ]> -`hZ3HW}m;,ڰo\hcOv\u}!CHɣ 0))>.q3Fio #BlcW"EG;`;ԊvMƤ3R_7T% 38Qmj ts5Z&7ŽYnopB%Uί')O%j ; (B<'!ol_j )'*51’Y 9PqƺG6UU5fVBO{ein,;Zj+̑.:T䇇Dơk.d:*p1fSzN}{ 9ECI3O34∫UMŸEOt 8;*u1=eoaژ)&m1}uϕ)2sepq2Y y͒J /0Wn_&\zXv@'Oepz@gHUD9kѠ$θ>9\tG9qn,w1ՓWJ ;m B_KSo$'oKsł00UGbbh ksӊzyHA/|m1O rPD ebWefZ%k|2StK^{Vv"mLŽDnbU>A|qtB}NX_a-od𗭳(+?ˬ ݀=+Jڱ))\FSp7UÙ S|G言  J ~sY!?*⊾OԾw1rUOc΁/y~MSh㗱Aڨ*H\/iW!q)e #rH\(v,\~Arş 3”K/sF!·*RR sg@t׶9Ɉ|E3S<4j¨.=JHlok~=>}#528blP?tu]cfxg+Q!wB;KkzTvFH&Bi߶1rZt4c' NiԄt (PN.15xz;D6, ݾ{y%5#33u2]vxhvA`Msj;U鄰Of)J3'Z-)aYQkt6 J j@ #31]'+ ehMY2a1]? o{oƮ _Gh |Jo NI5l!1l` 3^!DVR q>: 6tNBΕ%KR//s75| 9.,_0Owi;Q\%͜_kF^%%N韕wS-3qp0oW%qr$duNÂ+eɃkhpΪ"w{\Ï7[]֜Kxr[6KkJ1$`kDe(znUӾev͊RďnvȴWԭ _v׬JqBωa4i;7w}n1!{_$Mon}~(tb8g,n.X~xΛb r]2ejw܈=2"i^3lWvg oCK~) h;b[W,iϣr <Ӛ%_ ox W5[Mp7=pP6>4Z9'Obh?IBi>ZL*3 z+ #E^ 8MN/sP7 %]S;Vu""10&tsvvtި!9Hz)sgzě_{ ZxӾi䡝ù#AZXqEF]ys4FT?VSX, ْF!ON{ZCc49utmejuAϺVm (뫔gz^C6PRUvҡ-GX?BZoO++N^ `e1K͜x}jn0օ󐕍1U:QcQ#5WY{o)JqvA3o:2EzQآ1[#гJXš{M4V٨J d*+}]!ra Rۆ%΅_?Kѯ"Z)Tֽ3$$<7t+6@r4XMPA-rzj( P]Nl9 t78"fOE[fm0jV"ڥ}ZСϵXtB^BPi}A@>ȯQ/RpCj9>L}&'`tp^r5_C~V|K-'-KGz2j'eTV0Fn  wjT)Z,dΞ(3 }Y IVOAY GS3bѦnKR}~4r3Pp ۑH+C{e/VAL qnC 9vD{_baX9ҏT%_t_Ͻ;fvޅq/{e|"6yz߾@7-TW4-fv(D^L#9Uϗg`mQj?\^&?x%ՍW|arxCwXfJ:ƥx]|xGK .b= t! 1m%Ѳ$gYNQȬxz*؅^{<>]n4x

FQq- 3V \ O"a2cy\(4ŹP~ucOA}9Wtl@`R2ЇLFW*%INXZ*i 2LTnq׎H  .&GeӌQ#o.% I&vak$>wW) 8v[Oiސa޲bFnXn*9x,)9e4ͧրi d(m1@ʟ45ݱ<Ԑ5}(dێi^/-A: >̯ѾQΦѨ{h4'{BݓOҜUE  ɹߤh<AwEJ.qjuIMSv=-96b`cpGQƭtVi̧9c217SICL]E]O|g: x%7t|J֝*i`S T֋T+˷4{Ek0E?V][`S|&Ǟ$v6fzmM.}Q )g3P2N9&rdߖ88LKԍ,~='qaȣ #Q*T:EӞ|Gpt86I U9Qs B7E8;[ sCٌKxYUwW^誦|͛V->;K>n@oP~QCCj{cD՛] 2/޶Goh_pԶ"_0)E`:ު.7Ϙ0W&h,.S![A* xO1Fr:P|c(v(-12ҜI=mRqRۖ%$kBz;qxn3gB}fR~k/*s}al+SR- 9){S}hLNJ B qQ?jYcXVqjpMP+V!m9,͠-l9&vYäYCה)ủ6}'ؖRv糡l3@\ $i|JUp)ܡPQ [Mg?a@KƬY'A _C--{ t&q8m;)|>>ߒk7Hvd ݅e(Q+;ms_b𷬽ubk5=I]d%.~bF"|k lK+AO}Nuw~l5vs'bTd ^R$ݎoQ#4*? dh oA#eė~9lR:q#3]~hc^:&1g_)fp=M UHc]o0Mqmu< Av\22iťo]bGѭyhcpV{;&M!R%E^KqF7"Y ݃Mu$0:yNC7_Cu7NA4KNlv⃯-,vB^ ŽEY&mpuֺH(lKz\b/d Tf9 f3M:ȼp`&PF#\2MZ(1d0QTEa<=k"WMb mZ-OzOw\-fx\@T$Ņ+z"!Z"0 ,Y=Gea+aGT`buJئJ#8>ʍ OY̆V?1UQCxdD=8ڏ~5ɌM4+htgqqX| }3uok@}r3nBgc?ڛn_xaX"r7 b#R&6$cKuV3 x[ LVMst m+K+q+QrĬPJi}>ږB)?m8Nq~i;=j84;\Qg`9.hp؎2Gk\bqӜDhneGd;yhOi $B栃Yʹ5M]c N54o%=q;/ɗ9mZd'+Y#w r,fPII,ՇW|J|B~ B輭[@tXn9P`ݠw5y \@=u D2o $0tTAd#x3ns${G T]E:BVc6߷gS[-h5S5waZ*}\tfyf~zς;1$ݛanZu"Az<)m@$tDq8u,,{A]|$FW1%Dj"H4MzXbb\vڈ?TAy]w7I;1Z܀)A)Ms5@ܟ(ZDJbL$bHXBpE ݲȫ_6P k+R3f>7#HGᭁ=VK!ac$W'z i Sd$nxJn^~:ÓZE6ڣLʮ$4v1ev6stwIh1K1kIf;ëj3&Q:ݲpoF!G D7lU.ud๼*?1TK-P;/R2\ѤDĮW1׽ʙ&{l? lN;k<,#C&-6BOޡQ(: DX^UD 즶\E2$ YNhP ) ׹!-tIũ*Zg+MBDxn,`l Owa.95%Tz>} hMF٫k;։]gKzFf<<+ìR"Pp)P.4]j2jHMsVu>"} Rl~Fȼ{ԡ* ؾX'COƊ*QpZlMd #XՒ65(LQeE`I9yw m' w ƙnvi֥l.tъ[{guϺ̡DIS%B I`h!A&x" ANZyPW; > daDt(PewH._)Su0gnF /6a3n ϥCD> Z)պfqUF3޴Rkj, e^N5M++ڇS(4$GY1\Bo |Lz[R~#o[d5-$3夑f:lg`'QU*g5a1,BJ]k9 Ǯ3,Bqa⇛ة)z=9?P'ܜWj<}+ʸF28<)ᚥGyw2s rI6%F ެmprAo$OcL~MG{llfد>^Ěf.T>vZ 9 ^c2~{l#4~qfg5:?3;4~gIV+Ivꪰ=Ò}ān8/-X/pQ \Vd$Ѩhiڇsnd@[ !x 1{Sk\&($^*iex&nEW|3e7Mm?MAs^ Xj[cqrYy"PX:85$Rxt53+ɋׇy&K7;91ܝ&ʊ apxj菆GHSn$C֢'0hil6PP3{N ñ=]Vu< 0onj9z|un)+' U^UkwN̥`!Xë5z0;̈{FER(4Zcܤ;6h㥨k,xuOV^kg O4zQ md0ŵ;d‹I 䏹Q~cUL ;k Y;P,ic~](Tw 8Uk7rmv}D4'jCgyvˢW/IYW(+,7A#pỏgnHru69g%ڤE#8SMd@GGZ(RN=5@D:-zDDY+j)]wGuY+ft.0 66|D#OUssjP0a:{:w{gc{ D(Il}S#|䛏?ҹ?nSv^օLV2Dvmxi, mh}dwN>BwGc"/=-cbfMx Q`j6衸87}%9&Lc"ss8c4I{1&6`ඕZP ]lO\T wAZph7Kox,93vp~lmfR~&',{?b3H?y#d<˝Zۿdw+4r֚%d|&AD4$eo /%粛^nzI6MuM5LfuP:b|1蛰E1ԈhYZN u 2PjN[9-\SH/t_ÎpSo5xtȝ];{va8 x*:04I(Xa-]iJ^6>cᕞ|K?~ hmޅ<2*P\S &uYUڐG'ŸanyC#}Ԗ4@I~Co\Y(K>޴(gg?q[rk/ /,zѥBKgybdCp`@S(l"lĢ׭8hU2qG'wo=I _靇ϼ_؎R>&i5\/d{h2SOюwҶM09unF Q ޽x_隢EE28QClģNtI|Z"l)>w,JA2t$K=>5Q|WtE%qIB46VV( WZIyTvo `pAB@Z*K|.ɑh|4.4׸ml=n79R,VVL:͕<5Ml4flfY{)E%# 40o@۫9AjYf]urw>[PLa^["/p߹ʁ9G>ΏC6X-1XTeЬQˆSSscbc"6Ԇ Bl(Q*]MN]+O%aZvQ<yRA\eOUy3G1q#(*$&C8%SǴqF xu€GgI8'9.XJopOV}z 4x":cS.0dw8<#t:0bJ^9:,*ȮfJOέ=mT}U-XZzM۔ t"eE-Gu@ M-ElCC=bR?7dY/~ &O=DÖdP_t?HXSeo e &GyJ2ZsBc@սBim`=]C'4 Re h1jQ\q\`i\o'"627q,ճUެp0uyZJW粿;2) N.,W02A{# tv`Wi sS; 5=@fжa@ ]sqB{,Mh%)`%Lc qڪ&DH0V}* Ȋ޼YyM."I$zMG@Ud?\ʫđ%{ ĀQɶ.Ђxx33?H;-#1ۖMJRbH#EzD[keSߋ&Puۚ~HIVsWIR'OaTZ +\0q jbS@ !DP01u3eD6UN6:$Va&,QE$)_ķ{Iq0q9lqvD; ^܋*M,K:!:z*#GːN9 ev"<7dm YkƆķp%U=B)SzͶ8fj6&ZnDG]CS &-22y`~6 SJϬ W co<𰻗! V XY1$_`4g|hKL/eGOTr>_G۫M4 B@]c\=,?jQ?)tdYIxTTNZeDQeˑb.z^ "Xky6 _U.Md!I/ZR`~_ʷ :RtMZm.}vy@ALto endstream endobj 106 0 obj << /Length1 1759 /Length2 10608 /Length3 0 /Length 11726 /Filter /FlateDecode >> stream xڍP.S{ Bp)n)Knŵxqo-Kw9?sd& ˫CKoCK'wgKOKճ[4 ՞5 ugw9nw)ˁmd\`;dA}8ܬ# ml7aʡ yd2y#B|Bmm;+%os~.& ['xoYCV@;by7{\ߟ>QQQdu.?6^7@HP (U l)`Ͽm0;3i8ni?\;[j?3/gz@|5y@jw s{ wy7F,u pq~Ul\{,kχ).6/` Xr>|6@?8 `@]l] 7/- p8A?Co$=[ V !߈pǚsONo 7/Rc >w|zn/_9?>XY<'%q@yɽ| \/y~g@kEk0)2/I9=Ll~ːNȩLY!R}k;r7+TNZ#R4?'i쵣~&*:@!gӑ ۭL!Qw5]?X:_ |-N7$t.*{ Fknr jiOJnZ#b z?wDK~eśΉ-\N{jZwK3z)aFbx|7mΥHkʛJVɠ'u'z>-4ȌȗZT~H zz̨=8 au!L 9Πm:u5 e(ϣf'kL wg3TÚ\Y47߅ZI^fe4j 흠1eVzE ?IU)BQDNoܚ TRd(w5uʹSN[ ]-Qzʷx>23~GWm̈_QCž+Ar$9?:;8ҼOi>2> j@[v şj?Prk$ l[^p,~-ꌴu6GAP |Ȼo0dB !ASgWL<36p0D*nonwD܃d= bsF߾%ed~zM*:Ɯ}KQ.{E#v5;gV_VYHwO)?1r5*~$sY.cEN=`#ǁ~]PVL!W^a^PJeyfZJ^c Ih'0gJ{,b!v`$T`) 7CCeYx1֒qrn\ߞh޶\sv%0cN/u$<^HEfGO C^!իs%Tک$NurOp?\g@ GTk&Vby̶3s>(TZceXS ))쟙{yq:7苧uƶS?p yRE6.}%A%r|0stDˤ~Z!q 9cii JDA#H[G?ҡ?E|!8eL&` șgpaN0x3ȃ#K!b֔И?L{K0t6ߣq23CXibsl>mHֶ? 5x@R65wsDۑER9R yӴV>!-6,ʓO0ƆUXRFciOSDK$}pL'9X^c( iԷ Rౣz@)FjYssA muuÿ^f 頡 u0,L"j98@12}&NpHTLTޭm=rV -Dk)H#P;0$'6N R=) LvTPkC 5"&'zDvBB9¶%F(MP X-j!}19ʮ IųWL. N=&m. h32BHOz"Y|J1 5sy_7x'CphG"ZdbwwmIQb~Rl~RkosǧO-& xo#oS3ƗUޔjːm0Qhaz?2HXPPf6ߥ(=] R z%&>m}(FMQh/0AG^33[,LSYXPmHccg+ME(Z&M^j_~&9Unx(NjZVoQ~ YQX2Q?~.% e,o:))R䭻g}sbՌo#}]ĥgB\g=n=j܇ 0|Ld.a7{Uvƻ3L{/\e* UJq[9odj:?DfS~ ê5KPNh!vrD] j h2jyBpOPƄ~r)&#v'K>h"> ~m[lSLt4 76m%/B}m'=b$)\1Ǖ֏f6X/DU^<ʍk.]:HӝNR[zXb_^۬8'xP(RZq?bE36AZނRir`mT-|<4->P2!.o)kSt/1b5)W`2uYǁ8ø;*Eώ V&7;uJphWٰW?؋7eX'Z}Шa tӨhBmTwJU Kώm4(CIYR{fu$Z3b8GS#5lDwfY稱=?)S'2Vrh PjlfQ 9GI6Ǝ?9g"KFw@eOL[O{@o ;㫭s,,> e _ Z:ޠTRY<ĦFMH..ep Gq};cc`~IA ys!̵gά;o=.G{y{0 a:x[d? U* pM\L^^.^ȼ.e@b!I21ɶ̧.P(v]&ʙlᔰnCCopE>_\Q͟jb#$og7 Q&9~niք>dWm8 e4kRˈ>%r! 2;*}کѣP 3'&wJjUrCI?s@(DXwv?+-μٹ1ziCڵۧ{X´ǒֹ m~|/H7^+bG'ay5d')eRhgaR#•iC^ܞ-< 5VN]޿;Y8#x06,  RhۢLq<,Q/rP|4_G[) iIa8w2@p֋NQ9-y*u0ݿp *\ n0\-E ̭X~;³)Pa\/-l MA{}=:?Du2 :^H)~gvWH{ b-[=ګCNYۂ%(;Jo8Uf1"iHøhOXў_)[O/J5çkՉ:!䨂 Eath ~q9frF$_MdRȢM 1Qߓȋ{ 4 4:cdhJ$"d#*KQ.1CޅYn/]}AQh6A^%Q-'=d^8o tl~B{Wp j0bh : utoJ7Z'kZܸbƽUxvU_&fu`C)x+ڙ>jtdF]s,%zqft|ʥ~*uY-9T®yu(p"PzpIB掊ǐ{Ƹ$'dJoRuʨDe7 5=eXp8kqnHMյ`b+K0xnV '6*Q]i"&ĹFm$qam )s8L\\|D&̵v2-ܰF=.\\ 0 %wK/?T\3V87:j.JmhϩעqMy.-%3evz\b1SFdmer~3k!v{!`8/Ql*W]*_^`waGR@O!?5x^ȪXrmAly$p9> ׋ 7./&hiuGQ62[ͻ0a&{^ :k@< *7$P, \j˶?1GQƑSڙ*o=޻gEr06fTm9g )R4#ޤ; g# 8bJ5敻Mޘok}D!~(\=Rxc65AiXmv/&G.RC/6fMsF'FUW +qGh1?|8yz^Seva{t kH/ހ-*+._{/`nY?$N `f۫+ 7y~^2V5(af-,mBIL["jM;9[X ,ưkٟVOjVUeE[.eK ɅwrFJ[.ZʼnR]L_<|(U%yÎ< >)WP3%?X,gҸ gZ'TFAt#y[{!t. JW/׵70fa,\Uv_V} oVKD%ߘ qG^HaX޵^փ.EK]??l"}$%R"U#c8[PGhcE@ ռ/-C_u,q޳{*z萿ڊm4okڶwW(%C$: JykC]ɫX ?1p>횆KXZYp7wHF^ny:tkLrJ+DcW0 T >ȿ5hw m%5kدl] Rg$4qP=ŽuV4Mϩ9~-,}RQG%3c( VME (.(qa7aۣ(1|WOzi)䷟ß<(?,n-IPUV4,]F۝NZ$U;a .uwOkւ_oa^ݚYП?SI>Hb+NMQL2IӍ[G_&ns XM*.PS@_ "f JpJI- R%[f',ƠTl*V.ÿ8K ̳V(&W gKè$)xK v) Gvf ^xSGT2*d)ҟr!*,η`@G.U2۴yT|BwW*^ y5ܦ3F:=GQ*{W/x]EvC&EQj.Nd!И KQ*bIV?A7E47ѵ}M\L k+-[(Qɯ w}*^#[NҚU9 #|@/s#i>YD+`]B@ug6˔%{96-aO o8A8;W{Ia얆LS8M]|Mp찭xN iz}x.DcE`(FWEX,3m`NtE4|4IWVg0]IC͛T @]'H;!ZD4ն+>`ҺӦ2E˱)ƊQq8<]^\;vΚfit^7Ӕa0k$ ~f%}#1$:.k/fn֕GK^$ǮYY]ƴ $v>GXo/<6:{G[mPT|h-e޸Ic&r;m)g[\Nz;Oz]v`N!{[a8|NoC7;N o _#+7Y4woMȩ?"ow{(LqKl`gb||1}bp鶤HVʽb"lR.P~ Z?EA\ 5mHny]Ԗb)50|L>*YY)K; Hddi>DzH5]J\es+uTWcgo'l&. tН$\~d@~ ˕IAΚ)f=~n7{!ݥ=Y;aD|h\PkiF_u T]Kߩj>qw?n1 !B*V\} I`^lKHP~wv-suNxqdH\%At+b!b5>+ySOS]sĉ{{/1DR/v4t9[L|w3~5"łRvkBaxg%GAuqq^B9!^m a.fnGuyCOb0 QSs~npYȗ!fC^J FMn'.&vm¯/{+.3|X7-P{%Bx$4U iw{)%d.DP%HQOԲ9$b Mj2Xl|:z/CVDFķ~mн_|gݢuetԉCy~VG0K{ޥ?%Ax`F`>8<.j*Zߎ!mM4c|*mr;]Z]:UxchCq]kKzD%W]ԩcSyǹ*B2I9^K\ҖJ U! CkFG@<+鬪 @tyӻmin<OQk Ʀ ;q6kUKA2 G)JyvыO?;gakL'?+QRfno-ʭcW;pֺ.%Sk_*F —7gEh2K~nUHTx$& YXណEluZ,qèdRS1*sZH(m.‹Uz7=w˖KT13yew 0ճ`tϫVRv/!!RK\}d "m5 m}Nx`S.q?vVKT,[cp[K*^a^dfX">񫊰> stream xڍP. ]` 6 kp݂ C.ݳս5U3vtCE(bno 02TY,,L,,lTT [_bD*M3/1'˫LN uXXXXl,,1w LY{0J diz4fV^^n?"v@' `b{=foxW~+>ffwww&;g&{'KAZ; t: ( nrSfon lAf@+x=&#Pr4ӀWoLw g33{;'l JL.. oC[gW7$ET&UřdDa^,6]'rݓϛۻ "]5 GW_&"d@' 7/'zY1C[Z/l8}o 0L 0?_@?;<z,cdJ/s{?/x38Yn^GQ6?2` {ɾv? u4-c)ڿ,,f_L࿣8 ICQ؁l=2x嬫+_Z?gVhr_-mn#Y4WYI?*;~o#+ ^'us82upH c89x":@?8 `fۻ^X;!Qnoџ,b0 n߈0kx_-MA:ӿ+q9̠A^?5uk(A6ÿkdb\_stWs\^ !./؛鼫!tgܛJe^vr B[t#}uGZxG[#\xGDĥ)ɏ?DՅ}}4m e]yP <ʿ-p!=0jQú0a{]bM&#Dz{n{U9SC]cM=L].4V$cp$KFczBNf30kt6KS>z_+TGʣWN>+tݛnyLiNi؈4| jK{?[J D:}iA=PJZ)Gm-w?M8gg>f{T IuIR7[ӞR]f1d[i69Ҙ(8UO"wwa'ة}v揮9o#8 >ϙӃHePvu5ك+jW= m%ԬmOx6l6@N Jmߺ|jf7w$]'[F xVA^&"=HGp[f‹9' ma0n K7(:_$F)dQ 708 *t˙_Bd4LQiNޱ#B# pOBD:A!1\}{-e$?d _HşU#e&S;y5@xυ1=N6,Dǫ02CM+z`K֢$lk>)@z'/`I[Oqq%Q Q}_Vgӛ'̈́jHh]H}alMaF{5W/32.|\<c"b O[س.}\Caf\ mz5ss-OQ'%H^lu'~I J* "!]SԵΰ4.`!o-F'Ktݜ%H)u/Q[ 8u!37a5LG0ċmYoNUayBm͠1rѺYJ/F1Dn)J@BJoL}Ǎ$Q[|upX+<ܼq.rw3d(HIhLL-iM{[Ub΅C}{{#/C{tZ,raH +!RSgi6w܋_ >=@=7)YdAiLYH05hxoI}: M>DhRwX@=ޖ3VYZϨ?X>Q[Drv+gY{D-wj(+66[ୟֈft=JtMTﰈ3gb,֋ k9Y_.T 5!~IKY. Qe,'gE-wBtUĤM`Jc(c4&>8>Z$ORԜһSЯ:;"G(pDovE!~Ɣdڌ1ݜ=a)[f7S?ڸoCwg)aO UD ڽK:Vec(EO!t,CΣLѦ?]Z526&Vuu|sQMkq zN,C$%haz3GZa"jEP#Q+I,tizEt jkC:I8I*ZstO@Z@5KB^AOZd/={&aaDr^Xq0aV25@ Od-y`R!g` &"-:,AOXY'7=tMѼ"תp-C#XV, nSp4ҙrEzofjmڮ:1iVA>k@Gz3 |]t?xmϥ&JIęlܗ2=jz~Yen~(堑'>M>Nc*$fɳM֜h<0x*rm59!t!piMZ$)t u^Wo;kȿfKXҟr>&=?:,s@x\jtu:Ӗ ;ˈMA@ ?"5cr Dj 9~ .3%U/2Szmvln1ziQa3dT>d`260v~зTXrI{܄L!ٲj÷hȟ?(ۉoU^X|%f]g{i>/JctbL#\AWthU^2^tΐ@gNoøl܇CqKXM.Om1Bc Mr$>΃ _cϖ}W~tvɴ}΂@hu*0pj$O+!ӛ|R8o=`r5d^ b 1x׀W91ӣc(&H3YMUIOܻק7=-`jΓG.\}R:Jm&Dlլ7ro~z\;dI'Czji,\Q +AѪ`5` o0/,0_ lca qP=ԛ:nm{!_tA78#441W&t>**8R(}zS=6 t?H(AG~܂fR{mّ٦qHHc^G'bV!`B}݋r]: +&ԶH#Ad.?uxӉĭ:baUenS2Ur-E)ydfMJ,Ƕ([EA31Ryf))3$vOx WR_f5l `&v844 M&h2 WQ̟J֚B~- 9|ɊPsG>)y0nd/h{`Do.CF QC[ ~TEO/",Ps'I3vsYI]3q k$d_Ԏ_[_Y;WNXR+$ ݤ75B|t%UWMV(ۦ> IPh]Lá=$ JwT0:I`F< C.{Yk|zQh/w(IWaL3m~0ez@0 v8y54FM%yʯJ$o%5ܪ6=vm_&F-*Mg}a2O'uHy(KւΚFG[OHQ>oςKۚ[0boN|nOɑ6->f~xõ 0$23Z񷃑W~o7k2~ƿy7:[:vIk/8%!3~=)llo-:7[r,k>Ym5ۄp]򺤋T`Qؒe,R^x3933r@Q+/c3QVLi]#sۜx P-'%NX+_nh>>v&̯oxootAsHb"bJxC4{gDtªi5pG?9I-EP!Z(WUGnn"K!q8\FiSd?Bt[Hő'HZvs&iq<Tv2R>+)c>'ḥY ;aɪ}е)Fc;3)Van=`Y:vQv'i0W e5^+w/N 7٨nRFnL lJ/+Kz5@qLcf+Rya cxl3nsE4Dt$'(5Y,GvZKϺ^"ay{͍>V3*wSF|zV 4[;EXC0~U 2igqnߞ?K̹^L,-% {F< ;H@  DIs6ì3ը Yr`oe t-i9ӁRݑRfq"6SXO0C9~\ L~8 \mp٧mE>~Ah;7ΒY_AR,QkU9"w_$!RThвΠ{R^ZsfLv=Pwֳ1Q=G;]t8O҄iF7&L }uiNZ 86y`o1pӖ%W'^h6 jsuhv?Hv.HELh$CB~r6t1똰0~}S]J +h*|n<@'5855:eqǚ@IѕxLE{b.R cƥtc" )h Zɳ=J749o$-wmZ"Z! *Mm= lGҕKɇc͚t>B9Mw-v.i.2>@ó@!FY[V'lT;HP.L4DU(NHyrJ%b͆߱ʥC(nƇJ}es _qBtko|6T-N1WsRgl4HeKxfЉnn%R쐣I-BhfҺ)n!zE+><#ϰ&^ ߥL JwpKh #20ʗ0ډV^.*kep͎RBx&VbU+Fجpl`l{8G!EG/Bc!prH-ԯ\]^ՋUhyiȴL@AD͛è&IOaN'thҹoe;`=8UE<Fyc "Sqꪇf,MNuS̛L'k,cYBNWF:S2MZXZ+E`gLuH630##NբIOvH6`L\~ &P?3j;ȹLw {;v)r&_rT;I3"/wJ8"jH=cf|p^╙.<:xy)31luIrh Y1g.Gl$ qLIAQsbОW1zzIL-Ss@Xif'䝎K>w!oP"3-}9n֫0fݑϿԗހyޕT|V4IHd]o_r=hh^ݫ@aScvJrhwi2 ҊW=h)Ş+ ~^zMoo۰"}>3wWR/ JF[H%aVcOL~r2YN/ӝ@T.Cqu+ O 9^hu0+|"U؜;An_8݇ y2:ONtS|C.M Ƚ\T1#VZOmZwZ6Q.R &W@tHڡMK54eoUd6ZxW OE^6x!Q_* !GZ]0VENJd)'$4E=Gc,z8c[*߈ǃxIA{`{M*ln9YzV'1ܬjjsdMğj&Y/ƹnRdOݠO$E:IЏ (1KJ K?GLx)vus뱜1Ei? >7 Ü.(n*8To _ w0|)|E!|@}t&'f2#z,HՌ ={r/rw|'ȏ[!=׫)GMuցV+2 >݅ oпZ֞4Nmw6t3eݢd Ɖ @?CĹr?/<#EeWiD$&~?R *8ɠ6ǭ{]$zNEm ` Pj]\6plAuR|1ͳqxVukDC3xG ƭ@N+עDms:\֖}3|;{YKI.8Q  z^Mkela(;Hme YW&Gi$pD d\svR4+*2K/;]=k?0? M*Vn~p}W8̓o r^-)(Ea߸ةIw_4 |8gyZN5wW\P7 Xs85((ً>~üI=>NjT%2칯hWidRY(K2łk,K3܌ƫEq+ ͧ@k1.Us+XR9!xhqPQc"(Ζ+:5WB3|yo ߬00,@?L ~*=wT+mm/sڧ|48{w#[ƢDӫha?tu}~o-LPLs}mZ,'ԇaG2BċVKW[f~ueC&dC84u(@$ _StPW>&%^a^ȗA=ׄ$&.^7 t)x$LavGvu%Cx7/zHp[މBHj1,+OFP;ƣ~ 5v< Al!XiDr$ L<Wjb>e`_g/'wI[f#rwQ'BØ "j ?P!g4xWEXUow4Rʄz2{qalT5ޣ4i.rJ{}A)}# 5%'${%yjyUΊfo~hTE{LmNKPthUzwgk>y-;,6^suI1E?wG=)-5uIφ.?1G3+ rߴUR{mnU JQ+B*Qmq>y[7ϐ\Ĺ|;*tQo Ecs*L2 IxU{aɌX^9srnd'?>I_z.3̓5O9*1XbC5M [GFb~:>na=~agcx&ZB%Q(`.Mٱ5}c:8aIxG|VG`Ã[%`gFF0=<%`-,򫟄"kχ}[ip4Ws]l0{!8)4#; iD/]q9w6":g}5 !$B.xrKDFcAgv}&hnd]iF6わӃ)8:HԮõ`K܂ ĺ64ҳm-Igd[umLyWl$.( 6$=ʽ~Q&m endstream endobj 110 0 obj << /Length1 1524 /Length2 7763 /Length3 0 /Length 8771 /Filter /FlateDecode >> stream xڍP6tWtB"HE)%$@h"J"{. M>}?}<=3vVm=> @E =u@@@_@@]vNnE`?H(}cSo8੫#$J$""% ^gMP vHW?@ fXAmapd1Cm7an{ev0+*k>Q5;=B`^|>A$(Ywm0: A$*U{@Kq\(?B. "`}?V;=f(}3Y/j@!0W7ӠQ4_fJBahkD9Pm w3c7F\Лmí߳&(" #`A"/PB?ZME I^%@o_H7]" ?Fy@? ( "obQ (?zvE"o&o_#bD3k@e wVI{Ï V3+J eGL+8[̻u0p0!I;St0JUZkbKW~,?Er:Da]i>G6? Ы|zqq!fG c-PC;Lg"=`Kw77IՎ6e;D,c+/b88PؤUWUwӍȯGCyɉ$8ᓍZjmB+ݱ{4*NZ'& _$7Bf8BL JAF5sECC yp$4(4f"]1V=Srh. datEAK a|DYLJ!:R؆K%} :1QSiJ-9ty~U P )eWϋFkW#G VaUp✽uf޷s*w' (ן\ mw Y6d:ҲN Z5St"t |GIEĜs ~zը _I+#*bwK ͗?xϟ@"m]\g_ 蟟[ YzBzus1S||*S|KM Œ-I <[ʞM K\ҵ\krYav_GGn)vrxFT%x{z>X]A5n1e7:.j,1rSUsM<_V۠ԬhL2I>:(Q5 8Rx_Iؐ_9ٌ[\pK:^5_$Mѡ?8rEDYqv-F?\qV{J ;\<a2ySH:LG D2{,q4?ݯ~cEaRwT2auW}&2modhǢ0s5΋rZW,rC9݋7!@wf9O^O+bbOx FFmJ,mZIxu) 4q^p)-EFȼeSPuNrsDMkjțdI'⟳-p3HoBk"g9Rz]D}c#mnRՓ?2W3%AUpty@ttVW)aVr6PS\R߀𥼉T{(8uΛV*dx*TE'}~d#AjWTuXn wfe1K `Wn(ed6[m) 4U>3Wf^cpɗU'8P O03z)"~p`eOdp͘p1M6m2=sI]G@a*XKy /EPTkWxVgVUCkz3{P9SV.9՘1|sw~Q^ԡ̯)mC)ֵ5{:5+xpF0Taƙ4gC쑯I D62  ~f%x$u*C}Iֺ?%HJg&ﱹ(ldlk7ULN)_yBad^Ijm,MMym}c)Uڝッͧ :KfHgAH+; !vI q9Q9,G9!sܩѝҠ6V֗ 5tw[= ,^Vj_a(dhҖvD-j˸m`uւy!׸)5VKa9U.~NDLSW5jW&m;!V FYqeQNN>d{!k+1c ^1^uUG͙{xLWa""̞?˜D\(d3? M>EԄviA V{ ?N[vwb j>SIJ/%.r(V :7yz ~;Ԛ3ZTa5I)P=3NZ/״{25}~gxלբ`|W;mZ"cd%Ytxn*#=f}:⋏, BQI]V6e@<]DdUUޓ> MRkZ>oO׏DeM__NyP~no:3IU8=?ـ߹u b{ Y_ 9]sY7-?V Y 9~Cy'04HAݩdi*[E|{?8NdI>v='(;QbTdƼġZ[Ik+տWKhbrh}JKGRnn Ʌpb4tU臗e C9X'*ENVR=CiS?RJqJ~3ƤwM+H =3*Ιpaqx4e#>ET |G~?nsp@Jldn缓`H7ӻ=u^!{ŗvnv8]mgGnOf8r^U Qm`Jŭ8 W()1QpIxܚ ' {hbU>';Hn0H]:?<?YH#가 .k^؟Fy3.r']Vyab-yB,($ΎۖwΩߙ%fٌ3k=|};^N[f&,%3|.ʡAOMkjQ9f U\=v{ Ϙ%z!T~!׉͞vѳG:.'y퐖R1gPRD K D$Ug)'6xC eSNG-׋/GGje+~Ki_&=]1|/A/喇7V-cUxcowgZC{~*Eĸ zx֨1AIO-\ЕS`L{r;"cӘѫGͪ,ț3vC>(:h cub&2f/{Fڞ҈ϬzݹU[lMbIFBLŬ@ Q1Y0GHtT02}_XkE{ 4rkfe_Njur>x/OU|$щXَ&`r4:+gpN}kU?I)VݥZ4>]H,kx Snޯb?dXˉl2`N&-{\ArMf-4bbu^fXN/L۠~:m0B7Rkdՠ|s5Y(v^)ؒH^$86|+$&=xJAn(Vmr$J(袅6zHlwq9pD,˜Hd/ա{GmŬ7&3mTr# E*c> Ֆt~ %뻡7 ?`ʃ_KFrW uYX>8HٵA[ry,cTIBpXVTUq9pV8`P UGKH^m.6R0Rr:0|}KRm3u?N:{F'ǖ_+HիI픫xk]ɑ CvfS$;}`/yj8vQs&2bdٴ)+O$fb!Rې$7Ŗk/.| )~m("b ||'|a#pҝ~:[FzsƁF"8{77B[m?B?hHqV_EܔoX[2"& >b!q`&8ySx`-! DZD'$_Y :0uoHayk|O</#Mx2Mxݨ&pW!Qr}CO̊%I{{nQ9yf/=l. ;oIgjXb5%@7{q ҙk^ViwFYm]CG&Mg/cl4\ޙ@+4Fb5W19wB4'/b$)& Z'ӵ(FahA]ff}+wqx]$"/?<LjЍZ1mYZ %mVhper'z'뜵u r;hNm-|5_}twegN>t Cd'5o9iUF`JE =Zޙ1Qy[r('IzW.Eb;8\=WPn\OSeR׀弓 S9$f *~-[]V sx0#4Np(#'!K`5%X}"=rJ`pBIJ>$( 3*S')[WfIԸN I.\xdV$K.?&7e|BRH י@J1ߥa,\t{&NCG]l$Y;(~h( YR/K2fRɧy3SMXZ{u.TT {%Mk~#rgja@.6np _QRnVXΤg9 )Ǐc70_gh`;!CsR}Hxp7?5|fم&7m;\2.9Obk/(zi).MuXF>Dg2ы(MHGyվ{Cu8-=j|8.y oJQ^[}[ݬ{sԌc#AӏE-whu#H- ̸?u#.N'>FAy$eYϊ>kܲ{T|} d|kTɆ0Gf9ɭ<C;_YJf)ʃHzXw1+9Ƌ≝teg$h9Npq)b/2:vAb3I+,ŇZ>_@X/:$ĖXz~ [[OruU5lkCmwཎdZCSܼ*h8MĥLP|KYme#f^Y]4+;{.p\8Vh M̋62>Uq抄.'6Ych +q5pҬr SgھdgĝY4;b&ŃQ6 9crCٝA^APpnI괆I )uoQW$h'3:a-\@qn`X}:dN"f>_KdZwW,q:c5↽ꗣOb6##lFypӘNߑ<ƣφsЮ[ޱڐ`T 2֌_oNǥ/絚XRDS'7f ꣓jw$9;X]Q@.rXGJCȪb^ުuµM5f>O0[6 W91>bk 4T!9PX fϱJ—=~ 3p 41B6RiJ ^D[?ZCj_h]a?ԑ~cg6Spol5vM?8tODk*FD &Tq+[L4Uz<; %hw#+Q#"CsMfԳB $mlfQ5}/5Nx|9 3 5t>w!LM`ZQEՎqɴbiG<"nO ]xx2 >Lp7mRQO[۾2el:)s:]DD [g׀ @'6'kii!GjuLH;ym c?lZ]0c}xx)'hdlҲO}>*},ˠ`mgO0vKkrY᱖~xPc"jņ >9!ءxWVX㴤`N4l .6Ԟv(c^%@ZA(RS!IYF9:hI^6?||Tx ZρɺC檑Gွ'~I.a ~Kƹ֦e0nqMK p _gJ?p+>o?,ƟH̚TnEɯ/xƐv̐X=Dbu/ݾSgG*5.(T#ڵr&$:$`Hl%4T93v}vQ!M"i>x* Tf6-vkc`x<$kJM W- ~@" endstream endobj 112 0 obj << /Length1 1554 /Length2 9091 /Length3 0 /Length 10114 /Filter /FlateDecode >> stream xڍT]6Lt 1tHw 03 Ҡt4HHKK HIw|xGg +Rpup'9BGG'Xknځofd'~\~Wt_ooDcoFlbg\͕j[9?ʆlA8;9dږ8KCy>&k/n<7x(-2i-+e'ZGûq [=|?zp"CV9mK~R53uS\g jcfz|΁T:-ci1K7A.-:AHQvGy]JOv h|FE ٤IfV`DZ=ʾ.,qoWS8 <75'U"WQ!EF]/iEڛ%xx4][x8VɢJT'$$(-@WMqlՍchۥ; S<}|raᵕ(х@z1Y[̪JL#,FI!g,81vv[ݘb9~oV.kD^CrTf tl %R%sWRP\0\ *če~NAžne;y}OhN{Jy(|WmXUe4GJyqWx/Rt R9elY*)_Q|`7Q'uRshh[Ӎ43e@H<5WSm؇AVi=-[<,Nn!ڢ}[N8~nmgSRFuhg KLJc 5|`d̏j89ө@U C/fMBk1"y+[C&1Uc&> .ɱaP63WY !X:}Zgym.YGCD{eG/?J^YI G4kWa ' &Wʑ:9ọV\R)(:˜>m,tq$>:{EH߾ȐoJe= a_ak TJϦPmgKDj߬fMc6_ ̅߳2SC.e, yiHy՗3m]O*2(yW ƽn YT*+:g2",^`ыW #*ʓmp;"%1jNF]3{.HZlEwh!ir4a4{>>DD1xҋ1d6>-Sqxnٛe܄i>\@)Ad\a<Z>bd{~~AME7O`sq[仧VG7Nu|(~#m.b*b)c*|!=HmvXk{Qf!aRC% Gjy{9p^Nw$.3Nko*D'fDs^Ek֗+U 26d" W|J9qwJmnGFIG=,+ SV}~`eX'|JvηM|@¿V`v6X'">NwK ;"<._|jc}!ukmDE=#[r0ԩ2sˍ5h|PYS'DWjKWk|t>D?NW1^K!nYwrȚM GԵEF_5ݤ$_%H柗wi|kU2j0gzeW0g≿*ij*b5v`t0a9:tD` euhԐ8'TU;\O'pda_qԄ妆oW< `rvo@LL^#OYP8npf- gA3/}BR_VݧPC'ב@ HDžhilYz#DʽOA!U}6 KrK>obqPWEoڰ_Dv)Eݞ'/µYPTK`Le$#k.OoɠxLnhod=!?֥BD䀶`l7E{᳕=tlBϗ(jȄ佦$n2Llٞ";2°mށaz]ݶGǖkkĺ J85bt=џ=)"^{w^R«vd>iDx&MtE3fҬYexox;fcؕFE*&ȍƏ~Ԩ Oq]Jl}je& e~QgS *o,m*<. !kW6T^>\bJ폜٭Tx$ة K8- LxQ>@|:/J]^7R_-J\ך`1aA/~b-E%|ztر٥6P}bY^?e/\@-Ӽ|um|#W:`V3!dyJ=|zݘ _~Dk6$.xt R"L@zOM׬ ub%L~PYgǎ^}X6-aװe}`16I`1ݜ< LlRX]Oysd|u| V{O6؂:)0}FǼL׻ZH6"nn$9I(so-^uGÚ Hk;?b% HqKXVv~yf-_UQ傲TOPrFxNp-jSGt}OM54MDE?^'N|Dθy-%XGQ/S_ :c*&/X6HG3tN{{~ 5Pt76Ur#jg@wVcqQjS o_B`jC .,MnADOE?>)TH*:.!TRx7;AjiIs f?s(U&  ){e4VNVQoM&4 =U>jDZӴk!!15۲bk>6JGw_M&}1*`?>d' =~]wRUc5C`x'?4UΪ6\&P#DC7IQ%q^io`+7^oW?BWieqi6&ISWlYA EAeV+< ā67)=&U:A$*}ɧ% f)WdYʖF"δ0d9IPJ(n!PpUI0R_O_!XR%f$kKҜ>GC2b3}Zs|sfEhg7i:=3>w1 t6tcU#TQek`la<@SPTa'Y' jL'W,>5{)+ܔqt̮6)/s>0 i]2SO8{}r2sNQ*%[Pe@^x2= MdYB8ŢLŐ/cm3W5=JZL#[E.ŻH\>wɁ|xH ZuwQ22c*u}ޗuTJkCw?v>!5Z?$Bew 9Rك)U\>'a*9P )Dt_{6ҋg8eaZ)x:chw+ppE^S]QW@ێ{fMF֎]jck;'J!,\P ;Eu#=Rpy剂* ,wܫ/=_19,4p#O0wu b dI?zu`7sr‘ltxVr'u6UftXFVТ F a 5;}XΛd:q)8åۅv6LSiDg?ʹ_U&I=/&M =}ݟg#TǕ[_8Uؤy;̪1&B&b;̊ j> jaU7|0-ϷDqun0Uv,=έOOޖZ{K foV-7Ӥ@{=<)5S k.Pl)0uQFNB]~<"H˒wK1N)6\Md&X#e[f~{+$Oę%s:IcųbJ\a#JR98Li<{2˟nZ/iE~Ζ@q*ډM|ƪ*(hp׋]s$H~.B#3kR+: j=ьk?RU5Gs3d ^M>*p: UӘ3\Co/HK-ٔe'3;-kX]( ^b]~X:GΤ`C8|2u^N|wxr@L'g,J'XqFŀt{=qu[x-qxPhOBP\4;F"0fLJiC9Mw6V\-,&0,]G?c/5=9#])X۽Ob4X5[L(e BiӋ|yIteO~~6jc}4rq.2 .S۬_LV0S9(E i{9fBm鲍7>Y( Dt 1X S5ʚMJD(Ne]-Q sQ^; z墧XohоTrb9Ҧ?K@ ;u~GM2B`4S75KKQ_gձY(Y fT0TJk3^ gĢ".C}EȮLNO%ސEU"ңiUA§CA%A3)vAfa"ߟ-G" h!-1cX]E#"ֽ|=etEx旳8u|kz=%~+DJC}͚qt[.}$>{Xd^']wy {gw{XLAKc' r)*!T?6G#W]>ᥲ{Ǜކ̡{1r8eX&>j"MLƏF-Q< @GhɅB`ǃ8!!? ӄMD#I>lć/~RP2w`iTڣ†\2@47G,0Nf,rS0w]7i ?kA^z>vSɞ cCLg[ep ͇oGko+|2?U%L52-7u20fޚ D.&}V>;cՍ$)f72Ċ] gm/aվ+Waqڗ/5ފiCף".7ok^L\% )6`t> stream xڌPk Pܽ(R\CpwwJqn@w=J9$kkd&$J¦ cΙ *`bbe`bb''WtGOttBh.3r~7d\l̬ffN&&  A<1#WKS<@dt'{8Z[8W 5ow- ol}hbdPX='=#\flP:](lOPtBdf l,MvN..v@G{v@h/c3@v;l<,f6@3/C#'лߥ$F ى/yo(hW}b@{0p@nv^Afvf0ugTtpJ]Gft311q_ <+si},̀^NF@ 럊ESKg1Ow1_-:L `ozf c3*K+H+"" w= o%#WOi;3_žw?{Ԁz[ Ϙ231]_Q_V$bc_?z#[K[ϭȃ7j@SKv6za;s6IhdlblKמX@N,zf&{_.}$Vw3ۙLZ2v<$߷@.wv>3#_G`K/`8Q0q2%  `A|{" J{?=`T3hA>A߳Aлd~durF^\އ?=d|?#s2/rqOw_?Mީ[:e߉)㝓_GކT~0}f Sλ3Bi#;Ko6.G#i/tG͝&!qNdtv=˟yO-v|o=?{< N0qqt|0}m_?@w Ȅ7ت.F~w|W3kű6:3pV8iumGFqklX[rAn;cՄ_5![es\aܻ HN.*Us"<ǨG/g-8A?wGYGϙ~#9a-d}X\Pcq#y>1K%r,URD11H=MGGNq[ŗ1s?]UC{:ce\Z377 o-E{#aiM]`wsW*?uA-HJCA(Ho$`Pn AZg*+ T.'O77F"ivcfb+Xit 9Ke=7GB-hg4hF*`FJk1Ӯ*8( L&,ȍFc;XEkaomSI-<:vY-'h&[Z1Ou^) %l[g?aEo|w1躰M 1C ݶE^Rn%Y%+Rčv{1GCnq4-{ZU)'kH _ͼz9sx,gU~.@fQhD{5;_?+ՐMc1m4vh!r$oh1Zϵټ>u_1>߈/wۯ~(ʋT`?r+wư1K-, iu'gft8̍%ȏnNl1zYAo:ThIP A Ɉ @% ̽(-V=*=6Áy(k,pG]0M+d%h*8%?zKA WcqW_8ʜ,>8׼Mi?3^~`2}VRe_v0~&S4 >KOcQnN kPn 窑,3!uD3fU@{eH{Uv"̒ 7fĘVi^:؉_HfKykGQ GEO%f'yO|ĊDT^qun寪{ J.Yz驞=;J|L[o }ޔS7ʤ/^F[#OӼJ #cc_3Lp YՐs\)kjvz*TT2D E_?] ޢ9&_>ZSLIG*2(YGuB-/4i[ %X: do\4}EkLmVߐ*r6#,%<@ZW*$ nΦ >JՃ? l~;-'@*ubtyZ_2sn$)Ncjs`b=Ɓ<$z~Cyn oPє}0}jjqvR@_M:'^..(K7ʵ[n#rջg+JO )NpeyDO,'euK cn?/宴=G]gn۰S;%K2j>((iH^B:L5.'Bt]?.2BB0~ t&ouu1O|@(`'Tg^3N; hٍ>x藙`%s?~0wȃ~.lD*Țh"C+Ēh*t7+U:J #U3P"h[Vs(o?_+_8ِ6e trWUiGWiDS5i Y!~5 2ԿֿZ`?XkX H&'ʀ?sw9#Uק\Ibr^k 0FL $e<3(ɂ#VҾOpl iNǂqnxUDӠ&@:[c >IS< 4k9x;kq,-HVmijq49tM2l"o'ǩxgq/W|`pq74fp} I|)m6379. E1_ iISo 3̮Ee&m9:}HP+lʛbi -6N(Iپ׍ HJϱmdbAw+H^P0zæQ>=yX˾V(VOiNġZH J đL )^1)ケS=_K.B!<vɅ ?B$<FV.mG$y[{}ȼ טV8qc5a+koxsg]` qkeKDuEB=eUwJ'~Ə=XM SFJu}jU&l̅xWIs '9flA A ^d³V3džj>sߘxvji cSxXE)5# k u=_~/yQK>l6I3Bxӌ^_<=M'qݑ:'9e6f.{TJw(s 9˷sGPhV~(A^KVǓ!8q6bo:kƷS\6CҸu3G[HPX^nVoMm)B{aS{cQFxk8ڔzYr:j(b bXfaΘޞW0{h^E\S9=4N`8]pꙊ1%ߝnBcp)JC6qj^4LjD#"?vsrS~ʝ7$~nEA,HfW(ݱm9aQ,7qߵ-5 fBl¯d T9kŒm*xeр^wjB_MmX3H7lwdž!2}:]e*2C9ഷNDK5 LZQTx`xN4VƂyNQ"ZD<j%dO%e]S}81FJ1!:] !q 6pY m!6/]̮_PJP־-8`UvF ?{>_Gݔ'>!9ir9Q)! y.:!K.̣n$& =|$2qMAJNܒE 댵eXCMc7.6 N2i}츔Cl-%"}75"o6~ A䳕lu0g(n %b>,[ nBTuBVk^\pD_4Piv!󮴼;ar?WvuH=*קz^g W. K'wmFXD}4[}wEEET%0͑:8eLVAy!>,<-1հ%GCx^L>c3.}J&0=hdB.N[R&ig*3fX难o"h`.oͮ c",ɩ3 -'x2.5"uzTB Y25绡Q=L1! %dɣ*Fo^Ѣ 0=#G7H-tQ``ط'Z%2"՛D \$ 4rwg݉Ex)F^ =Y`P ۢK֯1*])KQU@KzKj#Q1:ڍ'VU% \n(䰴bh]5}UǗzrֲ=t0 v<2=148й)m,pl)O۷4 vGT Y棶PFbjcCE86]Z;zΈ@! iѪ8/P _UxTpv;Ęq߸-w7^ꈉ(wH4]=䧌\3Z )C`BPg:$uB~`Q$*4PH㦧YSxɎfm\Ԁ=_iYw"fsi5n}+H't߻v4+saU!8 COęۣCQhcr0ȲYzUE8KٚYSoǤaEo/*#5w\Hhwqsm Ow[) HEUf&e qӇ-VxuBvƲt H * E9&j,$r! n"|0Jy{Rڌ{m c\dAKzEOFSv6QWa,=%%.+<_r0a3tW-;(̙_ݏtfW*H \Mg]/9t\1|>+3 boz7,Z+{2+~&$GCC)2sCl-; 6uZw'xB_Z3b=Sa ʿ@H^PSz\ ѭoP_^c7?}[p%eY*/) g[3r~P&@>|zI̎`ӗ }IIq\l>WUq[t<⸷@R?!h!fȝC 1x"ц3dk)mcUb~ r q^F.oց;M6/trmmi79VUo,>u9s ޷ Ic<\2EX a(0 B38.nf#^oM* ɄX)OpT/ ?3Sd(dJgXh9w99+t:od8 NGR*HbuuYß6CKbɠ,(O􄶣 ǰyεmOJ!?WO1`kW)Ylkp7ix[,U[?P U Wk8&a޿h. m?)OVz5$#p7=j1=&S3"(cLr0Į G*v&)vȕc2yտ$ *7'&b`sݦ~!p+s:δ^; f;s9UD&@Sw*1*<٣L|!66֩ 2(G($`4,!TΫijWbYr=Nsu!3 -k쁵E"@k9 9_Ovdc4S͎7GodR/^yml gЂ:BN[eqbHVځX0tјfſ[!`-s; ~|Ғxk! `0]wq$(ft6% W[_bfbK]8mP䊛6 ̧O' o(h+zg]P:cl,~=.&\vgh˒T6Gـ86G[rIi@̾W+4O jPJ{ &sxWִGMH2 nBsEDҷܪ3qFZ4#DqD5CYNvbmό[BM`ڰ:|YYw@HCet r|&ȅly;'4|&,4Z*FUw(>*Ġ_!ETls5:s&gwHl$SпesfLrx:1z.ĕBNd3}rupo%:hy`8bۂK~]:Tj;6!ymC)vi+Pa ozFJͷ43焢{p>Б9LvTxŹ$ET^ U`+7 a-u,ڄaջ+SRq( iGA̒?m/bN"aq@+-Z,. \%g,vBb,MaSnu`͉=Nǰ^kyذr/+8Tn0%Y9I=Y Ԝ7]CO}W(&H@hqho`0Q$+nbCu΁4V9rnebuHCQxTxxK?o}bΣ̈́bQg*iU+IĎjO^,5'g1L[5ߘ.?pwآ)3}&+C|S}\mb͔s5 *)~Wr^%ۗޘ`zyVbh+߷آ gUhLƈO`Q7;=?eSҽ ي-:He'H6n>Q%\2V[#EK'*U?ӎF-~%j)[4ܔlnL H 45J. sixïP נ(`8Ex{ྐྵV9 H4DrOԐLTuĿle!gBCp붼&9P<CG[ 4yXcg (TI΂fMpbQ ҇ks+A%ϔiwvr/,Jd*a(yDKuY˩XZ n*K|'/,rB?uYu-K ލꦂSl2O}!m}R P=/BiOMͰdƸ 7YtT0=}fDq"S?z%d!’獦m{xTgan1.<.+ eœs58 ƭ>8≉,4+z.Ljf i\Aj pe Z+Mdu*: lpCjs˔ɦ% ^`Vw^TU󚉜$r}fO]xj UGI,ݘD\ooxZH("c,5Y ^ngϘq%?Wg8SK!pi *MHi.@$+ۏ+p񑫟Bg'9l*Z(_y%O9X7ao{807CaysjԣXB۹,|D\9 LS(jd C3 3jWVvI}hR濾?΄\&x}ˮ&j,9')X=4,/Vl"tGS?2naKPawX b|Tc!z "a!v7f}ۑkUQ'u74FviY4tJ"iJ̃J#4<жOwKl5lf9WXBgT!/I&B]dz^8M&gCb7A[hWfvz?j%颸p}4Qpf3#flrS ^MCԡ GTYG+8z.}a,1GJ !Scw/V}rsOo*dI3L;a@GT|0oyQ)Sh߆Sbn̛uBSʥ55lZƦ6{8Jʄ;oOC$y!t48<84pBˣ%-n<YHx`^Ih|>jٲ,0_bJɔ{Ct:\wї4lJamF\РhhnEϦ 1M&öZͭ -~HLЕ@}1C >ӥMW'[.V4 .v=VRcY "˝5xEJNi[nÔn6'h2,Dᗞ{l\b?@Ad7iOx b9Q*(륽_Ai]>hP%5,G)B-=plюh\hgNo#6K9m6_(~)jQcٙo_ Z$"_W)Z618wz9{_ct$xM7['H~rCr}׍]R!tƩx%uD=f>naAVK@8Uj4jm կ\aT쥶H4aS[~6`s$bhCۏǨ"U1|\5YiOKN?H^ayhL Ֆr_Qb).ׇ]G:!„czIAժFWTMYs9K1Fĝw6VQɫPu!s'{ ݳ2$U s4vS!, >&~GԾܐ*^k PH8VH5zFdLz nqMqV@. arON5]]V7͢ qKV7 ]_VxL'w#=}:^ !3>ͨ#&9D8\ʊ,k*:VcvFY`hfPqC|x:/ky=`+~VE2^d|اcEk#ڼÉ*aҞ7? [R[,q>LТe%?Kwk4fp@ϖ/Q}EN[ٓϏ?carE$~oh*c)R=Yq6:Mf=4CBMnEMy9/;g;#z57`E^wqXby_1zLMzc8q`>O"ć4.mRM|q.? KQ0F$v M^OeoH㚽B>%yq0TN 3C㉡Sh!t=u煖 NR#*c&q )y-"lL8sK `Zv,<(\km_Fi=w킫!|eEd6?{HuQJ*1llHLt5s^]*y;!3 !Gr^;(ʵl=Yl!&1aoZEXv*D2%pP݀PC\F]-H]OdZ.ܾH|0Zv\w4FFչ*#Sp!u˗bB=;S$cGLi! ʒ?NmĽ>km2|JhDp@θ [8ҽi yVuڛ1IH5X+R Yt˝Kdva:2nXօ̙)98[圆+* H^2wX_Om3@&G˶z iJIrs/d =3RV2JE2z2"'pe!|)jizgm)('ɡkUD+.Y|^=aX<[䞂&h\svpɑmΠYEoഗ_Sbq#*IM|)ҾLēwݨ>X\-mx x›S|A`ځFUfV}k}(IFO.oӨd&31.ir-e+u-Ve9] I8WH2!kVG8n,'$_jU޻GD0&YAN93nou_O:`#NDxN˜X5 kߨB +g:w+/ޒL>=oZ~y0\4~TA<_ca ?zcHCi7Yǀ`;,,U]o؎yZSy`ة%hR'7Kn܉D=/\|@A^7$iVRj\_o.Z6_Ðh7HF˗mXLoy's~8 vg$~{ʪYːŻ5qL#XAfE+jB2ƛtsiw.2'Xt/KIyF˨A2 Wb cDe;c9' mzY4n{1#|@-4z<|{.AԶ<類"S]Xn'_Db&d^7Z>jr o 0=% Xw}>m|Q.D+޼I7maBnwGx5]]6g7nQn/Sp{Fyk)Jg^S*_-%pPaKV::fT]Dk_O&!i%cךVɉ_DϵW,x~f\7y_XkAwMk[|Lt:*VH$ɮPVҟOrp(buOMrb1U ES-1O)KӎȮ֖k\$2p0H{{ teGS-@#5wF_]ڔEAw5AB'7D/wM禮TG$_2etocG&"lg{Y+&}%T[K .֙.x8qw&9]׭O,COpS, Vܹ7CH$uza~B Jǂ{䗣GqwI /q߯x/?J4zomX%K5|+yb sȬe8ﱾ>d6YB*ZG.3ѽ H6Mi;zf#?vÆ|OG0#0=P~? /CčXW;7- 9PBj߄4dc䩛#Zc,) vSٟsiErfُ3M},Z& #02 N 3̮G\28ŞdDH%|Q٬KcP7,XՋٶkdbpf˭"һ h 'tVgՀJ?&s5@m񳒸M#.MSp|ɏ)ըBa}v&H.Lnj{4P& ׈IimƼ?E>sPu~%X=]=h2rkW}|' Γ8~Ui@WJ9{H[L8bM5{5b1$<-; PP3׳$Oh8K*&]$ `ȍc@k<"0xq5́+qm-ȗj@Qje`l)32@/}yUpH >7)O(#1]I\ܨF2H9oPSC. endstream endobj 116 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/@̪X endstream endobj 117 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/znb endstream endobj 118 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=Ƈ`Uv+NmΧ@j*Ѱϓaҍ*mima%+,U`꿹V#5T>WU2F[l 5GT8XD2dC-X]d>**lv.<T39pD;ps٭N)I&S?^`qq5 B{ $.  SqdAEBu7js"ܨF)EYQУ.?yRmTq'oOz>OZO)yJS*}/6%>{[ቫs}O =F/Ehq endstream endobj 122 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 123 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 795 /Length 3467 /Filter /FlateDecode >> stream xZsH_1PWh"@ @Xd̓qDñv݇3,vLwOW)F_tFL0˴`IkYd2X&S3IôLz}sfgJ2@)fm`25S9CL=~Z3q1,,D\2#Ytv`qad A) ՆVk޹,I% %.hD ;Ŕ9Edt1K@f2Păj rXcCGi @@<. s],YZ@R Б:0*-SZ`FEb BJPc ޜDU<$Rc]_1hv4c(GlZ_BQsNMI͟ޣ攚/ RlnϚI5#RVwO͘gI95 +_o߄̃ai&]jqp+Xw\vY>5ʌy;1닼iYNF%]g<"vzM|ֈ\cm Gxp8ʕͦ,=^mtk_]!zT+XC% 1{wT2bxVtYN Y.fQFpo')G1q"7gZ.'ΪjfrAX?! FKNX 9m d}Dsd+ hWȟw~/_/w|OGr23__,K~z9 ! e𔡔($ m}n8!_~-GpLâ%b˦ǿAeG^N&'HHGQ!ۇw0r}TٕUF&}W[oCՇ#XS@},_gW%;>g{LO37So$j~Zُ%nv njFFT*T RFWMcp@TBTRc8~8-\ٝ!dڅBbmqŽ` ƪ; yy3gzѢpxPBT IoaM<j;$cLBTdFBh[7_[ݨһ" Λw uk倏79:wHdM#Xad&7 k)03Cu: Z Tp.f3~|[݉ ؝QGb/7WpSN_ (EG,tE:£MB(b~z,8FN#X_=HnQOњFjZ' ]ƺZFғNgT- Ik4<QTDD=v^iQDb:^œ(dA<$B$"-4R-u0ʙ4Hl$w~_+kc4XaAoe5#8$az$ZTS̆:SOS2&{ٟNFoNZAFA=χeJ91EBH%(ho?T{)3K'䎎OڱbS?\ C7by|8gR6l߽.t82hv:)m J⾠*3@ֶ:Dv!a >DDSaQ5lhlRm'R<DJNQiǴ icU U IM^*G*xSkRdƓ#+RHr"O1y?FX[q񰊕pJ- zhׂتYmZ9hTQ䥔LZ&⹏IAEHT"00GD(d5`QڪtzVyLtHMhkd bJ$[h[_h摨}Eύ%9 f&+*z(zVOUp0?-qG 6xM_7&m I4FU*Ti'15!g^fgFk!Z#Q}GTdɜt [)thy< |ɗ_gcC[ػ;xIF@mA@ٖ@@ĭ∿@}IF*@sp&bO @s>/KBыm>bD#BBHB ]DңOP=X/+h'χrR~X9ŰƖ@>y9+C<2& -DUdtɥˋqjQ~/:Fɨ[y } n)9ؑ]=|eg\&k O>}[ͣAr1[h#B=eЛ_v QvͣPճmZk}]]q/G~Zaׇ~GӶ~*W(XGk%Y^+0v+Rhkdp[q]KE);*mR2EU &"ׁ(?_'6 /(~6/KqwR.iLLj\#:VMЊrUUn 7\(v0X:XzΡlzTgp4{=Er8%9}J .@/C<ǭ/O/!k]4R@nZ}#̟z~\NW:[%GAkZ4Ǩ?:f2j;J~^~koG> endobj 126 0 obj << /Type /ObjStm /N 6 /First 46 /Length 303 /Filter /FlateDecode >> stream x}Mo0 aK/@*MmiꁵQa~Nh:XOuڏ+ P* QA;-dHcy0|VՖ_6% rg4hZɁV)޿N}ul,drܧnتG)!(QC%yr1_DD=~+?>wIBČdwՖLA6?Xqe:2 !`-.aOaOGjLKl {LH&[kRf? endstream endobj 133 0 obj << /Type /XRef /Index [0 134] /Size 134 /W [1 3 1] /Root 131 0 R /Info 132 0 R /ID [<7FA5585B4DDEC0B7C67EC7CF41D1A9C8> <7FA5585B4DDEC0B7C67EC7CF41D1A9C8>] /Length 329 /Filter /FlateDecode >> stream xJAs~]c-ލ&sR"\x ny.@@2l9sDDGTTg@B$B5!R Ҡ!2  {]C.A>@!TEEP ؂r ^ڧ*!P MP+u *-; AT>Y;tE/  ÈJDžqIiQڽYw*71T>mW-iA5iQզ%M˪>Oφ5\^ o/]6F84̥a.r1CYq-4 endstream endobj startxref 131826 %%EOF ggobi-2.1.12/doc/Makefile.am0000644000175000017500000000065714651527764011177 dist_doc_DATA = manual.pdf XML.pdf all-local: manual.pdf XML.pdf PDFLATEX = @PDFLATEX@ BIBTEX = @BIBTEX@ %.pdf: %.tex @if test "$(PDFLATEX)" = false; then \ $(ECHO) "ERROR: 'pdflatex' needed but missing on your system."; \ exit 1; \ fi @if test "$(BIBTEX)" = false; then \ $(ECHO) "ERROR: 'bibtex' needed but missing on your system."; \ exit 1; \ fi $(PDFLATEX) $< -$(BIBTEX) $* $(PDFLATEX) $< $(PDFLATEX) $<ggobi-2.1.12/README0000644000175000017500000000051314651530010007217 GGobi is an interactive, direct manipulation tool for visualizing high-dimensional data across linked plots. The GUI is built using Gtk+. It reads data in regular ASCII format and more richly using an XML format. Plugins for other formats are also available. ## Build and install ``` ./bootstrap ./configure make make install ```ggobi-2.1.12/ChangeLog0000644000175000017500000003025314651527764010143 November 2005 Writing selected variables to XML now falls back to those in current plot. Modified main build system to work on Windows. October 2005 (Michael) Redesigned the menu management system. Instead of manually creating menus for things like the modes on the fly, I employed the GtkUIManager that allows one to merge and unmerge UI elements specified as XML and driven by GtkActions. This makes things a little cleaner, even though some menus like "Display" and the "Edges" scatterplot menu are still manually constructed. Now that the actions are factored nicely it would be easy to express them in ways besides menus, like toolbars. This also makes the radio indicators show up in the menus on my system (they were missing in the original GTK2 build). I'm running the latest version of GTK. Redesigned the splot layout mechanism. The original version required specifying the dimensions of an splot. In the case of displays with multiple plots, this required explicitly resizing plots when the number of plots or the size of the window changed. This design was not really in the "spirit" of the GTK layout paradigm and required the use of deprecated functions (they were deprecated in an effort to discourage such schemes). The new design gives a default size to a display and then just lets GTK handle the sizing of the component plots. This seems to work great. It prevents ugly things like being able to shrink a display so that the menubar is no longer visible and greatly simplifies the layout of multiple plots. All text rendering is now anti-aliased and based on UTF8 (via Pango). I was successful in translating the variables in a dataset to Korean and the Korean script was correctly displayed throughout GGobi. The GUI is now much more easily navigable from the keyboard. Most buttons, labeled entries, notebook tabs, etc now have mnemonics. Added the imode and pmode to the display tree. The display tree is now based on a columned tree widget and has columns for the display name, dataset and modes. The modes are not kept in sync yet, due to the lack of events for changing them. These events will be added when ggobi is tweaked for better embedding (ie Rggobi2). Ideally we could allow the user to set the modes from the display tree by using a combo box. The variable manipulation tool was reimplemented using a single GtkTreeModel aligned with the dataset. By using filters and sort proxy models the single model drives both the 'real' and 'categorical' tree views. Sorting is now completely transparent. Given the tree structure, the categorical levels are now children of their corresponding variable. There are some questions I have about the tool. How does rescaling work with categorical variables? How does one create a new categorical variable? File load and save dialogs are now based on the GtkFileChooser dialog. This is a lot cleaner than GtkFileSelection in that it is an actual GtkDialog and it has a nicer file list and supports configurable bookmarks. I added the input plugin selection widget to it, as well as a button that pops up a dialog for entering a location with automatic completion (the GtkFileChooser does not have a path entry in the main GUI, go figure). Many of the user actions now have associated stock icons. These are only those available by default in GTK. Hadley might make some new icons for GGobi specific actions. The rulers now work in GTK2, except there is some issue with the pan functionality when dragging on a ruler. Accelerators now work in displays. Before the key handlers were blocking the signal so that the accelerators never responded. Most menus and comboboxes now have tearoff items that allow one to tear off the menu as a toplevel window. This emulates a toolbar. Overall, all deprecated widgets were replaced with GTK2 equivalents. Result: GGobi now compiles sans warnings with the GTK_DISABLE_DEPRECATED cflag. Known issues: The GTK2 combo box does not allow one to set its active element without emitting the 'changed' signal. The only problem I've seen this cause is that all plots have the 'hand' mouse icon for manual manipulation of a tour. This happens when a display is activated and its cpanels are reconfigured from the display's state. Since the default state includes active manual manipulation, the cursor is changed for the plot, even though the tour is not the active viewmode. One possible fix for this is to reconfigure the panels when the corresponding view mode / imode is set. Maybe a nicer fix would be to create an API separate from the GUI for manipulating the tour's state. Then have the combobox callback call the API function and that function could check whether the tour is the current view mode before changing the cursor. There would also need to be a signal for setting the pmode which would set the cursor correctly when the tour became active. The plugins have not been converted yet. Actually a couple have been (partially) converted. I would like to know which plugins we are deciding to maintain. Then I could just convert those. Right now I *think* GGobi only requires GTK 2.4, which was released a couple of years ago. I haven't tested this though. The only major reason for moving to 2.6 would be the about dialog, but the existing about dialog has a certain charm to it. GTK 2.8 would allow us to draw some things using cairo (vector graphics). I think cairo would be too slow to use for the actual plotting though. I am not sure. It would allow us to do cool things like alpha-blending of the colors to deal with overplotting. This is not supported through the GDK X11 backend, since most X servers do not support compositing yet. September 2005 For all displays, restored the option that allows the View and Interaction Menus to be radio buttons; the default is still false, but we may change it to true (set in ggobi.c). (The ggobirc "preference" is ) Treating the Options like the Reset items, so that now tour menus also appear in the display menubar as appropriate. Removed the Reset menus for Brush and Scale from the main menubar. Now when a display is in Brush or Scale mode, a menu with the interaction mode name appears in the menubar of the display. Moving the brushing option from the display Options menu to the Brush menu. Fixed a bug: the 'Show axes' option wasn't working on the barchart display Options menu. Removed the DisplayTree item from the main menubar; added a "Show DisplayTree" item to the bottom of the Display menu. When a new display is opened, its initial variables are now chosen based on the variables displayed in the display that was current when the new one was initialized. Added alt-t/p accelerators to toggle between persistent and transient brushing; transient brush now drawn as a dotted line. (One tester says it doesn't work on the Mac.) Corrected a bug in the behavior of the "linkby" notebook on the brushing panel, and improved its behavior (I hope) so that only the relevant tab in the notebook is sensitive for each display. (One tester says this isn't working; it works for the author.) Split the ViewMode menu into a View menu (representing projection), as needed, and an Interaction menu. This involved changes to over 60 files. July 2005 Fixed a bug in linking brushing by variable that was causing the wrong variable to be designated the linking variable. Fixed a (very recent) bug in the GraphLayout and ggvis plugins which caused new windows to be imperfectly linked to the brethren. Added new graphviz layout algorithms to the GraphLayout plugin. New signal added for the creation of a new displayd object. This is emitted after the display is fully constructed and is being registered. We will miss a display if it is constructed separately and not explicitly added to the collection of known displays. But that currently never happens and will be rare even when we instantiate the classes outside of the ggobi control panel, e.g. in RGtk. The 'PlotMenu' plug-in provides the infrastructure for adding pop-menus for splot's, i.e. panels on displays. These are potentially contentious, but are convenient at least for sophisticated users. As plugins, they work well as an optional add-on. We can add functionality to this module and splot's as desired. Drag and drop for parallel coordinates displays. One can drag a "panel" onto another panel and currently they get swapped in position. Different strategies for inserting the initial panel beside the target one and moving those in between is easily done also. Two routines added to the "API": ggobi_data_set_var_type and ggobi_data_set_time_var to allow for users to specify the type of a variable and whether it is a time variable or not. Menu item added to each display to bring the associated control panel to the foreground. Option to use check menu items for the interactive modes for a display, i.e. Scale, Brush, Identify, ... This gives a visual display of what is the currently active mode and also a way to turn it off directly rather than requiring to switch to a different, display-dependent mode, e.g. XYPlot. In ggobirc as Internal changes removed (ifdef'ed away) the calls to display_add() for each of the display types. These resulted in display_add being called twice: there and via the extended_display_open_cb. This fixes the message about "Display has already been added...." appearing. Information about mismatching structure sizes for plugins and "modules" (i.e. Rggobi) announce which module is complaining. (Added the GGobiPluginDetails to the call to checkGGobiStructSizes().) June 2005 Paused tours were causing problems with consuming large amount of cycles. This seems to be fixed now. time variables In the XML files, one can specify that a variable can be used as a time variable using an attribute time. The value of the attribute should be "yes" or "true". (No upper case!) Such variables can then be identified when creating a time series plot. statusbar is now non-editable by the user. parcoords_new and tsplot_new become *_with_vars and the original versions take an exta argument - displayd. windowDisplayd has an field that allows the constructor to specify that we don't want a window. The creation code then honors this and leaves the display to be managed by the creator. scatmat_new now takes a display argument and has changes to allow the lack of a window. Pass NULL for the display argument and it will create the basic display. Added --home as an argument for ggobi and ggobi-config to compute the location of the "installed" GGobi files. GGobi home directory displayed on the spash screen Configuration now supports --enable-local. Getting the names of the data modes (getDataModeNames) now computes these from the plugins by querying them dynamically. The caller should free the resulting array of strings, but not the strings themselves. The return type of the routine no longer refers to a constant array. Added CSV to the DataModeNames since the enums and this list were out of synch. This should be removed very soon. Changed the order of initialization so that default plugins (input plugins) are done in ggobiInit() as is the initialization of the session options (initSessionOptions). Fixed the error in addVariableInternal which made all variables categorical. Switch on the number of levels. Moved from built-in data formats/modes to extensible plugins and a uniform framework. Each plugin lists its set of supported mode names. Implications for Rggobi. Read Excel files directly via --datamode=excel and ExcelReader plugin on Windows. Support for reading CSV files (either using the CSV or the ExcelReader plugin.) Input plugins can have multiple modeName tags within a modeNames tag. Input plugin modeName used as the target for --datamode= "About plugins" display window separates the general and input plugins into separate pages. Select input plugin/mode from the File selection menu when opening a file. Added an item `New' to the File menu Added an item `About plugins' to the Help menu Added the ability to read an initialization file -init, GGOBIRC, ~/.ggobirc Added the plugin mechanism, registered in the initialization file. Added a plugin for viewing data (See the Data menu beside the Help assuming the plugin is found.)